[{"data":1,"prerenderedAt":3007},["ShallowReactive",2],{"navigation_docs":3,"-rpc-client-client-middleware":399},[4,162,346],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":24},"RPC","icon-park-outline:lightning","\u002Frpc","01.rpc",[10,25,63,77,102,136],{"title":11,"icon":12,"redirect":7,"path":13,"stem":14,"children":15,"page":24},"Introduction","icon-park-outline:home","\u002Frpc\u002Fintroduction","01.rpc\u002F01.introduction",[16,20],{"title":17,"path":18,"stem":19},"Quick Start","\u002Frpc\u002Fintroduction\u002Fquick-start","01.rpc\u002F01.introduction\u002F02.quick-start",{"title":21,"path":22,"stem":23},"Manual Install","\u002Frpc\u002Fintroduction\u002Fmanual-install","01.rpc\u002F01.introduction\u002F03.manual-install",false,{"title":26,"icon":27,"path":28,"stem":29,"children":30,"page":24},"Server","icon-park-outline:server","\u002Frpc\u002Fserver","01.rpc\u002F02.server",[31,35,39,43,47,51,55,59],{"title":32,"path":33,"stem":34},"Routes","\u002Frpc\u002Fserver\u002Froutes","01.rpc\u002F02.server\u002F01.routes",{"title":36,"path":37,"stem":38},"Middleware","\u002Frpc\u002Fserver\u002Fmiddleware","01.rpc\u002F02.server\u002F02.middleware",{"title":40,"path":41,"stem":42},"Call Context","\u002Frpc\u002Fserver\u002Fcall-context","01.rpc\u002F02.server\u002F03.call-context",{"title":44,"path":45,"stem":46},"Headers","\u002Frpc\u002Fserver\u002Fheaders","01.rpc\u002F02.server\u002F04.headers",{"title":48,"path":49,"stem":50},"Error Handling","\u002Frpc\u002Fserver\u002Ferror-handling","01.rpc\u002F02.server\u002F05.error-handling",{"title":52,"path":53,"stem":54},"Validation","\u002Frpc\u002Fserver\u002Fvalidation","01.rpc\u002F02.server\u002F06.validation",{"title":56,"path":57,"stem":58},"JSON Round Trip","\u002Frpc\u002Fserver\u002Fjson-round-trip","01.rpc\u002F02.server\u002F07.json-round-trip",{"title":60,"path":61,"stem":62},"Drizzle Tables","\u002Frpc\u002Fserver\u002Fdrizzle-tables","01.rpc\u002F02.server\u002F08.drizzle-tables",{"title":64,"icon":65,"path":66,"stem":67,"children":68,"page":24},"Middlewares","icon-park-outline:link-one","\u002Frpc\u002Fmiddlewares","01.rpc\u002F03.middlewares",[69,73],{"title":70,"path":71,"stem":72},"fetchMetadata","\u002Frpc\u002Fmiddlewares\u002Ffetch-metadata","01.rpc\u002F03.middlewares\u002F01.fetch-metadata",{"title":74,"path":75,"stem":76},"syncRoutes","\u002Frpc\u002Fmiddlewares\u002Fsync-routes","01.rpc\u002F03.middlewares\u002F02.sync-routes",{"title":78,"icon":79,"path":80,"stem":81,"children":82,"page":24},"Client","icon-park-outline:computer","\u002Frpc\u002Fclient","01.rpc\u002F04.client",[83,87,91,94,98],{"title":84,"path":85,"stem":86},"Client Overview","\u002Frpc\u002Fclient\u002Fclient-overview","01.rpc\u002F04.client\u002F00.client-overview",{"title":88,"path":89,"stem":90},"Client Middleware","\u002Frpc\u002Fclient\u002Fclient-middleware","01.rpc\u002F04.client\u002F01.client-middleware",{"title":48,"path":92,"stem":93},"\u002Frpc\u002Fclient\u002Ferror-handling","01.rpc\u002F04.client\u002F02.error-handling",{"title":95,"path":96,"stem":97},"Batch Requests","\u002Frpc\u002Fclient\u002Fbatch","01.rpc\u002F04.client\u002F03.batch",{"title":99,"path":100,"stem":101},"Cancellation & Timeouts","\u002Frpc\u002Fclient\u002Fcancellation-timeouts","01.rpc\u002F04.client\u002F04.cancellation-timeouts",{"title":103,"redirect":104,"icon":105,"path":106,"stem":107,"children":108,"page":24},"Platforms","\u002Frpc\u002Fplatforms\u002Fnode-js","icon-park-outline:play","\u002Frpc\u002Fplatforms","01.rpc\u002F06.platforms",[109,112,116,120,124,128,132],{"title":110,"path":104,"stem":111},"Node.js","01.rpc\u002F06.platforms\u002F01.node-js",{"title":113,"path":114,"stem":115},"Bun","\u002Frpc\u002Fplatforms\u002Fbun","01.rpc\u002F06.platforms\u002F02.bun",{"title":117,"path":118,"stem":119},"AWS Lambda","\u002Frpc\u002Fplatforms\u002Faws-lambda","01.rpc\u002F06.platforms\u002F03.aws-lambda",{"title":121,"path":122,"stem":123},"Google Cloud Functions","\u002Frpc\u002Fplatforms\u002Fgoogle-cloud-functions","01.rpc\u002F06.platforms\u002F04.google-cloud-functions",{"title":125,"path":126,"stem":127},"Cloudflare Workers","\u002Frpc\u002Fplatforms\u002Fcloudflare","01.rpc\u002F06.platforms\u002F05.cloudflare",{"title":129,"path":130,"stem":131},"Vercel","\u002Frpc\u002Fplatforms\u002Fvercel","01.rpc\u002F06.platforms\u002F06.vercel",{"title":133,"path":134,"stem":135},"uWebSockets.js","\u002Frpc\u002Fplatforms\u002Fuwebsockets","01.rpc\u002F06.platforms\u002F07.uwebsockets",{"title":137,"icon":138,"path":139,"stem":140,"children":141,"page":24},"Devtools","icon-park-outline:tool","\u002Frpc\u002Fdevtools","01.rpc\u002F07.devtools",[142,146,150,154,158],{"title":143,"path":144,"stem":145},"Linter","\u002Frpc\u002Fdevtools\u002Flinter","01.rpc\u002F07.devtools\u002F01.linter",{"title":147,"path":148,"stem":149},"Vite","\u002Frpc\u002Fdevtools\u002Fvite","01.rpc\u002F07.devtools\u002F02.vite",{"title":151,"path":152,"stem":153},"Next.js","\u002Frpc\u002Fdevtools\u002Fnextjs","01.rpc\u002F07.devtools\u002F03.nextjs",{"title":155,"path":156,"stem":157},"CLI","\u002Frpc\u002Fdevtools\u002Fcli","01.rpc\u002F07.devtools\u002F04.cli",{"title":159,"path":160,"stem":161},"API Types","\u002Frpc\u002Fdevtools\u002Fapi-types","01.rpc\u002F07.devtools\u002F05.api-types",{"title":163,"icon":164,"path":165,"stem":166,"children":167,"page":24},"RunTypes","i-lucide-braces","\u002Fruntypes","02.runtypes",[168,184,224,254,268,290,332],{"title":11,"icon":169,"redirect":165,"path":170,"stem":171,"children":172,"page":24},"i-lucide-rocket","\u002Fruntypes\u002Fintroduction","02.runtypes\u002F01.introduction",[173,177,180],{"title":174,"path":175,"stem":176},"Built on typescript-go","\u002Fruntypes\u002Fintroduction\u002Fbuilt-on-typescript-go","02.runtypes\u002F01.introduction\u002F02.built-on-typescript-go",{"title":17,"path":178,"stem":179},"\u002Fruntypes\u002Fintroduction\u002Fquick-start","02.runtypes\u002F01.introduction\u002F03.quick-start",{"title":181,"path":182,"stem":183},"Configuration","\u002Fruntypes\u002Fintroduction\u002Fconfiguration","02.runtypes\u002F01.introduction\u002F04.configuration",{"title":185,"icon":186,"redirect":187,"path":188,"stem":189,"children":190,"page":24},"Guide","i-lucide-book-open","\u002Fruntypes\u002Fguide\u002Ftype-builders","\u002Fruntypes\u002Fguide","02.runtypes\u002F02.guide",[191,194,198,201,204,208,212,216,220],{"title":192,"path":187,"stem":193},"Types vs Type Builders","02.runtypes\u002F02.guide\u002F01.type-builders",{"title":195,"path":196,"stem":197},"Reflection","\u002Fruntypes\u002Fguide\u002Freflection","02.runtypes\u002F02.guide\u002F02.reflection",{"title":52,"path":199,"stem":200},"\u002Fruntypes\u002Fguide\u002Fvalidation","02.runtypes\u002F02.guide\u002F03.validation",{"title":56,"path":202,"stem":203},"\u002Fruntypes\u002Fguide\u002Fjson-round-trip","02.runtypes\u002F02.guide\u002F04.json-round-trip",{"title":205,"path":206,"stem":207},"Data Mocking","\u002Fruntypes\u002Fguide\u002Fmocking","02.runtypes\u002F02.guide\u002F07.mocking",{"title":209,"path":210,"stem":211},"JSON Schemas","\u002Fruntypes\u002Fguide\u002Fjson-schemas","02.runtypes\u002F02.guide\u002F08.json-schemas",{"title":213,"path":214,"stem":215},"Pure Functions","\u002Fruntypes\u002Fguide\u002Fpure-functions","02.runtypes\u002F02.guide\u002F09.pure-functions",{"title":217,"path":218,"stem":219},"Compiler Markers","\u002Fruntypes\u002Fguide\u002Fcompiler-markers","02.runtypes\u002F02.guide\u002F10.compiler-markers",{"title":221,"path":222,"stem":223},"All Compiled Functions","\u002Fruntypes\u002Fguide\u002Fall-compiled-functions","02.runtypes\u002F02.guide\u002F11.all-compiled-functions",{"title":225,"icon":226,"redirect":227,"path":228,"stem":229,"children":230,"page":24},"Type Formats","i-lucide-shapes","\u002Fruntypes\u002Ftype-formats\u002Foverview","\u002Fruntypes\u002Ftype-formats","02.runtypes\u002F03.type-formats",[231,234,238,242,246,250],{"title":232,"path":227,"stem":233},"Overview","02.runtypes\u002F03.type-formats\u002F01.overview",{"title":235,"path":236,"stem":237},"String Formats","\u002Fruntypes\u002Ftype-formats\u002Fstring","02.runtypes\u002F03.type-formats\u002F02.string",{"title":239,"path":240,"stem":241},"Number Formats","\u002Fruntypes\u002Ftype-formats\u002Fnumber","02.runtypes\u002F03.type-formats\u002F03.number",{"title":243,"path":244,"stem":245},"BigInt Formats","\u002Fruntypes\u002Ftype-formats\u002Fbigint","02.runtypes\u002F03.type-formats\u002F04.bigint",{"title":247,"path":248,"stem":249},"Date and Time Formats","\u002Fruntypes\u002Ftype-formats\u002Fdate-time","02.runtypes\u002F03.type-formats\u002F05.date-time",{"title":251,"path":252,"stem":253},"Collection Formats","\u002Fruntypes\u002Ftype-formats\u002Fcollections","02.runtypes\u002F03.type-formats\u002F06.collections",{"title":255,"icon":256,"redirect":257,"path":258,"stem":259,"children":260,"page":24},"Tooling","i-lucide-wrench","\u002Fruntypes\u002Ftooling\u002Flinting","\u002Fruntypes\u002Ftooling","02.runtypes\u002F04.tooling",[261,264],{"title":262,"path":257,"stem":263},"Linting","02.runtypes\u002F04.tooling\u002F01.linting",{"title":265,"path":266,"stem":267},"Source Conversion","\u002Fruntypes\u002Ftooling\u002Fsource-conversion","02.runtypes\u002F04.tooling\u002F02.source-conversion",{"title":269,"icon":270,"redirect":271,"path":272,"stem":273,"children":274,"page":24},"AI Integration","i-lucide-sparkles","\u002Fruntypes\u002Fai-integration\u002Fworkflow-and-commands","\u002Fruntypes\u002Fai-integration","02.runtypes\u002F05.ai-integration",[275,278,282,286],{"title":276,"path":271,"stem":277},"AI Workflow","02.runtypes\u002F05.ai-integration\u002F01.workflow-and-commands",{"title":279,"path":280,"stem":281},"FriendlyText","\u002Fruntypes\u002Fai-integration\u002Ffriendly-text","02.runtypes\u002F05.ai-integration\u002F02.friendly-text",{"title":283,"path":284,"stem":285},"MockData","\u002Fruntypes\u002Fai-integration\u002Fmock-data","02.runtypes\u002F05.ai-integration\u002F03.mock-data",{"title":287,"path":288,"stem":289},"Translations (i18n)","\u002Fruntypes\u002Fai-integration\u002Fi18n","02.runtypes\u002F05.ai-integration\u002F04.i18n",{"title":291,"icon":292,"redirect":293,"path":294,"stem":295,"children":296,"page":24},"Drizzle ORM","i-lineicons-drizzle","\u002Fruntypes\u002Fdrizzle-orm\u002Fdrizzle-overview","\u002Fruntypes\u002Fdrizzle-orm","02.runtypes\u002F06.drizzle-orm",[297,300,304,308,312,316,320,324,328],{"title":298,"path":293,"stem":299},"Drizzle Overview","02.runtypes\u002F06.drizzle-orm\u002F00.drizzle-overview",{"title":301,"path":302,"stem":303},"Column Formats","\u002Fruntypes\u002Fdrizzle-orm\u002Fcolumn-formats","02.runtypes\u002F06.drizzle-orm\u002F01.column-formats",{"title":305,"path":306,"stem":307},"Views","\u002Fruntypes\u002Fdrizzle-orm\u002Fviews","02.runtypes\u002F06.drizzle-orm\u002F02.views",{"title":309,"path":310,"stem":311},"Indexes and Constraints","\u002Fruntypes\u002Fdrizzle-orm\u002Fconstraints","02.runtypes\u002F06.drizzle-orm\u002F03.constraints",{"title":313,"path":314,"stem":315},"Row Level Security","\u002Fruntypes\u002Fdrizzle-orm\u002Frow-level-security","02.runtypes\u002F06.drizzle-orm\u002F04.row-level-security",{"title":317,"path":318,"stem":319},"Relations","\u002Fruntypes\u002Fdrizzle-orm\u002Frelations","02.runtypes\u002F06.drizzle-orm\u002F05.relations",{"title":321,"path":322,"stem":323},"The Schema File","\u002Fruntypes\u002Fdrizzle-orm\u002Fschema-file","02.runtypes\u002F06.drizzle-orm\u002F06.schema-file",{"title":325,"path":326,"stem":327},"Migrate an Existing Schema","\u002Fruntypes\u002Fdrizzle-orm\u002Fmigrate-an-existing-schema","02.runtypes\u002F06.drizzle-orm\u002F07.migrate-an-existing-schema",{"title":329,"path":330,"stem":331},"Cloudflare D1 and Durable Objects","\u002Fruntypes\u002Fdrizzle-orm\u002Fcloudflare-storage","02.runtypes\u002F06.drizzle-orm\u002F08.cloudflare-storage",{"title":333,"icon":334,"redirect":335,"path":336,"stem":337,"children":338,"page":24},"Diagnostics","i-lucide-triangle-alert","\u002Fruntypes\u002Fdiagnostics\u002Ferror-levels","\u002Fruntypes\u002Fdiagnostics","02.runtypes\u002F08.diagnostics",[339,342],{"title":340,"path":335,"stem":341},"Error Levels","02.runtypes\u002F08.diagnostics\u002F01.error-levels",{"title":343,"path":344,"stem":345},"All Diagnostics","\u002Fruntypes\u002Fdiagnostics\u002Fall-diagnostics","02.runtypes\u002F08.diagnostics\u002F02.all-diagnostics",{"title":347,"icon":348,"path":349,"stem":350,"children":351,"page":24},"Benchmarks","i-lucide-gauge","\u002Fbenchmarks","03.benchmarks",[352,372],{"title":5,"icon":6,"redirect":353,"path":354,"stem":355,"children":356,"page":24},"\u002Fbenchmarks\u002Frpc\u002Fhello-world","\u002Fbenchmarks\u002Frpc","03.benchmarks\u002F02.rpc",[357,360,364,368],{"title":358,"path":353,"stem":359},"Hello World","03.benchmarks\u002F02.rpc\u002F01.hello-world",{"title":361,"path":362,"stem":363},"Light Validation","\u002Fbenchmarks\u002Frpc\u002Flight-validation","03.benchmarks\u002F02.rpc\u002F02.light-validation",{"title":365,"path":366,"stem":367},"Heavy Validation","\u002Fbenchmarks\u002Frpc\u002Fheavy-validation","03.benchmarks\u002F02.rpc\u002F03.heavy-validation",{"title":369,"path":370,"stem":371},"Payload Sizes","\u002Fbenchmarks\u002Frpc\u002Fpayload-sizes","03.benchmarks\u002F02.rpc\u002F04.payload-sizes",{"title":163,"icon":164,"redirect":373,"path":374,"stem":375,"children":376,"page":24},"\u002Fbenchmarks\u002Fruntypes\u002Fis-valid","\u002Fbenchmarks\u002Fruntypes","03.benchmarks\u002F03.runtypes",[377,380,384,388,392,395],{"title":378,"path":373,"stem":379},"Is Valid","03.benchmarks\u002F03.runtypes\u002F01.is-valid",{"title":381,"path":382,"stem":383},"Is Valid Formats","\u002Fbenchmarks\u002Fruntypes\u002Fis-valid-formats","03.benchmarks\u002F03.runtypes\u002F02.is-valid-formats",{"title":385,"path":386,"stem":387},"Get Errors","\u002Fbenchmarks\u002Fruntypes\u002Fget-errors","03.benchmarks\u002F03.runtypes\u002F03.get-errors",{"title":389,"path":390,"stem":391},"Get Errors Formats","\u002Fbenchmarks\u002Fruntypes\u002Fget-errors-formats","03.benchmarks\u002F03.runtypes\u002F04.get-errors-formats",{"title":56,"path":393,"stem":394},"\u002Fbenchmarks\u002Fruntypes\u002Fjson-round-trip","03.benchmarks\u002F03.runtypes\u002F05.json-round-trip",{"title":396,"path":397,"stem":398},"Type Checking","\u002Fbenchmarks\u002Fruntypes\u002Ftype-checking","03.benchmarks\u002F03.runtypes\u002F07.type-checking",{"id":400,"title":88,"body":401,"description":3001,"extension":3002,"links":3003,"meta":3004,"navigation":539,"path":89,"seo":3005,"stem":90,"__hash__":3006},"docs\u002F01.rpc\u002F04.client\u002F01.client-middleware.md",{"type":402,"value":403},"minimark",[404,413,418,436,1718,1788,1794,1808,1812,1822,2463,2467,2482,2520,2529,2533,2544,2990,2997],[405,406,407,408,412],"p",{},"Every server middleware with params or a result shows up in the client's ",[409,410,411],"code",{},"middlewares"," object. Use it to send the middleware its data and handle what it returns.",[414,415,417],"h2",{"id":416},"middleware-hooks","Middleware Hooks",[405,419,420,421,423,424,427,428,431,432,435],{},"Each middleware in ",[409,422,411],{}," has three hooks. ",[409,425,426],{},"onRequest"," sends its data, like a trace id. ",[409,429,430],{},"onResponse"," gets its result and ",[409,433,434],{},"onError"," its declared errors.",[437,438,439,988],"code-split",{},[440,441,447],"pre",{"className":442,"code":443,"filename":444,"language":445,"meta":446,"style":446},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import {HeadersSubset} from '@mionjs\u002Fcore';\nimport {initClient} from '@mionjs\u002Fclient';\nimport type {MyApi} from '.\u002Fmiddleware-hooks.routes.ts';\n\nconst {middlewares} = initClient\u003CMyApi>({\n  baseURL: 'http:\u002F\u002Flocalhost:3000',\n});\n\ndeclare function redirectToLogin(): void;\n\n\u002F\u002F a fresh id for every request, the server echoes it back\nmiddlewares.trace\n  .onRequest((trace) => {\n    \u002F\u002F the remote middleware call: same params as the server's traceHandler\n    trace(new HeadersSubset({'X-Trace-Id': crypto.randomUUID()}));\n  })\n  .onResponse((info) => {\n    console.log('Trace:', info.traceId, 'received at', info.receivedAt);\n  });\n\n\u002F\u002F auth takes no params, so it needs no onRequest\nmiddlewares.auth\n  .onResponse((session) => {\n    console.log('Authenticated as:', session.userId);\n  })\n  .onError('not-authorized', (error) => {\n    console.log('Auth failed:', error.errorData?.reason);\n    redirectToLogin();\n  });\n","client.ts","ts","",[409,448,449,485,508,534,541,576,596,606,611,631,636,643,654,678,684,730,739,759,812,821,826,832,842,862,894,901,931,969,979],{"__ignoreMap":446},[450,451,454,458,462,466,469,472,475,479,482],"span",{"class":452,"line":453},"line",1,[450,455,457],{"class":456},"s7zQu","import",[450,459,461],{"class":460},"sMK4o"," {",[450,463,465],{"class":464},"sTEyZ","HeadersSubset",[450,467,468],{"class":460},"}",[450,470,471],{"class":456}," from",[450,473,474],{"class":460}," '",[450,476,478],{"class":477},"sfazB","@mionjs\u002Fcore",[450,480,481],{"class":460},"'",[450,483,484],{"class":460},";\n",[450,486,488,490,492,495,497,499,501,504,506],{"class":452,"line":487},2,[450,489,457],{"class":456},[450,491,461],{"class":460},[450,493,494],{"class":464},"initClient",[450,496,468],{"class":460},[450,498,471],{"class":456},[450,500,474],{"class":460},[450,502,503],{"class":477},"@mionjs\u002Fclient",[450,505,481],{"class":460},[450,507,484],{"class":460},[450,509,511,513,516,518,521,523,525,527,530,532],{"class":452,"line":510},3,[450,512,457],{"class":456},[450,514,515],{"class":456}," type",[450,517,461],{"class":460},[450,519,520],{"class":464},"MyApi",[450,522,468],{"class":460},[450,524,471],{"class":456},[450,526,474],{"class":460},[450,528,529],{"class":477},".\u002Fmiddleware-hooks.routes.ts",[450,531,481],{"class":460},[450,533,484],{"class":460},[450,535,537],{"class":452,"line":536},4,[450,538,540],{"emptyLinePlaceholder":539},true,"\n",[450,542,544,548,550,552,554,557,561,564,567,570,573],{"class":452,"line":543},5,[450,545,547],{"class":546},"spNyl","const",[450,549,461],{"class":460},[450,551,411],{"class":464},[450,553,468],{"class":460},[450,555,556],{"class":460}," =",[450,558,560],{"class":559},"s2Zo4"," initClient",[450,562,563],{"class":460},"\u003C",[450,565,520],{"class":566},"sBMFI",[450,568,569],{"class":460},">",[450,571,572],{"class":464},"(",[450,574,575],{"class":460},"{\n",[450,577,579,583,586,588,591,593],{"class":452,"line":578},6,[450,580,582],{"class":581},"swJcz","  baseURL",[450,584,585],{"class":460},":",[450,587,474],{"class":460},[450,589,590],{"class":477},"http:\u002F\u002Flocalhost:3000",[450,592,481],{"class":460},[450,594,595],{"class":460},",\n",[450,597,599,601,604],{"class":452,"line":598},7,[450,600,468],{"class":460},[450,602,603],{"class":464},")",[450,605,484],{"class":460},[450,607,609],{"class":452,"line":608},8,[450,610,540],{"emptyLinePlaceholder":539},[450,612,614,617,620,623,626,629],{"class":452,"line":613},9,[450,615,616],{"class":546},"declare",[450,618,619],{"class":546}," function",[450,621,622],{"class":559}," redirectToLogin",[450,624,625],{"class":460},"():",[450,627,628],{"class":566}," void",[450,630,484],{"class":460},[450,632,634],{"class":452,"line":633},10,[450,635,540],{"emptyLinePlaceholder":539},[450,637,639],{"class":452,"line":638},11,[450,640,642],{"class":641},"sHwdD","\u002F\u002F a fresh id for every request, the server echoes it back\n",[450,644,646,648,651],{"class":452,"line":645},12,[450,647,411],{"class":464},[450,649,650],{"class":460},".",[450,652,653],{"class":464},"trace\n",[450,655,657,660,662,664,666,670,672,675],{"class":452,"line":656},13,[450,658,659],{"class":460},"  .",[450,661,426],{"class":559},[450,663,572],{"class":464},[450,665,572],{"class":460},[450,667,669],{"class":668},"sHdIc","trace",[450,671,603],{"class":460},[450,673,674],{"class":546}," =>",[450,676,677],{"class":460}," {\n",[450,679,681],{"class":452,"line":680},14,[450,682,683],{"class":641},"    \u002F\u002F the remote middleware call: same params as the server's traceHandler\n",[450,685,687,690,692,695,698,700,703,705,708,710,712,715,717,720,723,725,728],{"class":452,"line":686},15,[450,688,689],{"class":559},"    trace",[450,691,572],{"class":581},[450,693,694],{"class":460},"new",[450,696,697],{"class":559}," HeadersSubset",[450,699,572],{"class":581},[450,701,702],{"class":460},"{",[450,704,481],{"class":460},[450,706,707],{"class":581},"X-Trace-Id",[450,709,481],{"class":460},[450,711,585],{"class":460},[450,713,714],{"class":464}," crypto",[450,716,650],{"class":460},[450,718,719],{"class":559},"randomUUID",[450,721,722],{"class":581},"()",[450,724,468],{"class":460},[450,726,727],{"class":581},"))",[450,729,484],{"class":460},[450,731,733,736],{"class":452,"line":732},16,[450,734,735],{"class":460},"  }",[450,737,738],{"class":464},")\n",[450,740,742,744,746,748,750,753,755,757],{"class":452,"line":741},17,[450,743,659],{"class":460},[450,745,430],{"class":559},[450,747,572],{"class":464},[450,749,572],{"class":460},[450,751,752],{"class":668},"info",[450,754,603],{"class":460},[450,756,674],{"class":546},[450,758,677],{"class":460},[450,760,762,765,767,770,772,774,777,779,782,785,787,790,792,794,797,799,801,803,805,808,810],{"class":452,"line":761},18,[450,763,764],{"class":464},"    console",[450,766,650],{"class":460},[450,768,769],{"class":559},"log",[450,771,572],{"class":581},[450,773,481],{"class":460},[450,775,776],{"class":477},"Trace:",[450,778,481],{"class":460},[450,780,781],{"class":460},",",[450,783,784],{"class":464}," info",[450,786,650],{"class":460},[450,788,789],{"class":464},"traceId",[450,791,781],{"class":460},[450,793,474],{"class":460},[450,795,796],{"class":477},"received at",[450,798,481],{"class":460},[450,800,781],{"class":460},[450,802,784],{"class":464},[450,804,650],{"class":460},[450,806,807],{"class":464},"receivedAt",[450,809,603],{"class":581},[450,811,484],{"class":460},[450,813,815,817,819],{"class":452,"line":814},19,[450,816,735],{"class":460},[450,818,603],{"class":464},[450,820,484],{"class":460},[450,822,824],{"class":452,"line":823},20,[450,825,540],{"emptyLinePlaceholder":539},[450,827,829],{"class":452,"line":828},21,[450,830,831],{"class":641},"\u002F\u002F auth takes no params, so it needs no onRequest\n",[450,833,835,837,839],{"class":452,"line":834},22,[450,836,411],{"class":464},[450,838,650],{"class":460},[450,840,841],{"class":464},"auth\n",[450,843,845,847,849,851,853,856,858,860],{"class":452,"line":844},23,[450,846,659],{"class":460},[450,848,430],{"class":559},[450,850,572],{"class":464},[450,852,572],{"class":460},[450,854,855],{"class":668},"session",[450,857,603],{"class":460},[450,859,674],{"class":546},[450,861,677],{"class":460},[450,863,865,867,869,871,873,875,878,880,882,885,887,890,892],{"class":452,"line":864},24,[450,866,764],{"class":464},[450,868,650],{"class":460},[450,870,769],{"class":559},[450,872,572],{"class":581},[450,874,481],{"class":460},[450,876,877],{"class":477},"Authenticated as:",[450,879,481],{"class":460},[450,881,781],{"class":460},[450,883,884],{"class":464}," session",[450,886,650],{"class":460},[450,888,889],{"class":464},"userId",[450,891,603],{"class":581},[450,893,484],{"class":460},[450,895,897,899],{"class":452,"line":896},25,[450,898,735],{"class":460},[450,900,738],{"class":464},[450,902,904,906,908,910,912,915,917,919,922,925,927,929],{"class":452,"line":903},26,[450,905,659],{"class":460},[450,907,434],{"class":559},[450,909,572],{"class":464},[450,911,481],{"class":460},[450,913,914],{"class":477},"not-authorized",[450,916,481],{"class":460},[450,918,781],{"class":460},[450,920,921],{"class":460}," (",[450,923,924],{"class":668},"error",[450,926,603],{"class":460},[450,928,674],{"class":546},[450,930,677],{"class":460},[450,932,934,936,938,940,942,944,947,949,951,954,956,959,962,965,967],{"class":452,"line":933},27,[450,935,764],{"class":464},[450,937,650],{"class":460},[450,939,769],{"class":559},[450,941,572],{"class":581},[450,943,481],{"class":460},[450,945,946],{"class":477},"Auth failed:",[450,948,481],{"class":460},[450,950,781],{"class":460},[450,952,953],{"class":464}," error",[450,955,650],{"class":460},[450,957,958],{"class":464},"errorData",[450,960,961],{"class":460},"?.",[450,963,964],{"class":464},"reason",[450,966,603],{"class":581},[450,968,484],{"class":460},[450,970,972,975,977],{"class":452,"line":971},28,[450,973,974],{"class":559},"    redirectToLogin",[450,976,722],{"class":581},[450,978,484],{"class":460},[450,980,982,984,986],{"class":452,"line":981},29,[450,983,735],{"class":460},[450,985,603],{"class":464},[450,987,484],{"class":460},[440,989,992],{"className":442,"code":990,"filename":991,"language":445,"meta":446,"style":446},"import {HeadersSubset, FatalError} from '@mionjs\u002Fcore';\nimport {createMionRouter, Routes} from '@mionjs\u002Frouter';\nimport type {CallContext} from '@mionjs\u002Frouter';\nimport {getSession, type SessionInfo} from '.\u002Fsession.ts';\n\nconst mion = createMionRouter();\n\nexport type TraceInfo = {traceId: string; receivedAt: Date};\nexport type NotAuthorizedData = {reason: 'no-session' | 'expired-session'};\n\n\u002F\u002F a plain handler, so a client installer can take its type\nexport function traceHandler(\n  ctx: CallContext,\n  {headers}: HeadersSubset\u003C'X-Trace-Id'>\n): TraceInfo {\n  return {traceId: headers['X-Trace-Id'], receivedAt: new Date()};\n}\n\n\u002F\u002F no params: it reads the HttpOnly session cookie the browser sends\nexport function authHandler(\n  ctx: CallContext\n): SessionInfo | FatalError\u003C'not-authorized', NotAuthorizedData> {\n  const session = getSession(ctx.request.headers.get('cookie'));\n  \u002F\u002F a returned FatalError ends the request (no route runs) and stays typed\n  if (!session) {\n    return new FatalError({\n      publicMessage: 'Not Authorized',\n      type: 'not-authorized',\n      errorData: {reason: 'no-session'},\n    });\n  }\n  return session;\n}\n\nconst routes = {\n  trace: mion.headersMiddleware(traceHandler),\n  auth: mion.middleware(authHandler),\n  utils: {\n    sum: mion.route((ctx, a: number, b: number): number => a + b),\n  },\n} satisfies Routes;\n\nconst myApi = mion.initRoutes(routes);\n\nexport type MyApi = typeof myApi;\n","server.routes.ts",[409,993,994,1019,1046,1069,1098,1102,1119,1123,1158,1194,1198,1203,1215,1227,1251,1260,1301,1306,1310,1315,1326,1335,1361,1405,1410,1427,1440,1456,1471,1493,1503,1509,1518,1523,1528,1540,1561,1581,1591,1648,1654,1666,1671,1693,1698],{"__ignoreMap":446},[450,995,996,998,1000,1002,1004,1007,1009,1011,1013,1015,1017],{"class":452,"line":453},[450,997,457],{"class":456},[450,999,461],{"class":460},[450,1001,465],{"class":464},[450,1003,781],{"class":460},[450,1005,1006],{"class":464}," FatalError",[450,1008,468],{"class":460},[450,1010,471],{"class":456},[450,1012,474],{"class":460},[450,1014,478],{"class":477},[450,1016,481],{"class":460},[450,1018,484],{"class":460},[450,1020,1021,1023,1025,1028,1030,1033,1035,1037,1039,1042,1044],{"class":452,"line":487},[450,1022,457],{"class":456},[450,1024,461],{"class":460},[450,1026,1027],{"class":464},"createMionRouter",[450,1029,781],{"class":460},[450,1031,1032],{"class":464}," Routes",[450,1034,468],{"class":460},[450,1036,471],{"class":456},[450,1038,474],{"class":460},[450,1040,1041],{"class":477},"@mionjs\u002Frouter",[450,1043,481],{"class":460},[450,1045,484],{"class":460},[450,1047,1048,1050,1052,1054,1057,1059,1061,1063,1065,1067],{"class":452,"line":510},[450,1049,457],{"class":456},[450,1051,515],{"class":456},[450,1053,461],{"class":460},[450,1055,1056],{"class":464},"CallContext",[450,1058,468],{"class":460},[450,1060,471],{"class":456},[450,1062,474],{"class":460},[450,1064,1041],{"class":477},[450,1066,481],{"class":460},[450,1068,484],{"class":460},[450,1070,1071,1073,1075,1078,1080,1082,1085,1087,1089,1091,1094,1096],{"class":452,"line":536},[450,1072,457],{"class":456},[450,1074,461],{"class":460},[450,1076,1077],{"class":464},"getSession",[450,1079,781],{"class":460},[450,1081,515],{"class":456},[450,1083,1084],{"class":464}," SessionInfo",[450,1086,468],{"class":460},[450,1088,471],{"class":456},[450,1090,474],{"class":460},[450,1092,1093],{"class":477},".\u002Fsession.ts",[450,1095,481],{"class":460},[450,1097,484],{"class":460},[450,1099,1100],{"class":452,"line":543},[450,1101,540],{"emptyLinePlaceholder":539},[450,1103,1104,1106,1109,1112,1115,1117],{"class":452,"line":578},[450,1105,547],{"class":546},[450,1107,1108],{"class":464}," mion ",[450,1110,1111],{"class":460},"=",[450,1113,1114],{"class":559}," createMionRouter",[450,1116,722],{"class":464},[450,1118,484],{"class":460},[450,1120,1121],{"class":452,"line":598},[450,1122,540],{"emptyLinePlaceholder":539},[450,1124,1125,1128,1130,1133,1135,1137,1139,1141,1144,1147,1150,1152,1155],{"class":452,"line":608},[450,1126,1127],{"class":456},"export",[450,1129,515],{"class":546},[450,1131,1132],{"class":566}," TraceInfo",[450,1134,556],{"class":460},[450,1136,461],{"class":460},[450,1138,789],{"class":581},[450,1140,585],{"class":460},[450,1142,1143],{"class":566}," string",[450,1145,1146],{"class":460},";",[450,1148,1149],{"class":581}," receivedAt",[450,1151,585],{"class":460},[450,1153,1154],{"class":566}," Date",[450,1156,1157],{"class":460},"};\n",[450,1159,1160,1162,1164,1167,1169,1171,1173,1175,1177,1180,1182,1185,1187,1190,1192],{"class":452,"line":613},[450,1161,1127],{"class":456},[450,1163,515],{"class":546},[450,1165,1166],{"class":566}," NotAuthorizedData",[450,1168,556],{"class":460},[450,1170,461],{"class":460},[450,1172,964],{"class":581},[450,1174,585],{"class":460},[450,1176,474],{"class":460},[450,1178,1179],{"class":477},"no-session",[450,1181,481],{"class":460},[450,1183,1184],{"class":460}," |",[450,1186,474],{"class":460},[450,1188,1189],{"class":477},"expired-session",[450,1191,481],{"class":460},[450,1193,1157],{"class":460},[450,1195,1196],{"class":452,"line":633},[450,1197,540],{"emptyLinePlaceholder":539},[450,1199,1200],{"class":452,"line":638},[450,1201,1202],{"class":641},"\u002F\u002F a plain handler, so a client installer can take its type\n",[450,1204,1205,1207,1209,1212],{"class":452,"line":645},[450,1206,1127],{"class":456},[450,1208,619],{"class":546},[450,1210,1211],{"class":559}," traceHandler",[450,1213,1214],{"class":460},"(\n",[450,1216,1217,1220,1222,1225],{"class":452,"line":656},[450,1218,1219],{"class":668},"  ctx",[450,1221,585],{"class":460},[450,1223,1224],{"class":566}," CallContext",[450,1226,595],{"class":460},[450,1228,1229,1232,1235,1238,1240,1242,1244,1246,1248],{"class":452,"line":680},[450,1230,1231],{"class":460},"  {",[450,1233,1234],{"class":668},"headers",[450,1236,1237],{"class":460},"}:",[450,1239,697],{"class":566},[450,1241,563],{"class":460},[450,1243,481],{"class":460},[450,1245,707],{"class":477},[450,1247,481],{"class":460},[450,1249,1250],{"class":460},">\n",[450,1252,1253,1256,1258],{"class":452,"line":686},[450,1254,1255],{"class":460},"):",[450,1257,1132],{"class":566},[450,1259,677],{"class":460},[450,1261,1262,1265,1267,1269,1271,1274,1277,1279,1281,1283,1286,1288,1290,1292,1295,1297,1299],{"class":452,"line":732},[450,1263,1264],{"class":456},"  return",[450,1266,461],{"class":460},[450,1268,789],{"class":581},[450,1270,585],{"class":460},[450,1272,1273],{"class":464}," headers",[450,1275,1276],{"class":581},"[",[450,1278,481],{"class":460},[450,1280,707],{"class":477},[450,1282,481],{"class":460},[450,1284,1285],{"class":581},"]",[450,1287,781],{"class":460},[450,1289,1149],{"class":581},[450,1291,585],{"class":460},[450,1293,1294],{"class":460}," new",[450,1296,1154],{"class":559},[450,1298,722],{"class":581},[450,1300,1157],{"class":460},[450,1302,1303],{"class":452,"line":741},[450,1304,1305],{"class":460},"}\n",[450,1307,1308],{"class":452,"line":761},[450,1309,540],{"emptyLinePlaceholder":539},[450,1311,1312],{"class":452,"line":814},[450,1313,1314],{"class":641},"\u002F\u002F no params: it reads the HttpOnly session cookie the browser sends\n",[450,1316,1317,1319,1321,1324],{"class":452,"line":823},[450,1318,1127],{"class":456},[450,1320,619],{"class":546},[450,1322,1323],{"class":559}," authHandler",[450,1325,1214],{"class":460},[450,1327,1328,1330,1332],{"class":452,"line":828},[450,1329,1219],{"class":668},[450,1331,585],{"class":460},[450,1333,1334],{"class":566}," CallContext\n",[450,1336,1337,1339,1341,1343,1345,1347,1349,1351,1353,1355,1357,1359],{"class":452,"line":834},[450,1338,1255],{"class":460},[450,1340,1084],{"class":566},[450,1342,1184],{"class":460},[450,1344,1006],{"class":566},[450,1346,563],{"class":460},[450,1348,481],{"class":460},[450,1350,914],{"class":477},[450,1352,481],{"class":460},[450,1354,781],{"class":460},[450,1356,1166],{"class":566},[450,1358,569],{"class":460},[450,1360,677],{"class":460},[450,1362,1363,1366,1368,1370,1373,1375,1378,1380,1383,1385,1387,1389,1392,1394,1396,1399,1401,1403],{"class":452,"line":844},[450,1364,1365],{"class":546},"  const",[450,1367,884],{"class":464},[450,1369,556],{"class":460},[450,1371,1372],{"class":559}," getSession",[450,1374,572],{"class":581},[450,1376,1377],{"class":464},"ctx",[450,1379,650],{"class":460},[450,1381,1382],{"class":464},"request",[450,1384,650],{"class":460},[450,1386,1234],{"class":464},[450,1388,650],{"class":460},[450,1390,1391],{"class":559},"get",[450,1393,572],{"class":581},[450,1395,481],{"class":460},[450,1397,1398],{"class":477},"cookie",[450,1400,481],{"class":460},[450,1402,727],{"class":581},[450,1404,484],{"class":460},[450,1406,1407],{"class":452,"line":864},[450,1408,1409],{"class":641},"  \u002F\u002F a returned FatalError ends the request (no route runs) and stays typed\n",[450,1411,1412,1415,1417,1420,1422,1425],{"class":452,"line":896},[450,1413,1414],{"class":456},"  if",[450,1416,921],{"class":581},[450,1418,1419],{"class":460},"!",[450,1421,855],{"class":464},[450,1423,1424],{"class":581},") ",[450,1426,575],{"class":460},[450,1428,1429,1432,1434,1436,1438],{"class":452,"line":903},[450,1430,1431],{"class":456},"    return",[450,1433,1294],{"class":460},[450,1435,1006],{"class":559},[450,1437,572],{"class":581},[450,1439,575],{"class":460},[450,1441,1442,1445,1447,1449,1452,1454],{"class":452,"line":933},[450,1443,1444],{"class":581},"      publicMessage",[450,1446,585],{"class":460},[450,1448,474],{"class":460},[450,1450,1451],{"class":477},"Not Authorized",[450,1453,481],{"class":460},[450,1455,595],{"class":460},[450,1457,1458,1461,1463,1465,1467,1469],{"class":452,"line":971},[450,1459,1460],{"class":581},"      type",[450,1462,585],{"class":460},[450,1464,474],{"class":460},[450,1466,914],{"class":477},[450,1468,481],{"class":460},[450,1470,595],{"class":460},[450,1472,1473,1476,1478,1480,1482,1484,1486,1488,1490],{"class":452,"line":981},[450,1474,1475],{"class":581},"      errorData",[450,1477,585],{"class":460},[450,1479,461],{"class":460},[450,1481,964],{"class":581},[450,1483,585],{"class":460},[450,1485,474],{"class":460},[450,1487,1179],{"class":477},[450,1489,481],{"class":460},[450,1491,1492],{"class":460},"},\n",[450,1494,1496,1499,1501],{"class":452,"line":1495},30,[450,1497,1498],{"class":460},"    }",[450,1500,603],{"class":581},[450,1502,484],{"class":460},[450,1504,1506],{"class":452,"line":1505},31,[450,1507,1508],{"class":460},"  }\n",[450,1510,1512,1514,1516],{"class":452,"line":1511},32,[450,1513,1264],{"class":456},[450,1515,884],{"class":464},[450,1517,484],{"class":460},[450,1519,1521],{"class":452,"line":1520},33,[450,1522,1305],{"class":460},[450,1524,1526],{"class":452,"line":1525},34,[450,1527,540],{"emptyLinePlaceholder":539},[450,1529,1531,1533,1536,1538],{"class":452,"line":1530},35,[450,1532,547],{"class":546},[450,1534,1535],{"class":464}," routes ",[450,1537,1111],{"class":460},[450,1539,677],{"class":460},[450,1541,1543,1546,1548,1551,1553,1556,1559],{"class":452,"line":1542},36,[450,1544,1545],{"class":581},"  trace",[450,1547,585],{"class":460},[450,1549,1550],{"class":464}," mion",[450,1552,650],{"class":460},[450,1554,1555],{"class":559},"headersMiddleware",[450,1557,1558],{"class":464},"(traceHandler)",[450,1560,595],{"class":460},[450,1562,1564,1567,1569,1571,1573,1576,1579],{"class":452,"line":1563},37,[450,1565,1566],{"class":581},"  auth",[450,1568,585],{"class":460},[450,1570,1550],{"class":464},[450,1572,650],{"class":460},[450,1574,1575],{"class":559},"middleware",[450,1577,1578],{"class":464},"(authHandler)",[450,1580,595],{"class":460},[450,1582,1584,1587,1589],{"class":452,"line":1583},38,[450,1585,1586],{"class":581},"  utils",[450,1588,585],{"class":460},[450,1590,677],{"class":460},[450,1592,1594,1597,1599,1601,1603,1606,1608,1610,1612,1614,1617,1619,1622,1624,1627,1629,1631,1633,1635,1637,1640,1643,1646],{"class":452,"line":1593},39,[450,1595,1596],{"class":581},"    sum",[450,1598,585],{"class":460},[450,1600,1550],{"class":464},[450,1602,650],{"class":460},[450,1604,1605],{"class":559},"route",[450,1607,572],{"class":464},[450,1609,572],{"class":460},[450,1611,1377],{"class":668},[450,1613,781],{"class":460},[450,1615,1616],{"class":668}," a",[450,1618,585],{"class":460},[450,1620,1621],{"class":566}," number",[450,1623,781],{"class":460},[450,1625,1626],{"class":668}," b",[450,1628,585],{"class":460},[450,1630,1621],{"class":566},[450,1632,1255],{"class":460},[450,1634,1621],{"class":566},[450,1636,674],{"class":546},[450,1638,1639],{"class":464}," a ",[450,1641,1642],{"class":460},"+",[450,1644,1645],{"class":464}," b)",[450,1647,595],{"class":460},[450,1649,1651],{"class":452,"line":1650},40,[450,1652,1653],{"class":460},"  },\n",[450,1655,1657,1659,1662,1664],{"class":452,"line":1656},41,[450,1658,468],{"class":460},[450,1660,1661],{"class":456}," satisfies",[450,1663,1032],{"class":566},[450,1665,484],{"class":460},[450,1667,1669],{"class":452,"line":1668},42,[450,1670,540],{"emptyLinePlaceholder":539},[450,1672,1674,1676,1679,1681,1683,1685,1688,1691],{"class":452,"line":1673},43,[450,1675,547],{"class":546},[450,1677,1678],{"class":464}," myApi ",[450,1680,1111],{"class":460},[450,1682,1550],{"class":464},[450,1684,650],{"class":460},[450,1686,1687],{"class":559},"initRoutes",[450,1689,1690],{"class":464},"(routes)",[450,1692,484],{"class":460},[450,1694,1696],{"class":452,"line":1695},44,[450,1697,540],{"emptyLinePlaceholder":539},[450,1699,1701,1703,1705,1708,1710,1713,1716],{"class":452,"line":1700},45,[450,1702,1127],{"class":456},[450,1704,515],{"class":546},[450,1706,1707],{"class":566}," MyApi",[450,1709,556],{"class":460},[450,1711,1712],{"class":460}," typeof",[450,1714,1715],{"class":464}," myApi",[450,1717,484],{"class":460},[1719,1720,1721,1737],"table",{},[1722,1723,1724],"thead",{},[1725,1726,1727,1731,1734],"tr",{},[1728,1729,1730],"th",{},"Hook",[1728,1732,1733],{},"Runs",[1728,1735,1736],{},"Removed with",[1738,1739,1740,1755,1770],"tbody",{},[1725,1741,1742,1747,1750],{},[1743,1744,1745],"td",{},[409,1746,426],{},[1743,1748,1749],{},"Before each request that runs the middleware, a route's first call included. It can be async. Its second argument is the request, to pick data per route. A middleware has one.",[1743,1751,1752],{},[409,1753,1754],{},"offRequest()",[1725,1756,1757,1761,1764],{},[1743,1758,1759],{},[409,1760,430],{},[1743,1762,1763],{},"After each successful middleware result, strongly typed. Several run in the order added, even when one throws.",[1743,1765,1766,1769],{},[409,1767,1768],{},"offResponse(handler)",", only that one",[1725,1771,1772,1776,1783],{},[1743,1773,1774],{},[409,1775,434],{},[1743,1777,1778,1779,1782],{},"After each declared error of the given ",[409,1780,1781],{},"type",", strongly typed. Several per type run in the order added, even when one throws.",[1743,1784,1785,1769],{},[409,1786,1787],{},"offError(type, handler)",[1789,1790,1791,1793],"tip",{},[409,1792,426],{}," gets a function. Call it with the middleware params, or skip it to send nothing.",[1795,1796,1797,1798,1800,1801,1804,1805,1807],"note",{},"If ",[409,1799,426],{}," fails, the request is not sent and the error goes to ",[409,1802,1803],{},"response['@thrownErrors']",". ",[409,1806,434],{}," only gets the errors the middleware declares.",[414,1809,1811],{"id":1810},"reading-middleware-results-from-routes","Reading Middleware Results From Routes",[405,1813,1814,1815,1818,1819,650],{},"Every call returns a third value, ",[409,1816,1817],{},"response",", with each middleware's answer. It is typed with the middleware's return value, declared errors and ",[409,1820,1821],{},"ValidationError",[437,1823,1824,2122],{},[440,1825,1827],{"className":442,"code":1826,"filename":444,"language":445,"meta":446,"style":446},"import {isRpcError} from '@mionjs\u002Fcore';\nimport {initClient} from '@mionjs\u002Fclient';\nimport type {MyApi} from '.\u002Fmiddleware-results.routes.ts';\n\nconst {routes} = initClient\u003CMyApi>({baseURL: 'http:\u002F\u002Flocalhost:3000'});\n\nconst [sum, error, response] = await routes.utils.sum(5, 2).call();\n\n\u002F\u002F the auth middleware's answer or declared error, at its path\nif (isRpcError(response.auth))\n  console.log('Auth error:', response.auth.publicMessage);\nelse console.log('Session:', response.auth?.userId);\nif (!error) console.log(sum); \u002F\u002F 7\n",[409,1828,1829,1850,1870,1893,1897,1939,1943,2003,2007,2012,2029,2063,2099],{"__ignoreMap":446},[450,1830,1831,1833,1835,1838,1840,1842,1844,1846,1848],{"class":452,"line":453},[450,1832,457],{"class":456},[450,1834,461],{"class":460},[450,1836,1837],{"class":464},"isRpcError",[450,1839,468],{"class":460},[450,1841,471],{"class":456},[450,1843,474],{"class":460},[450,1845,478],{"class":477},[450,1847,481],{"class":460},[450,1849,484],{"class":460},[450,1851,1852,1854,1856,1858,1860,1862,1864,1866,1868],{"class":452,"line":487},[450,1853,457],{"class":456},[450,1855,461],{"class":460},[450,1857,494],{"class":464},[450,1859,468],{"class":460},[450,1861,471],{"class":456},[450,1863,474],{"class":460},[450,1865,503],{"class":477},[450,1867,481],{"class":460},[450,1869,484],{"class":460},[450,1871,1872,1874,1876,1878,1880,1882,1884,1886,1889,1891],{"class":452,"line":510},[450,1873,457],{"class":456},[450,1875,515],{"class":456},[450,1877,461],{"class":460},[450,1879,520],{"class":464},[450,1881,468],{"class":460},[450,1883,471],{"class":456},[450,1885,474],{"class":460},[450,1887,1888],{"class":477},".\u002Fmiddleware-results.routes.ts",[450,1890,481],{"class":460},[450,1892,484],{"class":460},[450,1894,1895],{"class":452,"line":536},[450,1896,540],{"emptyLinePlaceholder":539},[450,1898,1899,1901,1903,1906,1908,1910,1912,1914,1916,1918,1920,1922,1925,1927,1929,1931,1933,1935,1937],{"class":452,"line":543},[450,1900,547],{"class":546},[450,1902,461],{"class":460},[450,1904,1905],{"class":464},"routes",[450,1907,468],{"class":460},[450,1909,556],{"class":460},[450,1911,560],{"class":559},[450,1913,563],{"class":460},[450,1915,520],{"class":566},[450,1917,569],{"class":460},[450,1919,572],{"class":464},[450,1921,702],{"class":460},[450,1923,1924],{"class":581},"baseURL",[450,1926,585],{"class":460},[450,1928,474],{"class":460},[450,1930,590],{"class":477},[450,1932,481],{"class":460},[450,1934,468],{"class":460},[450,1936,603],{"class":464},[450,1938,484],{"class":460},[450,1940,1941],{"class":452,"line":578},[450,1942,540],{"emptyLinePlaceholder":539},[450,1944,1945,1947,1950,1953,1955,1957,1959,1962,1964,1966,1969,1972,1974,1977,1979,1981,1983,1987,1989,1992,1994,1996,1999,2001],{"class":452,"line":598},[450,1946,547],{"class":546},[450,1948,1949],{"class":460}," [",[450,1951,1952],{"class":464},"sum",[450,1954,781],{"class":460},[450,1956,953],{"class":464},[450,1958,781],{"class":460},[450,1960,1961],{"class":464}," response",[450,1963,1285],{"class":460},[450,1965,556],{"class":460},[450,1967,1968],{"class":456}," await",[450,1970,1971],{"class":464}," routes",[450,1973,650],{"class":460},[450,1975,1976],{"class":464},"utils",[450,1978,650],{"class":460},[450,1980,1952],{"class":559},[450,1982,572],{"class":464},[450,1984,1986],{"class":1985},"sbssI","5",[450,1988,781],{"class":460},[450,1990,1991],{"class":1985}," 2",[450,1993,603],{"class":464},[450,1995,650],{"class":460},[450,1997,1998],{"class":559},"call",[450,2000,722],{"class":464},[450,2002,484],{"class":460},[450,2004,2005],{"class":452,"line":608},[450,2006,540],{"emptyLinePlaceholder":539},[450,2008,2009],{"class":452,"line":613},[450,2010,2011],{"class":641},"\u002F\u002F the auth middleware's answer or declared error, at its path\n",[450,2013,2014,2017,2019,2021,2024,2026],{"class":452,"line":633},[450,2015,2016],{"class":456},"if",[450,2018,921],{"class":464},[450,2020,1837],{"class":559},[450,2022,2023],{"class":464},"(response",[450,2025,650],{"class":460},[450,2027,2028],{"class":464},"auth))\n",[450,2030,2031,2034,2036,2038,2040,2042,2045,2047,2049,2051,2053,2056,2058,2061],{"class":452,"line":638},[450,2032,2033],{"class":464},"  console",[450,2035,650],{"class":460},[450,2037,769],{"class":559},[450,2039,572],{"class":464},[450,2041,481],{"class":460},[450,2043,2044],{"class":477},"Auth error:",[450,2046,481],{"class":460},[450,2048,781],{"class":460},[450,2050,1961],{"class":464},[450,2052,650],{"class":460},[450,2054,2055],{"class":464},"auth",[450,2057,650],{"class":460},[450,2059,2060],{"class":464},"publicMessage)",[450,2062,484],{"class":460},[450,2064,2065,2068,2071,2073,2075,2077,2079,2082,2084,2086,2088,2090,2092,2094,2097],{"class":452,"line":645},[450,2066,2067],{"class":456},"else",[450,2069,2070],{"class":464}," console",[450,2072,650],{"class":460},[450,2074,769],{"class":559},[450,2076,572],{"class":464},[450,2078,481],{"class":460},[450,2080,2081],{"class":477},"Session:",[450,2083,481],{"class":460},[450,2085,781],{"class":460},[450,2087,1961],{"class":464},[450,2089,650],{"class":460},[450,2091,2055],{"class":464},[450,2093,961],{"class":460},[450,2095,2096],{"class":464},"userId)",[450,2098,484],{"class":460},[450,2100,2101,2103,2105,2107,2110,2112,2114,2117,2119],{"class":452,"line":656},[450,2102,2016],{"class":456},[450,2104,921],{"class":464},[450,2106,1419],{"class":460},[450,2108,2109],{"class":464},"error) console",[450,2111,650],{"class":460},[450,2113,769],{"class":559},[450,2115,2116],{"class":464},"(sum)",[450,2118,1146],{"class":460},[450,2120,2121],{"class":641}," \u002F\u002F 7\n",[440,2123,2125],{"className":442,"code":2124,"filename":991,"language":445,"meta":446,"style":446},"import {FatalError} from '@mionjs\u002Fcore';\nimport {createMionRouter, Routes} from '@mionjs\u002Frouter';\nimport {getSession, type SessionInfo} from '.\u002Fsession.ts';\n\nconst mion = createMionRouter();\n\nconst routes = {\n  auth: mion.middleware(\n    (ctx): SessionInfo | FatalError\u003C'not-authorized'> =>\n      getSession(ctx.request.headers.get('cookie')) ??\n      new FatalError({type: 'not-authorized', publicMessage: 'Not Authorized'})\n  ),\n  utils: {\n    sum: mion.route((ctx, a: number, b: number): number => a + b),\n  },\n} satisfies Routes;\n\nconst myApi = mion.initRoutes(routes);\n\nexport type MyApi = typeof myApi;\n",[409,2126,2127,2148,2172,2198,2202,2216,2220,2230,2244,2272,2306,2344,2351,2359,2407,2411,2421,2425,2443,2447],{"__ignoreMap":446},[450,2128,2129,2131,2133,2136,2138,2140,2142,2144,2146],{"class":452,"line":453},[450,2130,457],{"class":456},[450,2132,461],{"class":460},[450,2134,2135],{"class":464},"FatalError",[450,2137,468],{"class":460},[450,2139,471],{"class":456},[450,2141,474],{"class":460},[450,2143,478],{"class":477},[450,2145,481],{"class":460},[450,2147,484],{"class":460},[450,2149,2150,2152,2154,2156,2158,2160,2162,2164,2166,2168,2170],{"class":452,"line":487},[450,2151,457],{"class":456},[450,2153,461],{"class":460},[450,2155,1027],{"class":464},[450,2157,781],{"class":460},[450,2159,1032],{"class":464},[450,2161,468],{"class":460},[450,2163,471],{"class":456},[450,2165,474],{"class":460},[450,2167,1041],{"class":477},[450,2169,481],{"class":460},[450,2171,484],{"class":460},[450,2173,2174,2176,2178,2180,2182,2184,2186,2188,2190,2192,2194,2196],{"class":452,"line":510},[450,2175,457],{"class":456},[450,2177,461],{"class":460},[450,2179,1077],{"class":464},[450,2181,781],{"class":460},[450,2183,515],{"class":456},[450,2185,1084],{"class":464},[450,2187,468],{"class":460},[450,2189,471],{"class":456},[450,2191,474],{"class":460},[450,2193,1093],{"class":477},[450,2195,481],{"class":460},[450,2197,484],{"class":460},[450,2199,2200],{"class":452,"line":536},[450,2201,540],{"emptyLinePlaceholder":539},[450,2203,2204,2206,2208,2210,2212,2214],{"class":452,"line":543},[450,2205,547],{"class":546},[450,2207,1108],{"class":464},[450,2209,1111],{"class":460},[450,2211,1114],{"class":559},[450,2213,722],{"class":464},[450,2215,484],{"class":460},[450,2217,2218],{"class":452,"line":578},[450,2219,540],{"emptyLinePlaceholder":539},[450,2221,2222,2224,2226,2228],{"class":452,"line":598},[450,2223,547],{"class":546},[450,2225,1535],{"class":464},[450,2227,1111],{"class":460},[450,2229,677],{"class":460},[450,2231,2232,2234,2236,2238,2240,2242],{"class":452,"line":608},[450,2233,1566],{"class":581},[450,2235,585],{"class":460},[450,2237,1550],{"class":464},[450,2239,650],{"class":460},[450,2241,1575],{"class":559},[450,2243,1214],{"class":464},[450,2245,2246,2249,2251,2253,2255,2257,2259,2261,2263,2265,2267,2269],{"class":452,"line":613},[450,2247,2248],{"class":460},"    (",[450,2250,1377],{"class":668},[450,2252,1255],{"class":460},[450,2254,1084],{"class":566},[450,2256,1184],{"class":460},[450,2258,1006],{"class":566},[450,2260,563],{"class":460},[450,2262,481],{"class":460},[450,2264,914],{"class":477},[450,2266,481],{"class":460},[450,2268,569],{"class":460},[450,2270,2271],{"class":546}," =>\n",[450,2273,2274,2277,2280,2282,2284,2286,2288,2290,2292,2294,2296,2298,2300,2303],{"class":452,"line":633},[450,2275,2276],{"class":559},"      getSession",[450,2278,2279],{"class":464},"(ctx",[450,2281,650],{"class":460},[450,2283,1382],{"class":464},[450,2285,650],{"class":460},[450,2287,1234],{"class":464},[450,2289,650],{"class":460},[450,2291,1391],{"class":559},[450,2293,572],{"class":464},[450,2295,481],{"class":460},[450,2297,1398],{"class":477},[450,2299,481],{"class":460},[450,2301,2302],{"class":464},")) ",[450,2304,2305],{"class":460},"??\n",[450,2307,2308,2311,2313,2315,2317,2319,2321,2323,2325,2327,2329,2332,2334,2336,2338,2340,2342],{"class":452,"line":638},[450,2309,2310],{"class":460},"      new",[450,2312,1006],{"class":559},[450,2314,572],{"class":464},[450,2316,702],{"class":460},[450,2318,1781],{"class":581},[450,2320,585],{"class":460},[450,2322,474],{"class":460},[450,2324,914],{"class":477},[450,2326,481],{"class":460},[450,2328,781],{"class":460},[450,2330,2331],{"class":581}," publicMessage",[450,2333,585],{"class":460},[450,2335,474],{"class":460},[450,2337,1451],{"class":477},[450,2339,481],{"class":460},[450,2341,468],{"class":460},[450,2343,738],{"class":464},[450,2345,2346,2349],{"class":452,"line":645},[450,2347,2348],{"class":464},"  )",[450,2350,595],{"class":460},[450,2352,2353,2355,2357],{"class":452,"line":656},[450,2354,1586],{"class":581},[450,2356,585],{"class":460},[450,2358,677],{"class":460},[450,2360,2361,2363,2365,2367,2369,2371,2373,2375,2377,2379,2381,2383,2385,2387,2389,2391,2393,2395,2397,2399,2401,2403,2405],{"class":452,"line":680},[450,2362,1596],{"class":581},[450,2364,585],{"class":460},[450,2366,1550],{"class":464},[450,2368,650],{"class":460},[450,2370,1605],{"class":559},[450,2372,572],{"class":464},[450,2374,572],{"class":460},[450,2376,1377],{"class":668},[450,2378,781],{"class":460},[450,2380,1616],{"class":668},[450,2382,585],{"class":460},[450,2384,1621],{"class":566},[450,2386,781],{"class":460},[450,2388,1626],{"class":668},[450,2390,585],{"class":460},[450,2392,1621],{"class":566},[450,2394,1255],{"class":460},[450,2396,1621],{"class":566},[450,2398,674],{"class":546},[450,2400,1639],{"class":464},[450,2402,1642],{"class":460},[450,2404,1645],{"class":464},[450,2406,595],{"class":460},[450,2408,2409],{"class":452,"line":686},[450,2410,1653],{"class":460},[450,2412,2413,2415,2417,2419],{"class":452,"line":732},[450,2414,468],{"class":460},[450,2416,1661],{"class":456},[450,2418,1032],{"class":566},[450,2420,484],{"class":460},[450,2422,2423],{"class":452,"line":741},[450,2424,540],{"emptyLinePlaceholder":539},[450,2426,2427,2429,2431,2433,2435,2437,2439,2441],{"class":452,"line":761},[450,2428,547],{"class":546},[450,2430,1678],{"class":464},[450,2432,1111],{"class":460},[450,2434,1550],{"class":464},[450,2436,650],{"class":460},[450,2438,1687],{"class":559},[450,2440,1690],{"class":464},[450,2442,484],{"class":460},[450,2444,2445],{"class":452,"line":814},[450,2446,540],{"emptyLinePlaceholder":539},[450,2448,2449,2451,2453,2455,2457,2459,2461],{"class":452,"line":823},[450,2450,1127],{"class":456},[450,2452,515],{"class":546},[450,2454,1707],{"class":566},[450,2456,556],{"class":460},[450,2458,1712],{"class":460},[450,2460,1715],{"class":464},[450,2462,484],{"class":460},[414,2464,2466],{"id":2465},"retrying-a-call","Retrying a Call",[405,2468,2469,2471,2472,2474,2475,2478,2479,2481],{},[409,2470,430],{}," and ",[409,2473,434],{}," get the call as a second argument. Its ",[409,2476,2477],{},"retry()"," sends the whole call again, for example after refreshing the session, and runs every ",[409,2480,426],{}," first. Each middleware can retry once per call.",[1719,2483,2484,2494],{},[1722,2485,2486],{},[1725,2487,2488,2491],{},[1728,2489,2490],{},"Route",[1728,2492,2493],{},"Retry allowed",[1738,2495,2496,2506],{},[1725,2497,2498,2503],{},[1743,2499,2500],{},[409,2501,2502],{},"query()",[1743,2504,2505],{},"Always",[1725,2507,2508,2517],{},[1743,2509,2510,2513,2514],{},[409,2511,2512],{},"mutation()"," or ",[409,2515,2516],{},"route()",[1743,2518,2519],{},"Only if the call failed: the route returned an error, or it returned nothing and the response has an error",[1795,2521,2522,2524,2525,2528],{},[409,2523,2477],{}," returns ",[409,2526,2527],{},"false"," when it is not allowed, and the call keeps its current result.",[414,2530,2532],{"id":2531},"reusable-client-middleware","Reusable Client Middleware",[405,2534,2535,2536,2539,2540,2543],{},"A middleware is usually written only for the server. With mion it can also ship its client side as an installer, a function that receives ",[409,2537,2538],{},"middlewares.x"," and sets its hooks, so every app gets the same behaviour. Type its parameter with ",[409,2541,2542],{},"ClientMiddlewareOf\u003Ctypeof handler>",", so it works wherever the app places the middleware.",[440,2545,2547],{"className":442,"code":2546,"language":445,"meta":446,"style":446},"import {HeadersSubset} from '@mionjs\u002Fcore';\nimport {initClient} from '@mionjs\u002Fclient';\nimport type {ClientMiddlewareOf} from '@mionjs\u002Fclient';\nimport type {MyApi, authHandler} from '.\u002Fmiddleware-hooks.routes.ts';\n\n\u002F\u002F only the handler's type crosses over, so this file never loads the router\nexport function useAuth(\n  auth: ClientMiddlewareOf\u003Ctypeof authHandler>,\n  refreshSession: () => Promise\u003Cboolean>\n) {\n  auth.onError('not-authorized', async (error, context) => {\n    \u002F\u002F the server sets a new session cookie, then the whole call is sent again\n    if (await refreshSession()) context.retry();\n  });\n}\n\ndeclare function refreshSession(): Promise\u003Cboolean>;\n\nconst {routes, middlewares} = initClient\u003CMyApi>({\n  baseURL: 'http:\u002F\u002Flocalhost:3000',\n});\nuseAuth(middlewares.auth, refreshSession);\nmiddlewares.trace.onRequest((trace) =>\n  trace(new HeadersSubset({'X-Trace-Id': crypto.randomUUID()}))\n);\n\nconst [sum] = await routes.utils.sum(5, 2).call();\n",[409,2548,2549,2569,2589,2612,2638,2642,2647,2658,2675,2697,2703,2739,2744,2772,2780,2784,2788,2807,2811,2840,2854,2862,2881,2903,2938,2944,2948],{"__ignoreMap":446},[450,2550,2551,2553,2555,2557,2559,2561,2563,2565,2567],{"class":452,"line":453},[450,2552,457],{"class":456},[450,2554,461],{"class":460},[450,2556,465],{"class":464},[450,2558,468],{"class":460},[450,2560,471],{"class":456},[450,2562,474],{"class":460},[450,2564,478],{"class":477},[450,2566,481],{"class":460},[450,2568,484],{"class":460},[450,2570,2571,2573,2575,2577,2579,2581,2583,2585,2587],{"class":452,"line":487},[450,2572,457],{"class":456},[450,2574,461],{"class":460},[450,2576,494],{"class":464},[450,2578,468],{"class":460},[450,2580,471],{"class":456},[450,2582,474],{"class":460},[450,2584,503],{"class":477},[450,2586,481],{"class":460},[450,2588,484],{"class":460},[450,2590,2591,2593,2595,2597,2600,2602,2604,2606,2608,2610],{"class":452,"line":510},[450,2592,457],{"class":456},[450,2594,515],{"class":456},[450,2596,461],{"class":460},[450,2598,2599],{"class":464},"ClientMiddlewareOf",[450,2601,468],{"class":460},[450,2603,471],{"class":456},[450,2605,474],{"class":460},[450,2607,503],{"class":477},[450,2609,481],{"class":460},[450,2611,484],{"class":460},[450,2613,2614,2616,2618,2620,2622,2624,2626,2628,2630,2632,2634,2636],{"class":452,"line":536},[450,2615,457],{"class":456},[450,2617,515],{"class":456},[450,2619,461],{"class":460},[450,2621,520],{"class":464},[450,2623,781],{"class":460},[450,2625,1323],{"class":464},[450,2627,468],{"class":460},[450,2629,471],{"class":456},[450,2631,474],{"class":460},[450,2633,529],{"class":477},[450,2635,481],{"class":460},[450,2637,484],{"class":460},[450,2639,2640],{"class":452,"line":543},[450,2641,540],{"emptyLinePlaceholder":539},[450,2643,2644],{"class":452,"line":578},[450,2645,2646],{"class":641},"\u002F\u002F only the handler's type crosses over, so this file never loads the router\n",[450,2648,2649,2651,2653,2656],{"class":452,"line":598},[450,2650,1127],{"class":456},[450,2652,619],{"class":546},[450,2654,2655],{"class":559}," useAuth",[450,2657,1214],{"class":460},[450,2659,2660,2662,2664,2667,2670,2672],{"class":452,"line":608},[450,2661,1566],{"class":668},[450,2663,585],{"class":460},[450,2665,2666],{"class":566}," ClientMiddlewareOf",[450,2668,2669],{"class":460},"\u003Ctypeof",[450,2671,1323],{"class":464},[450,2673,2674],{"class":460},">,\n",[450,2676,2677,2680,2682,2685,2687,2690,2692,2695],{"class":452,"line":613},[450,2678,2679],{"class":559},"  refreshSession",[450,2681,585],{"class":460},[450,2683,2684],{"class":460}," ()",[450,2686,674],{"class":546},[450,2688,2689],{"class":566}," Promise",[450,2691,563],{"class":460},[450,2693,2694],{"class":566},"boolean",[450,2696,1250],{"class":460},[450,2698,2699,2701],{"class":452,"line":633},[450,2700,603],{"class":460},[450,2702,677],{"class":460},[450,2704,2705,2707,2709,2711,2713,2715,2717,2719,2721,2724,2726,2728,2730,2733,2735,2737],{"class":452,"line":638},[450,2706,1566],{"class":464},[450,2708,650],{"class":460},[450,2710,434],{"class":559},[450,2712,572],{"class":581},[450,2714,481],{"class":460},[450,2716,914],{"class":477},[450,2718,481],{"class":460},[450,2720,781],{"class":460},[450,2722,2723],{"class":546}," async",[450,2725,921],{"class":460},[450,2727,924],{"class":668},[450,2729,781],{"class":460},[450,2731,2732],{"class":668}," context",[450,2734,603],{"class":460},[450,2736,674],{"class":546},[450,2738,677],{"class":460},[450,2740,2741],{"class":452,"line":645},[450,2742,2743],{"class":641},"    \u002F\u002F the server sets a new session cookie, then the whole call is sent again\n",[450,2745,2746,2749,2751,2754,2757,2760,2763,2765,2768,2770],{"class":452,"line":656},[450,2747,2748],{"class":456},"    if",[450,2750,921],{"class":581},[450,2752,2753],{"class":456},"await",[450,2755,2756],{"class":559}," refreshSession",[450,2758,2759],{"class":581},"()) ",[450,2761,2762],{"class":464},"context",[450,2764,650],{"class":460},[450,2766,2767],{"class":559},"retry",[450,2769,722],{"class":581},[450,2771,484],{"class":460},[450,2773,2774,2776,2778],{"class":452,"line":680},[450,2775,735],{"class":460},[450,2777,603],{"class":581},[450,2779,484],{"class":460},[450,2781,2782],{"class":452,"line":686},[450,2783,1305],{"class":460},[450,2785,2786],{"class":452,"line":732},[450,2787,540],{"emptyLinePlaceholder":539},[450,2789,2790,2792,2794,2796,2798,2800,2802,2804],{"class":452,"line":741},[450,2791,616],{"class":546},[450,2793,619],{"class":546},[450,2795,2756],{"class":559},[450,2797,625],{"class":460},[450,2799,2689],{"class":566},[450,2801,563],{"class":460},[450,2803,2694],{"class":566},[450,2805,2806],{"class":460},">;\n",[450,2808,2809],{"class":452,"line":761},[450,2810,540],{"emptyLinePlaceholder":539},[450,2812,2813,2815,2817,2819,2821,2824,2826,2828,2830,2832,2834,2836,2838],{"class":452,"line":814},[450,2814,547],{"class":546},[450,2816,461],{"class":460},[450,2818,1905],{"class":464},[450,2820,781],{"class":460},[450,2822,2823],{"class":464}," middlewares",[450,2825,468],{"class":460},[450,2827,556],{"class":460},[450,2829,560],{"class":559},[450,2831,563],{"class":460},[450,2833,520],{"class":566},[450,2835,569],{"class":460},[450,2837,572],{"class":464},[450,2839,575],{"class":460},[450,2841,2842,2844,2846,2848,2850,2852],{"class":452,"line":823},[450,2843,582],{"class":581},[450,2845,585],{"class":460},[450,2847,474],{"class":460},[450,2849,590],{"class":477},[450,2851,481],{"class":460},[450,2853,595],{"class":460},[450,2855,2856,2858,2860],{"class":452,"line":828},[450,2857,468],{"class":460},[450,2859,603],{"class":464},[450,2861,484],{"class":460},[450,2863,2864,2867,2870,2872,2874,2876,2879],{"class":452,"line":834},[450,2865,2866],{"class":559},"useAuth",[450,2868,2869],{"class":464},"(middlewares",[450,2871,650],{"class":460},[450,2873,2055],{"class":464},[450,2875,781],{"class":460},[450,2877,2878],{"class":464}," refreshSession)",[450,2880,484],{"class":460},[450,2882,2883,2885,2887,2889,2891,2893,2895,2897,2899,2901],{"class":452,"line":844},[450,2884,411],{"class":464},[450,2886,650],{"class":460},[450,2888,669],{"class":464},[450,2890,650],{"class":460},[450,2892,426],{"class":559},[450,2894,572],{"class":464},[450,2896,572],{"class":460},[450,2898,669],{"class":668},[450,2900,603],{"class":460},[450,2902,2271],{"class":546},[450,2904,2905,2907,2909,2911,2913,2915,2917,2919,2921,2923,2925,2927,2929,2931,2933,2935],{"class":452,"line":864},[450,2906,1545],{"class":559},[450,2908,572],{"class":464},[450,2910,694],{"class":460},[450,2912,697],{"class":559},[450,2914,572],{"class":464},[450,2916,702],{"class":460},[450,2918,481],{"class":460},[450,2920,707],{"class":581},[450,2922,481],{"class":460},[450,2924,585],{"class":460},[450,2926,714],{"class":464},[450,2928,650],{"class":460},[450,2930,719],{"class":559},[450,2932,722],{"class":464},[450,2934,468],{"class":460},[450,2936,2937],{"class":464},"))\n",[450,2939,2940,2942],{"class":452,"line":896},[450,2941,603],{"class":464},[450,2943,484],{"class":460},[450,2945,2946],{"class":452,"line":903},[450,2947,540],{"emptyLinePlaceholder":539},[450,2949,2950,2952,2954,2956,2958,2960,2962,2964,2966,2968,2970,2972,2974,2976,2978,2980,2982,2984,2986,2988],{"class":452,"line":933},[450,2951,547],{"class":546},[450,2953,1949],{"class":460},[450,2955,1952],{"class":464},[450,2957,1285],{"class":460},[450,2959,556],{"class":460},[450,2961,1968],{"class":456},[450,2963,1971],{"class":464},[450,2965,650],{"class":460},[450,2967,1976],{"class":464},[450,2969,650],{"class":460},[450,2971,1952],{"class":559},[450,2973,572],{"class":464},[450,2975,1986],{"class":1985},[450,2977,781],{"class":460},[450,2979,1991],{"class":1985},[450,2981,603],{"class":464},[450,2983,650],{"class":460},[450,2985,1998],{"class":559},[450,2987,722],{"class":464},[450,2989,484],{"class":460},[1789,2991,2992,2993,2996],{},"The build fails with ",[409,2994,2995],{},"rpc-client-middleware-not-set-up"," when a called route runs a middleware with required params and the client never sets it up.",[2998,2999,3000],"style",{},"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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}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 .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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}","Send middleware data, read middleware results and share client behaviour.","md",null,{"toc":24},{"title":88,"description":3001},"fU5FC3zKFbGNflO6jt_jaf8N4ezleJyFyMhEQOQVjRk",1793324370250]