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