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