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