[{"data":1,"prerenderedAt":3605},["ShallowReactive",2],{"navigation_docs":3,"-extend-custom-drains":464,"-extend-custom-drains-surround":3600},[4,30,80,245,379,434],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Start","\u002Fstart","1.start",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Why start with evlog","\u002Fstart\u002Fwhy-evlog","1.start\u002F2.why-evlog","i-lucide-rocket",{"title":20,"path":21,"stem":22,"icon":23},"Installation","\u002Fstart\u002Finstallation","1.start\u002F3.installation","i-lucide-download",{"title":25,"path":26,"stem":27,"icon":28},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F4.quick-start","i-lucide-zap",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Learn","\u002Flearn","2.learn",[35,40,45,50,55,60,65,70,75],{"title":36,"path":37,"stem":38,"icon":39},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":41,"path":42,"stem":43,"icon":44},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":46,"path":47,"stem":48,"icon":49},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":51,"path":52,"stem":53,"icon":54},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":56,"path":57,"stem":58,"icon":59},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":61,"path":62,"stem":63,"icon":64},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":66,"path":67,"stem":68,"icon":69},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":71,"path":72,"stem":73,"icon":74},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":76,"path":77,"stem":78,"icon":79},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":81,"path":82,"stem":83,"children":84,"page":29},"Integrate","\u002Fintegrate","3.integrate",[85,89,157],{"title":36,"path":86,"stem":87,"icon":88},"\u002Fintegrate\u002Foverview","3.integrate\u002F0.overview","i-lucide-plug",{"title":90,"path":91,"stem":92,"children":93,"page":29},"Adapters","\u002Fintegrate\u002Fadapters","3.integrate\u002Fadapters",[94,97,137],{"title":36,"path":95,"stem":96,"icon":39},"\u002Fintegrate\u002Fadapters\u002Foverview","3.integrate\u002Fadapters\u002F01.overview",{"title":98,"path":99,"stem":100,"children":101,"page":29},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","3.integrate\u002Fadapters\u002Fcloud",[102,107,112,117,122,127,132],{"title":103,"path":104,"stem":105,"icon":106},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","3.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":108,"path":109,"stem":110,"icon":111},"OTLP","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fotlp","3.integrate\u002Fadapters\u002Fcloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":113,"path":114,"stem":115,"icon":116},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","3.integrate\u002Fadapters\u002Fcloud\u002F03.posthog","i-simple-icons-posthog",{"title":118,"path":119,"stem":120,"icon":121},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","3.integrate\u002Fadapters\u002Fcloud\u002F04.sentry","i-simple-icons-sentry",{"title":123,"path":124,"stem":125,"icon":126},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","3.integrate\u002Fadapters\u002Fcloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":128,"path":129,"stem":130,"icon":131},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","3.integrate\u002Fadapters\u002Fcloud\u002F06.datadog","i-simple-icons-datadog",{"title":133,"path":134,"stem":135,"icon":136},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fhyperdx","3.integrate\u002Fadapters\u002Fcloud\u002F07.hyperdx","i-custom-hyperdx",{"title":138,"path":139,"stem":140,"children":141,"page":29},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","3.integrate\u002Fadapters\u002Fself-hosted",[142,147,152],{"title":143,"path":144,"stem":145,"icon":146},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","3.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":148,"path":149,"stem":150,"icon":151},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","3.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":153,"path":154,"stem":155,"icon":156},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","3.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":158,"path":159,"stem":160,"children":161,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","3.integrate\u002Fframeworks",[162,166,171,176,181,186,191,196,201,206,211,216,221,226,230,235,240],{"title":36,"path":163,"stem":164,"icon":165},"\u002Fintegrate\u002Fframeworks\u002Foverview","3.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":167,"path":168,"stem":169,"icon":170},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","3.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":172,"path":173,"stem":174,"icon":175},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","3.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":177,"path":178,"stem":179,"icon":180},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","3.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":182,"path":183,"stem":184,"icon":185},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","3.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":187,"path":188,"stem":189,"icon":190},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","3.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":192,"path":193,"stem":194,"icon":195},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","3.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":197,"path":198,"stem":199,"icon":200},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","3.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":202,"path":203,"stem":204,"icon":205},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","3.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":207,"path":208,"stem":209,"icon":210},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","3.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":212,"path":213,"stem":214,"icon":215},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","3.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":217,"path":218,"stem":219,"icon":220},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","3.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":222,"path":223,"stem":224,"icon":225},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","3.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":227,"path":228,"stem":229,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","3.integrate\u002Fframeworks\u002F13.standalone",{"title":231,"path":232,"stem":233,"icon":234},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","3.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":236,"path":237,"stem":238,"icon":239},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","3.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":241,"path":242,"stem":243,"icon":244},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","3.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":246,"path":247,"stem":248,"children":249,"page":29},"Use Cases","\u002Fuse-cases","4.use-cases",[250,254,259,288,316,348,369,374],{"title":36,"path":251,"stem":252,"icon":253},"\u002Fuse-cases\u002Foverview","4.use-cases\u002F0.overview","i-lucide-list-checks",{"title":255,"path":256,"stem":257,"icon":258},"Client Logging","\u002Fuse-cases\u002Fclient-logging","4.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":260,"icon":261,"path":262,"stem":263,"children":264,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","4.use-cases\u002F2.ai-sdk",[265,268,273,278,283],{"title":36,"path":266,"stem":267,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","4.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":269,"path":270,"stem":271,"icon":272},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","4.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":274,"path":275,"stem":276,"icon":277},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","4.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":279,"path":280,"stem":281,"icon":282},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","4.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":284,"path":285,"stem":286,"icon":287},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","4.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":289,"icon":290,"path":291,"stem":292,"children":293,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","4.use-cases\u002F3.better-auth",[294,297,302,307,311],{"title":36,"path":295,"stem":296,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","4.use-cases\u002F3.better-auth\u002F01.overview",{"title":298,"path":299,"stem":300,"icon":301},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","4.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":303,"path":304,"stem":305,"icon":306},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","4.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":308,"path":309,"stem":310,"icon":258},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","4.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":312,"path":313,"stem":314,"icon":315},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","4.use-cases\u002F3.better-auth\u002F05.performance","i-lucide-gauge",{"title":317,"icon":318,"path":319,"stem":320,"children":321,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","4.use-cases\u002F4.audit",[322,325,330,335,340,344],{"title":36,"path":323,"stem":324,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","4.use-cases\u002F4.audit\u002F01.overview",{"title":326,"path":327,"stem":328,"icon":329},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","4.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":331,"path":332,"stem":333,"icon":334},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","4.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":336,"path":337,"stem":338,"icon":339},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","4.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":341,"path":342,"stem":343,"icon":318},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","4.use-cases\u002F4.audit\u002F05.compliance",{"title":345,"path":346,"stem":347,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","4.use-cases\u002F4.audit\u002F06.recipes",{"title":284,"icon":315,"path":349,"stem":350,"children":351,"page":29},"\u002Fuse-cases\u002Ftelemetry","4.use-cases\u002F4.telemetry",[352,355,360,365],{"title":36,"path":353,"stem":354,"icon":39},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","4.use-cases\u002F4.telemetry\u002F01.overview",{"title":356,"path":357,"stem":358,"icon":359},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","4.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":361,"path":362,"stem":363,"icon":364},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","4.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":366,"path":367,"stem":368,"icon":79},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","4.use-cases\u002F4.telemetry\u002F04.reference",{"title":370,"path":371,"stem":372,"icon":373},"Enrichers","\u002Fuse-cases\u002Fenrichers","4.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":375,"path":376,"stem":377,"icon":378},"eve","\u002Fuse-cases\u002Feve","4.use-cases\u002F5.eve","i-custom-eve",{"title":380,"path":381,"stem":382,"children":383,"page":29},"Extend","\u002Fextend","5.extend",[384,388,393,398,403,407,411,415,419,424,429],{"title":36,"path":385,"stem":386,"icon":387},"\u002Fextend\u002Foverview","5.extend\u002F0.overview","i-lucide-blocks",{"title":389,"path":390,"stem":391,"icon":392},"Stream","\u002Fextend\u002Fstream","5.extend\u002F1.stream","i-lucide-radio-tower",{"title":394,"path":395,"stem":396,"icon":397},"Custom framework","\u002Fextend\u002Fcustom-framework","5.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":399,"path":400,"stem":401,"icon":402},"FS reader","\u002Fextend\u002Ffs-reader","5.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":345,"path":404,"stem":405,"icon":406},"\u002Fextend\u002Fconsumer-recipes","5.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":408,"path":409,"stem":410,"icon":387},"Plugins","\u002Fextend\u002Fplugins","5.extend\u002F4.plugins",{"title":412,"path":413,"stem":414,"icon":373},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","5.extend\u002F5.custom-enrichers",{"title":416,"path":417,"stem":418,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","5.extend\u002F6.tail-sampling",{"title":420,"path":421,"stem":422,"icon":423},"Identity headers","\u002Fextend\u002Fidentity-headers","5.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":425,"path":426,"stem":427,"icon":428},"Custom drains","\u002Fextend\u002Fcustom-drains","5.extend\u002F8.custom-drains","i-lucide-share-2",{"title":430,"path":431,"stem":432,"icon":433},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","5.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":366,"path":435,"stem":436,"children":437,"page":29},"\u002Freference","6.reference",[438,443,446,451,455,460],{"title":439,"path":440,"stem":441,"icon":442},"Configuration","\u002Freference\u002Fconfiguration","6.reference\u002F1.configuration","i-lucide-settings",{"title":312,"path":444,"stem":445,"icon":315},"\u002Freference\u002Fperformance","6.reference\u002F2.performance",{"title":447,"path":448,"stem":449,"icon":450},"Vite Plugin","\u002Freference\u002Fvite-plugin","6.reference\u002F3.vite-plugin","i-custom-vite",{"title":452,"path":453,"stem":454,"icon":318},"Best Practices","\u002Freference\u002Fbest-practices","6.reference\u002F4.best-practices",{"title":456,"path":457,"stem":458,"icon":459},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","6.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":461,"path":462,"stem":463,"icon":373},"Agent Skills","\u002Freference\u002Fagent-skills","6.reference\u002F6.agent-skills",{"id":465,"title":466,"body":467,"description":3588,"extension":3589,"links":3590,"meta":3596,"navigation":3597,"path":426,"seo":3598,"stem":427,"__hash__":3599},"docs\u002F5.extend\u002F8.custom-drains.md","Custom Drains",{"type":468,"value":469,"toc":3571},"minimark",[470,484,487,538,545,666,673,686,1350,1364,1369,1372,1848,1852,1857,1898,1928,1932,1939,2374,2382,2386,2398,2754,2760,2766,2952,2969,2973,2983,3242,3259,3263,3268,3374,3377,3382,3423,3432,3436,3441,3483,3489,3493,3496,3504,3518,3530,3534,3567],[471,472,473,474,478,479,483],"p",{},"A ",[475,476,477],"strong",{},"drain"," is the terminal step of evlog's pipeline: a function that receives wide events and ships them somewhere — an HTTP API, a message queue, a database, a webhook, a local file. evlog ships built-in drains for popular providers (",[480,481,482],"a",{"href":95},"Adapters overview","). When you need a destination that isn't covered, you write your own.",[471,485,486],{},"Two factories cover every case:",[488,489,490,503],"table",{},[491,492,493],"thead",{},[494,495,496,500],"tr",{},[497,498,499],"th",{},"You have…",[497,501,502],{},"Use",[504,505,506,525],"tbody",{},[494,507,508,517],{},[509,510,511,512,516],"td",{},"An HTTP backend (REST, JSON ingest, vendor ",[513,514,515],"code",{},"\u002Fv1\u002Flogs"," endpoint)",[509,518,519],{},[480,520,522],{"href":521},"#definehttpdrain-the-http-recipe",[513,523,524],{},"defineHttpDrain",[494,526,527,530],{},[509,528,529],{},"A non-HTTP transport (gRPC, WebSocket, vendor SDK, queue, raw socket)",[509,531,532],{},[480,533,535],{"href":534},"#definedrain-non-http-transports",[513,536,537],{},"defineDrain",[471,539,540,541,544],{},"Both come from ",[513,542,543],{},"evlog\u002Ftoolkit"," and are the exact factories every built-in adapter uses.",[546,547,551,554,653],"prompt",{":actions":548,"description":549,"icon":550},"[\"copy\",\"cursor\",\"claude\"]","Build a custom evlog drain","i-lucide-code-2",[471,552,553],{},"Build a custom evlog drain that ships wide events to a backend without a built-in adapter.",[555,556,557,572,583,598,616,631,636,646],"ul",{},[558,559,560,561,564,565,567,568,571],"li",{},"For HTTP backends, use ",[513,562,563],{},"defineHttpDrain({ name, resolve, encode })"," from ",[513,566,543],{}," — never call ",[513,569,570],{},"fetch"," directly",[558,573,574,575,578,579,582],{},"For non-HTTP transports (queue, DB, native SDK, raw socket), use ",[513,576,577],{},"defineDrain({ name, send })"," and implement ",[513,580,581],{},"send(events)"," myself",[558,584,585,586,589,590,593,594,597],{},"Resolve config lazily inside ",[513,587,588],{},"resolve()"," via ",[513,591,592],{},"resolveAdapterConfig(namespace, fields, overrides)"," so users get the standard precedence (overrides → ",[513,595,596],{},"runtimeConfig.evlog.\u003Cns>"," → env)",[558,599,600,601,604,605,608,609,612,613],{},"Use the standardized field names: ",[513,602,603],{},"apiKey"," for bearer secrets, ",[513,606,607],{},"endpoint"," for the base URL, ",[513,610,611],{},"serviceName",", ",[513,614,615],{},"timeout",[558,617,618,619,622,623,626,627,630],{},"Encode batched events into the destination's wire format inside ",[513,620,621],{},"encode(events, config)"," — return ",[513,624,625],{},"{ url, headers, body }"," (or ",[513,628,629],{},"null"," to opt out of the batch)",[558,632,633,635],{},[513,634,524],{}," handles retries, timeouts, error isolation, batching, and identity headers — don't reimplement them",[558,637,638,639,642,643,645],{},"Wire the drain via ",[513,640,641],{},"defineEvlog({ drain: createMyDrain() })"," or my framework's middleware ",[513,644,477],{}," option",[558,647,648,649,652],{},"For production, wrap the result in ",[513,650,651],{},"createDrainPipeline"," for batching + retries",[471,654,655,656,661,662],{},"Docs: ",[480,657,658],{"href":658,"rel":659},"https:\u002F\u002Fwww.evlog.dev\u002Fextend\u002Fcustom-drains",[660],"nofollow","\nPipeline: ",[480,663,664],{"href":664,"rel":665},"https:\u002F\u002Fwww.evlog.dev\u002Fextend\u002Fdrain-pipeline",[660],[667,668,670,672],"h2",{"id":669},"definehttpdrain-the-http-recipe",[513,671,524],{}," (the HTTP recipe)",[471,674,675,676,678,679,681,682,685],{},"The recipe every built-in adapter follows. Two pure functions: ",[513,677,588],{}," returns the config (or ",[513,680,629],{}," to skip), ",[513,683,684],{},"encode()"," returns the HTTP request payload.",[687,688,694],"pre",{"className":689,"code":690,"filename":691,"language":692,"meta":693,"style":693},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import {\n  defineHttpDrain,\n  resolveAdapterConfig,\n  type ConfigField,\n} from 'evlog\u002Ftoolkit'\n\ninterface MyServiceConfig {\n  apiKey: string\n  endpoint?: string\n  timeout?: number\n}\n\nconst FIELDS: ConfigField\u003CMyServiceConfig>[] = [\n  { key: 'apiKey', env: ['MYSERVICE_API_KEY'] },\n  { key: 'endpoint', env: ['MYSERVICE_ENDPOINT'] },\n  { key: 'timeout' },\n]\n\nexport function createMyServiceDrain(overrides?: Partial\u003CMyServiceConfig>) {\n  return defineHttpDrain\u003CMyServiceConfig>({\n    name: 'myservice',\n    resolve: async () => {\n      const cfg = await resolveAdapterConfig\u003CMyServiceConfig>('myservice', FIELDS, overrides)\n      if (!cfg.apiKey) {\n        console.error('[evlog\u002Fmyservice] Missing apiKey')\n        return null\n      }\n      return cfg as MyServiceConfig\n    },\n    encode: (events, cfg) => ({\n      url: `${cfg.endpoint ?? 'https:\u002F\u002Fapi.myservice.com'}\u002Fv1\u002Fingest`,\n      headers: {\n        'Content-Type': 'application\u002Fjson',\n        Authorization: `Bearer ${cfg.apiKey}`,\n      },\n      body: JSON.stringify(events),\n    }),\n  })\n}\n","lib\u002Fmy-drain.ts","typescript","",[513,695,696,709,719,727,738,756,763,776,789,800,811,817,822,853,895,929,947,953,958,992,1012,1029,1048,1092,1117,1139,1148,1154,1168,1174,1200,1237,1247,1269,1297,1303,1327,1337,1345],{"__ignoreMap":693},[697,698,701,705],"span",{"class":699,"line":700},"line",1,[697,702,704],{"class":703},"s7zQu","import",[697,706,708],{"class":707},"sMK4o"," {\n",[697,710,712,716],{"class":699,"line":711},2,[697,713,715],{"class":714},"sTEyZ","  defineHttpDrain",[697,717,718],{"class":707},",\n",[697,720,722,725],{"class":699,"line":721},3,[697,723,724],{"class":714},"  resolveAdapterConfig",[697,726,718],{"class":707},[697,728,730,733,736],{"class":699,"line":729},4,[697,731,732],{"class":703},"  type",[697,734,735],{"class":714}," ConfigField",[697,737,718],{"class":707},[697,739,741,744,747,750,753],{"class":699,"line":740},5,[697,742,743],{"class":707},"}",[697,745,746],{"class":703}," from",[697,748,749],{"class":707}," '",[697,751,543],{"class":752},"sfazB",[697,754,755],{"class":707},"'\n",[697,757,759],{"class":699,"line":758},6,[697,760,762],{"emptyLinePlaceholder":761},true,"\n",[697,764,766,770,774],{"class":699,"line":765},7,[697,767,769],{"class":768},"spNyl","interface",[697,771,773],{"class":772},"sBMFI"," MyServiceConfig",[697,775,708],{"class":707},[697,777,779,783,786],{"class":699,"line":778},8,[697,780,782],{"class":781},"swJcz","  apiKey",[697,784,785],{"class":707},":",[697,787,788],{"class":772}," string\n",[697,790,792,795,798],{"class":699,"line":791},9,[697,793,794],{"class":781},"  endpoint",[697,796,797],{"class":707},"?:",[697,799,788],{"class":772},[697,801,803,806,808],{"class":699,"line":802},10,[697,804,805],{"class":781},"  timeout",[697,807,797],{"class":707},[697,809,810],{"class":772}," number\n",[697,812,814],{"class":699,"line":813},11,[697,815,816],{"class":707},"}\n",[697,818,820],{"class":699,"line":819},12,[697,821,762],{"emptyLinePlaceholder":761},[697,823,825,828,831,833,835,838,841,844,847,850],{"class":699,"line":824},13,[697,826,827],{"class":768},"const",[697,829,830],{"class":714}," FIELDS",[697,832,785],{"class":707},[697,834,735],{"class":772},[697,836,837],{"class":707},"\u003C",[697,839,840],{"class":772},"MyServiceConfig",[697,842,843],{"class":707},">",[697,845,846],{"class":714},"[] ",[697,848,849],{"class":707},"=",[697,851,852],{"class":714}," [\n",[697,854,856,859,862,864,866,868,871,874,877,879,882,884,887,889,892],{"class":699,"line":855},14,[697,857,858],{"class":707},"  {",[697,860,861],{"class":781}," key",[697,863,785],{"class":707},[697,865,749],{"class":707},[697,867,603],{"class":752},[697,869,870],{"class":707},"'",[697,872,873],{"class":707},",",[697,875,876],{"class":781}," env",[697,878,785],{"class":707},[697,880,881],{"class":714}," [",[697,883,870],{"class":707},[697,885,886],{"class":752},"MYSERVICE_API_KEY",[697,888,870],{"class":707},[697,890,891],{"class":714},"] ",[697,893,894],{"class":707},"},\n",[697,896,898,900,902,904,906,908,910,912,914,916,918,920,923,925,927],{"class":699,"line":897},15,[697,899,858],{"class":707},[697,901,861],{"class":781},[697,903,785],{"class":707},[697,905,749],{"class":707},[697,907,607],{"class":752},[697,909,870],{"class":707},[697,911,873],{"class":707},[697,913,876],{"class":781},[697,915,785],{"class":707},[697,917,881],{"class":714},[697,919,870],{"class":707},[697,921,922],{"class":752},"MYSERVICE_ENDPOINT",[697,924,870],{"class":707},[697,926,891],{"class":714},[697,928,894],{"class":707},[697,930,932,934,936,938,940,942,944],{"class":699,"line":931},16,[697,933,858],{"class":707},[697,935,861],{"class":781},[697,937,785],{"class":707},[697,939,749],{"class":707},[697,941,615],{"class":752},[697,943,870],{"class":707},[697,945,946],{"class":707}," },\n",[697,948,950],{"class":699,"line":949},17,[697,951,952],{"class":714},"]\n",[697,954,956],{"class":699,"line":955},18,[697,957,762],{"emptyLinePlaceholder":761},[697,959,961,964,967,971,974,978,980,983,985,987,990],{"class":699,"line":960},19,[697,962,963],{"class":703},"export",[697,965,966],{"class":768}," function",[697,968,970],{"class":969},"s2Zo4"," createMyServiceDrain",[697,972,973],{"class":707},"(",[697,975,977],{"class":976},"sHdIc","overrides",[697,979,797],{"class":707},[697,981,982],{"class":772}," Partial",[697,984,837],{"class":707},[697,986,840],{"class":772},[697,988,989],{"class":707},">)",[697,991,708],{"class":707},[697,993,995,998,1001,1003,1005,1007,1009],{"class":699,"line":994},20,[697,996,997],{"class":703},"  return",[697,999,1000],{"class":969}," defineHttpDrain",[697,1002,837],{"class":707},[697,1004,840],{"class":772},[697,1006,843],{"class":707},[697,1008,973],{"class":781},[697,1010,1011],{"class":707},"{\n",[697,1013,1015,1018,1020,1022,1025,1027],{"class":699,"line":1014},21,[697,1016,1017],{"class":781},"    name",[697,1019,785],{"class":707},[697,1021,749],{"class":707},[697,1023,1024],{"class":752},"myservice",[697,1026,870],{"class":707},[697,1028,718],{"class":707},[697,1030,1032,1035,1037,1040,1043,1046],{"class":699,"line":1031},22,[697,1033,1034],{"class":969},"    resolve",[697,1036,785],{"class":707},[697,1038,1039],{"class":768}," async",[697,1041,1042],{"class":707}," ()",[697,1044,1045],{"class":768}," =>",[697,1047,708],{"class":707},[697,1049,1051,1054,1057,1060,1063,1066,1068,1070,1072,1074,1076,1078,1080,1082,1084,1086,1089],{"class":699,"line":1050},23,[697,1052,1053],{"class":768},"      const",[697,1055,1056],{"class":714}," cfg",[697,1058,1059],{"class":707}," =",[697,1061,1062],{"class":703}," await",[697,1064,1065],{"class":969}," resolveAdapterConfig",[697,1067,837],{"class":707},[697,1069,840],{"class":772},[697,1071,843],{"class":707},[697,1073,973],{"class":781},[697,1075,870],{"class":707},[697,1077,1024],{"class":752},[697,1079,870],{"class":707},[697,1081,873],{"class":707},[697,1083,830],{"class":714},[697,1085,873],{"class":707},[697,1087,1088],{"class":714}," overrides",[697,1090,1091],{"class":781},")\n",[697,1093,1095,1098,1101,1104,1107,1110,1112,1115],{"class":699,"line":1094},24,[697,1096,1097],{"class":703},"      if",[697,1099,1100],{"class":781}," (",[697,1102,1103],{"class":707},"!",[697,1105,1106],{"class":714},"cfg",[697,1108,1109],{"class":707},".",[697,1111,603],{"class":714},[697,1113,1114],{"class":781},") ",[697,1116,1011],{"class":707},[697,1118,1120,1123,1125,1128,1130,1132,1135,1137],{"class":699,"line":1119},25,[697,1121,1122],{"class":714},"        console",[697,1124,1109],{"class":707},[697,1126,1127],{"class":969},"error",[697,1129,973],{"class":781},[697,1131,870],{"class":707},[697,1133,1134],{"class":752},"[evlog\u002Fmyservice] Missing apiKey",[697,1136,870],{"class":707},[697,1138,1091],{"class":781},[697,1140,1142,1145],{"class":699,"line":1141},26,[697,1143,1144],{"class":703},"        return",[697,1146,1147],{"class":707}," null\n",[697,1149,1151],{"class":699,"line":1150},27,[697,1152,1153],{"class":707},"      }\n",[697,1155,1157,1160,1162,1165],{"class":699,"line":1156},28,[697,1158,1159],{"class":703},"      return",[697,1161,1056],{"class":714},[697,1163,1164],{"class":703}," as",[697,1166,1167],{"class":772}," MyServiceConfig\n",[697,1169,1171],{"class":699,"line":1170},29,[697,1172,1173],{"class":707},"    },\n",[697,1175,1177,1180,1182,1184,1187,1189,1191,1194,1196,1198],{"class":699,"line":1176},30,[697,1178,1179],{"class":969},"    encode",[697,1181,785],{"class":707},[697,1183,1100],{"class":707},[697,1185,1186],{"class":976},"events",[697,1188,873],{"class":707},[697,1190,1056],{"class":976},[697,1192,1193],{"class":707},")",[697,1195,1045],{"class":768},[697,1197,1100],{"class":781},[697,1199,1011],{"class":707},[697,1201,1203,1206,1208,1211,1213,1215,1218,1221,1223,1226,1229,1232,1235],{"class":699,"line":1202},31,[697,1204,1205],{"class":781},"      url",[697,1207,785],{"class":707},[697,1209,1210],{"class":707}," `${",[697,1212,1106],{"class":714},[697,1214,1109],{"class":707},[697,1216,1217],{"class":714},"endpoint ",[697,1219,1220],{"class":707},"??",[697,1222,749],{"class":707},[697,1224,1225],{"class":752},"https:\u002F\u002Fapi.myservice.com",[697,1227,1228],{"class":707},"'}",[697,1230,1231],{"class":752},"\u002Fv1\u002Fingest",[697,1233,1234],{"class":707},"`",[697,1236,718],{"class":707},[697,1238,1240,1243,1245],{"class":699,"line":1239},32,[697,1241,1242],{"class":781},"      headers",[697,1244,785],{"class":707},[697,1246,708],{"class":707},[697,1248,1250,1253,1256,1258,1260,1262,1265,1267],{"class":699,"line":1249},33,[697,1251,1252],{"class":707},"        '",[697,1254,1255],{"class":781},"Content-Type",[697,1257,870],{"class":707},[697,1259,785],{"class":707},[697,1261,749],{"class":707},[697,1263,1264],{"class":752},"application\u002Fjson",[697,1266,870],{"class":707},[697,1268,718],{"class":707},[697,1270,1272,1275,1277,1280,1283,1286,1288,1290,1292,1295],{"class":699,"line":1271},34,[697,1273,1274],{"class":781},"        Authorization",[697,1276,785],{"class":707},[697,1278,1279],{"class":707}," `",[697,1281,1282],{"class":752},"Bearer ",[697,1284,1285],{"class":707},"${",[697,1287,1106],{"class":714},[697,1289,1109],{"class":707},[697,1291,603],{"class":714},[697,1293,1294],{"class":707},"}`",[697,1296,718],{"class":707},[697,1298,1300],{"class":699,"line":1299},35,[697,1301,1302],{"class":707},"      },\n",[697,1304,1306,1309,1311,1314,1316,1319,1321,1323,1325],{"class":699,"line":1305},36,[697,1307,1308],{"class":781},"      body",[697,1310,785],{"class":707},[697,1312,1313],{"class":714}," JSON",[697,1315,1109],{"class":707},[697,1317,1318],{"class":969},"stringify",[697,1320,973],{"class":781},[697,1322,1186],{"class":714},[697,1324,1193],{"class":781},[697,1326,718],{"class":707},[697,1328,1330,1333,1335],{"class":699,"line":1329},37,[697,1331,1332],{"class":707},"    }",[697,1334,1193],{"class":781},[697,1336,718],{"class":707},[697,1338,1340,1343],{"class":699,"line":1339},38,[697,1341,1342],{"class":707},"  }",[697,1344,1091],{"class":781},[697,1346,1348],{"class":699,"line":1347},39,[697,1349,816],{"class":707},[471,1351,1352,1353,1355,1356,1359,1360,1363],{},"That's it. ",[513,1354,524],{}," handles batching, retries (default 2), timeouts (default 5000ms), error isolation, and the identity headers (",[513,1357,1358],{},"User-Agent: evlog\u002F\u003Cversion>"," + ",[513,1361,1362],{},"X-Evlog-Source: \u003Cname>","). Your app pipeline keeps running even if your destination is down.",[1365,1366,1368],"h3",{"id":1367},"a-5-minute-example-internal-loki-drain","A 5-minute example — internal Loki drain",[471,1370,1371],{},"A complete working drain in 25 lines, with no external config helper:",[687,1373,1378],{"className":1374,"code":1375,"filename":1376,"language":1377,"meta":693,"style":693},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defineHttpDrain } from 'evlog\u002Ftoolkit'\n\nexport function createLokiDrain(overrides?: { url?: string, token?: string }) {\n  return defineHttpDrain\u003C{ url: string, token: string }>({\n    name: 'loki',\n    resolve: () => ({\n      url: overrides?.url ?? process.env.LOKI_URL!,\n      token: overrides?.token ?? process.env.LOKI_TOKEN!,\n    }),\n    encode: (events, config) => ({\n      url: `${config.url}\u002Floki\u002Fapi\u002Fv1\u002Fpush`,\n      headers: {\n        'Content-Type': 'application\u002Fjson',\n        Authorization: `Bearer ${config.token}`,\n      },\n      body: JSON.stringify({\n        streams: events.map(e => ({\n          stream: { service: e.service, level: e.level },\n          values: [[String(Date.parse(e.timestamp) * 1e6), JSON.stringify(e)]],\n        })),\n      }),\n    }),\n  })\n}\n","lib\u002Floki-drain.ts","ts",[513,1379,1380,1400,1404,1443,1473,1488,1502,1535,1564,1572,1595,1619,1627,1645,1667,1671,1687,1713,1751,1811,1821,1830,1838,1844],{"__ignoreMap":693},[697,1381,1382,1384,1387,1389,1392,1394,1396,1398],{"class":699,"line":700},[697,1383,704],{"class":703},[697,1385,1386],{"class":707}," {",[697,1388,1000],{"class":714},[697,1390,1391],{"class":707}," }",[697,1393,746],{"class":703},[697,1395,749],{"class":707},[697,1397,543],{"class":752},[697,1399,755],{"class":707},[697,1401,1402],{"class":699,"line":711},[697,1403,762],{"emptyLinePlaceholder":761},[697,1405,1406,1408,1410,1413,1415,1417,1419,1421,1424,1426,1429,1431,1434,1436,1438,1441],{"class":699,"line":721},[697,1407,963],{"class":703},[697,1409,966],{"class":768},[697,1411,1412],{"class":969}," createLokiDrain",[697,1414,973],{"class":707},[697,1416,977],{"class":976},[697,1418,797],{"class":707},[697,1420,1386],{"class":707},[697,1422,1423],{"class":781}," url",[697,1425,797],{"class":707},[697,1427,1428],{"class":772}," string",[697,1430,873],{"class":707},[697,1432,1433],{"class":781}," token",[697,1435,797],{"class":707},[697,1437,1428],{"class":772},[697,1439,1440],{"class":707}," })",[697,1442,708],{"class":707},[697,1444,1445,1447,1449,1452,1454,1456,1458,1460,1462,1464,1466,1469,1471],{"class":699,"line":729},[697,1446,997],{"class":703},[697,1448,1000],{"class":969},[697,1450,1451],{"class":707},"\u003C{",[697,1453,1423],{"class":781},[697,1455,785],{"class":707},[697,1457,1428],{"class":772},[697,1459,873],{"class":707},[697,1461,1433],{"class":781},[697,1463,785],{"class":707},[697,1465,1428],{"class":772},[697,1467,1468],{"class":707}," }>",[697,1470,973],{"class":781},[697,1472,1011],{"class":707},[697,1474,1475,1477,1479,1481,1484,1486],{"class":699,"line":740},[697,1476,1017],{"class":781},[697,1478,785],{"class":707},[697,1480,749],{"class":707},[697,1482,1483],{"class":752},"loki",[697,1485,870],{"class":707},[697,1487,718],{"class":707},[697,1489,1490,1492,1494,1496,1498,1500],{"class":699,"line":758},[697,1491,1034],{"class":969},[697,1493,785],{"class":707},[697,1495,1042],{"class":707},[697,1497,1045],{"class":768},[697,1499,1100],{"class":781},[697,1501,1011],{"class":707},[697,1503,1504,1506,1508,1510,1513,1516,1519,1522,1524,1527,1529,1532],{"class":699,"line":765},[697,1505,1205],{"class":781},[697,1507,785],{"class":707},[697,1509,1088],{"class":714},[697,1511,1512],{"class":707},"?.",[697,1514,1515],{"class":714},"url",[697,1517,1518],{"class":707}," ??",[697,1520,1521],{"class":714}," process",[697,1523,1109],{"class":707},[697,1525,1526],{"class":714},"env",[697,1528,1109],{"class":707},[697,1530,1531],{"class":714},"LOKI_URL",[697,1533,1534],{"class":707},"!,\n",[697,1536,1537,1540,1542,1544,1546,1549,1551,1553,1555,1557,1559,1562],{"class":699,"line":778},[697,1538,1539],{"class":781},"      token",[697,1541,785],{"class":707},[697,1543,1088],{"class":714},[697,1545,1512],{"class":707},[697,1547,1548],{"class":714},"token",[697,1550,1518],{"class":707},[697,1552,1521],{"class":714},[697,1554,1109],{"class":707},[697,1556,1526],{"class":714},[697,1558,1109],{"class":707},[697,1560,1561],{"class":714},"LOKI_TOKEN",[697,1563,1534],{"class":707},[697,1565,1566,1568,1570],{"class":699,"line":791},[697,1567,1332],{"class":707},[697,1569,1193],{"class":781},[697,1571,718],{"class":707},[697,1573,1574,1576,1578,1580,1582,1584,1587,1589,1591,1593],{"class":699,"line":802},[697,1575,1179],{"class":969},[697,1577,785],{"class":707},[697,1579,1100],{"class":707},[697,1581,1186],{"class":976},[697,1583,873],{"class":707},[697,1585,1586],{"class":976}," config",[697,1588,1193],{"class":707},[697,1590,1045],{"class":768},[697,1592,1100],{"class":781},[697,1594,1011],{"class":707},[697,1596,1597,1599,1601,1603,1606,1608,1610,1612,1615,1617],{"class":699,"line":813},[697,1598,1205],{"class":781},[697,1600,785],{"class":707},[697,1602,1210],{"class":707},[697,1604,1605],{"class":714},"config",[697,1607,1109],{"class":707},[697,1609,1515],{"class":714},[697,1611,743],{"class":707},[697,1613,1614],{"class":752},"\u002Floki\u002Fapi\u002Fv1\u002Fpush",[697,1616,1234],{"class":707},[697,1618,718],{"class":707},[697,1620,1621,1623,1625],{"class":699,"line":819},[697,1622,1242],{"class":781},[697,1624,785],{"class":707},[697,1626,708],{"class":707},[697,1628,1629,1631,1633,1635,1637,1639,1641,1643],{"class":699,"line":824},[697,1630,1252],{"class":707},[697,1632,1255],{"class":781},[697,1634,870],{"class":707},[697,1636,785],{"class":707},[697,1638,749],{"class":707},[697,1640,1264],{"class":752},[697,1642,870],{"class":707},[697,1644,718],{"class":707},[697,1646,1647,1649,1651,1653,1655,1657,1659,1661,1663,1665],{"class":699,"line":855},[697,1648,1274],{"class":781},[697,1650,785],{"class":707},[697,1652,1279],{"class":707},[697,1654,1282],{"class":752},[697,1656,1285],{"class":707},[697,1658,1605],{"class":714},[697,1660,1109],{"class":707},[697,1662,1548],{"class":714},[697,1664,1294],{"class":707},[697,1666,718],{"class":707},[697,1668,1669],{"class":699,"line":897},[697,1670,1302],{"class":707},[697,1672,1673,1675,1677,1679,1681,1683,1685],{"class":699,"line":931},[697,1674,1308],{"class":781},[697,1676,785],{"class":707},[697,1678,1313],{"class":714},[697,1680,1109],{"class":707},[697,1682,1318],{"class":969},[697,1684,973],{"class":781},[697,1686,1011],{"class":707},[697,1688,1689,1692,1694,1697,1699,1702,1704,1707,1709,1711],{"class":699,"line":949},[697,1690,1691],{"class":781},"        streams",[697,1693,785],{"class":707},[697,1695,1696],{"class":714}," events",[697,1698,1109],{"class":707},[697,1700,1701],{"class":969},"map",[697,1703,973],{"class":781},[697,1705,1706],{"class":976},"e",[697,1708,1045],{"class":768},[697,1710,1100],{"class":781},[697,1712,1011],{"class":707},[697,1714,1715,1718,1720,1722,1725,1727,1730,1732,1735,1737,1740,1742,1744,1746,1749],{"class":699,"line":955},[697,1716,1717],{"class":781},"          stream",[697,1719,785],{"class":707},[697,1721,1386],{"class":707},[697,1723,1724],{"class":781}," service",[697,1726,785],{"class":707},[697,1728,1729],{"class":714}," e",[697,1731,1109],{"class":707},[697,1733,1734],{"class":714},"service",[697,1736,873],{"class":707},[697,1738,1739],{"class":781}," level",[697,1741,785],{"class":707},[697,1743,1729],{"class":714},[697,1745,1109],{"class":707},[697,1747,1748],{"class":714},"level",[697,1750,946],{"class":707},[697,1752,1753,1756,1758,1761,1764,1766,1769,1771,1774,1776,1778,1780,1783,1785,1788,1792,1794,1796,1798,1800,1802,1804,1806,1809],{"class":699,"line":960},[697,1754,1755],{"class":781},"          values",[697,1757,785],{"class":707},[697,1759,1760],{"class":781}," [[",[697,1762,1763],{"class":969},"String",[697,1765,973],{"class":781},[697,1767,1768],{"class":714},"Date",[697,1770,1109],{"class":707},[697,1772,1773],{"class":969},"parse",[697,1775,973],{"class":781},[697,1777,1706],{"class":714},[697,1779,1109],{"class":707},[697,1781,1782],{"class":714},"timestamp",[697,1784,1114],{"class":781},[697,1786,1787],{"class":707},"*",[697,1789,1791],{"class":1790},"sbssI"," 1e6",[697,1793,1193],{"class":781},[697,1795,873],{"class":707},[697,1797,1313],{"class":714},[697,1799,1109],{"class":707},[697,1801,1318],{"class":969},[697,1803,973],{"class":781},[697,1805,1706],{"class":714},[697,1807,1808],{"class":781},")]]",[697,1810,718],{"class":707},[697,1812,1813,1816,1819],{"class":699,"line":994},[697,1814,1815],{"class":707},"        }",[697,1817,1818],{"class":781},"))",[697,1820,718],{"class":707},[697,1822,1823,1826,1828],{"class":699,"line":1014},[697,1824,1825],{"class":707},"      }",[697,1827,1193],{"class":781},[697,1829,718],{"class":707},[697,1831,1832,1834,1836],{"class":699,"line":1031},[697,1833,1332],{"class":707},[697,1835,1193],{"class":781},[697,1837,718],{"class":707},[697,1839,1840,1842],{"class":699,"line":1050},[697,1841,1342],{"class":707},[697,1843,1091],{"class":781},[697,1845,1846],{"class":699,"line":1094},[697,1847,816],{"class":707},[667,1849,1851],{"id":1850},"standardized-config-priority","Standardized config priority",[471,1853,1854,1856],{},[513,1855,592],{}," walks the standard chain so users get the same configuration UX as built-in adapters:",[1858,1859,1860,1866,1872,1878],"ol",{},[558,1861,1862,1863,1865],{},"Explicit ",[513,1864,977],{}," passed to your factory",[558,1867,1868,1871],{},[513,1869,1870],{},"runtimeConfig.evlog.\u003Cnamespace>"," (Nuxt\u002FNitro)",[558,1873,1874,1877],{},[513,1875,1876],{},"runtimeConfig.\u003Cnamespace>"," (legacy Nuxt\u002FNitro)",[558,1879,1880,1883,1884,1887,1888,1891,1892,1894,1895,1193],{},[513,1881,1882],{},"\u003CNS>_\u003CFIELD>"," env vars (list ",[513,1885,1886],{},"NUXT_\u003CNS>_\u003CFIELD>"," in ",[513,1889,1890],{},"ConfigField.env"," for silent Nuxt compat; show only ",[513,1893,1882],{}," in error messages via ",[513,1896,1897],{},"formatPublicEnvKeys",[471,1899,1900,1901,612,1903,612,1905,612,1907,1909,1910,1912,1913,1915,1916,1919,1920,1923,1924,1927],{},"Field names should follow the project conventions: ",[513,1902,603],{},[513,1904,607],{},[513,1906,611],{},[513,1908,615],{},". If you're renaming an existing field (e.g. ",[513,1911,1548],{}," → ",[513,1914,603],{},"), keep both as ",[513,1917,1918],{},"ConfigField"," entries for one major version — see ",[513,1921,1922],{},"axiom.ts"," and ",[513,1925,1926],{},"better-stack.ts"," for the deprecation pattern.",[667,1929,1931],{"id":1930},"wiring-the-drain-into-your-framework","Wiring the drain into your framework",[471,1933,1934,1935,1938],{},"Once ",[513,1936,1937],{},"createMyServiceDrain()"," returns the drain, wire it like any other:",[1940,1941,1942,2055,2181,2239,2276,2307],"code-group",{},[687,1943,1946],{"className":689,"code":1944,"filename":1945,"language":692,"meta":693,"style":693},"\u002F\u002F server\u002Fplugins\u002Fevlog-drain.ts\nimport { createMyServiceDrain } from '~\u002Fserver\u002Futils\u002Fmy-drain'\n\nconst drain = createMyServiceDrain()\n\nexport default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('evlog:drain', drain)\n})\n","Nuxt \u002F Nitro",[513,1947,1948,1954,1973,1977,1991,1995,2018,2049],{"__ignoreMap":693},[697,1949,1950],{"class":699,"line":700},[697,1951,1953],{"class":1952},"sHwdD","\u002F\u002F server\u002Fplugins\u002Fevlog-drain.ts\n",[697,1955,1956,1958,1960,1962,1964,1966,1968,1971],{"class":699,"line":711},[697,1957,704],{"class":703},[697,1959,1386],{"class":707},[697,1961,970],{"class":714},[697,1963,1391],{"class":707},[697,1965,746],{"class":703},[697,1967,749],{"class":707},[697,1969,1970],{"class":752},"~\u002Fserver\u002Futils\u002Fmy-drain",[697,1972,755],{"class":707},[697,1974,1975],{"class":699,"line":721},[697,1976,762],{"emptyLinePlaceholder":761},[697,1978,1979,1981,1984,1986,1988],{"class":699,"line":729},[697,1980,827],{"class":768},[697,1982,1983],{"class":714}," drain ",[697,1985,849],{"class":707},[697,1987,970],{"class":969},[697,1989,1990],{"class":714},"()\n",[697,1992,1993],{"class":699,"line":740},[697,1994,762],{"emptyLinePlaceholder":761},[697,1996,1997,1999,2002,2005,2007,2009,2012,2014,2016],{"class":699,"line":758},[697,1998,963],{"class":703},[697,2000,2001],{"class":703}," default",[697,2003,2004],{"class":969}," defineNitroPlugin",[697,2006,973],{"class":714},[697,2008,973],{"class":707},[697,2010,2011],{"class":976},"nitroApp",[697,2013,1193],{"class":707},[697,2015,1045],{"class":768},[697,2017,708],{"class":707},[697,2019,2020,2023,2025,2028,2030,2033,2035,2037,2040,2042,2044,2047],{"class":699,"line":765},[697,2021,2022],{"class":714},"  nitroApp",[697,2024,1109],{"class":707},[697,2026,2027],{"class":714},"hooks",[697,2029,1109],{"class":707},[697,2031,2032],{"class":969},"hook",[697,2034,973],{"class":781},[697,2036,870],{"class":707},[697,2038,2039],{"class":752},"evlog:drain",[697,2041,870],{"class":707},[697,2043,873],{"class":707},[697,2045,2046],{"class":714}," drain",[697,2048,1091],{"class":781},[697,2050,2051,2053],{"class":699,"line":778},[697,2052,743],{"class":707},[697,2054,1091],{"class":714},[687,2056,2058],{"className":689,"code":2057,"filename":172,"language":692,"meta":693,"style":693},"\u002F\u002F lib\u002Fevlog.ts\nimport { createEvlog } from 'evlog\u002Fnext'\nimport { createMyServiceDrain } from '.\u002Fmy-drain'\n\nexport const { withEvlog, useLogger, log, createError } = createEvlog({\n  service: 'my-app',\n  drain: createMyServiceDrain(),\n})\n",[513,2059,2060,2065,2085,2104,2108,2145,2161,2175],{"__ignoreMap":693},[697,2061,2062],{"class":699,"line":700},[697,2063,2064],{"class":1952},"\u002F\u002F lib\u002Fevlog.ts\n",[697,2066,2067,2069,2071,2074,2076,2078,2080,2083],{"class":699,"line":711},[697,2068,704],{"class":703},[697,2070,1386],{"class":707},[697,2072,2073],{"class":714}," createEvlog",[697,2075,1391],{"class":707},[697,2077,746],{"class":703},[697,2079,749],{"class":707},[697,2081,2082],{"class":752},"evlog\u002Fnext",[697,2084,755],{"class":707},[697,2086,2087,2089,2091,2093,2095,2097,2099,2102],{"class":699,"line":721},[697,2088,704],{"class":703},[697,2090,1386],{"class":707},[697,2092,970],{"class":714},[697,2094,1391],{"class":707},[697,2096,746],{"class":703},[697,2098,749],{"class":707},[697,2100,2101],{"class":752},".\u002Fmy-drain",[697,2103,755],{"class":707},[697,2105,2106],{"class":699,"line":729},[697,2107,762],{"emptyLinePlaceholder":761},[697,2109,2110,2112,2115,2117,2120,2122,2125,2127,2130,2132,2135,2137,2139,2141,2143],{"class":699,"line":740},[697,2111,963],{"class":703},[697,2113,2114],{"class":768}," const",[697,2116,1386],{"class":707},[697,2118,2119],{"class":714}," withEvlog",[697,2121,873],{"class":707},[697,2123,2124],{"class":714}," useLogger",[697,2126,873],{"class":707},[697,2128,2129],{"class":714}," log",[697,2131,873],{"class":707},[697,2133,2134],{"class":714}," createError ",[697,2136,743],{"class":707},[697,2138,1059],{"class":707},[697,2140,2073],{"class":969},[697,2142,973],{"class":714},[697,2144,1011],{"class":707},[697,2146,2147,2150,2152,2154,2157,2159],{"class":699,"line":758},[697,2148,2149],{"class":781},"  service",[697,2151,785],{"class":707},[697,2153,749],{"class":707},[697,2155,2156],{"class":752},"my-app",[697,2158,870],{"class":707},[697,2160,718],{"class":707},[697,2162,2163,2166,2168,2170,2173],{"class":699,"line":765},[697,2164,2165],{"class":781},"  drain",[697,2167,785],{"class":707},[697,2169,970],{"class":969},[697,2171,2172],{"class":714},"()",[697,2174,718],{"class":707},[697,2176,2177,2179],{"class":699,"line":778},[697,2178,743],{"class":707},[697,2180,1091],{"class":714},[687,2182,2185],{"className":689,"code":2183,"filename":2184,"language":692,"meta":693,"style":693},"import { createMyServiceDrain } from '.\u002Fmy-drain'\napp.use(evlog({ drain: createMyServiceDrain() }))\n","Hono \u002F Express \u002F Elysia",[513,2186,2187,2205],{"__ignoreMap":693},[697,2188,2189,2191,2193,2195,2197,2199,2201,2203],{"class":699,"line":700},[697,2190,704],{"class":703},[697,2192,1386],{"class":707},[697,2194,970],{"class":714},[697,2196,1391],{"class":707},[697,2198,746],{"class":703},[697,2200,749],{"class":707},[697,2202,2101],{"class":752},[697,2204,755],{"class":707},[697,2206,2207,2210,2212,2215,2217,2220,2222,2225,2227,2229,2231,2234,2236],{"class":699,"line":711},[697,2208,2209],{"class":714},"app",[697,2211,1109],{"class":707},[697,2213,2214],{"class":969},"use",[697,2216,973],{"class":714},[697,2218,2219],{"class":969},"evlog",[697,2221,973],{"class":714},[697,2223,2224],{"class":707},"{",[697,2226,2046],{"class":781},[697,2228,785],{"class":707},[697,2230,970],{"class":969},[697,2232,2233],{"class":714},"() ",[697,2235,743],{"class":707},[697,2237,2238],{"class":714},"))\n",[687,2240,2242],{"className":689,"code":2241,"filename":207,"language":692,"meta":693,"style":693},"await app.register(evlog, { drain: createMyServiceDrain() })\n",[513,2243,2244],{"__ignoreMap":693},[697,2245,2246,2249,2252,2254,2257,2260,2262,2264,2266,2268,2270,2272,2274],{"class":699,"line":700},[697,2247,2248],{"class":703},"await",[697,2250,2251],{"class":714}," app",[697,2253,1109],{"class":707},[697,2255,2256],{"class":969},"register",[697,2258,2259],{"class":714},"(evlog",[697,2261,873],{"class":707},[697,2263,1386],{"class":707},[697,2265,2046],{"class":781},[697,2267,785],{"class":707},[697,2269,970],{"class":969},[697,2271,2233],{"class":714},[697,2273,743],{"class":707},[697,2275,1091],{"class":714},[687,2277,2279],{"className":689,"code":2278,"filename":192,"language":692,"meta":693,"style":693},"EvlogModule.forRoot({ drain: createMyServiceDrain() })\n",[513,2280,2281],{"__ignoreMap":693},[697,2282,2283,2286,2288,2291,2293,2295,2297,2299,2301,2303,2305],{"class":699,"line":700},[697,2284,2285],{"class":714},"EvlogModule",[697,2287,1109],{"class":707},[697,2289,2290],{"class":969},"forRoot",[697,2292,973],{"class":714},[697,2294,2224],{"class":707},[697,2296,2046],{"class":781},[697,2298,785],{"class":707},[697,2300,970],{"class":969},[697,2302,2233],{"class":714},[697,2304,743],{"class":707},[697,2306,1091],{"class":714},[687,2308,2310],{"className":689,"code":2309,"filename":227,"language":692,"meta":693,"style":693},"import { initLogger } from 'evlog'\nimport { createMyServiceDrain } from '.\u002Fmy-drain'\n\ninitLogger({ drain: createMyServiceDrain() })\n",[513,2311,2312,2331,2349,2353],{"__ignoreMap":693},[697,2313,2314,2316,2318,2321,2323,2325,2327,2329],{"class":699,"line":700},[697,2315,704],{"class":703},[697,2317,1386],{"class":707},[697,2319,2320],{"class":714}," initLogger",[697,2322,1391],{"class":707},[697,2324,746],{"class":703},[697,2326,749],{"class":707},[697,2328,2219],{"class":752},[697,2330,755],{"class":707},[697,2332,2333,2335,2337,2339,2341,2343,2345,2347],{"class":699,"line":711},[697,2334,704],{"class":703},[697,2336,1386],{"class":707},[697,2338,970],{"class":714},[697,2340,1391],{"class":707},[697,2342,746],{"class":703},[697,2344,749],{"class":707},[697,2346,2101],{"class":752},[697,2348,755],{"class":707},[697,2350,2351],{"class":699,"line":721},[697,2352,762],{"emptyLinePlaceholder":761},[697,2354,2355,2358,2360,2362,2364,2366,2368,2370,2372],{"class":699,"line":729},[697,2356,2357],{"class":969},"initLogger",[697,2359,973],{"class":714},[697,2361,2224],{"class":707},[697,2363,2046],{"class":781},[697,2365,785],{"class":707},[697,2367,970],{"class":969},[697,2369,2233],{"class":714},[697,2371,743],{"class":707},[697,2373,1091],{"class":714},[471,2375,2376,2377,2381],{},"For production, wrap it once in ",[480,2378,2379],{"href":431},[513,2380,651],{}," so events are batched and retried.",[667,2383,2385],{"id":2384},"filtering-and-transforming-events","Filtering and transforming events",[471,2387,2388,2390,2391,2394,2395,2397],{},[513,2389,684],{}," receives the full batch of ",[513,2392,2393],{},"WideEvent[]"," plus the resolved config. Filter or transform inline — returning ",[513,2396,629],{}," is a clean opt-out for that batch:",[687,2399,2401],{"className":689,"code":2400,"language":692,"meta":693,"style":693},"encode: (events, cfg) => {\n  const filtered = events.filter(e => e.level === 'error' && e.path !== '\u002Fhealth')\n  if (filtered.length === 0) return null\n\n  const payload = filtered.map(e => ({\n    ts: new Date(e.timestamp).getTime(),\n    severity: e.level.toUpperCase(),\n    attributes: { method: e.method, path: e.path, status: e.status, duration: e.duration },\n  }))\n\n  return {\n    url: `${cfg.endpoint}\u002Fv1\u002Fpush`,\n    headers: { 'Content-Type': 'application\u002Fjson' },\n    body: JSON.stringify(payload),\n  }\n}\n",[513,2402,2403,2424,2484,2511,2515,2540,2572,2594,2658,2664,2668,2674,2698,2723,2745,2750],{"__ignoreMap":693},[697,2404,2405,2408,2410,2412,2414,2416,2418,2420,2422],{"class":699,"line":700},[697,2406,2407],{"class":772},"encode",[697,2409,785],{"class":707},[697,2411,1100],{"class":707},[697,2413,1186],{"class":976},[697,2415,873],{"class":707},[697,2417,1056],{"class":976},[697,2419,1193],{"class":707},[697,2421,1045],{"class":768},[697,2423,708],{"class":707},[697,2425,2426,2429,2432,2434,2436,2438,2441,2443,2445,2447,2449,2451,2453,2456,2458,2460,2462,2465,2467,2469,2472,2475,2477,2480,2482],{"class":699,"line":711},[697,2427,2428],{"class":768},"  const",[697,2430,2431],{"class":714}," filtered",[697,2433,1059],{"class":707},[697,2435,1696],{"class":714},[697,2437,1109],{"class":707},[697,2439,2440],{"class":969},"filter",[697,2442,973],{"class":781},[697,2444,1706],{"class":976},[697,2446,1045],{"class":768},[697,2448,1729],{"class":714},[697,2450,1109],{"class":707},[697,2452,1748],{"class":714},[697,2454,2455],{"class":707}," ===",[697,2457,749],{"class":707},[697,2459,1127],{"class":752},[697,2461,870],{"class":707},[697,2463,2464],{"class":707}," &&",[697,2466,1729],{"class":714},[697,2468,1109],{"class":707},[697,2470,2471],{"class":714},"path",[697,2473,2474],{"class":707}," !==",[697,2476,749],{"class":707},[697,2478,2479],{"class":752},"\u002Fhealth",[697,2481,870],{"class":707},[697,2483,1091],{"class":781},[697,2485,2486,2489,2491,2494,2496,2499,2501,2504,2506,2509],{"class":699,"line":721},[697,2487,2488],{"class":703},"  if",[697,2490,1100],{"class":781},[697,2492,2493],{"class":714},"filtered",[697,2495,1109],{"class":707},[697,2497,2498],{"class":714},"length",[697,2500,2455],{"class":707},[697,2502,2503],{"class":1790}," 0",[697,2505,1114],{"class":781},[697,2507,2508],{"class":703},"return",[697,2510,1147],{"class":707},[697,2512,2513],{"class":699,"line":729},[697,2514,762],{"emptyLinePlaceholder":761},[697,2516,2517,2519,2522,2524,2526,2528,2530,2532,2534,2536,2538],{"class":699,"line":740},[697,2518,2428],{"class":768},[697,2520,2521],{"class":714}," payload",[697,2523,1059],{"class":707},[697,2525,2431],{"class":714},[697,2527,1109],{"class":707},[697,2529,1701],{"class":969},[697,2531,973],{"class":781},[697,2533,1706],{"class":976},[697,2535,1045],{"class":768},[697,2537,1100],{"class":781},[697,2539,1011],{"class":707},[697,2541,2542,2545,2547,2550,2553,2555,2557,2559,2561,2563,2565,2568,2570],{"class":699,"line":758},[697,2543,2544],{"class":781},"    ts",[697,2546,785],{"class":707},[697,2548,2549],{"class":707}," new",[697,2551,2552],{"class":969}," Date",[697,2554,973],{"class":781},[697,2556,1706],{"class":714},[697,2558,1109],{"class":707},[697,2560,1782],{"class":714},[697,2562,1193],{"class":781},[697,2564,1109],{"class":707},[697,2566,2567],{"class":969},"getTime",[697,2569,2172],{"class":781},[697,2571,718],{"class":707},[697,2573,2574,2577,2579,2581,2583,2585,2587,2590,2592],{"class":699,"line":765},[697,2575,2576],{"class":781},"    severity",[697,2578,785],{"class":707},[697,2580,1729],{"class":714},[697,2582,1109],{"class":707},[697,2584,1748],{"class":714},[697,2586,1109],{"class":707},[697,2588,2589],{"class":969},"toUpperCase",[697,2591,2172],{"class":781},[697,2593,718],{"class":707},[697,2595,2596,2599,2601,2603,2606,2608,2610,2612,2615,2617,2620,2622,2624,2626,2628,2630,2633,2635,2637,2639,2642,2644,2647,2649,2651,2653,2656],{"class":699,"line":778},[697,2597,2598],{"class":781},"    attributes",[697,2600,785],{"class":707},[697,2602,1386],{"class":707},[697,2604,2605],{"class":781}," method",[697,2607,785],{"class":707},[697,2609,1729],{"class":714},[697,2611,1109],{"class":707},[697,2613,2614],{"class":714},"method",[697,2616,873],{"class":707},[697,2618,2619],{"class":781}," path",[697,2621,785],{"class":707},[697,2623,1729],{"class":714},[697,2625,1109],{"class":707},[697,2627,2471],{"class":714},[697,2629,873],{"class":707},[697,2631,2632],{"class":781}," status",[697,2634,785],{"class":707},[697,2636,1729],{"class":714},[697,2638,1109],{"class":707},[697,2640,2641],{"class":714},"status",[697,2643,873],{"class":707},[697,2645,2646],{"class":781}," duration",[697,2648,785],{"class":707},[697,2650,1729],{"class":714},[697,2652,1109],{"class":707},[697,2654,2655],{"class":714},"duration",[697,2657,946],{"class":707},[697,2659,2660,2662],{"class":699,"line":791},[697,2661,1342],{"class":707},[697,2663,2238],{"class":781},[697,2665,2666],{"class":699,"line":802},[697,2667,762],{"emptyLinePlaceholder":761},[697,2669,2670,2672],{"class":699,"line":813},[697,2671,997],{"class":703},[697,2673,708],{"class":707},[697,2675,2676,2679,2681,2683,2685,2687,2689,2691,2694,2696],{"class":699,"line":819},[697,2677,2678],{"class":781},"    url",[697,2680,785],{"class":707},[697,2682,1210],{"class":707},[697,2684,1106],{"class":714},[697,2686,1109],{"class":707},[697,2688,607],{"class":714},[697,2690,743],{"class":707},[697,2692,2693],{"class":752},"\u002Fv1\u002Fpush",[697,2695,1234],{"class":707},[697,2697,718],{"class":707},[697,2699,2700,2703,2705,2707,2709,2711,2713,2715,2717,2719,2721],{"class":699,"line":824},[697,2701,2702],{"class":781},"    headers",[697,2704,785],{"class":707},[697,2706,1386],{"class":707},[697,2708,749],{"class":707},[697,2710,1255],{"class":781},[697,2712,870],{"class":707},[697,2714,785],{"class":707},[697,2716,749],{"class":707},[697,2718,1264],{"class":752},[697,2720,870],{"class":707},[697,2722,946],{"class":707},[697,2724,2725,2728,2730,2732,2734,2736,2738,2741,2743],{"class":699,"line":855},[697,2726,2727],{"class":781},"    body",[697,2729,785],{"class":707},[697,2731,1313],{"class":714},[697,2733,1109],{"class":707},[697,2735,1318],{"class":969},[697,2737,973],{"class":781},[697,2739,2740],{"class":714},"payload",[697,2742,1193],{"class":781},[697,2744,718],{"class":707},[697,2746,2747],{"class":699,"line":897},[697,2748,2749],{"class":707},"  }\n",[697,2751,2752],{"class":699,"line":931},[697,2753,816],{"class":707},[667,2755,2757,2759],{"id":2756},"definedrain-non-http-transports",[513,2758,537],{}," (non-HTTP transports)",[471,2761,2762,2763,2765],{},"If your destination requires gRPC, a vendor SDK, a queue client, a WebSocket, or a raw socket, drop one level lower with ",[513,2764,537],{},". You own the transport; the toolkit still gives you config resolution, error isolation, and a consistent shape.",[687,2767,2769],{"className":689,"code":2768,"language":692,"meta":693,"style":693},"import { defineDrain } from 'evlog\u002Ftoolkit'\n\nexport const createCustomTransportDrain = () =>\n  defineDrain\u003C{ apiKey: string }>({\n    name: 'custom',\n    resolve: async () => ({ apiKey: process.env.MY_KEY! }),\n    send: async (events, cfg) => {\n      await myVendorSdk.publish(events, { token: cfg.apiKey })\n    },\n  })\n",[513,2770,2771,2790,2794,2810,2830,2845,2884,2907,2942,2946],{"__ignoreMap":693},[697,2772,2773,2775,2777,2780,2782,2784,2786,2788],{"class":699,"line":700},[697,2774,704],{"class":703},[697,2776,1386],{"class":707},[697,2778,2779],{"class":714}," defineDrain",[697,2781,1391],{"class":707},[697,2783,746],{"class":703},[697,2785,749],{"class":707},[697,2787,543],{"class":752},[697,2789,755],{"class":707},[697,2791,2792],{"class":699,"line":711},[697,2793,762],{"emptyLinePlaceholder":761},[697,2795,2796,2798,2800,2803,2805,2807],{"class":699,"line":721},[697,2797,963],{"class":703},[697,2799,2114],{"class":768},[697,2801,2802],{"class":714}," createCustomTransportDrain ",[697,2804,849],{"class":707},[697,2806,1042],{"class":707},[697,2808,2809],{"class":768}," =>\n",[697,2811,2812,2815,2817,2820,2822,2824,2826,2828],{"class":699,"line":729},[697,2813,2814],{"class":969},"  defineDrain",[697,2816,1451],{"class":707},[697,2818,2819],{"class":781}," apiKey",[697,2821,785],{"class":707},[697,2823,1428],{"class":772},[697,2825,1468],{"class":707},[697,2827,973],{"class":714},[697,2829,1011],{"class":707},[697,2831,2832,2834,2836,2838,2841,2843],{"class":699,"line":740},[697,2833,1017],{"class":781},[697,2835,785],{"class":707},[697,2837,749],{"class":707},[697,2839,2840],{"class":752},"custom",[697,2842,870],{"class":707},[697,2844,718],{"class":707},[697,2846,2847,2849,2851,2853,2855,2857,2859,2861,2863,2865,2867,2869,2871,2873,2876,2878,2880,2882],{"class":699,"line":758},[697,2848,1034],{"class":969},[697,2850,785],{"class":707},[697,2852,1039],{"class":768},[697,2854,1042],{"class":707},[697,2856,1045],{"class":768},[697,2858,1100],{"class":714},[697,2860,2224],{"class":707},[697,2862,2819],{"class":781},[697,2864,785],{"class":707},[697,2866,1521],{"class":714},[697,2868,1109],{"class":707},[697,2870,1526],{"class":714},[697,2872,1109],{"class":707},[697,2874,2875],{"class":714},"MY_KEY",[697,2877,1103],{"class":707},[697,2879,1391],{"class":707},[697,2881,1193],{"class":714},[697,2883,718],{"class":707},[697,2885,2886,2889,2891,2893,2895,2897,2899,2901,2903,2905],{"class":699,"line":765},[697,2887,2888],{"class":969},"    send",[697,2890,785],{"class":707},[697,2892,1039],{"class":768},[697,2894,1100],{"class":707},[697,2896,1186],{"class":976},[697,2898,873],{"class":707},[697,2900,1056],{"class":976},[697,2902,1193],{"class":707},[697,2904,1045],{"class":768},[697,2906,708],{"class":707},[697,2908,2909,2912,2915,2917,2920,2922,2924,2926,2928,2930,2932,2934,2936,2938,2940],{"class":699,"line":778},[697,2910,2911],{"class":703},"      await",[697,2913,2914],{"class":714}," myVendorSdk",[697,2916,1109],{"class":707},[697,2918,2919],{"class":969},"publish",[697,2921,973],{"class":781},[697,2923,1186],{"class":714},[697,2925,873],{"class":707},[697,2927,1386],{"class":707},[697,2929,1433],{"class":781},[697,2931,785],{"class":707},[697,2933,1056],{"class":714},[697,2935,1109],{"class":707},[697,2937,603],{"class":714},[697,2939,1391],{"class":707},[697,2941,1091],{"class":781},[697,2943,2944],{"class":699,"line":791},[697,2945,1173],{"class":707},[697,2947,2948,2950],{"class":699,"line":802},[697,2949,1342],{"class":707},[697,2951,1091],{"class":714},[471,2953,2954,2955,2957,2958,2960,2961,2964,2965,2968],{},"When you fall back to ",[513,2956,537],{},", follow the same rules manually that ",[513,2959,524],{}," enforces: wrap the transport in ",[513,2962,2963],{},"try\u002Fcatch",", log with ",[513,2966,2967],{},"console.error('[evlog\u002F\u003Cname>] …')",", and never re-throw.",[667,2970,2972],{"id":2971},"draincontext-reference","DrainContext reference",[471,2974,2975,2976,2978,2979,2982],{},"When evlog calls your drain through ",[513,2977,2039],{},", it passes a ",[513,2980,2981],{},"DrainContext"," per event:",[687,2984,2987],{"className":689,"code":2985,"filename":2986,"language":692,"meta":693,"style":693},"interface DrainContext {\n  \u002F** The complete wide event with all accumulated context *\u002F\n  event: WideEvent\n\n  \u002F** Request metadata *\u002F\n  request?: {\n    method: string\n    path: string\n    requestId: string\n  }\n\n  \u002F** Safe HTTP headers (sensitive headers filtered) *\u002F\n  headers?: Record\u003Cstring, string>\n}\n\ninterface WideEvent {\n  timestamp: string\n  level: 'debug' | 'info' | 'warn' | 'error'\n  service: string\n  environment?: string\n  version?: string\n  region?: string\n  commitHash?: string\n  requestId?: string\n  \u002F\u002F ... plus all fields added via log.set()\n  [key: string]: unknown\n}\n","types.ts",[513,2988,2989,2998,3003,3013,3017,3022,3031,3040,3049,3058,3062,3066,3071,3093,3097,3101,3110,3119,3160,3168,3177,3186,3195,3204,3213,3218,3238],{"__ignoreMap":693},[697,2990,2991,2993,2996],{"class":699,"line":700},[697,2992,769],{"class":768},[697,2994,2995],{"class":772}," DrainContext",[697,2997,708],{"class":707},[697,2999,3000],{"class":699,"line":711},[697,3001,3002],{"class":1952},"  \u002F** The complete wide event with all accumulated context *\u002F\n",[697,3004,3005,3008,3010],{"class":699,"line":721},[697,3006,3007],{"class":781},"  event",[697,3009,785],{"class":707},[697,3011,3012],{"class":772}," WideEvent\n",[697,3014,3015],{"class":699,"line":729},[697,3016,762],{"emptyLinePlaceholder":761},[697,3018,3019],{"class":699,"line":740},[697,3020,3021],{"class":1952},"  \u002F** Request metadata *\u002F\n",[697,3023,3024,3027,3029],{"class":699,"line":758},[697,3025,3026],{"class":781},"  request",[697,3028,797],{"class":707},[697,3030,708],{"class":707},[697,3032,3033,3036,3038],{"class":699,"line":765},[697,3034,3035],{"class":781},"    method",[697,3037,785],{"class":707},[697,3039,788],{"class":772},[697,3041,3042,3045,3047],{"class":699,"line":778},[697,3043,3044],{"class":781},"    path",[697,3046,785],{"class":707},[697,3048,788],{"class":772},[697,3050,3051,3054,3056],{"class":699,"line":791},[697,3052,3053],{"class":781},"    requestId",[697,3055,785],{"class":707},[697,3057,788],{"class":772},[697,3059,3060],{"class":699,"line":802},[697,3061,2749],{"class":707},[697,3063,3064],{"class":699,"line":813},[697,3065,762],{"emptyLinePlaceholder":761},[697,3067,3068],{"class":699,"line":819},[697,3069,3070],{"class":1952},"  \u002F** Safe HTTP headers (sensitive headers filtered) *\u002F\n",[697,3072,3073,3076,3078,3081,3083,3086,3088,3090],{"class":699,"line":824},[697,3074,3075],{"class":781},"  headers",[697,3077,797],{"class":707},[697,3079,3080],{"class":772}," Record",[697,3082,837],{"class":707},[697,3084,3085],{"class":772},"string",[697,3087,873],{"class":707},[697,3089,1428],{"class":772},[697,3091,3092],{"class":707},">\n",[697,3094,3095],{"class":699,"line":855},[697,3096,816],{"class":707},[697,3098,3099],{"class":699,"line":897},[697,3100,762],{"emptyLinePlaceholder":761},[697,3102,3103,3105,3108],{"class":699,"line":931},[697,3104,769],{"class":768},[697,3106,3107],{"class":772}," WideEvent",[697,3109,708],{"class":707},[697,3111,3112,3115,3117],{"class":699,"line":949},[697,3113,3114],{"class":781},"  timestamp",[697,3116,785],{"class":707},[697,3118,788],{"class":772},[697,3120,3121,3124,3126,3128,3131,3133,3136,3138,3141,3143,3145,3147,3150,3152,3154,3156,3158],{"class":699,"line":955},[697,3122,3123],{"class":781},"  level",[697,3125,785],{"class":707},[697,3127,749],{"class":707},[697,3129,3130],{"class":752},"debug",[697,3132,870],{"class":707},[697,3134,3135],{"class":707}," |",[697,3137,749],{"class":707},[697,3139,3140],{"class":752},"info",[697,3142,870],{"class":707},[697,3144,3135],{"class":707},[697,3146,749],{"class":707},[697,3148,3149],{"class":752},"warn",[697,3151,870],{"class":707},[697,3153,3135],{"class":707},[697,3155,749],{"class":707},[697,3157,1127],{"class":752},[697,3159,755],{"class":707},[697,3161,3162,3164,3166],{"class":699,"line":960},[697,3163,2149],{"class":781},[697,3165,785],{"class":707},[697,3167,788],{"class":772},[697,3169,3170,3173,3175],{"class":699,"line":994},[697,3171,3172],{"class":781},"  environment",[697,3174,797],{"class":707},[697,3176,788],{"class":772},[697,3178,3179,3182,3184],{"class":699,"line":1014},[697,3180,3181],{"class":781},"  version",[697,3183,797],{"class":707},[697,3185,788],{"class":772},[697,3187,3188,3191,3193],{"class":699,"line":1031},[697,3189,3190],{"class":781},"  region",[697,3192,797],{"class":707},[697,3194,788],{"class":772},[697,3196,3197,3200,3202],{"class":699,"line":1050},[697,3198,3199],{"class":781},"  commitHash",[697,3201,797],{"class":707},[697,3203,788],{"class":772},[697,3205,3206,3209,3211],{"class":699,"line":1094},[697,3207,3208],{"class":781},"  requestId",[697,3210,797],{"class":707},[697,3212,788],{"class":772},[697,3214,3215],{"class":699,"line":1119},[697,3216,3217],{"class":1952},"  \u002F\u002F ... plus all fields added via log.set()\n",[697,3219,3220,3223,3226,3228,3230,3233,3235],{"class":699,"line":1141},[697,3221,3222],{"class":714},"  [",[697,3224,3225],{"class":976},"key",[697,3227,785],{"class":707},[697,3229,1428],{"class":772},[697,3231,3232],{"class":714},"]",[697,3234,785],{"class":707},[697,3236,3237],{"class":772}," unknown\n",[697,3239,3240],{"class":699,"line":1150},[697,3241,816],{"class":707},[471,3243,3244,3245,3247,3248,3251,3252,3254,3255,3258],{},"In the batched form your ",[513,3246,684],{}," \u002F ",[513,3249,3250],{},"send()"," receives, you get ",[513,3253,2393],{}," directly (the toolkit unwraps ",[513,3256,3257],{},"event"," from each context).",[667,3260,3262],{"id":3261},"toolkit-helpers","Toolkit helpers",[471,3264,3265,3267],{},[513,3266,543],{}," exposes the same helpers every built-in adapter uses. The ones relevant to drains:",[488,3269,3270,3280],{},[491,3271,3272],{},[494,3273,3274,3277],{},[497,3275,3276],{},"Export",[497,3278,3279],{},"Purpose",[504,3281,3282,3292,3302,3314,3324,3337,3347,3361],{},[494,3283,3284,3289],{},[509,3285,3286],{},[513,3287,3288],{},"defineHttpDrain(spec)",[509,3290,3291],{},"The HTTP recipe — auto retries, timeouts, identity headers, error isolation",[494,3293,3294,3299],{},[509,3295,3296],{},[513,3297,3298],{},"defineDrain(spec)",[509,3300,3301],{},"Same contract for non-HTTP transports",[494,3303,3304,3309],{},[509,3305,3306],{},[513,3307,3308],{},"resolveAdapterConfig(ns, fields, overrides)",[509,3310,3311,3312,597],{},"Standard config priority chain (overrides → ",[513,3313,596],{},[494,3315,3316,3321],{},[509,3317,3318],{},[513,3319,3320],{},"httpPost(opts)",[509,3322,3323],{},"The retried POST helper used by every built-in HTTP adapter — handles timeout, retries, redacted error messages",[494,3325,3326,3331],{},[509,3327,3328],{},[513,3329,3330],{},"composeDrains(drains)",[509,3332,3333,3334,1193],{},"Combine multiple drains into one (errors isolated, runs concurrently with ",[513,3335,3336],{},"Promise.allSettled",[494,3338,3339,3344],{},[509,3340,3341],{},[513,3342,3343],{},"toTypedAttributeValue(value)",[509,3345,3346],{},"Convert any value to the typed attribute shape used by Axiom \u002F Sentry",[494,3348,3349,3354],{},[509,3350,3351],{},[513,3352,3353],{},"toOtlpAttributeValue(value)",[509,3355,3356,3357,3360],{},"Convert any value to the OTLP ",[513,3358,3359],{},"AnyValue"," shape (used by OTLP \u002F HyperDX \u002F PostHog logs)",[494,3362,3363,3371],{},[509,3364,3365,612,3368],{},[513,3366,3367],{},"OTEL_SEVERITY_NUMBER",[513,3369,3370],{},"OTEL_SEVERITY_TEXT",[509,3372,3373],{},"OTEL log severity tables",[667,3375,420],{"id":3376},"identity-headers",[471,3378,3379,3381],{},[513,3380,524],{}," automatically tags every request with two headers so receivers can identify the traffic:",[488,3383,3384,3394],{},[491,3385,3386],{},[494,3387,3388,3391],{},[497,3389,3390],{},"Header",[497,3392,3393],{},"Value",[504,3395,3396,3409],{},[494,3397,3398,3403],{},[509,3399,3400],{},[513,3401,3402],{},"User-Agent",[509,3404,3405,3408],{},[513,3406,3407],{},"evlog\u002F\u003Cversion>"," (Node \u002F server runtimes only — browsers strip this header)",[494,3410,3411,3416],{},[509,3412,3413],{},[513,3414,3415],{},"X-Evlog-Source",[509,3417,3418,3419,3422],{},"The drain ",[513,3420,3421],{},"name"," you provided",[471,3424,3425,3426,3429,3430,1109],{},"If you build a drain on top of ",[513,3427,3428],{},"httpPost"," directly, you can override or suppress them — see ",[480,3431,420],{"href":421},[667,3433,3435],{"id":3434},"error-handling-already-done-for-you","Error handling — already done for you",[471,3437,3438,3440],{},[513,3439,524],{}," enforces every best practice automatically:",[1858,3442,3443,3453,3463,3471],{},[558,3444,3445,3448,3449,3452],{},[475,3446,3447],{},"Never throws"," — failures are caught and logged with the ",[513,3450,3451],{},"[evlog\u002F\u003Cname>]"," prefix.",[558,3454,3455,3458,3459,3462],{},[475,3456,3457],{},"Retries"," — defaults to 2 attempts on transient errors (configurable via ",[513,3460,3461],{},"retries",").",[558,3464,3465,3468,3469,3462],{},[475,3466,3467],{},"Timeouts"," — defaults to 5000ms (configurable via ",[513,3470,615],{},[558,3472,3473,3476,3477,3479,3480,3482],{},[475,3474,3475],{},"Graceful degradation"," — ",[513,3478,588],{}," returning ",[513,3481,629],{}," makes the drain a no-op.",[471,3484,3485,3486,3488],{},"If you fall back to ",[513,3487,537],{},", follow the same rules manually.",[667,3490,3492],{"id":3491},"publishing-as-a-community-package","Publishing as a community package",[471,3494,3495],{},"Recommended structure for a community drain:",[687,3497,3502],{"className":3498,"code":3500,"language":3501,"meta":693},[3499],"language-text","my-evlog-drain\u002F\n├─ src\u002F\n│  ├─ drain.ts        # createMyDrain via defineHttpDrain\n│  └─ index.ts        # re-exports\n├─ test\u002F              # vitest, mock fetch\n├─ package.json       # peerDependency: \"evlog\"\n└─ README.md\n","text",[513,3503,3500],{"__ignoreMap":693},[471,3505,3506,3507,3509,3510,3513,3514,3517],{},"Add ",[513,3508,2219],{}," as a ",[513,3511,3512],{},"peerDependency"," (not a ",[513,3515,3516],{},"dependency",") — your package shouldn't pull in a copy of evlog at install time.",[3519,3520,3523,3524,3529],"callout",{"color":3521,"icon":3522},"neutral","i-lucide-heart","Built something great? ",[480,3525,3528],{"href":3526,"rel":3527},"https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Fpulls",[660],"Open a PR"," to add a row to the Adapters table — the community will thank you.",[667,3531,3533],{"id":3532},"next-steps","Next steps",[555,3535,3536,3542,3550,3556,3562],{},[558,3537,3538,3541],{},[480,3539,3540],{"href":431},"Drain Pipeline"," — wrap your drain in batch + retry + fanout for production",[558,3543,3544,3547,3548],{},[480,3545,3546],{"href":95},"Adapters Overview"," — see how the built-in adapters use ",[513,3549,524],{},[558,3551,3552,3555],{},[480,3553,3554],{"href":413},"Custom Enrichers"," — same toolkit shape for derived event fields",[558,3557,3558,3561],{},[480,3559,3560],{"href":395},"Custom Framework Integration"," — same toolkit shape for HTTP frameworks",[558,3563,3564,3566],{},[480,3565,452],{"href":453}," — security and production tips",[3568,3569,3570],"style",{},"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 .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 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 .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}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}",{"title":693,"searchDepth":711,"depth":711,"links":3572},[3573,3577,3578,3579,3580,3582,3583,3584,3585,3586,3587],{"id":669,"depth":711,"text":3574,"children":3575},"defineHttpDrain (the HTTP recipe)",[3576],{"id":1367,"depth":721,"text":1368},{"id":1850,"depth":711,"text":1851},{"id":1930,"depth":711,"text":1931},{"id":2384,"depth":711,"text":2385},{"id":2756,"depth":711,"text":3581},"defineDrain (non-HTTP transports)",{"id":2971,"depth":711,"text":2972},{"id":3261,"depth":711,"text":3262},{"id":3376,"depth":711,"text":420},{"id":3434,"depth":711,"text":3435},{"id":3491,"depth":711,"text":3492},{"id":3532,"depth":711,"text":3533},"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.","md",[3591,3593,3595],{"label":3540,"icon":433,"to":431,"color":3521,"variant":3592},"subtle",{"label":3546,"icon":3594,"to":95,"color":3521,"variant":3592},"i-custom-plug",{"label":452,"icon":318,"to":453,"color":3521,"variant":3592},{},{"title":425,"icon":428},{"title":466,"description":3588},"VWIF4Ukbsyqqh5iFwEzVwOVU0E3mxJiHw2LxW1N1_60",[3601,3603],{"title":420,"path":421,"stem":422,"description":3602,"icon":423,"children":-1},"Every drain request sent by evlog is tagged with User-Agent and X-Evlog-Source headers so receivers can identify and triage the traffic. Override or suppress them when your custom drain needs different identity.",{"title":430,"path":431,"stem":432,"description":3604,"icon":433,"children":-1},"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.",1784213446794]