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