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