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