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