[{"data":1,"prerenderedAt":4642},["ShallowReactive",2],{"navigation_docs":3,"-extend-drain-pipeline":447,"-extend-drain-pipeline-surround":4637},[4,30,80,245,361,416],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Start","\u002Fstart","1.start",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Why start with evlog","\u002Fstart\u002Fwhy-evlog","1.start\u002F2.why-evlog","i-lucide-rocket",{"title":20,"path":21,"stem":22,"icon":23},"Installation","\u002Fstart\u002Finstallation","1.start\u002F3.installation","i-lucide-download",{"title":25,"path":26,"stem":27,"icon":28},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F4.quick-start","i-lucide-zap",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Learn","\u002Flearn","2.learn",[35,40,45,50,55,60,65,70,75],{"title":36,"path":37,"stem":38,"icon":39},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":41,"path":42,"stem":43,"icon":44},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":46,"path":47,"stem":48,"icon":49},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":51,"path":52,"stem":53,"icon":54},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":56,"path":57,"stem":58,"icon":59},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":61,"path":62,"stem":63,"icon":64},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":66,"path":67,"stem":68,"icon":69},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":71,"path":72,"stem":73,"icon":74},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":76,"path":77,"stem":78,"icon":79},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":81,"path":82,"stem":83,"children":84,"page":29},"Integrate","\u002Fintegrate","3.integrate",[85,89,157],{"title":36,"path":86,"stem":87,"icon":88},"\u002Fintegrate\u002Foverview","3.integrate\u002F0.overview","i-lucide-plug",{"title":90,"path":91,"stem":92,"children":93,"page":29},"Adapters","\u002Fintegrate\u002Fadapters","3.integrate\u002Fadapters",[94,97,137],{"title":36,"path":95,"stem":96,"icon":39},"\u002Fintegrate\u002Fadapters\u002Foverview","3.integrate\u002Fadapters\u002F01.overview",{"title":98,"path":99,"stem":100,"children":101,"page":29},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","3.integrate\u002Fadapters\u002Fcloud",[102,107,112,117,122,127,132],{"title":103,"path":104,"stem":105,"icon":106},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","3.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":108,"path":109,"stem":110,"icon":111},"OTLP","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fotlp","3.integrate\u002Fadapters\u002Fcloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":113,"path":114,"stem":115,"icon":116},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","3.integrate\u002Fadapters\u002Fcloud\u002F03.posthog","i-simple-icons-posthog",{"title":118,"path":119,"stem":120,"icon":121},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","3.integrate\u002Fadapters\u002Fcloud\u002F04.sentry","i-simple-icons-sentry",{"title":123,"path":124,"stem":125,"icon":126},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","3.integrate\u002Fadapters\u002Fcloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":128,"path":129,"stem":130,"icon":131},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","3.integrate\u002Fadapters\u002Fcloud\u002F06.datadog","i-simple-icons-datadog",{"title":133,"path":134,"stem":135,"icon":136},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fhyperdx","3.integrate\u002Fadapters\u002Fcloud\u002F07.hyperdx","i-custom-hyperdx",{"title":138,"path":139,"stem":140,"children":141,"page":29},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","3.integrate\u002Fadapters\u002Fself-hosted",[142,147,152],{"title":143,"path":144,"stem":145,"icon":146},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","3.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":148,"path":149,"stem":150,"icon":151},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","3.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":153,"path":154,"stem":155,"icon":156},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","3.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":158,"path":159,"stem":160,"children":161,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","3.integrate\u002Fframeworks",[162,166,171,176,181,186,191,196,201,206,211,216,221,226,230,235,240],{"title":36,"path":163,"stem":164,"icon":165},"\u002Fintegrate\u002Fframeworks\u002Foverview","3.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":167,"path":168,"stem":169,"icon":170},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","3.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":172,"path":173,"stem":174,"icon":175},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","3.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":177,"path":178,"stem":179,"icon":180},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","3.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":182,"path":183,"stem":184,"icon":185},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","3.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":187,"path":188,"stem":189,"icon":190},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","3.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":192,"path":193,"stem":194,"icon":195},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","3.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":197,"path":198,"stem":199,"icon":200},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","3.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":202,"path":203,"stem":204,"icon":205},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","3.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":207,"path":208,"stem":209,"icon":210},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","3.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":212,"path":213,"stem":214,"icon":215},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","3.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":217,"path":218,"stem":219,"icon":220},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","3.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":222,"path":223,"stem":224,"icon":225},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","3.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":227,"path":228,"stem":229,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","3.integrate\u002Fframeworks\u002F13.standalone",{"title":231,"path":232,"stem":233,"icon":234},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","3.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":236,"path":237,"stem":238,"icon":239},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","3.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":241,"path":242,"stem":243,"icon":244},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","3.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":246,"path":247,"stem":248,"children":249,"page":29},"Use Cases","\u002Fuse-cases","4.use-cases",[250,254,259,288,316,348,353],{"title":36,"path":251,"stem":252,"icon":253},"\u002Fuse-cases\u002Foverview","4.use-cases\u002F0.overview","i-lucide-list-checks",{"title":255,"path":256,"stem":257,"icon":258},"Client Logging","\u002Fuse-cases\u002Fclient-logging","4.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":260,"icon":261,"path":262,"stem":263,"children":264,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","4.use-cases\u002F2.ai-sdk",[265,268,273,278,283],{"title":36,"path":266,"stem":267,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","4.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":269,"path":270,"stem":271,"icon":272},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","4.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":274,"path":275,"stem":276,"icon":277},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","4.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":279,"path":280,"stem":281,"icon":282},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","4.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":284,"path":285,"stem":286,"icon":287},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","4.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":289,"icon":290,"path":291,"stem":292,"children":293,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","4.use-cases\u002F3.better-auth",[294,297,302,307,311],{"title":36,"path":295,"stem":296,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","4.use-cases\u002F3.better-auth\u002F01.overview",{"title":298,"path":299,"stem":300,"icon":301},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","4.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":303,"path":304,"stem":305,"icon":306},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","4.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":308,"path":309,"stem":310,"icon":258},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","4.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":312,"path":313,"stem":314,"icon":315},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","4.use-cases\u002F3.better-auth\u002F05.performance","i-lucide-gauge",{"title":317,"icon":318,"path":319,"stem":320,"children":321,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","4.use-cases\u002F4.audit",[322,325,330,335,340,344],{"title":36,"path":323,"stem":324,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","4.use-cases\u002F4.audit\u002F01.overview",{"title":326,"path":327,"stem":328,"icon":329},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","4.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":331,"path":332,"stem":333,"icon":334},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","4.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":336,"path":337,"stem":338,"icon":339},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","4.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":341,"path":342,"stem":343,"icon":318},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","4.use-cases\u002F4.audit\u002F05.compliance",{"title":345,"path":346,"stem":347,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","4.use-cases\u002F4.audit\u002F06.recipes",{"title":349,"path":350,"stem":351,"icon":352},"Enrichers","\u002Fuse-cases\u002Fenrichers","4.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":354,"icon":261,"path":355,"stem":356,"children":357,"page":29},"Eve","\u002Fuse-cases\u002Feve","4.use-cases\u002F5.eve",[358],{"title":36,"path":359,"stem":360,"icon":261},"\u002Fuse-cases\u002Feve\u002Foverview","4.use-cases\u002F5.eve\u002F01.overview",{"title":362,"path":363,"stem":364,"children":365,"page":29},"Extend","\u002Fextend","5.extend",[366,370,375,380,385,389,393,397,401,406,411],{"title":36,"path":367,"stem":368,"icon":369},"\u002Fextend\u002Foverview","5.extend\u002F0.overview","i-lucide-blocks",{"title":371,"path":372,"stem":373,"icon":374},"Stream","\u002Fextend\u002Fstream","5.extend\u002F1.stream","i-lucide-radio-tower",{"title":376,"path":377,"stem":378,"icon":379},"Custom framework","\u002Fextend\u002Fcustom-framework","5.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":381,"path":382,"stem":383,"icon":384},"FS reader","\u002Fextend\u002Ffs-reader","5.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":345,"path":386,"stem":387,"icon":388},"\u002Fextend\u002Fconsumer-recipes","5.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":390,"path":391,"stem":392,"icon":369},"Plugins","\u002Fextend\u002Fplugins","5.extend\u002F4.plugins",{"title":394,"path":395,"stem":396,"icon":352},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","5.extend\u002F5.custom-enrichers",{"title":398,"path":399,"stem":400,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","5.extend\u002F6.tail-sampling",{"title":402,"path":403,"stem":404,"icon":405},"Identity headers","\u002Fextend\u002Fidentity-headers","5.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":407,"path":408,"stem":409,"icon":410},"Custom drains","\u002Fextend\u002Fcustom-drains","5.extend\u002F8.custom-drains","i-lucide-share-2",{"title":412,"path":413,"stem":414,"icon":415},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","5.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":417,"path":418,"stem":419,"children":420,"page":29},"Reference","\u002Freference","6.reference",[421,426,429,434,438,443],{"title":422,"path":423,"stem":424,"icon":425},"Configuration","\u002Freference\u002Fconfiguration","6.reference\u002F1.configuration","i-lucide-settings",{"title":312,"path":427,"stem":428,"icon":315},"\u002Freference\u002Fperformance","6.reference\u002F2.performance",{"title":430,"path":431,"stem":432,"icon":433},"Vite Plugin","\u002Freference\u002Fvite-plugin","6.reference\u002F3.vite-plugin","i-custom-vite",{"title":435,"path":436,"stem":437,"icon":318},"Best Practices","\u002Freference\u002Fbest-practices","6.reference\u002F4.best-practices",{"title":439,"path":440,"stem":441,"icon":442},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","6.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":444,"path":445,"stem":446,"icon":352},"Agent Skills","\u002Freference\u002Fagent-skills","6.reference\u002F6.agent-skills",{"id":448,"title":449,"body":450,"description":4626,"extension":4627,"links":4628,"meta":4633,"navigation":4634,"path":413,"seo":4635,"stem":414,"__hash__":4636},"docs\u002F5.extend\u002F9.drain-pipeline.md","Drain Pipeline",{"type":451,"value":452,"toc":4600},"minimark",[453,463,466,528,621,625,628,1476,1493,1497,1522,1525,1842,1847,1984,1988,2043,2047,2054,2114,2117,2120,2127,2197,2201,2622,2626,2649,2653,2656,2926,2932,2936,2939,3175,3184,3187,3202,3225,3286,3289,3445,3449,3491,3495,3502,3514,3695,3701,3704,3891,3895,3901,4010,4016,4079,4083,4096,4101,4105,4108,4199,4222,4226,4232,4515,4524,4528,4562,4566,4596],[454,455,456,457,462],"p",{},"In production, sending one HTTP request per emitted event doesn't scale. The drain pipeline buffers events and sends them in batches, retries on transient failures, drops the oldest events when the buffer overflows, and lets a single drain function fan out to several destinations in parallel. The same pipeline powers the ",[458,459,461],"a",{"href":460},"#http-drain-browser-to-server","HTTP browser drain"," used for client-side logs.",[464,465],"drain-pipeline-batching",{},[467,468,469,482],"table",{},[470,471,472],"thead",{},[473,474,475,479],"tr",{},[476,477,478],"th",{},"You want to…",[476,480,481],{},"See",[483,484,485,497,508,518],"tbody",{},[473,486,487,491],{},[488,489,490],"td",{},"Wrap any drain in batch + retry + buffer",[488,492,493],{},[458,494,496],{"href":495},"#quick-start","Quick start",[473,498,499,502],{},[488,500,501],{},"Send each event to several destinations in parallel",[488,503,504],{},[458,505,507],{"href":506},"#fanout","Fanout",[473,509,510,513],{},[488,511,512],{},"Ship browser logs to your server endpoint",[488,514,515],{},[458,516,517],{"href":460},"HTTP drain (browser to server)",[473,519,520,523],{},[488,521,522],{},"Tune batch size, retry strategy, buffer size",[488,524,525],{},[458,526,422],{"href":527},"#configuration",[529,530,533,536,608],"prompt",{":actions":531,"description":532,"icon":415},"[\"copy\",\"cursor\",\"windsurf\"]","Add the drain pipeline (batch + retry + fanout)",[454,534,535],{},"Wrap my evlog drain in the shared pipeline so it batches, retries, and survives transient failures.",[537,538,539,551,557,575,586,605],"ul",{},[540,541,542,543,547,548],"li",{},"Import ",[544,545,546],"code",{},"createDrainPipeline"," from ",[544,549,550],{},"evlog\u002Fpipeline",[540,552,553,554],{},"Wrap the underlying drain: ",[544,555,556],{},"const drain = createDrainPipeline\u003CDrainContext>()(createAxiomDrain())",[540,558,559,560,563,564,567,568,571,572],{},"Configure ",[544,561,562],{},"batch"," (size + intervalMs), ",[544,565,566],{},"retry"," (maxAttempts + backoff), and ",[544,569,570],{},"maxBufferSize"," (oldest events drop on overflow). Sane defaults: ",[544,573,574],{},"{ batch: { size: 50, intervalMs: 5000 }, retry: { maxAttempts: 3 } }",[540,576,577,578,581,582,585],{},"For multiple destinations, write a single drain function that fans out internally with ",[544,579,580],{},"Promise.allSettled([drainA(batch), drainB(batch)])"," and pass that to ",[544,583,584],{},"pipeline(...)"," — one shared buffer, one shared retry budget",[540,587,588,589,592,593,596,597,600,601,604],{},"On shutdown, call ",[544,590,591],{},"drain.flush()"," to push buffered events (frameworks with proper lifecycle do this automatically: Nitro ",[544,594,595],{},"close"," hook, Standalone before ",[544,598,599],{},"process.exit",", serverless via ",[544,602,603],{},"waitUntil(drain.flush())",")",[540,606,607],{},"Always use the pipeline in production — direct drains make one HTTP call per event and fall over fast",[454,609,610,611,616,617],{},"Docs: ",[458,612,613],{"href":613,"rel":614},"https:\u002F\u002Fwww.evlog.dev\u002Fextend\u002Fdrain-pipeline",[615],"nofollow","\nAdapters: ",[458,618,619],{"href":619,"rel":620},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fadapters\u002Foverview",[615],[622,623,496],"h2",{"id":624},"quick-start",[454,626,627],{},"The pipeline wraps any drain. The wiring depends on your framework — pick the tab that matches yours; every other example below uses the same shape.",[629,630,631,896,1127,1313],"code-group",{},[632,633,639],"pre",{"className":634,"code":635,"filename":636,"language":637,"meta":638,"style":638},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F server\u002Fplugins\u002Fevlog-drain.ts\nimport type { DrainContext } from 'evlog'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\n\nexport default defineNitroPlugin((nitroApp) => {\n  const pipeline = createDrainPipeline\u003CDrainContext>()\n  const drain = pipeline(createAxiomDrain())\n\n  nitroApp.hooks.hook('evlog:drain', drain)\n  nitroApp.hooks.hook('close', () => drain.flush())\n})\n","Nuxt \u002F Nitro","typescript","",[544,640,641,650,684,704,725,732,763,791,811,816,851,888],{"__ignoreMap":638},[642,643,646],"span",{"class":644,"line":645},"line",1,[642,647,649],{"class":648},"sHwdD","\u002F\u002F server\u002Fplugins\u002Fevlog-drain.ts\n",[642,651,653,657,660,664,668,671,674,677,681],{"class":644,"line":652},2,[642,654,656],{"class":655},"s7zQu","import",[642,658,659],{"class":655}," type",[642,661,663],{"class":662},"sMK4o"," {",[642,665,667],{"class":666},"sTEyZ"," DrainContext",[642,669,670],{"class":662}," }",[642,672,673],{"class":655}," from",[642,675,676],{"class":662}," '",[642,678,680],{"class":679},"sfazB","evlog",[642,682,683],{"class":662},"'\n",[642,685,687,689,691,694,696,698,700,702],{"class":644,"line":686},3,[642,688,656],{"class":655},[642,690,663],{"class":662},[642,692,693],{"class":666}," createDrainPipeline",[642,695,670],{"class":662},[642,697,673],{"class":655},[642,699,676],{"class":662},[642,701,550],{"class":679},[642,703,683],{"class":662},[642,705,707,709,711,714,716,718,720,723],{"class":644,"line":706},4,[642,708,656],{"class":655},[642,710,663],{"class":662},[642,712,713],{"class":666}," createAxiomDrain",[642,715,670],{"class":662},[642,717,673],{"class":655},[642,719,676],{"class":662},[642,721,722],{"class":679},"evlog\u002Faxiom",[642,724,683],{"class":662},[642,726,728],{"class":644,"line":727},5,[642,729,731],{"emptyLinePlaceholder":730},true,"\n",[642,733,735,738,741,745,748,750,754,756,760],{"class":644,"line":734},6,[642,736,737],{"class":655},"export",[642,739,740],{"class":655}," default",[642,742,744],{"class":743},"s2Zo4"," defineNitroPlugin",[642,746,747],{"class":666},"(",[642,749,747],{"class":662},[642,751,753],{"class":752},"sHdIc","nitroApp",[642,755,604],{"class":662},[642,757,759],{"class":758},"spNyl"," =>",[642,761,762],{"class":662}," {\n",[642,764,766,769,772,775,777,780,784,787],{"class":644,"line":765},7,[642,767,768],{"class":758},"  const",[642,770,771],{"class":666}," pipeline",[642,773,774],{"class":662}," =",[642,776,693],{"class":743},[642,778,779],{"class":662},"\u003C",[642,781,783],{"class":782},"sBMFI","DrainContext",[642,785,786],{"class":662},">",[642,788,790],{"class":789},"swJcz","()\n",[642,792,794,796,799,801,803,805,808],{"class":644,"line":793},8,[642,795,768],{"class":758},[642,797,798],{"class":666}," drain",[642,800,774],{"class":662},[642,802,771],{"class":743},[642,804,747],{"class":789},[642,806,807],{"class":743},"createAxiomDrain",[642,809,810],{"class":789},"())\n",[642,812,814],{"class":644,"line":813},9,[642,815,731],{"emptyLinePlaceholder":730},[642,817,819,822,825,828,830,833,835,838,841,843,846,848],{"class":644,"line":818},10,[642,820,821],{"class":666},"  nitroApp",[642,823,824],{"class":662},".",[642,826,827],{"class":666},"hooks",[642,829,824],{"class":662},[642,831,832],{"class":743},"hook",[642,834,747],{"class":789},[642,836,837],{"class":662},"'",[642,839,840],{"class":679},"evlog:drain",[642,842,837],{"class":662},[642,844,845],{"class":662},",",[642,847,798],{"class":666},[642,849,850],{"class":789},")\n",[642,852,854,856,858,860,862,864,866,868,870,872,874,877,879,881,883,886],{"class":644,"line":853},11,[642,855,821],{"class":666},[642,857,824],{"class":662},[642,859,827],{"class":666},[642,861,824],{"class":662},[642,863,832],{"class":743},[642,865,747],{"class":789},[642,867,837],{"class":662},[642,869,595],{"class":679},[642,871,837],{"class":662},[642,873,845],{"class":662},[642,875,876],{"class":662}," ()",[642,878,759],{"class":758},[642,880,798],{"class":666},[642,882,824],{"class":662},[642,884,885],{"class":743},"flush",[642,887,810],{"class":789},[642,889,891,894],{"class":644,"line":890},12,[642,892,893],{"class":662},"}",[642,895,850],{"class":666},[632,897,899],{"className":634,"code":898,"filename":172,"language":637,"meta":638,"style":638},"\u002F\u002F lib\u002Fevlog.ts\nimport type { DrainContext } from 'evlog'\nimport { createEvlog } from 'evlog\u002Fnext'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>()\nconst drain = pipeline(createAxiomDrain())\n\nexport const { withEvlog, useLogger, log, createError } = createEvlog({\n  service: 'my-app',\n  drain,\n})\n\nexport const flushEvlog = () => drain.flush()\n",[544,900,901,906,926,946,964,982,986,1007,1024,1028,1066,1084,1091,1098,1103],{"__ignoreMap":638},[642,902,903],{"class":644,"line":645},[642,904,905],{"class":648},"\u002F\u002F lib\u002Fevlog.ts\n",[642,907,908,910,912,914,916,918,920,922,924],{"class":644,"line":652},[642,909,656],{"class":655},[642,911,659],{"class":655},[642,913,663],{"class":662},[642,915,667],{"class":666},[642,917,670],{"class":662},[642,919,673],{"class":655},[642,921,676],{"class":662},[642,923,680],{"class":679},[642,925,683],{"class":662},[642,927,928,930,932,935,937,939,941,944],{"class":644,"line":686},[642,929,656],{"class":655},[642,931,663],{"class":662},[642,933,934],{"class":666}," createEvlog",[642,936,670],{"class":662},[642,938,673],{"class":655},[642,940,676],{"class":662},[642,942,943],{"class":679},"evlog\u002Fnext",[642,945,683],{"class":662},[642,947,948,950,952,954,956,958,960,962],{"class":644,"line":706},[642,949,656],{"class":655},[642,951,663],{"class":662},[642,953,693],{"class":666},[642,955,670],{"class":662},[642,957,673],{"class":655},[642,959,676],{"class":662},[642,961,550],{"class":679},[642,963,683],{"class":662},[642,965,966,968,970,972,974,976,978,980],{"class":644,"line":727},[642,967,656],{"class":655},[642,969,663],{"class":662},[642,971,713],{"class":666},[642,973,670],{"class":662},[642,975,673],{"class":655},[642,977,676],{"class":662},[642,979,722],{"class":679},[642,981,683],{"class":662},[642,983,984],{"class":644,"line":734},[642,985,731],{"emptyLinePlaceholder":730},[642,987,988,991,994,997,999,1001,1003,1005],{"class":644,"line":765},[642,989,990],{"class":758},"const",[642,992,993],{"class":666}," pipeline ",[642,995,996],{"class":662},"=",[642,998,693],{"class":743},[642,1000,779],{"class":662},[642,1002,783],{"class":782},[642,1004,786],{"class":662},[642,1006,790],{"class":666},[642,1008,1009,1011,1014,1016,1018,1020,1022],{"class":644,"line":793},[642,1010,990],{"class":758},[642,1012,1013],{"class":666}," drain ",[642,1015,996],{"class":662},[642,1017,771],{"class":743},[642,1019,747],{"class":666},[642,1021,807],{"class":743},[642,1023,810],{"class":666},[642,1025,1026],{"class":644,"line":813},[642,1027,731],{"emptyLinePlaceholder":730},[642,1029,1030,1032,1035,1037,1040,1042,1045,1047,1050,1052,1055,1057,1059,1061,1063],{"class":644,"line":818},[642,1031,737],{"class":655},[642,1033,1034],{"class":758}," const",[642,1036,663],{"class":662},[642,1038,1039],{"class":666}," withEvlog",[642,1041,845],{"class":662},[642,1043,1044],{"class":666}," useLogger",[642,1046,845],{"class":662},[642,1048,1049],{"class":666}," log",[642,1051,845],{"class":662},[642,1053,1054],{"class":666}," createError ",[642,1056,893],{"class":662},[642,1058,774],{"class":662},[642,1060,934],{"class":743},[642,1062,747],{"class":666},[642,1064,1065],{"class":662},"{\n",[642,1067,1068,1071,1074,1076,1079,1081],{"class":644,"line":853},[642,1069,1070],{"class":789},"  service",[642,1072,1073],{"class":662},":",[642,1075,676],{"class":662},[642,1077,1078],{"class":679},"my-app",[642,1080,837],{"class":662},[642,1082,1083],{"class":662},",\n",[642,1085,1086,1089],{"class":644,"line":890},[642,1087,1088],{"class":666},"  drain",[642,1090,1083],{"class":662},[642,1092,1094,1096],{"class":644,"line":1093},13,[642,1095,893],{"class":662},[642,1097,850],{"class":666},[642,1099,1101],{"class":644,"line":1100},14,[642,1102,731],{"emptyLinePlaceholder":730},[642,1104,1106,1108,1110,1113,1115,1117,1119,1121,1123,1125],{"class":644,"line":1105},15,[642,1107,737],{"class":655},[642,1109,1034],{"class":758},[642,1111,1112],{"class":666}," flushEvlog ",[642,1114,996],{"class":662},[642,1116,876],{"class":662},[642,1118,759],{"class":758},[642,1120,798],{"class":666},[642,1122,824],{"class":662},[642,1124,885],{"class":743},[642,1126,790],{"class":666},[632,1128,1131],{"className":634,"code":1129,"filename":1130,"language":637,"meta":638,"style":638},"import type { DrainContext } from 'evlog'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>()\nconst drain = pipeline(createAxiomDrain())\n\napp.use(evlog({ drain })) \u002F\u002F Hono \u002F Express \u002F Elysia\n\u002F\u002F await app.register(evlog, { drain }) \u002F\u002F Fastify\n\u002F\u002F EvlogModule.forRoot({ drain }) \u002F\u002F NestJS\n\nprocess.on('SIGTERM', () => drain.flush())\n","Hono \u002F Express \u002F Fastify \u002F Elysia \u002F NestJS",[544,1132,1133,1153,1171,1189,1193,1211,1227,1231,1260,1268,1276,1280],{"__ignoreMap":638},[642,1134,1135,1137,1139,1141,1143,1145,1147,1149,1151],{"class":644,"line":645},[642,1136,656],{"class":655},[642,1138,659],{"class":655},[642,1140,663],{"class":662},[642,1142,667],{"class":666},[642,1144,670],{"class":662},[642,1146,673],{"class":655},[642,1148,676],{"class":662},[642,1150,680],{"class":679},[642,1152,683],{"class":662},[642,1154,1155,1157,1159,1161,1163,1165,1167,1169],{"class":644,"line":652},[642,1156,656],{"class":655},[642,1158,663],{"class":662},[642,1160,693],{"class":666},[642,1162,670],{"class":662},[642,1164,673],{"class":655},[642,1166,676],{"class":662},[642,1168,550],{"class":679},[642,1170,683],{"class":662},[642,1172,1173,1175,1177,1179,1181,1183,1185,1187],{"class":644,"line":686},[642,1174,656],{"class":655},[642,1176,663],{"class":662},[642,1178,713],{"class":666},[642,1180,670],{"class":662},[642,1182,673],{"class":655},[642,1184,676],{"class":662},[642,1186,722],{"class":679},[642,1188,683],{"class":662},[642,1190,1191],{"class":644,"line":706},[642,1192,731],{"emptyLinePlaceholder":730},[642,1194,1195,1197,1199,1201,1203,1205,1207,1209],{"class":644,"line":727},[642,1196,990],{"class":758},[642,1198,993],{"class":666},[642,1200,996],{"class":662},[642,1202,693],{"class":743},[642,1204,779],{"class":662},[642,1206,783],{"class":782},[642,1208,786],{"class":662},[642,1210,790],{"class":666},[642,1212,1213,1215,1217,1219,1221,1223,1225],{"class":644,"line":734},[642,1214,990],{"class":758},[642,1216,1013],{"class":666},[642,1218,996],{"class":662},[642,1220,771],{"class":743},[642,1222,747],{"class":666},[642,1224,807],{"class":743},[642,1226,810],{"class":666},[642,1228,1229],{"class":644,"line":765},[642,1230,731],{"emptyLinePlaceholder":730},[642,1232,1233,1236,1238,1241,1243,1245,1247,1250,1252,1254,1257],{"class":644,"line":793},[642,1234,1235],{"class":666},"app",[642,1237,824],{"class":662},[642,1239,1240],{"class":743},"use",[642,1242,747],{"class":666},[642,1244,680],{"class":743},[642,1246,747],{"class":666},[642,1248,1249],{"class":662},"{",[642,1251,1013],{"class":666},[642,1253,893],{"class":662},[642,1255,1256],{"class":666},")) ",[642,1258,1259],{"class":648},"\u002F\u002F Hono \u002F Express \u002F Elysia\n",[642,1261,1262,1265],{"class":644,"line":813},[642,1263,1264],{"class":648},"\u002F\u002F await app.register(evlog, { drain })",[642,1266,1267],{"class":648}," \u002F\u002F Fastify\n",[642,1269,1270,1273],{"class":644,"line":818},[642,1271,1272],{"class":648},"\u002F\u002F EvlogModule.forRoot({ drain })",[642,1274,1275],{"class":648}," \u002F\u002F NestJS\n",[642,1277,1278],{"class":644,"line":853},[642,1279,731],{"emptyLinePlaceholder":730},[642,1281,1282,1285,1287,1290,1292,1294,1297,1299,1301,1303,1305,1307,1309,1311],{"class":644,"line":890},[642,1283,1284],{"class":666},"process",[642,1286,824],{"class":662},[642,1288,1289],{"class":743},"on",[642,1291,747],{"class":666},[642,1293,837],{"class":662},[642,1295,1296],{"class":679},"SIGTERM",[642,1298,837],{"class":662},[642,1300,845],{"class":662},[642,1302,876],{"class":662},[642,1304,759],{"class":758},[642,1306,798],{"class":666},[642,1308,824],{"class":662},[642,1310,885],{"class":743},[642,1312,810],{"class":666},[632,1314,1316],{"className":634,"code":1315,"filename":227,"language":637,"meta":638,"style":638},"\u002F\u002F index.ts — plain TypeScript \u002F Bun \u002F Node script\nimport type { DrainContext } from 'evlog'\nimport { initLogger } from 'evlog'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>()\nconst drain = pipeline(createAxiomDrain())\n\ninitLogger({ drain })\n\nawait drain.flush() \u002F\u002F before exit\n",[544,1317,1318,1323,1343,1362,1380,1398,1402,1420,1436,1440,1455,1459],{"__ignoreMap":638},[642,1319,1320],{"class":644,"line":645},[642,1321,1322],{"class":648},"\u002F\u002F index.ts — plain TypeScript \u002F Bun \u002F Node script\n",[642,1324,1325,1327,1329,1331,1333,1335,1337,1339,1341],{"class":644,"line":652},[642,1326,656],{"class":655},[642,1328,659],{"class":655},[642,1330,663],{"class":662},[642,1332,667],{"class":666},[642,1334,670],{"class":662},[642,1336,673],{"class":655},[642,1338,676],{"class":662},[642,1340,680],{"class":679},[642,1342,683],{"class":662},[642,1344,1345,1347,1349,1352,1354,1356,1358,1360],{"class":644,"line":686},[642,1346,656],{"class":655},[642,1348,663],{"class":662},[642,1350,1351],{"class":666}," initLogger",[642,1353,670],{"class":662},[642,1355,673],{"class":655},[642,1357,676],{"class":662},[642,1359,680],{"class":679},[642,1361,683],{"class":662},[642,1363,1364,1366,1368,1370,1372,1374,1376,1378],{"class":644,"line":706},[642,1365,656],{"class":655},[642,1367,663],{"class":662},[642,1369,693],{"class":666},[642,1371,670],{"class":662},[642,1373,673],{"class":655},[642,1375,676],{"class":662},[642,1377,550],{"class":679},[642,1379,683],{"class":662},[642,1381,1382,1384,1386,1388,1390,1392,1394,1396],{"class":644,"line":727},[642,1383,656],{"class":655},[642,1385,663],{"class":662},[642,1387,713],{"class":666},[642,1389,670],{"class":662},[642,1391,673],{"class":655},[642,1393,676],{"class":662},[642,1395,722],{"class":679},[642,1397,683],{"class":662},[642,1399,1400],{"class":644,"line":734},[642,1401,731],{"emptyLinePlaceholder":730},[642,1403,1404,1406,1408,1410,1412,1414,1416,1418],{"class":644,"line":765},[642,1405,990],{"class":758},[642,1407,993],{"class":666},[642,1409,996],{"class":662},[642,1411,693],{"class":743},[642,1413,779],{"class":662},[642,1415,783],{"class":782},[642,1417,786],{"class":662},[642,1419,790],{"class":666},[642,1421,1422,1424,1426,1428,1430,1432,1434],{"class":644,"line":793},[642,1423,990],{"class":758},[642,1425,1013],{"class":666},[642,1427,996],{"class":662},[642,1429,771],{"class":743},[642,1431,747],{"class":666},[642,1433,807],{"class":743},[642,1435,810],{"class":666},[642,1437,1438],{"class":644,"line":813},[642,1439,731],{"emptyLinePlaceholder":730},[642,1441,1442,1445,1447,1449,1451,1453],{"class":644,"line":818},[642,1443,1444],{"class":743},"initLogger",[642,1446,747],{"class":666},[642,1448,1249],{"class":662},[642,1450,1013],{"class":666},[642,1452,893],{"class":662},[642,1454,850],{"class":666},[642,1456,1457],{"class":644,"line":853},[642,1458,731],{"emptyLinePlaceholder":730},[642,1460,1461,1464,1466,1468,1470,1473],{"class":644,"line":890},[642,1462,1463],{"class":655},"await",[642,1465,798],{"class":666},[642,1467,824],{"class":662},[642,1469,885],{"class":743},[642,1471,1472],{"class":666},"() ",[642,1474,1475],{"class":648},"\u002F\u002F before exit\n",[1477,1478,1481,1482,1484,1485,1487,1488,1490,1491,824],"callout",{"color":1479,"icon":1480},"warning","i-lucide-alert-triangle","Always flush the pipeline before the process exits (",[544,1483,591],{},"). On Nitro use the ",[544,1486,595],{}," hook; on standalone scripts call it before ",[544,1489,599],{},"; on serverless runtimes use ",[544,1492,603],{},[622,1494,1496],{"id":1495},"how-it-works","How it works",[454,1498,1499,1500,1502,1503,1506,1507,1510,1511,1514,1515,1518,1519,1521],{},"Events are buffered as they arrive on ",[544,1501,840],{},". A batch flushes when either ",[544,1504,1505],{},"batch.size"," is reached or ",[544,1508,1509],{},"batch.intervalMs"," expires (whichever comes first). On failure, the same batch is retried with the configured backoff; once ",[544,1512,1513],{},"retry.maxAttempts"," is exhausted, ",[544,1516,1517],{},"onDropped"," is called with the lost events. The buffer is bounded by ",[544,1520,570],{}," — once full, the oldest events are dropped to keep memory flat.",[622,1523,422],{"id":1524},"configuration",[632,1526,1529],{"className":634,"code":1527,"filename":1528,"language":637,"meta":638,"style":638},"import type { DrainContext } from 'evlog'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({\n  batch: {\n    size: 50,          \u002F\u002F Flush every 50 events\n    intervalMs: 5000,  \u002F\u002F Or every 5 seconds, whichever comes first\n  },\n  retry: {\n    maxAttempts: 3,\n    backoff: 'exponential',\n    initialDelayMs: 1000,\n    maxDelayMs: 30000,\n  },\n  maxBufferSize: 1000,\n  onDropped: (events, error) => {\n    console.error(`[evlog] Dropped ${events.length} events:`, error?.message)\n  },\n})\n\nexport const drain = pipeline(createAxiomDrain())\n","pipeline-config.ts",[544,1530,1531,1551,1569,1587,1591,1611,1620,1636,1651,1656,1665,1677,1693,1705,1717,1721,1733,1758,1806,1811,1818,1823],{"__ignoreMap":638},[642,1532,1533,1535,1537,1539,1541,1543,1545,1547,1549],{"class":644,"line":645},[642,1534,656],{"class":655},[642,1536,659],{"class":655},[642,1538,663],{"class":662},[642,1540,667],{"class":666},[642,1542,670],{"class":662},[642,1544,673],{"class":655},[642,1546,676],{"class":662},[642,1548,680],{"class":679},[642,1550,683],{"class":662},[642,1552,1553,1555,1557,1559,1561,1563,1565,1567],{"class":644,"line":652},[642,1554,656],{"class":655},[642,1556,663],{"class":662},[642,1558,693],{"class":666},[642,1560,670],{"class":662},[642,1562,673],{"class":655},[642,1564,676],{"class":662},[642,1566,550],{"class":679},[642,1568,683],{"class":662},[642,1570,1571,1573,1575,1577,1579,1581,1583,1585],{"class":644,"line":686},[642,1572,656],{"class":655},[642,1574,663],{"class":662},[642,1576,713],{"class":666},[642,1578,670],{"class":662},[642,1580,673],{"class":655},[642,1582,676],{"class":662},[642,1584,722],{"class":679},[642,1586,683],{"class":662},[642,1588,1589],{"class":644,"line":706},[642,1590,731],{"emptyLinePlaceholder":730},[642,1592,1593,1595,1597,1599,1601,1603,1605,1607,1609],{"class":644,"line":727},[642,1594,990],{"class":758},[642,1596,993],{"class":666},[642,1598,996],{"class":662},[642,1600,693],{"class":743},[642,1602,779],{"class":662},[642,1604,783],{"class":782},[642,1606,786],{"class":662},[642,1608,747],{"class":666},[642,1610,1065],{"class":662},[642,1612,1613,1616,1618],{"class":644,"line":734},[642,1614,1615],{"class":789},"  batch",[642,1617,1073],{"class":662},[642,1619,762],{"class":662},[642,1621,1622,1625,1627,1631,1633],{"class":644,"line":765},[642,1623,1624],{"class":789},"    size",[642,1626,1073],{"class":662},[642,1628,1630],{"class":1629},"sbssI"," 50",[642,1632,845],{"class":662},[642,1634,1635],{"class":648},"          \u002F\u002F Flush every 50 events\n",[642,1637,1638,1641,1643,1646,1648],{"class":644,"line":793},[642,1639,1640],{"class":789},"    intervalMs",[642,1642,1073],{"class":662},[642,1644,1645],{"class":1629}," 5000",[642,1647,845],{"class":662},[642,1649,1650],{"class":648},"  \u002F\u002F Or every 5 seconds, whichever comes first\n",[642,1652,1653],{"class":644,"line":813},[642,1654,1655],{"class":662},"  },\n",[642,1657,1658,1661,1663],{"class":644,"line":818},[642,1659,1660],{"class":789},"  retry",[642,1662,1073],{"class":662},[642,1664,762],{"class":662},[642,1666,1667,1670,1672,1675],{"class":644,"line":853},[642,1668,1669],{"class":789},"    maxAttempts",[642,1671,1073],{"class":662},[642,1673,1674],{"class":1629}," 3",[642,1676,1083],{"class":662},[642,1678,1679,1682,1684,1686,1689,1691],{"class":644,"line":890},[642,1680,1681],{"class":789},"    backoff",[642,1683,1073],{"class":662},[642,1685,676],{"class":662},[642,1687,1688],{"class":679},"exponential",[642,1690,837],{"class":662},[642,1692,1083],{"class":662},[642,1694,1695,1698,1700,1703],{"class":644,"line":1093},[642,1696,1697],{"class":789},"    initialDelayMs",[642,1699,1073],{"class":662},[642,1701,1702],{"class":1629}," 1000",[642,1704,1083],{"class":662},[642,1706,1707,1710,1712,1715],{"class":644,"line":1100},[642,1708,1709],{"class":789},"    maxDelayMs",[642,1711,1073],{"class":662},[642,1713,1714],{"class":1629}," 30000",[642,1716,1083],{"class":662},[642,1718,1719],{"class":644,"line":1105},[642,1720,1655],{"class":662},[642,1722,1724,1727,1729,1731],{"class":644,"line":1723},16,[642,1725,1726],{"class":789},"  maxBufferSize",[642,1728,1073],{"class":662},[642,1730,1702],{"class":1629},[642,1732,1083],{"class":662},[642,1734,1736,1739,1741,1744,1747,1749,1752,1754,1756],{"class":644,"line":1735},17,[642,1737,1738],{"class":743},"  onDropped",[642,1740,1073],{"class":662},[642,1742,1743],{"class":662}," (",[642,1745,1746],{"class":752},"events",[642,1748,845],{"class":662},[642,1750,1751],{"class":752}," error",[642,1753,604],{"class":662},[642,1755,759],{"class":758},[642,1757,762],{"class":662},[642,1759,1761,1764,1766,1769,1771,1774,1777,1780,1782,1784,1787,1789,1792,1794,1796,1798,1801,1804],{"class":644,"line":1760},18,[642,1762,1763],{"class":666},"    console",[642,1765,824],{"class":662},[642,1767,1768],{"class":743},"error",[642,1770,747],{"class":789},[642,1772,1773],{"class":662},"`",[642,1775,1776],{"class":679},"[evlog] Dropped ",[642,1778,1779],{"class":662},"${",[642,1781,1746],{"class":666},[642,1783,824],{"class":662},[642,1785,1786],{"class":666},"length",[642,1788,893],{"class":662},[642,1790,1791],{"class":679}," events:",[642,1793,1773],{"class":662},[642,1795,845],{"class":662},[642,1797,1751],{"class":666},[642,1799,1800],{"class":662},"?.",[642,1802,1803],{"class":666},"message",[642,1805,850],{"class":789},[642,1807,1809],{"class":644,"line":1808},19,[642,1810,1655],{"class":662},[642,1812,1814,1816],{"class":644,"line":1813},20,[642,1815,893],{"class":662},[642,1817,850],{"class":666},[642,1819,1821],{"class":644,"line":1820},21,[642,1822,731],{"emptyLinePlaceholder":730},[642,1824,1826,1828,1830,1832,1834,1836,1838,1840],{"class":644,"line":1825},22,[642,1827,737],{"class":655},[642,1829,1034],{"class":758},[642,1831,1013],{"class":666},[642,1833,996],{"class":662},[642,1835,771],{"class":743},[642,1837,747],{"class":666},[642,1839,807],{"class":743},[642,1841,810],{"class":666},[1843,1844,1846],"h3",{"id":1845},"options-reference","Options reference",[467,1848,1849,1862],{},[470,1850,1851],{},[473,1852,1853,1856,1859],{},[476,1854,1855],{},"Option",[476,1857,1858],{},"Default",[476,1860,1861],{},"Description",[483,1863,1864,1878,1892,1906,1929,1944,1959,1972],{},[473,1865,1866,1870,1875],{},[488,1867,1868],{},[544,1869,1505],{},[488,1871,1872],{},[544,1873,1874],{},"50",[488,1876,1877],{},"Maximum events per batch",[473,1879,1880,1884,1889],{},[488,1881,1882],{},[544,1883,1509],{},[488,1885,1886],{},[544,1887,1888],{},"5000",[488,1890,1891],{},"Max time (ms) before flushing a partial batch",[473,1893,1894,1898,1903],{},[488,1895,1896],{},[544,1897,1513],{},[488,1899,1900],{},[544,1901,1902],{},"3",[488,1904,1905],{},"Total attempts including the initial one",[473,1907,1908,1913,1918],{},[488,1909,1910],{},[544,1911,1912],{},"retry.backoff",[488,1914,1915],{},[544,1916,1917],{},"'exponential'",[488,1919,1920,1922,1923,1922,1926],{},[544,1921,1917],{}," | ",[544,1924,1925],{},"'linear'",[544,1927,1928],{},"'fixed'",[473,1930,1931,1936,1941],{},[488,1932,1933],{},[544,1934,1935],{},"retry.initialDelayMs",[488,1937,1938],{},[544,1939,1940],{},"1000",[488,1942,1943],{},"Base delay for the first retry",[473,1945,1946,1951,1956],{},[488,1947,1948],{},[544,1949,1950],{},"retry.maxDelayMs",[488,1952,1953],{},[544,1954,1955],{},"30000",[488,1957,1958],{},"Upper bound for any retry delay",[473,1960,1961,1965,1969],{},[488,1962,1963],{},[544,1964,570],{},[488,1966,1967],{},[544,1968,1940],{},[488,1970,1971],{},"Max buffered events before dropping oldest",[473,1973,1974,1978,1981],{},[488,1975,1976],{},[544,1977,1517],{},[488,1979,1980],{},"-",[488,1982,1983],{},"Callback when events are dropped (overflow or retry exhaustion)",[1843,1985,1987],{"id":1986},"backoff-strategies","Backoff strategies",[467,1989,1990,2003],{},[470,1991,1992],{},[473,1993,1994,1997,2000],{},[476,1995,1996],{},"Strategy",[476,1998,1999],{},"Delay pattern",[476,2001,2002],{},"Use case",[483,2004,2005,2017,2030],{},[473,2006,2007,2011,2014],{},[488,2008,2009],{},[544,2010,1688],{},[488,2012,2013],{},"1s, 2s, 4s, 8s…",[488,2015,2016],{},"Default. Best for transient failures that may need time to recover",[473,2018,2019,2024,2027],{},[488,2020,2021],{},[544,2022,2023],{},"linear",[488,2025,2026],{},"1s, 2s, 3s, 4s…",[488,2028,2029],{},"Predictable delay growth",[473,2031,2032,2037,2040],{},[488,2033,2034],{},[544,2035,2036],{},"fixed",[488,2038,2039],{},"1s, 1s, 1s, 1s…",[488,2041,2042],{},"Same delay every time. Useful for rate-limited APIs",[1843,2044,2046],{"id":2045},"returned-drain-function","Returned drain function",[454,2048,2049,2050,2053],{},"The function returned by ",[544,2051,2052],{},"pipeline(drain)"," is hook-compatible and exposes:",[467,2055,2056,2068],{},[470,2057,2058],{},[473,2059,2060,2063,2066],{},[476,2061,2062],{},"Property",[476,2064,2065],{},"Type",[476,2067,1861],{},[483,2069,2070,2085,2099],{},[473,2071,2072,2077,2082],{},[488,2073,2074],{},[544,2075,2076],{},"drain(ctx)",[488,2078,2079],{},[544,2080,2081],{},"(ctx: T) => void",[488,2083,2084],{},"Push a single event into the buffer",[473,2086,2087,2091,2096],{},[488,2088,2089],{},[544,2090,591],{},[488,2092,2093],{},[544,2094,2095],{},"() => Promise\u003Cvoid>",[488,2097,2098],{},"Force-flush all buffered events",[473,2100,2101,2106,2111],{},[488,2102,2103],{},[544,2104,2105],{},"drain.pending",[488,2107,2108],{},[544,2109,2110],{},"number",[488,2112,2113],{},"Number of events currently buffered",[622,2115,507],{"id":2116},"fanout",[2118,2119],"drain-fan-out",{},[454,2121,2122,2123,2126],{},"In production, the same wide event often needs to reach more than one destination: a long-term store (Axiom), a metrics tool (Datadog), an error tracker (Sentry), and a local fs drain for incident replay. The pipeline batches once, then your drain fans out the batch to every destination in parallel via ",[544,2124,2125],{},"Promise.allSettled"," so a single slow \u002F failing destination cannot block the others.",[529,2128,2130,2133,2192],{":actions":531,"description":2129,"icon":410},"Fan out evlog events to multiple destinations",[454,2131,2132],{},"Send each wide event to several destinations in parallel through a single drain pipeline.",[537,2134,2135,2151,2161,2175,2186],{},[540,2136,2137,2138,547,2140,2142,2143,2146,2147,2150],{},"Wrap a single ",[544,2139,546],{},[544,2141,550],{}," around a fan-out function that calls every destination drain inside ",[544,2144,2145],{},"Promise.allSettled([drainA(batch), drainB(batch), …])"," — ",[544,2148,2149],{},"allSettled"," so one failing drain doesn't reject the whole batch",[540,2152,2153,2154,2157,2158,604],{},"Pick destinations by purpose: long-term store (Axiom \u002F Better Stack \u002F Datadog), error tracker (Sentry — typically ",[544,2155,2156],{},"{ minLevel: 'error' }"," so it doesn't get all events), local replay (",[544,2159,2160],{},"createFsDrain",[540,2162,2163,2164,2166,2167,2166,2169,2171,2172,2174],{},"Tune ",[544,2165,1505],{},", ",[544,2168,1509],{},[544,2170,1513],{},", and ",[544,2173,570],{}," once at the pipeline level — applies to all destinations",[540,2176,2177,2178,2181,2182,2185],{},"For destinations that need different filtering, prefer per-drain ",[544,2179,2180],{},"minLevel"," \u002F ",[544,2183,2184],{},"filter"," options over wrapping",[540,2187,2188,2189,2191],{},"Don't forget ",[544,2190,591],{}," on shutdown — events buffered for fanout are lost on abrupt exit",[454,2193,610,2194],{},[458,2195,613],{"href":613,"rel":2196},[615],[1843,2198,2200],{"id":2199},"the-recipe","The recipe",[632,2202,2206],{"className":2203,"code":2204,"language":2205,"meta":638,"style":638},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createDrainPipeline } from 'evlog\u002Fpipeline'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\nimport { createDatadogDrain } from 'evlog\u002Fdatadog'\nimport { createSentryDrain } from 'evlog\u002Fsentry'\nimport { createFsDrain } from 'evlog\u002Ffs'\nimport type { DrainContext } from 'evlog'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({\n  batch: { size: 50, intervalMs: 5000 },\n  retry: { maxAttempts: 3 },\n  maxBufferSize: 1000,\n})\n\nconst axiom = createAxiomDrain()\nconst datadog = createDatadogDrain()\nconst sentry = createSentryDrain({ minLevel: 'error' })\nconst fs = createFsDrain({ dir: '.evlog\u002Flogs', maxFiles: 14 })\n\nexport const drain = pipeline(async (batch) => {\n  await Promise.allSettled([\n    axiom(batch),\n    datadog(batch),\n    sentry(batch),\n    fs(batch),\n  ])\n})\n","ts",[544,2207,2208,2226,2244,2264,2284,2304,2324,2328,2348,2375,2392,2402,2408,2412,2425,2438,2468,2509,2513,2540,2555,2568,2581,2595,2609,2615],{"__ignoreMap":638},[642,2209,2210,2212,2214,2216,2218,2220,2222,2224],{"class":644,"line":645},[642,2211,656],{"class":655},[642,2213,663],{"class":662},[642,2215,693],{"class":666},[642,2217,670],{"class":662},[642,2219,673],{"class":655},[642,2221,676],{"class":662},[642,2223,550],{"class":679},[642,2225,683],{"class":662},[642,2227,2228,2230,2232,2234,2236,2238,2240,2242],{"class":644,"line":652},[642,2229,656],{"class":655},[642,2231,663],{"class":662},[642,2233,713],{"class":666},[642,2235,670],{"class":662},[642,2237,673],{"class":655},[642,2239,676],{"class":662},[642,2241,722],{"class":679},[642,2243,683],{"class":662},[642,2245,2246,2248,2250,2253,2255,2257,2259,2262],{"class":644,"line":686},[642,2247,656],{"class":655},[642,2249,663],{"class":662},[642,2251,2252],{"class":666}," createDatadogDrain",[642,2254,670],{"class":662},[642,2256,673],{"class":655},[642,2258,676],{"class":662},[642,2260,2261],{"class":679},"evlog\u002Fdatadog",[642,2263,683],{"class":662},[642,2265,2266,2268,2270,2273,2275,2277,2279,2282],{"class":644,"line":706},[642,2267,656],{"class":655},[642,2269,663],{"class":662},[642,2271,2272],{"class":666}," createSentryDrain",[642,2274,670],{"class":662},[642,2276,673],{"class":655},[642,2278,676],{"class":662},[642,2280,2281],{"class":679},"evlog\u002Fsentry",[642,2283,683],{"class":662},[642,2285,2286,2288,2290,2293,2295,2297,2299,2302],{"class":644,"line":727},[642,2287,656],{"class":655},[642,2289,663],{"class":662},[642,2291,2292],{"class":666}," createFsDrain",[642,2294,670],{"class":662},[642,2296,673],{"class":655},[642,2298,676],{"class":662},[642,2300,2301],{"class":679},"evlog\u002Ffs",[642,2303,683],{"class":662},[642,2305,2306,2308,2310,2312,2314,2316,2318,2320,2322],{"class":644,"line":734},[642,2307,656],{"class":655},[642,2309,659],{"class":655},[642,2311,663],{"class":662},[642,2313,667],{"class":666},[642,2315,670],{"class":662},[642,2317,673],{"class":655},[642,2319,676],{"class":662},[642,2321,680],{"class":679},[642,2323,683],{"class":662},[642,2325,2326],{"class":644,"line":765},[642,2327,731],{"emptyLinePlaceholder":730},[642,2329,2330,2332,2334,2336,2338,2340,2342,2344,2346],{"class":644,"line":793},[642,2331,990],{"class":758},[642,2333,993],{"class":666},[642,2335,996],{"class":662},[642,2337,693],{"class":743},[642,2339,779],{"class":662},[642,2341,783],{"class":782},[642,2343,786],{"class":662},[642,2345,747],{"class":666},[642,2347,1065],{"class":662},[642,2349,2350,2352,2354,2356,2359,2361,2363,2365,2368,2370,2372],{"class":644,"line":813},[642,2351,1615],{"class":789},[642,2353,1073],{"class":662},[642,2355,663],{"class":662},[642,2357,2358],{"class":789}," size",[642,2360,1073],{"class":662},[642,2362,1630],{"class":1629},[642,2364,845],{"class":662},[642,2366,2367],{"class":789}," intervalMs",[642,2369,1073],{"class":662},[642,2371,1645],{"class":1629},[642,2373,2374],{"class":662}," },\n",[642,2376,2377,2379,2381,2383,2386,2388,2390],{"class":644,"line":818},[642,2378,1660],{"class":789},[642,2380,1073],{"class":662},[642,2382,663],{"class":662},[642,2384,2385],{"class":789}," maxAttempts",[642,2387,1073],{"class":662},[642,2389,1674],{"class":1629},[642,2391,2374],{"class":662},[642,2393,2394,2396,2398,2400],{"class":644,"line":853},[642,2395,1726],{"class":789},[642,2397,1073],{"class":662},[642,2399,1702],{"class":1629},[642,2401,1083],{"class":662},[642,2403,2404,2406],{"class":644,"line":890},[642,2405,893],{"class":662},[642,2407,850],{"class":666},[642,2409,2410],{"class":644,"line":1093},[642,2411,731],{"emptyLinePlaceholder":730},[642,2413,2414,2416,2419,2421,2423],{"class":644,"line":1100},[642,2415,990],{"class":758},[642,2417,2418],{"class":666}," axiom ",[642,2420,996],{"class":662},[642,2422,713],{"class":743},[642,2424,790],{"class":666},[642,2426,2427,2429,2432,2434,2436],{"class":644,"line":1105},[642,2428,990],{"class":758},[642,2430,2431],{"class":666}," datadog ",[642,2433,996],{"class":662},[642,2435,2252],{"class":743},[642,2437,790],{"class":666},[642,2439,2440,2442,2445,2447,2449,2451,2453,2456,2458,2460,2462,2464,2466],{"class":644,"line":1723},[642,2441,990],{"class":758},[642,2443,2444],{"class":666}," sentry ",[642,2446,996],{"class":662},[642,2448,2272],{"class":743},[642,2450,747],{"class":666},[642,2452,1249],{"class":662},[642,2454,2455],{"class":789}," minLevel",[642,2457,1073],{"class":662},[642,2459,676],{"class":662},[642,2461,1768],{"class":679},[642,2463,837],{"class":662},[642,2465,670],{"class":662},[642,2467,850],{"class":666},[642,2469,2470,2472,2475,2477,2479,2481,2483,2486,2488,2490,2493,2495,2497,2500,2502,2505,2507],{"class":644,"line":1735},[642,2471,990],{"class":758},[642,2473,2474],{"class":666}," fs ",[642,2476,996],{"class":662},[642,2478,2292],{"class":743},[642,2480,747],{"class":666},[642,2482,1249],{"class":662},[642,2484,2485],{"class":789}," dir",[642,2487,1073],{"class":662},[642,2489,676],{"class":662},[642,2491,2492],{"class":679},".evlog\u002Flogs",[642,2494,837],{"class":662},[642,2496,845],{"class":662},[642,2498,2499],{"class":789}," maxFiles",[642,2501,1073],{"class":662},[642,2503,2504],{"class":1629}," 14",[642,2506,670],{"class":662},[642,2508,850],{"class":666},[642,2510,2511],{"class":644,"line":1760},[642,2512,731],{"emptyLinePlaceholder":730},[642,2514,2515,2517,2519,2521,2523,2525,2527,2530,2532,2534,2536,2538],{"class":644,"line":1808},[642,2516,737],{"class":655},[642,2518,1034],{"class":758},[642,2520,1013],{"class":666},[642,2522,996],{"class":662},[642,2524,771],{"class":743},[642,2526,747],{"class":666},[642,2528,2529],{"class":758},"async",[642,2531,1743],{"class":662},[642,2533,562],{"class":752},[642,2535,604],{"class":662},[642,2537,759],{"class":758},[642,2539,762],{"class":662},[642,2541,2542,2545,2548,2550,2552],{"class":644,"line":1813},[642,2543,2544],{"class":655},"  await",[642,2546,2547],{"class":782}," Promise",[642,2549,824],{"class":662},[642,2551,2149],{"class":743},[642,2553,2554],{"class":789},"([\n",[642,2556,2557,2560,2562,2564,2566],{"class":644,"line":1820},[642,2558,2559],{"class":743},"    axiom",[642,2561,747],{"class":789},[642,2563,562],{"class":666},[642,2565,604],{"class":789},[642,2567,1083],{"class":662},[642,2569,2570,2573,2575,2577,2579],{"class":644,"line":1825},[642,2571,2572],{"class":743},"    datadog",[642,2574,747],{"class":789},[642,2576,562],{"class":666},[642,2578,604],{"class":789},[642,2580,1083],{"class":662},[642,2582,2584,2587,2589,2591,2593],{"class":644,"line":2583},23,[642,2585,2586],{"class":743},"    sentry",[642,2588,747],{"class":789},[642,2590,562],{"class":666},[642,2592,604],{"class":789},[642,2594,1083],{"class":662},[642,2596,2598,2601,2603,2605,2607],{"class":644,"line":2597},24,[642,2599,2600],{"class":743},"    fs",[642,2602,747],{"class":789},[642,2604,562],{"class":666},[642,2606,604],{"class":789},[642,2608,1083],{"class":662},[642,2610,2612],{"class":644,"line":2611},25,[642,2613,2614],{"class":789},"  ])\n",[642,2616,2618,2620],{"class":644,"line":2617},26,[642,2619,893],{"class":662},[642,2621,850],{"class":666},[1843,2623,2625],{"id":2624},"what-you-get","What you get",[537,2627,2628,2637,2643],{},[540,2629,2630,2634,2635],{},[2631,2632,2633],"strong",{},"Parallel dispatch"," — every destination receives the batch concurrently via ",[544,2636,2125],{},[540,2638,2639,2642],{},[2631,2640,2641],{},"Tolerant fanout"," — if Datadog's API throws, Axiom \u002F Sentry \u002F fs still complete; the pipeline only retries the whole batch when the wrapping function rejects",[540,2644,2645,2648],{},[2631,2646,2647],{},"Shared backpressure"," — the buffer is sized once for the whole pipeline; if the wrapping drain falls behind, the oldest events are dropped consistently for every destination",[1843,2650,2652],{"id":2651},"per-drain-filtering","Per-drain filtering",[454,2654,2655],{},"Wrap a destination drain so it only sees events you care about:",[632,2657,2659],{"className":2203,"code":2658,"language":2205,"meta":638,"style":638},"import type { DrainContext } from 'evlog'\n\nconst sentry = createSentryDrain({ dsn: process.env.SENTRY_DSN! })\n\nasync function sentryErrorsOnly(batch: DrainContext[]): Promise\u003Cvoid> {\n  const errors = batch.filter(c => c.event?.level === 'error')\n  if (errors.length > 0) await sentry(errors)\n}\n\nexport const drain = pipeline(async (batch) => {\n  await Promise.allSettled([\n    axiom(batch),\n    sentryErrorsOnly(batch),\n  ])\n})\n",[544,2660,2661,2681,2685,2724,2728,2763,2810,2844,2849,2853,2879,2891,2903,2916,2920],{"__ignoreMap":638},[642,2662,2663,2665,2667,2669,2671,2673,2675,2677,2679],{"class":644,"line":645},[642,2664,656],{"class":655},[642,2666,659],{"class":655},[642,2668,663],{"class":662},[642,2670,667],{"class":666},[642,2672,670],{"class":662},[642,2674,673],{"class":655},[642,2676,676],{"class":662},[642,2678,680],{"class":679},[642,2680,683],{"class":662},[642,2682,2683],{"class":644,"line":652},[642,2684,731],{"emptyLinePlaceholder":730},[642,2686,2687,2689,2691,2693,2695,2697,2699,2702,2704,2707,2709,2712,2714,2717,2720,2722],{"class":644,"line":686},[642,2688,990],{"class":758},[642,2690,2444],{"class":666},[642,2692,996],{"class":662},[642,2694,2272],{"class":743},[642,2696,747],{"class":666},[642,2698,1249],{"class":662},[642,2700,2701],{"class":789}," dsn",[642,2703,1073],{"class":662},[642,2705,2706],{"class":666}," process",[642,2708,824],{"class":662},[642,2710,2711],{"class":666},"env",[642,2713,824],{"class":662},[642,2715,2716],{"class":666},"SENTRY_DSN",[642,2718,2719],{"class":662},"!",[642,2721,670],{"class":662},[642,2723,850],{"class":666},[642,2725,2726],{"class":644,"line":706},[642,2727,731],{"emptyLinePlaceholder":730},[642,2729,2730,2732,2735,2738,2740,2742,2744,2746,2749,2752,2754,2756,2759,2761],{"class":644,"line":727},[642,2731,2529],{"class":758},[642,2733,2734],{"class":758}," function",[642,2736,2737],{"class":743}," sentryErrorsOnly",[642,2739,747],{"class":662},[642,2741,562],{"class":752},[642,2743,1073],{"class":662},[642,2745,667],{"class":782},[642,2747,2748],{"class":666},"[]",[642,2750,2751],{"class":662},"):",[642,2753,2547],{"class":782},[642,2755,779],{"class":662},[642,2757,2758],{"class":782},"void",[642,2760,786],{"class":662},[642,2762,762],{"class":662},[642,2764,2765,2767,2770,2772,2775,2777,2779,2781,2784,2786,2789,2791,2794,2796,2799,2802,2804,2806,2808],{"class":644,"line":734},[642,2766,768],{"class":758},[642,2768,2769],{"class":666}," errors",[642,2771,774],{"class":662},[642,2773,2774],{"class":666}," batch",[642,2776,824],{"class":662},[642,2778,2184],{"class":743},[642,2780,747],{"class":789},[642,2782,2783],{"class":752},"c",[642,2785,759],{"class":758},[642,2787,2788],{"class":666}," c",[642,2790,824],{"class":662},[642,2792,2793],{"class":666},"event",[642,2795,1800],{"class":662},[642,2797,2798],{"class":666},"level",[642,2800,2801],{"class":662}," ===",[642,2803,676],{"class":662},[642,2805,1768],{"class":679},[642,2807,837],{"class":662},[642,2809,850],{"class":789},[642,2811,2812,2815,2817,2820,2822,2824,2827,2830,2833,2835,2838,2840,2842],{"class":644,"line":765},[642,2813,2814],{"class":655},"  if",[642,2816,1743],{"class":789},[642,2818,2819],{"class":666},"errors",[642,2821,824],{"class":662},[642,2823,1786],{"class":666},[642,2825,2826],{"class":662}," >",[642,2828,2829],{"class":1629}," 0",[642,2831,2832],{"class":789},") ",[642,2834,1463],{"class":655},[642,2836,2837],{"class":743}," sentry",[642,2839,747],{"class":789},[642,2841,2819],{"class":666},[642,2843,850],{"class":789},[642,2845,2846],{"class":644,"line":793},[642,2847,2848],{"class":662},"}\n",[642,2850,2851],{"class":644,"line":813},[642,2852,731],{"emptyLinePlaceholder":730},[642,2854,2855,2857,2859,2861,2863,2865,2867,2869,2871,2873,2875,2877],{"class":644,"line":818},[642,2856,737],{"class":655},[642,2858,1034],{"class":758},[642,2860,1013],{"class":666},[642,2862,996],{"class":662},[642,2864,771],{"class":743},[642,2866,747],{"class":666},[642,2868,2529],{"class":758},[642,2870,1743],{"class":662},[642,2872,562],{"class":752},[642,2874,604],{"class":662},[642,2876,759],{"class":758},[642,2878,762],{"class":662},[642,2880,2881,2883,2885,2887,2889],{"class":644,"line":853},[642,2882,2544],{"class":655},[642,2884,2547],{"class":782},[642,2886,824],{"class":662},[642,2888,2149],{"class":743},[642,2890,2554],{"class":789},[642,2892,2893,2895,2897,2899,2901],{"class":644,"line":890},[642,2894,2559],{"class":743},[642,2896,747],{"class":789},[642,2898,562],{"class":666},[642,2900,604],{"class":789},[642,2902,1083],{"class":662},[642,2904,2905,2908,2910,2912,2914],{"class":644,"line":1093},[642,2906,2907],{"class":743},"    sentryErrorsOnly",[642,2909,747],{"class":789},[642,2911,562],{"class":666},[642,2913,604],{"class":789},[642,2915,1083],{"class":662},[642,2917,2918],{"class":644,"line":1100},[642,2919,2614],{"class":789},[642,2921,2922,2924],{"class":644,"line":1105},[642,2923,893],{"class":662},[642,2925,850],{"class":666},[454,2927,2928,2929,2931],{},"Most built-in drains expose ",[544,2930,2180],{}," directly, so you only need this pattern for non-level filters (path, custom field, etc.).",[622,2933,2935],{"id":2934},"custom-drain-function","Custom drain function",[454,2937,2938],{},"You don't need an adapter. Pass any async function that accepts a batch:",[632,2940,2943],{"className":634,"code":2941,"filename":2942,"language":637,"meta":638,"style":638},"import type { DrainContext } from 'evlog'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({ batch: { size: 100 } })\n\nexport const drain = pipeline(async (batch) => {\n  await fetch('https:\u002F\u002Fyour-service.com\u002Flogs', {\n    method: 'POST',\n    headers: { 'Content-Type': 'application\u002Fjson' },\n    body: JSON.stringify(batch.map(ctx => ctx.event)),\n  })\n})\n","pipeline-custom.ts",[544,2944,2945,2965,2983,2987,3026,3030,3056,3076,3092,3119,3162,3169],{"__ignoreMap":638},[642,2946,2947,2949,2951,2953,2955,2957,2959,2961,2963],{"class":644,"line":645},[642,2948,656],{"class":655},[642,2950,659],{"class":655},[642,2952,663],{"class":662},[642,2954,667],{"class":666},[642,2956,670],{"class":662},[642,2958,673],{"class":655},[642,2960,676],{"class":662},[642,2962,680],{"class":679},[642,2964,683],{"class":662},[642,2966,2967,2969,2971,2973,2975,2977,2979,2981],{"class":644,"line":652},[642,2968,656],{"class":655},[642,2970,663],{"class":662},[642,2972,693],{"class":666},[642,2974,670],{"class":662},[642,2976,673],{"class":655},[642,2978,676],{"class":662},[642,2980,550],{"class":679},[642,2982,683],{"class":662},[642,2984,2985],{"class":644,"line":686},[642,2986,731],{"emptyLinePlaceholder":730},[642,2988,2989,2991,2993,2995,2997,2999,3001,3003,3005,3007,3009,3011,3013,3015,3017,3020,3022,3024],{"class":644,"line":706},[642,2990,990],{"class":758},[642,2992,993],{"class":666},[642,2994,996],{"class":662},[642,2996,693],{"class":743},[642,2998,779],{"class":662},[642,3000,783],{"class":782},[642,3002,786],{"class":662},[642,3004,747],{"class":666},[642,3006,1249],{"class":662},[642,3008,2774],{"class":789},[642,3010,1073],{"class":662},[642,3012,663],{"class":662},[642,3014,2358],{"class":789},[642,3016,1073],{"class":662},[642,3018,3019],{"class":1629}," 100",[642,3021,670],{"class":662},[642,3023,670],{"class":662},[642,3025,850],{"class":666},[642,3027,3028],{"class":644,"line":727},[642,3029,731],{"emptyLinePlaceholder":730},[642,3031,3032,3034,3036,3038,3040,3042,3044,3046,3048,3050,3052,3054],{"class":644,"line":734},[642,3033,737],{"class":655},[642,3035,1034],{"class":758},[642,3037,1013],{"class":666},[642,3039,996],{"class":662},[642,3041,771],{"class":743},[642,3043,747],{"class":666},[642,3045,2529],{"class":758},[642,3047,1743],{"class":662},[642,3049,562],{"class":752},[642,3051,604],{"class":662},[642,3053,759],{"class":758},[642,3055,762],{"class":662},[642,3057,3058,3060,3063,3065,3067,3070,3072,3074],{"class":644,"line":765},[642,3059,2544],{"class":655},[642,3061,3062],{"class":743}," fetch",[642,3064,747],{"class":789},[642,3066,837],{"class":662},[642,3068,3069],{"class":679},"https:\u002F\u002Fyour-service.com\u002Flogs",[642,3071,837],{"class":662},[642,3073,845],{"class":662},[642,3075,762],{"class":662},[642,3077,3078,3081,3083,3085,3088,3090],{"class":644,"line":793},[642,3079,3080],{"class":789},"    method",[642,3082,1073],{"class":662},[642,3084,676],{"class":662},[642,3086,3087],{"class":679},"POST",[642,3089,837],{"class":662},[642,3091,1083],{"class":662},[642,3093,3094,3097,3099,3101,3103,3106,3108,3110,3112,3115,3117],{"class":644,"line":813},[642,3095,3096],{"class":789},"    headers",[642,3098,1073],{"class":662},[642,3100,663],{"class":662},[642,3102,676],{"class":662},[642,3104,3105],{"class":789},"Content-Type",[642,3107,837],{"class":662},[642,3109,1073],{"class":662},[642,3111,676],{"class":662},[642,3113,3114],{"class":679},"application\u002Fjson",[642,3116,837],{"class":662},[642,3118,2374],{"class":662},[642,3120,3121,3124,3126,3129,3131,3134,3136,3138,3140,3143,3145,3148,3150,3153,3155,3157,3160],{"class":644,"line":818},[642,3122,3123],{"class":789},"    body",[642,3125,1073],{"class":662},[642,3127,3128],{"class":666}," JSON",[642,3130,824],{"class":662},[642,3132,3133],{"class":743},"stringify",[642,3135,747],{"class":789},[642,3137,562],{"class":666},[642,3139,824],{"class":662},[642,3141,3142],{"class":743},"map",[642,3144,747],{"class":789},[642,3146,3147],{"class":752},"ctx",[642,3149,759],{"class":758},[642,3151,3152],{"class":666}," ctx",[642,3154,824],{"class":662},[642,3156,2793],{"class":666},[642,3158,3159],{"class":789},"))",[642,3161,1083],{"class":662},[642,3163,3164,3167],{"class":644,"line":853},[642,3165,3166],{"class":662},"  }",[642,3168,850],{"class":789},[642,3170,3171,3173],{"class":644,"line":890},[642,3172,893],{"class":662},[642,3174,850],{"class":666},[454,3176,3177,3178,3183],{},"For anything more involved (config resolution, retries, identity headers), use ",[458,3179,3180],{"href":408},[544,3181,3182],{},"defineHttpDrain"," instead and let the toolkit handle the boilerplate.",[622,3185,517],{"id":3186},"http-drain-browser-to-server",[454,3188,3189,3190,3193,3194,3197,3198,3201],{},"The HTTP drain is a framework-agnostic transport for shipping client-side logs to your server. It composes on top of the same pipeline primitives, with browser-specific defaults (",[544,3191,3192],{},"fetch keepalive"," + ",[544,3195,3196],{},"sendBeacon"," on ",[544,3199,3200],{},"visibilitychange",").",[1477,3203,3205,3206,3209,3210,3213,3214,3217,3218,3221,3222,3224],{"color":3204,"icon":13},"neutral","The ",[544,3207,3208],{},"evlog\u002Fbrowser"," import path is ",[2631,3211,3212],{},"deprecated"," and re-exports the same API as ",[544,3215,3216],{},"evlog\u002Fhttp",". It will be removed in the next ",[2631,3219,3220],{},"major"," release. Prefer ",[544,3223,3216],{}," for new code.",[529,3226,3229,3232,3281],{":actions":531,"description":3227,"icon":3228},"Set up the HTTP transport for client logs","i-lucide-globe",[454,3230,3231],{},"Set up the HTTP transport so my browser logs are sent to my server.",[537,3233,3234,3237,3248,3258,3265,3274],{},[540,3235,3236],{},"Install evlog: pnpm add evlog",[540,3238,542,3239,547,3242,3244,3245,3247],{},[544,3240,3241],{},"createHttpLogDrain",[544,3243,3216],{}," (NOT ",[544,3246,3208],{}," — that's deprecated)",[540,3249,3250,3251,3254,3255,604],{},"Create a drain with ",[544,3252,3253],{},"{ endpoint: 'https:\u002F\u002Flogs.example.com\u002Fv1\u002Fingest' }"," and an optional pipeline (",[544,3256,3257],{},"{ batch: { size, intervalMs } }",[540,3259,3260,3261,3264],{},"Pass the drain to ",[544,3262,3263],{},"initLogger({ drain })"," on the client side",[540,3266,3267,3268,3193,3270,3197,3272],{},"The drain batches events and uses ",[544,3269,3192],{},[544,3271,3196],{},[544,3273,3200],{},[540,3275,3276,3277,3280],{},"On the server, accept POST requests with a ",[544,3278,3279],{},"DrainContext[]"," body and forward them to my drain pipeline",[454,3282,610,3283],{},[458,3284,613],{"href":613,"rel":3285},[615],[1843,3287,496],{"id":3288},"quick-start-1",[632,3290,3293],{"className":634,"code":3291,"filename":3292,"language":637,"meta":638,"style":638},"import { initLogger, log } from 'evlog'\nimport { createHttpLogDrain } from 'evlog\u002Fhttp'\n\nconst drain = createHttpLogDrain({\n  drain: { endpoint: 'https:\u002F\u002Flogs.example.com\u002Fv1\u002Fingest' },\n})\ninitLogger({ drain })\n\nlog.info({ action: 'page_view', path: location.pathname })\n","app.ts",[544,3294,3295,3317,3336,3340,3354,3376,3382,3396,3400],{"__ignoreMap":638},[642,3296,3297,3299,3301,3303,3305,3307,3309,3311,3313,3315],{"class":644,"line":645},[642,3298,656],{"class":655},[642,3300,663],{"class":662},[642,3302,1351],{"class":666},[642,3304,845],{"class":662},[642,3306,1049],{"class":666},[642,3308,670],{"class":662},[642,3310,673],{"class":655},[642,3312,676],{"class":662},[642,3314,680],{"class":679},[642,3316,683],{"class":662},[642,3318,3319,3321,3323,3326,3328,3330,3332,3334],{"class":644,"line":652},[642,3320,656],{"class":655},[642,3322,663],{"class":662},[642,3324,3325],{"class":666}," createHttpLogDrain",[642,3327,670],{"class":662},[642,3329,673],{"class":655},[642,3331,676],{"class":662},[642,3333,3216],{"class":679},[642,3335,683],{"class":662},[642,3337,3338],{"class":644,"line":686},[642,3339,731],{"emptyLinePlaceholder":730},[642,3341,3342,3344,3346,3348,3350,3352],{"class":644,"line":706},[642,3343,990],{"class":758},[642,3345,1013],{"class":666},[642,3347,996],{"class":662},[642,3349,3325],{"class":743},[642,3351,747],{"class":666},[642,3353,1065],{"class":662},[642,3355,3356,3358,3360,3362,3365,3367,3369,3372,3374],{"class":644,"line":727},[642,3357,1088],{"class":789},[642,3359,1073],{"class":662},[642,3361,663],{"class":662},[642,3363,3364],{"class":789}," endpoint",[642,3366,1073],{"class":662},[642,3368,676],{"class":662},[642,3370,3371],{"class":679},"https:\u002F\u002Flogs.example.com\u002Fv1\u002Fingest",[642,3373,837],{"class":662},[642,3375,2374],{"class":662},[642,3377,3378,3380],{"class":644,"line":734},[642,3379,893],{"class":662},[642,3381,850],{"class":666},[642,3383,3384,3386,3388,3390,3392,3394],{"class":644,"line":765},[642,3385,1444],{"class":743},[642,3387,747],{"class":666},[642,3389,1249],{"class":662},[642,3391,1013],{"class":666},[642,3393,893],{"class":662},[642,3395,850],{"class":666},[642,3397,3398],{"class":644,"line":793},[642,3399,731],{"emptyLinePlaceholder":730},[642,3401,3402,3405,3407,3410,3412,3414,3417,3419,3421,3424,3426,3428,3431,3433,3436,3438,3441,3443],{"class":644,"line":813},[642,3403,3404],{"class":666},"log",[642,3406,824],{"class":662},[642,3408,3409],{"class":743},"info",[642,3411,747],{"class":666},[642,3413,1249],{"class":662},[642,3415,3416],{"class":789}," action",[642,3418,1073],{"class":662},[642,3420,676],{"class":662},[642,3422,3423],{"class":679},"page_view",[642,3425,837],{"class":662},[642,3427,845],{"class":662},[642,3429,3430],{"class":789}," path",[642,3432,1073],{"class":662},[642,3434,3435],{"class":666}," location",[642,3437,824],{"class":662},[642,3439,3440],{"class":666},"pathname ",[642,3442,893],{"class":662},[642,3444,850],{"class":666},[1843,3446,3448],{"id":3447},"how-it-works-browser-specifics","How it works (browser specifics)",[3450,3451,3452,3464,3467,3478,3485],"ol",{},[540,3453,3454,2181,3457,2181,3460,3463],{},[544,3455,3456],{},"log.info()",[544,3458,3459],{},"log.warn()",[544,3461,3462],{},"log.error()"," push events into a memory buffer",[540,3465,3466],{},"Events are batched by size (default 25) or time interval (default 2 s)",[540,3468,3469,3470,3473,3474,3477],{},"Batches are sent via ",[544,3471,3472],{},"fetch"," with ",[544,3475,3476],{},"keepalive: true"," so requests survive page navigation",[540,3479,3480,3481,3484],{},"When the page becomes hidden (tab switch, navigation), buffered events are flushed via ",[544,3482,3483],{},"navigator.sendBeacon"," as a fallback",[540,3486,3487,3488,3490],{},"Your server endpoint receives a ",[544,3489,3279],{}," JSON array and processes it however you like",[1843,3492,3494],{"id":3493},"two-tier-api","Two-tier API",[3496,3497,3499],"h4",{"id":3498},"createhttplogdrainoptions",[544,3500,3501],{},"createHttpLogDrain(options)",[454,3503,3504,3505,3507,3508,3511,3512,824],{},"High-level, pre-composed: creates a pipeline with batching, retry, and auto-flush on ",[544,3506,3200],{},". Returns a ",[544,3509,3510],{},"PipelineDrainFn\u003CDrainContext>"," directly usable with ",[544,3513,3263],{},[632,3515,3517],{"className":634,"code":3516,"filename":3292,"language":637,"meta":638,"style":638},"import { initLogger, log } from 'evlog'\nimport { createHttpLogDrain } from 'evlog\u002Fhttp'\n\nconst drain = createHttpLogDrain({\n  drain: { endpoint: 'https:\u002F\u002Flogs.example.com\u002Fv1\u002Fingest' },\n  pipeline: { batch: { size: 50, intervalMs: 5000 } },\n})\n\ninitLogger({ drain })\nlog.info({ action: 'click', target: 'buy-button' })\n",[544,3518,3519,3541,3559,3563,3577,3597,3630,3636,3640,3654],{"__ignoreMap":638},[642,3520,3521,3523,3525,3527,3529,3531,3533,3535,3537,3539],{"class":644,"line":645},[642,3522,656],{"class":655},[642,3524,663],{"class":662},[642,3526,1351],{"class":666},[642,3528,845],{"class":662},[642,3530,1049],{"class":666},[642,3532,670],{"class":662},[642,3534,673],{"class":655},[642,3536,676],{"class":662},[642,3538,680],{"class":679},[642,3540,683],{"class":662},[642,3542,3543,3545,3547,3549,3551,3553,3555,3557],{"class":644,"line":652},[642,3544,656],{"class":655},[642,3546,663],{"class":662},[642,3548,3325],{"class":666},[642,3550,670],{"class":662},[642,3552,673],{"class":655},[642,3554,676],{"class":662},[642,3556,3216],{"class":679},[642,3558,683],{"class":662},[642,3560,3561],{"class":644,"line":686},[642,3562,731],{"emptyLinePlaceholder":730},[642,3564,3565,3567,3569,3571,3573,3575],{"class":644,"line":706},[642,3566,990],{"class":758},[642,3568,1013],{"class":666},[642,3570,996],{"class":662},[642,3572,3325],{"class":743},[642,3574,747],{"class":666},[642,3576,1065],{"class":662},[642,3578,3579,3581,3583,3585,3587,3589,3591,3593,3595],{"class":644,"line":727},[642,3580,1088],{"class":789},[642,3582,1073],{"class":662},[642,3584,663],{"class":662},[642,3586,3364],{"class":789},[642,3588,1073],{"class":662},[642,3590,676],{"class":662},[642,3592,3371],{"class":679},[642,3594,837],{"class":662},[642,3596,2374],{"class":662},[642,3598,3599,3602,3604,3606,3608,3610,3612,3614,3616,3618,3620,3622,3624,3626,3628],{"class":644,"line":734},[642,3600,3601],{"class":789},"  pipeline",[642,3603,1073],{"class":662},[642,3605,663],{"class":662},[642,3607,2774],{"class":789},[642,3609,1073],{"class":662},[642,3611,663],{"class":662},[642,3613,2358],{"class":789},[642,3615,1073],{"class":662},[642,3617,1630],{"class":1629},[642,3619,845],{"class":662},[642,3621,2367],{"class":789},[642,3623,1073],{"class":662},[642,3625,1645],{"class":1629},[642,3627,670],{"class":662},[642,3629,2374],{"class":662},[642,3631,3632,3634],{"class":644,"line":765},[642,3633,893],{"class":662},[642,3635,850],{"class":666},[642,3637,3638],{"class":644,"line":793},[642,3639,731],{"emptyLinePlaceholder":730},[642,3641,3642,3644,3646,3648,3650,3652],{"class":644,"line":813},[642,3643,1444],{"class":743},[642,3645,747],{"class":666},[642,3647,1249],{"class":662},[642,3649,1013],{"class":666},[642,3651,893],{"class":662},[642,3653,850],{"class":666},[642,3655,3656,3658,3660,3662,3664,3666,3668,3670,3672,3675,3677,3679,3682,3684,3686,3689,3691,3693],{"class":644,"line":818},[642,3657,3404],{"class":666},[642,3659,824],{"class":662},[642,3661,3409],{"class":743},[642,3663,747],{"class":666},[642,3665,1249],{"class":662},[642,3667,3416],{"class":789},[642,3669,1073],{"class":662},[642,3671,676],{"class":662},[642,3673,3674],{"class":679},"click",[642,3676,837],{"class":662},[642,3678,845],{"class":662},[642,3680,3681],{"class":789}," target",[642,3683,1073],{"class":662},[642,3685,676],{"class":662},[642,3687,3688],{"class":679},"buy-button",[642,3690,837],{"class":662},[642,3692,670],{"class":662},[642,3694,850],{"class":666},[3496,3696,3698],{"id":3697},"createhttpdrainconfig",[544,3699,3700],{},"createHttpDrain(config)",[454,3702,3703],{},"Low-level transport function. Use this when you want full control over the pipeline configuration:",[632,3705,3707],{"className":634,"code":3706,"filename":3292,"language":637,"meta":638,"style":638},"import { createHttpDrain } from 'evlog\u002Fhttp'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\nimport type { DrainContext } from 'evlog'\n\nconst transport = createHttpDrain({\n  endpoint: 'https:\u002F\u002Flogs.example.com\u002Fv1\u002Fingest',\n})\nconst pipeline = createDrainPipeline\u003CDrainContext>({\n  batch: { size: 100, intervalMs: 10000 },\n  retry: { maxAttempts: 5 },\n})\n\nconst drain = pipeline(transport)\n",[544,3708,3709,3728,3746,3766,3770,3785,3800,3806,3826,3851,3868,3874,3878],{"__ignoreMap":638},[642,3710,3711,3713,3715,3718,3720,3722,3724,3726],{"class":644,"line":645},[642,3712,656],{"class":655},[642,3714,663],{"class":662},[642,3716,3717],{"class":666}," createHttpDrain",[642,3719,670],{"class":662},[642,3721,673],{"class":655},[642,3723,676],{"class":662},[642,3725,3216],{"class":679},[642,3727,683],{"class":662},[642,3729,3730,3732,3734,3736,3738,3740,3742,3744],{"class":644,"line":652},[642,3731,656],{"class":655},[642,3733,663],{"class":662},[642,3735,693],{"class":666},[642,3737,670],{"class":662},[642,3739,673],{"class":655},[642,3741,676],{"class":662},[642,3743,550],{"class":679},[642,3745,683],{"class":662},[642,3747,3748,3750,3752,3754,3756,3758,3760,3762,3764],{"class":644,"line":686},[642,3749,656],{"class":655},[642,3751,659],{"class":655},[642,3753,663],{"class":662},[642,3755,667],{"class":666},[642,3757,670],{"class":662},[642,3759,673],{"class":655},[642,3761,676],{"class":662},[642,3763,680],{"class":679},[642,3765,683],{"class":662},[642,3767,3768],{"class":644,"line":706},[642,3769,731],{"emptyLinePlaceholder":730},[642,3771,3772,3774,3777,3779,3781,3783],{"class":644,"line":727},[642,3773,990],{"class":758},[642,3775,3776],{"class":666}," transport ",[642,3778,996],{"class":662},[642,3780,3717],{"class":743},[642,3782,747],{"class":666},[642,3784,1065],{"class":662},[642,3786,3787,3790,3792,3794,3796,3798],{"class":644,"line":734},[642,3788,3789],{"class":789},"  endpoint",[642,3791,1073],{"class":662},[642,3793,676],{"class":662},[642,3795,3371],{"class":679},[642,3797,837],{"class":662},[642,3799,1083],{"class":662},[642,3801,3802,3804],{"class":644,"line":765},[642,3803,893],{"class":662},[642,3805,850],{"class":666},[642,3807,3808,3810,3812,3814,3816,3818,3820,3822,3824],{"class":644,"line":793},[642,3809,990],{"class":758},[642,3811,993],{"class":666},[642,3813,996],{"class":662},[642,3815,693],{"class":743},[642,3817,779],{"class":662},[642,3819,783],{"class":782},[642,3821,786],{"class":662},[642,3823,747],{"class":666},[642,3825,1065],{"class":662},[642,3827,3828,3830,3832,3834,3836,3838,3840,3842,3844,3846,3849],{"class":644,"line":813},[642,3829,1615],{"class":789},[642,3831,1073],{"class":662},[642,3833,663],{"class":662},[642,3835,2358],{"class":789},[642,3837,1073],{"class":662},[642,3839,3019],{"class":1629},[642,3841,845],{"class":662},[642,3843,2367],{"class":789},[642,3845,1073],{"class":662},[642,3847,3848],{"class":1629}," 10000",[642,3850,2374],{"class":662},[642,3852,3853,3855,3857,3859,3861,3863,3866],{"class":644,"line":818},[642,3854,1660],{"class":789},[642,3856,1073],{"class":662},[642,3858,663],{"class":662},[642,3860,2385],{"class":789},[642,3862,1073],{"class":662},[642,3864,3865],{"class":1629}," 5",[642,3867,2374],{"class":662},[642,3869,3870,3872],{"class":644,"line":853},[642,3871,893],{"class":662},[642,3873,850],{"class":666},[642,3875,3876],{"class":644,"line":890},[642,3877,731],{"emptyLinePlaceholder":730},[642,3879,3880,3882,3884,3886,3888],{"class":644,"line":1093},[642,3881,990],{"class":758},[642,3883,1013],{"class":666},[642,3885,996],{"class":662},[642,3887,771],{"class":743},[642,3889,3890],{"class":666},"(transport)\n",[1843,3892,3894],{"id":3893},"configuration-reference","Configuration reference",[3496,3896,3898],{"id":3897},"httpdrainconfig",[544,3899,3900],{},"HttpDrainConfig",[467,3902,3903,3913],{},[470,3904,3905],{},[473,3906,3907,3909,3911],{},[476,3908,1855],{},[476,3910,1858],{},[476,3912,1861],{},[483,3914,3915,3930,3951,3965,3983],{},[473,3916,3917,3922,3924],{},[488,3918,3919],{},[544,3920,3921],{},"endpoint",[488,3923,1980],{},[488,3925,3926,3929],{},[2631,3927,3928],{},"(required)"," Full URL of the server ingest endpoint",[473,3931,3932,3937,3939],{},[488,3933,3934],{},[544,3935,3936],{},"headers",[488,3938,1980],{},[488,3940,3941,3942,3944,3945,2166,3948,604],{},"Custom headers sent with each ",[544,3943,3472],{}," request (e.g. ",[544,3946,3947],{},"Authorization",[544,3949,3950],{},"X-API-Key",[473,3952,3953,3958,3962],{},[488,3954,3955],{},[544,3956,3957],{},"timeout",[488,3959,3960],{},[544,3961,1888],{},[488,3963,3964],{},"Request timeout in milliseconds",[473,3966,3967,3972,3977],{},[488,3968,3969],{},[544,3970,3971],{},"useBeacon",[488,3973,3974],{},[544,3975,3976],{},"true",[488,3978,3979,3980,3982],{},"Use ",[544,3981,3196],{}," when the page is hidden",[473,3984,3985,3990,3995],{},[488,3986,3987],{},[544,3988,3989],{},"credentials",[488,3991,3992],{},[544,3993,3994],{},"'same-origin'",[488,3996,3997,3998,2166,4001,2166,4003,4006,4007,4009],{},"Fetch credentials mode (",[544,3999,4000],{},"'omit'",[544,4002,3994],{},[544,4004,4005],{},"'include'","). Set to ",[544,4008,4005],{}," for cross-origin endpoints",[3496,4011,4013],{"id":4012},"httplogdrainoptions",[544,4014,4015],{},"HttpLogDrainOptions",[467,4017,4018,4028],{},[470,4019,4020],{},[473,4021,4022,4024,4026],{},[476,4023,1855],{},[476,4025,1858],{},[476,4027,1861],{},[483,4029,4030,4047,4062],{},[473,4031,4032,4037,4039],{},[488,4033,4034],{},[544,4035,4036],{},"drain",[488,4038,1980],{},[488,4040,4041,4043,4044,4046],{},[2631,4042,3928],{}," ",[544,4045,3900],{}," object",[473,4048,4049,4054,4059],{},[488,4050,4051],{},[544,4052,4053],{},"pipeline",[488,4055,4056],{},[544,4057,4058],{},"{ batch: { size: 25, intervalMs: 2000 }, retry: { maxAttempts: 2 } }",[488,4060,4061],{},"Pipeline configuration overrides",[473,4063,4064,4069,4073],{},[488,4065,4066],{},[544,4067,4068],{},"autoFlush",[488,4070,4071],{},[544,4072,3976],{},[488,4074,4075,4076,4078],{},"Auto-register ",[544,4077,3200],{}," flush listener",[1843,4080,4082],{"id":4081},"sendbeacon-fallback","sendBeacon fallback",[1477,4084,4086,4087,4089,4090,4092,4093,4095],{"color":3409,"icon":4085},"i-lucide-radio","When ",[544,4088,3971],{}," is enabled (the default) and the page becomes hidden, the drain automatically switches from ",[544,4091,3472],{}," to ",[544,4094,3483],{},". This ensures logs are delivered even when the user closes the tab or navigates away.",[454,4097,4098,4100],{},[544,4099,3196],{}," has a browser-imposed payload limit (~64 KB). If the payload exceeds this, the drain throws an error. Keep batch sizes reasonable (the default of 25 is well within limits).",[1843,4102,4104],{"id":4103},"authentication","Authentication",[454,4106,4107],{},"Pass custom headers to protect your ingest endpoint:",[632,4109,4111],{"className":634,"code":4110,"filename":3292,"language":637,"meta":638,"style":638},"const drain = createHttpLogDrain({\n  drain: {\n    endpoint: 'https:\u002F\u002Flogs.example.com\u002Fv1\u002Fingest',\n    headers: {\n      'Authorization': 'Bearer ' + token,\n    },\n  },\n})\n",[544,4112,4113,4127,4135,4150,4158,4184,4189,4193],{"__ignoreMap":638},[642,4114,4115,4117,4119,4121,4123,4125],{"class":644,"line":645},[642,4116,990],{"class":758},[642,4118,1013],{"class":666},[642,4120,996],{"class":662},[642,4122,3325],{"class":743},[642,4124,747],{"class":666},[642,4126,1065],{"class":662},[642,4128,4129,4131,4133],{"class":644,"line":652},[642,4130,1088],{"class":789},[642,4132,1073],{"class":662},[642,4134,762],{"class":662},[642,4136,4137,4140,4142,4144,4146,4148],{"class":644,"line":686},[642,4138,4139],{"class":789},"    endpoint",[642,4141,1073],{"class":662},[642,4143,676],{"class":662},[642,4145,3371],{"class":679},[642,4147,837],{"class":662},[642,4149,1083],{"class":662},[642,4151,4152,4154,4156],{"class":644,"line":706},[642,4153,3096],{"class":789},[642,4155,1073],{"class":662},[642,4157,762],{"class":662},[642,4159,4160,4163,4165,4167,4169,4171,4174,4176,4179,4182],{"class":644,"line":727},[642,4161,4162],{"class":662},"      '",[642,4164,3947],{"class":789},[642,4166,837],{"class":662},[642,4168,1073],{"class":662},[642,4170,676],{"class":662},[642,4172,4173],{"class":679},"Bearer ",[642,4175,837],{"class":662},[642,4177,4178],{"class":662}," +",[642,4180,4181],{"class":666}," token",[642,4183,1083],{"class":662},[642,4185,4186],{"class":644,"line":734},[642,4187,4188],{"class":662},"    },\n",[642,4190,4191],{"class":644,"line":765},[642,4192,1655],{"class":662},[642,4194,4195,4197],{"class":644,"line":793},[642,4196,893],{"class":662},[642,4198,850],{"class":666},[1477,4200,4201,4203,4204,4206,4207,4209,4210,4212,4213,4216,4217,3473,4219,824],{"color":1479,"icon":54},[544,4202,3936],{}," are applied to ",[544,4205,3472],{}," requests only. The ",[544,4208,3196],{}," API does not support custom headers, so when the page is hidden and ",[544,4211,3196],{}," is used, headers are not sent. If your endpoint requires authentication, validate via a session cookie (set ",[544,4214,4215],{},"credentials: 'include'"," for cross-origin endpoints) or disable ",[544,4218,3196],{},[544,4220,4221],{},"useBeacon: false",[1843,4223,4225],{"id":4224},"server-endpoint","Server endpoint",[454,4227,4228,4229,4231],{},"Your server needs a POST endpoint that accepts a ",[544,4230,3279],{}," JSON body. Examples for common frameworks:",[629,4233,4234,4376],{},[632,4235,4237],{"className":634,"code":4236,"filename":197,"language":637,"meta":638,"style":638},"app.post('\u002Fv1\u002Fingest', express.json(), (req, res) => {\n  for (const entry of req.body) {\n    console.log('[BROWSER]', JSON.stringify(entry))\n  }\n  res.sendStatus(204)\n})\n",[544,4238,4239,4288,4315,4348,4353,4370],{"__ignoreMap":638},[642,4240,4241,4243,4245,4248,4250,4252,4255,4257,4259,4262,4264,4267,4270,4272,4274,4277,4279,4282,4284,4286],{"class":644,"line":645},[642,4242,1235],{"class":666},[642,4244,824],{"class":662},[642,4246,4247],{"class":743},"post",[642,4249,747],{"class":666},[642,4251,837],{"class":662},[642,4253,4254],{"class":679},"\u002Fv1\u002Fingest",[642,4256,837],{"class":662},[642,4258,845],{"class":662},[642,4260,4261],{"class":666}," express",[642,4263,824],{"class":662},[642,4265,4266],{"class":743},"json",[642,4268,4269],{"class":666},"()",[642,4271,845],{"class":662},[642,4273,1743],{"class":662},[642,4275,4276],{"class":752},"req",[642,4278,845],{"class":662},[642,4280,4281],{"class":752}," res",[642,4283,604],{"class":662},[642,4285,759],{"class":758},[642,4287,762],{"class":662},[642,4289,4290,4293,4295,4297,4300,4303,4306,4308,4311,4313],{"class":644,"line":652},[642,4291,4292],{"class":655},"  for",[642,4294,1743],{"class":789},[642,4296,990],{"class":758},[642,4298,4299],{"class":666}," entry",[642,4301,4302],{"class":662}," of",[642,4304,4305],{"class":666}," req",[642,4307,824],{"class":662},[642,4309,4310],{"class":666},"body",[642,4312,2832],{"class":789},[642,4314,1065],{"class":662},[642,4316,4317,4319,4321,4323,4325,4327,4330,4332,4334,4336,4338,4340,4342,4345],{"class":644,"line":686},[642,4318,1763],{"class":666},[642,4320,824],{"class":662},[642,4322,3404],{"class":743},[642,4324,747],{"class":789},[642,4326,837],{"class":662},[642,4328,4329],{"class":679},"[BROWSER]",[642,4331,837],{"class":662},[642,4333,845],{"class":662},[642,4335,3128],{"class":666},[642,4337,824],{"class":662},[642,4339,3133],{"class":743},[642,4341,747],{"class":789},[642,4343,4344],{"class":666},"entry",[642,4346,4347],{"class":789},"))\n",[642,4349,4350],{"class":644,"line":706},[642,4351,4352],{"class":662},"  }\n",[642,4354,4355,4358,4360,4363,4365,4368],{"class":644,"line":727},[642,4356,4357],{"class":666},"  res",[642,4359,824],{"class":662},[642,4361,4362],{"class":743},"sendStatus",[642,4364,747],{"class":789},[642,4366,4367],{"class":1629},"204",[642,4369,850],{"class":789},[642,4371,4372,4374],{"class":644,"line":734},[642,4373,893],{"class":662},[642,4375,850],{"class":666},[632,4377,4379],{"className":634,"code":4378,"filename":202,"language":637,"meta":638,"style":638},"app.post('\u002Fv1\u002Fingest', async (c) => {\n  const body = await c.req.json()\n  for (const entry of body) {\n    console.log('[BROWSER]', JSON.stringify(entry))\n  }\n  return c.body(null, 204)\n})\n",[544,4380,4381,4412,4436,4454,4484,4488,4509],{"__ignoreMap":638},[642,4382,4383,4385,4387,4389,4391,4393,4395,4397,4399,4402,4404,4406,4408,4410],{"class":644,"line":645},[642,4384,1235],{"class":666},[642,4386,824],{"class":662},[642,4388,4247],{"class":743},[642,4390,747],{"class":666},[642,4392,837],{"class":662},[642,4394,4254],{"class":679},[642,4396,837],{"class":662},[642,4398,845],{"class":662},[642,4400,4401],{"class":758}," async",[642,4403,1743],{"class":662},[642,4405,2783],{"class":752},[642,4407,604],{"class":662},[642,4409,759],{"class":758},[642,4411,762],{"class":662},[642,4413,4414,4416,4419,4421,4424,4426,4428,4430,4432,4434],{"class":644,"line":652},[642,4415,768],{"class":758},[642,4417,4418],{"class":666}," body",[642,4420,774],{"class":662},[642,4422,4423],{"class":655}," await",[642,4425,2788],{"class":666},[642,4427,824],{"class":662},[642,4429,4276],{"class":666},[642,4431,824],{"class":662},[642,4433,4266],{"class":743},[642,4435,790],{"class":789},[642,4437,4438,4440,4442,4444,4446,4448,4450,4452],{"class":644,"line":686},[642,4439,4292],{"class":655},[642,4441,1743],{"class":789},[642,4443,990],{"class":758},[642,4445,4299],{"class":666},[642,4447,4302],{"class":662},[642,4449,4418],{"class":666},[642,4451,2832],{"class":789},[642,4453,1065],{"class":662},[642,4455,4456,4458,4460,4462,4464,4466,4468,4470,4472,4474,4476,4478,4480,4482],{"class":644,"line":706},[642,4457,1763],{"class":666},[642,4459,824],{"class":662},[642,4461,3404],{"class":743},[642,4463,747],{"class":789},[642,4465,837],{"class":662},[642,4467,4329],{"class":679},[642,4469,837],{"class":662},[642,4471,845],{"class":662},[642,4473,3128],{"class":666},[642,4475,824],{"class":662},[642,4477,3133],{"class":743},[642,4479,747],{"class":789},[642,4481,4344],{"class":666},[642,4483,4347],{"class":789},[642,4485,4486],{"class":644,"line":727},[642,4487,4352],{"class":662},[642,4489,4490,4493,4495,4497,4499,4501,4504,4507],{"class":644,"line":734},[642,4491,4492],{"class":655},"  return",[642,4494,2788],{"class":666},[642,4496,824],{"class":662},[642,4498,4310],{"class":743},[642,4500,747],{"class":789},[642,4502,4503],{"class":662},"null,",[642,4505,4506],{"class":1629}," 204",[642,4508,850],{"class":789},[642,4510,4511,4513],{"class":644,"line":765},[642,4512,893],{"class":662},[642,4514,850],{"class":666},[454,4516,4517,4518,4523],{},"See the full ",[458,4519,4522],{"href":4520,"rel":4521},"https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Ftree\u002Fmain\u002Fexamples\u002Fbrowser",[615],"browser example"," for a working Hono server + browser page.",[622,4525,4527],{"id":4526},"common-pitfalls","Common pitfalls",[537,4529,4530,4538,4546,4552],{},[540,4531,4532,4537],{},[2631,4533,2188,4534,4536],{},[544,4535,591],{}," on shutdown"," — buffered events are lost otherwise",[540,4539,4540,4545],{},[2631,4541,2163,4542,4544],{},[544,4543,1505],{}," to match your provider's recommended payload"," — too small wastes overhead, too big risks rejection",[540,4547,4548,4551],{},[2631,4549,4550],{},"Don't run one pipeline per drain unless you need per-destination retries"," — sharing one pipeline keeps batching + buffering coherent",[540,4553,4554,4557,4558,4561],{},[2631,4555,4556],{},"Don't fan out to a serverless-incompatible target without checking"," — the ",[458,4559,4560],{"href":372},"stream server"," reaches every connected client through the in-process stream; it's not a drain",[622,4563,4565],{"id":4564},"next-steps","Next steps",[537,4567,4568,4579,4585,4590],{},[540,4569,4570,4573,4574,2181,4576],{},[458,4571,4572],{"href":408},"Custom Drains"," — build a drain for any backend with ",[544,4575,3182],{},[544,4577,4578],{},"defineDrain",[540,4580,4581,4584],{},[458,4582,4583],{"href":95},"Adapters Overview"," — built-in adapters that work with the pipeline out of the box",[540,4586,4587,4589],{},[458,4588,435],{"href":436}," — security and production tips",[540,4591,4592,4595],{},[458,4593,4594],{"href":256},"Client logging"," — end-to-end browser → server flow",[4597,4598,4599],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":638,"searchDepth":652,"depth":652,"links":4601},[4602,4603,4604,4609,4614,4615,4624,4625],{"id":624,"depth":652,"text":496},{"id":1495,"depth":652,"text":1496},{"id":1524,"depth":652,"text":422,"children":4605},[4606,4607,4608],{"id":1845,"depth":686,"text":1846},{"id":1986,"depth":686,"text":1987},{"id":2045,"depth":686,"text":2046},{"id":2116,"depth":652,"text":507,"children":4610},[4611,4612,4613],{"id":2199,"depth":686,"text":2200},{"id":2624,"depth":686,"text":2625},{"id":2651,"depth":686,"text":2652},{"id":2934,"depth":652,"text":2935},{"id":3186,"depth":652,"text":517,"children":4616},[4617,4618,4619,4620,4621,4622,4623],{"id":3288,"depth":686,"text":496},{"id":3447,"depth":686,"text":3448},{"id":3493,"depth":686,"text":3494},{"id":3893,"depth":686,"text":3894},{"id":4081,"depth":686,"text":4082},{"id":4103,"depth":686,"text":4104},{"id":4224,"depth":686,"text":4225},{"id":4526,"depth":652,"text":4527},{"id":4564,"depth":652,"text":4565},"Batch events, retry on failure, fan out to multiple destinations, and ship browser logs to your server. The shared pipeline that wraps every drain in production.","md",[4629,4631],{"label":4572,"icon":410,"to":408,"color":3204,"variant":4630},"subtle",{"label":4583,"icon":4632,"to":95,"color":3204,"variant":4630},"i-custom-plug",{},{"title":412,"icon":415},{"title":449,"description":4626},"3mH3WlVMmFcR1dTFJGDSmWBM45oZ5qBDBE6EvZSHwAU",[4638,4640],{"title":407,"path":408,"stem":409,"description":4639,"icon":410,"children":-1},"Build a drain for any backend without a built-in adapter — defineHttpDrain for HTTP destinations, defineDrain for any other transport. Standardized config resolution, retries, timeouts, and identity headers handled for you.",{"title":422,"path":423,"stem":424,"description":4641,"icon":425,"children":-1},"Complete reference for all evlog configuration options including global logger settings, middleware options, environment context, and framework-specific overrides.",1782924672048]