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