[{"data":1,"prerenderedAt":2133},["ShallowReactive",2],{"navigation_docs":3,"-extend-stream":581,"-extend-stream-surround":2128},[4,35,85,138,318,458,517,556],{"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,453],{"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,"icon":457},"Libraries","\u002Fuse-cases\u002Flibraries","5.use-cases\u002F7.libraries","i-lucide-package",{"title":459,"path":460,"stem":461,"children":462,"page":34},"Extend","\u002Fextend","6.extend",[463,467,472,477,481,486,490,494,498,502,507,512],{"title":41,"path":464,"stem":465,"icon":466},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":468,"path":469,"stem":470,"icon":471},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":473,"path":474,"stem":475,"icon":476},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":478,"path":479,"stem":480,"icon":471},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","6.extend\u002F11.diagnostics-channel",{"title":482,"path":483,"stem":484,"icon":485},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":415,"path":487,"stem":488,"icon":489},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":491,"path":492,"stem":493,"icon":466},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":495,"path":496,"stem":497,"icon":443},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":499,"path":500,"stem":501,"icon":69},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling",{"title":503,"path":504,"stem":505,"icon":506},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":508,"path":509,"stem":510,"icon":511},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":513,"path":514,"stem":515,"icon":516},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":436,"path":518,"stem":519,"children":520,"page":34},"\u002Freference","7.reference",[521,525,530,533,538,542,547,551],{"title":41,"path":522,"stem":523,"icon":524},"\u002Freference\u002Foverview","7.reference\u002F0.overview","i-lucide-book-marked",{"title":526,"path":527,"stem":528,"icon":529},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":383,"path":531,"stem":532,"icon":112},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":534,"path":535,"stem":536,"icon":537},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":539,"path":540,"stem":541,"icon":388},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":543,"path":544,"stem":545,"icon":546},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":548,"path":549,"stem":550,"icon":443},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"title":552,"path":553,"stem":554,"icon":555},"Cost","\u002Freference\u002Fcost","7.reference\u002F7.cost","i-lucide-receipt",{"title":557,"path":558,"stem":559,"children":560,"page":34},"Compare","\u002Fcompare","8.compare",[561,565,569,573,577],{"title":562,"path":563,"stem":564,"icon":546},"evlog vs Pino","\u002Fcompare\u002Fpino","8.compare\u002F1.pino",{"title":566,"path":567,"stem":568,"icon":204},"evlog vs OpenTelemetry","\u002Fcompare\u002Fopentelemetry","8.compare\u002F2.opentelemetry",{"title":570,"path":571,"stem":572,"icon":546},"evlog vs LogTape","\u002Fcompare\u002Flogtape","8.compare\u002F3.logtape",{"title":574,"path":575,"stem":576,"icon":546},"evlog vs Winston: formats and request events","\u002Fcompare\u002Fwinston","8.compare\u002F4.winston",{"title":578,"path":579,"stem":580,"icon":546},"evlog vs Consola: reporters and request context","\u002Fcompare\u002Fconsola","8.compare\u002F5.consola",{"id":582,"title":468,"body":583,"description":2121,"extension":2122,"links":2123,"meta":2124,"navigation":2125,"path":469,"seo":2126,"stem":470,"__hash__":2127},"docs\u002F6.extend\u002F1.stream.md",{"type":584,"value":585,"toc":2108},"minimark",[586,595,619,634,638,641,646,723,1042,1046,1133,1142,1146,1149,1158,1164,1234,1238,1244,1282,1285,1289,1558,1571,1575,1578,1594,1597,1669,1672,1727,1731,1737,1825,1991,1995,2087,2091,2104],[587,588,589,590,594],"p",{},"evlog ships a ",[591,592,593],"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:",[596,597,598,610],"ul",{},[599,600,601,604,605,609],"li",{},[591,602,603],{},"In-process bus",": ",[606,607,608],"code",{},"createStreamDrain()",", the canonical pub\u002Fsub. Sync listeners, async iterators, ring-buffered replay.",[599,611,612,604,615,618],{},[591,613,614],{},"Network bridge",[606,616,617],{},"startStreamServer()",", an opt-in HTTP mini-server that exposes the in-process bus over Server-Sent Events for browsers, CLIs, or external devtools.",[620,621,622,625,626,629,630,633],"callout",{"icon":377},[591,623,624],{},"Local-only by design."," Both layers live inside a single Node \u002F Bun \u002F Deno process. They work in ",[606,627,628],{},"pnpm dev",", on long-lived self-hosted servers, on VMs and containers (Fly, Railway, Coolify…). They do ",[591,631,632],{},"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.",[635,636,603],"h2",{"id":637},"in-process-bus",[639,640],"stream-bus",{},[587,642,643,645],{},[606,644,608],{}," 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.",[647,648,651,654,714],"prompt",{":actions":649,"description":650,"icon":471},"[\"copy\",\"cursor\",\"claude\"]","Subscribe to wide events in-process",[587,652,653],{},"Wire an in-process subscriber on top of evlog's stream drain.",[596,655,656,667,682,693,700,711],{},[599,657,658,659,662,663,666],{},"Import ",[606,660,661],{},"createStreamDrain"," from ",[606,664,665],{},"evlog\u002Fstream"," and call it once at app boot",[599,668,669,670,673,674,677,678,681],{},"Register the returned ",[606,671,672],{},"drain"," on the evlog drain hook for my framework (Nitro: ",[606,675,676],{},"nitroApp.hooks.hook('evlog:drain', stream.drain)","; Next\u002Fstandalone: pass to ",[606,679,680],{},"initLogger({ drain })",")",[599,683,684,685,688,689,692],{},"Subscribe with ",[606,686,687],{},"stream.subscribe((event) => ...)"," for sync listeners or ",[606,690,691],{},"for await (const event of stream.events())"," for async iteration",[599,694,695,696,699],{},"Seed history for late subscribers with ",[606,697,698],{},"stream.recent()"," (snapshot of the ring buffer) before opening the live iterator",[599,701,702,703,706,707,710],{},"Tune ",[606,704,705],{},"buffer"," for replay history and ",[606,708,709],{},"perSubscriberQueue"," for slow-consumer backpressure",[599,712,713],{},"Skip on serverless platforms. The stream is in-process, so isolated invocations won't share it",[587,715,716,717],{},"Docs: ",[718,719,720],"a",{"href":720,"rel":721},"https:\u002F\u002Fwww.evlog.dev\u002Fextend\u002Fstream",[722],"nofollow",[724,725,730],"pre",{"className":726,"code":727,"language":728,"meta":729,"style":729},"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","",[606,731,732,764,771,809,814,852,857,890,928,936,945,950,979,992,998,1026,1037],{"__ignoreMap":729},[733,734,737,741,745,749,752,755,758,761],"span",{"class":735,"line":736},"line",1,[733,738,740],{"class":739},"s7zQu","import",[733,742,744],{"class":743},"sMK4o"," {",[733,746,748],{"class":747},"sTEyZ"," createStreamDrain",[733,750,751],{"class":743}," }",[733,753,754],{"class":739}," from",[733,756,757],{"class":743}," '",[733,759,665],{"class":760},"sfazB",[733,762,763],{"class":743},"'\n",[733,765,767],{"class":735,"line":766},2,[733,768,770],{"emptyLinePlaceholder":769},true,"\n",[733,772,774,778,781,784,787,790,793,797,800,804,806],{"class":735,"line":773},3,[733,775,777],{"class":776},"spNyl","const",[733,779,780],{"class":747}," stream ",[733,782,783],{"class":743},"=",[733,785,748],{"class":786},"s2Zo4",[733,788,789],{"class":747},"(",[733,791,792],{"class":743},"{",[733,794,796],{"class":795},"swJcz"," buffer",[733,798,799],{"class":743},":",[733,801,803],{"class":802},"sbssI"," 200",[733,805,751],{"class":743},[733,807,808],{"class":747},")\n",[733,810,812],{"class":735,"line":811},4,[733,813,770],{"emptyLinePlaceholder":769},[733,815,817,820,823,826,828,831,833,836,839,841,844,847,849],{"class":735,"line":816},5,[733,818,819],{"class":747},"nitroApp",[733,821,822],{"class":743},".",[733,824,825],{"class":747},"hooks",[733,827,822],{"class":743},[733,829,830],{"class":786},"hook",[733,832,789],{"class":747},[733,834,835],{"class":743},"'",[733,837,838],{"class":760},"evlog:drain",[733,840,835],{"class":743},[733,842,843],{"class":743},",",[733,845,846],{"class":747}," stream",[733,848,822],{"class":743},[733,850,851],{"class":747},"drain)\n",[733,853,855],{"class":735,"line":854},6,[733,856,770],{"emptyLinePlaceholder":769},[733,858,860,862,865,867,869,871,874,876,878,882,884,887],{"class":735,"line":859},7,[733,861,777],{"class":776},[733,863,864],{"class":747}," off ",[733,866,783],{"class":743},[733,868,846],{"class":747},[733,870,822],{"class":743},[733,872,873],{"class":786},"subscribe",[733,875,789],{"class":747},[733,877,789],{"class":743},[733,879,881],{"class":880},"sHdIc","event",[733,883,681],{"class":743},[733,885,886],{"class":776}," =>",[733,888,889],{"class":743}," {\n",[733,891,893,896,899,901,903,906,909,911,914,916,919,922,924,926],{"class":735,"line":892},8,[733,894,895],{"class":739},"  if",[733,897,898],{"class":795}," (",[733,900,881],{"class":747},[733,902,822],{"class":743},[733,904,905],{"class":747},"level",[733,907,908],{"class":743}," ===",[733,910,757],{"class":743},[733,912,913],{"class":760},"error",[733,915,835],{"class":743},[733,917,918],{"class":795},") ",[733,920,921],{"class":786},"notify",[733,923,789],{"class":795},[733,925,881],{"class":747},[733,927,808],{"class":795},[733,929,931,934],{"class":735,"line":930},9,[733,932,933],{"class":743},"}",[733,935,808],{"class":747},[733,937,939,942],{"class":735,"line":938},10,[733,940,941],{"class":786},"off",[733,943,944],{"class":747},"()\n",[733,946,948],{"class":735,"line":947},11,[733,949,770],{"emptyLinePlaceholder":769},[733,951,953,956,958,960,963,966,968,970,973,976],{"class":735,"line":952},12,[733,954,955],{"class":739},"for",[733,957,898],{"class":747},[733,959,777],{"class":776},[733,961,962],{"class":747}," past ",[733,964,965],{"class":743},"of",[733,967,846],{"class":747},[733,969,822],{"class":743},[733,971,972],{"class":786},"recent",[733,974,975],{"class":747},"()) ",[733,977,978],{"class":743},"{\n",[733,980,982,985,987,990],{"class":735,"line":981},13,[733,983,984],{"class":786},"  bootstrap",[733,986,789],{"class":795},[733,988,989],{"class":747},"past",[733,991,808],{"class":795},[733,993,995],{"class":735,"line":994},14,[733,996,997],{"class":743},"}\n",[733,999,1001,1003,1006,1008,1010,1013,1015,1017,1019,1022,1024],{"class":735,"line":1000},15,[733,1002,955],{"class":739},[733,1004,1005],{"class":739}," await",[733,1007,898],{"class":747},[733,1009,777],{"class":776},[733,1011,1012],{"class":747}," event ",[733,1014,965],{"class":743},[733,1016,846],{"class":747},[733,1018,822],{"class":743},[733,1020,1021],{"class":786},"events",[733,1023,975],{"class":747},[733,1025,978],{"class":743},[733,1027,1029,1031,1033,1035],{"class":735,"line":1028},16,[733,1030,984],{"class":786},[733,1032,789],{"class":795},[733,1034,881],{"class":747},[733,1036,808],{"class":795},[733,1038,1040],{"class":735,"line":1039},17,[733,1041,997],{"class":743},[1043,1044,346],"h3",{"id":1045},"options",[1047,1048,1049,1065],"table",{},[1050,1051,1052],"thead",{},[1053,1054,1055,1059,1062],"tr",{},[1056,1057,1058],"th",{},"Option",[1056,1060,1061],{},"Type",[1056,1063,1064],{},"Description",[1066,1067,1068,1094,1114],"tbody",{},[1053,1069,1070,1075,1080],{},[1071,1072,1073],"td",{},[606,1074,705],{},[1071,1076,1077],{},[606,1078,1079],{},"number",[1071,1081,1082,1083,1086,1087,1090,1091,822],{},"Ring-buffer size for ",[606,1084,1085],{},"recent()"," snapshots. Set to ",[606,1088,1089],{},"0"," to disable. Default: ",[606,1092,1093],{},"500",[1053,1095,1096,1100,1104],{},[1071,1097,1098],{},[606,1099,709],{},[1071,1101,1102],{},[606,1103,1079],{},[1071,1105,1106,1107,1110,1111,822],{},"Max queued events per ",[606,1108,1109],{},"events()"," async iterator before the oldest are dropped. The drain itself is never blocked. Default: ",[606,1112,1113],{},"1000",[1053,1115,1116,1121,1126],{},[1071,1117,1118],{},[606,1119,1120],{},"filter",[1071,1122,1123],{},[606,1124,1125],{},"(event) => boolean",[1071,1127,1128,1129,1132],{},"Optional predicate run on each drained event — return ",[606,1130,1131],{},"false"," to skip the event entirely (neither buffered nor delivered).",[587,1134,1135,1138,1139,1141],{},[606,1136,1137],{},"stream.drain(events)"," accepts either a single event or a batch. ",[606,1140,698],{}," returns a snapshot of the buffered events (oldest first, most recent last) for ad-hoc inspection or to seed a UI panel.",[635,1143,1145],{"id":1144},"network-bridge-stream-server","Network bridge: stream server",[1147,1148],"sse-wire",{},[587,1150,1151,1153,1154,1157],{},[606,1152,617],{}," boots a tiny ",[606,1155,1156],{},"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.",[620,1159,1160,1163],{"icon":377},[591,1161,1162],{},"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.",[647,1165,1168,1171,1229],{":actions":649,"description":1166,"icon":1167},"Expose the evlog stream over SSE","i-lucide-radio",[587,1169,1170],{},"Turn on the local stream server so I can subscribe to wide events from a browser tab, CLI, or Tauri\u002FElectron devtool.",[596,1172,1173,1197,1204,1215,1226],{},[599,1174,1175,1176,1179,1180,1183,1184,1179,1187,1190,1191,1193,1194,1196],{},"Detect my framework and opt in explicitly (Nuxt: ",[606,1177,1178],{},"evlog.stream: true"," in ",[606,1181,1182],{},"nuxt.config.ts","; Next.js: ",[606,1185,1186],{},"defineStreamedInstrumentation({ stream: true })",[606,1188,1189],{},"instrumentation.ts","; Hono\u002FExpress\u002FFastify\u002FElysia\u002Fstandalone: call ",[606,1192,617],{}," once at boot and register the returned ",[606,1195,672],{}," on the evlog drain hook)",[599,1198,1199,1200,1203],{},"Never enable in production by default; gate it behind ",[606,1201,1202],{},"process.env.NODE_ENV !== 'production'"," or a feature flag",[599,1205,1206,1207,1210,1211,1214],{},"For shared dev environments, set ",[606,1208,1209],{},"token: process.env.EVLOG_STREAM_TOKEN"," and have the consumer send it as ",[606,1212,1213],{},"Authorization: Bearer \u003Ctoken>"," on every request",[599,1216,1217,1218,1221,1222,1225],{},"Discover the URL from ",[606,1219,1220],{},".evlog\u002Fstream.url"," (or ",[606,1223,1224],{},"\u002Fapi\u002F_evlog\u002Fstream-info"," on Nuxt), and never hard-code the port, which is ephemeral",[599,1227,1228],{},"Skip on serverless platforms. The server is in-process",[587,1230,716,1231],{},[718,1232,720],{"href":720,"rel":1233},[722],[1043,1235,1237],{"id":1236},"what-boots-up","What boots up",[587,1239,1240,1241,1243],{},"When you opt in, evlog calls ",[606,1242,617],{}," and:",[1245,1246,1247,1250,1260,1265,1268,1271],"ol",{},[599,1248,1249],{},"Picks an ephemeral free port (or the one you specify)",[599,1251,1252,1253,1255,1256,1259],{},"Spins a tiny ",[606,1254,1156],{}," server on ",[606,1257,1258],{},"127.0.0.1"," (or your host)",[599,1261,1262,1263],{},"Writes the discovered URL to ",[606,1264,1220],{},[599,1266,1267],{},"Prints a one-line banner in the server console",[599,1269,1270],{},"Hooks the in-process stream drain into the evlog pipeline",[599,1272,1273,1274,1277,1278,1281],{},"Exposes ",[606,1275,1276],{},"GET \u002F"," for the SSE stream and ",[606,1279,1280],{},"GET \u002Finfo"," for handshake metadata",[587,1283,1284],{},"On shutdown (SIGINT \u002F SIGTERM \u002F process exit) the server cleans up listeners and removes the URL file.",[1043,1286,1288],{"id":1287},"per-framework-opt-in","Per-framework opt-in",[1290,1291,1292,1374,1443],"code-group",{},[724,1293,1295],{"className":726,"code":1294,"filename":1182,"language":728,"meta":729,"style":729},"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",[606,1296,1297,1312,1335,1344,1357,1363,1368],{"__ignoreMap":729},[733,1298,1299,1302,1305,1308,1310],{"class":735,"line":736},[733,1300,1301],{"class":739},"export",[733,1303,1304],{"class":739}," default",[733,1306,1307],{"class":786}," defineNuxtConfig",[733,1309,789],{"class":747},[733,1311,978],{"class":743},[733,1313,1314,1317,1319,1322,1324,1327,1329,1332],{"class":735,"line":766},[733,1315,1316],{"class":795},"  modules",[733,1318,799],{"class":743},[733,1320,1321],{"class":747}," [",[733,1323,835],{"class":743},[733,1325,1326],{"class":760},"evlog\u002Fnuxt",[733,1328,835],{"class":743},[733,1330,1331],{"class":747},"]",[733,1333,1334],{"class":743},",\n",[733,1336,1337,1340,1342],{"class":735,"line":773},[733,1338,1339],{"class":795},"  evlog",[733,1341,799],{"class":743},[733,1343,889],{"class":743},[733,1345,1346,1349,1351,1355],{"class":735,"line":811},[733,1347,1348],{"class":795},"    stream",[733,1350,799],{"class":743},[733,1352,1354],{"class":1353},"sfNiH"," true",[733,1356,1334],{"class":743},[733,1358,1359],{"class":735,"line":816},[733,1360,1362],{"class":1361},"sHwdD","    \u002F\u002F or: stream: { port: 4444, token: process.env.EVLOG_STREAM_TOKEN }\n",[733,1364,1365],{"class":735,"line":854},[733,1366,1367],{"class":743},"  },\n",[733,1369,1370,1372],{"class":735,"line":859},[733,1371,933],{"class":743},[733,1373,808],{"class":747},[724,1375,1377],{"className":726,"code":1376,"filename":1189,"language":728,"meta":729,"style":729},"import { defineStreamedInstrumentation } from 'evlog\u002Fnext\u002Fstream'\n\nexport const { register } = defineStreamedInstrumentation({\n  stream: true,\n})\n",[606,1378,1379,1399,1403,1426,1437],{"__ignoreMap":729},[733,1380,1381,1383,1385,1388,1390,1392,1394,1397],{"class":735,"line":736},[733,1382,740],{"class":739},[733,1384,744],{"class":743},[733,1386,1387],{"class":747}," defineStreamedInstrumentation",[733,1389,751],{"class":743},[733,1391,754],{"class":739},[733,1393,757],{"class":743},[733,1395,1396],{"class":760},"evlog\u002Fnext\u002Fstream",[733,1398,763],{"class":743},[733,1400,1401],{"class":735,"line":766},[733,1402,770],{"emptyLinePlaceholder":769},[733,1404,1405,1407,1410,1412,1415,1417,1420,1422,1424],{"class":735,"line":773},[733,1406,1301],{"class":739},[733,1408,1409],{"class":776}," const",[733,1411,744],{"class":743},[733,1413,1414],{"class":747}," register ",[733,1416,933],{"class":743},[733,1418,1419],{"class":743}," =",[733,1421,1387],{"class":786},[733,1423,789],{"class":747},[733,1425,978],{"class":743},[733,1427,1428,1431,1433,1435],{"class":735,"line":811},[733,1429,1430],{"class":795},"  stream",[733,1432,799],{"class":743},[733,1434,1354],{"class":1353},[733,1436,1334],{"class":743},[733,1438,1439,1441],{"class":735,"line":816},[733,1440,933],{"class":743},[733,1442,808],{"class":747},[724,1444,1447],{"className":726,"code":1445,"filename":1446,"language":728,"meta":729,"style":729},"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",[606,1448,1449,1468,1472,1529,1549,1554],{"__ignoreMap":729},[733,1450,1451,1453,1455,1458,1460,1462,1464,1466],{"class":735,"line":736},[733,1452,740],{"class":739},[733,1454,744],{"class":743},[733,1456,1457],{"class":747}," startStreamServer",[733,1459,751],{"class":743},[733,1461,754],{"class":739},[733,1463,757],{"class":743},[733,1465,665],{"class":760},[733,1467,763],{"class":743},[733,1469,1470],{"class":735,"line":766},[733,1471,770],{"emptyLinePlaceholder":769},[733,1473,1474,1477,1480,1482,1485,1487,1490,1493,1495,1498,1500,1503,1506,1508,1510,1512,1515,1518,1520,1523,1525,1527],{"class":735,"line":773},[733,1475,1476],{"class":739},"if",[733,1478,1479],{"class":747}," (process",[733,1481,822],{"class":743},[733,1483,1484],{"class":747},"env",[733,1486,822],{"class":743},[733,1488,1489],{"class":747},"NODE_ENV ",[733,1491,1492],{"class":743},"!==",[733,1494,757],{"class":743},[733,1496,1497],{"class":760},"production",[733,1499,835],{"class":743},[733,1501,1502],{"class":743}," &&",[733,1504,1505],{"class":747}," process",[733,1507,822],{"class":743},[733,1509,1484],{"class":747},[733,1511,822],{"class":743},[733,1513,1514],{"class":747},"EVLOG_STREAM ",[733,1516,1517],{"class":743},"===",[733,1519,757],{"class":743},[733,1521,1522],{"class":760},"1",[733,1524,835],{"class":743},[733,1526,918],{"class":747},[733,1528,978],{"class":743},[733,1530,1531,1534,1536,1539,1541,1543,1545,1547],{"class":735,"line":811},[733,1532,1533],{"class":776},"  const",[733,1535,744],{"class":743},[733,1537,1538],{"class":747}," drain",[733,1540,751],{"class":743},[733,1542,1419],{"class":743},[733,1544,1005],{"class":739},[733,1546,1457],{"class":786},[733,1548,944],{"class":795},[733,1550,1551],{"class":735,"line":816},[733,1552,1553],{"class":1361},"  \u002F\u002F Plug `drain` into the evlog drain hook for your framework\n",[733,1555,1556],{"class":735,"line":854},[733,1557,997],{"class":743},[587,1559,1560,1561,1563,1564,1567,1568,1570],{},"The Hono \u002F Express \u002F Fastify integrations don't need a \"feature PR\", because ",[606,1562,617],{}," is ",[591,1565,1566],{},"orthogonal"," to your framework. You boot it once and connect its ",[606,1569,672],{}," to the evlog pipeline like any other drain.",[1043,1572,1574],{"id":1573},"discovery","Discovery",[587,1576,1577],{},"The mini-server runs on a random port, so any consumer must discover it.",[724,1579,1581],{"className":726,"code":1580,"filename":1220,"language":728,"meta":729,"style":729},"http:\u002F\u002F127.0.0.1:53942\n",[606,1582,1583],{"__ignoreMap":729},[733,1584,1585,1589,1591],{"class":735,"line":736},[733,1586,1588],{"class":1587},"sBMFI","http",[733,1590,799],{"class":743},[733,1592,1593],{"class":1361},"\u002F\u002F127.0.0.1:53942\n",[587,1595,1596],{},"Read directly from disk:",[724,1598,1600],{"className":726,"code":1599,"language":728,"meta":729,"style":729},"import { readFile } from 'node:fs\u002Fpromises'\n\nconst url = (await readFile('.evlog\u002Fstream.url', 'utf-8')).trim()\n",[606,1601,1602,1622,1626],{"__ignoreMap":729},[733,1603,1604,1606,1608,1611,1613,1615,1617,1620],{"class":735,"line":736},[733,1605,740],{"class":739},[733,1607,744],{"class":743},[733,1609,1610],{"class":747}," readFile",[733,1612,751],{"class":743},[733,1614,754],{"class":739},[733,1616,757],{"class":743},[733,1618,1619],{"class":760},"node:fs\u002Fpromises",[733,1621,763],{"class":743},[733,1623,1624],{"class":735,"line":766},[733,1625,770],{"emptyLinePlaceholder":769},[733,1627,1628,1630,1633,1635,1637,1640,1642,1644,1646,1648,1650,1652,1654,1657,1659,1662,1664,1667],{"class":735,"line":773},[733,1629,777],{"class":776},[733,1631,1632],{"class":747}," url ",[733,1634,783],{"class":743},[733,1636,898],{"class":747},[733,1638,1639],{"class":739},"await",[733,1641,1610],{"class":786},[733,1643,789],{"class":747},[733,1645,835],{"class":743},[733,1647,1220],{"class":760},[733,1649,835],{"class":743},[733,1651,843],{"class":743},[733,1653,757],{"class":743},[733,1655,1656],{"class":760},"utf-8",[733,1658,835],{"class":743},[733,1660,1661],{"class":747},"))",[733,1663,822],{"class":743},[733,1665,1666],{"class":786},"trim",[733,1668,944],{"class":747},[587,1670,1671],{},"Or, for same-origin browser tabs in a Nuxt app, hit the discovery route:",[724,1673,1675],{"className":726,"code":1674,"language":728,"meta":729,"style":729},"const { url } = await fetch('\u002Fapi\u002F_evlog\u002Fstream-info').then(r => r.json())\n",[606,1676,1677],{"__ignoreMap":729},[733,1678,1679,1681,1683,1685,1687,1689,1691,1694,1696,1698,1700,1702,1704,1706,1709,1711,1714,1716,1719,1721,1724],{"class":735,"line":736},[733,1680,777],{"class":776},[733,1682,744],{"class":743},[733,1684,1632],{"class":747},[733,1686,933],{"class":743},[733,1688,1419],{"class":743},[733,1690,1005],{"class":739},[733,1692,1693],{"class":786}," fetch",[733,1695,789],{"class":747},[733,1697,835],{"class":743},[733,1699,1224],{"class":760},[733,1701,835],{"class":743},[733,1703,681],{"class":747},[733,1705,822],{"class":743},[733,1707,1708],{"class":786},"then",[733,1710,789],{"class":747},[733,1712,1713],{"class":880},"r",[733,1715,886],{"class":776},[733,1717,1718],{"class":747}," r",[733,1720,822],{"class":743},[733,1722,1723],{"class":786},"json",[733,1725,1726],{"class":747},"())\n",[1043,1728,1730],{"id":1729},"wire-format","Wire format",[587,1732,1733,1734,799],{},"Every SSE message has the shape ",[606,1735,1736],{},"{ evlog: '1', type, data }",[1047,1738,1739,1756],{},[1050,1740,1741],{},[1053,1742,1743,1748,1751],{},[1056,1744,1745],{},[606,1746,1747],{},"type",[1056,1749,1750],{},"When",[1056,1752,1753],{},[606,1754,1755],{},"data",[1066,1757,1758,1773,1794,1807],{},[1053,1759,1760,1765,1768],{},[1071,1761,1762],{},[606,1763,1764],{},"hello",[1071,1766,1767],{},"First frame after connect",[1071,1769,1770],{},[606,1771,1772],{},"{ evlogVersion, bufferSize, heartbeatMs }",[1053,1774,1775,1780,1789],{},[1071,1776,1777],{},[606,1778,1779],{},"replay",[1071,1781,1782,1783,1785,1786],{},"Right after ",[606,1784,1764],{},", replays buffered events when the consumer passed ",[606,1787,1788],{},"?since=\u003Ciso>",[1071,1790,1791],{},[606,1792,1793],{},"WideEvent",[1053,1795,1796,1800,1803],{},[1071,1797,1798],{},[606,1799,881],{},[1071,1801,1802],{},"Every emitted event after that",[1071,1804,1805],{},[606,1806,1793],{},[1053,1808,1809,1814,1820],{},[1071,1810,1811],{},[606,1812,1813],{},"ping",[1071,1815,1816,1817,681],{},"Heartbeat (default every 15s, configurable via ",[606,1818,1819],{},"heartbeatMs",[1071,1821,1822],{},[606,1823,1824],{},"{ ts: number }",[724,1826,1829],{"className":726,"code":1827,"filename":1828,"language":728,"meta":729,"style":729},"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",[606,1830,1831,1875,1893,1897,1920,1956,1987],{"__ignoreMap":729},[733,1832,1833,1835,1837,1839,1841,1843,1845,1847,1849,1851,1853,1855,1857,1859,1861,1863,1865,1867,1869,1871,1873],{"class":735,"line":736},[733,1834,777],{"class":776},[733,1836,744],{"class":743},[733,1838,1632],{"class":747},[733,1840,933],{"class":743},[733,1842,1419],{"class":743},[733,1844,1005],{"class":739},[733,1846,1693],{"class":786},[733,1848,789],{"class":747},[733,1850,835],{"class":743},[733,1852,1224],{"class":760},[733,1854,835],{"class":743},[733,1856,681],{"class":747},[733,1858,822],{"class":743},[733,1860,1708],{"class":786},[733,1862,789],{"class":747},[733,1864,1713],{"class":880},[733,1866,886],{"class":776},[733,1868,1718],{"class":747},[733,1870,822],{"class":743},[733,1872,1723],{"class":786},[733,1874,1726],{"class":747},[733,1876,1877,1879,1882,1884,1887,1890],{"class":735,"line":766},[733,1878,777],{"class":776},[733,1880,1881],{"class":747}," es ",[733,1883,783],{"class":743},[733,1885,1886],{"class":743}," new",[733,1888,1889],{"class":786}," EventSource",[733,1891,1892],{"class":747},"(url)\n",[733,1894,1895],{"class":735,"line":773},[733,1896,770],{"emptyLinePlaceholder":769},[733,1898,1899,1902,1904,1907,1909,1911,1914,1916,1918],{"class":735,"line":811},[733,1900,1901],{"class":747},"es",[733,1903,822],{"class":743},[733,1905,1906],{"class":786},"onmessage",[733,1908,1419],{"class":743},[733,1910,898],{"class":743},[733,1912,1913],{"class":880},"msg",[733,1915,681],{"class":743},[733,1917,886],{"class":776},[733,1919,889],{"class":743},[733,1921,1922,1924,1926,1929,1931,1934,1936,1938,1941,1943,1946,1948,1950,1952,1954],{"class":735,"line":816},[733,1923,1533],{"class":776},[733,1925,744],{"class":743},[733,1927,1928],{"class":747}," type",[733,1930,843],{"class":743},[733,1932,1933],{"class":747}," data",[733,1935,751],{"class":743},[733,1937,1419],{"class":743},[733,1939,1940],{"class":747}," JSON",[733,1942,822],{"class":743},[733,1944,1945],{"class":786},"parse",[733,1947,789],{"class":795},[733,1949,1913],{"class":747},[733,1951,822],{"class":743},[733,1953,1755],{"class":747},[733,1955,808],{"class":795},[733,1957,1958,1960,1962,1964,1966,1968,1970,1972,1974,1976,1978,1981,1983,1985],{"class":735,"line":854},[733,1959,895],{"class":739},[733,1961,898],{"class":795},[733,1963,1747],{"class":747},[733,1965,908],{"class":743},[733,1967,757],{"class":743},[733,1969,881],{"class":760},[733,1971,835],{"class":743},[733,1973,918],{"class":795},[733,1975,1021],{"class":747},[733,1977,822],{"class":743},[733,1979,1980],{"class":786},"push",[733,1982,789],{"class":795},[733,1984,1755],{"class":747},[733,1986,808],{"class":795},[733,1988,1989],{"class":735,"line":859},[733,1990,997],{"class":743},[1043,1992,1994],{"id":1993},"auth-cors","Auth + CORS",[1047,1996,1997,2006],{},[1050,1998,1999],{},[1053,2000,2001,2003],{},[1056,2002,1058],{},[1056,2004,2005],{},"Behavior",[1066,2007,2008,2021,2043,2060,2073],{},[1053,2009,2010,2015],{},[1071,2011,2012],{},[606,2013,2014],{},"token",[1071,2016,2017,2018,2020],{},"When set, the server requires ",[606,2019,1213],{}," on every request and 401s otherwise.",[1053,2022,2023,2026],{},[1071,2024,2025],{},"(no token)",[1071,2027,2028,2029,2032,2033,2035,2036,2035,2039,2042],{},"Connections are accepted only when there is no ",[606,2030,2031],{},"Origin"," header or the origin host is local (",[606,2034,1258],{}," \u002F ",[606,2037,2038],{},"localhost",[606,2040,2041],{},"[::1]","). Other origins receive 403.",[1053,2044,2045,2050],{},[1071,2046,2047],{},[606,2048,2049],{},"host",[1071,2051,2052,2053,2055,2056,2059],{},"Default ",[606,2054,1258],{}," — never reachable from the LAN. Override to ",[606,2057,2058],{},"0.0.0.0"," only with a token set.",[1053,2061,2062,2066],{},[1071,2063,2064],{},[606,2065,1819],{},[1071,2067,2068,2069,2072],{},"Heartbeat interval (default ",[606,2070,2071],{},"15000",").",[1053,2074,2075,2079],{},[1071,2076,2077],{},[606,2078,705],{},[1071,2080,2081,2082,2084,2085,822],{},"Ring buffer kept on the underlying default stream — replayed for late-joining clients via ",[606,2083,1788],{},". Default ",[606,2086,1093],{},[635,2088,2090],{"id":2089},"going-further","Going further",[596,2092,2093,2098],{},[599,2094,2095,2097],{},[718,2096,482],{"href":483},": replay or tail historic NDJSON files (cross-process, survives restarts)",[599,2099,2100,2103],{},[718,2101,2102],{"href":487},"Consumer recipes",": build a minimal devtool, pipe to curl + jq, replay history then go live",[2105,2106,2107],"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":729,"searchDepth":766,"depth":766,"links":2109},[2110,2113,2120],{"id":637,"depth":766,"text":603,"children":2111},[2112],{"id":1045,"depth":773,"text":346},{"id":1144,"depth":766,"text":1145,"children":2114},[2115,2116,2117,2118,2119],{"id":1236,"depth":773,"text":1237},{"id":1287,"depth":773,"text":1288},{"id":1573,"depth":773,"text":1574},{"id":1729,"depth":773,"text":1730},{"id":1993,"depth":773,"text":1994},{"id":2089,"depth":766,"text":2090},"Subscribe to wide events flowing through evlog — in-process with createStreamDrain, or over the network with the local SSE stream server.","md",null,{},{"title":468,"icon":471},{"title":468,"description":2121},"awgcJwxj8IvIwn0X-16ptW8hwlFTuLdsNWk3RbpW2wU",[2129,2131],{"title":41,"path":464,"stem":465,"description":2130,"icon":466,"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":473,"path":474,"stem":475,"description":2132,"icon":476,"children":-1},"Build evlog support for a framework or runtime that has no integration, with defineFrameworkIntegration or the lower-level helpers.",1789074383337]