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