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