[{"data":1,"prerenderedAt":3293},["ShallowReactive",2],{"navigation_docs":3,"-integrate-frameworks-orpc":443,"-integrate-frameworks-orpc-surround":3288},[4,30,80,249,357,412],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Start","\u002Fstart","1.start",[9,14,19,24],{"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",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Learn","\u002Flearn","2.learn",[35,40,45,50,55,60,65,70,75],{"title":36,"path":37,"stem":38,"icon":39},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":41,"path":42,"stem":43,"icon":44},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":46,"path":47,"stem":48,"icon":49},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":51,"path":52,"stem":53,"icon":54},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":56,"path":57,"stem":58,"icon":59},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":61,"path":62,"stem":63,"icon":64},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":66,"path":67,"stem":68,"icon":69},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":71,"path":72,"stem":73,"icon":74},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":76,"path":77,"stem":78,"icon":79},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":81,"path":82,"stem":83,"children":84,"page":29},"Integrate","\u002Fintegrate","3.integrate",[85,89,157],{"title":36,"path":86,"stem":87,"icon":88},"\u002Fintegrate\u002Foverview","3.integrate\u002F0.overview","i-lucide-plug",{"title":90,"path":91,"stem":92,"children":93,"page":29},"Adapters","\u002Fintegrate\u002Fadapters","3.integrate\u002Fadapters",[94,97,137],{"title":36,"path":95,"stem":96,"icon":39},"\u002Fintegrate\u002Fadapters\u002Foverview","3.integrate\u002Fadapters\u002F01.overview",{"title":98,"path":99,"stem":100,"children":101,"page":29},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","3.integrate\u002Fadapters\u002Fcloud",[102,107,112,117,122,127,132],{"title":103,"path":104,"stem":105,"icon":106},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","3.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":108,"path":109,"stem":110,"icon":111},"OTLP","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fotlp","3.integrate\u002Fadapters\u002Fcloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":113,"path":114,"stem":115,"icon":116},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","3.integrate\u002Fadapters\u002Fcloud\u002F03.posthog","i-simple-icons-posthog",{"title":118,"path":119,"stem":120,"icon":121},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","3.integrate\u002Fadapters\u002Fcloud\u002F04.sentry","i-simple-icons-sentry",{"title":123,"path":124,"stem":125,"icon":126},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","3.integrate\u002Fadapters\u002Fcloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":128,"path":129,"stem":130,"icon":131},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","3.integrate\u002Fadapters\u002Fcloud\u002F06.datadog","i-simple-icons-datadog",{"title":133,"path":134,"stem":135,"icon":136},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fhyperdx","3.integrate\u002Fadapters\u002Fcloud\u002F07.hyperdx","i-custom-hyperdx",{"title":138,"path":139,"stem":140,"children":141,"page":29},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","3.integrate\u002Fadapters\u002Fself-hosted",[142,147,152],{"title":143,"path":144,"stem":145,"icon":146},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","3.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":148,"path":149,"stem":150,"icon":151},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","3.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":153,"path":154,"stem":155,"icon":156},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","3.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":158,"path":159,"stem":160,"children":161,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","3.integrate\u002Fframeworks",[162,166,171,176,181,186,191,196,201,206,211,216,221,226,230,235,240,245],{"title":36,"path":163,"stem":164,"icon":165},"\u002Fintegrate\u002Fframeworks\u002Foverview","3.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":167,"path":168,"stem":169,"icon":170},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","3.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":172,"path":173,"stem":174,"icon":175},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","3.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":177,"path":178,"stem":179,"icon":180},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","3.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":182,"path":183,"stem":184,"icon":185},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","3.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":187,"path":188,"stem":189,"icon":190},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","3.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":192,"path":193,"stem":194,"icon":195},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","3.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":197,"path":198,"stem":199,"icon":200},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","3.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":202,"path":203,"stem":204,"icon":205},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","3.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":207,"path":208,"stem":209,"icon":210},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","3.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":212,"path":213,"stem":214,"icon":215},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","3.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":217,"path":218,"stem":219,"icon":220},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","3.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":222,"path":223,"stem":224,"icon":225},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","3.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":227,"path":228,"stem":229,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","3.integrate\u002Fframeworks\u002F13.standalone",{"title":231,"path":232,"stem":233,"icon":234},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","3.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":236,"path":237,"stem":238,"icon":239},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","3.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":241,"path":242,"stem":243,"icon":244},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","3.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":246,"path":247,"stem":248,"icon":44},"CLI","\u002Fintegrate\u002Fframeworks\u002Fcli","3.integrate\u002Fframeworks\u002F17.cli",{"title":250,"path":251,"stem":252,"children":253,"page":29},"Use Cases","\u002Fuse-cases","4.use-cases",[254,258,263,292,320,352],{"title":36,"path":255,"stem":256,"icon":257},"\u002Fuse-cases\u002Foverview","4.use-cases\u002F0.overview","i-lucide-list-checks",{"title":259,"path":260,"stem":261,"icon":262},"Client Logging","\u002Fuse-cases\u002Fclient-logging","4.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":264,"icon":265,"path":266,"stem":267,"children":268,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","4.use-cases\u002F2.ai-sdk",[269,272,277,282,287],{"title":36,"path":270,"stem":271,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","4.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":273,"path":274,"stem":275,"icon":276},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","4.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":278,"path":279,"stem":280,"icon":281},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","4.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":283,"path":284,"stem":285,"icon":286},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","4.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":288,"path":289,"stem":290,"icon":291},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","4.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":293,"icon":294,"path":295,"stem":296,"children":297,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","4.use-cases\u002F3.better-auth",[298,301,306,311,315],{"title":36,"path":299,"stem":300,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","4.use-cases\u002F3.better-auth\u002F01.overview",{"title":302,"path":303,"stem":304,"icon":305},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","4.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":307,"path":308,"stem":309,"icon":310},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","4.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":312,"path":313,"stem":314,"icon":262},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","4.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":316,"path":317,"stem":318,"icon":319},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","4.use-cases\u002F3.better-auth\u002F05.performance","i-lucide-gauge",{"title":321,"icon":322,"path":323,"stem":324,"children":325,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","4.use-cases\u002F4.audit",[326,329,334,339,344,348],{"title":36,"path":327,"stem":328,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","4.use-cases\u002F4.audit\u002F01.overview",{"title":330,"path":331,"stem":332,"icon":333},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","4.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":335,"path":336,"stem":337,"icon":338},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","4.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":340,"path":341,"stem":342,"icon":343},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","4.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":345,"path":346,"stem":347,"icon":322},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","4.use-cases\u002F4.audit\u002F05.compliance",{"title":349,"path":350,"stem":351,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","4.use-cases\u002F4.audit\u002F06.recipes",{"title":353,"path":354,"stem":355,"icon":356},"Enrichers","\u002Fuse-cases\u002Fenrichers","4.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":358,"path":359,"stem":360,"children":361,"page":29},"Extend","\u002Fextend","5.extend",[362,366,371,376,381,385,389,393,397,402,407],{"title":36,"path":363,"stem":364,"icon":365},"\u002Fextend\u002Foverview","5.extend\u002F0.overview","i-lucide-blocks",{"title":367,"path":368,"stem":369,"icon":370},"Stream","\u002Fextend\u002Fstream","5.extend\u002F1.stream","i-lucide-radio-tower",{"title":372,"path":373,"stem":374,"icon":375},"Custom framework","\u002Fextend\u002Fcustom-framework","5.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":377,"path":378,"stem":379,"icon":380},"FS reader","\u002Fextend\u002Ffs-reader","5.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":349,"path":382,"stem":383,"icon":384},"\u002Fextend\u002Fconsumer-recipes","5.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":386,"path":387,"stem":388,"icon":365},"Plugins","\u002Fextend\u002Fplugins","5.extend\u002F4.plugins",{"title":390,"path":391,"stem":392,"icon":356},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","5.extend\u002F5.custom-enrichers",{"title":394,"path":395,"stem":396,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","5.extend\u002F6.tail-sampling",{"title":398,"path":399,"stem":400,"icon":401},"Identity headers","\u002Fextend\u002Fidentity-headers","5.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":403,"path":404,"stem":405,"icon":406},"Custom drains","\u002Fextend\u002Fcustom-drains","5.extend\u002F8.custom-drains","i-lucide-share-2",{"title":408,"path":409,"stem":410,"icon":411},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","5.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":413,"path":414,"stem":415,"children":416,"page":29},"Reference","\u002Freference","6.reference",[417,422,425,430,434,439],{"title":418,"path":419,"stem":420,"icon":421},"Configuration","\u002Freference\u002Fconfiguration","6.reference\u002F1.configuration","i-lucide-settings",{"title":316,"path":423,"stem":424,"icon":319},"\u002Freference\u002Fperformance","6.reference\u002F2.performance",{"title":426,"path":427,"stem":428,"icon":429},"Vite Plugin","\u002Freference\u002Fvite-plugin","6.reference\u002F3.vite-plugin","i-custom-vite",{"title":431,"path":432,"stem":433,"icon":322},"Best Practices","\u002Freference\u002Fbest-practices","6.reference\u002F4.best-practices",{"title":435,"path":436,"stem":437,"icon":438},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","6.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":440,"path":441,"stem":442,"icon":356},"Agent Skills","\u002Freference\u002Fagent-skills","6.reference\u002F6.agent-skills",{"id":444,"title":236,"body":445,"description":3278,"extension":3279,"links":3280,"meta":3284,"navigation":3285,"path":237,"seo":3286,"stem":238,"__hash__":3287},"docs\u002F3.integrate\u002Fframeworks\u002F15.orpc.md",{"type":446,"value":447,"toc":3261},"minimark",[448,480,500,545,549,554,634,638,1155,1176,1191,1194,1197,1523,1537,1611,1615,1621,1802,1900,1916,1920,1953,2177,2180,2258,2261,2416,2452,2455,2465,2469,2476,2649,2653,2660,2854,2865,2869,2875,2985,2989,2998,3148,3154,3158,3200,3208,3218,3222,3228,3257],[449,450,451,455,456,459,460,463,464,467,468,471,472,475,476,479],"p",{},[452,453,454],"code",{},"evlog\u002Forpc"," ships two primitives: ",[452,457,458],{},"withEvlog(handler)"," wraps any oRPC handler (",[452,461,462],{},"RPCHandler",", ",[452,465,466],{},"OpenAPIHandler",") so each request becomes one wide event, and ",[452,469,470],{},"evlog()"," is a procedure middleware that exposes ",[452,473,474],{},"context.log"," and tags the wide event with the procedure path as ",[452,477,478],{},"operation",".",[481,482,484,488,489,496,497,499],"callout",{"color":483,"icon":13},"info",[485,486,487],"strong",{},"oRPC v2:"," The oRPC maintainers have ",[490,491,495],"a",{"href":492,"rel":493},"https:\u002F\u002Fgithub.com\u002Fmiddleapi\u002Forpc\u002Fdiscussions\u002F1293#discussioncomment-17032656",[494],"nofollow","announced first-party evlog support in v2"," (edge-ready). Until v2 ships, ",[452,498,454],{}," is the integration path for oRPC v1 — and it remains the entrypoint for evlog's full pipeline (drains, enrichers, tail sampling, structured errors) regardless of how oRPC wires it in later.",[501,502,505,508,533],"prompt",{":actions":503,"description":504,"icon":239},"[\"copy\",\"cursor\",\"windsurf\"]","Set up evlog in my oRPC app",[449,506,507],{},"Set up evlog in my oRPC app.",[509,510,511,515,518,521,524,527,530],"ul",{},[512,513,514],"li",{},"Install evlog: pnpm add evlog",[512,516,517],{},"Call initLogger({ env: { service: 'my-rpc' } }) at startup",[512,519,520],{},"Wrap your RPCHandler \u002F OpenAPIHandler with withEvlog() from 'evlog\u002Forpc'",[512,522,523],{},"Add os.use(evlog()) on your base procedure for typed context.log + per-procedure operation",[512,525,526],{},"Declare EvlogOrpcContext on your base context to type context.log",[512,528,529],{},"Throw evlog errors (createError or defineErrorCatalog) directly from procedures — evlog\u002Forpc bridges them to ORPCError",[512,531,532],{},"Pass drain, enrich, include, and keep options to withEvlog()",[449,534,535,536,540,541],{},"Docs: ",[490,537,538],{"href":538,"rel":539},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fframeworks\u002Forpc",[494],"\nAdapters: ",[490,542,543],{"href":543,"rel":544},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fadapters\u002Foverview",[494],[546,547,25],"h2",{"id":548},"quick-start",[550,551,553],"h3",{"id":552},"_1-install","1. Install",[555,556,557,585,601,617],"code-group",{},[558,559,565],"pre",{"className":560,"code":561,"filename":562,"language":563,"meta":564,"style":564},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add evlog @orpc\u002Fserver\n","pnpm","bash","",[452,566,567],{"__ignoreMap":564},[568,569,572,575,579,582],"span",{"class":570,"line":571},"line",1,[568,573,562],{"class":574},"sBMFI",[568,576,578],{"class":577},"sfazB"," add",[568,580,581],{"class":577}," evlog",[568,583,584],{"class":577}," @orpc\u002Fserver\n",[558,586,589],{"className":560,"code":587,"filename":588,"language":563,"meta":564,"style":564},"bun add evlog @orpc\u002Fserver\n","bun",[452,590,591],{"__ignoreMap":564},[568,592,593,595,597,599],{"class":570,"line":571},[568,594,588],{"class":574},[568,596,578],{"class":577},[568,598,581],{"class":577},[568,600,584],{"class":577},[558,602,605],{"className":560,"code":603,"filename":604,"language":563,"meta":564,"style":564},"yarn add evlog @orpc\u002Fserver\n","yarn",[452,606,607],{"__ignoreMap":564},[568,608,609,611,613,615],{"class":570,"line":571},[568,610,604],{"class":574},[568,612,578],{"class":577},[568,614,581],{"class":577},[568,616,584],{"class":577},[558,618,621],{"className":560,"code":619,"filename":620,"language":563,"meta":564,"style":564},"npm install evlog @orpc\u002Fserver\n","npm",[452,622,623],{"__ignoreMap":564},[568,624,625,627,630,632],{"class":570,"line":571},[568,626,620],{"class":574},[568,628,629],{"class":577}," install",[568,631,581],{"class":577},[568,633,584],{"class":577},[550,635,637],{"id":636},"_2-initialize-and-wire-the-wrappers","2. Initialize and wire the wrappers",[558,639,644],{"className":640,"code":641,"filename":642,"language":643,"meta":564,"style":564},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { os } from '@orpc\u002Fserver'\nimport { RPCHandler } from '@orpc\u002Fserver\u002Ffetch'\nimport { initLogger } from 'evlog'\nimport { evlog, withEvlog, type EvlogOrpcContext } from 'evlog\u002Forpc'\n\ninitLogger({\n  env: { service: 'my-rpc' },\n})\n\nconst base = os.$context\u003CEvlogOrpcContext>().use(evlog())\n\nconst router = {\n  health: base.handler(({ context }) => {\n    context.log.set({ route: 'health' })\n    return { ok: true }\n  }),\n}\n\nconst handler = withEvlog(new RPCHandler(router))\n\nexport default async function fetch(request: Request) {\n  const { matched, response } = await handler.handle(request, { prefix: '\u002Frpc' })\n  return matched ? response : new Response('Not Found', { status: 404 })\n}\n","server\u002Forpc.ts","typescript",[452,645,646,675,696,717,750,757,770,798,807,812,856,861,874,907,944,964,976,982,987,1009,1014,1046,1102,1150],{"__ignoreMap":564},[568,647,648,652,656,660,663,666,669,672],{"class":570,"line":571},[568,649,651],{"class":650},"s7zQu","import",[568,653,655],{"class":654},"sMK4o"," {",[568,657,659],{"class":658},"sTEyZ"," os",[568,661,662],{"class":654}," }",[568,664,665],{"class":650}," from",[568,667,668],{"class":654}," '",[568,670,671],{"class":577},"@orpc\u002Fserver",[568,673,674],{"class":654},"'\n",[568,676,678,680,682,685,687,689,691,694],{"class":570,"line":677},2,[568,679,651],{"class":650},[568,681,655],{"class":654},[568,683,684],{"class":658}," RPCHandler",[568,686,662],{"class":654},[568,688,665],{"class":650},[568,690,668],{"class":654},[568,692,693],{"class":577},"@orpc\u002Fserver\u002Ffetch",[568,695,674],{"class":654},[568,697,699,701,703,706,708,710,712,715],{"class":570,"line":698},3,[568,700,651],{"class":650},[568,702,655],{"class":654},[568,704,705],{"class":658}," initLogger",[568,707,662],{"class":654},[568,709,665],{"class":650},[568,711,668],{"class":654},[568,713,714],{"class":577},"evlog",[568,716,674],{"class":654},[568,718,720,722,724,726,729,732,734,737,740,742,744,746,748],{"class":570,"line":719},4,[568,721,651],{"class":650},[568,723,655],{"class":654},[568,725,581],{"class":658},[568,727,728],{"class":654},",",[568,730,731],{"class":658}," withEvlog",[568,733,728],{"class":654},[568,735,736],{"class":650}," type",[568,738,739],{"class":658}," EvlogOrpcContext",[568,741,662],{"class":654},[568,743,665],{"class":650},[568,745,668],{"class":654},[568,747,454],{"class":577},[568,749,674],{"class":654},[568,751,753],{"class":570,"line":752},5,[568,754,756],{"emptyLinePlaceholder":755},true,"\n",[568,758,760,764,767],{"class":570,"line":759},6,[568,761,763],{"class":762},"s2Zo4","initLogger",[568,765,766],{"class":658},"(",[568,768,769],{"class":654},"{\n",[568,771,773,777,780,782,785,787,789,792,795],{"class":570,"line":772},7,[568,774,776],{"class":775},"swJcz","  env",[568,778,779],{"class":654},":",[568,781,655],{"class":654},[568,783,784],{"class":775}," service",[568,786,779],{"class":654},[568,788,668],{"class":654},[568,790,791],{"class":577},"my-rpc",[568,793,794],{"class":654},"'",[568,796,797],{"class":654}," },\n",[568,799,801,804],{"class":570,"line":800},8,[568,802,803],{"class":654},"}",[568,805,806],{"class":658},")\n",[568,808,810],{"class":570,"line":809},9,[568,811,756],{"emptyLinePlaceholder":755},[568,813,815,819,822,825,827,829,832,835,838,841,844,846,849,851,853],{"class":570,"line":814},10,[568,816,818],{"class":817},"spNyl","const",[568,820,821],{"class":658}," base ",[568,823,824],{"class":654},"=",[568,826,659],{"class":658},[568,828,479],{"class":654},[568,830,831],{"class":762},"$context",[568,833,834],{"class":654},"\u003C",[568,836,837],{"class":574},"EvlogOrpcContext",[568,839,840],{"class":654},">",[568,842,843],{"class":658},"()",[568,845,479],{"class":654},[568,847,848],{"class":762},"use",[568,850,766],{"class":658},[568,852,714],{"class":762},[568,854,855],{"class":658},"())\n",[568,857,859],{"class":570,"line":858},11,[568,860,756],{"emptyLinePlaceholder":755},[568,862,864,866,869,871],{"class":570,"line":863},12,[568,865,818],{"class":817},[568,867,868],{"class":658}," router ",[568,870,824],{"class":654},[568,872,873],{"class":654}," {\n",[568,875,877,880,882,885,887,890,892,895,899,902,905],{"class":570,"line":876},13,[568,878,879],{"class":775},"  health",[568,881,779],{"class":654},[568,883,884],{"class":658}," base",[568,886,479],{"class":654},[568,888,889],{"class":762},"handler",[568,891,766],{"class":658},[568,893,894],{"class":654},"({",[568,896,898],{"class":897},"sHdIc"," context",[568,900,901],{"class":654}," })",[568,903,904],{"class":817}," =>",[568,906,873],{"class":654},[568,908,910,913,915,918,920,923,925,928,931,933,935,938,940,942],{"class":570,"line":909},14,[568,911,912],{"class":658},"    context",[568,914,479],{"class":654},[568,916,917],{"class":658},"log",[568,919,479],{"class":654},[568,921,922],{"class":762},"set",[568,924,766],{"class":775},[568,926,927],{"class":654},"{",[568,929,930],{"class":775}," route",[568,932,779],{"class":654},[568,934,668],{"class":654},[568,936,937],{"class":577},"health",[568,939,794],{"class":654},[568,941,662],{"class":654},[568,943,806],{"class":775},[568,945,947,950,952,955,957,961],{"class":570,"line":946},15,[568,948,949],{"class":650},"    return",[568,951,655],{"class":654},[568,953,954],{"class":775}," ok",[568,956,779],{"class":654},[568,958,960],{"class":959},"sfNiH"," true",[568,962,963],{"class":654}," }\n",[568,965,967,970,973],{"class":570,"line":966},16,[568,968,969],{"class":654},"  }",[568,971,972],{"class":658},")",[568,974,975],{"class":654},",\n",[568,977,979],{"class":570,"line":978},17,[568,980,981],{"class":654},"}\n",[568,983,985],{"class":570,"line":984},18,[568,986,756],{"emptyLinePlaceholder":755},[568,988,990,992,995,997,999,1001,1004,1006],{"class":570,"line":989},19,[568,991,818],{"class":817},[568,993,994],{"class":658}," handler ",[568,996,824],{"class":654},[568,998,731],{"class":762},[568,1000,766],{"class":658},[568,1002,1003],{"class":654},"new",[568,1005,684],{"class":762},[568,1007,1008],{"class":658},"(router))\n",[568,1010,1012],{"class":570,"line":1011},20,[568,1013,756],{"emptyLinePlaceholder":755},[568,1015,1017,1020,1023,1026,1029,1032,1034,1037,1039,1042,1044],{"class":570,"line":1016},21,[568,1018,1019],{"class":650},"export",[568,1021,1022],{"class":650}," default",[568,1024,1025],{"class":817}," async",[568,1027,1028],{"class":817}," function",[568,1030,1031],{"class":762}," fetch",[568,1033,766],{"class":654},[568,1035,1036],{"class":897},"request",[568,1038,779],{"class":654},[568,1040,1041],{"class":574}," Request",[568,1043,972],{"class":654},[568,1045,873],{"class":654},[568,1047,1049,1052,1054,1057,1059,1062,1064,1067,1070,1073,1075,1078,1080,1082,1084,1086,1089,1091,1093,1096,1098,1100],{"class":570,"line":1048},22,[568,1050,1051],{"class":817},"  const",[568,1053,655],{"class":654},[568,1055,1056],{"class":658}," matched",[568,1058,728],{"class":654},[568,1060,1061],{"class":658}," response",[568,1063,662],{"class":654},[568,1065,1066],{"class":654}," =",[568,1068,1069],{"class":650}," await",[568,1071,1072],{"class":658}," handler",[568,1074,479],{"class":654},[568,1076,1077],{"class":762},"handle",[568,1079,766],{"class":775},[568,1081,1036],{"class":658},[568,1083,728],{"class":654},[568,1085,655],{"class":654},[568,1087,1088],{"class":775}," prefix",[568,1090,779],{"class":654},[568,1092,668],{"class":654},[568,1094,1095],{"class":577},"\u002Frpc",[568,1097,794],{"class":654},[568,1099,662],{"class":654},[568,1101,806],{"class":775},[568,1103,1105,1108,1110,1113,1115,1118,1121,1124,1126,1128,1131,1133,1135,1137,1140,1142,1146,1148],{"class":570,"line":1104},23,[568,1106,1107],{"class":650},"  return",[568,1109,1056],{"class":658},[568,1111,1112],{"class":654}," ?",[568,1114,1061],{"class":658},[568,1116,1117],{"class":654}," :",[568,1119,1120],{"class":654}," new",[568,1122,1123],{"class":762}," Response",[568,1125,766],{"class":775},[568,1127,794],{"class":654},[568,1129,1130],{"class":577},"Not Found",[568,1132,794],{"class":654},[568,1134,728],{"class":654},[568,1136,655],{"class":654},[568,1138,1139],{"class":775}," status",[568,1141,779],{"class":654},[568,1143,1145],{"class":1144},"sbssI"," 404",[568,1147,662],{"class":654},[568,1149,806],{"class":775},[568,1151,1153],{"class":570,"line":1152},24,[568,1154,981],{"class":654},[481,1156,1157,1160,1161,1167,1168,1171,1172,1175],{"color":483,"icon":429},[485,1158,1159],{},"Using Vite?"," The ",[490,1162,1163,1166],{"href":427},[452,1164,1165],{},"evlog\u002Fvite"," plugin"," replaces the ",[452,1169,1170],{},"initLogger()"," call with compile-time auto-initialization, strips ",[452,1173,1174],{},"log.debug()"," from production builds, and injects source locations.",[449,1177,1178,1180,1181,1184,1185,1187,1188,479],{},[452,1179,837],{}," declares ",[452,1182,1183],{},"log: RequestLogger"," on the procedure context so ",[452,1186,474],{}," is fully typed in every procedure that descends from ",[452,1189,1190],{},"base",[546,1192,46],{"id":1193},"wide-events",[449,1195,1196],{},"Build up context progressively through your handler. One request = one wide event:",[558,1198,1200],{"className":640,"code":1199,"filename":642,"language":643,"meta":564,"style":564},"const getUser = base\n  .input(z.object({ id: z.string() }))\n  .handler(async ({ input, context }) => {\n    context.log.set({ user: { id: input.id } })\n\n    const user = await db.findUser(input.id)\n    context.log.set({ user: { name: user.name, plan: user.plan } })\n\n    const orders = await db.findOrders(input.id)\n    context.log.set({ orders: { count: orders.length, totalRevenue: sum(orders) } })\n\n    return { user, orders }\n  })\n",[452,1201,1202,1214,1255,1282,1322,1326,1355,1409,1413,1441,1499,1503,1517],{"__ignoreMap":564},[568,1203,1204,1206,1209,1211],{"class":570,"line":571},[568,1205,818],{"class":817},[568,1207,1208],{"class":658}," getUser ",[568,1210,824],{"class":654},[568,1212,1213],{"class":658}," base\n",[568,1215,1216,1219,1222,1225,1227,1230,1232,1234,1237,1239,1242,1244,1247,1250,1252],{"class":570,"line":677},[568,1217,1218],{"class":654},"  .",[568,1220,1221],{"class":762},"input",[568,1223,1224],{"class":658},"(z",[568,1226,479],{"class":654},[568,1228,1229],{"class":762},"object",[568,1231,766],{"class":658},[568,1233,927],{"class":654},[568,1235,1236],{"class":775}," id",[568,1238,779],{"class":654},[568,1240,1241],{"class":658}," z",[568,1243,479],{"class":654},[568,1245,1246],{"class":762},"string",[568,1248,1249],{"class":658},"() ",[568,1251,803],{"class":654},[568,1253,1254],{"class":658},"))\n",[568,1256,1257,1259,1261,1263,1266,1269,1272,1274,1276,1278,1280],{"class":570,"line":698},[568,1258,1218],{"class":654},[568,1260,889],{"class":762},[568,1262,766],{"class":658},[568,1264,1265],{"class":817},"async",[568,1267,1268],{"class":654}," ({",[568,1270,1271],{"class":897}," input",[568,1273,728],{"class":654},[568,1275,898],{"class":897},[568,1277,901],{"class":654},[568,1279,904],{"class":817},[568,1281,873],{"class":654},[568,1283,1284,1286,1288,1290,1292,1294,1296,1298,1301,1303,1305,1307,1309,1311,1313,1316,1318,1320],{"class":570,"line":719},[568,1285,912],{"class":658},[568,1287,479],{"class":654},[568,1289,917],{"class":658},[568,1291,479],{"class":654},[568,1293,922],{"class":762},[568,1295,766],{"class":775},[568,1297,927],{"class":654},[568,1299,1300],{"class":775}," user",[568,1302,779],{"class":654},[568,1304,655],{"class":654},[568,1306,1236],{"class":775},[568,1308,779],{"class":654},[568,1310,1271],{"class":658},[568,1312,479],{"class":654},[568,1314,1315],{"class":658},"id",[568,1317,662],{"class":654},[568,1319,662],{"class":654},[568,1321,806],{"class":775},[568,1323,1324],{"class":570,"line":752},[568,1325,756],{"emptyLinePlaceholder":755},[568,1327,1328,1331,1333,1335,1337,1340,1342,1345,1347,1349,1351,1353],{"class":570,"line":759},[568,1329,1330],{"class":817},"    const",[568,1332,1300],{"class":658},[568,1334,1066],{"class":654},[568,1336,1069],{"class":650},[568,1338,1339],{"class":658}," db",[568,1341,479],{"class":654},[568,1343,1344],{"class":762},"findUser",[568,1346,766],{"class":775},[568,1348,1221],{"class":658},[568,1350,479],{"class":654},[568,1352,1315],{"class":658},[568,1354,806],{"class":775},[568,1356,1357,1359,1361,1363,1365,1367,1369,1371,1373,1375,1377,1380,1382,1384,1386,1389,1391,1394,1396,1398,1400,1403,1405,1407],{"class":570,"line":772},[568,1358,912],{"class":658},[568,1360,479],{"class":654},[568,1362,917],{"class":658},[568,1364,479],{"class":654},[568,1366,922],{"class":762},[568,1368,766],{"class":775},[568,1370,927],{"class":654},[568,1372,1300],{"class":775},[568,1374,779],{"class":654},[568,1376,655],{"class":654},[568,1378,1379],{"class":775}," name",[568,1381,779],{"class":654},[568,1383,1300],{"class":658},[568,1385,479],{"class":654},[568,1387,1388],{"class":658},"name",[568,1390,728],{"class":654},[568,1392,1393],{"class":775}," plan",[568,1395,779],{"class":654},[568,1397,1300],{"class":658},[568,1399,479],{"class":654},[568,1401,1402],{"class":658},"plan",[568,1404,662],{"class":654},[568,1406,662],{"class":654},[568,1408,806],{"class":775},[568,1410,1411],{"class":570,"line":800},[568,1412,756],{"emptyLinePlaceholder":755},[568,1414,1415,1417,1420,1422,1424,1426,1428,1431,1433,1435,1437,1439],{"class":570,"line":809},[568,1416,1330],{"class":817},[568,1418,1419],{"class":658}," orders",[568,1421,1066],{"class":654},[568,1423,1069],{"class":650},[568,1425,1339],{"class":658},[568,1427,479],{"class":654},[568,1429,1430],{"class":762},"findOrders",[568,1432,766],{"class":775},[568,1434,1221],{"class":658},[568,1436,479],{"class":654},[568,1438,1315],{"class":658},[568,1440,806],{"class":775},[568,1442,1443,1445,1447,1449,1451,1453,1455,1457,1459,1461,1463,1466,1468,1470,1472,1475,1477,1480,1482,1485,1487,1490,1493,1495,1497],{"class":570,"line":814},[568,1444,912],{"class":658},[568,1446,479],{"class":654},[568,1448,917],{"class":658},[568,1450,479],{"class":654},[568,1452,922],{"class":762},[568,1454,766],{"class":775},[568,1456,927],{"class":654},[568,1458,1419],{"class":775},[568,1460,779],{"class":654},[568,1462,655],{"class":654},[568,1464,1465],{"class":775}," count",[568,1467,779],{"class":654},[568,1469,1419],{"class":658},[568,1471,479],{"class":654},[568,1473,1474],{"class":658},"length",[568,1476,728],{"class":654},[568,1478,1479],{"class":775}," totalRevenue",[568,1481,779],{"class":654},[568,1483,1484],{"class":762}," sum",[568,1486,766],{"class":775},[568,1488,1489],{"class":658},"orders",[568,1491,1492],{"class":775},") ",[568,1494,803],{"class":654},[568,1496,662],{"class":654},[568,1498,806],{"class":775},[568,1500,1501],{"class":570,"line":858},[568,1502,756],{"emptyLinePlaceholder":755},[568,1504,1505,1507,1509,1511,1513,1515],{"class":570,"line":863},[568,1506,949],{"class":650},[568,1508,655],{"class":654},[568,1510,1300],{"class":658},[568,1512,728],{"class":654},[568,1514,1419],{"class":658},[568,1516,963],{"class":654},[568,1518,1519,1521],{"class":570,"line":876},[568,1520,969],{"class":654},[568,1522,806],{"class":658},[449,1524,1525,1526,1528,1529,1532,1533,1536],{},"All fields are merged into a single wide event emitted when the request completes. The ",[452,1527,478],{}," field is filled automatically from the procedure path (nested routers like ",[452,1530,1531],{},"users.profile.get"," surface as ",[452,1534,1535],{},"operation: 'users.profile.get'","):",[558,1538,1541],{"className":560,"code":1539,"filename":1540,"language":563,"meta":564,"style":564},"14:58:15 INFO [my-rpc] POST \u002Frpc\u002FgetUser 200 in 12ms\n  ├─ operation: getUser\n  ├─ orders: count=2 totalRevenue=6298\n  ├─ user: id=usr_123 name=Alice plan=pro\n  └─ requestId: 4a8ff3a8-...\n","Terminal output",[452,1542,1543,1554,1565,1584,1600],{"__ignoreMap":564},[568,1544,1545,1548,1551],{"class":570,"line":571},[568,1546,1547],{"class":574},"14:58:15",[568,1549,1550],{"class":577}," INFO",[568,1552,1553],{"class":658}," [my-rpc] POST \u002Frpc\u002FgetUser 200 in 12ms\n",[568,1555,1556,1559,1562],{"class":570,"line":677},[568,1557,1558],{"class":574},"  ├─",[568,1560,1561],{"class":577}," operation:",[568,1563,1564],{"class":577}," getUser\n",[568,1566,1567,1569,1572,1575,1578,1581],{"class":570,"line":698},[568,1568,1558],{"class":574},[568,1570,1571],{"class":577}," orders:",[568,1573,1574],{"class":577}," count=",[568,1576,1577],{"class":1144},"2",[568,1579,1580],{"class":577}," totalRevenue=",[568,1582,1583],{"class":1144},"6298\n",[568,1585,1586,1588,1591,1594,1597],{"class":570,"line":719},[568,1587,1558],{"class":574},[568,1589,1590],{"class":577}," user:",[568,1592,1593],{"class":577}," id=usr_123",[568,1595,1596],{"class":577}," name=Alice",[568,1598,1599],{"class":577}," plan=pro\n",[568,1601,1602,1605,1608],{"class":570,"line":752},[568,1603,1604],{"class":574},"  └─",[568,1606,1607],{"class":577}," requestId:",[568,1609,1610],{"class":577}," 4a8ff3a8-...\n",[546,1612,1614],{"id":1613},"uselogger","useLogger()",[449,1616,1617,1618,1620],{},"Use ",[452,1619,1614],{}," to access the request-scoped logger from anywhere in the call stack without passing the context through your service layer:",[558,1622,1625],{"className":640,"code":1623,"filename":1624,"language":643,"meta":564,"style":564},"import { useLogger } from 'evlog\u002Forpc'\n\nexport async function findUser(id: string) {\n  const log = useLogger()\n  log.set({ user: { id } })\n\n  const user = await db.findUser(id)\n  log.set({ user: { name: user.name, plan: user.plan } })\n\n  return user\n}\n","server\u002Fservices\u002Fuser.ts",[452,1626,1627,1646,1650,1674,1688,1715,1719,1741,1787,1791,1798],{"__ignoreMap":564},[568,1628,1629,1631,1633,1636,1638,1640,1642,1644],{"class":570,"line":571},[568,1630,651],{"class":650},[568,1632,655],{"class":654},[568,1634,1635],{"class":658}," useLogger",[568,1637,662],{"class":654},[568,1639,665],{"class":650},[568,1641,668],{"class":654},[568,1643,454],{"class":577},[568,1645,674],{"class":654},[568,1647,1648],{"class":570,"line":677},[568,1649,756],{"emptyLinePlaceholder":755},[568,1651,1652,1654,1656,1658,1661,1663,1665,1667,1670,1672],{"class":570,"line":698},[568,1653,1019],{"class":650},[568,1655,1025],{"class":817},[568,1657,1028],{"class":817},[568,1659,1660],{"class":762}," findUser",[568,1662,766],{"class":654},[568,1664,1315],{"class":897},[568,1666,779],{"class":654},[568,1668,1669],{"class":574}," string",[568,1671,972],{"class":654},[568,1673,873],{"class":654},[568,1675,1676,1678,1681,1683,1685],{"class":570,"line":719},[568,1677,1051],{"class":817},[568,1679,1680],{"class":658}," log",[568,1682,1066],{"class":654},[568,1684,1635],{"class":762},[568,1686,1687],{"class":775},"()\n",[568,1689,1690,1693,1695,1697,1699,1701,1703,1705,1707,1709,1711,1713],{"class":570,"line":752},[568,1691,1692],{"class":658},"  log",[568,1694,479],{"class":654},[568,1696,922],{"class":762},[568,1698,766],{"class":775},[568,1700,927],{"class":654},[568,1702,1300],{"class":775},[568,1704,779],{"class":654},[568,1706,655],{"class":654},[568,1708,1236],{"class":658},[568,1710,662],{"class":654},[568,1712,662],{"class":654},[568,1714,806],{"class":775},[568,1716,1717],{"class":570,"line":759},[568,1718,756],{"emptyLinePlaceholder":755},[568,1720,1721,1723,1725,1727,1729,1731,1733,1735,1737,1739],{"class":570,"line":772},[568,1722,1051],{"class":817},[568,1724,1300],{"class":658},[568,1726,1066],{"class":654},[568,1728,1069],{"class":650},[568,1730,1339],{"class":658},[568,1732,479],{"class":654},[568,1734,1344],{"class":762},[568,1736,766],{"class":775},[568,1738,1315],{"class":658},[568,1740,806],{"class":775},[568,1742,1743,1745,1747,1749,1751,1753,1755,1757,1759,1761,1763,1765,1767,1769,1771,1773,1775,1777,1779,1781,1783,1785],{"class":570,"line":800},[568,1744,1692],{"class":658},[568,1746,479],{"class":654},[568,1748,922],{"class":762},[568,1750,766],{"class":775},[568,1752,927],{"class":654},[568,1754,1300],{"class":775},[568,1756,779],{"class":654},[568,1758,655],{"class":654},[568,1760,1379],{"class":775},[568,1762,779],{"class":654},[568,1764,1300],{"class":658},[568,1766,479],{"class":654},[568,1768,1388],{"class":658},[568,1770,728],{"class":654},[568,1772,1393],{"class":775},[568,1774,779],{"class":654},[568,1776,1300],{"class":658},[568,1778,479],{"class":654},[568,1780,1402],{"class":658},[568,1782,662],{"class":654},[568,1784,662],{"class":654},[568,1786,806],{"class":775},[568,1788,1789],{"class":570,"line":809},[568,1790,756],{"emptyLinePlaceholder":755},[568,1792,1793,1795],{"class":570,"line":814},[568,1794,1107],{"class":650},[568,1796,1797],{"class":658}," user\n",[568,1799,1800],{"class":570,"line":858},[568,1801,981],{"class":654},[558,1803,1805],{"className":640,"code":1804,"filename":642,"language":643,"meta":564,"style":564},"import { findUser } from '.\u002Fservices\u002Fuser'\n\nconst getUser = base\n  .input(z.object({ id: z.string() }))\n  .handler(async ({ input }) => findUser(input.id))\n",[452,1806,1807,1826,1830,1840,1872],{"__ignoreMap":564},[568,1808,1809,1811,1813,1815,1817,1819,1821,1824],{"class":570,"line":571},[568,1810,651],{"class":650},[568,1812,655],{"class":654},[568,1814,1660],{"class":658},[568,1816,662],{"class":654},[568,1818,665],{"class":650},[568,1820,668],{"class":654},[568,1822,1823],{"class":577},".\u002Fservices\u002Fuser",[568,1825,674],{"class":654},[568,1827,1828],{"class":570,"line":677},[568,1829,756],{"emptyLinePlaceholder":755},[568,1831,1832,1834,1836,1838],{"class":570,"line":698},[568,1833,818],{"class":817},[568,1835,1208],{"class":658},[568,1837,824],{"class":654},[568,1839,1213],{"class":658},[568,1841,1842,1844,1846,1848,1850,1852,1854,1856,1858,1860,1862,1864,1866,1868,1870],{"class":570,"line":719},[568,1843,1218],{"class":654},[568,1845,1221],{"class":762},[568,1847,1224],{"class":658},[568,1849,479],{"class":654},[568,1851,1229],{"class":762},[568,1853,766],{"class":658},[568,1855,927],{"class":654},[568,1857,1236],{"class":775},[568,1859,779],{"class":654},[568,1861,1241],{"class":658},[568,1863,479],{"class":654},[568,1865,1246],{"class":762},[568,1867,1249],{"class":658},[568,1869,803],{"class":654},[568,1871,1254],{"class":658},[568,1873,1874,1876,1878,1880,1882,1884,1886,1888,1890,1892,1895,1897],{"class":570,"line":752},[568,1875,1218],{"class":654},[568,1877,889],{"class":762},[568,1879,766],{"class":658},[568,1881,1265],{"class":817},[568,1883,1268],{"class":654},[568,1885,1271],{"class":897},[568,1887,901],{"class":654},[568,1889,904],{"class":817},[568,1891,1660],{"class":762},[568,1893,1894],{"class":658},"(input",[568,1896,479],{"class":654},[568,1898,1899],{"class":658},"id))\n",[449,1901,1902,1903,1905,1906,1908,1909,1911,1912,1915],{},"Both ",[452,1904,474],{}," and ",[452,1907,1614],{}," return the same logger instance. ",[452,1910,1614],{}," uses ",[452,1913,1914],{},"AsyncLocalStorage"," to propagate the logger across async boundaries.",[546,1917,1919],{"id":1918},"error-handling","Error Handling",[449,1921,1617,1922,1925,1926,463,1929,1932,1933,1936,1937,1939,1940,1943,1944,463,1946,463,1949,1952],{},[452,1923,1924],{},"createError"," for structured errors with ",[452,1927,1928],{},"why",[452,1930,1931],{},"fix",", and ",[452,1934,1935],{},"link"," fields. The ",[452,1938,470],{}," middleware catches the throw, records it on the wide event, and bridges it to an ",[452,1941,1942],{},"ORPCError"," so the wire response carries your ",[452,1945,452],{},[452,1947,1948],{},"status",[452,1950,1951],{},"message",", and the human-guidance fields:",[558,1954,1956],{"className":640,"code":1955,"filename":642,"language":643,"meta":564,"style":564},"import { createError } from 'evlog'\n\nconst checkout = base\n  .handler(({ context }) => {\n    context.log.set({ cart: { items: 3, total: 9999 } })\n\n    throw createError({\n      message: 'Payment failed',\n      code: 'PAYMENT_DECLINED',\n      status: 402,\n      why: 'Card declined by issuer',\n      fix: 'Try a different payment method',\n      link: 'https:\u002F\u002Fdocs.example.com\u002Fpayments\u002Fdeclined',\n    })\n  })\n",[452,1957,1958,1977,1981,1992,2010,2057,2061,2072,2088,2104,2116,2132,2148,2164,2171],{"__ignoreMap":564},[568,1959,1960,1962,1964,1967,1969,1971,1973,1975],{"class":570,"line":571},[568,1961,651],{"class":650},[568,1963,655],{"class":654},[568,1965,1966],{"class":658}," createError",[568,1968,662],{"class":654},[568,1970,665],{"class":650},[568,1972,668],{"class":654},[568,1974,714],{"class":577},[568,1976,674],{"class":654},[568,1978,1979],{"class":570,"line":677},[568,1980,756],{"emptyLinePlaceholder":755},[568,1982,1983,1985,1988,1990],{"class":570,"line":698},[568,1984,818],{"class":817},[568,1986,1987],{"class":658}," checkout ",[568,1989,824],{"class":654},[568,1991,1213],{"class":658},[568,1993,1994,1996,1998,2000,2002,2004,2006,2008],{"class":570,"line":719},[568,1995,1218],{"class":654},[568,1997,889],{"class":762},[568,1999,766],{"class":658},[568,2001,894],{"class":654},[568,2003,898],{"class":897},[568,2005,901],{"class":654},[568,2007,904],{"class":817},[568,2009,873],{"class":654},[568,2011,2012,2014,2016,2018,2020,2022,2024,2026,2029,2031,2033,2036,2038,2041,2043,2046,2048,2051,2053,2055],{"class":570,"line":752},[568,2013,912],{"class":658},[568,2015,479],{"class":654},[568,2017,917],{"class":658},[568,2019,479],{"class":654},[568,2021,922],{"class":762},[568,2023,766],{"class":775},[568,2025,927],{"class":654},[568,2027,2028],{"class":775}," cart",[568,2030,779],{"class":654},[568,2032,655],{"class":654},[568,2034,2035],{"class":775}," items",[568,2037,779],{"class":654},[568,2039,2040],{"class":1144}," 3",[568,2042,728],{"class":654},[568,2044,2045],{"class":775}," total",[568,2047,779],{"class":654},[568,2049,2050],{"class":1144}," 9999",[568,2052,662],{"class":654},[568,2054,662],{"class":654},[568,2056,806],{"class":775},[568,2058,2059],{"class":570,"line":759},[568,2060,756],{"emptyLinePlaceholder":755},[568,2062,2063,2066,2068,2070],{"class":570,"line":772},[568,2064,2065],{"class":650},"    throw",[568,2067,1966],{"class":762},[568,2069,766],{"class":775},[568,2071,769],{"class":654},[568,2073,2074,2077,2079,2081,2084,2086],{"class":570,"line":800},[568,2075,2076],{"class":775},"      message",[568,2078,779],{"class":654},[568,2080,668],{"class":654},[568,2082,2083],{"class":577},"Payment failed",[568,2085,794],{"class":654},[568,2087,975],{"class":654},[568,2089,2090,2093,2095,2097,2100,2102],{"class":570,"line":809},[568,2091,2092],{"class":775},"      code",[568,2094,779],{"class":654},[568,2096,668],{"class":654},[568,2098,2099],{"class":577},"PAYMENT_DECLINED",[568,2101,794],{"class":654},[568,2103,975],{"class":654},[568,2105,2106,2109,2111,2114],{"class":570,"line":814},[568,2107,2108],{"class":775},"      status",[568,2110,779],{"class":654},[568,2112,2113],{"class":1144}," 402",[568,2115,975],{"class":654},[568,2117,2118,2121,2123,2125,2128,2130],{"class":570,"line":858},[568,2119,2120],{"class":775},"      why",[568,2122,779],{"class":654},[568,2124,668],{"class":654},[568,2126,2127],{"class":577},"Card declined by issuer",[568,2129,794],{"class":654},[568,2131,975],{"class":654},[568,2133,2134,2137,2139,2141,2144,2146],{"class":570,"line":863},[568,2135,2136],{"class":775},"      fix",[568,2138,779],{"class":654},[568,2140,668],{"class":654},[568,2142,2143],{"class":577},"Try a different payment method",[568,2145,794],{"class":654},[568,2147,975],{"class":654},[568,2149,2150,2153,2155,2157,2160,2162],{"class":570,"line":876},[568,2151,2152],{"class":775},"      link",[568,2154,779],{"class":654},[568,2156,668],{"class":654},[568,2158,2159],{"class":577},"https:\u002F\u002Fdocs.example.com\u002Fpayments\u002Fdeclined",[568,2161,794],{"class":654},[568,2163,975],{"class":654},[568,2165,2166,2169],{"class":570,"line":909},[568,2167,2168],{"class":654},"    }",[568,2170,806],{"class":775},[568,2172,2173,2175],{"class":570,"line":946},[568,2174,969],{"class":654},[568,2176,806],{"class":658},[449,2178,2179],{},"The error is captured and logged with both the custom context and structured error fields:",[558,2181,2183],{"className":560,"code":2182,"filename":1540,"language":563,"meta":564,"style":564},"14:58:20 ERROR [my-rpc] POST \u002Frpc\u002Fcheckout 402 in 3ms\n  ├─ operation: checkout\n  ├─ error: name=EvlogError code=PAYMENT_DECLINED status=402 message=Payment failed\n  ├─ cart: items=3 total=9999\n  └─ requestId: 880a50ac-...\n",[452,2184,2185,2196,2205,2230,2249],{"__ignoreMap":564},[568,2186,2187,2190,2193],{"class":570,"line":571},[568,2188,2189],{"class":574},"14:58:20",[568,2191,2192],{"class":577}," ERROR",[568,2194,2195],{"class":658}," [my-rpc] POST \u002Frpc\u002Fcheckout 402 in 3ms\n",[568,2197,2198,2200,2202],{"class":570,"line":677},[568,2199,1558],{"class":574},[568,2201,1561],{"class":577},[568,2203,2204],{"class":577}," checkout\n",[568,2206,2207,2209,2212,2215,2218,2221,2224,2227],{"class":570,"line":698},[568,2208,1558],{"class":574},[568,2210,2211],{"class":577}," error:",[568,2213,2214],{"class":577}," name=EvlogError",[568,2216,2217],{"class":577}," code=PAYMENT_DECLINED",[568,2219,2220],{"class":577}," status=",[568,2222,2223],{"class":1144},"402",[568,2225,2226],{"class":577}," message=Payment",[568,2228,2229],{"class":577}," failed\n",[568,2231,2232,2234,2237,2240,2243,2246],{"class":570,"line":719},[568,2233,1558],{"class":574},[568,2235,2236],{"class":577}," cart:",[568,2238,2239],{"class":577}," items=",[568,2241,2242],{"class":1144},"3",[568,2244,2245],{"class":577}," total=",[568,2247,2248],{"class":1144},"9999\n",[568,2250,2251,2253,2255],{"class":570,"line":752},[568,2252,1604],{"class":574},[568,2254,1607],{"class":577},[568,2256,2257],{"class":577}," 880a50ac-...\n",[449,2259,2260],{},"Wire response returned to the client:",[558,2262,2267],{"className":2263,"code":2264,"filename":2265,"language":2266,"meta":564,"style":564},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"defined\": false,\n  \"code\": \"PAYMENT_DECLINED\",\n  \"status\": 402,\n  \"message\": \"Payment failed\",\n  \"data\": {\n    \"why\": \"Card declined by issuer\",\n    \"fix\": \"Try a different payment method\",\n    \"link\": \"https:\u002F\u002Fdocs.example.com\u002Fpayments\u002Fdeclined\"\n  }\n}\n","HTTP 402","json",[452,2268,2269,2273,2289,2308,2322,2340,2353,2372,2390,2407,2412],{"__ignoreMap":564},[568,2270,2271],{"class":570,"line":571},[568,2272,769],{"class":654},[568,2274,2275,2278,2281,2284,2286],{"class":570,"line":677},[568,2276,2277],{"class":654},"  \"",[568,2279,2280],{"class":817},"defined",[568,2282,2283],{"class":654},"\"",[568,2285,779],{"class":654},[568,2287,2288],{"class":654}," false,\n",[568,2290,2291,2293,2295,2297,2299,2302,2304,2306],{"class":570,"line":698},[568,2292,2277],{"class":654},[568,2294,452],{"class":817},[568,2296,2283],{"class":654},[568,2298,779],{"class":654},[568,2300,2301],{"class":654}," \"",[568,2303,2099],{"class":577},[568,2305,2283],{"class":654},[568,2307,975],{"class":654},[568,2309,2310,2312,2314,2316,2318,2320],{"class":570,"line":719},[568,2311,2277],{"class":654},[568,2313,1948],{"class":817},[568,2315,2283],{"class":654},[568,2317,779],{"class":654},[568,2319,2113],{"class":1144},[568,2321,975],{"class":654},[568,2323,2324,2326,2328,2330,2332,2334,2336,2338],{"class":570,"line":752},[568,2325,2277],{"class":654},[568,2327,1951],{"class":817},[568,2329,2283],{"class":654},[568,2331,779],{"class":654},[568,2333,2301],{"class":654},[568,2335,2083],{"class":577},[568,2337,2283],{"class":654},[568,2339,975],{"class":654},[568,2341,2342,2344,2347,2349,2351],{"class":570,"line":759},[568,2343,2277],{"class":654},[568,2345,2346],{"class":817},"data",[568,2348,2283],{"class":654},[568,2350,779],{"class":654},[568,2352,873],{"class":654},[568,2354,2355,2358,2360,2362,2364,2366,2368,2370],{"class":570,"line":772},[568,2356,2357],{"class":654},"    \"",[568,2359,1928],{"class":574},[568,2361,2283],{"class":654},[568,2363,779],{"class":654},[568,2365,2301],{"class":654},[568,2367,2127],{"class":577},[568,2369,2283],{"class":654},[568,2371,975],{"class":654},[568,2373,2374,2376,2378,2380,2382,2384,2386,2388],{"class":570,"line":800},[568,2375,2357],{"class":654},[568,2377,1931],{"class":574},[568,2379,2283],{"class":654},[568,2381,779],{"class":654},[568,2383,2301],{"class":654},[568,2385,2143],{"class":577},[568,2387,2283],{"class":654},[568,2389,975],{"class":654},[568,2391,2392,2394,2396,2398,2400,2402,2404],{"class":570,"line":809},[568,2393,2357],{"class":654},[568,2395,1935],{"class":574},[568,2397,2283],{"class":654},[568,2399,779],{"class":654},[568,2401,2301],{"class":654},[568,2403,2159],{"class":577},[568,2405,2406],{"class":654},"\"\n",[568,2408,2409],{"class":570,"line":814},[568,2410,2411],{"class":654},"  }\n",[568,2413,2414],{"class":570,"line":858},[568,2415,981],{"class":654},[481,2417,2418,2419,2422,2423,2426,2427,2430,2431,2433,2434,2433,2436,2438,2439,2441,2442,2444,2445,2451],{"color":483,"icon":13},"oRPC's error envelope is ",[452,2420,2421],{},"{ defined, code, status, message, data }"," — clients deserialize errors as a typed union via ",[452,2424,2425],{},"safe()"," from ",[452,2428,2429],{},"@orpc\u002Fclient",". evlog follows the protocol, so ",[452,2432,1928],{},"\u002F",[452,2435,1931],{},[452,2437,1935],{}," live under ",[452,2440,2346],{}," instead of at the response root. The authoring API (",[452,2443,1924],{}," \u002F ",[490,2446,2448],{"href":2447},"\u002Flearn\u002Fstructured-errors#error-catalogs",[452,2449,2450],{},"defineErrorCatalog",") is identical to the rest of evlog.",[546,2453,418],{"id":2454},"configuration",[449,2456,2457,2458,2461,2462,2464],{},"See the ",[490,2459,2460],{"href":419},"Configuration reference"," for all available options (",[452,2463,763],{},", middleware options, sampling, silent mode, etc.).",[546,2466,2468],{"id":2467},"drain-enrichers","Drain & Enrichers",[449,2470,2471,2472,2475],{},"Configure drain adapters and enrichers directly in the ",[452,2473,2474],{},"withEvlog()"," options:",[558,2477,2479],{"className":640,"code":2478,"filename":642,"language":643,"meta":564,"style":564},"import { createAxiomDrain } from 'evlog\u002Faxiom'\nimport { createUserAgentEnricher } from 'evlog\u002Fenrichers'\n\nconst userAgent = createUserAgentEnricher()\n\nconst handler = withEvlog(new RPCHandler(router), {\n  drain: createAxiomDrain(),\n  enrich: (ctx) => {\n    userAgent(ctx)\n    ctx.event.region = process.env.FLY_REGION\n  },\n})\n",[452,2480,2481,2501,2521,2525,2538,2542,2565,2578,2597,2608,2638,2643],{"__ignoreMap":564},[568,2482,2483,2485,2487,2490,2492,2494,2496,2499],{"class":570,"line":571},[568,2484,651],{"class":650},[568,2486,655],{"class":654},[568,2488,2489],{"class":658}," createAxiomDrain",[568,2491,662],{"class":654},[568,2493,665],{"class":650},[568,2495,668],{"class":654},[568,2497,2498],{"class":577},"evlog\u002Faxiom",[568,2500,674],{"class":654},[568,2502,2503,2505,2507,2510,2512,2514,2516,2519],{"class":570,"line":677},[568,2504,651],{"class":650},[568,2506,655],{"class":654},[568,2508,2509],{"class":658}," createUserAgentEnricher",[568,2511,662],{"class":654},[568,2513,665],{"class":650},[568,2515,668],{"class":654},[568,2517,2518],{"class":577},"evlog\u002Fenrichers",[568,2520,674],{"class":654},[568,2522,2523],{"class":570,"line":698},[568,2524,756],{"emptyLinePlaceholder":755},[568,2526,2527,2529,2532,2534,2536],{"class":570,"line":719},[568,2528,818],{"class":817},[568,2530,2531],{"class":658}," userAgent ",[568,2533,824],{"class":654},[568,2535,2509],{"class":762},[568,2537,1687],{"class":658},[568,2539,2540],{"class":570,"line":752},[568,2541,756],{"emptyLinePlaceholder":755},[568,2543,2544,2546,2548,2550,2552,2554,2556,2558,2561,2563],{"class":570,"line":759},[568,2545,818],{"class":817},[568,2547,994],{"class":658},[568,2549,824],{"class":654},[568,2551,731],{"class":762},[568,2553,766],{"class":658},[568,2555,1003],{"class":654},[568,2557,684],{"class":762},[568,2559,2560],{"class":658},"(router)",[568,2562,728],{"class":654},[568,2564,873],{"class":654},[568,2566,2567,2570,2572,2574,2576],{"class":570,"line":772},[568,2568,2569],{"class":775},"  drain",[568,2571,779],{"class":654},[568,2573,2489],{"class":762},[568,2575,843],{"class":658},[568,2577,975],{"class":654},[568,2579,2580,2583,2585,2588,2591,2593,2595],{"class":570,"line":800},[568,2581,2582],{"class":762},"  enrich",[568,2584,779],{"class":654},[568,2586,2587],{"class":654}," (",[568,2589,2590],{"class":897},"ctx",[568,2592,972],{"class":654},[568,2594,904],{"class":817},[568,2596,873],{"class":654},[568,2598,2599,2602,2604,2606],{"class":570,"line":809},[568,2600,2601],{"class":762},"    userAgent",[568,2603,766],{"class":775},[568,2605,2590],{"class":658},[568,2607,806],{"class":775},[568,2609,2610,2613,2615,2618,2620,2623,2625,2628,2630,2633,2635],{"class":570,"line":814},[568,2611,2612],{"class":658},"    ctx",[568,2614,479],{"class":654},[568,2616,2617],{"class":658},"event",[568,2619,479],{"class":654},[568,2621,2622],{"class":658},"region",[568,2624,1066],{"class":654},[568,2626,2627],{"class":658}," process",[568,2629,479],{"class":654},[568,2631,2632],{"class":658},"env",[568,2634,479],{"class":654},[568,2636,2637],{"class":658},"FLY_REGION\n",[568,2639,2640],{"class":570,"line":858},[568,2641,2642],{"class":654},"  },\n",[568,2644,2645,2647],{"class":570,"line":863},[568,2646,803],{"class":654},[568,2648,806],{"class":658},[550,2650,2652],{"id":2651},"pipeline-batching-retry","Pipeline (Batching & Retry)",[449,2654,2655,2656,2659],{},"For production, wrap your adapter with ",[452,2657,2658],{},"createDrainPipeline"," to batch events and retry on failure:",[558,2661,2663],{"className":640,"code":2662,"filename":642,"language":643,"meta":564,"style":564},"import type { DrainContext } from 'evlog'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({\n  batch: { size: 50, intervalMs: 5000 },\n  retry: { maxAttempts: 3 },\n})\nconst drain = pipeline(createAxiomDrain())\n\nconst handler = withEvlog(new RPCHandler(router), { drain })\n",[452,2664,2665,2686,2704,2724,2728,2750,2779,2797,2803,2822,2826],{"__ignoreMap":564},[568,2666,2667,2669,2671,2673,2676,2678,2680,2682,2684],{"class":570,"line":571},[568,2668,651],{"class":650},[568,2670,736],{"class":650},[568,2672,655],{"class":654},[568,2674,2675],{"class":658}," DrainContext",[568,2677,662],{"class":654},[568,2679,665],{"class":650},[568,2681,668],{"class":654},[568,2683,714],{"class":577},[568,2685,674],{"class":654},[568,2687,2688,2690,2692,2694,2696,2698,2700,2702],{"class":570,"line":677},[568,2689,651],{"class":650},[568,2691,655],{"class":654},[568,2693,2489],{"class":658},[568,2695,662],{"class":654},[568,2697,665],{"class":650},[568,2699,668],{"class":654},[568,2701,2498],{"class":577},[568,2703,674],{"class":654},[568,2705,2706,2708,2710,2713,2715,2717,2719,2722],{"class":570,"line":698},[568,2707,651],{"class":650},[568,2709,655],{"class":654},[568,2711,2712],{"class":658}," createDrainPipeline",[568,2714,662],{"class":654},[568,2716,665],{"class":650},[568,2718,668],{"class":654},[568,2720,2721],{"class":577},"evlog\u002Fpipeline",[568,2723,674],{"class":654},[568,2725,2726],{"class":570,"line":719},[568,2727,756],{"emptyLinePlaceholder":755},[568,2729,2730,2732,2735,2737,2739,2741,2744,2746,2748],{"class":570,"line":752},[568,2731,818],{"class":817},[568,2733,2734],{"class":658}," pipeline ",[568,2736,824],{"class":654},[568,2738,2712],{"class":762},[568,2740,834],{"class":654},[568,2742,2743],{"class":574},"DrainContext",[568,2745,840],{"class":654},[568,2747,766],{"class":658},[568,2749,769],{"class":654},[568,2751,2752,2755,2757,2759,2762,2764,2767,2769,2772,2774,2777],{"class":570,"line":759},[568,2753,2754],{"class":775},"  batch",[568,2756,779],{"class":654},[568,2758,655],{"class":654},[568,2760,2761],{"class":775}," size",[568,2763,779],{"class":654},[568,2765,2766],{"class":1144}," 50",[568,2768,728],{"class":654},[568,2770,2771],{"class":775}," intervalMs",[568,2773,779],{"class":654},[568,2775,2776],{"class":1144}," 5000",[568,2778,797],{"class":654},[568,2780,2781,2784,2786,2788,2791,2793,2795],{"class":570,"line":772},[568,2782,2783],{"class":775},"  retry",[568,2785,779],{"class":654},[568,2787,655],{"class":654},[568,2789,2790],{"class":775}," maxAttempts",[568,2792,779],{"class":654},[568,2794,2040],{"class":1144},[568,2796,797],{"class":654},[568,2798,2799,2801],{"class":570,"line":800},[568,2800,803],{"class":654},[568,2802,806],{"class":658},[568,2804,2805,2807,2810,2812,2815,2817,2820],{"class":570,"line":809},[568,2806,818],{"class":817},[568,2808,2809],{"class":658}," drain ",[568,2811,824],{"class":654},[568,2813,2814],{"class":762}," pipeline",[568,2816,766],{"class":658},[568,2818,2819],{"class":762},"createAxiomDrain",[568,2821,855],{"class":658},[568,2823,2824],{"class":570,"line":814},[568,2825,756],{"emptyLinePlaceholder":755},[568,2827,2828,2830,2832,2834,2836,2838,2840,2842,2844,2846,2848,2850,2852],{"class":570,"line":858},[568,2829,818],{"class":817},[568,2831,994],{"class":658},[568,2833,824],{"class":654},[568,2835,731],{"class":762},[568,2837,766],{"class":658},[568,2839,1003],{"class":654},[568,2841,684],{"class":762},[568,2843,2560],{"class":658},[568,2845,728],{"class":654},[568,2847,655],{"class":654},[568,2849,2809],{"class":658},[568,2851,803],{"class":654},[568,2853,806],{"class":658},[481,2855,2856,2857,2860,2861,2864],{"color":483,"icon":13},"Call ",[452,2858,2859],{},"drain.flush()"," on server shutdown to ensure all buffered events are sent. See the ",[490,2862,2863],{"href":409},"Pipeline docs"," for all options.",[546,2866,2868],{"id":2867},"tail-sampling","Tail Sampling",[449,2870,1617,2871,2874],{},[452,2872,2873],{},"keep"," to force-retain specific events regardless of head sampling:",[558,2876,2878],{"className":640,"code":2877,"filename":642,"language":643,"meta":564,"style":564},"const handler = withEvlog(new RPCHandler(router), {\n  drain: createAxiomDrain(),\n  keep: (ctx) => {\n    if (ctx.duration && ctx.duration > 2000) ctx.shouldKeep = true\n  },\n})\n",[452,2879,2880,2902,2914,2931,2975,2979],{"__ignoreMap":564},[568,2881,2882,2884,2886,2888,2890,2892,2894,2896,2898,2900],{"class":570,"line":571},[568,2883,818],{"class":817},[568,2885,994],{"class":658},[568,2887,824],{"class":654},[568,2889,731],{"class":762},[568,2891,766],{"class":658},[568,2893,1003],{"class":654},[568,2895,684],{"class":762},[568,2897,2560],{"class":658},[568,2899,728],{"class":654},[568,2901,873],{"class":654},[568,2903,2904,2906,2908,2910,2912],{"class":570,"line":677},[568,2905,2569],{"class":775},[568,2907,779],{"class":654},[568,2909,2489],{"class":762},[568,2911,843],{"class":658},[568,2913,975],{"class":654},[568,2915,2916,2919,2921,2923,2925,2927,2929],{"class":570,"line":698},[568,2917,2918],{"class":762},"  keep",[568,2920,779],{"class":654},[568,2922,2587],{"class":654},[568,2924,2590],{"class":897},[568,2926,972],{"class":654},[568,2928,904],{"class":817},[568,2930,873],{"class":654},[568,2932,2933,2936,2938,2940,2942,2945,2948,2951,2953,2955,2958,2961,2963,2965,2967,2970,2972],{"class":570,"line":719},[568,2934,2935],{"class":650},"    if",[568,2937,2587],{"class":775},[568,2939,2590],{"class":658},[568,2941,479],{"class":654},[568,2943,2944],{"class":658},"duration",[568,2946,2947],{"class":654}," &&",[568,2949,2950],{"class":658}," ctx",[568,2952,479],{"class":654},[568,2954,2944],{"class":658},[568,2956,2957],{"class":654}," >",[568,2959,2960],{"class":1144}," 2000",[568,2962,1492],{"class":775},[568,2964,2590],{"class":658},[568,2966,479],{"class":654},[568,2968,2969],{"class":658},"shouldKeep",[568,2971,1066],{"class":654},[568,2973,2974],{"class":959}," true\n",[568,2976,2977],{"class":570,"line":752},[568,2978,2642],{"class":654},[568,2980,2981,2983],{"class":570,"line":759},[568,2982,803],{"class":654},[568,2984,806],{"class":658},[546,2986,2988],{"id":2987},"route-filtering","Route Filtering",[449,2990,2991,2444,2994,2997],{},[452,2992,2993],{},"include",[452,2995,2996],{},"exclude"," match against the HTTP path (the request URL), not the procedure name:",[558,2999,3001],{"className":640,"code":3000,"filename":642,"language":643,"meta":564,"style":564},"const handler = withEvlog(new RPCHandler(router), {\n  include: ['\u002Frpc\u002F**'],\n  exclude: ['\u002Frpc\u002F_internal\u002F**', '\u002Fhealth'],\n  routes: {\n    '\u002Frpc\u002Fauth\u002F**': { service: 'auth-service' },\n    '\u002Frpc\u002Fpayment\u002F**': { service: 'payment-service' },\n  },\n})\n",[452,3002,3003,3025,3047,3076,3085,3112,3138,3142],{"__ignoreMap":564},[568,3004,3005,3007,3009,3011,3013,3015,3017,3019,3021,3023],{"class":570,"line":571},[568,3006,818],{"class":817},[568,3008,994],{"class":658},[568,3010,824],{"class":654},[568,3012,731],{"class":762},[568,3014,766],{"class":658},[568,3016,1003],{"class":654},[568,3018,684],{"class":762},[568,3020,2560],{"class":658},[568,3022,728],{"class":654},[568,3024,873],{"class":654},[568,3026,3027,3030,3032,3035,3037,3040,3042,3045],{"class":570,"line":677},[568,3028,3029],{"class":775},"  include",[568,3031,779],{"class":654},[568,3033,3034],{"class":658}," [",[568,3036,794],{"class":654},[568,3038,3039],{"class":577},"\u002Frpc\u002F**",[568,3041,794],{"class":654},[568,3043,3044],{"class":658},"]",[568,3046,975],{"class":654},[568,3048,3049,3052,3054,3056,3058,3061,3063,3065,3067,3070,3072,3074],{"class":570,"line":698},[568,3050,3051],{"class":775},"  exclude",[568,3053,779],{"class":654},[568,3055,3034],{"class":658},[568,3057,794],{"class":654},[568,3059,3060],{"class":577},"\u002Frpc\u002F_internal\u002F**",[568,3062,794],{"class":654},[568,3064,728],{"class":654},[568,3066,668],{"class":654},[568,3068,3069],{"class":577},"\u002Fhealth",[568,3071,794],{"class":654},[568,3073,3044],{"class":658},[568,3075,975],{"class":654},[568,3077,3078,3081,3083],{"class":570,"line":719},[568,3079,3080],{"class":775},"  routes",[568,3082,779],{"class":654},[568,3084,873],{"class":654},[568,3086,3087,3090,3093,3095,3097,3099,3101,3103,3105,3108,3110],{"class":570,"line":752},[568,3088,3089],{"class":654},"    '",[568,3091,3092],{"class":775},"\u002Frpc\u002Fauth\u002F**",[568,3094,794],{"class":654},[568,3096,779],{"class":654},[568,3098,655],{"class":654},[568,3100,784],{"class":775},[568,3102,779],{"class":654},[568,3104,668],{"class":654},[568,3106,3107],{"class":577},"auth-service",[568,3109,794],{"class":654},[568,3111,797],{"class":654},[568,3113,3114,3116,3119,3121,3123,3125,3127,3129,3131,3134,3136],{"class":570,"line":759},[568,3115,3089],{"class":654},[568,3117,3118],{"class":775},"\u002Frpc\u002Fpayment\u002F**",[568,3120,794],{"class":654},[568,3122,779],{"class":654},[568,3124,655],{"class":654},[568,3126,784],{"class":775},[568,3128,779],{"class":654},[568,3130,668],{"class":654},[568,3132,3133],{"class":577},"payment-service",[568,3135,794],{"class":654},[568,3137,797],{"class":654},[568,3139,3140],{"class":570,"line":772},[568,3141,2642],{"class":654},[568,3143,3144,3146],{"class":570,"line":800},[568,3145,803],{"class":654},[568,3147,806],{"class":658},[449,3149,3150,3151,3153],{},"When a route is filtered out, the wrapper still injects a no-op ",[452,3152,474],{}," so procedures never crash on missing fields — the wide event simply isn't emitted and drain\u002Fenrich aren't called.",[546,3155,3157],{"id":3156},"run-locally","Run Locally",[558,3159,3162],{"className":560,"code":3160,"filename":3161,"language":563,"meta":564,"style":564},"git clone https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog.git\ncd evlog\npnpm install\npnpm run example:orpc\n","Terminal",[452,3163,3164,3175,3183,3190],{"__ignoreMap":564},[568,3165,3166,3169,3172],{"class":570,"line":571},[568,3167,3168],{"class":574},"git",[568,3170,3171],{"class":577}," clone",[568,3173,3174],{"class":577}," https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog.git\n",[568,3176,3177,3180],{"class":570,"line":677},[568,3178,3179],{"class":762},"cd",[568,3181,3182],{"class":577}," evlog\n",[568,3184,3185,3187],{"class":570,"line":698},[568,3186,562],{"class":574},[568,3188,3189],{"class":577}," install\n",[568,3191,3192,3194,3197],{"class":570,"line":719},[568,3193,562],{"class":574},[568,3195,3196],{"class":577}," run",[568,3198,3199],{"class":577}," example:orpc\n",[449,3201,3202,3203,3207],{},"Open ",[490,3204,3205],{"href":3205,"rel":3206},"http:\u002F\u002Flocalhost:3000",[494]," to explore the interactive test UI.",[3209,3210,3211],"card-group",{},[3212,3213,3217],"card",{"icon":3214,"title":3215,"to":3216},"i-simple-icons-github","Source Code","https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Ftree\u002Fmain\u002Fexamples\u002Forpc","Browse the complete oRPC example source on GitHub.",[546,3219,3221],{"id":3220},"next-steps","Next Steps",[449,3223,3224,3225,3227],{},"Deepen your ",[485,3226,236],{}," integration:",[509,3229,3230,3235,3240,3245],{},[512,3231,3232,3234],{},[490,3233,46],{"href":47},": Design comprehensive events with context layering",[512,3236,3237,3239],{},[490,3238,90],{"href":95},": Send logs to Axiom, Sentry, PostHog, and more",[512,3241,3242,3244],{},[490,3243,61],{"href":62},": Control log volume with head and tail sampling",[512,3246,3247,3249,3250,463,3252,1932,3254,3256],{},[490,3248,51],{"href":52},": Throw errors with ",[452,3251,1928],{},[452,3253,1931],{},[452,3255,1935],{}," fields",[3258,3259,3260],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":564,"searchDepth":677,"depth":677,"links":3262},[3263,3267,3268,3269,3270,3271,3274,3275,3276,3277],{"id":548,"depth":677,"text":25,"children":3264},[3265,3266],{"id":552,"depth":698,"text":553},{"id":636,"depth":698,"text":637},{"id":1193,"depth":677,"text":46},{"id":1613,"depth":677,"text":1614},{"id":1918,"depth":677,"text":1919},{"id":2454,"depth":677,"text":418},{"id":2467,"depth":677,"text":2468,"children":3272},[3273],{"id":2651,"depth":698,"text":2652},{"id":2867,"depth":677,"text":2868},{"id":2987,"depth":677,"text":2988},{"id":3156,"depth":677,"text":3157},{"id":3220,"depth":677,"text":3221},"Automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in oRPC applications.","md",[3281],{"label":3215,"icon":3214,"to":3216,"color":3282,"variant":3283},"neutral","subtle",{},{"title":236,"icon":239},{"title":236,"description":3278},"SHuXRPkeR6cI02bGX7Xmmtk8vi-w3CMBjob4JNM7d-s",[3289,3291],{"title":231,"path":232,"stem":233,"description":3290,"icon":234,"children":-1},"Wide events and structured errors in Astro server middleware.",{"title":241,"path":242,"stem":243,"description":3292,"icon":244,"children":-1},"Wide events and structured logging in AWS Lambda functions, including SQS consumers and event-driven handlers.",1780167578925]