[{"data":1,"prerenderedAt":3184},["ShallowReactive",2],{"navigation_docs":3,"-rpc-server-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":36,"body":401,"description":3178,"extension":3179,"links":3180,"meta":3181,"navigation":527,"path":37,"seo":3182,"stem":38,"__hash__":3183},"docs\u002F01.rpc\u002F02.server\u002F02.middleware.md",{"type":402,"value":403},"minimark",[404,424,430,438,443,826,830,842,846,859,866,870,876,1500,1552,1556,1560,1575,1977,1980,1983,1986,1989,1992,1997,2344,2353,2357,2361,2365,2379,2386,2389,2393,2396,3168,3174],[405,406,407,408,412,413,418,419,423],"p",{},"Declare a middleware with ",[409,410,411],"code",{},"mion.middleware",", one of the helpers ",[414,415,417],"a",{"href":416},"\u002Frpc\u002Fserver\u002Froutes#creating-the-router","the router"," returns. Middleware runs before or after a route and chains together into the route's ",[414,420,422],{"href":421},"#execution-chain","Execution Chain",".",[405,425,426,427,423],{},"Use it for the extra work a route needs, like authorization, rate limiting, CORS or logging. mion also ships ",[414,428,429],{"href":71},"ready-made middleware",[405,431,432,433,435,436,423],{},"The first parameter is always the ",[414,434,40],{"href":41},". The other parameters come from the client, decoded and validated before the middleware runs. To read or set HTTP headers, see ",[414,437,44],{"href":45},[439,440,442],"h2",{"id":441},"defining-a-middleware","Defining a Middleware",[444,445,450],"pre",{"className":446,"code":447,"language":448,"meta":449,"style":449},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import {createMionRouter, Routes} from '@mionjs\u002Frouter';\nimport {myApp, getSharedData} from '.\u002Ffull-example.app.ts';\n\nconst mion = createMionRouter({contextDataFactory: getSharedData});\n\nconst routes = {\n  logger: mion.middleware(\n    async (ctx): Promise\u003Cvoid> => {\n      \u002F\u002F the error that ended the request, thrown or a returned FatalError\n      const fatal = ctx.response.fatalError;\n      if (fatal) await myApp.cloudLogs.error(ctx.path, fatal);\n      else myApp.cloudLogs.log(ctx.path, ctx.shared.me?.name);\n    },\n    \u002F\u002F alwaysRun: the logger runs even after an error ended the request\n    {alwaysRun: true}\n  ),\n  \u002F\u002F ... other routes and middleware\n} satisfies Routes;\n","ts","",[409,451,452,494,522,529,568,573,586,605,639,646,673,720,769,775,781,799,808,814],{"__ignoreMap":449},[453,454,457,461,465,469,472,475,478,481,484,488,491],"span",{"class":455,"line":456},"line",1,[453,458,460],{"class":459},"s7zQu","import",[453,462,464],{"class":463},"sMK4o"," {",[453,466,468],{"class":467},"sTEyZ","createMionRouter",[453,470,471],{"class":463},",",[453,473,474],{"class":467}," Routes",[453,476,477],{"class":463},"}",[453,479,480],{"class":459}," from",[453,482,483],{"class":463}," '",[453,485,487],{"class":486},"sfazB","@mionjs\u002Frouter",[453,489,490],{"class":463},"'",[453,492,493],{"class":463},";\n",[453,495,497,499,501,504,506,509,511,513,515,518,520],{"class":455,"line":496},2,[453,498,460],{"class":459},[453,500,464],{"class":463},[453,502,503],{"class":467},"myApp",[453,505,471],{"class":463},[453,507,508],{"class":467}," getSharedData",[453,510,477],{"class":463},[453,512,480],{"class":459},[453,514,483],{"class":463},[453,516,517],{"class":486},".\u002Ffull-example.app.ts",[453,519,490],{"class":463},[453,521,493],{"class":463},[453,523,525],{"class":455,"line":524},3,[453,526,528],{"emptyLinePlaceholder":527},true,"\n",[453,530,532,536,539,542,546,549,552,556,559,561,563,566],{"class":455,"line":531},4,[453,533,535],{"class":534},"spNyl","const",[453,537,538],{"class":467}," mion ",[453,540,541],{"class":463},"=",[453,543,545],{"class":544},"s2Zo4"," createMionRouter",[453,547,548],{"class":467},"(",[453,550,551],{"class":463},"{",[453,553,555],{"class":554},"swJcz","contextDataFactory",[453,557,558],{"class":463},":",[453,560,508],{"class":467},[453,562,477],{"class":463},[453,564,565],{"class":467},")",[453,567,493],{"class":463},[453,569,571],{"class":455,"line":570},5,[453,572,528],{"emptyLinePlaceholder":527},[453,574,576,578,581,583],{"class":455,"line":575},6,[453,577,535],{"class":534},[453,579,580],{"class":467}," routes ",[453,582,541],{"class":463},[453,584,585],{"class":463}," {\n",[453,587,589,592,594,597,599,602],{"class":455,"line":588},7,[453,590,591],{"class":554},"  logger",[453,593,558],{"class":463},[453,595,596],{"class":467}," mion",[453,598,423],{"class":463},[453,600,601],{"class":544},"middleware",[453,603,604],{"class":467},"(\n",[453,606,608,611,614,618,621,625,628,631,634,637],{"class":455,"line":607},8,[453,609,610],{"class":534},"    async",[453,612,613],{"class":463}," (",[453,615,617],{"class":616},"sHdIc","ctx",[453,619,620],{"class":463},"):",[453,622,624],{"class":623},"sBMFI"," Promise",[453,626,627],{"class":463},"\u003C",[453,629,630],{"class":623},"void",[453,632,633],{"class":463},">",[453,635,636],{"class":534}," =>",[453,638,585],{"class":463},[453,640,642],{"class":455,"line":641},9,[453,643,645],{"class":644},"sHwdD","      \u002F\u002F the error that ended the request, thrown or a returned FatalError\n",[453,647,649,652,655,658,661,663,666,668,671],{"class":455,"line":648},10,[453,650,651],{"class":534},"      const",[453,653,654],{"class":467}," fatal",[453,656,657],{"class":463}," =",[453,659,660],{"class":467}," ctx",[453,662,423],{"class":463},[453,664,665],{"class":467},"response",[453,667,423],{"class":463},[453,669,670],{"class":467},"fatalError",[453,672,493],{"class":463},[453,674,676,679,681,684,687,690,693,695,698,700,703,705,707,709,712,714,716,718],{"class":455,"line":675},11,[453,677,678],{"class":459},"      if",[453,680,613],{"class":554},[453,682,683],{"class":467},"fatal",[453,685,686],{"class":554},") ",[453,688,689],{"class":459},"await",[453,691,692],{"class":467}," myApp",[453,694,423],{"class":463},[453,696,697],{"class":467},"cloudLogs",[453,699,423],{"class":463},[453,701,702],{"class":544},"error",[453,704,548],{"class":554},[453,706,617],{"class":467},[453,708,423],{"class":463},[453,710,711],{"class":467},"path",[453,713,471],{"class":463},[453,715,654],{"class":467},[453,717,565],{"class":554},[453,719,493],{"class":463},[453,721,723,726,728,730,732,734,737,739,741,743,745,747,749,751,754,756,759,762,765,767],{"class":455,"line":722},12,[453,724,725],{"class":459},"      else",[453,727,692],{"class":467},[453,729,423],{"class":463},[453,731,697],{"class":467},[453,733,423],{"class":463},[453,735,736],{"class":544},"log",[453,738,548],{"class":554},[453,740,617],{"class":467},[453,742,423],{"class":463},[453,744,711],{"class":467},[453,746,471],{"class":463},[453,748,660],{"class":467},[453,750,423],{"class":463},[453,752,753],{"class":467},"shared",[453,755,423],{"class":463},[453,757,758],{"class":467},"me",[453,760,761],{"class":463},"?.",[453,763,764],{"class":467},"name",[453,766,565],{"class":554},[453,768,493],{"class":463},[453,770,772],{"class":455,"line":771},13,[453,773,774],{"class":463},"    },\n",[453,776,778],{"class":455,"line":777},14,[453,779,780],{"class":644},"    \u002F\u002F alwaysRun: the logger runs even after an error ended the request\n",[453,782,784,787,790,792,796],{"class":455,"line":783},15,[453,785,786],{"class":463},"    {",[453,788,789],{"class":554},"alwaysRun",[453,791,558],{"class":463},[453,793,795],{"class":794},"sfNiH"," true",[453,797,798],{"class":463},"}\n",[453,800,802,805],{"class":455,"line":801},16,[453,803,804],{"class":467},"  )",[453,806,807],{"class":463},",\n",[453,809,811],{"class":455,"line":810},17,[453,812,813],{"class":644},"  \u002F\u002F ... other routes and middleware\n",[453,815,817,819,822,824],{"class":455,"line":816},18,[453,818,477],{"class":463},[453,820,821],{"class":459}," satisfies",[453,823,474],{"class":623},[453,825,493],{"class":463},[439,827,829],{"id":828},"sharing-a-middleware","Sharing a Middleware",[405,831,832,833,836,837,841],{},"Export its plain handler, and each app places it with ",[409,834,835],{},"mion.middleware(handler)",". Put its ",[414,838,840],{"href":839},"\u002Frpc\u002Fclient\u002Fclient-middleware#reusable-client-middleware","client installer"," in a separate entry point, so a client never imports the router.",[439,843,845],{"id":844},"always-run","Always Run",[405,847,848,849,852,853,856,857,423],{},"A thrown error or a returned ",[409,850,851],{},"FatalError"," ends the request: the remaining middleware and the route do not run. A plain returned ",[409,854,855],{},"RpcError"," stops nothing, see ",[414,858,48],{"href":49},[405,860,861,862,865],{},"A middleware with ",[409,863,864],{},"alwaysRun: true",", like the logger above, runs anyway, on every request.",[439,867,869],{"id":868},"requests-that-already-failed","Requests That Already Failed",[405,871,872,873,875],{},"Only middleware that declares ",[409,874,789],{}," runs for a request that failed before its route could run. None of these requests is parsed, and the two 404s never read the body.",[444,877,879],{"className":446,"code":878,"language":448,"meta":449,"style":449},"import {\n  createMionRouter,\n  addStartMiddlewares,\n  addEndMiddlewares,\n} from '@mionjs\u002Frouter';\n\nconst mion = createMionRouter();\n\n\u002F\u002F alwaysRun: a rate limiter must also see requests that already failed\nconst rateLimit = mion.rawMiddleware(\n  (ctx): void => {\n    console.log('incoming', ctx.path);\n  },\n  {alwaysRun: true}\n);\n\n\u002F\u002F a global end middleware with alwaysRun sees every answer, a 404 and a 413 included\nconst accessLog = mion.rawMiddleware(\n  (ctx): void => {\n    console.log(ctx.path, ctx.response.statusCode);\n  },\n  {alwaysRun: true}\n);\n\n\u002F\u002F no alwaysRun: no session is loaded for a request refused anyway\nconst loadSession = mion.rawMiddleware((ctx): void => {\n  console.log('loading the session for', ctx.path);\n});\n\n\u002F\u002F registered BEFORE initRoutes: they are added to every chain the router builds\naddStartMiddlewares({rateLimit, loadSession});\naddEndMiddlewares({accessLog});\n\nconst sayHello = mion.route((ctx, name: string): string => `Hello ${name}`);\n\n\u002F\u002F declared beside the routes, so it never runs on either 404\nconst auth = mion.middleware((ctx): void => {\n  if (!ctx.request.headers.get('cookie')?.includes('session='))\n    throw new Error('unauthorized');\n});\n\nmion.initRoutes({auth, sayHello});\n",[409,880,881,887,894,901,908,922,926,941,945,950,968,984,1014,1019,1032,1038,1042,1047,1064,1079,1113,1118,1131,1138,1143,1149,1179,1210,1219,1224,1230,1254,1273,1278,1335,1340,1346,1376,1432,1457,1466,1471],{"__ignoreMap":449},[453,882,883,885],{"class":455,"line":456},[453,884,460],{"class":459},[453,886,585],{"class":463},[453,888,889,892],{"class":455,"line":496},[453,890,891],{"class":467},"  createMionRouter",[453,893,807],{"class":463},[453,895,896,899],{"class":455,"line":524},[453,897,898],{"class":467},"  addStartMiddlewares",[453,900,807],{"class":463},[453,902,903,906],{"class":455,"line":531},[453,904,905],{"class":467},"  addEndMiddlewares",[453,907,807],{"class":463},[453,909,910,912,914,916,918,920],{"class":455,"line":570},[453,911,477],{"class":463},[453,913,480],{"class":459},[453,915,483],{"class":463},[453,917,487],{"class":486},[453,919,490],{"class":463},[453,921,493],{"class":463},[453,923,924],{"class":455,"line":575},[453,925,528],{"emptyLinePlaceholder":527},[453,927,928,930,932,934,936,939],{"class":455,"line":588},[453,929,535],{"class":534},[453,931,538],{"class":467},[453,933,541],{"class":463},[453,935,545],{"class":544},[453,937,938],{"class":467},"()",[453,940,493],{"class":463},[453,942,943],{"class":455,"line":607},[453,944,528],{"emptyLinePlaceholder":527},[453,946,947],{"class":455,"line":641},[453,948,949],{"class":644},"\u002F\u002F alwaysRun: a rate limiter must also see requests that already failed\n",[453,951,952,954,957,959,961,963,966],{"class":455,"line":648},[453,953,535],{"class":534},[453,955,956],{"class":467}," rateLimit ",[453,958,541],{"class":463},[453,960,596],{"class":467},[453,962,423],{"class":463},[453,964,965],{"class":544},"rawMiddleware",[453,967,604],{"class":467},[453,969,970,973,975,977,980,982],{"class":455,"line":675},[453,971,972],{"class":463},"  (",[453,974,617],{"class":616},[453,976,620],{"class":463},[453,978,979],{"class":623}," void",[453,981,636],{"class":534},[453,983,585],{"class":463},[453,985,986,989,991,993,995,997,1000,1002,1004,1006,1008,1010,1012],{"class":455,"line":722},[453,987,988],{"class":467},"    console",[453,990,423],{"class":463},[453,992,736],{"class":544},[453,994,548],{"class":554},[453,996,490],{"class":463},[453,998,999],{"class":486},"incoming",[453,1001,490],{"class":463},[453,1003,471],{"class":463},[453,1005,660],{"class":467},[453,1007,423],{"class":463},[453,1009,711],{"class":467},[453,1011,565],{"class":554},[453,1013,493],{"class":463},[453,1015,1016],{"class":455,"line":771},[453,1017,1018],{"class":463},"  },\n",[453,1020,1021,1024,1026,1028,1030],{"class":455,"line":777},[453,1022,1023],{"class":463},"  {",[453,1025,789],{"class":554},[453,1027,558],{"class":463},[453,1029,795],{"class":794},[453,1031,798],{"class":463},[453,1033,1034,1036],{"class":455,"line":783},[453,1035,565],{"class":467},[453,1037,493],{"class":463},[453,1039,1040],{"class":455,"line":801},[453,1041,528],{"emptyLinePlaceholder":527},[453,1043,1044],{"class":455,"line":810},[453,1045,1046],{"class":644},"\u002F\u002F a global end middleware with alwaysRun sees every answer, a 404 and a 413 included\n",[453,1048,1049,1051,1054,1056,1058,1060,1062],{"class":455,"line":816},[453,1050,535],{"class":534},[453,1052,1053],{"class":467}," accessLog ",[453,1055,541],{"class":463},[453,1057,596],{"class":467},[453,1059,423],{"class":463},[453,1061,965],{"class":544},[453,1063,604],{"class":467},[453,1065,1067,1069,1071,1073,1075,1077],{"class":455,"line":1066},19,[453,1068,972],{"class":463},[453,1070,617],{"class":616},[453,1072,620],{"class":463},[453,1074,979],{"class":623},[453,1076,636],{"class":534},[453,1078,585],{"class":463},[453,1080,1082,1084,1086,1088,1090,1092,1094,1096,1098,1100,1102,1104,1106,1109,1111],{"class":455,"line":1081},20,[453,1083,988],{"class":467},[453,1085,423],{"class":463},[453,1087,736],{"class":544},[453,1089,548],{"class":554},[453,1091,617],{"class":467},[453,1093,423],{"class":463},[453,1095,711],{"class":467},[453,1097,471],{"class":463},[453,1099,660],{"class":467},[453,1101,423],{"class":463},[453,1103,665],{"class":467},[453,1105,423],{"class":463},[453,1107,1108],{"class":467},"statusCode",[453,1110,565],{"class":554},[453,1112,493],{"class":463},[453,1114,1116],{"class":455,"line":1115},21,[453,1117,1018],{"class":463},[453,1119,1121,1123,1125,1127,1129],{"class":455,"line":1120},22,[453,1122,1023],{"class":463},[453,1124,789],{"class":554},[453,1126,558],{"class":463},[453,1128,795],{"class":794},[453,1130,798],{"class":463},[453,1132,1134,1136],{"class":455,"line":1133},23,[453,1135,565],{"class":467},[453,1137,493],{"class":463},[453,1139,1141],{"class":455,"line":1140},24,[453,1142,528],{"emptyLinePlaceholder":527},[453,1144,1146],{"class":455,"line":1145},25,[453,1147,1148],{"class":644},"\u002F\u002F no alwaysRun: no session is loaded for a request refused anyway\n",[453,1150,1152,1154,1157,1159,1161,1163,1165,1167,1169,1171,1173,1175,1177],{"class":455,"line":1151},26,[453,1153,535],{"class":534},[453,1155,1156],{"class":467}," loadSession ",[453,1158,541],{"class":463},[453,1160,596],{"class":467},[453,1162,423],{"class":463},[453,1164,965],{"class":544},[453,1166,548],{"class":467},[453,1168,548],{"class":463},[453,1170,617],{"class":616},[453,1172,620],{"class":463},[453,1174,979],{"class":623},[453,1176,636],{"class":534},[453,1178,585],{"class":463},[453,1180,1182,1185,1187,1189,1191,1193,1196,1198,1200,1202,1204,1206,1208],{"class":455,"line":1181},27,[453,1183,1184],{"class":467},"  console",[453,1186,423],{"class":463},[453,1188,736],{"class":544},[453,1190,548],{"class":554},[453,1192,490],{"class":463},[453,1194,1195],{"class":486},"loading the session for",[453,1197,490],{"class":463},[453,1199,471],{"class":463},[453,1201,660],{"class":467},[453,1203,423],{"class":463},[453,1205,711],{"class":467},[453,1207,565],{"class":554},[453,1209,493],{"class":463},[453,1211,1213,1215,1217],{"class":455,"line":1212},28,[453,1214,477],{"class":463},[453,1216,565],{"class":467},[453,1218,493],{"class":463},[453,1220,1222],{"class":455,"line":1221},29,[453,1223,528],{"emptyLinePlaceholder":527},[453,1225,1227],{"class":455,"line":1226},30,[453,1228,1229],{"class":644},"\u002F\u002F registered BEFORE initRoutes: they are added to every chain the router builds\n",[453,1231,1233,1236,1238,1240,1243,1245,1248,1250,1252],{"class":455,"line":1232},31,[453,1234,1235],{"class":544},"addStartMiddlewares",[453,1237,548],{"class":467},[453,1239,551],{"class":463},[453,1241,1242],{"class":467},"rateLimit",[453,1244,471],{"class":463},[453,1246,1247],{"class":467}," loadSession",[453,1249,477],{"class":463},[453,1251,565],{"class":467},[453,1253,493],{"class":463},[453,1255,1257,1260,1262,1264,1267,1269,1271],{"class":455,"line":1256},32,[453,1258,1259],{"class":544},"addEndMiddlewares",[453,1261,548],{"class":467},[453,1263,551],{"class":463},[453,1265,1266],{"class":467},"accessLog",[453,1268,477],{"class":463},[453,1270,565],{"class":467},[453,1272,493],{"class":463},[453,1274,1276],{"class":455,"line":1275},33,[453,1277,528],{"emptyLinePlaceholder":527},[453,1279,1281,1283,1286,1288,1290,1292,1295,1297,1299,1301,1303,1306,1308,1311,1313,1315,1317,1320,1323,1326,1328,1331,1333],{"class":455,"line":1280},34,[453,1282,535],{"class":534},[453,1284,1285],{"class":467}," sayHello ",[453,1287,541],{"class":463},[453,1289,596],{"class":467},[453,1291,423],{"class":463},[453,1293,1294],{"class":544},"route",[453,1296,548],{"class":467},[453,1298,548],{"class":463},[453,1300,617],{"class":616},[453,1302,471],{"class":463},[453,1304,1305],{"class":616}," name",[453,1307,558],{"class":463},[453,1309,1310],{"class":623}," string",[453,1312,620],{"class":463},[453,1314,1310],{"class":623},[453,1316,636],{"class":534},[453,1318,1319],{"class":463}," `",[453,1321,1322],{"class":486},"Hello ",[453,1324,1325],{"class":463},"${",[453,1327,764],{"class":467},[453,1329,1330],{"class":463},"}`",[453,1332,565],{"class":467},[453,1334,493],{"class":463},[453,1336,1338],{"class":455,"line":1337},35,[453,1339,528],{"emptyLinePlaceholder":527},[453,1341,1343],{"class":455,"line":1342},36,[453,1344,1345],{"class":644},"\u002F\u002F declared beside the routes, so it never runs on either 404\n",[453,1347,1349,1351,1354,1356,1358,1360,1362,1364,1366,1368,1370,1372,1374],{"class":455,"line":1348},37,[453,1350,535],{"class":534},[453,1352,1353],{"class":467}," auth ",[453,1355,541],{"class":463},[453,1357,596],{"class":467},[453,1359,423],{"class":463},[453,1361,601],{"class":544},[453,1363,548],{"class":467},[453,1365,548],{"class":463},[453,1367,617],{"class":616},[453,1369,620],{"class":463},[453,1371,979],{"class":623},[453,1373,636],{"class":534},[453,1375,585],{"class":463},[453,1377,1379,1382,1384,1387,1389,1391,1394,1396,1399,1401,1404,1406,1408,1411,1413,1415,1417,1420,1422,1424,1427,1429],{"class":455,"line":1378},38,[453,1380,1381],{"class":459},"  if",[453,1383,613],{"class":554},[453,1385,1386],{"class":463},"!",[453,1388,617],{"class":467},[453,1390,423],{"class":463},[453,1392,1393],{"class":467},"request",[453,1395,423],{"class":463},[453,1397,1398],{"class":467},"headers",[453,1400,423],{"class":463},[453,1402,1403],{"class":544},"get",[453,1405,548],{"class":554},[453,1407,490],{"class":463},[453,1409,1410],{"class":486},"cookie",[453,1412,490],{"class":463},[453,1414,565],{"class":554},[453,1416,761],{"class":463},[453,1418,1419],{"class":544},"includes",[453,1421,548],{"class":554},[453,1423,490],{"class":463},[453,1425,1426],{"class":486},"session=",[453,1428,490],{"class":463},[453,1430,1431],{"class":554},"))\n",[453,1433,1435,1438,1441,1444,1446,1448,1451,1453,1455],{"class":455,"line":1434},39,[453,1436,1437],{"class":459},"    throw",[453,1439,1440],{"class":463}," new",[453,1442,1443],{"class":544}," Error",[453,1445,548],{"class":554},[453,1447,490],{"class":463},[453,1449,1450],{"class":486},"unauthorized",[453,1452,490],{"class":463},[453,1454,565],{"class":554},[453,1456,493],{"class":463},[453,1458,1460,1462,1464],{"class":455,"line":1459},40,[453,1461,477],{"class":463},[453,1463,565],{"class":467},[453,1465,493],{"class":463},[453,1467,1469],{"class":455,"line":1468},41,[453,1470,528],{"emptyLinePlaceholder":527},[453,1472,1474,1477,1479,1482,1484,1486,1489,1491,1494,1496,1498],{"class":455,"line":1473},42,[453,1475,1476],{"class":467},"mion",[453,1478,423],{"class":463},[453,1480,1481],{"class":544},"initRoutes",[453,1483,548],{"class":467},[453,1485,551],{"class":463},[453,1487,1488],{"class":467},"auth",[453,1490,471],{"class":463},[453,1492,1493],{"class":467}," sayHello",[453,1495,477],{"class":463},[453,1497,565],{"class":467},[453,1499,493],{"class":463},[1501,1502,1503,1516],"table",{},[1504,1505,1506],"thead",{},[1507,1508,1509,1513],"tr",{},[1510,1511,1512],"th",{},"Request",[1510,1514,1515],{},"Answer",[1517,1518,1519,1531,1541],"tbody",{},[1507,1520,1521,1525],{},[1522,1523,1524],"td",{},"A path that names no route",[1522,1526,1527,1528],{},"404, ",[409,1529,1530],{},"route-not-found",[1507,1532,1533,1536],{},[1522,1534,1535],{},"A batch id the server does not know",[1522,1537,1527,1538],{},[409,1539,1540],{},"batch-unknown-id",[1507,1542,1543,1546],{},[1522,1544,1545],{},"A body the platform adapter refused",[1522,1547,1548,1549],{},"413, ",[409,1550,1551],{},"request-payload-too-large",[1553,1554,1555],"tip",{},"On AWS Lambda and Google Cloud Functions the platform hands over the whole body, so the router refuses an oversized one. Middleware registered before that point still runs.",[439,1557,1559],{"id":1558},"raw-middleware","Raw Middleware",[405,1561,1562,1563,1566,1567,1570,1571,1574],{},"Use ",[409,1564,1565],{},"mion.rawMiddleware"," to access the platform's native request and response. It receives the ",[409,1568,1569],{},"CallContext",", the raw request, the raw response and the ",[409,1572,1573],{},"RouterOptions",". It gets no remote parameters and returns no data: it can only change the context and return or throw errors.",[444,1576,1578],{"className":446,"code":1577,"language":448,"meta":449,"style":449},"import {createMionRouter, Routes} from '@mionjs\u002Frouter';\nimport {IncomingMessage, ServerResponse} from 'http';\n\nconst mion = createMionRouter();\ntype HttpRequest = IncomingMessage & {body: any};\n\nconst routes = {\n  progress: mion.rawMiddleware(\n    async (\n      ctx,\n      rawRequest: HttpRequest,\n      rawResponse: ServerResponse\n    ): Promise\u003Cvoid> => {\n      return new Promise((resolve) => {\n        const maxTime = 1000;\n        const increment = 10;\n        let total = 0;\n        const intervale = setInterval(() => {\n          if (total >= maxTime) {\n            clearInterval(intervale);\n            resolve();\n          }\n          total += increment;\n          rawResponse.write(`\\n${total}%`);\n        }, increment);\n      });\n    }\n  ),\n  \u002F\u002F ... other routes and middleware\n} satisfies Routes;\n",[409,1579,1580,1604,1631,1635,1649,1678,1682,1692,1707,1714,1721,1728,1733,1752,1774,1790,1804,1819,1839,1859,1873,1882,1887,1899,1932,1943,1952,1957,1963,1967],{"__ignoreMap":449},[453,1581,1582,1584,1586,1588,1590,1592,1594,1596,1598,1600,1602],{"class":455,"line":456},[453,1583,460],{"class":459},[453,1585,464],{"class":463},[453,1587,468],{"class":467},[453,1589,471],{"class":463},[453,1591,474],{"class":467},[453,1593,477],{"class":463},[453,1595,480],{"class":459},[453,1597,483],{"class":463},[453,1599,487],{"class":486},[453,1601,490],{"class":463},[453,1603,493],{"class":463},[453,1605,1606,1608,1610,1613,1615,1618,1620,1622,1624,1627,1629],{"class":455,"line":496},[453,1607,460],{"class":459},[453,1609,464],{"class":463},[453,1611,1612],{"class":467},"IncomingMessage",[453,1614,471],{"class":463},[453,1616,1617],{"class":467}," ServerResponse",[453,1619,477],{"class":463},[453,1621,480],{"class":459},[453,1623,483],{"class":463},[453,1625,1626],{"class":486},"http",[453,1628,490],{"class":463},[453,1630,493],{"class":463},[453,1632,1633],{"class":455,"line":524},[453,1634,528],{"emptyLinePlaceholder":527},[453,1636,1637,1639,1641,1643,1645,1647],{"class":455,"line":531},[453,1638,535],{"class":534},[453,1640,538],{"class":467},[453,1642,541],{"class":463},[453,1644,545],{"class":544},[453,1646,938],{"class":467},[453,1648,493],{"class":463},[453,1650,1651,1654,1657,1659,1662,1665,1667,1670,1672,1675],{"class":455,"line":570},[453,1652,1653],{"class":534},"type",[453,1655,1656],{"class":623}," HttpRequest",[453,1658,657],{"class":463},[453,1660,1661],{"class":623}," IncomingMessage",[453,1663,1664],{"class":463}," &",[453,1666,464],{"class":463},[453,1668,1669],{"class":554},"body",[453,1671,558],{"class":463},[453,1673,1674],{"class":623}," any",[453,1676,1677],{"class":463},"};\n",[453,1679,1680],{"class":455,"line":575},[453,1681,528],{"emptyLinePlaceholder":527},[453,1683,1684,1686,1688,1690],{"class":455,"line":588},[453,1685,535],{"class":534},[453,1687,580],{"class":467},[453,1689,541],{"class":463},[453,1691,585],{"class":463},[453,1693,1694,1697,1699,1701,1703,1705],{"class":455,"line":607},[453,1695,1696],{"class":554},"  progress",[453,1698,558],{"class":463},[453,1700,596],{"class":467},[453,1702,423],{"class":463},[453,1704,965],{"class":544},[453,1706,604],{"class":467},[453,1708,1709,1711],{"class":455,"line":641},[453,1710,610],{"class":544},[453,1712,1713],{"class":467}," (\n",[453,1715,1716,1719],{"class":455,"line":648},[453,1717,1718],{"class":467},"      ctx",[453,1720,807],{"class":463},[453,1722,1723,1726],{"class":455,"line":675},[453,1724,1725],{"class":467},"      rawRequest: HttpRequest",[453,1727,807],{"class":463},[453,1729,1730],{"class":455,"line":722},[453,1731,1732],{"class":467},"      rawResponse: ServerResponse\n",[453,1734,1735,1738,1740,1742,1744,1746,1748,1750],{"class":455,"line":771},[453,1736,1737],{"class":467},"    )",[453,1739,558],{"class":463},[453,1741,624],{"class":623},[453,1743,627],{"class":463},[453,1745,630],{"class":623},[453,1747,633],{"class":463},[453,1749,636],{"class":534},[453,1751,585],{"class":463},[453,1753,1754,1757,1759,1761,1763,1765,1768,1770,1772],{"class":455,"line":777},[453,1755,1756],{"class":459},"      return",[453,1758,1440],{"class":463},[453,1760,624],{"class":623},[453,1762,548],{"class":554},[453,1764,548],{"class":463},[453,1766,1767],{"class":616},"resolve",[453,1769,565],{"class":463},[453,1771,636],{"class":534},[453,1773,585],{"class":463},[453,1775,1776,1779,1782,1784,1788],{"class":455,"line":783},[453,1777,1778],{"class":534},"        const",[453,1780,1781],{"class":467}," maxTime",[453,1783,657],{"class":463},[453,1785,1787],{"class":1786},"sbssI"," 1000",[453,1789,493],{"class":463},[453,1791,1792,1794,1797,1799,1802],{"class":455,"line":801},[453,1793,1778],{"class":534},[453,1795,1796],{"class":467}," increment",[453,1798,657],{"class":463},[453,1800,1801],{"class":1786}," 10",[453,1803,493],{"class":463},[453,1805,1806,1809,1812,1814,1817],{"class":455,"line":810},[453,1807,1808],{"class":534},"        let",[453,1810,1811],{"class":467}," total",[453,1813,657],{"class":463},[453,1815,1816],{"class":1786}," 0",[453,1818,493],{"class":463},[453,1820,1821,1823,1826,1828,1831,1833,1835,1837],{"class":455,"line":816},[453,1822,1778],{"class":534},[453,1824,1825],{"class":467}," intervale",[453,1827,657],{"class":463},[453,1829,1830],{"class":544}," setInterval",[453,1832,548],{"class":554},[453,1834,938],{"class":463},[453,1836,636],{"class":534},[453,1838,585],{"class":463},[453,1840,1841,1844,1846,1849,1852,1854,1856],{"class":455,"line":1066},[453,1842,1843],{"class":459},"          if",[453,1845,613],{"class":554},[453,1847,1848],{"class":467},"total",[453,1850,1851],{"class":463}," >=",[453,1853,1781],{"class":467},[453,1855,686],{"class":554},[453,1857,1858],{"class":463},"{\n",[453,1860,1861,1864,1866,1869,1871],{"class":455,"line":1081},[453,1862,1863],{"class":544},"            clearInterval",[453,1865,548],{"class":554},[453,1867,1868],{"class":467},"intervale",[453,1870,565],{"class":554},[453,1872,493],{"class":463},[453,1874,1875,1878,1880],{"class":455,"line":1115},[453,1876,1877],{"class":544},"            resolve",[453,1879,938],{"class":554},[453,1881,493],{"class":463},[453,1883,1884],{"class":455,"line":1120},[453,1885,1886],{"class":463},"          }\n",[453,1888,1889,1892,1895,1897],{"class":455,"line":1133},[453,1890,1891],{"class":467},"          total",[453,1893,1894],{"class":463}," +=",[453,1896,1796],{"class":467},[453,1898,493],{"class":463},[453,1900,1901,1904,1906,1909,1911,1914,1917,1919,1921,1923,1926,1928,1930],{"class":455,"line":1140},[453,1902,1903],{"class":467},"          rawResponse",[453,1905,423],{"class":463},[453,1907,1908],{"class":544},"write",[453,1910,548],{"class":554},[453,1912,1913],{"class":463},"`",[453,1915,1916],{"class":467},"\\n",[453,1918,1325],{"class":463},[453,1920,1848],{"class":467},[453,1922,477],{"class":463},[453,1924,1925],{"class":486},"%",[453,1927,1913],{"class":463},[453,1929,565],{"class":554},[453,1931,493],{"class":463},[453,1933,1934,1937,1939,1941],{"class":455,"line":1145},[453,1935,1936],{"class":463},"        },",[453,1938,1796],{"class":467},[453,1940,565],{"class":554},[453,1942,493],{"class":463},[453,1944,1945,1948,1950],{"class":455,"line":1151},[453,1946,1947],{"class":463},"      }",[453,1949,565],{"class":554},[453,1951,493],{"class":463},[453,1953,1954],{"class":455,"line":1181},[453,1955,1956],{"class":463},"    }\n",[453,1958,1959,1961],{"class":455,"line":1212},[453,1960,804],{"class":467},[453,1962,807],{"class":463},[453,1964,1965],{"class":455,"line":1221},[453,1966,813],{"class":644},[453,1968,1969,1971,1973,1975],{"class":455,"line":1226},[453,1970,477],{"class":463},[453,1972,821],{"class":459},[453,1974,474],{"class":623},[453,1976,493],{"class":463},[1553,1978,1979],{},"Raw middleware extends the router's core: the router itself uses it for the JSON round trip.",[1981,1982],"spacer",{},[439,1984,422],{"id":1985},"execution-chain",[405,1987,1988],{},"The Execution Chain is the list of middleware and the route that run on a route call: the middleware before the route, the route, then the middleware after it. It is built when the router starts, so it is the same for every request.",[405,1990,1991],{},"Everything in it runs in order, with no paths or conditions, unless an error occurs.",[1993,1994,1996],"h3",{"id":1995},"execution-order","Execution Order",[444,1998,2000],{"className":446,"code":1999,"language":448,"meta":449,"style":449},"import {createMionRouter, Routes} from '@mionjs\u002Frouter';\n\nconst mion = createMionRouter();\n\nconst routes = {\n  authorizationMiddleware: mion.middleware((): void => undefined),\n  users: {\n    userOnlyMiddleware: mion.middleware((): void => undefined), \u002F\u002F runs only for routes under users\n    getUser: mion.route((): null => null),\n    setUser: mion.route((): null => null),\n  },\n  pets: {\n    getPet: mion.route((): null => null),\n    setPet: mion.route((): null => null),\n  },\n  errorHandlerMiddleware: mion.middleware((): void => undefined),\n  loggingMiddleware: mion.middleware((): void => undefined),\n} satisfies Routes;\n\nexport const myValidApi = mion.initRoutes(routes);\n",[409,2001,2002,2026,2030,2044,2048,2058,2087,2096,2126,2154,2181,2185,2194,2221,2248,2252,2279,2306,2316,2320],{"__ignoreMap":449},[453,2003,2004,2006,2008,2010,2012,2014,2016,2018,2020,2022,2024],{"class":455,"line":456},[453,2005,460],{"class":459},[453,2007,464],{"class":463},[453,2009,468],{"class":467},[453,2011,471],{"class":463},[453,2013,474],{"class":467},[453,2015,477],{"class":463},[453,2017,480],{"class":459},[453,2019,483],{"class":463},[453,2021,487],{"class":486},[453,2023,490],{"class":463},[453,2025,493],{"class":463},[453,2027,2028],{"class":455,"line":496},[453,2029,528],{"emptyLinePlaceholder":527},[453,2031,2032,2034,2036,2038,2040,2042],{"class":455,"line":524},[453,2033,535],{"class":534},[453,2035,538],{"class":467},[453,2037,541],{"class":463},[453,2039,545],{"class":544},[453,2041,938],{"class":467},[453,2043,493],{"class":463},[453,2045,2046],{"class":455,"line":531},[453,2047,528],{"emptyLinePlaceholder":527},[453,2049,2050,2052,2054,2056],{"class":455,"line":570},[453,2051,535],{"class":534},[453,2053,580],{"class":467},[453,2055,541],{"class":463},[453,2057,585],{"class":463},[453,2059,2060,2063,2065,2067,2069,2071,2073,2076,2078,2080,2083,2085],{"class":455,"line":575},[453,2061,2062],{"class":554},"  authorizationMiddleware",[453,2064,558],{"class":463},[453,2066,596],{"class":467},[453,2068,423],{"class":463},[453,2070,601],{"class":544},[453,2072,548],{"class":467},[453,2074,2075],{"class":463},"():",[453,2077,979],{"class":623},[453,2079,636],{"class":534},[453,2081,2082],{"class":463}," undefined",[453,2084,565],{"class":467},[453,2086,807],{"class":463},[453,2088,2089,2092,2094],{"class":455,"line":588},[453,2090,2091],{"class":554},"  users",[453,2093,558],{"class":463},[453,2095,585],{"class":463},[453,2097,2098,2101,2103,2105,2107,2109,2111,2113,2115,2117,2119,2121,2123],{"class":455,"line":607},[453,2099,2100],{"class":554},"    userOnlyMiddleware",[453,2102,558],{"class":463},[453,2104,596],{"class":467},[453,2106,423],{"class":463},[453,2108,601],{"class":544},[453,2110,548],{"class":467},[453,2112,2075],{"class":463},[453,2114,979],{"class":623},[453,2116,636],{"class":534},[453,2118,2082],{"class":463},[453,2120,565],{"class":467},[453,2122,471],{"class":463},[453,2124,2125],{"class":644}," \u002F\u002F runs only for routes under users\n",[453,2127,2128,2131,2133,2135,2137,2139,2141,2143,2146,2148,2150,2152],{"class":455,"line":641},[453,2129,2130],{"class":554},"    getUser",[453,2132,558],{"class":463},[453,2134,596],{"class":467},[453,2136,423],{"class":463},[453,2138,1294],{"class":544},[453,2140,548],{"class":467},[453,2142,2075],{"class":463},[453,2144,2145],{"class":623}," null",[453,2147,636],{"class":534},[453,2149,2145],{"class":463},[453,2151,565],{"class":467},[453,2153,807],{"class":463},[453,2155,2156,2159,2161,2163,2165,2167,2169,2171,2173,2175,2177,2179],{"class":455,"line":648},[453,2157,2158],{"class":554},"    setUser",[453,2160,558],{"class":463},[453,2162,596],{"class":467},[453,2164,423],{"class":463},[453,2166,1294],{"class":544},[453,2168,548],{"class":467},[453,2170,2075],{"class":463},[453,2172,2145],{"class":623},[453,2174,636],{"class":534},[453,2176,2145],{"class":463},[453,2178,565],{"class":467},[453,2180,807],{"class":463},[453,2182,2183],{"class":455,"line":675},[453,2184,1018],{"class":463},[453,2186,2187,2190,2192],{"class":455,"line":722},[453,2188,2189],{"class":554},"  pets",[453,2191,558],{"class":463},[453,2193,585],{"class":463},[453,2195,2196,2199,2201,2203,2205,2207,2209,2211,2213,2215,2217,2219],{"class":455,"line":771},[453,2197,2198],{"class":554},"    getPet",[453,2200,558],{"class":463},[453,2202,596],{"class":467},[453,2204,423],{"class":463},[453,2206,1294],{"class":544},[453,2208,548],{"class":467},[453,2210,2075],{"class":463},[453,2212,2145],{"class":623},[453,2214,636],{"class":534},[453,2216,2145],{"class":463},[453,2218,565],{"class":467},[453,2220,807],{"class":463},[453,2222,2223,2226,2228,2230,2232,2234,2236,2238,2240,2242,2244,2246],{"class":455,"line":777},[453,2224,2225],{"class":554},"    setPet",[453,2227,558],{"class":463},[453,2229,596],{"class":467},[453,2231,423],{"class":463},[453,2233,1294],{"class":544},[453,2235,548],{"class":467},[453,2237,2075],{"class":463},[453,2239,2145],{"class":623},[453,2241,636],{"class":534},[453,2243,2145],{"class":463},[453,2245,565],{"class":467},[453,2247,807],{"class":463},[453,2249,2250],{"class":455,"line":783},[453,2251,1018],{"class":463},[453,2253,2254,2257,2259,2261,2263,2265,2267,2269,2271,2273,2275,2277],{"class":455,"line":801},[453,2255,2256],{"class":554},"  errorHandlerMiddleware",[453,2258,558],{"class":463},[453,2260,596],{"class":467},[453,2262,423],{"class":463},[453,2264,601],{"class":544},[453,2266,548],{"class":467},[453,2268,2075],{"class":463},[453,2270,979],{"class":623},[453,2272,636],{"class":534},[453,2274,2082],{"class":463},[453,2276,565],{"class":467},[453,2278,807],{"class":463},[453,2280,2281,2284,2286,2288,2290,2292,2294,2296,2298,2300,2302,2304],{"class":455,"line":810},[453,2282,2283],{"class":554},"  loggingMiddleware",[453,2285,558],{"class":463},[453,2287,596],{"class":467},[453,2289,423],{"class":463},[453,2291,601],{"class":544},[453,2293,548],{"class":467},[453,2295,2075],{"class":463},[453,2297,979],{"class":623},[453,2299,636],{"class":534},[453,2301,2082],{"class":463},[453,2303,565],{"class":467},[453,2305,807],{"class":463},[453,2307,2308,2310,2312,2314],{"class":455,"line":816},[453,2309,477],{"class":463},[453,2311,821],{"class":459},[453,2313,474],{"class":623},[453,2315,493],{"class":463},[453,2317,2318],{"class":455,"line":1066},[453,2319,528],{"emptyLinePlaceholder":527},[453,2321,2322,2325,2328,2331,2333,2335,2337,2339,2342],{"class":455,"line":1081},[453,2323,2324],{"class":459},"export",[453,2326,2327],{"class":534}," const",[453,2329,2330],{"class":467}," myValidApi ",[453,2332,541],{"class":463},[453,2334,596],{"class":467},[453,2336,423],{"class":463},[453,2338,1481],{"class":544},[453,2340,2341],{"class":467},"(routes)",[453,2343,493],{"class":463},[405,2345,2346],{},[2347,2348,2349,2350],"strong",{},"Generated Execution Chain for: ",[409,2351,2352],{},"pets.getPet",[2354,2355,2356],"mermaid",{},"\ngraph LR\n  A(authorizationMiddleware) --> B{{getPet}} --> E(errorHandlerMiddleware) --> C(loggingMiddleware)\n  style B color:var(--site-accent)\n",[2358,2359,2360],"note",{},"Order matters: middleware and routes run in the order they are defined, top down.",[1993,2362,2364],{"id":2363},"middleware-scope","Middleware Scope",[405,2366,2367,2368,2371,2372,2375,2376,423],{},"A middleware can run on a subset of routes only. The ",[409,2369,2370],{},"userOnlyMiddleware"," above runs only for the routes under ",[409,2373,2374],{},"users",", not those under ",[409,2377,2378],{},"pets",[405,2380,2381],{},[2347,2382,2349,2383],{},[409,2384,2385],{},"users.getUser",[2354,2387,2388],{},"\ngraph LR\n  A(authorizationMiddleware) --> B(userOnlyMiddleware) --> C{{getUser}} --> E(errorHandlerMiddleware) --> D(loggingMiddleware)\n  style B color:#f59e0b\n  style C color:var(--site-accent)\n",[1993,2390,2392],{"id":2391},"returning-data-beside-a-route","Returning Data Beside a Route",[405,2394,2395],{},"Use a middleware declared after a group's routes to return data beside each route's answer, like pagination.",[2397,2398,2399,2677],"code-split",{},[444,2400,2403],{"className":446,"code":2401,"filename":2402,"language":448,"meta":449,"style":449},"import {isRpcError} from '@mionjs\u002Fcore';\nimport {initClient} from '@mionjs\u002Fclient';\nimport type {PaginationApi} from '..\u002Frouter\u002Fpagination.routes.ts';\n\nconst {routes} = initClient\u003CPaginationApi>({baseURL: 'http:\u002F\u002Flocalhost:3000'});\n\n\u002F\u002F one call: the route's items, and the pagination middleware's answer at its path\nconst [products, error, response] = await routes.products.list(2).call();\nconst pagination = response.products?.pagination;\n\nif (!error && pagination && !isRpcError(pagination))\n  console.log(products?.length, 'of', pagination.total);\n","client.ts",[409,2404,2405,2427,2449,2474,2478,2522,2526,2531,2587,2609,2613,2640],{"__ignoreMap":449},[453,2406,2407,2409,2411,2414,2416,2418,2420,2423,2425],{"class":455,"line":456},[453,2408,460],{"class":459},[453,2410,464],{"class":463},[453,2412,2413],{"class":467},"isRpcError",[453,2415,477],{"class":463},[453,2417,480],{"class":459},[453,2419,483],{"class":463},[453,2421,2422],{"class":486},"@mionjs\u002Fcore",[453,2424,490],{"class":463},[453,2426,493],{"class":463},[453,2428,2429,2431,2433,2436,2438,2440,2442,2445,2447],{"class":455,"line":496},[453,2430,460],{"class":459},[453,2432,464],{"class":463},[453,2434,2435],{"class":467},"initClient",[453,2437,477],{"class":463},[453,2439,480],{"class":459},[453,2441,483],{"class":463},[453,2443,2444],{"class":486},"@mionjs\u002Fclient",[453,2446,490],{"class":463},[453,2448,493],{"class":463},[453,2450,2451,2453,2456,2458,2461,2463,2465,2467,2470,2472],{"class":455,"line":524},[453,2452,460],{"class":459},[453,2454,2455],{"class":459}," type",[453,2457,464],{"class":463},[453,2459,2460],{"class":467},"PaginationApi",[453,2462,477],{"class":463},[453,2464,480],{"class":459},[453,2466,483],{"class":463},[453,2468,2469],{"class":486},"..\u002Frouter\u002Fpagination.routes.ts",[453,2471,490],{"class":463},[453,2473,493],{"class":463},[453,2475,2476],{"class":455,"line":531},[453,2477,528],{"emptyLinePlaceholder":527},[453,2479,2480,2482,2484,2487,2489,2491,2494,2496,2498,2500,2502,2504,2507,2509,2511,2514,2516,2518,2520],{"class":455,"line":570},[453,2481,535],{"class":534},[453,2483,464],{"class":463},[453,2485,2486],{"class":467},"routes",[453,2488,477],{"class":463},[453,2490,657],{"class":463},[453,2492,2493],{"class":544}," initClient",[453,2495,627],{"class":463},[453,2497,2460],{"class":623},[453,2499,633],{"class":463},[453,2501,548],{"class":467},[453,2503,551],{"class":463},[453,2505,2506],{"class":554},"baseURL",[453,2508,558],{"class":463},[453,2510,483],{"class":463},[453,2512,2513],{"class":486},"http:\u002F\u002Flocalhost:3000",[453,2515,490],{"class":463},[453,2517,477],{"class":463},[453,2519,565],{"class":467},[453,2521,493],{"class":463},[453,2523,2524],{"class":455,"line":575},[453,2525,528],{"emptyLinePlaceholder":527},[453,2527,2528],{"class":455,"line":588},[453,2529,2530],{"class":644},"\u002F\u002F one call: the route's items, and the pagination middleware's answer at its path\n",[453,2532,2533,2535,2538,2541,2543,2546,2548,2551,2554,2556,2559,2562,2564,2566,2568,2571,2573,2576,2578,2580,2583,2585],{"class":455,"line":607},[453,2534,535],{"class":534},[453,2536,2537],{"class":463}," [",[453,2539,2540],{"class":467},"products",[453,2542,471],{"class":463},[453,2544,2545],{"class":467}," error",[453,2547,471],{"class":463},[453,2549,2550],{"class":467}," response",[453,2552,2553],{"class":463},"]",[453,2555,657],{"class":463},[453,2557,2558],{"class":459}," await",[453,2560,2561],{"class":467}," routes",[453,2563,423],{"class":463},[453,2565,2540],{"class":467},[453,2567,423],{"class":463},[453,2569,2570],{"class":544},"list",[453,2572,548],{"class":467},[453,2574,2575],{"class":1786},"2",[453,2577,565],{"class":467},[453,2579,423],{"class":463},[453,2581,2582],{"class":544},"call",[453,2584,938],{"class":467},[453,2586,493],{"class":463},[453,2588,2589,2591,2594,2596,2598,2600,2602,2604,2607],{"class":455,"line":641},[453,2590,535],{"class":534},[453,2592,2593],{"class":467}," pagination ",[453,2595,541],{"class":463},[453,2597,2550],{"class":467},[453,2599,423],{"class":463},[453,2601,2540],{"class":467},[453,2603,761],{"class":463},[453,2605,2606],{"class":467},"pagination",[453,2608,493],{"class":463},[453,2610,2611],{"class":455,"line":648},[453,2612,528],{"emptyLinePlaceholder":527},[453,2614,2615,2618,2620,2622,2625,2628,2630,2632,2635,2637],{"class":455,"line":675},[453,2616,2617],{"class":459},"if",[453,2619,613],{"class":467},[453,2621,1386],{"class":463},[453,2623,2624],{"class":467},"error ",[453,2626,2627],{"class":463},"&&",[453,2629,2593],{"class":467},[453,2631,2627],{"class":463},[453,2633,2634],{"class":463}," !",[453,2636,2413],{"class":544},[453,2638,2639],{"class":467},"(pagination))\n",[453,2641,2642,2644,2646,2648,2651,2653,2656,2658,2660,2663,2665,2667,2670,2672,2675],{"class":455,"line":722},[453,2643,1184],{"class":467},[453,2645,423],{"class":463},[453,2647,736],{"class":544},[453,2649,2650],{"class":467},"(products",[453,2652,761],{"class":463},[453,2654,2655],{"class":467},"length",[453,2657,471],{"class":463},[453,2659,483],{"class":463},[453,2661,2662],{"class":486},"of",[453,2664,490],{"class":463},[453,2666,471],{"class":463},[453,2668,2669],{"class":467}," pagination",[453,2671,423],{"class":463},[453,2673,2674],{"class":467},"total)",[453,2676,493],{"class":463},[444,2678,2681],{"className":446,"code":2679,"filename":2680,"language":448,"meta":449,"style":449},"import {createMionRouter, Routes} from '@mionjs\u002Frouter';\n\nexport type Product = {id: string; name: string};\nexport type Pagination = {page: number; pageSize: number; total: number};\n\ndeclare function findProducts(\n  page: number,\n  pageSize: number\n): {items: Product[]; total: number};\n\nconst mion = createMionRouter({\n  contextDataFactory: (): {pagination?: Pagination} => ({}),\n});\n\nconst routes = {\n  products: {\n    \u002F\u002F returns only the items, and leaves the page info in the context\n    list: mion.route((ctx, page: number): Product[] => {\n      const {items, total} = findProducts(page, 20);\n      ctx.shared.pagination = {page, pageSize: 20, total};\n      return items;\n    }),\n    \u002F\u002F declared after the routes of `products`: runs after each of them, and only them\n    pagination: mion.middleware(\n      (ctx): Pagination | void => ctx.shared.pagination\n    ),\n  },\n} satisfies Routes;\n\nconst api = mion.initRoutes(routes);\n\nexport type PaginationApi = typeof api;\n","server.routes.ts",[409,2682,2683,2707,2711,2742,2782,2786,2799,2810,2820,2846,2850,2864,2896,2904,2908,2918,2927,2932,2972,3003,3035,3044,3053,3058,3073,3102,3108,3112,3122,3126,3145,3149],{"__ignoreMap":449},[453,2684,2685,2687,2689,2691,2693,2695,2697,2699,2701,2703,2705],{"class":455,"line":456},[453,2686,460],{"class":459},[453,2688,464],{"class":463},[453,2690,468],{"class":467},[453,2692,471],{"class":463},[453,2694,474],{"class":467},[453,2696,477],{"class":463},[453,2698,480],{"class":459},[453,2700,483],{"class":463},[453,2702,487],{"class":486},[453,2704,490],{"class":463},[453,2706,493],{"class":463},[453,2708,2709],{"class":455,"line":496},[453,2710,528],{"emptyLinePlaceholder":527},[453,2712,2713,2715,2717,2720,2722,2724,2727,2729,2731,2734,2736,2738,2740],{"class":455,"line":524},[453,2714,2324],{"class":459},[453,2716,2455],{"class":534},[453,2718,2719],{"class":623}," Product",[453,2721,657],{"class":463},[453,2723,464],{"class":463},[453,2725,2726],{"class":554},"id",[453,2728,558],{"class":463},[453,2730,1310],{"class":623},[453,2732,2733],{"class":463},";",[453,2735,1305],{"class":554},[453,2737,558],{"class":463},[453,2739,1310],{"class":623},[453,2741,1677],{"class":463},[453,2743,2744,2746,2748,2751,2753,2755,2758,2760,2763,2765,2768,2770,2772,2774,2776,2778,2780],{"class":455,"line":531},[453,2745,2324],{"class":459},[453,2747,2455],{"class":534},[453,2749,2750],{"class":623}," Pagination",[453,2752,657],{"class":463},[453,2754,464],{"class":463},[453,2756,2757],{"class":554},"page",[453,2759,558],{"class":463},[453,2761,2762],{"class":623}," number",[453,2764,2733],{"class":463},[453,2766,2767],{"class":554}," pageSize",[453,2769,558],{"class":463},[453,2771,2762],{"class":623},[453,2773,2733],{"class":463},[453,2775,1811],{"class":554},[453,2777,558],{"class":463},[453,2779,2762],{"class":623},[453,2781,1677],{"class":463},[453,2783,2784],{"class":455,"line":570},[453,2785,528],{"emptyLinePlaceholder":527},[453,2787,2788,2791,2794,2797],{"class":455,"line":575},[453,2789,2790],{"class":534},"declare",[453,2792,2793],{"class":534}," function",[453,2795,2796],{"class":544}," findProducts",[453,2798,604],{"class":463},[453,2800,2801,2804,2806,2808],{"class":455,"line":588},[453,2802,2803],{"class":616},"  page",[453,2805,558],{"class":463},[453,2807,2762],{"class":623},[453,2809,807],{"class":463},[453,2811,2812,2815,2817],{"class":455,"line":607},[453,2813,2814],{"class":616},"  pageSize",[453,2816,558],{"class":463},[453,2818,2819],{"class":623}," number\n",[453,2821,2822,2824,2826,2829,2831,2833,2836,2838,2840,2842,2844],{"class":455,"line":641},[453,2823,620],{"class":463},[453,2825,464],{"class":463},[453,2827,2828],{"class":554},"items",[453,2830,558],{"class":463},[453,2832,2719],{"class":623},[453,2834,2835],{"class":467},"[]",[453,2837,2733],{"class":463},[453,2839,1811],{"class":554},[453,2841,558],{"class":463},[453,2843,2762],{"class":623},[453,2845,1677],{"class":463},[453,2847,2848],{"class":455,"line":648},[453,2849,528],{"emptyLinePlaceholder":527},[453,2851,2852,2854,2856,2858,2860,2862],{"class":455,"line":675},[453,2853,535],{"class":534},[453,2855,538],{"class":467},[453,2857,541],{"class":463},[453,2859,545],{"class":544},[453,2861,548],{"class":467},[453,2863,1858],{"class":463},[453,2865,2866,2869,2871,2874,2876,2878,2881,2883,2885,2887,2889,2892,2894],{"class":455,"line":722},[453,2867,2868],{"class":544},"  contextDataFactory",[453,2870,558],{"class":463},[453,2872,2873],{"class":463}," ():",[453,2875,464],{"class":463},[453,2877,2606],{"class":554},[453,2879,2880],{"class":463},"?:",[453,2882,2750],{"class":623},[453,2884,477],{"class":463},[453,2886,636],{"class":534},[453,2888,613],{"class":467},[453,2890,2891],{"class":463},"{}",[453,2893,565],{"class":467},[453,2895,807],{"class":463},[453,2897,2898,2900,2902],{"class":455,"line":771},[453,2899,477],{"class":463},[453,2901,565],{"class":467},[453,2903,493],{"class":463},[453,2905,2906],{"class":455,"line":777},[453,2907,528],{"emptyLinePlaceholder":527},[453,2909,2910,2912,2914,2916],{"class":455,"line":783},[453,2911,535],{"class":534},[453,2913,580],{"class":467},[453,2915,541],{"class":463},[453,2917,585],{"class":463},[453,2919,2920,2923,2925],{"class":455,"line":801},[453,2921,2922],{"class":554},"  products",[453,2924,558],{"class":463},[453,2926,585],{"class":463},[453,2928,2929],{"class":455,"line":810},[453,2930,2931],{"class":644},"    \u002F\u002F returns only the items, and leaves the page info in the context\n",[453,2933,2934,2937,2939,2941,2943,2945,2947,2949,2951,2953,2956,2958,2960,2962,2964,2967,2970],{"class":455,"line":816},[453,2935,2936],{"class":554},"    list",[453,2938,558],{"class":463},[453,2940,596],{"class":467},[453,2942,423],{"class":463},[453,2944,1294],{"class":544},[453,2946,548],{"class":467},[453,2948,548],{"class":463},[453,2950,617],{"class":616},[453,2952,471],{"class":463},[453,2954,2955],{"class":616}," page",[453,2957,558],{"class":463},[453,2959,2762],{"class":623},[453,2961,620],{"class":463},[453,2963,2719],{"class":623},[453,2965,2966],{"class":467},"[] ",[453,2968,2969],{"class":534},"=>",[453,2971,585],{"class":463},[453,2973,2974,2976,2978,2980,2982,2984,2986,2988,2990,2992,2994,2996,2999,3001],{"class":455,"line":1066},[453,2975,651],{"class":534},[453,2977,464],{"class":463},[453,2979,2828],{"class":467},[453,2981,471],{"class":463},[453,2983,1811],{"class":467},[453,2985,477],{"class":463},[453,2987,657],{"class":463},[453,2989,2796],{"class":544},[453,2991,548],{"class":554},[453,2993,2757],{"class":467},[453,2995,471],{"class":463},[453,2997,2998],{"class":1786}," 20",[453,3000,565],{"class":554},[453,3002,493],{"class":463},[453,3004,3005,3007,3009,3011,3013,3015,3017,3019,3021,3023,3025,3027,3029,3031,3033],{"class":455,"line":1081},[453,3006,1718],{"class":467},[453,3008,423],{"class":463},[453,3010,753],{"class":467},[453,3012,423],{"class":463},[453,3014,2606],{"class":467},[453,3016,657],{"class":463},[453,3018,464],{"class":463},[453,3020,2757],{"class":467},[453,3022,471],{"class":463},[453,3024,2767],{"class":554},[453,3026,558],{"class":463},[453,3028,2998],{"class":1786},[453,3030,471],{"class":463},[453,3032,1811],{"class":467},[453,3034,1677],{"class":463},[453,3036,3037,3039,3042],{"class":455,"line":1115},[453,3038,1756],{"class":459},[453,3040,3041],{"class":467}," items",[453,3043,493],{"class":463},[453,3045,3046,3049,3051],{"class":455,"line":1120},[453,3047,3048],{"class":463},"    }",[453,3050,565],{"class":467},[453,3052,807],{"class":463},[453,3054,3055],{"class":455,"line":1133},[453,3056,3057],{"class":644},"    \u002F\u002F declared after the routes of `products`: runs after each of them, and only them\n",[453,3059,3060,3063,3065,3067,3069,3071],{"class":455,"line":1140},[453,3061,3062],{"class":554},"    pagination",[453,3064,558],{"class":463},[453,3066,596],{"class":467},[453,3068,423],{"class":463},[453,3070,601],{"class":544},[453,3072,604],{"class":467},[453,3074,3075,3078,3080,3082,3084,3087,3089,3091,3093,3095,3097,3099],{"class":455,"line":1145},[453,3076,3077],{"class":463},"      (",[453,3079,617],{"class":616},[453,3081,620],{"class":463},[453,3083,2750],{"class":623},[453,3085,3086],{"class":463}," |",[453,3088,979],{"class":623},[453,3090,636],{"class":534},[453,3092,660],{"class":467},[453,3094,423],{"class":463},[453,3096,753],{"class":467},[453,3098,423],{"class":463},[453,3100,3101],{"class":467},"pagination\n",[453,3103,3104,3106],{"class":455,"line":1151},[453,3105,1737],{"class":467},[453,3107,807],{"class":463},[453,3109,3110],{"class":455,"line":1181},[453,3111,1018],{"class":463},[453,3113,3114,3116,3118,3120],{"class":455,"line":1212},[453,3115,477],{"class":463},[453,3117,821],{"class":459},[453,3119,474],{"class":623},[453,3121,493],{"class":463},[453,3123,3124],{"class":455,"line":1221},[453,3125,528],{"emptyLinePlaceholder":527},[453,3127,3128,3130,3133,3135,3137,3139,3141,3143],{"class":455,"line":1226},[453,3129,535],{"class":534},[453,3131,3132],{"class":467}," api ",[453,3134,541],{"class":463},[453,3136,596],{"class":467},[453,3138,423],{"class":463},[453,3140,1481],{"class":544},[453,3142,2341],{"class":467},[453,3144,493],{"class":463},[453,3146,3147],{"class":455,"line":1232},[453,3148,528],{"emptyLinePlaceholder":527},[453,3150,3151,3153,3155,3158,3160,3163,3166],{"class":455,"line":1256},[453,3152,2324],{"class":459},[453,3154,2455],{"class":534},[453,3156,3157],{"class":623}," PaginationApi",[453,3159,657],{"class":463},[453,3161,3162],{"class":463}," typeof",[453,3164,3165],{"class":467}," api",[453,3167,493],{"class":463},[1553,3169,3170,3171,423],{},"To handle the answer on every call instead, use ",[409,3172,3173],{},"middlewares.products.pagination.onResponse",[3175,3176,3177],"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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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}","Learn how to define and use middleware in mion APIs.","md",null,{"toc":24},{"title":36,"description":3178},"IHtGB4DcR__xM3Wyp6J1DvYKDzcOeJC6liiTFn4JCDs",1793324369181]