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