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