[{"data":1,"prerenderedAt":1849},["ShallowReactive",2],{"navigation_docs":3,"-build-on-top-stream-server":429,"-build-on-top-stream-server-surround":1844},[4,35,159,201,289,326,413],{"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,317,321],{"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},"Stream API","\u002Fbuild-on-top\u002Fstream-api","5.build-on-top\u002F1.stream-api","i-lucide-radio-tower",{"title":303,"path":304,"stem":305,"icon":306},"Stream server","\u002Fbuild-on-top\u002Fstream-server","5.build-on-top\u002F2.stream-server","i-lucide-radio",{"title":308,"path":309,"stem":310,"icon":311},"FS reader","\u002Fbuild-on-top\u002Ffs-reader","5.build-on-top\u002F3.fs-reader","i-lucide-folder-search",{"title":313,"path":314,"stem":315,"icon":316},"Identity headers","\u002Fbuild-on-top\u002Fidentity-headers","5.build-on-top\u002F4.identity-headers","i-lucide-fingerprint",{"title":156,"path":318,"stem":319,"icon":320},"\u002Fbuild-on-top\u002Frecipes","5.build-on-top\u002F5.recipes","i-lucide-chef-hat",{"title":322,"path":323,"stem":324,"icon":325},"Catalogs as packages","\u002Fbuild-on-top\u002Fcatalogs-as-packages","5.build-on-top\u002F6.catalogs-as-packages","i-lucide-package",{"title":327,"path":328,"stem":329,"children":330,"page":34},"Adapters","\u002Fadapters","6.adapters",[331,334,374,389],{"title":41,"path":332,"stem":333,"icon":44},"\u002Fadapters\u002Foverview","6.adapters\u002F01.overview",{"title":335,"path":336,"stem":337,"children":338,"page":34},"Cloud destinations","\u002Fadapters\u002Fcloud","6.adapters\u002F02.cloud",[339,344,349,354,359,364,369],{"title":340,"path":341,"stem":342,"icon":343},"Axiom","\u002Fadapters\u002Fcloud\u002Faxiom","6.adapters\u002F02.cloud\u002F01.axiom","i-custom-axiom",{"title":345,"path":346,"stem":347,"icon":348},"OTLP","\u002Fadapters\u002Fcloud\u002Fotlp","6.adapters\u002F02.cloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":350,"path":351,"stem":352,"icon":353},"PostHog","\u002Fadapters\u002Fcloud\u002Fposthog","6.adapters\u002F02.cloud\u002F03.posthog","i-simple-icons-posthog",{"title":355,"path":356,"stem":357,"icon":358},"Sentry","\u002Fadapters\u002Fcloud\u002Fsentry","6.adapters\u002F02.cloud\u002F04.sentry","i-simple-icons-sentry",{"title":360,"path":361,"stem":362,"icon":363},"Better Stack","\u002Fadapters\u002Fcloud\u002Fbetter-stack","6.adapters\u002F02.cloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":365,"path":366,"stem":367,"icon":368},"Datadog","\u002Fadapters\u002Fcloud\u002Fdatadog","6.adapters\u002F02.cloud\u002F06.datadog","i-simple-icons-datadog",{"title":370,"path":371,"stem":372,"icon":373},"HyperDX","\u002Fadapters\u002Fcloud\u002Fhyperdx","6.adapters\u002F02.cloud\u002F07.hyperdx","i-custom-hyperdx",{"title":375,"path":376,"stem":377,"children":378,"page":34},"Self-hosted","\u002Fadapters\u002Fself-hosted","6.adapters\u002F03.self-hosted",[379,384],{"title":380,"path":381,"stem":382,"icon":383},"File System","\u002Fadapters\u002Fself-hosted\u002Ffs","6.adapters\u002F03.self-hosted\u002F01.fs","i-lucide-hard-drive",{"title":385,"path":386,"stem":387,"icon":388},"NuxtHub","\u002Fadapters\u002Fself-hosted\u002Fnuxthub","6.adapters\u002F03.self-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":390,"path":391,"stem":392,"children":393,"page":34},"Building blocks","\u002Fadapters\u002Fbuilding-blocks","6.adapters\u002F04.building-blocks",[394,399,404,408],{"title":395,"path":396,"stem":397,"icon":398},"Pipeline","\u002Fadapters\u002Fbuilding-blocks\u002Fpipeline","6.adapters\u002F04.building-blocks\u002F01.pipeline","i-lucide-workflow",{"title":400,"path":401,"stem":402,"icon":403},"HTTP","\u002Fadapters\u002Fbuilding-blocks\u002Fhttp","6.adapters\u002F04.building-blocks\u002F02.http","i-lucide-globe",{"title":405,"path":406,"stem":407,"icon":83},"Custom Adapters","\u002Fadapters\u002Fbuilding-blocks\u002Fcustom","6.adapters\u002F04.building-blocks\u002F03.custom",{"title":409,"path":410,"stem":411,"icon":412},"Toolkit","\u002Fadapters\u002Fbuilding-blocks\u002Ftoolkit","6.adapters\u002F04.building-blocks\u002F04.toolkit","i-lucide-blocks",{"title":414,"path":415,"stem":416,"children":417,"page":34},"Enrichers","\u002Fenrichers","7.enrichers",[418,421,425],{"title":41,"path":419,"stem":420,"icon":28},"\u002Fenrichers\u002Foverview","7.enrichers\u002F1.overview",{"title":422,"path":423,"stem":424,"icon":288},"Built-in","\u002Fenrichers\u002Fbuilt-in","7.enrichers\u002F2.built-in",{"title":426,"path":427,"stem":428,"icon":83},"Custom","\u002Fenrichers\u002Fcustom","7.enrichers\u002F3.custom",{"id":430,"title":303,"body":431,"description":1837,"extension":1838,"links":1839,"meta":1840,"navigation":1841,"path":304,"seo":1842,"stem":305,"__hash__":1843},"docs\u002F5.build-on-top\u002F2.stream-server.md",{"type":432,"value":433,"toc":1821},"minimark",[434,448,478,484,489,496,529,539,552,556,560,659,669,733,744,752,850,927,930,934,1039,1043,1056,1102,1106,1369,1382,1386,1392,1440,1443,1488,1568,1578,1582,1638,1642,1649,1655,1719,1726,1730,1733,1754,1800,1804,1817],[435,436,437,438,442,443,447],"p",{},"evlog ships a tiny HTTP server that exposes the ",[439,440,441],"a",{"href":299},"in-process stream"," over ",[444,445,446],"strong",{},"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.",[449,450,453,458,470],"callout",{"icon":451,"color":452},"i-lucide-alert-triangle","warning",[435,454,455],{},[444,456,457],{},"Local development and long-lived self-hosted servers only.",[435,459,460,461,464,465,464,467,469],{},"The server lives in-process. On serverless platforms (",[444,462,463],{},"Vercel Functions",", ",[444,466,266],{},[444,468,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.",[435,471,472,473,477],{},"It works perfectly in ",[474,475,476],"code",{},"pnpm dev",", on a Node \u002F Bun \u002F Deno container, on a long-lived VM, on Fly \u002F Railway \u002F Coolify-style instances.",[449,479,480,483],{"icon":13},[444,481,482],{},"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.",[485,486,488],"h2",{"id":487},"what-boots-up","What boots up",[435,490,491,492,495],{},"When you opt in, evlog calls ",[474,493,494],{},"startStreamServer()"," and:",[497,498,499,511,519,526],"ol",{},[500,501,502,503,506,507,510],"li",{},"Opens a ",[474,504,505],{},"node:http"," server bound to ",[474,508,509],{},"127.0.0.1"," on an OS-assigned ephemeral port.",[500,512,513,514,518],{},"Subscribes the SSE connections to the ",[439,515,517],{"href":516},"\u002Fbuild-on-top\u002Fstream-api#default-singleton","default in-process stream"," — every wide event flows through.",[500,520,521,522,525],{},"Writes the URL to ",[474,523,524],{},"\u003Ccwd>\u002F.evlog\u002Fstream.url"," so external tools can discover the port.",[500,527,528],{},"Prints a banner at startup:",[530,531,537],"pre",{"className":532,"code":534,"language":535,"meta":536},[533],"language-text","  [evlog] Stream → http:\u002F\u002F127.0.0.1:51203\n","text","",[474,538,534],{"__ignoreMap":536},[497,540,542],{"start":541},5,[500,543,544,545,464,548,551],{},"Cleans up the URL file and closes the server on ",[474,546,547],{},"SIGINT",[474,549,550],{},"SIGTERM",", and process exit.",[485,553,555],{"id":554},"per-framework","Per framework",[557,558,211],"h3",{"id":559},"nuxt",[530,561,566],{"className":562,"code":563,"filename":564,"language":565,"meta":536,"style":536},"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",[474,567,568,592,620,631,645,650],{"__ignoreMap":536},[569,570,573,577,580,584,588],"span",{"class":571,"line":572},"line",1,[569,574,576],{"class":575},"s7zQu","export",[569,578,579],{"class":575}," default",[569,581,583],{"class":582},"s2Zo4"," defineNuxtConfig",[569,585,587],{"class":586},"sTEyZ","(",[569,589,591],{"class":590},"sMK4o","{\n",[569,593,595,599,602,605,608,612,614,617],{"class":571,"line":594},2,[569,596,598],{"class":597},"swJcz","  modules",[569,600,601],{"class":590},":",[569,603,604],{"class":586}," [",[569,606,607],{"class":590},"'",[569,609,611],{"class":610},"sfazB","evlog\u002Fnuxt",[569,613,607],{"class":590},[569,615,616],{"class":586},"]",[569,618,619],{"class":590},",\n",[569,621,623,626,628],{"class":571,"line":622},3,[569,624,625],{"class":597},"  evlog",[569,627,601],{"class":590},[569,629,630],{"class":590}," {\n",[569,632,634,637,639,643],{"class":571,"line":633},4,[569,635,636],{"class":597},"    stream",[569,638,601],{"class":590},[569,640,642],{"class":641},"sfNiH"," true",[569,644,619],{"class":590},[569,646,647],{"class":571,"line":541},[569,648,649],{"class":590},"  },\n",[569,651,653,656],{"class":571,"line":652},6,[569,654,655],{"class":590},"}",[569,657,658],{"class":586},")\n",[435,660,661,662,664,665,668],{},"That's it — ",[474,663,476],{}," boots the server and prints the URL. Pass an options object instead of ",[474,666,667],{},"true"," for full control:",[530,670,672],{"className":562,"code":671,"language":565,"meta":536,"style":536},"evlog: {\n  stream: { port: 4317, token: process.env.EVLOG_STREAM_TOKEN },\n}\n",[474,673,674,684,728],{"__ignoreMap":536},[569,675,676,680,682],{"class":571,"line":572},[569,677,679],{"class":678},"sBMFI","evlog",[569,681,601],{"class":590},[569,683,630],{"class":590},[569,685,686,689,691,694,697,699,703,706,709,711,714,717,720,722,725],{"class":571,"line":594},[569,687,688],{"class":678},"  stream",[569,690,601],{"class":590},[569,692,693],{"class":590}," {",[569,695,696],{"class":678}," port",[569,698,601],{"class":590},[569,700,702],{"class":701},"sbssI"," 4317",[569,704,705],{"class":590},",",[569,707,708],{"class":678}," token",[569,710,601],{"class":590},[569,712,713],{"class":586}," process",[569,715,716],{"class":590},".",[569,718,719],{"class":586},"env",[569,721,716],{"class":590},[569,723,724],{"class":586},"EVLOG_STREAM_TOKEN",[569,726,727],{"class":590}," },\n",[569,729,730],{"class":571,"line":622},[569,731,732],{"class":590},"}\n",[435,734,735,736,739,740,743],{},"The Nuxt module also registers a tiny ",[474,737,738],{},"\u002Fapi\u002F_evlog\u002Fstream-info"," route that reads ",[474,741,742],{},".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.",[557,745,747,748,751],{"id":746},"nextjs-instrumentationts","Next.js (",[474,749,750],{},"instrumentation.ts",")",[530,753,756],{"className":562,"code":754,"filename":755,"language":565,"meta":536,"style":536},"import { defineStreamedInstrumentation } from 'evlog\u002Fnext\u002Fstream'\n\nexport const { register, onRequestError } = defineStreamedInstrumentation({\n  service: 'my-app',\n  stream: true,\n})\n","lib\u002Fevlog.ts",[474,757,758,783,789,818,834,844],{"__ignoreMap":536},[569,759,760,763,765,768,771,774,777,780],{"class":571,"line":572},[569,761,762],{"class":575},"import",[569,764,693],{"class":590},[569,766,767],{"class":586}," defineStreamedInstrumentation",[569,769,770],{"class":590}," }",[569,772,773],{"class":575}," from",[569,775,776],{"class":590}," '",[569,778,779],{"class":610},"evlog\u002Fnext\u002Fstream",[569,781,782],{"class":590},"'\n",[569,784,785],{"class":571,"line":594},[569,786,788],{"emptyLinePlaceholder":787},true,"\n",[569,790,791,793,797,799,802,804,807,809,812,814,816],{"class":571,"line":622},[569,792,576],{"class":575},[569,794,796],{"class":795},"spNyl"," const",[569,798,693],{"class":590},[569,800,801],{"class":586}," register",[569,803,705],{"class":590},[569,805,806],{"class":586}," onRequestError ",[569,808,655],{"class":590},[569,810,811],{"class":590}," =",[569,813,767],{"class":582},[569,815,587],{"class":586},[569,817,591],{"class":590},[569,819,820,823,825,827,830,832],{"class":571,"line":633},[569,821,822],{"class":597},"  service",[569,824,601],{"class":590},[569,826,776],{"class":590},[569,828,829],{"class":610},"my-app",[569,831,607],{"class":590},[569,833,619],{"class":590},[569,835,836,838,840,842],{"class":571,"line":541},[569,837,688],{"class":597},[569,839,601],{"class":590},[569,841,642],{"class":641},[569,843,619],{"class":590},[569,845,846,848],{"class":571,"line":652},[569,847,655],{"class":590},[569,849,658],{"class":586},[530,851,853],{"className":562,"code":852,"filename":750,"language":565,"meta":536,"style":536},"import { defineNodeInstrumentation } from 'evlog\u002Fnext\u002Finstrumentation'\n\nexport const { register, onRequestError } = defineNodeInstrumentation(() =>\n  import('.\u002Flib\u002Fevlog')\n)\n",[474,854,855,875,879,907,923],{"__ignoreMap":536},[569,856,857,859,861,864,866,868,870,873],{"class":571,"line":572},[569,858,762],{"class":575},[569,860,693],{"class":590},[569,862,863],{"class":586}," defineNodeInstrumentation",[569,865,770],{"class":590},[569,867,773],{"class":575},[569,869,776],{"class":590},[569,871,872],{"class":610},"evlog\u002Fnext\u002Finstrumentation",[569,874,782],{"class":590},[569,876,877],{"class":571,"line":594},[569,878,788],{"emptyLinePlaceholder":787},[569,880,881,883,885,887,889,891,893,895,897,899,901,904],{"class":571,"line":622},[569,882,576],{"class":575},[569,884,796],{"class":795},[569,886,693],{"class":590},[569,888,801],{"class":586},[569,890,705],{"class":590},[569,892,806],{"class":586},[569,894,655],{"class":590},[569,896,811],{"class":590},[569,898,863],{"class":582},[569,900,587],{"class":586},[569,902,903],{"class":590},"()",[569,905,906],{"class":795}," =>\n",[569,908,909,912,914,916,919,921],{"class":571,"line":633},[569,910,911],{"class":590},"  import",[569,913,587],{"class":586},[569,915,607],{"class":590},[569,917,918],{"class":610},".\u002Flib\u002Fevlog",[569,920,607],{"class":590},[569,922,658],{"class":586},[569,924,925],{"class":571,"line":541},[569,926,658],{"class":586},[435,928,929],{},"The stream server's drain is composed with any user-provided drain so events keep flowing to your other adapters too.",[557,931,933],{"id":932},"standalone-node-bun-deno-script","Standalone Node \u002F Bun \u002F Deno script",[530,935,937],{"className":562,"code":936,"language":565,"meta":536,"style":536},"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",[474,938,939,959,978,982,1001,1028,1032],{"__ignoreMap":536},[569,940,941,943,945,948,950,952,954,957],{"class":571,"line":572},[569,942,762],{"class":575},[569,944,693],{"class":590},[569,946,947],{"class":586}," startStreamServer",[569,949,770],{"class":590},[569,951,773],{"class":575},[569,953,776],{"class":590},[569,955,956],{"class":610},"evlog\u002Fstream",[569,958,782],{"class":590},[569,960,961,963,965,968,970,972,974,976],{"class":571,"line":594},[569,962,762],{"class":575},[569,964,693],{"class":590},[569,966,967],{"class":586}," initLogger",[569,969,770],{"class":590},[569,971,773],{"class":575},[569,973,776],{"class":590},[569,975,679],{"class":610},[569,977,782],{"class":590},[569,979,980],{"class":571,"line":622},[569,981,788],{"emptyLinePlaceholder":787},[569,983,984,987,990,993,996,998],{"class":571,"line":633},[569,985,986],{"class":795},"const",[569,988,989],{"class":586}," server ",[569,991,992],{"class":590},"=",[569,994,995],{"class":575}," await",[569,997,947],{"class":582},[569,999,1000],{"class":586},"()\n",[569,1002,1003,1006,1008,1011,1014,1016,1019,1021,1024,1026],{"class":571,"line":541},[569,1004,1005],{"class":582},"initLogger",[569,1007,587],{"class":586},[569,1009,1010],{"class":590},"{",[569,1012,1013],{"class":597}," drain",[569,1015,601],{"class":590},[569,1017,1018],{"class":586}," server",[569,1020,716],{"class":590},[569,1022,1023],{"class":586},"drain ",[569,1025,655],{"class":590},[569,1027,658],{"class":586},[569,1029,1030],{"class":571,"line":652},[569,1031,788],{"emptyLinePlaceholder":787},[569,1033,1035],{"class":571,"line":1034},7,[569,1036,1038],{"class":1037},"sHwdD","\u002F\u002F ... your script runs, devtools can subscribe ...\n",[557,1040,1042],{"id":1041},"hono-express-fastify-elysia-nestjs-sveltekit","Hono \u002F Express \u002F Fastify \u002F Elysia \u002F NestJS \u002F SvelteKit",[435,1044,1045,1046,1048,1049,1051,1052,1055],{},"These integrations work as documented in their respective ",[439,1047,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 ",[474,1050,494],{}," once at boot and pass ",[474,1053,1054],{},"server.drain"," wherever you compose your evlog drain.",[530,1057,1059],{"className":562,"code":1058,"language":565,"meta":536,"style":536},"import { startStreamServer } from 'evlog\u002Fstream'\n\nconst server = await startStreamServer()\n\u002F\u002F then plug `server.drain` into your evlog drain composer\n",[474,1060,1061,1079,1083,1097],{"__ignoreMap":536},[569,1062,1063,1065,1067,1069,1071,1073,1075,1077],{"class":571,"line":572},[569,1064,762],{"class":575},[569,1066,693],{"class":590},[569,1068,947],{"class":586},[569,1070,770],{"class":590},[569,1072,773],{"class":575},[569,1074,776],{"class":590},[569,1076,956],{"class":610},[569,1078,782],{"class":590},[569,1080,1081],{"class":571,"line":594},[569,1082,788],{"emptyLinePlaceholder":787},[569,1084,1085,1087,1089,1091,1093,1095],{"class":571,"line":622},[569,1086,986],{"class":795},[569,1088,989],{"class":586},[569,1090,992],{"class":590},[569,1092,995],{"class":575},[569,1094,947],{"class":582},[569,1096,1000],{"class":586},[569,1098,1099],{"class":571,"line":633},[569,1100,1101],{"class":1037},"\u002F\u002F then plug `server.drain` into your evlog drain composer\n",[485,1103,1105],{"id":1104},"api","API",[530,1107,1109],{"className":562,"code":1108,"language":565,"meta":536,"style":536},"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",[474,1110,1111,1144,1148,1168,1183,1201,1220,1235,1251,1266,1286,1293,1298,1312,1325,1337,1350],{"__ignoreMap":536},[569,1112,1113,1115,1117,1119,1121,1124,1127,1129,1131,1134,1136,1138,1140,1142],{"class":571,"line":572},[569,1114,762],{"class":575},[569,1116,693],{"class":590},[569,1118,947],{"class":586},[569,1120,705],{"class":590},[569,1122,1123],{"class":575}," type",[569,1125,1126],{"class":586}," StreamServer",[569,1128,705],{"class":590},[569,1130,1123],{"class":575},[569,1132,1133],{"class":586}," StreamServerOptions",[569,1135,770],{"class":590},[569,1137,773],{"class":575},[569,1139,776],{"class":590},[569,1141,956],{"class":610},[569,1143,782],{"class":590},[569,1145,1146],{"class":571,"line":594},[569,1147,788],{"emptyLinePlaceholder":787},[569,1149,1150,1152,1154,1156,1158,1160,1162,1164,1166],{"class":571,"line":622},[569,1151,986],{"class":795},[569,1153,1018],{"class":586},[569,1155,601],{"class":590},[569,1157,1126],{"class":678},[569,1159,811],{"class":590},[569,1161,995],{"class":575},[569,1163,947],{"class":582},[569,1165,587],{"class":586},[569,1167,591],{"class":590},[569,1169,1170,1173,1175,1178,1180],{"class":571,"line":633},[569,1171,1172],{"class":597},"  port",[569,1174,601],{"class":590},[569,1176,1177],{"class":701}," 0",[569,1179,705],{"class":590},[569,1181,1182],{"class":1037},"                  \u002F\u002F 0 = OS picks ephemeral port (default)\n",[569,1184,1185,1188,1190,1192,1194,1196,1198],{"class":571,"line":541},[569,1186,1187],{"class":597},"  host",[569,1189,601],{"class":590},[569,1191,776],{"class":590},[569,1193,509],{"class":610},[569,1195,607],{"class":590},[569,1197,705],{"class":590},[569,1199,1200],{"class":1037},"        \u002F\u002F default — local-only, never exposed to LAN\n",[569,1202,1203,1206,1208,1210,1213,1215,1217],{"class":571,"line":652},[569,1204,1205],{"class":597},"  token",[569,1207,601],{"class":590},[569,1209,776],{"class":590},[569,1211,1212],{"class":610},"optional-bearer",[569,1214,607],{"class":590},[569,1216,705],{"class":590},[569,1218,1219],{"class":1037}," \u002F\u002F default: none (origin check used instead)\n",[569,1221,1222,1225,1227,1230,1232],{"class":571,"line":1034},[569,1223,1224],{"class":597},"  heartbeatMs",[569,1226,601],{"class":590},[569,1228,1229],{"class":701}," 15_000",[569,1231,705],{"class":590},[569,1233,1234],{"class":1037},"      \u002F\u002F default\n",[569,1236,1238,1241,1243,1246,1248],{"class":571,"line":1237},8,[569,1239,1240],{"class":597},"  buffer",[569,1242,601],{"class":590},[569,1244,1245],{"class":701}," 500",[569,1247,705],{"class":590},[569,1249,1250],{"class":1037},"              \u002F\u002F default ring buffer size\n",[569,1252,1254,1257,1259,1261,1263],{"class":571,"line":1253},9,[569,1255,1256],{"class":597},"  banner",[569,1258,601],{"class":590},[569,1260,642],{"class":641},[569,1262,705],{"class":590},[569,1264,1265],{"class":1037},"             \u002F\u002F default — prints `[evlog] Stream → ...`\n",[569,1267,1269,1272,1274,1276,1279,1281,1283],{"class":571,"line":1268},10,[569,1270,1271],{"class":597},"  urlFileDir",[569,1273,601],{"class":590},[569,1275,776],{"class":590},[569,1277,1278],{"class":610},".evlog",[569,1280,607],{"class":590},[569,1282,705],{"class":590},[569,1284,1285],{"class":1037},"     \u002F\u002F default — false to disable .evlog\u002Fstream.url\n",[569,1287,1289,1291],{"class":571,"line":1288},11,[569,1290,655],{"class":590},[569,1292,658],{"class":586},[569,1294,1296],{"class":571,"line":1295},12,[569,1297,788],{"emptyLinePlaceholder":787},[569,1299,1301,1304,1306,1309],{"class":571,"line":1300},13,[569,1302,1303],{"class":586},"server",[569,1305,716],{"class":590},[569,1307,1308],{"class":586},"url   ",[569,1310,1311],{"class":1037},"\u002F\u002F → 'http:\u002F\u002F127.0.0.1:51203'\n",[569,1313,1315,1317,1319,1322],{"class":571,"line":1314},14,[569,1316,1303],{"class":586},[569,1318,716],{"class":590},[569,1320,1321],{"class":586},"port  ",[569,1323,1324],{"class":1037},"\u002F\u002F → 51203\n",[569,1326,1328,1330,1332,1334],{"class":571,"line":1327},15,[569,1329,1303],{"class":586},[569,1331,716],{"class":590},[569,1333,1023],{"class":586},[569,1335,1336],{"class":1037},"\u002F\u002F DrainFn — pass to nitroApp.hooks.hook('evlog:drain', drain) or initLogger({ drain })\n",[569,1338,1340,1342,1344,1347],{"class":571,"line":1339},16,[569,1341,1303],{"class":586},[569,1343,716],{"class":590},[569,1345,1346],{"class":586},"stream ",[569,1348,1349],{"class":1037},"\u002F\u002F StreamDrain (the underlying in-process pub\u002Fsub)\n",[569,1351,1353,1356,1358,1360,1363,1366],{"class":571,"line":1352},17,[569,1354,1355],{"class":575},"await",[569,1357,1018],{"class":586},[569,1359,716],{"class":590},[569,1361,1362],{"class":582},"close",[569,1364,1365],{"class":586},"() ",[569,1367,1368],{"class":1037},"\u002F\u002F stop, remove .evlog\u002Fstream.url, unsubscribe clients\n",[435,1370,1371,1373,1374,1377,1378,1381],{},[474,1372,494],{}," is ",[444,1375,1376],{},"idempotent"," — calling it again returns the same instance until ",[474,1379,1380],{},"close()"," is called.",[485,1383,1385],{"id":1384},"security","Security",[435,1387,1388,1389,1391],{},"The server binds to ",[474,1390,509],{}," by default and is unreachable from the LAN. For any non-local exposure (different host, reverse-proxy, port-forward), add a bearer token:",[530,1393,1395],{"className":562,"code":1394,"language":565,"meta":536,"style":536},"evlog: {\n  stream: {\n    token: process.env.EVLOG_STREAM_TOKEN,\n  },\n}\n",[474,1396,1397,1405,1413,1432,1436],{"__ignoreMap":536},[569,1398,1399,1401,1403],{"class":571,"line":572},[569,1400,679],{"class":678},[569,1402,601],{"class":590},[569,1404,630],{"class":590},[569,1406,1407,1409,1411],{"class":571,"line":594},[569,1408,688],{"class":678},[569,1410,601],{"class":590},[569,1412,630],{"class":590},[569,1414,1415,1418,1420,1422,1424,1426,1428,1430],{"class":571,"line":622},[569,1416,1417],{"class":678},"    token",[569,1419,601],{"class":590},[569,1421,713],{"class":586},[569,1423,716],{"class":590},[569,1425,719],{"class":586},[569,1427,716],{"class":590},[569,1429,724],{"class":586},[569,1431,619],{"class":590},[569,1433,1434],{"class":571,"line":633},[569,1435,649],{"class":590},[569,1437,1438],{"class":571,"line":541},[569,1439,732],{"class":590},[435,1441,1442],{},"Or programmatically:",[530,1444,1446],{"className":562,"code":1445,"language":565,"meta":536,"style":536},"const server = await startStreamServer({\n  token: process.env.EVLOG_STREAM_TOKEN,\n})\n",[474,1447,1448,1464,1482],{"__ignoreMap":536},[569,1449,1450,1452,1454,1456,1458,1460,1462],{"class":571,"line":572},[569,1451,986],{"class":795},[569,1453,989],{"class":586},[569,1455,992],{"class":590},[569,1457,995],{"class":575},[569,1459,947],{"class":582},[569,1461,587],{"class":586},[569,1463,591],{"class":590},[569,1465,1466,1468,1470,1472,1474,1476,1478,1480],{"class":571,"line":594},[569,1467,1205],{"class":597},[569,1469,601],{"class":590},[569,1471,713],{"class":586},[569,1473,716],{"class":590},[569,1475,719],{"class":586},[569,1477,716],{"class":590},[569,1479,724],{"class":586},[569,1481,619],{"class":590},[569,1483,1484,1486],{"class":571,"line":622},[569,1485,655],{"class":590},[569,1487,658],{"class":586},[1489,1490,1491,1504],"table",{},[1492,1493,1494],"thead",{},[1495,1496,1497,1501],"tr",{},[1498,1499,1500],"th",{},"Mode",[1498,1502,1503],{},"Behavior",[1505,1506,1507,1522,1536,1556],"tbody",{},[1495,1508,1509,1516],{},[1510,1511,1512,1515],"td",{},[474,1513,1514],{},"token"," set",[1510,1517,1518,1521],{},[474,1519,1520],{},"Authorization: Bearer \u003Ctoken>"," is required. 401 otherwise.",[1495,1523,1524,1533],{},[1510,1525,1526,1528,1529,1532],{},[474,1527,1514],{}," unset, request has no ",[474,1530,1531],{},"Origin"," (curl, Node fetch)",[1510,1534,1535],{},"Allowed.",[1495,1537,1538,1554],{},[1510,1539,1540,1542,1543,1545,1546,464,1549,464,1551,751],{},[474,1541,1514],{}," unset, request ",[474,1544,1531],{}," is local (",[474,1547,1548],{},"localhost",[474,1550,509],{},[474,1552,1553],{},"::1",[1510,1555,1535],{},[1495,1557,1558,1565],{},[1510,1559,1560,1542,1562,1564],{},[474,1561,1514],{},[474,1563,1531],{}," is non-local",[1510,1566,1567],{},"403.",[435,1569,1570,1571,1574,1575,1577],{},"You can also override ",[474,1572,1573],{},"host",", but think twice — exposing the server beyond ",[474,1576,509],{}," without a token is unsafe. Wide events often carry user data your other adapters would normally redact.",[485,1579,1581],{"id":1580},"endpoints","Endpoints",[1489,1583,1584,1594],{},[1492,1585,1586],{},[1495,1587,1588,1591],{},[1498,1589,1590],{},"Path",[1498,1592,1593],{},"Purpose",[1505,1595,1596,1610,1624],{},[1495,1597,1598,1603],{},[1510,1599,1600],{},[474,1601,1602],{},"GET \u002F",[1510,1604,1605,1606,1609],{},"The SSE stream itself. Accepts ",[474,1607,1608],{},"?since=\u003Ciso>"," to replay buffered events.",[1495,1611,1612,1617],{},[1510,1613,1614],{},[474,1615,1616],{},"GET \u002Finfo",[1510,1618,1619,1620,1623],{},"JSON ",[474,1621,1622],{},"{ evlogVersion, bufferSize, heartbeatMs }"," — server discovery.",[1495,1625,1626,1631],{},[1510,1627,1628],{},[474,1629,1630],{},"OPTIONS *",[1510,1632,1633,1634,1637],{},"CORS preflight (the server allows ",[474,1635,1636],{},"*"," because it binds to localhost).",[485,1639,1641],{"id":1640},"wire-format","Wire format",[435,1643,1644,1645,1648],{},"Every SSE ",[474,1646,1647],{},"data:"," line is a versioned envelope:",[530,1650,1653],{"className":1651,"code":1652,"language":535,"meta":536},[533],"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",[474,1654,1652],{"__ignoreMap":536},[1489,1656,1657,1667],{},[1492,1658,1659],{},[1495,1660,1661,1664],{},[1498,1662,1663],{},"Type",[1498,1665,1666],{},"When",[1505,1668,1669,1679,1692,1702],{},[1495,1670,1671,1676],{},[1510,1672,1673],{},[474,1674,1675],{},"hello",[1510,1677,1678],{},"First frame — server version + stream config",[1495,1680,1681,1686],{},[1510,1682,1683],{},[474,1684,1685],{},"replay",[1510,1687,1688,1689],{},"Each buffered event flushed when the client passed ",[474,1690,1691],{},"?since=",[1495,1693,1694,1699],{},[1510,1695,1696],{},[474,1697,1698],{},"event",[1510,1700,1701],{},"Each new event drained after the connection opened",[1495,1703,1704,1709],{},[1510,1705,1706],{},[474,1707,1708],{},"ping",[1510,1710,1711,1712,1715,1716],{},"Heartbeat every ",[474,1713,1714],{},"heartbeatMs"," (default 15s), sent with ",[474,1717,1718],{},"event: ping",[435,1720,1721,1722,1725],{},"The ",[474,1723,1724],{},"evlog: \"1\""," discriminant is the protocol version — incompatible changes will bump it.",[485,1727,1729],{"id":1728},"discovery","Discovery",[435,1731,1732],{},"External tools (a Tauri devtool, a CLI watcher) can find the running server in two ways:",[497,1734,1735,1742],{},[500,1736,1737,1741],{},[444,1738,1739],{},[474,1740,742],{}," — read directly from the project directory. Cleaned up at process exit.",[500,1743,1744,1749,1750,1753],{},[444,1745,1746],{},[474,1747,1748],{},"GET \u002Fapi\u002F_evlog\u002Fstream-info"," (Nuxt only) — returns ",[474,1751,1752],{},"{ url }",", reads from the file.",[530,1755,1759],{"className":1756,"code":1757,"language":1758,"meta":536,"style":536},"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",[474,1760,1761,1766],{"__ignoreMap":536},[569,1762,1763],{"class":571,"line":572},[569,1764,1765],{"class":1037},"# CLI consumer\n",[569,1767,1768,1771,1774,1777,1780,1782,1785,1788,1791,1794,1797],{"class":571,"line":594},[569,1769,1770],{"class":586},"URL",[569,1772,1773],{"class":590},"=$(",[569,1775,1776],{"class":678},"cat",[569,1778,1779],{"class":610}," .evlog\u002Fstream.url",[569,1781,751],{"class":590},[569,1783,1784],{"class":590}," &&",[569,1786,1787],{"class":678}," curl",[569,1789,1790],{"class":610}," -N",[569,1792,1793],{"class":590}," \"",[569,1795,1796],{"class":586},"$URL",[569,1798,1799],{"class":590},"\"\n",[485,1801,1803],{"id":1802},"going-further","Going further",[1805,1806,1807,1812],"ul",{},[500,1808,1809,1811],{},[439,1810,156],{"href":318}," — copy-paste examples for browser, curl + jq, Node fetch, replay-then-live, aggregation.",[500,1813,1814,1816],{},[439,1815,298],{"href":299}," — the in-process primitive the server is built on.",[1818,1819,1820],"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":536,"searchDepth":594,"depth":594,"links":1822},[1823,1824,1831,1832,1833,1834,1835,1836],{"id":487,"depth":594,"text":488},{"id":554,"depth":594,"text":555,"children":1825},[1826,1827,1829,1830],{"id":559,"depth":622,"text":211},{"id":746,"depth":622,"text":1828},"Next.js (instrumentation.ts)",{"id":932,"depth":622,"text":933},{"id":1041,"depth":622,"text":1042},{"id":1104,"depth":594,"text":1105},{"id":1384,"depth":594,"text":1385},{"id":1580,"depth":594,"text":1581},{"id":1640,"depth":594,"text":1641},{"id":1728,"depth":594,"text":1729},{"id":1802,"depth":594,"text":1803},"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":303,"icon":306},{"title":303,"description":1837},"6MI0pLbdl_PiI4dWPERVmbtGinjjlZoBwJFuwqr8fWU",[1845,1847],{"title":298,"path":299,"stem":300,"description":1846,"icon":301,"children":-1},"Subscribe to wide events flowing through evlog, in-process, with createStreamDrain — sync listeners, async iterators, and a ring buffer.",{"title":308,"path":309,"stem":310,"description":1848,"icon":311,"children":-1},"Replay and tail the local NDJSON drain with readFsLogs and tailFsLogs — works in-process or from any external Node tool.",1778336626483]