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