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