[{"data":1,"prerenderedAt":2018},["ShallowReactive",2],{"navigation_docs":3,"-adapters-browser":181,"-adapters-browser-surround":2013},[4,30,55,105,122,136],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Getting Started","/getting-started","1.getting-started",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","/getting-started/introduction","1.getting-started/1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","/getting-started/installation","1.getting-started/2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","/getting-started/quick-start","1.getting-started/3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","/getting-started/agent-skills","1.getting-started/4.agent-skills","i-lucide-sparkles",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Core Concepts","/core-concepts","2.core-concepts",[35,40,45,50],{"title":36,"path":37,"stem":38,"icon":39},"Wide Events","/core-concepts/wide-events","2.core-concepts/1.wide-events","i-lucide-layers",{"title":41,"path":42,"stem":43,"icon":44},"Structured Errors","/core-concepts/structured-errors","2.core-concepts/2.structured-errors","i-lucide-shield-alert",{"title":46,"path":47,"stem":48,"icon":49},"Best Practices","/core-concepts/best-practices","2.core-concepts/3.best-practices","i-lucide-shield-check",{"title":51,"path":52,"stem":53,"icon":54},"Typed Fields","/core-concepts/typed-fields","2.core-concepts/4.typed-fields","i-simple-icons-typescript",{"title":56,"path":57,"stem":58,"children":59,"page":29},"Adapters","/adapters","3.adapters",[60,65,70,75,80,85,90,95,100],{"title":61,"path":62,"stem":63,"icon":64},"Overview","/adapters/overview","3.adapters/1.overview","i-custom-plug",{"title":66,"path":67,"stem":68,"icon":69},"Axiom","/adapters/axiom","3.adapters/2.axiom","i-custom-axiom",{"title":71,"path":72,"stem":73,"icon":74},"OTLP","/adapters/otlp","3.adapters/3.otlp","i-simple-icons-opentelemetry",{"title":76,"path":77,"stem":78,"icon":79},"PostHog","/adapters/posthog","3.adapters/4.posthog","i-simple-icons-posthog",{"title":81,"path":82,"stem":83,"icon":84},"Sentry","/adapters/sentry","3.adapters/5.sentry","i-simple-icons-sentry",{"title":86,"path":87,"stem":88,"icon":89},"Better Stack","/adapters/better-stack","3.adapters/6.better-stack","i-simple-icons-betterstack",{"title":91,"path":92,"stem":93,"icon":94},"Custom Adapters","/adapters/custom","3.adapters/7.custom","i-lucide-code",{"title":96,"path":97,"stem":98,"icon":99},"Pipeline","/adapters/pipeline","3.adapters/8.pipeline","i-lucide-workflow",{"title":101,"path":102,"stem":103,"icon":104},"Browser","/adapters/browser","3.adapters/9.browser","i-lucide-globe",{"title":106,"path":107,"stem":108,"children":109,"page":29},"Enrichers","/enrichers","4.enrichers",[110,113,118],{"title":61,"path":111,"stem":112,"icon":28},"/enrichers/overview","4.enrichers/1.overview",{"title":114,"path":115,"stem":116,"icon":117},"Built-in","/enrichers/built-in","4.enrichers/2.built-in","i-lucide-puzzle",{"title":119,"path":120,"stem":121,"icon":94},"Custom","/enrichers/custom","4.enrichers/3.custom",{"title":123,"path":124,"stem":125,"children":126,"page":29},"NuxtHub","/nuxthub","5.nuxthub",[127,131],{"title":61,"path":128,"stem":129,"icon":130},"/nuxthub/overview","5.nuxthub/1.overview","i-lucide-database",{"title":132,"path":133,"stem":134,"icon":135},"Retention","/nuxthub/retention","5.nuxthub/2.retention","i-lucide-clock",{"title":137,"path":138,"stem":139,"children":140,"page":29},"Examples","/examples","6.examples",[141,146,151,156,161,166,171,176],{"title":142,"path":143,"stem":144,"icon":145},"Next.js","/examples/nextjs","6.examples/1.nextjs","i-simple-icons-nextdotjs",{"title":147,"path":148,"stem":149,"icon":150},"TanStack Start","/examples/tanstack-start","6.examples/2.tanstack-start","i-custom-tanstack",{"title":152,"path":153,"stem":154,"icon":155},"Hono","/examples/hono","6.examples/3.hono","i-simple-icons-hono",{"title":157,"path":158,"stem":159,"icon":160},"Express","/examples/express","6.examples/4.express","i-simple-icons-express",{"title":162,"path":163,"stem":164,"icon":165},"Elysia","/examples/elysia","6.examples/5.elysia","i-custom-elysia",{"title":167,"path":168,"stem":169,"icon":170},"Fastify","/examples/fastify","6.examples/6.fastify","i-simple-icons-fastify",{"title":172,"path":173,"stem":174,"icon":175},"NestJS","/examples/nestjs","6.examples/7.nestjs","i-simple-icons-nestjs",{"title":177,"path":178,"stem":179,"icon":180},"SvelteKit","/examples/sveltekit","6.examples/7.sveltekit","i-simple-icons-svelte",{"id":182,"title":183,"body":184,"description":2003,"extension":2004,"links":2005,"meta":2009,"navigation":2010,"path":102,"seo":2011,"stem":103,"__hash__":2012},"docs/3.adapters/9.browser.md","Browser Drain",{"type":185,"value":186,"toc":1983},"minimark",[187,191,195,401,405,462,466,473,487,675,681,684,889,893,899,995,1001,1064,1068,1082,1087,1091,1094,1188,1212,1216,1222,1225,1376,1379,1523,1527,1537,1936,1949,1956,1960,1979],[188,189,190],"p",{},"Most observability tools focus on server-side logs. The browser drain gives you a framework-agnostic way to send structured logs from the browser to any HTTP endpoint — no vendor SDK, no framework coupling.",[192,193,20],"h2",{"id":194},"quick-start",[196,197,203],"pre",{"className":198,"code":199,"filename":200,"language":201,"meta":202,"style":202},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { initLogger, log } from 'evlog'\nimport { createBrowserLogDrain } from 'evlog/browser'\n\nconst drain = createBrowserLogDrain({\n  drain: { endpoint: 'https://logs.example.com/v1/ingest' },\n})\ninitLogger({ drain })\n\nlog.info({ action: 'page_view', path: location.pathname })\n","app.ts","typescript","",[204,205,206,245,266,273,295,323,332,349,354],"code",{"__ignoreMap":202},[207,208,211,215,219,223,226,229,232,235,238,242],"span",{"class":209,"line":210},"line",1,[207,212,214],{"class":213},"s7zQu","import",[207,216,218],{"class":217},"sMK4o"," {",[207,220,222],{"class":221},"sTEyZ"," initLogger",[207,224,225],{"class":217},",",[207,227,228],{"class":221}," log",[207,230,231],{"class":217}," }",[207,233,234],{"class":213}," from",[207,236,237],{"class":217}," '",[207,239,241],{"class":240},"sfazB","evlog",[207,243,244],{"class":217},"'\n",[207,246,248,250,252,255,257,259,261,264],{"class":209,"line":247},2,[207,249,214],{"class":213},[207,251,218],{"class":217},[207,253,254],{"class":221}," createBrowserLogDrain",[207,256,231],{"class":217},[207,258,234],{"class":213},[207,260,237],{"class":217},[207,262,263],{"class":240},"evlog/browser",[207,265,244],{"class":217},[207,267,269],{"class":209,"line":268},3,[207,270,272],{"emptyLinePlaceholder":271},true,"\n",[207,274,276,280,283,286,289,292],{"class":209,"line":275},4,[207,277,279],{"class":278},"spNyl","const",[207,281,282],{"class":221}," drain ",[207,284,285],{"class":217},"=",[207,287,254],{"class":288},"s2Zo4",[207,290,291],{"class":221},"(",[207,293,294],{"class":217},"{\n",[207,296,298,302,305,307,310,312,314,317,320],{"class":209,"line":297},5,[207,299,301],{"class":300},"swJcz","  drain",[207,303,304],{"class":217},":",[207,306,218],{"class":217},[207,308,309],{"class":300}," endpoint",[207,311,304],{"class":217},[207,313,237],{"class":217},[207,315,316],{"class":240},"https://logs.example.com/v1/ingest",[207,318,319],{"class":217},"'",[207,321,322],{"class":217}," },\n",[207,324,326,329],{"class":209,"line":325},6,[207,327,328],{"class":217},"}",[207,330,331],{"class":221},")\n",[207,333,335,338,340,343,345,347],{"class":209,"line":334},7,[207,336,337],{"class":288},"initLogger",[207,339,291],{"class":221},[207,341,342],{"class":217},"{",[207,344,282],{"class":221},[207,346,328],{"class":217},[207,348,331],{"class":221},[207,350,352],{"class":209,"line":351},8,[207,353,272],{"emptyLinePlaceholder":271},[207,355,357,360,363,366,368,370,373,375,377,380,382,384,387,389,392,394,397,399],{"class":209,"line":356},9,[207,358,359],{"class":221},"log",[207,361,362],{"class":217},".",[207,364,365],{"class":288},"info",[207,367,291],{"class":221},[207,369,342],{"class":217},[207,371,372],{"class":300}," action",[207,374,304],{"class":217},[207,376,237],{"class":217},[207,378,379],{"class":240},"page_view",[207,381,319],{"class":217},[207,383,225],{"class":217},[207,385,386],{"class":300}," path",[207,388,304],{"class":217},[207,390,391],{"class":221}," location",[207,393,362],{"class":217},[207,395,396],{"class":221},"pathname ",[207,398,328],{"class":217},[207,400,331],{"class":221},[192,402,404],{"id":403},"how-it-works","How It Works",[406,407,408,426,433,444,451],"ol",{},[409,410,411,414,415,414,418,421,422],"li",{},[204,412,413],{},"log.info()"," / ",[204,416,417],{},"log.warn()",[204,419,420],{},"log.error()"," push events into a ",[423,424,425],"strong",{},"memory buffer",[409,427,428,429,432],{},"Events are ",[423,430,431],{},"batched"," by size (default 25) or time interval (default 2 s)",[409,434,435,436,439,440,443],{},"Batches are sent via ",[204,437,438],{},"fetch"," with ",[204,441,442],{},"keepalive: true"," so requests survive page navigation",[409,445,446,447,450],{},"When the page becomes hidden (tab switch, navigation), buffered events are flushed via ",[204,448,449],{},"navigator.sendBeacon"," as a fallback",[409,452,453,454,457,458,461],{},"Your ",[423,455,456],{},"server endpoint"," receives a ",[204,459,460],{},"DrainContext[]"," JSON array and processes it however you like",[192,463,465],{"id":464},"two-tier-api","Two-Tier API",[467,468,470],"h3",{"id":469},"createbrowserlogdrainoptions",[204,471,472],{},"createBrowserLogDrain(options)",[188,474,475,476,479,480,483,484,362],{},"High-level, pre-composed: creates a pipeline with batching, retry, and auto-flush on ",[204,477,478],{},"visibilitychange",". Returns a ",[204,481,482],{},"PipelineDrainFn\u003CDrainContext>"," directly usable with ",[204,485,486],{},"initLogger({ drain })",[196,488,490],{"className":198,"code":489,"language":201,"meta":202,"style":202},"import { initLogger, log } from 'evlog'\nimport { createBrowserLogDrain } from 'evlog/browser'\n\nconst drain = createBrowserLogDrain({\n  drain: { endpoint: 'https://logs.example.com/v1/ingest' },\n  pipeline: { batch: { size: 50, intervalMs: 5000 } },\n})\n\ninitLogger({ drain })\nlog.info({ action: 'click', target: 'buy-button' })\n",[204,491,492,514,532,536,550,570,609,615,619,633],{"__ignoreMap":202},[207,493,494,496,498,500,502,504,506,508,510,512],{"class":209,"line":210},[207,495,214],{"class":213},[207,497,218],{"class":217},[207,499,222],{"class":221},[207,501,225],{"class":217},[207,503,228],{"class":221},[207,505,231],{"class":217},[207,507,234],{"class":213},[207,509,237],{"class":217},[207,511,241],{"class":240},[207,513,244],{"class":217},[207,515,516,518,520,522,524,526,528,530],{"class":209,"line":247},[207,517,214],{"class":213},[207,519,218],{"class":217},[207,521,254],{"class":221},[207,523,231],{"class":217},[207,525,234],{"class":213},[207,527,237],{"class":217},[207,529,263],{"class":240},[207,531,244],{"class":217},[207,533,534],{"class":209,"line":268},[207,535,272],{"emptyLinePlaceholder":271},[207,537,538,540,542,544,546,548],{"class":209,"line":275},[207,539,279],{"class":278},[207,541,282],{"class":221},[207,543,285],{"class":217},[207,545,254],{"class":288},[207,547,291],{"class":221},[207,549,294],{"class":217},[207,551,552,554,556,558,560,562,564,566,568],{"class":209,"line":297},[207,553,301],{"class":300},[207,555,304],{"class":217},[207,557,218],{"class":217},[207,559,309],{"class":300},[207,561,304],{"class":217},[207,563,237],{"class":217},[207,565,316],{"class":240},[207,567,319],{"class":217},[207,569,322],{"class":217},[207,571,572,575,577,579,582,584,586,589,591,595,597,600,602,605,607],{"class":209,"line":325},[207,573,574],{"class":300},"  pipeline",[207,576,304],{"class":217},[207,578,218],{"class":217},[207,580,581],{"class":300}," batch",[207,583,304],{"class":217},[207,585,218],{"class":217},[207,587,588],{"class":300}," size",[207,590,304],{"class":217},[207,592,594],{"class":593},"sbssI"," 50",[207,596,225],{"class":217},[207,598,599],{"class":300}," intervalMs",[207,601,304],{"class":217},[207,603,604],{"class":593}," 5000",[207,606,231],{"class":217},[207,608,322],{"class":217},[207,610,611,613],{"class":209,"line":334},[207,612,328],{"class":217},[207,614,331],{"class":221},[207,616,617],{"class":209,"line":351},[207,618,272],{"emptyLinePlaceholder":271},[207,620,621,623,625,627,629,631],{"class":209,"line":356},[207,622,337],{"class":288},[207,624,291],{"class":221},[207,626,342],{"class":217},[207,628,282],{"class":221},[207,630,328],{"class":217},[207,632,331],{"class":221},[207,634,636,638,640,642,644,646,648,650,652,655,657,659,662,664,666,669,671,673],{"class":209,"line":635},10,[207,637,359],{"class":221},[207,639,362],{"class":217},[207,641,365],{"class":288},[207,643,291],{"class":221},[207,645,342],{"class":217},[207,647,372],{"class":300},[207,649,304],{"class":217},[207,651,237],{"class":217},[207,653,654],{"class":240},"click",[207,656,319],{"class":217},[207,658,225],{"class":217},[207,660,661],{"class":300}," target",[207,663,304],{"class":217},[207,665,237],{"class":217},[207,667,668],{"class":240},"buy-button",[207,670,319],{"class":217},[207,672,231],{"class":217},[207,674,331],{"class":221},[467,676,678],{"id":677},"createbrowserdrainconfig",[204,679,680],{},"createBrowserDrain(config)",[188,682,683],{},"Low-level transport function. Use this when you want full control over the pipeline configuration:",[196,685,687],{"className":198,"code":686,"language":201,"meta":202,"style":202},"import { createBrowserDrain } from 'evlog/browser'\nimport { createDrainPipeline } from 'evlog/pipeline'\nimport type { DrainContext } from 'evlog'\n\nconst transport = createBrowserDrain({\n  endpoint: 'https://logs.example.com/v1/ingest',\n})\nconst pipeline = createDrainPipeline\u003CDrainContext>({\n  batch: { size: 100, intervalMs: 10000 },\n  retry: { maxAttempts: 5 },\n})\n\nconst drain = pipeline(transport)\n",[204,688,689,708,728,750,754,769,785,791,816,843,862,869,874],{"__ignoreMap":202},[207,690,691,693,695,698,700,702,704,706],{"class":209,"line":210},[207,692,214],{"class":213},[207,694,218],{"class":217},[207,696,697],{"class":221}," createBrowserDrain",[207,699,231],{"class":217},[207,701,234],{"class":213},[207,703,237],{"class":217},[207,705,263],{"class":240},[207,707,244],{"class":217},[207,709,710,712,714,717,719,721,723,726],{"class":209,"line":247},[207,711,214],{"class":213},[207,713,218],{"class":217},[207,715,716],{"class":221}," createDrainPipeline",[207,718,231],{"class":217},[207,720,234],{"class":213},[207,722,237],{"class":217},[207,724,725],{"class":240},"evlog/pipeline",[207,727,244],{"class":217},[207,729,730,732,735,737,740,742,744,746,748],{"class":209,"line":268},[207,731,214],{"class":213},[207,733,734],{"class":213}," type",[207,736,218],{"class":217},[207,738,739],{"class":221}," DrainContext",[207,741,231],{"class":217},[207,743,234],{"class":213},[207,745,237],{"class":217},[207,747,241],{"class":240},[207,749,244],{"class":217},[207,751,752],{"class":209,"line":275},[207,753,272],{"emptyLinePlaceholder":271},[207,755,756,758,761,763,765,767],{"class":209,"line":297},[207,757,279],{"class":278},[207,759,760],{"class":221}," transport ",[207,762,285],{"class":217},[207,764,697],{"class":288},[207,766,291],{"class":221},[207,768,294],{"class":217},[207,770,771,774,776,778,780,782],{"class":209,"line":325},[207,772,773],{"class":300},"  endpoint",[207,775,304],{"class":217},[207,777,237],{"class":217},[207,779,316],{"class":240},[207,781,319],{"class":217},[207,783,784],{"class":217},",\n",[207,786,787,789],{"class":209,"line":334},[207,788,328],{"class":217},[207,790,331],{"class":221},[207,792,793,795,798,800,802,805,809,812,814],{"class":209,"line":351},[207,794,279],{"class":278},[207,796,797],{"class":221}," pipeline ",[207,799,285],{"class":217},[207,801,716],{"class":288},[207,803,804],{"class":217},"\u003C",[207,806,808],{"class":807},"sBMFI","DrainContext",[207,810,811],{"class":217},">",[207,813,291],{"class":221},[207,815,294],{"class":217},[207,817,818,821,823,825,827,829,832,834,836,838,841],{"class":209,"line":356},[207,819,820],{"class":300},"  batch",[207,822,304],{"class":217},[207,824,218],{"class":217},[207,826,588],{"class":300},[207,828,304],{"class":217},[207,830,831],{"class":593}," 100",[207,833,225],{"class":217},[207,835,599],{"class":300},[207,837,304],{"class":217},[207,839,840],{"class":593}," 10000",[207,842,322],{"class":217},[207,844,845,848,850,852,855,857,860],{"class":209,"line":635},[207,846,847],{"class":300},"  retry",[207,849,304],{"class":217},[207,851,218],{"class":217},[207,853,854],{"class":300}," maxAttempts",[207,856,304],{"class":217},[207,858,859],{"class":593}," 5",[207,861,322],{"class":217},[207,863,865,867],{"class":209,"line":864},11,[207,866,328],{"class":217},[207,868,331],{"class":221},[207,870,872],{"class":209,"line":871},12,[207,873,272],{"emptyLinePlaceholder":271},[207,875,877,879,881,883,886],{"class":209,"line":876},13,[207,878,279],{"class":278},[207,880,282],{"class":221},[207,882,285],{"class":217},[207,884,885],{"class":288}," pipeline",[207,887,888],{"class":221},"(transport)\n",[192,890,892],{"id":891},"configuration-reference","Configuration Reference",[467,894,896],{"id":895},"browserdrainconfig",[204,897,898],{},"BrowserDrainConfig",[900,901,902,918],"table",{},[903,904,905],"thead",{},[906,907,908,912,915],"tr",{},[909,910,911],"th",{},"Option",[909,913,914],{},"Default",[909,916,917],{},"Description",[919,920,921,938,961,976],"tbody",{},[906,922,923,929,932],{},[924,925,926],"td",{},[204,927,928],{},"endpoint",[924,930,931],{},"—",[924,933,934,937],{},[423,935,936],{},"(required)"," Full URL of the server ingest endpoint",[906,939,940,945,947],{},[924,941,942],{},[204,943,944],{},"headers",[924,946,931],{},[924,948,949,950,952,953,956,957,960],{},"Custom headers sent with each ",[204,951,438],{}," request (e.g. ",[204,954,955],{},"Authorization",", ",[204,958,959],{},"X-API-Key",")",[906,962,963,968,973],{},[924,964,965],{},[204,966,967],{},"timeout",[924,969,970],{},[204,971,972],{},"5000",[924,974,975],{},"Request timeout in milliseconds",[906,977,978,983,988],{},[924,979,980],{},[204,981,982],{},"useBeacon",[924,984,985],{},[204,986,987],{},"true",[924,989,990,991,994],{},"Use ",[204,992,993],{},"sendBeacon"," when the page is hidden",[467,996,998],{"id":997},"browserlogdrainoptions",[204,999,1000],{},"BrowserLogDrainOptions",[900,1002,1003,1013],{},[903,1004,1005],{},[906,1006,1007,1009,1011],{},[909,1008,911],{},[909,1010,914],{},[909,1012,917],{},[919,1014,1015,1032,1047],{},[906,1016,1017,1022,1024],{},[924,1018,1019],{},[204,1020,1021],{},"drain",[924,1023,931],{},[924,1025,1026,1028,1029,1031],{},[423,1027,936],{}," ",[204,1030,898],{}," object",[906,1033,1034,1039,1044],{},[924,1035,1036],{},[204,1037,1038],{},"pipeline",[924,1040,1041],{},[204,1042,1043],{},"{ batch: { size: 25, intervalMs: 2000 }, retry: { maxAttempts: 2 } }",[924,1045,1046],{},"Pipeline configuration overrides",[906,1048,1049,1054,1058],{},[924,1050,1051],{},[204,1052,1053],{},"autoFlush",[924,1055,1056],{},[204,1057,987],{},[924,1059,1060,1061,1063],{},"Auto-register ",[204,1062,478],{}," flush listener",[192,1065,1067],{"id":1066},"sendbeacon-fallback","sendBeacon Fallback",[1069,1070,1072,1073,1075,1076,1078,1079,1081],"callout",{"color":365,"icon":1071},"i-lucide-radio","When ",[204,1074,982],{}," is enabled (the default) and the page becomes hidden, the drain automatically switches from ",[204,1077,438],{}," to ",[204,1080,449],{},". This ensures logs are delivered even when the user closes the tab or navigates away — no data loss on page exit.",[188,1083,1084,1086],{},[204,1085,993],{}," 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).",[192,1088,1090],{"id":1089},"authentication","Authentication",[188,1092,1093],{},"Pass custom headers to protect your ingest endpoint:",[196,1095,1097],{"className":198,"code":1096,"language":201,"meta":202,"style":202},"const drain = createBrowserLogDrain({\n  drain: {\n    endpoint: 'https://logs.example.com/v1/ingest',\n    headers: {\n      'Authorization': 'Bearer ' + token,\n    },\n  },\n})\n",[204,1098,1099,1113,1122,1137,1146,1172,1177,1182],{"__ignoreMap":202},[207,1100,1101,1103,1105,1107,1109,1111],{"class":209,"line":210},[207,1102,279],{"class":278},[207,1104,282],{"class":221},[207,1106,285],{"class":217},[207,1108,254],{"class":288},[207,1110,291],{"class":221},[207,1112,294],{"class":217},[207,1114,1115,1117,1119],{"class":209,"line":247},[207,1116,301],{"class":300},[207,1118,304],{"class":217},[207,1120,1121],{"class":217}," {\n",[207,1123,1124,1127,1129,1131,1133,1135],{"class":209,"line":268},[207,1125,1126],{"class":300},"    endpoint",[207,1128,304],{"class":217},[207,1130,237],{"class":217},[207,1132,316],{"class":240},[207,1134,319],{"class":217},[207,1136,784],{"class":217},[207,1138,1139,1142,1144],{"class":209,"line":275},[207,1140,1141],{"class":300},"    headers",[207,1143,304],{"class":217},[207,1145,1121],{"class":217},[207,1147,1148,1151,1153,1155,1157,1159,1162,1164,1167,1170],{"class":209,"line":297},[207,1149,1150],{"class":217},"      '",[207,1152,955],{"class":300},[207,1154,319],{"class":217},[207,1156,304],{"class":217},[207,1158,237],{"class":217},[207,1160,1161],{"class":240},"Bearer ",[207,1163,319],{"class":217},[207,1165,1166],{"class":217}," +",[207,1168,1169],{"class":221}," token",[207,1171,784],{"class":217},[207,1173,1174],{"class":209,"line":325},[207,1175,1176],{"class":217},"    },\n",[207,1178,1179],{"class":209,"line":334},[207,1180,1181],{"class":217},"  },\n",[207,1183,1184,1186],{"class":209,"line":351},[207,1185,328],{"class":217},[207,1187,331],{"class":221},[1069,1189,1191,1193,1194,1196,1197,1199,1200,1202,1203,1206,1207,439,1209,362],{"color":1190,"icon":44},"warning",[204,1192,944],{}," are applied to ",[204,1195,438],{}," requests only. The ",[204,1198,993],{}," API does not support custom headers — when the page is hidden and ",[204,1201,993],{}," is used, headers are not sent. If your endpoint requires authentication, consider validating via a session cookie (",[204,1204,1205],{},"credentials: 'same-origin'"," is set by default) or disable ",[204,1208,993],{},[204,1210,1211],{},"useBeacon: false",[192,1213,1215],{"id":1214},"server-endpoint","Server Endpoint",[188,1217,1218,1219,1221],{},"Your server needs a POST endpoint that accepts a ",[204,1220,460],{}," JSON body. Here are examples for common frameworks:",[467,1223,157],{"id":1224},"express",[196,1226,1229],{"className":198,"code":1227,"filename":1228,"language":201,"meta":202,"style":202},"app.post('/v1/ingest', 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",[204,1230,1231,1284,1312,1348,1353,1370],{"__ignoreMap":202},[207,1232,1233,1236,1238,1241,1243,1245,1248,1250,1252,1255,1257,1260,1263,1265,1268,1272,1274,1277,1279,1282],{"class":209,"line":210},[207,1234,1235],{"class":221},"app",[207,1237,362],{"class":217},[207,1239,1240],{"class":288},"post",[207,1242,291],{"class":221},[207,1244,319],{"class":217},[207,1246,1247],{"class":240},"/v1/ingest",[207,1249,319],{"class":217},[207,1251,225],{"class":217},[207,1253,1254],{"class":221}," express",[207,1256,362],{"class":217},[207,1258,1259],{"class":288},"json",[207,1261,1262],{"class":221},"()",[207,1264,225],{"class":217},[207,1266,1267],{"class":217}," (",[207,1269,1271],{"class":1270},"sHdIc","req",[207,1273,225],{"class":217},[207,1275,1276],{"class":1270}," res",[207,1278,960],{"class":217},[207,1280,1281],{"class":278}," =>",[207,1283,1121],{"class":217},[207,1285,1286,1289,1291,1293,1296,1299,1302,1304,1307,1310],{"class":209,"line":247},[207,1287,1288],{"class":213},"  for",[207,1290,1267],{"class":300},[207,1292,279],{"class":278},[207,1294,1295],{"class":221}," entry",[207,1297,1298],{"class":217}," of",[207,1300,1301],{"class":221}," req",[207,1303,362],{"class":217},[207,1305,1306],{"class":221},"body",[207,1308,1309],{"class":300},") ",[207,1311,294],{"class":217},[207,1313,1314,1317,1319,1321,1323,1325,1328,1330,1332,1335,1337,1340,1342,1345],{"class":209,"line":268},[207,1315,1316],{"class":221},"    console",[207,1318,362],{"class":217},[207,1320,359],{"class":288},[207,1322,291],{"class":300},[207,1324,319],{"class":217},[207,1326,1327],{"class":240},"[BROWSER]",[207,1329,319],{"class":217},[207,1331,225],{"class":217},[207,1333,1334],{"class":221}," JSON",[207,1336,362],{"class":217},[207,1338,1339],{"class":288},"stringify",[207,1341,291],{"class":300},[207,1343,1344],{"class":221},"entry",[207,1346,1347],{"class":300},"))\n",[207,1349,1350],{"class":209,"line":275},[207,1351,1352],{"class":217},"  }\n",[207,1354,1355,1358,1360,1363,1365,1368],{"class":209,"line":297},[207,1356,1357],{"class":221},"  res",[207,1359,362],{"class":217},[207,1361,1362],{"class":288},"sendStatus",[207,1364,291],{"class":300},[207,1366,1367],{"class":593},"204",[207,1369,331],{"class":300},[207,1371,1372,1374],{"class":209,"line":325},[207,1373,328],{"class":217},[207,1375,331],{"class":221},[467,1377,152],{"id":1378},"hono",[196,1380,1382],{"className":198,"code":1381,"filename":1228,"language":201,"meta":202,"style":202},"app.post('/v1/ingest', 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",[204,1383,1384,1416,1444,1462,1492,1496,1517],{"__ignoreMap":202},[207,1385,1386,1388,1390,1392,1394,1396,1398,1400,1402,1405,1407,1410,1412,1414],{"class":209,"line":210},[207,1387,1235],{"class":221},[207,1389,362],{"class":217},[207,1391,1240],{"class":288},[207,1393,291],{"class":221},[207,1395,319],{"class":217},[207,1397,1247],{"class":240},[207,1399,319],{"class":217},[207,1401,225],{"class":217},[207,1403,1404],{"class":278}," async",[207,1406,1267],{"class":217},[207,1408,1409],{"class":1270},"c",[207,1411,960],{"class":217},[207,1413,1281],{"class":278},[207,1415,1121],{"class":217},[207,1417,1418,1421,1424,1427,1430,1433,1435,1437,1439,1441],{"class":209,"line":247},[207,1419,1420],{"class":278},"  const",[207,1422,1423],{"class":221}," body",[207,1425,1426],{"class":217}," =",[207,1428,1429],{"class":213}," await",[207,1431,1432],{"class":221}," c",[207,1434,362],{"class":217},[207,1436,1271],{"class":221},[207,1438,362],{"class":217},[207,1440,1259],{"class":288},[207,1442,1443],{"class":300},"()\n",[207,1445,1446,1448,1450,1452,1454,1456,1458,1460],{"class":209,"line":268},[207,1447,1288],{"class":213},[207,1449,1267],{"class":300},[207,1451,279],{"class":278},[207,1453,1295],{"class":221},[207,1455,1298],{"class":217},[207,1457,1423],{"class":221},[207,1459,1309],{"class":300},[207,1461,294],{"class":217},[207,1463,1464,1466,1468,1470,1472,1474,1476,1478,1480,1482,1484,1486,1488,1490],{"class":209,"line":275},[207,1465,1316],{"class":221},[207,1467,362],{"class":217},[207,1469,359],{"class":288},[207,1471,291],{"class":300},[207,1473,319],{"class":217},[207,1475,1327],{"class":240},[207,1477,319],{"class":217},[207,1479,225],{"class":217},[207,1481,1334],{"class":221},[207,1483,362],{"class":217},[207,1485,1339],{"class":288},[207,1487,291],{"class":300},[207,1489,1344],{"class":221},[207,1491,1347],{"class":300},[207,1493,1494],{"class":209,"line":297},[207,1495,1352],{"class":217},[207,1497,1498,1501,1503,1505,1507,1509,1512,1515],{"class":209,"line":325},[207,1499,1500],{"class":213},"  return",[207,1502,1432],{"class":221},[207,1504,362],{"class":217},[207,1506,1306],{"class":288},[207,1508,291],{"class":300},[207,1510,1511],{"class":217},"null,",[207,1513,1514],{"class":593}," 204",[207,1516,331],{"class":300},[207,1518,1519,1521],{"class":209,"line":334},[207,1520,328],{"class":217},[207,1522,331],{"class":221},[192,1524,1526],{"id":1525},"full-control","Full Control",[188,1528,1529,1530,439,1533,1536],{},"Combine ",[204,1531,1532],{},"createBrowserDrain",[204,1534,1535],{},"createDrainPipeline"," for maximum flexibility:",[196,1538,1540],{"className":198,"code":1539,"filename":200,"language":201,"meta":202,"style":202},"import { initLogger, log } from 'evlog'\nimport type { DrainContext } from 'evlog'\nimport { createBrowserDrain } from 'evlog/browser'\nimport { createDrainPipeline } from 'evlog/pipeline'\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} browser events`)\n  },\n})\n\nconst drain = pipeline(createBrowserDrain({\n  endpoint: 'https://logs.example.com/v1/ingest',\n  timeout: 3000,\n}))\n\ninitLogger({ drain })\n\nlog.info({ action: 'app_init' })\n\n// Flush on page unload\nwindow.addEventListener('beforeunload', () => drain.flush())\n",[204,1541,1542,1564,1584,1602,1620,1624,1644,1668,1698,1710,1728,1764,1768,1774,1779,1798,1813,1826,1833,1838,1853,1858,1886,1891,1898],{"__ignoreMap":202},[207,1543,1544,1546,1548,1550,1552,1554,1556,1558,1560,1562],{"class":209,"line":210},[207,1545,214],{"class":213},[207,1547,218],{"class":217},[207,1549,222],{"class":221},[207,1551,225],{"class":217},[207,1553,228],{"class":221},[207,1555,231],{"class":217},[207,1557,234],{"class":213},[207,1559,237],{"class":217},[207,1561,241],{"class":240},[207,1563,244],{"class":217},[207,1565,1566,1568,1570,1572,1574,1576,1578,1580,1582],{"class":209,"line":247},[207,1567,214],{"class":213},[207,1569,734],{"class":213},[207,1571,218],{"class":217},[207,1573,739],{"class":221},[207,1575,231],{"class":217},[207,1577,234],{"class":213},[207,1579,237],{"class":217},[207,1581,241],{"class":240},[207,1583,244],{"class":217},[207,1585,1586,1588,1590,1592,1594,1596,1598,1600],{"class":209,"line":268},[207,1587,214],{"class":213},[207,1589,218],{"class":217},[207,1591,697],{"class":221},[207,1593,231],{"class":217},[207,1595,234],{"class":213},[207,1597,237],{"class":217},[207,1599,263],{"class":240},[207,1601,244],{"class":217},[207,1603,1604,1606,1608,1610,1612,1614,1616,1618],{"class":209,"line":275},[207,1605,214],{"class":213},[207,1607,218],{"class":217},[207,1609,716],{"class":221},[207,1611,231],{"class":217},[207,1613,234],{"class":213},[207,1615,237],{"class":217},[207,1617,725],{"class":240},[207,1619,244],{"class":217},[207,1621,1622],{"class":209,"line":297},[207,1623,272],{"emptyLinePlaceholder":271},[207,1625,1626,1628,1630,1632,1634,1636,1638,1640,1642],{"class":209,"line":325},[207,1627,279],{"class":278},[207,1629,797],{"class":221},[207,1631,285],{"class":217},[207,1633,716],{"class":288},[207,1635,804],{"class":217},[207,1637,808],{"class":807},[207,1639,811],{"class":217},[207,1641,291],{"class":221},[207,1643,294],{"class":217},[207,1645,1646,1648,1650,1652,1654,1656,1658,1660,1662,1664,1666],{"class":209,"line":334},[207,1647,820],{"class":300},[207,1649,304],{"class":217},[207,1651,218],{"class":217},[207,1653,588],{"class":300},[207,1655,304],{"class":217},[207,1657,831],{"class":593},[207,1659,225],{"class":217},[207,1661,599],{"class":300},[207,1663,304],{"class":217},[207,1665,840],{"class":593},[207,1667,322],{"class":217},[207,1669,1670,1672,1674,1676,1678,1680,1682,1684,1687,1689,1691,1694,1696],{"class":209,"line":351},[207,1671,847],{"class":300},[207,1673,304],{"class":217},[207,1675,218],{"class":217},[207,1677,854],{"class":300},[207,1679,304],{"class":217},[207,1681,859],{"class":593},[207,1683,225],{"class":217},[207,1685,1686],{"class":300}," backoff",[207,1688,304],{"class":217},[207,1690,237],{"class":217},[207,1692,1693],{"class":240},"exponential",[207,1695,319],{"class":217},[207,1697,322],{"class":217},[207,1699,1700,1703,1705,1708],{"class":209,"line":356},[207,1701,1702],{"class":300},"  maxBufferSize",[207,1704,304],{"class":217},[207,1706,1707],{"class":593}," 500",[207,1709,784],{"class":217},[207,1711,1712,1715,1717,1719,1722,1724,1726],{"class":209,"line":635},[207,1713,1714],{"class":288},"  onDropped",[207,1716,304],{"class":217},[207,1718,1267],{"class":217},[207,1720,1721],{"class":1270},"events",[207,1723,960],{"class":217},[207,1725,1281],{"class":278},[207,1727,1121],{"class":217},[207,1729,1730,1732,1734,1737,1739,1742,1745,1748,1750,1752,1755,1757,1760,1762],{"class":209,"line":864},[207,1731,1316],{"class":221},[207,1733,362],{"class":217},[207,1735,1736],{"class":288},"warn",[207,1738,291],{"class":300},[207,1740,1741],{"class":217},"`",[207,1743,1744],{"class":240},"Dropped ",[207,1746,1747],{"class":217},"${",[207,1749,1721],{"class":221},[207,1751,362],{"class":217},[207,1753,1754],{"class":221},"length",[207,1756,328],{"class":217},[207,1758,1759],{"class":240}," browser events",[207,1761,1741],{"class":217},[207,1763,331],{"class":300},[207,1765,1766],{"class":209,"line":871},[207,1767,1181],{"class":217},[207,1769,1770,1772],{"class":209,"line":876},[207,1771,328],{"class":217},[207,1773,331],{"class":221},[207,1775,1777],{"class":209,"line":1776},14,[207,1778,272],{"emptyLinePlaceholder":271},[207,1780,1782,1784,1786,1788,1790,1792,1794,1796],{"class":209,"line":1781},15,[207,1783,279],{"class":278},[207,1785,282],{"class":221},[207,1787,285],{"class":217},[207,1789,885],{"class":288},[207,1791,291],{"class":221},[207,1793,1532],{"class":288},[207,1795,291],{"class":221},[207,1797,294],{"class":217},[207,1799,1801,1803,1805,1807,1809,1811],{"class":209,"line":1800},16,[207,1802,773],{"class":300},[207,1804,304],{"class":217},[207,1806,237],{"class":217},[207,1808,316],{"class":240},[207,1810,319],{"class":217},[207,1812,784],{"class":217},[207,1814,1816,1819,1821,1824],{"class":209,"line":1815},17,[207,1817,1818],{"class":300},"  timeout",[207,1820,304],{"class":217},[207,1822,1823],{"class":593}," 3000",[207,1825,784],{"class":217},[207,1827,1829,1831],{"class":209,"line":1828},18,[207,1830,328],{"class":217},[207,1832,1347],{"class":221},[207,1834,1836],{"class":209,"line":1835},19,[207,1837,272],{"emptyLinePlaceholder":271},[207,1839,1841,1843,1845,1847,1849,1851],{"class":209,"line":1840},20,[207,1842,337],{"class":288},[207,1844,291],{"class":221},[207,1846,342],{"class":217},[207,1848,282],{"class":221},[207,1850,328],{"class":217},[207,1852,331],{"class":221},[207,1854,1856],{"class":209,"line":1855},21,[207,1857,272],{"emptyLinePlaceholder":271},[207,1859,1861,1863,1865,1867,1869,1871,1873,1875,1877,1880,1882,1884],{"class":209,"line":1860},22,[207,1862,359],{"class":221},[207,1864,362],{"class":217},[207,1866,365],{"class":288},[207,1868,291],{"class":221},[207,1870,342],{"class":217},[207,1872,372],{"class":300},[207,1874,304],{"class":217},[207,1876,237],{"class":217},[207,1878,1879],{"class":240},"app_init",[207,1881,319],{"class":217},[207,1883,231],{"class":217},[207,1885,331],{"class":221},[207,1887,1889],{"class":209,"line":1888},23,[207,1890,272],{"emptyLinePlaceholder":271},[207,1892,1894],{"class":209,"line":1893},24,[207,1895,1897],{"class":1896},"sHwdD","// Flush on page unload\n",[207,1899,1901,1904,1906,1909,1911,1913,1916,1918,1920,1923,1925,1928,1930,1933],{"class":209,"line":1900},25,[207,1902,1903],{"class":221},"window",[207,1905,362],{"class":217},[207,1907,1908],{"class":288},"addEventListener",[207,1910,291],{"class":221},[207,1912,319],{"class":217},[207,1914,1915],{"class":240},"beforeunload",[207,1917,319],{"class":217},[207,1919,225],{"class":217},[207,1921,1922],{"class":217}," ()",[207,1924,1281],{"class":278},[207,1926,1927],{"class":221}," drain",[207,1929,362],{"class":217},[207,1931,1932],{"class":288},"flush",[207,1934,1935],{"class":221},"())\n",[1069,1937,1940,1941,1948],{"color":1938,"icon":1939},"neutral","i-lucide-arrow-right","See the full ",[1942,1943,1947],"a",{"href":1944,"rel":1945},"https://github.com/HugoRCD/evlog/tree/main/examples/browser",[1946],"nofollow","browser example"," for a working Hono server + browser page that demonstrates the complete flow end to end.",[1069,1950,1951,1952,1955],{"color":1938,"icon":94},"See the ",[1942,1953,1954],{"href":143},"Next.js example"," for a working implementation.",[192,1957,1959],{"id":1958},"next-steps","Next Steps",[1961,1962,1963,1969,1974],"ul",{},[409,1964,1965,1968],{},[1942,1966,1967],{"href":62},"Adapters Overview"," — Available built-in adapters",[409,1970,1971,1973],{},[1942,1972,96],{"href":97}," — Batching, retry, and buffer overflow handling",[409,1975,1976,1978],{},[1942,1977,91],{"href":92}," — Build your own drain function",[1980,1981,1982],"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":202,"searchDepth":247,"depth":247,"links":1984},[1985,1986,1987,1991,1995,1996,1997,2001,2002],{"id":194,"depth":247,"text":20},{"id":403,"depth":247,"text":404},{"id":464,"depth":247,"text":465,"children":1988},[1989,1990],{"id":469,"depth":268,"text":472},{"id":677,"depth":268,"text":680},{"id":891,"depth":247,"text":892,"children":1992},[1993,1994],{"id":895,"depth":268,"text":898},{"id":997,"depth":268,"text":1000},{"id":1066,"depth":247,"text":1067},{"id":1089,"depth":247,"text":1090},{"id":1214,"depth":247,"text":1215,"children":1998},[1999,2000],{"id":1224,"depth":268,"text":157},{"id":1378,"depth":268,"text":152},{"id":1525,"depth":247,"text":1526},{"id":1958,"depth":247,"text":1959},"Framework-agnostic browser log transport for sending client-side logs to your server via fetch or sendBeacon. Works with any frontend stack.","md",[2006,2008],{"label":1967,"icon":64,"to":62,"color":1938,"variant":2007},"subtle",{"label":96,"icon":99,"to":97,"color":1938,"variant":2007},{},{"title":101,"icon":104},{"title":183,"description":2003},"bRdRvOvX4y5ED0YNG3DN03sFBWNFR3WDEEIGEUhJ2gE",[2014,2016],{"title":96,"path":97,"stem":98,"description":2015,"icon":99,"children":-1},"Batch events, retry on failure, and protect against buffer overflow with the shared drain pipeline. Supports fan-out to multiple adapters.",{"title":61,"path":111,"stem":112,"description":2017,"icon":28,"children":-1},"Enrich your wide events with derived context like user agent, geo data, request size, and trace context. Built-in enrichers and custom enricher support.",1772899531570]