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