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