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