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