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