[{"data":1,"prerenderedAt":2364},["ShallowReactive",2],{"navigation_docs":3,"-adapters-building-blocks-http":429,"-adapters-building-blocks-http-surround":2359},[4,35,159,201,289,326,413],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Getting Started","\u002Fgetting-started","1.getting-started",[9,14,19,24,29],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","\u002Fgetting-started\u002Fagent-skills","1.getting-started\u002F4.agent-skills","i-lucide-sparkles",{"title":30,"path":31,"stem":32,"icon":33},"vs Other Loggers","\u002Fgetting-started\u002Fvs-other-loggers","1.getting-started\u002F5.vs-other-loggers","i-lucide-scale",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Logging","\u002Flogging","2.logging",[40,45,50,55,60,65,70,99,127],{"title":41,"path":42,"stem":43,"icon":44},"Overview","\u002Flogging\u002Foverview","2.logging\u002F0.overview","i-lucide-list",{"title":46,"path":47,"stem":48,"icon":49},"Simple Logging","\u002Flogging\u002Fsimple-logging","2.logging\u002F1.simple-logging","i-lucide-terminal",{"title":51,"path":52,"stem":53,"icon":54},"Wide Events","\u002Flogging\u002Fwide-events","2.logging\u002F2.wide-events","i-lucide-layers",{"title":56,"path":57,"stem":58,"icon":59},"Structured Errors","\u002Flogging\u002Fstructured-errors","2.logging\u002F3.structured-errors","i-lucide-shield-alert",{"title":61,"path":62,"stem":63,"icon":64},"Catalogs","\u002Flogging\u002Fcatalogs","2.logging\u002F4.catalogs","i-lucide-book-open",{"title":66,"path":67,"stem":68,"icon":69},"Client Logging","\u002Flogging\u002Fclient-logging","2.logging\u002F5.client-logging","i-lucide-monitor",{"title":71,"icon":72,"path":73,"stem":74,"children":75,"page":34},"AI SDK","i-simple-icons-vercel","\u002Flogging\u002Fai-sdk","2.logging\u002F6.ai-sdk",[76,79,84,89,94],{"title":41,"path":77,"stem":78,"icon":44},"\u002Flogging\u002Fai-sdk\u002Foverview","2.logging\u002F6.ai-sdk\u002F01.overview",{"title":80,"path":81,"stem":82,"icon":83},"Usage","\u002Flogging\u002Fai-sdk\u002Fusage","2.logging\u002F6.ai-sdk\u002F02.usage","i-lucide-code",{"title":85,"path":86,"stem":87,"icon":88},"Options","\u002Flogging\u002Fai-sdk\u002Foptions","2.logging\u002F6.ai-sdk\u002F03.options","i-lucide-sliders",{"title":90,"path":91,"stem":92,"icon":93},"Metadata","\u002Flogging\u002Fai-sdk\u002Fmetadata","2.logging\u002F6.ai-sdk\u002F04.metadata","i-lucide-database",{"title":95,"path":96,"stem":97,"icon":98},"Telemetry","\u002Flogging\u002Fai-sdk\u002Ftelemetry","2.logging\u002F6.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":100,"icon":101,"path":102,"stem":103,"children":104,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Flogging\u002Fbetter-auth","2.logging\u002F7.better-auth",[105,108,113,118,122],{"title":41,"path":106,"stem":107,"icon":44},"\u002Flogging\u002Fbetter-auth\u002Foverview","2.logging\u002F7.better-auth\u002F01.overview",{"title":109,"path":110,"stem":111,"icon":112},"Identify User","\u002Flogging\u002Fbetter-auth\u002Fidentify-user","2.logging\u002F7.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":114,"path":115,"stem":116,"icon":117},"Middleware","\u002Flogging\u002Fbetter-auth\u002Fmiddleware","2.logging\u002F7.better-auth\u002F03.middleware","i-lucide-shield",{"title":119,"path":120,"stem":121,"icon":69},"Client Sync","\u002Flogging\u002Fbetter-auth\u002Fclient-sync","2.logging\u002F7.better-auth\u002F04.client-sync",{"title":123,"path":124,"stem":125,"icon":126},"Performance","\u002Flogging\u002Fbetter-auth\u002Fperformance","2.logging\u002F7.better-auth\u002F05.performance","i-lucide-gauge",{"title":128,"icon":129,"path":130,"stem":131,"children":132,"page":34},"Audit Logs","i-lucide-shield-check","\u002Flogging\u002Faudit","2.logging\u002F8.audit",[133,136,141,146,151,155],{"title":41,"path":134,"stem":135,"icon":44},"\u002Flogging\u002Faudit\u002Foverview","2.logging\u002F8.audit\u002F01.overview",{"title":137,"path":138,"stem":139,"icon":140},"Schema","\u002Flogging\u002Faudit\u002Fschema","2.logging\u002F8.audit\u002F02.schema","i-lucide-file-text",{"title":142,"path":143,"stem":144,"icon":145},"Recording","\u002Flogging\u002Faudit\u002Frecording","2.logging\u002F8.audit\u002F03.recording","i-lucide-pen-line",{"title":147,"path":148,"stem":149,"icon":150},"Drains","\u002Flogging\u002Faudit\u002Fpipeline","2.logging\u002F8.audit\u002F04.pipeline","i-lucide-link",{"title":152,"path":153,"stem":154,"icon":129},"Compliance","\u002Flogging\u002Faudit\u002Fcompliance","2.logging\u002F8.audit\u002F05.compliance",{"title":156,"path":157,"stem":158,"icon":64},"Recipes","\u002Flogging\u002Faudit\u002Frecipes","2.logging\u002F8.audit\u002F06.recipes",{"title":160,"path":161,"stem":162,"children":163,"page":34},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[164,169,174,179,184,188,191,196],{"title":165,"path":166,"stem":167,"icon":168},"Lifecycle","\u002Fcore-concepts\u002Flifecycle","3.core-concepts\u002F0.lifecycle","i-lucide-arrow-right-left",{"title":170,"path":171,"stem":172,"icon":173},"Configuration","\u002Fcore-concepts\u002Fconfiguration","3.core-concepts\u002F1.configuration","i-lucide-settings",{"title":175,"path":176,"stem":177,"icon":178},"Sampling","\u002Fcore-concepts\u002Fsampling","3.core-concepts\u002F2.sampling","i-lucide-filter",{"title":180,"path":181,"stem":182,"icon":183},"Typed Fields","\u002Fcore-concepts\u002Ftyped-fields","3.core-concepts\u002F3.typed-fields","i-simple-icons-typescript",{"title":185,"path":186,"stem":187,"icon":129},"Best Practices","\u002Fcore-concepts\u002Fbest-practices","3.core-concepts\u002F4.best-practices",{"title":123,"path":189,"stem":190,"icon":126},"\u002Fcore-concepts\u002Fperformance","3.core-concepts\u002F5.performance",{"title":192,"path":193,"stem":194,"icon":195},"Vite Plugin","\u002Fcore-concepts\u002Fvite-plugin","3.core-concepts\u002F6.vite-plugin","i-custom-vite",{"title":197,"path":198,"stem":199,"icon":200},"Auto-Redaction","\u002Fcore-concepts\u002Fredaction","3.core-concepts\u002F7.redaction","i-lucide-eye-off",{"title":202,"path":203,"stem":204,"children":205,"page":34},"Frameworks","\u002Fframeworks","4.frameworks",[206,210,215,220,225,230,235,240,245,250,255,260,265,270,274,279,284],{"title":41,"path":207,"stem":208,"icon":209},"\u002Fframeworks\u002Foverview","4.frameworks\u002F00.overview","i-lucide-layout-grid",{"title":211,"path":212,"stem":213,"icon":214},"Nuxt","\u002Fframeworks\u002Fnuxt","4.frameworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":216,"path":217,"stem":218,"icon":219},"Next.js","\u002Fframeworks\u002Fnextjs","4.frameworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":221,"path":222,"stem":223,"icon":224},"SvelteKit","\u002Fframeworks\u002Fsveltekit","4.frameworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":226,"path":227,"stem":228,"icon":229},"Nitro","\u002Fframeworks\u002Fnitro","4.frameworks\u002F04.nitro","i-custom-nitro",{"title":231,"path":232,"stem":233,"icon":234},"TanStack Start","\u002Fframeworks\u002Ftanstack-start","4.frameworks\u002F05.tanstack-start","i-custom-tanstack",{"title":236,"path":237,"stem":238,"icon":239},"NestJS","\u002Fframeworks\u002Fnestjs","4.frameworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":241,"path":242,"stem":243,"icon":244},"Express","\u002Fframeworks\u002Fexpress","4.frameworks\u002F07.express","i-simple-icons-express",{"title":246,"path":247,"stem":248,"icon":249},"Hono","\u002Fframeworks\u002Fhono","4.frameworks\u002F08.hono","i-simple-icons-hono",{"title":251,"path":252,"stem":253,"icon":254},"Fastify","\u002Fframeworks\u002Ffastify","4.frameworks\u002F09.fastify","i-simple-icons-fastify",{"title":256,"path":257,"stem":258,"icon":259},"Elysia","\u002Fframeworks\u002Felysia","4.frameworks\u002F10.elysia","i-custom-elysia",{"title":261,"path":262,"stem":263,"icon":264},"React Router","\u002Fframeworks\u002Freact-router","4.frameworks\u002F11.react-router","i-custom-reactrouter",{"title":266,"path":267,"stem":268,"icon":269},"Cloudflare Workers","\u002Fframeworks\u002Fcloudflare-workers","4.frameworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":271,"path":272,"stem":273,"icon":183},"Standalone","\u002Fframeworks\u002Fstandalone","4.frameworks\u002F13.standalone",{"title":275,"path":276,"stem":277,"icon":278},"Astro","\u002Fframeworks\u002Fastro","4.frameworks\u002F14.astro","i-simple-icons-astro",{"title":280,"path":281,"stem":282,"icon":283},"AWS Lambda","\u002Fframeworks\u002Faws-lambda","4.frameworks\u002F16.aws-lambda","i-custom-lambda",{"title":285,"path":286,"stem":287,"icon":288},"Custom Integration","\u002Fframeworks\u002Fcustom-integration","4.frameworks\u002F17.custom-integration","i-lucide-puzzle",{"title":290,"path":291,"stem":292,"children":293,"page":34},"Build on top","\u002Fbuild-on-top","5.build-on-top",[294,297,302,307,312,317,321],{"title":41,"path":295,"stem":296,"icon":54},"\u002Fbuild-on-top\u002Foverview","5.build-on-top\u002F0.overview",{"title":298,"path":299,"stem":300,"icon":301},"Stream API","\u002Fbuild-on-top\u002Fstream-api","5.build-on-top\u002F1.stream-api","i-lucide-radio-tower",{"title":303,"path":304,"stem":305,"icon":306},"Stream server","\u002Fbuild-on-top\u002Fstream-server","5.build-on-top\u002F2.stream-server","i-lucide-radio",{"title":308,"path":309,"stem":310,"icon":311},"FS reader","\u002Fbuild-on-top\u002Ffs-reader","5.build-on-top\u002F3.fs-reader","i-lucide-folder-search",{"title":313,"path":314,"stem":315,"icon":316},"Identity headers","\u002Fbuild-on-top\u002Fidentity-headers","5.build-on-top\u002F4.identity-headers","i-lucide-fingerprint",{"title":156,"path":318,"stem":319,"icon":320},"\u002Fbuild-on-top\u002Frecipes","5.build-on-top\u002F5.recipes","i-lucide-chef-hat",{"title":322,"path":323,"stem":324,"icon":325},"Catalogs as packages","\u002Fbuild-on-top\u002Fcatalogs-as-packages","5.build-on-top\u002F6.catalogs-as-packages","i-lucide-package",{"title":327,"path":328,"stem":329,"children":330,"page":34},"Adapters","\u002Fadapters","6.adapters",[331,334,374,389],{"title":41,"path":332,"stem":333,"icon":44},"\u002Fadapters\u002Foverview","6.adapters\u002F01.overview",{"title":335,"path":336,"stem":337,"children":338,"page":34},"Cloud destinations","\u002Fadapters\u002Fcloud","6.adapters\u002F02.cloud",[339,344,349,354,359,364,369],{"title":340,"path":341,"stem":342,"icon":343},"Axiom","\u002Fadapters\u002Fcloud\u002Faxiom","6.adapters\u002F02.cloud\u002F01.axiom","i-custom-axiom",{"title":345,"path":346,"stem":347,"icon":348},"OTLP","\u002Fadapters\u002Fcloud\u002Fotlp","6.adapters\u002F02.cloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":350,"path":351,"stem":352,"icon":353},"PostHog","\u002Fadapters\u002Fcloud\u002Fposthog","6.adapters\u002F02.cloud\u002F03.posthog","i-simple-icons-posthog",{"title":355,"path":356,"stem":357,"icon":358},"Sentry","\u002Fadapters\u002Fcloud\u002Fsentry","6.adapters\u002F02.cloud\u002F04.sentry","i-simple-icons-sentry",{"title":360,"path":361,"stem":362,"icon":363},"Better Stack","\u002Fadapters\u002Fcloud\u002Fbetter-stack","6.adapters\u002F02.cloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":365,"path":366,"stem":367,"icon":368},"Datadog","\u002Fadapters\u002Fcloud\u002Fdatadog","6.adapters\u002F02.cloud\u002F06.datadog","i-simple-icons-datadog",{"title":370,"path":371,"stem":372,"icon":373},"HyperDX","\u002Fadapters\u002Fcloud\u002Fhyperdx","6.adapters\u002F02.cloud\u002F07.hyperdx","i-custom-hyperdx",{"title":375,"path":376,"stem":377,"children":378,"page":34},"Self-hosted","\u002Fadapters\u002Fself-hosted","6.adapters\u002F03.self-hosted",[379,384],{"title":380,"path":381,"stem":382,"icon":383},"File System","\u002Fadapters\u002Fself-hosted\u002Ffs","6.adapters\u002F03.self-hosted\u002F01.fs","i-lucide-hard-drive",{"title":385,"path":386,"stem":387,"icon":388},"NuxtHub","\u002Fadapters\u002Fself-hosted\u002Fnuxthub","6.adapters\u002F03.self-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":390,"path":391,"stem":392,"children":393,"page":34},"Building blocks","\u002Fadapters\u002Fbuilding-blocks","6.adapters\u002F04.building-blocks",[394,399,404,408],{"title":395,"path":396,"stem":397,"icon":398},"Pipeline","\u002Fadapters\u002Fbuilding-blocks\u002Fpipeline","6.adapters\u002F04.building-blocks\u002F01.pipeline","i-lucide-workflow",{"title":400,"path":401,"stem":402,"icon":403},"HTTP","\u002Fadapters\u002Fbuilding-blocks\u002Fhttp","6.adapters\u002F04.building-blocks\u002F02.http","i-lucide-globe",{"title":405,"path":406,"stem":407,"icon":83},"Custom Adapters","\u002Fadapters\u002Fbuilding-blocks\u002Fcustom","6.adapters\u002F04.building-blocks\u002F03.custom",{"title":409,"path":410,"stem":411,"icon":412},"Toolkit","\u002Fadapters\u002Fbuilding-blocks\u002Ftoolkit","6.adapters\u002F04.building-blocks\u002F04.toolkit","i-lucide-blocks",{"title":414,"path":415,"stem":416,"children":417,"page":34},"Enrichers","\u002Fenrichers","7.enrichers",[418,421,425],{"title":41,"path":419,"stem":420,"icon":28},"\u002Fenrichers\u002Foverview","7.enrichers\u002F1.overview",{"title":422,"path":423,"stem":424,"icon":288},"Built-in","\u002Fenrichers\u002Fbuilt-in","7.enrichers\u002F2.built-in",{"title":426,"path":427,"stem":428,"icon":83},"Custom","\u002Fenrichers\u002Fcustom","7.enrichers\u002F3.custom",{"id":430,"title":431,"body":432,"description":2348,"extension":2349,"links":2350,"meta":2355,"navigation":2356,"path":401,"seo":2357,"stem":402,"__hash__":2358},"docs\u002F6.adapters\u002F04.building-blocks\u002F02.http.md","HTTP drain",{"type":433,"value":434,"toc":2328},"minimark",[435,439,465,518,522,724,728,783,787,794,808,996,1002,1005,1210,1214,1220,1343,1349,1412,1416,1428,1433,1437,1440,1534,1561,1565,1571,1574,1725,1728,1872,1876,1886,2285,2295,2302,2306,2324],[436,437,438],"p",{},"Most observability tools focus on server-side logs. The HTTP drain gives you a framework-agnostic way to send structured logs from the browser to any HTTP endpoint without any vendor SDK or framework coupling.",[440,441,443,444,448,449,453,454,457,458,461,462,464],"callout",{"color":442,"icon":13},"neutral","The ",[445,446,447],"code",{},"evlog\u002Fbrowser"," import path is ",[450,451,452],"strong",{},"deprecated"," and re-exports the same API as ",[445,455,456],{},"evlog\u002Fhttp",". It will be removed in the next ",[450,459,460],{},"major"," release. Prefer ",[445,463,456],{}," for new code.",[466,467,470,473,506],"prompt",{":actions":468,"description":469,"icon":403},"[\"copy\",\"cursor\",\"windsurf\"]","Set up the HTTP transport for client logs",[436,471,472],{},"Set up the HTTP transport so my browser logs are sent to my server.",[474,475,476,480,483,493,496,499],"ul",{},[477,478,479],"li",{},"Install evlog: pnpm add evlog",[477,481,482],{},"Import createHttpLogDrain from 'evlog\u002Fhttp' (NOT evlog\u002Fbrowser — that's deprecated)",[477,484,485,486,492],{},"Create a drain with { endpoint: '",[487,488,489],"a",{"href":489,"rel":490},"https:\u002F\u002Flogs.example.com\u002Fv1\u002Fingest",[491],"nofollow","' } and an optional pipeline ({ batch: { size, intervalMs } })",[477,494,495],{},"Pass the drain to initLogger({ drain }) on the client side",[477,497,498],{},"The drain batches events and uses fetch keepalive + sendBeacon on visibility change",[477,500,501,502,505],{},"On the server, accept POST requests with a DrainContext",[503,504],"span",{}," body and forward them to my drain pipeline",[436,507,508,509,513,514],{},"Docs: ",[487,510,511],{"href":511,"rel":512},"https:\u002F\u002Fwww.evlog.dev\u002Fadapters\u002Fbuilding-blocks\u002Fhttp",[491],"\nPipeline: ",[487,515,516],{"href":516,"rel":517},"https:\u002F\u002Fwww.evlog.dev\u002Fadapters\u002Fbuilding-blocks\u002Fpipeline",[491],[519,520,20],"h2",{"id":521},"quick-start",[523,524,530],"pre",{"className":525,"code":526,"filename":527,"language":528,"meta":529,"style":529},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { initLogger, log } from 'evlog'\nimport { createHttpLogDrain } from 'evlog\u002Fhttp'\n\nconst drain = createHttpLogDrain({\n  drain: { endpoint: 'https:\u002F\u002Flogs.example.com\u002Fv1\u002Fingest' },\n})\ninitLogger({ drain })\n\nlog.info({ action: 'page_view', path: location.pathname })\n","app.ts","typescript","",[445,531,532,570,590,597,619,646,655,672,677],{"__ignoreMap":529},[503,533,536,540,544,548,551,554,557,560,563,567],{"class":534,"line":535},"line",1,[503,537,539],{"class":538},"s7zQu","import",[503,541,543],{"class":542},"sMK4o"," {",[503,545,547],{"class":546},"sTEyZ"," initLogger",[503,549,550],{"class":542},",",[503,552,553],{"class":546}," log",[503,555,556],{"class":542}," }",[503,558,559],{"class":538}," from",[503,561,562],{"class":542}," '",[503,564,566],{"class":565},"sfazB","evlog",[503,568,569],{"class":542},"'\n",[503,571,573,575,577,580,582,584,586,588],{"class":534,"line":572},2,[503,574,539],{"class":538},[503,576,543],{"class":542},[503,578,579],{"class":546}," createHttpLogDrain",[503,581,556],{"class":542},[503,583,559],{"class":538},[503,585,562],{"class":542},[503,587,456],{"class":565},[503,589,569],{"class":542},[503,591,593],{"class":534,"line":592},3,[503,594,596],{"emptyLinePlaceholder":595},true,"\n",[503,598,600,604,607,610,613,616],{"class":534,"line":599},4,[503,601,603],{"class":602},"spNyl","const",[503,605,606],{"class":546}," drain ",[503,608,609],{"class":542},"=",[503,611,579],{"class":612},"s2Zo4",[503,614,615],{"class":546},"(",[503,617,618],{"class":542},"{\n",[503,620,622,626,629,631,634,636,638,640,643],{"class":534,"line":621},5,[503,623,625],{"class":624},"swJcz","  drain",[503,627,628],{"class":542},":",[503,630,543],{"class":542},[503,632,633],{"class":624}," endpoint",[503,635,628],{"class":542},[503,637,562],{"class":542},[503,639,489],{"class":565},[503,641,642],{"class":542},"'",[503,644,645],{"class":542}," },\n",[503,647,649,652],{"class":534,"line":648},6,[503,650,651],{"class":542},"}",[503,653,654],{"class":546},")\n",[503,656,658,661,663,666,668,670],{"class":534,"line":657},7,[503,659,660],{"class":612},"initLogger",[503,662,615],{"class":546},[503,664,665],{"class":542},"{",[503,667,606],{"class":546},[503,669,651],{"class":542},[503,671,654],{"class":546},[503,673,675],{"class":534,"line":674},8,[503,676,596],{"emptyLinePlaceholder":595},[503,678,680,683,686,689,691,693,696,698,700,703,705,707,710,712,715,717,720,722],{"class":534,"line":679},9,[503,681,682],{"class":546},"log",[503,684,685],{"class":542},".",[503,687,688],{"class":612},"info",[503,690,615],{"class":546},[503,692,665],{"class":542},[503,694,695],{"class":624}," action",[503,697,628],{"class":542},[503,699,562],{"class":542},[503,701,702],{"class":565},"page_view",[503,704,642],{"class":542},[503,706,550],{"class":542},[503,708,709],{"class":624}," path",[503,711,628],{"class":542},[503,713,714],{"class":546}," location",[503,716,685],{"class":542},[503,718,719],{"class":546},"pathname ",[503,721,651],{"class":542},[503,723,654],{"class":546},[519,725,727],{"id":726},"how-it-works","How It Works",[729,730,731,747,754,765,772],"ol",{},[477,732,733,736,737,736,740,743,744],{},[445,734,735],{},"log.info()"," \u002F ",[445,738,739],{},"log.warn()",[445,741,742],{},"log.error()"," push events into a ",[450,745,746],{},"memory buffer",[477,748,749,750,753],{},"Events are ",[450,751,752],{},"batched"," by size (default 25) or time interval (default 2 s)",[477,755,756,757,760,761,764],{},"Batches are sent via ",[445,758,759],{},"fetch"," with ",[445,762,763],{},"keepalive: true"," so requests survive page navigation",[477,766,767,768,771],{},"When the page becomes hidden (tab switch, navigation), buffered events are flushed via ",[445,769,770],{},"navigator.sendBeacon"," as a fallback",[477,773,774,775,778,779,782],{},"Your ",[450,776,777],{},"server endpoint"," receives a ",[445,780,781],{},"DrainContext[]"," JSON array and processes it however you like",[519,784,786],{"id":785},"two-tier-api","Two-Tier API",[788,789,791],"h3",{"id":790},"createhttplogdrainoptions",[445,792,793],{},"createHttpLogDrain(options)",[436,795,796,797,800,801,804,805,685],{},"High-level, pre-composed: creates a pipeline with batching, retry, and auto-flush on ",[445,798,799],{},"visibilitychange",". Returns a ",[445,802,803],{},"PipelineDrainFn\u003CDrainContext>"," directly usable with ",[445,806,807],{},"initLogger({ drain })",[523,809,811],{"className":525,"code":810,"filename":527,"language":528,"meta":529,"style":529},"import { initLogger, log } from 'evlog'\nimport { createHttpLogDrain } from 'evlog\u002Fhttp'\n\nconst drain = createHttpLogDrain({\n  drain: { endpoint: 'https:\u002F\u002Flogs.example.com\u002Fv1\u002Fingest' },\n  pipeline: { batch: { size: 50, intervalMs: 5000 } },\n})\n\ninitLogger({ drain })\nlog.info({ action: 'click', target: 'buy-button' })\n",[445,812,813,835,853,857,871,891,930,936,940,954],{"__ignoreMap":529},[503,814,815,817,819,821,823,825,827,829,831,833],{"class":534,"line":535},[503,816,539],{"class":538},[503,818,543],{"class":542},[503,820,547],{"class":546},[503,822,550],{"class":542},[503,824,553],{"class":546},[503,826,556],{"class":542},[503,828,559],{"class":538},[503,830,562],{"class":542},[503,832,566],{"class":565},[503,834,569],{"class":542},[503,836,837,839,841,843,845,847,849,851],{"class":534,"line":572},[503,838,539],{"class":538},[503,840,543],{"class":542},[503,842,579],{"class":546},[503,844,556],{"class":542},[503,846,559],{"class":538},[503,848,562],{"class":542},[503,850,456],{"class":565},[503,852,569],{"class":542},[503,854,855],{"class":534,"line":592},[503,856,596],{"emptyLinePlaceholder":595},[503,858,859,861,863,865,867,869],{"class":534,"line":599},[503,860,603],{"class":602},[503,862,606],{"class":546},[503,864,609],{"class":542},[503,866,579],{"class":612},[503,868,615],{"class":546},[503,870,618],{"class":542},[503,872,873,875,877,879,881,883,885,887,889],{"class":534,"line":621},[503,874,625],{"class":624},[503,876,628],{"class":542},[503,878,543],{"class":542},[503,880,633],{"class":624},[503,882,628],{"class":542},[503,884,562],{"class":542},[503,886,489],{"class":565},[503,888,642],{"class":542},[503,890,645],{"class":542},[503,892,893,896,898,900,903,905,907,910,912,916,918,921,923,926,928],{"class":534,"line":648},[503,894,895],{"class":624},"  pipeline",[503,897,628],{"class":542},[503,899,543],{"class":542},[503,901,902],{"class":624}," batch",[503,904,628],{"class":542},[503,906,543],{"class":542},[503,908,909],{"class":624}," size",[503,911,628],{"class":542},[503,913,915],{"class":914},"sbssI"," 50",[503,917,550],{"class":542},[503,919,920],{"class":624}," intervalMs",[503,922,628],{"class":542},[503,924,925],{"class":914}," 5000",[503,927,556],{"class":542},[503,929,645],{"class":542},[503,931,932,934],{"class":534,"line":657},[503,933,651],{"class":542},[503,935,654],{"class":546},[503,937,938],{"class":534,"line":674},[503,939,596],{"emptyLinePlaceholder":595},[503,941,942,944,946,948,950,952],{"class":534,"line":679},[503,943,660],{"class":612},[503,945,615],{"class":546},[503,947,665],{"class":542},[503,949,606],{"class":546},[503,951,651],{"class":542},[503,953,654],{"class":546},[503,955,957,959,961,963,965,967,969,971,973,976,978,980,983,985,987,990,992,994],{"class":534,"line":956},10,[503,958,682],{"class":546},[503,960,685],{"class":542},[503,962,688],{"class":612},[503,964,615],{"class":546},[503,966,665],{"class":542},[503,968,695],{"class":624},[503,970,628],{"class":542},[503,972,562],{"class":542},[503,974,975],{"class":565},"click",[503,977,642],{"class":542},[503,979,550],{"class":542},[503,981,982],{"class":624}," target",[503,984,628],{"class":542},[503,986,562],{"class":542},[503,988,989],{"class":565},"buy-button",[503,991,642],{"class":542},[503,993,556],{"class":542},[503,995,654],{"class":546},[788,997,999],{"id":998},"createhttpdrainconfig",[445,1000,1001],{},"createHttpDrain(config)",[436,1003,1004],{},"Low-level transport function. Use this when you want full control over the pipeline configuration:",[523,1006,1008],{"className":525,"code":1007,"filename":527,"language":528,"meta":529,"style":529},"import { createHttpDrain } from 'evlog\u002Fhttp'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\nimport type { DrainContext } from 'evlog'\n\nconst transport = createHttpDrain({\n  endpoint: 'https:\u002F\u002Flogs.example.com\u002Fv1\u002Fingest',\n})\nconst pipeline = createDrainPipeline\u003CDrainContext>({\n  batch: { size: 100, intervalMs: 10000 },\n  retry: { maxAttempts: 5 },\n})\n\nconst drain = pipeline(transport)\n",[445,1009,1010,1029,1049,1071,1075,1090,1106,1112,1137,1164,1183,1190,1195],{"__ignoreMap":529},[503,1011,1012,1014,1016,1019,1021,1023,1025,1027],{"class":534,"line":535},[503,1013,539],{"class":538},[503,1015,543],{"class":542},[503,1017,1018],{"class":546}," createHttpDrain",[503,1020,556],{"class":542},[503,1022,559],{"class":538},[503,1024,562],{"class":542},[503,1026,456],{"class":565},[503,1028,569],{"class":542},[503,1030,1031,1033,1035,1038,1040,1042,1044,1047],{"class":534,"line":572},[503,1032,539],{"class":538},[503,1034,543],{"class":542},[503,1036,1037],{"class":546}," createDrainPipeline",[503,1039,556],{"class":542},[503,1041,559],{"class":538},[503,1043,562],{"class":542},[503,1045,1046],{"class":565},"evlog\u002Fpipeline",[503,1048,569],{"class":542},[503,1050,1051,1053,1056,1058,1061,1063,1065,1067,1069],{"class":534,"line":592},[503,1052,539],{"class":538},[503,1054,1055],{"class":538}," type",[503,1057,543],{"class":542},[503,1059,1060],{"class":546}," DrainContext",[503,1062,556],{"class":542},[503,1064,559],{"class":538},[503,1066,562],{"class":542},[503,1068,566],{"class":565},[503,1070,569],{"class":542},[503,1072,1073],{"class":534,"line":599},[503,1074,596],{"emptyLinePlaceholder":595},[503,1076,1077,1079,1082,1084,1086,1088],{"class":534,"line":621},[503,1078,603],{"class":602},[503,1080,1081],{"class":546}," transport ",[503,1083,609],{"class":542},[503,1085,1018],{"class":612},[503,1087,615],{"class":546},[503,1089,618],{"class":542},[503,1091,1092,1095,1097,1099,1101,1103],{"class":534,"line":648},[503,1093,1094],{"class":624},"  endpoint",[503,1096,628],{"class":542},[503,1098,562],{"class":542},[503,1100,489],{"class":565},[503,1102,642],{"class":542},[503,1104,1105],{"class":542},",\n",[503,1107,1108,1110],{"class":534,"line":657},[503,1109,651],{"class":542},[503,1111,654],{"class":546},[503,1113,1114,1116,1119,1121,1123,1126,1130,1133,1135],{"class":534,"line":674},[503,1115,603],{"class":602},[503,1117,1118],{"class":546}," pipeline ",[503,1120,609],{"class":542},[503,1122,1037],{"class":612},[503,1124,1125],{"class":542},"\u003C",[503,1127,1129],{"class":1128},"sBMFI","DrainContext",[503,1131,1132],{"class":542},">",[503,1134,615],{"class":546},[503,1136,618],{"class":542},[503,1138,1139,1142,1144,1146,1148,1150,1153,1155,1157,1159,1162],{"class":534,"line":679},[503,1140,1141],{"class":624},"  batch",[503,1143,628],{"class":542},[503,1145,543],{"class":542},[503,1147,909],{"class":624},[503,1149,628],{"class":542},[503,1151,1152],{"class":914}," 100",[503,1154,550],{"class":542},[503,1156,920],{"class":624},[503,1158,628],{"class":542},[503,1160,1161],{"class":914}," 10000",[503,1163,645],{"class":542},[503,1165,1166,1169,1171,1173,1176,1178,1181],{"class":534,"line":956},[503,1167,1168],{"class":624},"  retry",[503,1170,628],{"class":542},[503,1172,543],{"class":542},[503,1174,1175],{"class":624}," maxAttempts",[503,1177,628],{"class":542},[503,1179,1180],{"class":914}," 5",[503,1182,645],{"class":542},[503,1184,1186,1188],{"class":534,"line":1185},11,[503,1187,651],{"class":542},[503,1189,654],{"class":546},[503,1191,1193],{"class":534,"line":1192},12,[503,1194,596],{"emptyLinePlaceholder":595},[503,1196,1198,1200,1202,1204,1207],{"class":534,"line":1197},13,[503,1199,603],{"class":602},[503,1201,606],{"class":546},[503,1203,609],{"class":542},[503,1205,1206],{"class":612}," pipeline",[503,1208,1209],{"class":546},"(transport)\n",[519,1211,1213],{"id":1212},"configuration-reference","Configuration Reference",[788,1215,1217],{"id":1216},"httpdrainconfig",[445,1218,1219],{},"HttpDrainConfig",[1221,1222,1223,1239],"table",{},[1224,1225,1226],"thead",{},[1227,1228,1229,1233,1236],"tr",{},[1230,1231,1232],"th",{},"Option",[1230,1234,1235],{},"Default",[1230,1237,1238],{},"Description",[1240,1241,1242,1259,1282,1297,1316],"tbody",{},[1227,1243,1244,1250,1253],{},[1245,1246,1247],"td",{},[445,1248,1249],{},"endpoint",[1245,1251,1252],{},"-",[1245,1254,1255,1258],{},[450,1256,1257],{},"(required)"," Full URL of the server ingest endpoint",[1227,1260,1261,1266,1268],{},[1245,1262,1263],{},[445,1264,1265],{},"headers",[1245,1267,1252],{},[1245,1269,1270,1271,1273,1274,1277,1278,1281],{},"Custom headers sent with each ",[445,1272,759],{}," request (e.g. ",[445,1275,1276],{},"Authorization",", ",[445,1279,1280],{},"X-API-Key",")",[1227,1283,1284,1289,1294],{},[1245,1285,1286],{},[445,1287,1288],{},"timeout",[1245,1290,1291],{},[445,1292,1293],{},"5000",[1245,1295,1296],{},"Request timeout in milliseconds",[1227,1298,1299,1304,1309],{},[1245,1300,1301],{},[445,1302,1303],{},"useBeacon",[1245,1305,1306],{},[445,1307,1308],{},"true",[1245,1310,1311,1312,1315],{},"Use ",[445,1313,1314],{},"sendBeacon"," when the page is hidden",[1227,1317,1318,1323,1328],{},[1245,1319,1320],{},[445,1321,1322],{},"credentials",[1245,1324,1325],{},[445,1326,1327],{},"'same-origin'",[1245,1329,1330,1331,1277,1334,1277,1336,1339,1340,1342],{},"Fetch credentials mode (",[445,1332,1333],{},"'omit'",[445,1335,1327],{},[445,1337,1338],{},"'include'","). Set to ",[445,1341,1338],{}," for cross-origin endpoints",[788,1344,1346],{"id":1345},"httplogdrainoptions",[445,1347,1348],{},"HttpLogDrainOptions",[1221,1350,1351,1361],{},[1224,1352,1353],{},[1227,1354,1355,1357,1359],{},[1230,1356,1232],{},[1230,1358,1235],{},[1230,1360,1238],{},[1240,1362,1363,1380,1395],{},[1227,1364,1365,1370,1372],{},[1245,1366,1367],{},[445,1368,1369],{},"drain",[1245,1371,1252],{},[1245,1373,1374,1376,1377,1379],{},[450,1375,1257],{}," ",[445,1378,1219],{}," object",[1227,1381,1382,1387,1392],{},[1245,1383,1384],{},[445,1385,1386],{},"pipeline",[1245,1388,1389],{},[445,1390,1391],{},"{ batch: { size: 25, intervalMs: 2000 }, retry: { maxAttempts: 2 } }",[1245,1393,1394],{},"Pipeline configuration overrides",[1227,1396,1397,1402,1406],{},[1245,1398,1399],{},[445,1400,1401],{},"autoFlush",[1245,1403,1404],{},[445,1405,1308],{},[1245,1407,1408,1409,1411],{},"Auto-register ",[445,1410,799],{}," flush listener",[519,1413,1415],{"id":1414},"sendbeacon-fallback","sendBeacon Fallback",[440,1417,1418,1419,1421,1422,1424,1425,1427],{"color":688,"icon":306},"When ",[445,1420,1303],{}," is enabled (the default) and the page becomes hidden, the drain automatically switches from ",[445,1423,759],{}," to ",[445,1426,770],{},". This ensures logs are delivered even when the user closes the tab or navigates away, preventing data loss on page exit.",[436,1429,1430,1432],{},[445,1431,1314],{}," has a browser-imposed payload limit (~64 KB). If the payload exceeds this, the drain throws an error. Keep batch sizes reasonable (the default of 25 is well within limits).",[519,1434,1436],{"id":1435},"authentication","Authentication",[436,1438,1439],{},"Pass custom headers to protect your ingest endpoint:",[523,1441,1443],{"className":525,"code":1442,"filename":527,"language":528,"meta":529,"style":529},"const drain = createHttpLogDrain({\n  drain: {\n    endpoint: 'https:\u002F\u002Flogs.example.com\u002Fv1\u002Fingest',\n    headers: {\n      'Authorization': 'Bearer ' + token,\n    },\n  },\n})\n",[445,1444,1445,1459,1468,1483,1492,1518,1523,1528],{"__ignoreMap":529},[503,1446,1447,1449,1451,1453,1455,1457],{"class":534,"line":535},[503,1448,603],{"class":602},[503,1450,606],{"class":546},[503,1452,609],{"class":542},[503,1454,579],{"class":612},[503,1456,615],{"class":546},[503,1458,618],{"class":542},[503,1460,1461,1463,1465],{"class":534,"line":572},[503,1462,625],{"class":624},[503,1464,628],{"class":542},[503,1466,1467],{"class":542}," {\n",[503,1469,1470,1473,1475,1477,1479,1481],{"class":534,"line":592},[503,1471,1472],{"class":624},"    endpoint",[503,1474,628],{"class":542},[503,1476,562],{"class":542},[503,1478,489],{"class":565},[503,1480,642],{"class":542},[503,1482,1105],{"class":542},[503,1484,1485,1488,1490],{"class":534,"line":599},[503,1486,1487],{"class":624},"    headers",[503,1489,628],{"class":542},[503,1491,1467],{"class":542},[503,1493,1494,1497,1499,1501,1503,1505,1508,1510,1513,1516],{"class":534,"line":621},[503,1495,1496],{"class":542},"      '",[503,1498,1276],{"class":624},[503,1500,642],{"class":542},[503,1502,628],{"class":542},[503,1504,562],{"class":542},[503,1506,1507],{"class":565},"Bearer ",[503,1509,642],{"class":542},[503,1511,1512],{"class":542}," +",[503,1514,1515],{"class":546}," token",[503,1517,1105],{"class":542},[503,1519,1520],{"class":534,"line":648},[503,1521,1522],{"class":542},"    },\n",[503,1524,1525],{"class":534,"line":657},[503,1526,1527],{"class":542},"  },\n",[503,1529,1530,1532],{"class":534,"line":674},[503,1531,651],{"class":542},[503,1533,654],{"class":546},[440,1535,1537,1539,1540,1542,1543,1545,1546,1548,1549,1552,1553,1555,1556,760,1558,685],{"color":1536,"icon":59},"warning",[445,1538,1265],{}," are applied to ",[445,1541,759],{}," requests only. The ",[445,1544,1314],{}," API does not support custom headers, so when the page is hidden and ",[445,1547,1314],{}," is used, headers are not sent. If your endpoint requires authentication, consider validating via a session cookie (set ",[445,1550,1551],{},"credentials: 'include'"," for cross-origin endpoints, defaults to ",[445,1554,1327],{},") or disable ",[445,1557,1314],{},[445,1559,1560],{},"useBeacon: false",[519,1562,1564],{"id":1563},"server-endpoint","Server Endpoint",[436,1566,1567,1568,1570],{},"Your server needs a POST endpoint that accepts a ",[445,1569,781],{}," JSON body. Here are examples for common frameworks:",[788,1572,241],{"id":1573},"express",[523,1575,1578],{"className":525,"code":1576,"filename":1577,"language":528,"meta":529,"style":529},"app.post('\u002Fv1\u002Fingest', express.json(), (req, res) => {\n  for (const entry of req.body) {\n    console.log('[BROWSER]', JSON.stringify(entry))\n  }\n  res.sendStatus(204)\n})\n","server.ts",[445,1579,1580,1633,1661,1697,1702,1719],{"__ignoreMap":529},[503,1581,1582,1585,1587,1590,1592,1594,1597,1599,1601,1604,1606,1609,1612,1614,1617,1621,1623,1626,1628,1631],{"class":534,"line":535},[503,1583,1584],{"class":546},"app",[503,1586,685],{"class":542},[503,1588,1589],{"class":612},"post",[503,1591,615],{"class":546},[503,1593,642],{"class":542},[503,1595,1596],{"class":565},"\u002Fv1\u002Fingest",[503,1598,642],{"class":542},[503,1600,550],{"class":542},[503,1602,1603],{"class":546}," express",[503,1605,685],{"class":542},[503,1607,1608],{"class":612},"json",[503,1610,1611],{"class":546},"()",[503,1613,550],{"class":542},[503,1615,1616],{"class":542}," (",[503,1618,1620],{"class":1619},"sHdIc","req",[503,1622,550],{"class":542},[503,1624,1625],{"class":1619}," res",[503,1627,1281],{"class":542},[503,1629,1630],{"class":602}," =>",[503,1632,1467],{"class":542},[503,1634,1635,1638,1640,1642,1645,1648,1651,1653,1656,1659],{"class":534,"line":572},[503,1636,1637],{"class":538},"  for",[503,1639,1616],{"class":624},[503,1641,603],{"class":602},[503,1643,1644],{"class":546}," entry",[503,1646,1647],{"class":542}," of",[503,1649,1650],{"class":546}," req",[503,1652,685],{"class":542},[503,1654,1655],{"class":546},"body",[503,1657,1658],{"class":624},") ",[503,1660,618],{"class":542},[503,1662,1663,1666,1668,1670,1672,1674,1677,1679,1681,1684,1686,1689,1691,1694],{"class":534,"line":592},[503,1664,1665],{"class":546},"    console",[503,1667,685],{"class":542},[503,1669,682],{"class":612},[503,1671,615],{"class":624},[503,1673,642],{"class":542},[503,1675,1676],{"class":565},"[BROWSER]",[503,1678,642],{"class":542},[503,1680,550],{"class":542},[503,1682,1683],{"class":546}," JSON",[503,1685,685],{"class":542},[503,1687,1688],{"class":612},"stringify",[503,1690,615],{"class":624},[503,1692,1693],{"class":546},"entry",[503,1695,1696],{"class":624},"))\n",[503,1698,1699],{"class":534,"line":599},[503,1700,1701],{"class":542},"  }\n",[503,1703,1704,1707,1709,1712,1714,1717],{"class":534,"line":621},[503,1705,1706],{"class":546},"  res",[503,1708,685],{"class":542},[503,1710,1711],{"class":612},"sendStatus",[503,1713,615],{"class":624},[503,1715,1716],{"class":914},"204",[503,1718,654],{"class":624},[503,1720,1721,1723],{"class":534,"line":648},[503,1722,651],{"class":542},[503,1724,654],{"class":546},[788,1726,246],{"id":1727},"hono",[523,1729,1731],{"className":525,"code":1730,"filename":1577,"language":528,"meta":529,"style":529},"app.post('\u002Fv1\u002Fingest', async (c) => {\n  const body = await c.req.json()\n  for (const entry of body) {\n    console.log('[BROWSER]', JSON.stringify(entry))\n  }\n  return c.body(null, 204)\n})\n",[445,1732,1733,1765,1793,1811,1841,1845,1866],{"__ignoreMap":529},[503,1734,1735,1737,1739,1741,1743,1745,1747,1749,1751,1754,1756,1759,1761,1763],{"class":534,"line":535},[503,1736,1584],{"class":546},[503,1738,685],{"class":542},[503,1740,1589],{"class":612},[503,1742,615],{"class":546},[503,1744,642],{"class":542},[503,1746,1596],{"class":565},[503,1748,642],{"class":542},[503,1750,550],{"class":542},[503,1752,1753],{"class":602}," async",[503,1755,1616],{"class":542},[503,1757,1758],{"class":1619},"c",[503,1760,1281],{"class":542},[503,1762,1630],{"class":602},[503,1764,1467],{"class":542},[503,1766,1767,1770,1773,1776,1779,1782,1784,1786,1788,1790],{"class":534,"line":572},[503,1768,1769],{"class":602},"  const",[503,1771,1772],{"class":546}," body",[503,1774,1775],{"class":542}," =",[503,1777,1778],{"class":538}," await",[503,1780,1781],{"class":546}," c",[503,1783,685],{"class":542},[503,1785,1620],{"class":546},[503,1787,685],{"class":542},[503,1789,1608],{"class":612},[503,1791,1792],{"class":624},"()\n",[503,1794,1795,1797,1799,1801,1803,1805,1807,1809],{"class":534,"line":592},[503,1796,1637],{"class":538},[503,1798,1616],{"class":624},[503,1800,603],{"class":602},[503,1802,1644],{"class":546},[503,1804,1647],{"class":542},[503,1806,1772],{"class":546},[503,1808,1658],{"class":624},[503,1810,618],{"class":542},[503,1812,1813,1815,1817,1819,1821,1823,1825,1827,1829,1831,1833,1835,1837,1839],{"class":534,"line":599},[503,1814,1665],{"class":546},[503,1816,685],{"class":542},[503,1818,682],{"class":612},[503,1820,615],{"class":624},[503,1822,642],{"class":542},[503,1824,1676],{"class":565},[503,1826,642],{"class":542},[503,1828,550],{"class":542},[503,1830,1683],{"class":546},[503,1832,685],{"class":542},[503,1834,1688],{"class":612},[503,1836,615],{"class":624},[503,1838,1693],{"class":546},[503,1840,1696],{"class":624},[503,1842,1843],{"class":534,"line":621},[503,1844,1701],{"class":542},[503,1846,1847,1850,1852,1854,1856,1858,1861,1864],{"class":534,"line":648},[503,1848,1849],{"class":538},"  return",[503,1851,1781],{"class":546},[503,1853,685],{"class":542},[503,1855,1655],{"class":612},[503,1857,615],{"class":624},[503,1859,1860],{"class":542},"null,",[503,1862,1863],{"class":914}," 204",[503,1865,654],{"class":624},[503,1867,1868,1870],{"class":534,"line":657},[503,1869,651],{"class":542},[503,1871,654],{"class":546},[519,1873,1875],{"id":1874},"full-control","Full Control",[436,1877,1878,1879,760,1882,1885],{},"Combine ",[445,1880,1881],{},"createHttpDrain",[445,1883,1884],{},"createDrainPipeline"," for maximum flexibility:",[523,1887,1889],{"className":525,"code":1888,"filename":527,"language":528,"meta":529,"style":529},"import { initLogger, log } from 'evlog'\nimport type { DrainContext } from 'evlog'\nimport { createHttpDrain } from 'evlog\u002Fhttp'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({\n  batch: { size: 100, intervalMs: 10000 },\n  retry: { maxAttempts: 5, backoff: 'exponential' },\n  maxBufferSize: 500,\n  onDropped: (events) => {\n    console.warn(`Dropped ${events.length} client events`)\n  },\n})\n\nconst drain = pipeline(createHttpDrain({\n  endpoint: 'https:\u002F\u002Flogs.example.com\u002Fv1\u002Fingest',\n  timeout: 3000,\n}))\n\ninitLogger({ drain })\n\nlog.info({ action: 'app_init' })\n\n\u002F\u002F Flush on page unload\nwindow.addEventListener('beforeunload', () => drain.flush())\n",[445,1890,1891,1913,1933,1951,1969,1973,1993,2017,2047,2059,2077,2113,2117,2123,2128,2147,2162,2175,2182,2187,2202,2207,2235,2240,2247],{"__ignoreMap":529},[503,1892,1893,1895,1897,1899,1901,1903,1905,1907,1909,1911],{"class":534,"line":535},[503,1894,539],{"class":538},[503,1896,543],{"class":542},[503,1898,547],{"class":546},[503,1900,550],{"class":542},[503,1902,553],{"class":546},[503,1904,556],{"class":542},[503,1906,559],{"class":538},[503,1908,562],{"class":542},[503,1910,566],{"class":565},[503,1912,569],{"class":542},[503,1914,1915,1917,1919,1921,1923,1925,1927,1929,1931],{"class":534,"line":572},[503,1916,539],{"class":538},[503,1918,1055],{"class":538},[503,1920,543],{"class":542},[503,1922,1060],{"class":546},[503,1924,556],{"class":542},[503,1926,559],{"class":538},[503,1928,562],{"class":542},[503,1930,566],{"class":565},[503,1932,569],{"class":542},[503,1934,1935,1937,1939,1941,1943,1945,1947,1949],{"class":534,"line":592},[503,1936,539],{"class":538},[503,1938,543],{"class":542},[503,1940,1018],{"class":546},[503,1942,556],{"class":542},[503,1944,559],{"class":538},[503,1946,562],{"class":542},[503,1948,456],{"class":565},[503,1950,569],{"class":542},[503,1952,1953,1955,1957,1959,1961,1963,1965,1967],{"class":534,"line":599},[503,1954,539],{"class":538},[503,1956,543],{"class":542},[503,1958,1037],{"class":546},[503,1960,556],{"class":542},[503,1962,559],{"class":538},[503,1964,562],{"class":542},[503,1966,1046],{"class":565},[503,1968,569],{"class":542},[503,1970,1971],{"class":534,"line":621},[503,1972,596],{"emptyLinePlaceholder":595},[503,1974,1975,1977,1979,1981,1983,1985,1987,1989,1991],{"class":534,"line":648},[503,1976,603],{"class":602},[503,1978,1118],{"class":546},[503,1980,609],{"class":542},[503,1982,1037],{"class":612},[503,1984,1125],{"class":542},[503,1986,1129],{"class":1128},[503,1988,1132],{"class":542},[503,1990,615],{"class":546},[503,1992,618],{"class":542},[503,1994,1995,1997,1999,2001,2003,2005,2007,2009,2011,2013,2015],{"class":534,"line":657},[503,1996,1141],{"class":624},[503,1998,628],{"class":542},[503,2000,543],{"class":542},[503,2002,909],{"class":624},[503,2004,628],{"class":542},[503,2006,1152],{"class":914},[503,2008,550],{"class":542},[503,2010,920],{"class":624},[503,2012,628],{"class":542},[503,2014,1161],{"class":914},[503,2016,645],{"class":542},[503,2018,2019,2021,2023,2025,2027,2029,2031,2033,2036,2038,2040,2043,2045],{"class":534,"line":674},[503,2020,1168],{"class":624},[503,2022,628],{"class":542},[503,2024,543],{"class":542},[503,2026,1175],{"class":624},[503,2028,628],{"class":542},[503,2030,1180],{"class":914},[503,2032,550],{"class":542},[503,2034,2035],{"class":624}," backoff",[503,2037,628],{"class":542},[503,2039,562],{"class":542},[503,2041,2042],{"class":565},"exponential",[503,2044,642],{"class":542},[503,2046,645],{"class":542},[503,2048,2049,2052,2054,2057],{"class":534,"line":679},[503,2050,2051],{"class":624},"  maxBufferSize",[503,2053,628],{"class":542},[503,2055,2056],{"class":914}," 500",[503,2058,1105],{"class":542},[503,2060,2061,2064,2066,2068,2071,2073,2075],{"class":534,"line":956},[503,2062,2063],{"class":612},"  onDropped",[503,2065,628],{"class":542},[503,2067,1616],{"class":542},[503,2069,2070],{"class":1619},"events",[503,2072,1281],{"class":542},[503,2074,1630],{"class":602},[503,2076,1467],{"class":542},[503,2078,2079,2081,2083,2086,2088,2091,2094,2097,2099,2101,2104,2106,2109,2111],{"class":534,"line":1185},[503,2080,1665],{"class":546},[503,2082,685],{"class":542},[503,2084,2085],{"class":612},"warn",[503,2087,615],{"class":624},[503,2089,2090],{"class":542},"`",[503,2092,2093],{"class":565},"Dropped ",[503,2095,2096],{"class":542},"${",[503,2098,2070],{"class":546},[503,2100,685],{"class":542},[503,2102,2103],{"class":546},"length",[503,2105,651],{"class":542},[503,2107,2108],{"class":565}," client events",[503,2110,2090],{"class":542},[503,2112,654],{"class":624},[503,2114,2115],{"class":534,"line":1192},[503,2116,1527],{"class":542},[503,2118,2119,2121],{"class":534,"line":1197},[503,2120,651],{"class":542},[503,2122,654],{"class":546},[503,2124,2126],{"class":534,"line":2125},14,[503,2127,596],{"emptyLinePlaceholder":595},[503,2129,2131,2133,2135,2137,2139,2141,2143,2145],{"class":534,"line":2130},15,[503,2132,603],{"class":602},[503,2134,606],{"class":546},[503,2136,609],{"class":542},[503,2138,1206],{"class":612},[503,2140,615],{"class":546},[503,2142,1881],{"class":612},[503,2144,615],{"class":546},[503,2146,618],{"class":542},[503,2148,2150,2152,2154,2156,2158,2160],{"class":534,"line":2149},16,[503,2151,1094],{"class":624},[503,2153,628],{"class":542},[503,2155,562],{"class":542},[503,2157,489],{"class":565},[503,2159,642],{"class":542},[503,2161,1105],{"class":542},[503,2163,2165,2168,2170,2173],{"class":534,"line":2164},17,[503,2166,2167],{"class":624},"  timeout",[503,2169,628],{"class":542},[503,2171,2172],{"class":914}," 3000",[503,2174,1105],{"class":542},[503,2176,2178,2180],{"class":534,"line":2177},18,[503,2179,651],{"class":542},[503,2181,1696],{"class":546},[503,2183,2185],{"class":534,"line":2184},19,[503,2186,596],{"emptyLinePlaceholder":595},[503,2188,2190,2192,2194,2196,2198,2200],{"class":534,"line":2189},20,[503,2191,660],{"class":612},[503,2193,615],{"class":546},[503,2195,665],{"class":542},[503,2197,606],{"class":546},[503,2199,651],{"class":542},[503,2201,654],{"class":546},[503,2203,2205],{"class":534,"line":2204},21,[503,2206,596],{"emptyLinePlaceholder":595},[503,2208,2210,2212,2214,2216,2218,2220,2222,2224,2226,2229,2231,2233],{"class":534,"line":2209},22,[503,2211,682],{"class":546},[503,2213,685],{"class":542},[503,2215,688],{"class":612},[503,2217,615],{"class":546},[503,2219,665],{"class":542},[503,2221,695],{"class":624},[503,2223,628],{"class":542},[503,2225,562],{"class":542},[503,2227,2228],{"class":565},"app_init",[503,2230,642],{"class":542},[503,2232,556],{"class":542},[503,2234,654],{"class":546},[503,2236,2238],{"class":534,"line":2237},23,[503,2239,596],{"emptyLinePlaceholder":595},[503,2241,2243],{"class":534,"line":2242},24,[503,2244,2246],{"class":2245},"sHwdD","\u002F\u002F Flush on page unload\n",[503,2248,2250,2253,2255,2258,2260,2262,2265,2267,2269,2272,2274,2277,2279,2282],{"class":534,"line":2249},25,[503,2251,2252],{"class":546},"window",[503,2254,685],{"class":542},[503,2256,2257],{"class":612},"addEventListener",[503,2259,615],{"class":546},[503,2261,642],{"class":542},[503,2263,2264],{"class":565},"beforeunload",[503,2266,642],{"class":542},[503,2268,550],{"class":542},[503,2270,2271],{"class":542}," ()",[503,2273,1630],{"class":602},[503,2275,2276],{"class":546}," drain",[503,2278,685],{"class":542},[503,2280,2281],{"class":612},"flush",[503,2283,2284],{"class":546},"())\n",[440,2286,2288,2289,2294],{"color":442,"icon":2287},"i-lucide-arrow-right","See the full ",[487,2290,2293],{"href":2291,"rel":2292},"https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Ftree\u002Fmain\u002Fexamples\u002Fbrowser",[491],"browser example"," for a working Hono server + browser page that demonstrates the complete flow end to end.",[440,2296,2297,2298,2301],{"color":442,"icon":83},"See the ",[487,2299,2300],{"href":217},"Next.js guide"," for a working implementation.",[519,2303,2305],{"id":2304},"next-steps","Next Steps",[474,2307,2308,2314,2319],{},[477,2309,2310,2313],{},[487,2311,2312],{"href":332},"Adapters Overview"," - Available built-in adapters",[477,2315,2316,2318],{},[487,2317,395],{"href":396}," - Batching, retry, and buffer overflow handling",[477,2320,2321,2323],{},[487,2322,405],{"href":406}," - Build your own drain function",[2325,2326,2327],"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .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":529,"searchDepth":572,"depth":572,"links":2329},[2330,2331,2332,2336,2340,2341,2342,2346,2347],{"id":521,"depth":572,"text":20},{"id":726,"depth":572,"text":727},{"id":785,"depth":572,"text":786,"children":2333},[2334,2335],{"id":790,"depth":592,"text":793},{"id":998,"depth":592,"text":1001},{"id":1212,"depth":572,"text":1213,"children":2337},[2338,2339],{"id":1216,"depth":592,"text":1219},{"id":1345,"depth":592,"text":1348},{"id":1414,"depth":572,"text":1415},{"id":1435,"depth":572,"text":1436},{"id":1563,"depth":572,"text":1564,"children":2343},[2344,2345],{"id":1573,"depth":592,"text":241},{"id":1727,"depth":592,"text":246},{"id":1874,"depth":572,"text":1875},{"id":2304,"depth":572,"text":2305},"Framework-agnostic HTTP log transport for sending client-side logs to your server via fetch or sendBeacon. Works in the browser or any environment with fetch. Use the `evlog\u002Fhttp` entry point.","md",[2351,2354],{"label":2312,"icon":2352,"to":332,"color":442,"variant":2353},"i-custom-plug","subtle",{"label":395,"icon":398,"to":396,"color":442,"variant":2353},{},{"title":400,"icon":403},{"title":431,"description":2348},"2DU1KAmq-ibPl2rFfDf3SpVjzShnZp2X2OUXYAoxWlo",[2360,2362],{"title":395,"path":396,"stem":397,"description":2361,"icon":398,"children":-1},"Batch events, retry on failure, and protect against buffer overflow with the shared drain pipeline. Supports fan-out to multiple adapters.",{"title":405,"path":406,"stem":407,"description":2363,"icon":83,"children":-1},"Build your own adapter to send logs to any destination using defineHttpDrain — config resolution, retries, timeouts, and error handling are handled for you.",1778336625651]