[{"data":1,"prerenderedAt":1976},["ShallowReactive",2],{"navigation_docs":3,"-extend-stream":424,"-extend-stream-surround":1971},[4,25,75,230,338,393],{"title":5,"path":6,"stem":7,"children":8,"page":24},"Start","\u002Fstart","1.start",[9,14,19],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fstart\u002Finstallation","1.start\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F3.quick-start","i-lucide-zap",false,{"title":26,"path":27,"stem":28,"children":29,"page":24},"Learn","\u002Flearn","2.learn",[30,35,40,45,50,55,60,65,70],{"title":31,"path":32,"stem":33,"icon":34},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":36,"path":37,"stem":38,"icon":39},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":41,"path":42,"stem":43,"icon":44},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":46,"path":47,"stem":48,"icon":49},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":51,"path":52,"stem":53,"icon":54},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":56,"path":57,"stem":58,"icon":59},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":61,"path":62,"stem":63,"icon":64},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":66,"path":67,"stem":68,"icon":69},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":71,"path":72,"stem":73,"icon":74},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":76,"path":77,"stem":78,"children":79,"page":24},"Integrate","\u002Fintegrate","3.integrate",[80,84,147],{"title":31,"path":81,"stem":82,"icon":83},"\u002Fintegrate\u002Foverview","3.integrate\u002F0.overview","i-lucide-plug",{"title":85,"path":86,"stem":87,"children":88,"page":24},"Adapters","\u002Fintegrate\u002Fadapters","3.integrate\u002Fadapters",[89,92,132],{"title":31,"path":90,"stem":91,"icon":34},"\u002Fintegrate\u002Fadapters\u002Foverview","3.integrate\u002Fadapters\u002F01.overview",{"title":93,"path":94,"stem":95,"children":96,"page":24},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","3.integrate\u002Fadapters\u002Fcloud",[97,102,107,112,117,122,127],{"title":98,"path":99,"stem":100,"icon":101},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","3.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":103,"path":104,"stem":105,"icon":106},"OTLP","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fotlp","3.integrate\u002Fadapters\u002Fcloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":108,"path":109,"stem":110,"icon":111},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","3.integrate\u002Fadapters\u002Fcloud\u002F03.posthog","i-simple-icons-posthog",{"title":113,"path":114,"stem":115,"icon":116},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","3.integrate\u002Fadapters\u002Fcloud\u002F04.sentry","i-simple-icons-sentry",{"title":118,"path":119,"stem":120,"icon":121},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","3.integrate\u002Fadapters\u002Fcloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":123,"path":124,"stem":125,"icon":126},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","3.integrate\u002Fadapters\u002Fcloud\u002F06.datadog","i-simple-icons-datadog",{"title":128,"path":129,"stem":130,"icon":131},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fhyperdx","3.integrate\u002Fadapters\u002Fcloud\u002F07.hyperdx","i-custom-hyperdx",{"title":133,"path":134,"stem":135,"children":136,"page":24},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","3.integrate\u002Fadapters\u002Fself-hosted",[137,142],{"title":138,"path":139,"stem":140,"icon":141},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","3.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":143,"path":144,"stem":145,"icon":146},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","3.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":148,"path":149,"stem":150,"children":151,"page":24},"Frameworks","\u002Fintegrate\u002Fframeworks","3.integrate\u002Fframeworks",[152,156,161,166,171,176,181,186,191,196,201,206,211,216,220,225],{"title":31,"path":153,"stem":154,"icon":155},"\u002Fintegrate\u002Fframeworks\u002Foverview","3.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":157,"path":158,"stem":159,"icon":160},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","3.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":162,"path":163,"stem":164,"icon":165},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","3.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":167,"path":168,"stem":169,"icon":170},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","3.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":172,"path":173,"stem":174,"icon":175},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","3.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":177,"path":178,"stem":179,"icon":180},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","3.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":182,"path":183,"stem":184,"icon":185},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","3.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":187,"path":188,"stem":189,"icon":190},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","3.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":192,"path":193,"stem":194,"icon":195},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","3.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":197,"path":198,"stem":199,"icon":200},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","3.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":202,"path":203,"stem":204,"icon":205},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","3.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":207,"path":208,"stem":209,"icon":210},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","3.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":212,"path":213,"stem":214,"icon":215},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","3.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":217,"path":218,"stem":219,"icon":69},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","3.integrate\u002Fframeworks\u002F13.standalone",{"title":221,"path":222,"stem":223,"icon":224},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","3.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":226,"path":227,"stem":228,"icon":229},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","3.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":231,"path":232,"stem":233,"children":234,"page":24},"Use Cases","\u002Fuse-cases","4.use-cases",[235,239,244,273,301,333],{"title":31,"path":236,"stem":237,"icon":238},"\u002Fuse-cases\u002Foverview","4.use-cases\u002F0.overview","i-lucide-list-checks",{"title":240,"path":241,"stem":242,"icon":243},"Client Logging","\u002Fuse-cases\u002Fclient-logging","4.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":245,"icon":246,"path":247,"stem":248,"children":249,"page":24},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","4.use-cases\u002F2.ai-sdk",[250,253,258,263,268],{"title":31,"path":251,"stem":252,"icon":34},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","4.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":254,"path":255,"stem":256,"icon":257},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","4.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":259,"path":260,"stem":261,"icon":262},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","4.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":264,"path":265,"stem":266,"icon":267},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","4.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":269,"path":270,"stem":271,"icon":272},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","4.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":274,"icon":275,"path":276,"stem":277,"children":278,"page":24},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","4.use-cases\u002F3.better-auth",[279,282,287,292,296],{"title":31,"path":280,"stem":281,"icon":34},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","4.use-cases\u002F3.better-auth\u002F01.overview",{"title":283,"path":284,"stem":285,"icon":286},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","4.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":288,"path":289,"stem":290,"icon":291},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","4.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":293,"path":294,"stem":295,"icon":243},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","4.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":297,"path":298,"stem":299,"icon":300},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","4.use-cases\u002F3.better-auth\u002F05.performance","i-lucide-gauge",{"title":302,"icon":303,"path":304,"stem":305,"children":306,"page":24},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","4.use-cases\u002F4.audit",[307,310,315,320,325,329],{"title":31,"path":308,"stem":309,"icon":34},"\u002Fuse-cases\u002Faudit\u002Foverview","4.use-cases\u002F4.audit\u002F01.overview",{"title":311,"path":312,"stem":313,"icon":314},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","4.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":316,"path":317,"stem":318,"icon":319},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","4.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":321,"path":322,"stem":323,"icon":324},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","4.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":326,"path":327,"stem":328,"icon":303},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","4.use-cases\u002F4.audit\u002F05.compliance",{"title":330,"path":331,"stem":332,"icon":74},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","4.use-cases\u002F4.audit\u002F06.recipes",{"title":334,"path":335,"stem":336,"icon":337},"Enrichers","\u002Fuse-cases\u002Fenrichers","4.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":339,"path":340,"stem":341,"children":342,"page":24},"Extend","\u002Fextend","5.extend",[343,347,352,357,362,366,370,374,378,383,388],{"title":31,"path":344,"stem":345,"icon":346},"\u002Fextend\u002Foverview","5.extend\u002F0.overview","i-lucide-blocks",{"title":348,"path":349,"stem":350,"icon":351},"Stream","\u002Fextend\u002Fstream","5.extend\u002F1.stream","i-lucide-radio-tower",{"title":353,"path":354,"stem":355,"icon":356},"Custom framework","\u002Fextend\u002Fcustom-framework","5.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":358,"path":359,"stem":360,"icon":361},"FS reader","\u002Fextend\u002Ffs-reader","5.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":330,"path":363,"stem":364,"icon":365},"\u002Fextend\u002Fconsumer-recipes","5.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":367,"path":368,"stem":369,"icon":346},"Plugins","\u002Fextend\u002Fplugins","5.extend\u002F4.plugins",{"title":371,"path":372,"stem":373,"icon":337},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","5.extend\u002F5.custom-enrichers",{"title":375,"path":376,"stem":377,"icon":59},"Tail sampling","\u002Fextend\u002Ftail-sampling","5.extend\u002F6.tail-sampling",{"title":379,"path":380,"stem":381,"icon":382},"Identity headers","\u002Fextend\u002Fidentity-headers","5.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":384,"path":385,"stem":386,"icon":387},"Custom drains","\u002Fextend\u002Fcustom-drains","5.extend\u002F8.custom-drains","i-lucide-share-2",{"title":389,"path":390,"stem":391,"icon":392},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","5.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":394,"path":395,"stem":396,"children":397,"page":24},"Reference","\u002Freference","6.reference",[398,403,406,411,415,420],{"title":399,"path":400,"stem":401,"icon":402},"Configuration","\u002Freference\u002Fconfiguration","6.reference\u002F1.configuration","i-lucide-settings",{"title":297,"path":404,"stem":405,"icon":300},"\u002Freference\u002Fperformance","6.reference\u002F2.performance",{"title":407,"path":408,"stem":409,"icon":410},"Vite Plugin","\u002Freference\u002Fvite-plugin","6.reference\u002F3.vite-plugin","i-custom-vite",{"title":412,"path":413,"stem":414,"icon":303},"Best Practices","\u002Freference\u002Fbest-practices","6.reference\u002F4.best-practices",{"title":416,"path":417,"stem":418,"icon":419},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","6.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":421,"path":422,"stem":423,"icon":337},"Agent Skills","\u002Freference\u002Fagent-skills","6.reference\u002F6.agent-skills",{"id":425,"title":348,"body":426,"description":1964,"extension":1965,"links":1966,"meta":1967,"navigation":1968,"path":349,"seo":1969,"stem":350,"__hash__":1970},"docs\u002F5.extend\u002F1.stream.md",{"type":427,"value":428,"toc":1951},"minimark",[429,438,462,477,481,484,489,566,885,889,976,985,989,992,1001,1007,1077,1081,1087,1125,1128,1132,1401,1414,1418,1421,1437,1440,1512,1515,1570,1574,1580,1668,1834,1838,1930,1934,1947],[430,431,432,433,437],"p",{},"evlog ships a ",[434,435,436],"strong",{},"stream primitive"," so any local consumer can subscribe to wide events without re-implementing a drain. There are two layers, building on each other:",[439,440,441,453],"ul",{},[442,443,444,447,448,452],"li",{},[434,445,446],{},"In-process bus"," — ",[449,450,451],"code",{},"createStreamDrain()",", the canonical pub\u002Fsub. Sync listeners, async iterators, ring-buffered replay.",[442,454,455,447,458,461],{},[434,456,457],{},"Network bridge",[449,459,460],{},"startStreamServer()",", an opt-in HTTP mini-server that exposes the in-process bus over Server-Sent Events for browsers, CLIs, or external devtools.",[463,464,465,468,469,472,473,476],"callout",{"icon":291},[434,466,467],{},"Local-only by design."," Both layers live inside a single Node \u002F Bun \u002F Deno process. They work in ",[449,470,471],{},"pnpm dev",", on long-lived self-hosted servers, on VMs and containers (Fly, Railway, Coolify…). They do ",[434,474,475],{},"not"," work on serverless platforms (Vercel Functions, Cloudflare Workers, AWS Lambda) — each invocation is an isolated process. Use a real broker (Redis Streams, NATS, Pub\u002FSub) for cross-instance fan-out there.",[478,479,446],"h2",{"id":480},"in-process-bus",[482,483],"stream-bus",{},[430,485,486,488],{},[449,487,451],{}," is just a drain. Register it on the evlog drain hook and subscribe to events as they're emitted — no HTTP, no serialization, no extra hops.",[490,491,494,497,557],"prompt",{":actions":492,"description":493,"icon":351},"[\"copy\",\"cursor\",\"windsurf\"]","Subscribe to wide events in-process",[430,495,496],{},"Wire an in-process subscriber on top of evlog's stream drain.",[439,498,499,510,525,536,543,554],{},[442,500,501,502,505,506,509],{},"Import ",[449,503,504],{},"createStreamDrain"," from ",[449,507,508],{},"evlog\u002Fstream"," and call it once at app boot",[442,511,512,513,516,517,520,521,524],{},"Register the returned ",[449,514,515],{},"drain"," on the evlog drain hook for my framework (Nitro: ",[449,518,519],{},"nitroApp.hooks.hook('evlog:drain', stream.drain)","; Next\u002Fstandalone: pass to ",[449,522,523],{},"initLogger({ drain })",")",[442,526,527,528,531,532,535],{},"Subscribe with ",[449,529,530],{},"stream.subscribe((event) => ...)"," for sync listeners or ",[449,533,534],{},"for await (const event of stream.events())"," for async iteration",[442,537,538,539,542],{},"Seed history for late subscribers with ",[449,540,541],{},"stream.recent()"," (snapshot of the ring buffer) before opening the live iterator",[442,544,545,546,549,550,553],{},"Tune ",[449,547,548],{},"buffer"," for replay history and ",[449,551,552],{},"perSubscriberQueue"," for slow-consumer backpressure",[442,555,556],{},"Skip on serverless platforms — the stream is in-process, isolated invocations won't share it",[430,558,559,560],{},"Docs: ",[561,562,563],"a",{"href":563,"rel":564},"https:\u002F\u002Fwww.evlog.dev\u002Fextend\u002Fstream",[565],"nofollow",[567,568,573],"pre",{"className":569,"code":570,"language":571,"meta":572,"style":572},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createStreamDrain } from 'evlog\u002Fstream'\n\nconst stream = createStreamDrain({ buffer: 200 })\n\nnitroApp.hooks.hook('evlog:drain', stream.drain)\n\nconst off = stream.subscribe((event) => {\n  if (event.level === 'error') notify(event)\n})\noff()\n\nfor (const past of stream.recent()) {\n  bootstrap(past)\n}\nfor await (const event of stream.events()) {\n  bootstrap(event)\n}\n","ts","",[449,574,575,607,614,652,657,695,700,733,771,779,788,793,822,835,841,869,880],{"__ignoreMap":572},[576,577,580,584,588,592,595,598,601,604],"span",{"class":578,"line":579},"line",1,[576,581,583],{"class":582},"s7zQu","import",[576,585,587],{"class":586},"sMK4o"," {",[576,589,591],{"class":590},"sTEyZ"," createStreamDrain",[576,593,594],{"class":586}," }",[576,596,597],{"class":582}," from",[576,599,600],{"class":586}," '",[576,602,508],{"class":603},"sfazB",[576,605,606],{"class":586},"'\n",[576,608,610],{"class":578,"line":609},2,[576,611,613],{"emptyLinePlaceholder":612},true,"\n",[576,615,617,621,624,627,630,633,636,640,643,647,649],{"class":578,"line":616},3,[576,618,620],{"class":619},"spNyl","const",[576,622,623],{"class":590}," stream ",[576,625,626],{"class":586},"=",[576,628,591],{"class":629},"s2Zo4",[576,631,632],{"class":590},"(",[576,634,635],{"class":586},"{",[576,637,639],{"class":638},"swJcz"," buffer",[576,641,642],{"class":586},":",[576,644,646],{"class":645},"sbssI"," 200",[576,648,594],{"class":586},[576,650,651],{"class":590},")\n",[576,653,655],{"class":578,"line":654},4,[576,656,613],{"emptyLinePlaceholder":612},[576,658,660,663,666,669,671,674,676,679,682,684,687,690,692],{"class":578,"line":659},5,[576,661,662],{"class":590},"nitroApp",[576,664,665],{"class":586},".",[576,667,668],{"class":590},"hooks",[576,670,665],{"class":586},[576,672,673],{"class":629},"hook",[576,675,632],{"class":590},[576,677,678],{"class":586},"'",[576,680,681],{"class":603},"evlog:drain",[576,683,678],{"class":586},[576,685,686],{"class":586},",",[576,688,689],{"class":590}," stream",[576,691,665],{"class":586},[576,693,694],{"class":590},"drain)\n",[576,696,698],{"class":578,"line":697},6,[576,699,613],{"emptyLinePlaceholder":612},[576,701,703,705,708,710,712,714,717,719,721,725,727,730],{"class":578,"line":702},7,[576,704,620],{"class":619},[576,706,707],{"class":590}," off ",[576,709,626],{"class":586},[576,711,689],{"class":590},[576,713,665],{"class":586},[576,715,716],{"class":629},"subscribe",[576,718,632],{"class":590},[576,720,632],{"class":586},[576,722,724],{"class":723},"sHdIc","event",[576,726,524],{"class":586},[576,728,729],{"class":619}," =>",[576,731,732],{"class":586}," {\n",[576,734,736,739,742,744,746,749,752,754,757,759,762,765,767,769],{"class":578,"line":735},8,[576,737,738],{"class":582},"  if",[576,740,741],{"class":638}," (",[576,743,724],{"class":590},[576,745,665],{"class":586},[576,747,748],{"class":590},"level",[576,750,751],{"class":586}," ===",[576,753,600],{"class":586},[576,755,756],{"class":603},"error",[576,758,678],{"class":586},[576,760,761],{"class":638},") ",[576,763,764],{"class":629},"notify",[576,766,632],{"class":638},[576,768,724],{"class":590},[576,770,651],{"class":638},[576,772,774,777],{"class":578,"line":773},9,[576,775,776],{"class":586},"}",[576,778,651],{"class":590},[576,780,782,785],{"class":578,"line":781},10,[576,783,784],{"class":629},"off",[576,786,787],{"class":590},"()\n",[576,789,791],{"class":578,"line":790},11,[576,792,613],{"emptyLinePlaceholder":612},[576,794,796,799,801,803,806,809,811,813,816,819],{"class":578,"line":795},12,[576,797,798],{"class":582},"for",[576,800,741],{"class":590},[576,802,620],{"class":619},[576,804,805],{"class":590}," past ",[576,807,808],{"class":586},"of",[576,810,689],{"class":590},[576,812,665],{"class":586},[576,814,815],{"class":629},"recent",[576,817,818],{"class":590},"()) ",[576,820,821],{"class":586},"{\n",[576,823,825,828,830,833],{"class":578,"line":824},13,[576,826,827],{"class":629},"  bootstrap",[576,829,632],{"class":638},[576,831,832],{"class":590},"past",[576,834,651],{"class":638},[576,836,838],{"class":578,"line":837},14,[576,839,840],{"class":586},"}\n",[576,842,844,846,849,851,853,856,858,860,862,865,867],{"class":578,"line":843},15,[576,845,798],{"class":582},[576,847,848],{"class":582}," await",[576,850,741],{"class":590},[576,852,620],{"class":619},[576,854,855],{"class":590}," event ",[576,857,808],{"class":586},[576,859,689],{"class":590},[576,861,665],{"class":586},[576,863,864],{"class":629},"events",[576,866,818],{"class":590},[576,868,821],{"class":586},[576,870,872,874,876,878],{"class":578,"line":871},16,[576,873,827],{"class":629},[576,875,632],{"class":638},[576,877,724],{"class":590},[576,879,651],{"class":638},[576,881,883],{"class":578,"line":882},17,[576,884,840],{"class":586},[886,887,259],"h3",{"id":888},"options",[890,891,892,908],"table",{},[893,894,895],"thead",{},[896,897,898,902,905],"tr",{},[899,900,901],"th",{},"Option",[899,903,904],{},"Type",[899,906,907],{},"Description",[909,910,911,937,957],"tbody",{},[896,912,913,918,923],{},[914,915,916],"td",{},[449,917,548],{},[914,919,920],{},[449,921,922],{},"number",[914,924,925,926,929,930,933,934,665],{},"Ring-buffer size for ",[449,927,928],{},"recent()"," snapshots. Set to ",[449,931,932],{},"0"," to disable. Default: ",[449,935,936],{},"500",[896,938,939,943,947],{},[914,940,941],{},[449,942,552],{},[914,944,945],{},[449,946,922],{},[914,948,949,950,953,954,665],{},"Max queued events per ",[449,951,952],{},"events()"," async iterator before the oldest are dropped. The drain itself is never blocked. Default: ",[449,955,956],{},"1000",[896,958,959,964,969],{},[914,960,961],{},[449,962,963],{},"filter",[914,965,966],{},[449,967,968],{},"(event) => boolean",[914,970,971,972,975],{},"Optional predicate run on each drained event — return ",[449,973,974],{},"false"," to skip the event entirely (neither buffered nor delivered).",[430,977,978,981,982,984],{},[449,979,980],{},"stream.drain(events)"," accepts either a single event or a batch. ",[449,983,541],{}," returns a snapshot of the buffered events (oldest first, most recent last) for ad-hoc inspection or to seed a UI panel.",[478,986,988],{"id":987},"network-bridge-stream-server","Network bridge — stream server",[990,991],"sse-wire",{},[430,993,994,996,997,1000],{},[449,995,460],{}," boots a tiny ",[449,998,999],{},"node:http"," server in the same process as your app, on its own ephemeral port, and exposes the in-process bus over Server-Sent Events. Any consumer (browser tab, CLI, Tauri\u002FElectron devtool) can subscribe — your application API is untouched.",[463,1002,1003,1006],{"icon":291},[434,1004,1005],{},"Strict opt-in."," Nothing starts unless you set the option explicitly. There is no auto-enable in dev — the server only boots when you ask for it.",[490,1008,1011,1014,1072],{":actions":492,"description":1009,"icon":1010},"Expose the evlog stream over SSE","i-lucide-radio",[430,1012,1013],{},"Turn on the local stream server so I can subscribe to wide events from a browser tab, CLI, or Tauri\u002FElectron devtool.",[439,1015,1016,1040,1047,1058,1069],{},[442,1017,1018,1019,1022,1023,1026,1027,1022,1030,1033,1034,1036,1037,1039],{},"Detect my framework and opt in explicitly (Nuxt: ",[449,1020,1021],{},"evlog.stream: true"," in ",[449,1024,1025],{},"nuxt.config.ts","; Next.js: ",[449,1028,1029],{},"defineStreamedInstrumentation({ stream: true })",[449,1031,1032],{},"instrumentation.ts","; Hono\u002FExpress\u002FFastify\u002FElysia\u002Fstandalone: call ",[449,1035,460],{}," once at boot and register the returned ",[449,1038,515],{}," on the evlog drain hook)",[442,1041,1042,1043,1046],{},"Never enable in production by default; gate it behind ",[449,1044,1045],{},"process.env.NODE_ENV !== 'production'"," or a feature flag",[442,1048,1049,1050,1053,1054,1057],{},"For shared dev environments, set ",[449,1051,1052],{},"token: process.env.EVLOG_STREAM_TOKEN"," and have the consumer send it as ",[449,1055,1056],{},"Authorization: Bearer \u003Ctoken>"," on every request",[442,1059,1060,1061,1064,1065,1068],{},"Discover the URL from ",[449,1062,1063],{},".evlog\u002Fstream.url"," (or ",[449,1066,1067],{},"\u002Fapi\u002F_evlog\u002Fstream-info"," on Nuxt) — never hard-code the port, it's ephemeral",[442,1070,1071],{},"Skip on serverless platforms — the server is in-process",[430,1073,559,1074],{},[561,1075,563],{"href":563,"rel":1076},[565],[886,1078,1080],{"id":1079},"what-boots-up","What boots up",[430,1082,1083,1084,1086],{},"When you opt in, evlog calls ",[449,1085,460],{}," and:",[1088,1089,1090,1093,1103,1108,1111,1114],"ol",{},[442,1091,1092],{},"Picks an ephemeral free port (or the one you specify)",[442,1094,1095,1096,1098,1099,1102],{},"Spins a tiny ",[449,1097,999],{}," server on ",[449,1100,1101],{},"127.0.0.1"," (or your host)",[442,1104,1105,1106],{},"Writes the discovered URL to ",[449,1107,1063],{},[442,1109,1110],{},"Prints a one-line banner in the server console",[442,1112,1113],{},"Hooks the in-process stream drain into the evlog pipeline",[442,1115,1116,1117,1120,1121,1124],{},"Exposes ",[449,1118,1119],{},"GET \u002F"," for the SSE stream and ",[449,1122,1123],{},"GET \u002Finfo"," for handshake metadata",[430,1126,1127],{},"On shutdown (SIGINT \u002F SIGTERM \u002F process exit) the server cleans up listeners and removes the URL file.",[886,1129,1131],{"id":1130},"per-framework-opt-in","Per-framework opt-in",[1133,1134,1135,1217,1286],"code-group",{},[567,1136,1138],{"className":569,"code":1137,"filename":1025,"language":571,"meta":572,"style":572},"export default defineNuxtConfig({\n  modules: ['evlog\u002Fnuxt'],\n  evlog: {\n    stream: true,\n    \u002F\u002F or: stream: { port: 4444, token: process.env.EVLOG_STREAM_TOKEN }\n  },\n})\n",[449,1139,1140,1155,1178,1187,1200,1206,1211],{"__ignoreMap":572},[576,1141,1142,1145,1148,1151,1153],{"class":578,"line":579},[576,1143,1144],{"class":582},"export",[576,1146,1147],{"class":582}," default",[576,1149,1150],{"class":629}," defineNuxtConfig",[576,1152,632],{"class":590},[576,1154,821],{"class":586},[576,1156,1157,1160,1162,1165,1167,1170,1172,1175],{"class":578,"line":609},[576,1158,1159],{"class":638},"  modules",[576,1161,642],{"class":586},[576,1163,1164],{"class":590}," [",[576,1166,678],{"class":586},[576,1168,1169],{"class":603},"evlog\u002Fnuxt",[576,1171,678],{"class":586},[576,1173,1174],{"class":590},"]",[576,1176,1177],{"class":586},",\n",[576,1179,1180,1183,1185],{"class":578,"line":616},[576,1181,1182],{"class":638},"  evlog",[576,1184,642],{"class":586},[576,1186,732],{"class":586},[576,1188,1189,1192,1194,1198],{"class":578,"line":654},[576,1190,1191],{"class":638},"    stream",[576,1193,642],{"class":586},[576,1195,1197],{"class":1196},"sfNiH"," true",[576,1199,1177],{"class":586},[576,1201,1202],{"class":578,"line":659},[576,1203,1205],{"class":1204},"sHwdD","    \u002F\u002F or: stream: { port: 4444, token: process.env.EVLOG_STREAM_TOKEN }\n",[576,1207,1208],{"class":578,"line":697},[576,1209,1210],{"class":586},"  },\n",[576,1212,1213,1215],{"class":578,"line":702},[576,1214,776],{"class":586},[576,1216,651],{"class":590},[567,1218,1220],{"className":569,"code":1219,"filename":1032,"language":571,"meta":572,"style":572},"import { defineStreamedInstrumentation } from 'evlog\u002Fnext\u002Fstream'\n\nexport const { register } = defineStreamedInstrumentation({\n  stream: true,\n})\n",[449,1221,1222,1242,1246,1269,1280],{"__ignoreMap":572},[576,1223,1224,1226,1228,1231,1233,1235,1237,1240],{"class":578,"line":579},[576,1225,583],{"class":582},[576,1227,587],{"class":586},[576,1229,1230],{"class":590}," defineStreamedInstrumentation",[576,1232,594],{"class":586},[576,1234,597],{"class":582},[576,1236,600],{"class":586},[576,1238,1239],{"class":603},"evlog\u002Fnext\u002Fstream",[576,1241,606],{"class":586},[576,1243,1244],{"class":578,"line":609},[576,1245,613],{"emptyLinePlaceholder":612},[576,1247,1248,1250,1253,1255,1258,1260,1263,1265,1267],{"class":578,"line":616},[576,1249,1144],{"class":582},[576,1251,1252],{"class":619}," const",[576,1254,587],{"class":586},[576,1256,1257],{"class":590}," register ",[576,1259,776],{"class":586},[576,1261,1262],{"class":586}," =",[576,1264,1230],{"class":629},[576,1266,632],{"class":590},[576,1268,821],{"class":586},[576,1270,1271,1274,1276,1278],{"class":578,"line":654},[576,1272,1273],{"class":638},"  stream",[576,1275,642],{"class":586},[576,1277,1197],{"class":1196},[576,1279,1177],{"class":586},[576,1281,1282,1284],{"class":578,"line":659},[576,1283,776],{"class":586},[576,1285,651],{"class":590},[567,1287,1290],{"className":569,"code":1288,"filename":1289,"language":571,"meta":572,"style":572},"import { startStreamServer } from 'evlog\u002Fstream'\n\nif (process.env.NODE_ENV !== 'production' && process.env.EVLOG_STREAM === '1') {\n  const { drain } = await startStreamServer()\n  \u002F\u002F Plug `drain` into the evlog drain hook for your framework\n}\n","Hono \u002F Express \u002F Fastify \u002F standalone",[449,1291,1292,1311,1315,1372,1392,1397],{"__ignoreMap":572},[576,1293,1294,1296,1298,1301,1303,1305,1307,1309],{"class":578,"line":579},[576,1295,583],{"class":582},[576,1297,587],{"class":586},[576,1299,1300],{"class":590}," startStreamServer",[576,1302,594],{"class":586},[576,1304,597],{"class":582},[576,1306,600],{"class":586},[576,1308,508],{"class":603},[576,1310,606],{"class":586},[576,1312,1313],{"class":578,"line":609},[576,1314,613],{"emptyLinePlaceholder":612},[576,1316,1317,1320,1323,1325,1328,1330,1333,1336,1338,1341,1343,1346,1349,1351,1353,1355,1358,1361,1363,1366,1368,1370],{"class":578,"line":616},[576,1318,1319],{"class":582},"if",[576,1321,1322],{"class":590}," (process",[576,1324,665],{"class":586},[576,1326,1327],{"class":590},"env",[576,1329,665],{"class":586},[576,1331,1332],{"class":590},"NODE_ENV ",[576,1334,1335],{"class":586},"!==",[576,1337,600],{"class":586},[576,1339,1340],{"class":603},"production",[576,1342,678],{"class":586},[576,1344,1345],{"class":586}," &&",[576,1347,1348],{"class":590}," process",[576,1350,665],{"class":586},[576,1352,1327],{"class":590},[576,1354,665],{"class":586},[576,1356,1357],{"class":590},"EVLOG_STREAM ",[576,1359,1360],{"class":586},"===",[576,1362,600],{"class":586},[576,1364,1365],{"class":603},"1",[576,1367,678],{"class":586},[576,1369,761],{"class":590},[576,1371,821],{"class":586},[576,1373,1374,1377,1379,1382,1384,1386,1388,1390],{"class":578,"line":654},[576,1375,1376],{"class":619},"  const",[576,1378,587],{"class":586},[576,1380,1381],{"class":590}," drain",[576,1383,594],{"class":586},[576,1385,1262],{"class":586},[576,1387,848],{"class":582},[576,1389,1300],{"class":629},[576,1391,787],{"class":638},[576,1393,1394],{"class":578,"line":659},[576,1395,1396],{"class":1204},"  \u002F\u002F Plug `drain` into the evlog drain hook for your framework\n",[576,1398,1399],{"class":578,"line":697},[576,1400,840],{"class":586},[430,1402,1403,1404,1406,1407,1410,1411,1413],{},"The Hono \u002F Express \u002F Fastify integrations don't need a \"feature PR\" — ",[449,1405,460],{}," is ",[434,1408,1409],{},"orthogonal"," to your framework. You boot it once and connect its ",[449,1412,515],{}," to the evlog pipeline like any other drain.",[886,1415,1417],{"id":1416},"discovery","Discovery",[430,1419,1420],{},"The mini-server runs on a random port, so any consumer must discover it.",[567,1422,1424],{"className":569,"code":1423,"filename":1063,"language":571,"meta":572,"style":572},"http:\u002F\u002F127.0.0.1:53942\n",[449,1425,1426],{"__ignoreMap":572},[576,1427,1428,1432,1434],{"class":578,"line":579},[576,1429,1431],{"class":1430},"sBMFI","http",[576,1433,642],{"class":586},[576,1435,1436],{"class":1204},"\u002F\u002F127.0.0.1:53942\n",[430,1438,1439],{},"Read directly from disk:",[567,1441,1443],{"className":569,"code":1442,"language":571,"meta":572,"style":572},"import { readFile } from 'node:fs\u002Fpromises'\n\nconst url = (await readFile('.evlog\u002Fstream.url', 'utf-8')).trim()\n",[449,1444,1445,1465,1469],{"__ignoreMap":572},[576,1446,1447,1449,1451,1454,1456,1458,1460,1463],{"class":578,"line":579},[576,1448,583],{"class":582},[576,1450,587],{"class":586},[576,1452,1453],{"class":590}," readFile",[576,1455,594],{"class":586},[576,1457,597],{"class":582},[576,1459,600],{"class":586},[576,1461,1462],{"class":603},"node:fs\u002Fpromises",[576,1464,606],{"class":586},[576,1466,1467],{"class":578,"line":609},[576,1468,613],{"emptyLinePlaceholder":612},[576,1470,1471,1473,1476,1478,1480,1483,1485,1487,1489,1491,1493,1495,1497,1500,1502,1505,1507,1510],{"class":578,"line":616},[576,1472,620],{"class":619},[576,1474,1475],{"class":590}," url ",[576,1477,626],{"class":586},[576,1479,741],{"class":590},[576,1481,1482],{"class":582},"await",[576,1484,1453],{"class":629},[576,1486,632],{"class":590},[576,1488,678],{"class":586},[576,1490,1063],{"class":603},[576,1492,678],{"class":586},[576,1494,686],{"class":586},[576,1496,600],{"class":586},[576,1498,1499],{"class":603},"utf-8",[576,1501,678],{"class":586},[576,1503,1504],{"class":590},"))",[576,1506,665],{"class":586},[576,1508,1509],{"class":629},"trim",[576,1511,787],{"class":590},[430,1513,1514],{},"Or — for same-origin browser tabs in a Nuxt app — hit the discovery route:",[567,1516,1518],{"className":569,"code":1517,"language":571,"meta":572,"style":572},"const { url } = await fetch('\u002Fapi\u002F_evlog\u002Fstream-info').then(r => r.json())\n",[449,1519,1520],{"__ignoreMap":572},[576,1521,1522,1524,1526,1528,1530,1532,1534,1537,1539,1541,1543,1545,1547,1549,1552,1554,1557,1559,1562,1564,1567],{"class":578,"line":579},[576,1523,620],{"class":619},[576,1525,587],{"class":586},[576,1527,1475],{"class":590},[576,1529,776],{"class":586},[576,1531,1262],{"class":586},[576,1533,848],{"class":582},[576,1535,1536],{"class":629}," fetch",[576,1538,632],{"class":590},[576,1540,678],{"class":586},[576,1542,1067],{"class":603},[576,1544,678],{"class":586},[576,1546,524],{"class":590},[576,1548,665],{"class":586},[576,1550,1551],{"class":629},"then",[576,1553,632],{"class":590},[576,1555,1556],{"class":723},"r",[576,1558,729],{"class":619},[576,1560,1561],{"class":590}," r",[576,1563,665],{"class":586},[576,1565,1566],{"class":629},"json",[576,1568,1569],{"class":590},"())\n",[886,1571,1573],{"id":1572},"wire-format","Wire format",[430,1575,1576,1577,642],{},"Every SSE message has the shape ",[449,1578,1579],{},"{ evlog: '1', type, data }",[890,1581,1582,1599],{},[893,1583,1584],{},[896,1585,1586,1591,1594],{},[899,1587,1588],{},[449,1589,1590],{},"type",[899,1592,1593],{},"When",[899,1595,1596],{},[449,1597,1598],{},"data",[909,1600,1601,1616,1637,1650],{},[896,1602,1603,1608,1611],{},[914,1604,1605],{},[449,1606,1607],{},"hello",[914,1609,1610],{},"First frame after connect",[914,1612,1613],{},[449,1614,1615],{},"{ evlogVersion, bufferSize, heartbeatMs }",[896,1617,1618,1623,1632],{},[914,1619,1620],{},[449,1621,1622],{},"replay",[914,1624,1625,1626,1628,1629],{},"Right after ",[449,1627,1607],{},", replays buffered events when the consumer passed ",[449,1630,1631],{},"?since=\u003Ciso>",[914,1633,1634],{},[449,1635,1636],{},"WideEvent",[896,1638,1639,1643,1646],{},[914,1640,1641],{},[449,1642,724],{},[914,1644,1645],{},"Every emitted event after that",[914,1647,1648],{},[449,1649,1636],{},[896,1651,1652,1657,1663],{},[914,1653,1654],{},[449,1655,1656],{},"ping",[914,1658,1659,1660,524],{},"Heartbeat (default every 15s, configurable via ",[449,1661,1662],{},"heartbeatMs",[914,1664,1665],{},[449,1666,1667],{},"{ ts: number }",[567,1669,1672],{"className":569,"code":1670,"filename":1671,"language":571,"meta":572,"style":572},"const { url } = await fetch('\u002Fapi\u002F_evlog\u002Fstream-info').then(r => r.json())\nconst es = new EventSource(url)\n\nes.onmessage = (msg) => {\n  const { type, data } = JSON.parse(msg.data)\n  if (type === 'event') events.push(data)\n}\n","Browser consumer",[449,1673,1674,1718,1736,1740,1763,1799,1830],{"__ignoreMap":572},[576,1675,1676,1678,1680,1682,1684,1686,1688,1690,1692,1694,1696,1698,1700,1702,1704,1706,1708,1710,1712,1714,1716],{"class":578,"line":579},[576,1677,620],{"class":619},[576,1679,587],{"class":586},[576,1681,1475],{"class":590},[576,1683,776],{"class":586},[576,1685,1262],{"class":586},[576,1687,848],{"class":582},[576,1689,1536],{"class":629},[576,1691,632],{"class":590},[576,1693,678],{"class":586},[576,1695,1067],{"class":603},[576,1697,678],{"class":586},[576,1699,524],{"class":590},[576,1701,665],{"class":586},[576,1703,1551],{"class":629},[576,1705,632],{"class":590},[576,1707,1556],{"class":723},[576,1709,729],{"class":619},[576,1711,1561],{"class":590},[576,1713,665],{"class":586},[576,1715,1566],{"class":629},[576,1717,1569],{"class":590},[576,1719,1720,1722,1725,1727,1730,1733],{"class":578,"line":609},[576,1721,620],{"class":619},[576,1723,1724],{"class":590}," es ",[576,1726,626],{"class":586},[576,1728,1729],{"class":586}," new",[576,1731,1732],{"class":629}," EventSource",[576,1734,1735],{"class":590},"(url)\n",[576,1737,1738],{"class":578,"line":616},[576,1739,613],{"emptyLinePlaceholder":612},[576,1741,1742,1745,1747,1750,1752,1754,1757,1759,1761],{"class":578,"line":654},[576,1743,1744],{"class":590},"es",[576,1746,665],{"class":586},[576,1748,1749],{"class":629},"onmessage",[576,1751,1262],{"class":586},[576,1753,741],{"class":586},[576,1755,1756],{"class":723},"msg",[576,1758,524],{"class":586},[576,1760,729],{"class":619},[576,1762,732],{"class":586},[576,1764,1765,1767,1769,1772,1774,1777,1779,1781,1784,1786,1789,1791,1793,1795,1797],{"class":578,"line":659},[576,1766,1376],{"class":619},[576,1768,587],{"class":586},[576,1770,1771],{"class":590}," type",[576,1773,686],{"class":586},[576,1775,1776],{"class":590}," data",[576,1778,594],{"class":586},[576,1780,1262],{"class":586},[576,1782,1783],{"class":590}," JSON",[576,1785,665],{"class":586},[576,1787,1788],{"class":629},"parse",[576,1790,632],{"class":638},[576,1792,1756],{"class":590},[576,1794,665],{"class":586},[576,1796,1598],{"class":590},[576,1798,651],{"class":638},[576,1800,1801,1803,1805,1807,1809,1811,1813,1815,1817,1819,1821,1824,1826,1828],{"class":578,"line":697},[576,1802,738],{"class":582},[576,1804,741],{"class":638},[576,1806,1590],{"class":590},[576,1808,751],{"class":586},[576,1810,600],{"class":586},[576,1812,724],{"class":603},[576,1814,678],{"class":586},[576,1816,761],{"class":638},[576,1818,864],{"class":590},[576,1820,665],{"class":586},[576,1822,1823],{"class":629},"push",[576,1825,632],{"class":638},[576,1827,1598],{"class":590},[576,1829,651],{"class":638},[576,1831,1832],{"class":578,"line":702},[576,1833,840],{"class":586},[886,1835,1837],{"id":1836},"auth-cors","Auth + CORS",[890,1839,1840,1849],{},[893,1841,1842],{},[896,1843,1844,1846],{},[899,1845,901],{},[899,1847,1848],{},"Behavior",[909,1850,1851,1864,1886,1903,1916],{},[896,1852,1853,1858],{},[914,1854,1855],{},[449,1856,1857],{},"token",[914,1859,1860,1861,1863],{},"When set, the server requires ",[449,1862,1056],{}," on every request and 401s otherwise.",[896,1865,1866,1869],{},[914,1867,1868],{},"(no token)",[914,1870,1871,1872,1875,1876,1878,1879,1878,1882,1885],{},"Connections are accepted only when there is no ",[449,1873,1874],{},"Origin"," header or the origin host is local (",[449,1877,1101],{}," \u002F ",[449,1880,1881],{},"localhost",[449,1883,1884],{},"[::1]","). Other origins receive 403.",[896,1887,1888,1893],{},[914,1889,1890],{},[449,1891,1892],{},"host",[914,1894,1895,1896,1898,1899,1902],{},"Default ",[449,1897,1101],{}," — never reachable from the LAN. Override to ",[449,1900,1901],{},"0.0.0.0"," only with a token set.",[896,1904,1905,1909],{},[914,1906,1907],{},[449,1908,1662],{},[914,1910,1911,1912,1915],{},"Heartbeat interval (default ",[449,1913,1914],{},"15000",").",[896,1917,1918,1922],{},[914,1919,1920],{},[449,1921,548],{},[914,1923,1924,1925,1927,1928,665],{},"Ring buffer kept on the underlying default stream — replayed for late-joining clients via ",[449,1926,1631],{},". Default ",[449,1929,936],{},[478,1931,1933],{"id":1932},"going-further","Going further",[439,1935,1936,1941],{},[442,1937,1938,1940],{},[561,1939,358],{"href":359}," — replay or tail historic NDJSON files (cross-process, survives restarts)",[442,1942,1943,1946],{},[561,1944,1945],{"href":363},"Consumer recipes"," — build a minimal devtool, pipe to curl + jq, replay history then go live",[1948,1949,1950],"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 pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":572,"searchDepth":609,"depth":609,"links":1952},[1953,1956,1963],{"id":480,"depth":609,"text":446,"children":1954},[1955],{"id":888,"depth":616,"text":259},{"id":987,"depth":609,"text":988,"children":1957},[1958,1959,1960,1961,1962],{"id":1079,"depth":616,"text":1080},{"id":1130,"depth":616,"text":1131},{"id":1416,"depth":616,"text":1417},{"id":1572,"depth":616,"text":1573},{"id":1836,"depth":616,"text":1837},{"id":1932,"depth":609,"text":1933},"Subscribe to wide events flowing through evlog — in-process with createStreamDrain, or over the network with the local SSE stream server.","md",null,{},{"title":348,"icon":351},{"title":348,"description":1964},"RWPwg2y_92RQHUapGyIQnreZixWf3W_t7AMlv1yF2YI",[1972,1974],{"title":31,"path":344,"stem":345,"description":1973,"icon":346,"children":-1},"Observe what flows through the pipeline (stream, fs reader, consumer recipes), plug into the pipeline (plugins, enrichers, tail sampling, identity headers), or build your own bricks (custom drains, drain pipeline, custom framework integration).",{"title":353,"path":354,"stem":355,"description":1975,"icon":356,"children":-1},"Build evlog support for an HTTP framework (or non-HTTP runtime) without a built-in integration. Use defineFrameworkIntegration for the (ctx, next) middleware shape, or createMiddlewareLogger \u002F createRequestLogger for everything else.",1778361911231]