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