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