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