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