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