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