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