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