[{"data":1,"prerenderedAt":2873},["ShallowReactive",2],{"navigation_docs":3,"-server-routes":195,"-server-routes-surround":2868},[4,27,61,75,100,126,147,177],{"title":5,"icon":6,"redirect":7,"path":8,"stem":9,"children":10,"page":26},"Introduction","icon-park-outline:home","\u002Fintroduction\u002Fabout-mion","\u002Fintroduction","1.introduction",[11,14,18,22],{"title":12,"path":7,"stem":13},"About mion","1.introduction\u002F1.about-mion",{"title":15,"path":16,"stem":17},"Quick Start","\u002Fintroduction\u002Fquick-start","1.introduction\u002F2.quick-start",{"title":19,"path":20,"stem":21},"Manual Install","\u002Fintroduction\u002Fmanual-install","1.introduction\u002F3.manual-install",{"title":23,"path":24,"stem":25},"What's Next","\u002Fintroduction\u002Fwhat-is-next","1.introduction\u002F4.what-is-next",false,{"title":28,"icon":29,"path":30,"stem":31,"children":32,"page":26},"Server","icon-park-outline:server","\u002Fserver","20.server",[33,37,41,45,49,53,57],{"title":34,"path":35,"stem":36},"Router Overview","\u002Fserver\u002Foverview","20.server\u002F0.overview",{"title":38,"path":39,"stem":40},"Routes","\u002Fserver\u002Froutes","20.server\u002F1.routes",{"title":42,"path":43,"stem":44},"Middleware","\u002Fserver\u002Fmiddle-fns","20.server\u002F2.middle-fns",{"title":46,"path":47,"stem":48},"Request & Response","\u002Fserver\u002Frequest-and-response","20.server\u002F5.request-and-response",{"title":50,"path":51,"stem":52},"Error Handling","\u002Fserver\u002Ferror-handling","20.server\u002F6.error-handling",{"title":54,"path":55,"stem":56},"Validation","\u002Fserver\u002Fvalidation","20.server\u002F7.validation",{"title":58,"path":59,"stem":60},"Serialization","\u002Fserver\u002Fserialization","20.server\u002F8.serialization",{"title":62,"icon":63,"path":64,"stem":65,"children":66,"page":26},"Drizzle ORM","i-lineicons-drizzle","\u002Fdrizzle-orm","21.drizzle-orm",[67,71],{"title":68,"path":69,"stem":70},"Drizzle Overview","\u002Fdrizzle-orm\u002Fdrizzle-overview","21.drizzle-orm\u002F0.drizzle-overview",{"title":72,"path":73,"stem":74},"Column Mapping","\u002Fdrizzle-orm\u002Fcolumn-mapping","21.drizzle-orm\u002F1.column-mapping",{"title":76,"icon":77,"path":78,"stem":79,"children":80,"page":26},"Client","icon-park-outline:computer","\u002Fclient","3.client",[81,85,88,92,96],{"title":82,"path":83,"stem":84},"Client Overview","\u002Fclient\u002Fclient-overview","3.client\u002F0.client-overview",{"title":50,"path":86,"stem":87},"\u002Fclient\u002Ferror-handling","3.client\u002F1.error-handling",{"title":89,"path":90,"stem":91},"Validation Errors","\u002Fclient\u002Fvalidation-errors","3.client\u002F2.validation-errors",{"title":93,"path":94,"stem":95},"Routes Flow","\u002Fclient\u002Fclient-flow","3.client\u002F3.client-flow",{"title":97,"path":98,"stem":99},"Cancellation & Timeouts","\u002Fclient\u002Fcancellation-timeouts","3.client\u002F4.cancellation-timeouts",{"title":101,"icon":102,"redirect":103,"path":104,"stem":105,"children":106,"page":26},"RunTypes","i-lucide-scan-text","\u002Frun-types\u002Foverview","\u002Frun-types","4.run-types",[107,110,114,118,122],{"title":108,"path":103,"stem":109},"RunTypes Overview","4.run-types\u002F0.overview",{"title":111,"path":112,"stem":113},"Supported Types","\u002Frun-types\u002Ffeatures","4.run-types\u002F1.features",{"title":115,"path":116,"stem":117},"Type Formats","\u002Frun-types\u002Ftype-formats","4.run-types\u002F2.type-formats",{"title":119,"path":120,"stem":121},"Built-in Formats","\u002Frun-types\u002Fbuilt-in-formats","4.run-types\u002F3.built-in-formats",{"title":123,"path":124,"stem":125},"Caveats","\u002Frun-types\u002Fcaveats","4.run-types\u002F4.caveats",{"title":127,"path":128,"stem":129,"children":130,"page":26},"Devtools","\u002Fdevtools","5.devtools",[131,135,139,143],{"title":132,"path":133,"stem":134},"AOT Compilation","\u002Fdevtools\u002Faot-compilation","5.devtools\u002F0.aot-compilation",{"title":136,"path":137,"stem":138},"Pure Functions","\u002Fdevtools\u002Fpure-functions","5.devtools\u002F1.pure-functions",{"title":140,"path":141,"stem":142},"ESLint Rules","\u002Fdevtools\u002Feslint-rules","5.devtools\u002F2.eslint-rules",{"title":144,"path":145,"stem":146},"Vite Configuration","\u002Fdevtools\u002Fvite-config","5.devtools\u002F3.vite-config",{"title":148,"redirect":149,"icon":150,"path":151,"stem":152,"children":153,"page":26},"Platforms","\u002Fplatforms\u002Fnode-js","icon-park-outline:play","\u002Fplatforms","6.platforms",[154,157,161,165,169,173],{"title":155,"path":149,"stem":156},"Node.js","6.platforms\u002F1.node-js",{"title":158,"path":159,"stem":160},"Bun","\u002Fplatforms\u002Fbun","6.platforms\u002F2.bun",{"title":162,"path":163,"stem":164},"AWS Lambda","\u002Fplatforms\u002Faws-lambda","6.platforms\u002F3.aws-lambda",{"title":166,"path":167,"stem":168},"Google Cloud Functions","\u002Fplatforms\u002Fgoogle-cloud-functions","6.platforms\u002F4.google-cloud-functions",{"title":170,"path":171,"stem":172},"Cloudflare Workers","\u002Fplatforms\u002Fcloudflare","6.platforms\u002F5.cloudflare",{"title":174,"path":175,"stem":176},"Vercel","\u002Fplatforms\u002Fvercel","6.platforms\u002F6.vercel",{"title":178,"icon":179,"redirect":180,"path":181,"stem":182,"children":183,"page":26},"Benchmarks","icon-park-outline:chart-line","\u002Fbenchmarks\u002Fhello-world","\u002Fbenchmarks","7.benchmarks",[184,187,191],{"title":185,"path":180,"stem":186},"Hello World","7.benchmarks\u002F1.hello-world",{"title":188,"path":189,"stem":190},"Light Validation","\u002Fbenchmarks\u002Flight-validation","7.benchmarks\u002F2.light-validation",{"title":192,"path":193,"stem":194},"Heavy Validation","\u002Fbenchmarks\u002Fheavy-validation","7.benchmarks\u002F3.heavy-validation",{"id":196,"title":38,"body":197,"description":2862,"extension":2863,"links":2864,"meta":2865,"navigation":349,"path":39,"seo":2866,"stem":40,"__hash__":2867},"docs\u002F20.server\u002F1.routes.md",{"type":198,"value":199},"minimark",[200,204,212,215,222,227,247,265,632,636,646,679,1037,1045,1049,1060,1325,1329,1340,1821,1825,1828,1832,1989,1992,1995,2005,2008,2013,2018,2025,2505,2509,2516,2521,2858],[201,202,203],"p",{},"mion has an RPC style routing system so Routes are just functions that can be called remotely.",[201,205,206,207,211],{},"The first parameter of the remote method is always the ",[208,209,210],"a",{"href":39},"Call Context",". The rest of parameters are the remote parameters that get deserialized and validated before the route gets executed.",[201,213,214],{},"There are no URLs or Paths when defining a route, instead the API is defined using a plain JavaScript object, where every entry of the object is a route or middleFn. This way we simplify referencing remote methods when calling them from the client.",[201,216,217,218,221],{},"Internally a URL is generated for each route so these can be referenced using regular HTTP requests, but all this complexity is managed transparently by the ",[208,219,220],{"href":83},"client",".",[223,224,226],"h2",{"id":225},"defining-a-route","Defining a Route",[201,228,229,230,234,235,241,242,246],{},"Routes can be defined using the ",[231,232,233],"code",{},"route"," function by passing the ",[208,236,238],{"href":237},"#handler",[231,239,240],{},"Handler"," as first parameter and ",[208,243,245],{"href":244},"#routedef","RouteOptions"," as second.",[248,249,250,254,255,264],"tip",{},[251,252,253],"strong",{},"Quick Tip:"," Never assign a type to Routes\u002FMiddleFns, instead always use the ",[208,256,261],{"href":257,"rel":258,"target":260},"https:\u002F\u002Fwww.typescriptlang.org\u002Fdocs\u002Fhandbook\u002Frelease-notes\u002Ftypescript-4-9.html#the-satisfies-operator",[259],"nofollow","_blank",[231,262,263],{},"satisfies"," operator.\nThis guarantees routers are fully typed.",[266,267,272],"pre",{"className":268,"code":269,"language":270,"meta":271,"style":271},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import {Routes, route} from '@mionjs\u002Frouter';\nimport {memoryStoreService as db} from '.\u002Ffull-example.app.ts';\n\nexport const routes = {\n    sayHello: route((ctx, name1: string, name2: string): string => {\n        return `Hello ${name1} and ${name2}.`;\n    }),\n    getSomeData: route(async (ctx, id: string): Data | RpcError\u003C'data-not-found'> => {\n        const data = await db.getData(id);\n        return data || new RpcError({publicMessage: 'Data not found', type: 'data-not-found'});\n    }),\n} satisfies Routes;\n","ts","",[231,273,274,315,344,351,370,422,459,471,528,559,610,619],{"__ignoreMap":271},[275,276,279,283,287,290,293,296,299,302,305,309,312],"span",{"class":277,"line":278},"line",1,[275,280,282],{"class":281},"s7zQu","import",[275,284,286],{"class":285},"sMK4o"," {",[275,288,38],{"class":289},"sTEyZ",[275,291,292],{"class":285},",",[275,294,295],{"class":289}," route",[275,297,298],{"class":285},"}",[275,300,301],{"class":281}," from",[275,303,304],{"class":285}," '",[275,306,308],{"class":307},"sfazB","@mionjs\u002Frouter",[275,310,311],{"class":285},"'",[275,313,314],{"class":285},";\n",[275,316,318,320,322,325,328,331,333,335,337,340,342],{"class":277,"line":317},2,[275,319,282],{"class":281},[275,321,286],{"class":285},[275,323,324],{"class":289},"memoryStoreService",[275,326,327],{"class":281}," as",[275,329,330],{"class":289}," db",[275,332,298],{"class":285},[275,334,301],{"class":281},[275,336,304],{"class":285},[275,338,339],{"class":307},".\u002Ffull-example.app.ts",[275,341,311],{"class":285},[275,343,314],{"class":285},[275,345,347],{"class":277,"line":346},3,[275,348,350],{"emptyLinePlaceholder":349},true,"\n",[275,352,354,357,361,364,367],{"class":277,"line":353},4,[275,355,356],{"class":281},"export",[275,358,360],{"class":359},"spNyl"," const",[275,362,363],{"class":289}," routes ",[275,365,366],{"class":285},"=",[275,368,369],{"class":285}," {\n",[275,371,373,377,380,383,386,388,392,394,397,399,403,405,408,410,412,415,417,420],{"class":277,"line":372},5,[275,374,376],{"class":375},"swJcz","    sayHello",[275,378,379],{"class":285},":",[275,381,295],{"class":382},"s2Zo4",[275,384,385],{"class":289},"(",[275,387,385],{"class":285},[275,389,391],{"class":390},"sHdIc","ctx",[275,393,292],{"class":285},[275,395,396],{"class":390}," name1",[275,398,379],{"class":285},[275,400,402],{"class":401},"sBMFI"," string",[275,404,292],{"class":285},[275,406,407],{"class":390}," name2",[275,409,379],{"class":285},[275,411,402],{"class":401},[275,413,414],{"class":285},"):",[275,416,402],{"class":401},[275,418,419],{"class":359}," =>",[275,421,369],{"class":285},[275,423,425,428,431,434,437,440,442,445,447,450,452,454,457],{"class":277,"line":424},6,[275,426,427],{"class":281},"        return",[275,429,430],{"class":285}," `",[275,432,433],{"class":307},"Hello ",[275,435,436],{"class":285},"${",[275,438,439],{"class":289},"name1",[275,441,298],{"class":285},[275,443,444],{"class":307}," and ",[275,446,436],{"class":285},[275,448,449],{"class":289},"name2",[275,451,298],{"class":285},[275,453,221],{"class":307},[275,455,456],{"class":285},"`",[275,458,314],{"class":285},[275,460,462,465,468],{"class":277,"line":461},7,[275,463,464],{"class":285},"    }",[275,466,467],{"class":289},")",[275,469,470],{"class":285},",\n",[275,472,474,477,479,481,483,486,489,491,493,496,498,500,502,505,508,511,514,516,519,521,524,526],{"class":277,"line":473},8,[275,475,476],{"class":375},"    getSomeData",[275,478,379],{"class":285},[275,480,295],{"class":382},[275,482,385],{"class":289},[275,484,485],{"class":359},"async",[275,487,488],{"class":285}," (",[275,490,391],{"class":390},[275,492,292],{"class":285},[275,494,495],{"class":390}," id",[275,497,379],{"class":285},[275,499,402],{"class":401},[275,501,414],{"class":285},[275,503,504],{"class":401}," Data",[275,506,507],{"class":285}," |",[275,509,510],{"class":401}," RpcError",[275,512,513],{"class":285},"\u003C",[275,515,311],{"class":285},[275,517,518],{"class":307},"data-not-found",[275,520,311],{"class":285},[275,522,523],{"class":285},">",[275,525,419],{"class":359},[275,527,369],{"class":285},[275,529,531,534,537,540,543,545,547,550,552,555,557],{"class":277,"line":530},9,[275,532,533],{"class":359},"        const",[275,535,536],{"class":289}," data",[275,538,539],{"class":285}," =",[275,541,542],{"class":281}," await",[275,544,330],{"class":289},[275,546,221],{"class":285},[275,548,549],{"class":382},"getData",[275,551,385],{"class":375},[275,553,554],{"class":289},"id",[275,556,467],{"class":375},[275,558,314],{"class":285},[275,560,562,564,566,569,572,574,576,579,582,584,586,589,591,593,596,598,600,602,604,606,608],{"class":277,"line":561},10,[275,563,427],{"class":281},[275,565,536],{"class":289},[275,567,568],{"class":285}," ||",[275,570,571],{"class":285}," new",[275,573,510],{"class":382},[275,575,385],{"class":375},[275,577,578],{"class":285},"{",[275,580,581],{"class":375},"publicMessage",[275,583,379],{"class":285},[275,585,304],{"class":285},[275,587,588],{"class":307},"Data not found",[275,590,311],{"class":285},[275,592,292],{"class":285},[275,594,595],{"class":375}," type",[275,597,379],{"class":285},[275,599,304],{"class":285},[275,601,518],{"class":307},[275,603,311],{"class":285},[275,605,298],{"class":285},[275,607,467],{"class":375},[275,609,314],{"class":285},[275,611,613,615,617],{"class":277,"line":612},11,[275,614,464],{"class":285},[275,616,467],{"class":289},[275,618,470],{"class":285},[275,620,622,624,627,630],{"class":277,"line":621},12,[275,623,298],{"class":285},[275,625,626],{"class":281}," satisfies",[275,628,629],{"class":401}," Routes",[275,631,314],{"class":285},[223,633,635],{"id":634},"query-and-mutation-handlers","Query and Mutation Handlers",[201,637,638,639,444,642,645],{},"mion provides ",[231,640,641],{},"query()",[231,643,644],{},"mutation()"," handler functions to explicitly declare the intent of each route. This distinction enables the client to automatically optimize how requests are sent over the wire.",[647,648,649,664,671],"ul",{},[650,651,652,656,657,660,661,221],"li",{},[251,653,654],{},[231,655,641],{}," — for read-only operations. The client automatically sends small payloads via ",[231,658,659],{},"GET"," with ",[231,662,663],{},"?data=base64url",[650,665,666,670],{},[251,667,668],{},[231,669,644],{}," — for operations that modify data. The client always sends data in the body.",[650,672,673,678],{},[251,674,675],{},[231,676,677],{},"route()"," — no explicit intent, data is sent in the body. Does not participate in cache semantics.",[266,680,682],{"className":268,"code":681,"language":270,"meta":271,"style":271},"import {RpcError} from '@mionjs\u002Fcore';\nimport {Routes, route, query, mutation} from '@mionjs\u002Frouter';\n\ntype User = {name: string; surname: string};\n\nconst routes = {\n    \u002F\u002F query() for read-only operations\n    \u002F\u002F client automatically uses GET with ?data=base64url for small payloads\n    getUser: query((ctx, id: number): User | RpcError\u003C'user-not-found'> => {\n        return {name: 'John', surname: 'Doe'};\n    }),\n\n    \u002F\u002F mutation() for operations that modify data\n    \u002F\u002F client always uses POST with body\n    createUser: mutation((ctx, user: User): User => {\n        return user;\n    }),\n\n    \u002F\u002F route() still works as before (no query\u002Fmutation intent, client uses POST)\n    sayHello: route((ctx, name: string): string => {\n        return `Hello ${name}`;\n    }),\n} satisfies Routes;\n",[231,683,684,706,740,744,776,780,791,797,802,849,881,889,893,899,905,938,947,956,961,967,999,1017,1026],{"__ignoreMap":271},[275,685,686,688,690,693,695,697,699,702,704],{"class":277,"line":278},[275,687,282],{"class":281},[275,689,286],{"class":285},[275,691,692],{"class":289},"RpcError",[275,694,298],{"class":285},[275,696,301],{"class":281},[275,698,304],{"class":285},[275,700,701],{"class":307},"@mionjs\u002Fcore",[275,703,311],{"class":285},[275,705,314],{"class":285},[275,707,708,710,712,714,716,718,720,723,725,728,730,732,734,736,738],{"class":277,"line":317},[275,709,282],{"class":281},[275,711,286],{"class":285},[275,713,38],{"class":289},[275,715,292],{"class":285},[275,717,295],{"class":289},[275,719,292],{"class":285},[275,721,722],{"class":289}," query",[275,724,292],{"class":285},[275,726,727],{"class":289}," mutation",[275,729,298],{"class":285},[275,731,301],{"class":281},[275,733,304],{"class":285},[275,735,308],{"class":307},[275,737,311],{"class":285},[275,739,314],{"class":285},[275,741,742],{"class":277,"line":346},[275,743,350],{"emptyLinePlaceholder":349},[275,745,746,749,752,754,756,759,761,763,766,769,771,773],{"class":277,"line":353},[275,747,748],{"class":359},"type",[275,750,751],{"class":401}," User",[275,753,539],{"class":285},[275,755,286],{"class":285},[275,757,758],{"class":375},"name",[275,760,379],{"class":285},[275,762,402],{"class":401},[275,764,765],{"class":285},";",[275,767,768],{"class":375}," surname",[275,770,379],{"class":285},[275,772,402],{"class":401},[275,774,775],{"class":285},"};\n",[275,777,778],{"class":277,"line":372},[275,779,350],{"emptyLinePlaceholder":349},[275,781,782,785,787,789],{"class":277,"line":424},[275,783,784],{"class":359},"const",[275,786,363],{"class":289},[275,788,366],{"class":285},[275,790,369],{"class":285},[275,792,793],{"class":277,"line":461},[275,794,796],{"class":795},"sHwdD","    \u002F\u002F query() for read-only operations\n",[275,798,799],{"class":277,"line":473},[275,800,801],{"class":795},"    \u002F\u002F client automatically uses GET with ?data=base64url for small payloads\n",[275,803,804,807,809,811,813,815,817,819,821,823,826,828,830,832,834,836,838,841,843,845,847],{"class":277,"line":530},[275,805,806],{"class":375},"    getUser",[275,808,379],{"class":285},[275,810,722],{"class":382},[275,812,385],{"class":289},[275,814,385],{"class":285},[275,816,391],{"class":390},[275,818,292],{"class":285},[275,820,495],{"class":390},[275,822,379],{"class":285},[275,824,825],{"class":401}," number",[275,827,414],{"class":285},[275,829,751],{"class":401},[275,831,507],{"class":285},[275,833,510],{"class":401},[275,835,513],{"class":285},[275,837,311],{"class":285},[275,839,840],{"class":307},"user-not-found",[275,842,311],{"class":285},[275,844,523],{"class":285},[275,846,419],{"class":359},[275,848,369],{"class":285},[275,850,851,853,855,857,859,861,864,866,868,870,872,874,877,879],{"class":277,"line":561},[275,852,427],{"class":281},[275,854,286],{"class":285},[275,856,758],{"class":375},[275,858,379],{"class":285},[275,860,304],{"class":285},[275,862,863],{"class":307},"John",[275,865,311],{"class":285},[275,867,292],{"class":285},[275,869,768],{"class":375},[275,871,379],{"class":285},[275,873,304],{"class":285},[275,875,876],{"class":307},"Doe",[275,878,311],{"class":285},[275,880,775],{"class":285},[275,882,883,885,887],{"class":277,"line":612},[275,884,464],{"class":285},[275,886,467],{"class":289},[275,888,470],{"class":285},[275,890,891],{"class":277,"line":621},[275,892,350],{"emptyLinePlaceholder":349},[275,894,896],{"class":277,"line":895},13,[275,897,898],{"class":795},"    \u002F\u002F mutation() for operations that modify data\n",[275,900,902],{"class":277,"line":901},14,[275,903,904],{"class":795},"    \u002F\u002F client always uses POST with body\n",[275,906,908,911,913,915,917,919,921,923,926,928,930,932,934,936],{"class":277,"line":907},15,[275,909,910],{"class":375},"    createUser",[275,912,379],{"class":285},[275,914,727],{"class":382},[275,916,385],{"class":289},[275,918,385],{"class":285},[275,920,391],{"class":390},[275,922,292],{"class":285},[275,924,925],{"class":390}," user",[275,927,379],{"class":285},[275,929,751],{"class":401},[275,931,414],{"class":285},[275,933,751],{"class":401},[275,935,419],{"class":359},[275,937,369],{"class":285},[275,939,941,943,945],{"class":277,"line":940},16,[275,942,427],{"class":281},[275,944,925],{"class":289},[275,946,314],{"class":285},[275,948,950,952,954],{"class":277,"line":949},17,[275,951,464],{"class":285},[275,953,467],{"class":289},[275,955,470],{"class":285},[275,957,959],{"class":277,"line":958},18,[275,960,350],{"emptyLinePlaceholder":349},[275,962,964],{"class":277,"line":963},19,[275,965,966],{"class":795},"    \u002F\u002F route() still works as before (no query\u002Fmutation intent, client uses POST)\n",[275,968,970,972,974,976,978,980,982,984,987,989,991,993,995,997],{"class":277,"line":969},20,[275,971,376],{"class":375},[275,973,379],{"class":285},[275,975,295],{"class":382},[275,977,385],{"class":289},[275,979,385],{"class":285},[275,981,391],{"class":390},[275,983,292],{"class":285},[275,985,986],{"class":390}," name",[275,988,379],{"class":285},[275,990,402],{"class":401},[275,992,414],{"class":285},[275,994,402],{"class":401},[275,996,419],{"class":359},[275,998,369],{"class":285},[275,1000,1002,1004,1006,1008,1010,1012,1015],{"class":277,"line":1001},21,[275,1003,427],{"class":281},[275,1005,430],{"class":285},[275,1007,433],{"class":307},[275,1009,436],{"class":285},[275,1011,758],{"class":289},[275,1013,1014],{"class":285},"}`",[275,1016,314],{"class":285},[275,1018,1020,1022,1024],{"class":277,"line":1019},22,[275,1021,464],{"class":285},[275,1023,467],{"class":289},[275,1025,470],{"class":285},[275,1027,1029,1031,1033,1035],{"class":277,"line":1028},23,[275,1030,298],{"class":285},[275,1032,626],{"class":281},[275,1034,629],{"class":401},[275,1036,314],{"class":285},[248,1038,1039,1040,444,1042,1044],{},"Declaring intent with ",[231,1041,641],{},[231,1043,644],{}," is recommended. It makes your code more readable and enables future optimizations like caching layers.",[223,1046,1048],{"id":1047},"strict-types","Strict Types",[201,1050,1051,1052,1055,1056,1059],{},"By default, mion allows objects with extra properties to pass validation. You can enable ",[231,1053,1054],{},"strictTypes"," globally or per-route to reject objects with unknown properties. See the ",[208,1057,54],{"href":1058},"\u002Fserver\u002Fvalidation#strict-types"," page for details.",[266,1061,1063],{"className":268,"code":1062,"language":270,"meta":271,"style":271},"import {Routes, route, initRouter} from '@mionjs\u002Frouter';\n\ninterface User {\n    name: string;\n    email: string;\n    age: number;\n}\n\n\u002F\u002F Enable strictTypes globally: rejects objects with unknown\u002Fextra properties\nawait initRouter({strictTypes: true});\n\n\u002F\u002F Or enable strictTypes per-route\nconst routes = {\n    \u002F\u002F this route rejects objects with extra properties\n    createUser: route((ctx, user: User): User => user, {strictTypes: true}),\n    \u002F\u002F this route accepts objects with extra properties\n    updateUser: route((ctx, user: Partial\u003CUser>): Partial\u003CUser> => user, {strictTypes: false}),\n} satisfies Routes;\n",[231,1064,1065,1094,1098,1107,1118,1129,1140,1145,1149,1154,1179,1183,1188,1198,1203,1249,1254,1315],{"__ignoreMap":271},[275,1066,1067,1069,1071,1073,1075,1077,1079,1082,1084,1086,1088,1090,1092],{"class":277,"line":278},[275,1068,282],{"class":281},[275,1070,286],{"class":285},[275,1072,38],{"class":289},[275,1074,292],{"class":285},[275,1076,295],{"class":289},[275,1078,292],{"class":285},[275,1080,1081],{"class":289}," initRouter",[275,1083,298],{"class":285},[275,1085,301],{"class":281},[275,1087,304],{"class":285},[275,1089,308],{"class":307},[275,1091,311],{"class":285},[275,1093,314],{"class":285},[275,1095,1096],{"class":277,"line":317},[275,1097,350],{"emptyLinePlaceholder":349},[275,1099,1100,1103,1105],{"class":277,"line":346},[275,1101,1102],{"class":359},"interface",[275,1104,751],{"class":401},[275,1106,369],{"class":285},[275,1108,1109,1112,1114,1116],{"class":277,"line":353},[275,1110,1111],{"class":375},"    name",[275,1113,379],{"class":285},[275,1115,402],{"class":401},[275,1117,314],{"class":285},[275,1119,1120,1123,1125,1127],{"class":277,"line":372},[275,1121,1122],{"class":375},"    email",[275,1124,379],{"class":285},[275,1126,402],{"class":401},[275,1128,314],{"class":285},[275,1130,1131,1134,1136,1138],{"class":277,"line":424},[275,1132,1133],{"class":375},"    age",[275,1135,379],{"class":285},[275,1137,825],{"class":401},[275,1139,314],{"class":285},[275,1141,1142],{"class":277,"line":461},[275,1143,1144],{"class":285},"}\n",[275,1146,1147],{"class":277,"line":473},[275,1148,350],{"emptyLinePlaceholder":349},[275,1150,1151],{"class":277,"line":530},[275,1152,1153],{"class":795},"\u002F\u002F Enable strictTypes globally: rejects objects with unknown\u002Fextra properties\n",[275,1155,1156,1159,1161,1163,1165,1167,1169,1173,1175,1177],{"class":277,"line":561},[275,1157,1158],{"class":281},"await",[275,1160,1081],{"class":382},[275,1162,385],{"class":289},[275,1164,578],{"class":285},[275,1166,1054],{"class":375},[275,1168,379],{"class":285},[275,1170,1172],{"class":1171},"sfNiH"," true",[275,1174,298],{"class":285},[275,1176,467],{"class":289},[275,1178,314],{"class":285},[275,1180,1181],{"class":277,"line":612},[275,1182,350],{"emptyLinePlaceholder":349},[275,1184,1185],{"class":277,"line":621},[275,1186,1187],{"class":795},"\u002F\u002F Or enable strictTypes per-route\n",[275,1189,1190,1192,1194,1196],{"class":277,"line":895},[275,1191,784],{"class":359},[275,1193,363],{"class":289},[275,1195,366],{"class":285},[275,1197,369],{"class":285},[275,1199,1200],{"class":277,"line":901},[275,1201,1202],{"class":795},"    \u002F\u002F this route rejects objects with extra properties\n",[275,1204,1205,1207,1209,1211,1213,1215,1217,1219,1221,1223,1225,1227,1229,1231,1233,1235,1237,1239,1241,1243,1245,1247],{"class":277,"line":907},[275,1206,910],{"class":375},[275,1208,379],{"class":285},[275,1210,295],{"class":382},[275,1212,385],{"class":289},[275,1214,385],{"class":285},[275,1216,391],{"class":390},[275,1218,292],{"class":285},[275,1220,925],{"class":390},[275,1222,379],{"class":285},[275,1224,751],{"class":401},[275,1226,414],{"class":285},[275,1228,751],{"class":401},[275,1230,419],{"class":359},[275,1232,925],{"class":289},[275,1234,292],{"class":285},[275,1236,286],{"class":285},[275,1238,1054],{"class":375},[275,1240,379],{"class":285},[275,1242,1172],{"class":1171},[275,1244,298],{"class":285},[275,1246,467],{"class":289},[275,1248,470],{"class":285},[275,1250,1251],{"class":277,"line":940},[275,1252,1253],{"class":795},"    \u002F\u002F this route accepts objects with extra properties\n",[275,1255,1256,1259,1261,1263,1265,1267,1269,1271,1273,1275,1278,1280,1283,1286,1288,1290,1292,1294,1296,1298,1300,1302,1304,1306,1309,1311,1313],{"class":277,"line":949},[275,1257,1258],{"class":375},"    updateUser",[275,1260,379],{"class":285},[275,1262,295],{"class":382},[275,1264,385],{"class":289},[275,1266,385],{"class":285},[275,1268,391],{"class":390},[275,1270,292],{"class":285},[275,1272,925],{"class":390},[275,1274,379],{"class":285},[275,1276,1277],{"class":401}," Partial",[275,1279,513],{"class":285},[275,1281,1282],{"class":401},"User",[275,1284,1285],{"class":285},">):",[275,1287,1277],{"class":401},[275,1289,513],{"class":285},[275,1291,1282],{"class":401},[275,1293,523],{"class":285},[275,1295,419],{"class":359},[275,1297,925],{"class":289},[275,1299,292],{"class":285},[275,1301,286],{"class":285},[275,1303,1054],{"class":375},[275,1305,379],{"class":285},[275,1307,1308],{"class":1171}," false",[275,1310,298],{"class":285},[275,1312,467],{"class":289},[275,1314,470],{"class":285},[275,1316,1317,1319,1321,1323],{"class":277,"line":958},[275,1318,298],{"class":285},[275,1320,626],{"class":281},[275,1322,629],{"class":401},[275,1324,314],{"class":285},[223,1326,1328],{"id":1327},"registering-routes","Registering Routes",[201,1330,1331,1332,1335,1336,1339],{},"We can register routes by passing the routes to ",[231,1333,1334],{},"initMionRouter"," or explicitly calling ",[231,1337,1338],{},"registerRoutes"," once router has been initialized.",[266,1341,1343],{"className":268,"code":1342,"language":270,"meta":271,"style":271},"import {HeadersSubset} from '@mionjs\u002Fcore';\nimport {initMionRouter, Routes, CallContext, registerRoutes, route, headersFn} from '@mionjs\u002Frouter';\n\nexport type Shared = () => Record\u003Cstring, any>;\nexport type Context = CallContext\u003CShared>;\n\nconst authRoutes = {\n    logIn: route((c, email: string, password: string): string => 'loggedIn'),\n    logOut: route((): string => 'loggedOut'),\n} satisfies Routes;\n\nconst routes = {\n    auth: headersFn((c: Context, h: HeadersSubset\u003C'Authorization'>): void => undefined),\n    sayHello: route((c, name: string): string => 'hello' + name),\n    sayHello2: route((c, name: string): string => 'hello' + name),\n} satisfies Routes;\n\nexport const mayApi = await initMionRouter(routes);\nexport const authApi = await registerRoutes(authRoutes);\n\n\u002F\u002F export api types to be consumed by the clients\nexport type MyApi = typeof mayApi;\nexport type AuthApi = typeof authApi;\n",[231,1344,1345,1366,1409,1413,1445,1465,1469,1480,1531,1560,1570,1574,1584,1636,1679,1720,1730,1734,1755,1775,1779,1784,1803],{"__ignoreMap":271},[275,1346,1347,1349,1351,1354,1356,1358,1360,1362,1364],{"class":277,"line":278},[275,1348,282],{"class":281},[275,1350,286],{"class":285},[275,1352,1353],{"class":289},"HeadersSubset",[275,1355,298],{"class":285},[275,1357,301],{"class":281},[275,1359,304],{"class":285},[275,1361,701],{"class":307},[275,1363,311],{"class":285},[275,1365,314],{"class":285},[275,1367,1368,1370,1372,1374,1376,1378,1380,1383,1385,1388,1390,1392,1394,1397,1399,1401,1403,1405,1407],{"class":277,"line":317},[275,1369,282],{"class":281},[275,1371,286],{"class":285},[275,1373,1334],{"class":289},[275,1375,292],{"class":285},[275,1377,629],{"class":289},[275,1379,292],{"class":285},[275,1381,1382],{"class":289}," CallContext",[275,1384,292],{"class":285},[275,1386,1387],{"class":289}," registerRoutes",[275,1389,292],{"class":285},[275,1391,295],{"class":289},[275,1393,292],{"class":285},[275,1395,1396],{"class":289}," headersFn",[275,1398,298],{"class":285},[275,1400,301],{"class":281},[275,1402,304],{"class":285},[275,1404,308],{"class":307},[275,1406,311],{"class":285},[275,1408,314],{"class":285},[275,1410,1411],{"class":277,"line":346},[275,1412,350],{"emptyLinePlaceholder":349},[275,1414,1415,1417,1419,1422,1424,1427,1429,1432,1434,1437,1439,1442],{"class":277,"line":353},[275,1416,356],{"class":281},[275,1418,595],{"class":359},[275,1420,1421],{"class":401}," Shared",[275,1423,539],{"class":285},[275,1425,1426],{"class":285}," ()",[275,1428,419],{"class":359},[275,1430,1431],{"class":401}," Record",[275,1433,513],{"class":285},[275,1435,1436],{"class":401},"string",[275,1438,292],{"class":285},[275,1440,1441],{"class":401}," any",[275,1443,1444],{"class":285},">;\n",[275,1446,1447,1449,1451,1454,1456,1458,1460,1463],{"class":277,"line":372},[275,1448,356],{"class":281},[275,1450,595],{"class":359},[275,1452,1453],{"class":401}," Context",[275,1455,539],{"class":285},[275,1457,1382],{"class":401},[275,1459,513],{"class":285},[275,1461,1462],{"class":401},"Shared",[275,1464,1444],{"class":285},[275,1466,1467],{"class":277,"line":424},[275,1468,350],{"emptyLinePlaceholder":349},[275,1470,1471,1473,1476,1478],{"class":277,"line":461},[275,1472,784],{"class":359},[275,1474,1475],{"class":289}," authRoutes ",[275,1477,366],{"class":285},[275,1479,369],{"class":285},[275,1481,1482,1485,1487,1489,1491,1493,1496,1498,1501,1503,1505,1507,1510,1512,1514,1516,1518,1520,1522,1525,1527,1529],{"class":277,"line":473},[275,1483,1484],{"class":375},"    logIn",[275,1486,379],{"class":285},[275,1488,295],{"class":382},[275,1490,385],{"class":289},[275,1492,385],{"class":285},[275,1494,1495],{"class":390},"c",[275,1497,292],{"class":285},[275,1499,1500],{"class":390}," email",[275,1502,379],{"class":285},[275,1504,402],{"class":401},[275,1506,292],{"class":285},[275,1508,1509],{"class":390}," password",[275,1511,379],{"class":285},[275,1513,402],{"class":401},[275,1515,414],{"class":285},[275,1517,402],{"class":401},[275,1519,419],{"class":359},[275,1521,304],{"class":285},[275,1523,1524],{"class":307},"loggedIn",[275,1526,311],{"class":285},[275,1528,467],{"class":289},[275,1530,470],{"class":285},[275,1532,1533,1536,1538,1540,1542,1545,1547,1549,1551,1554,1556,1558],{"class":277,"line":530},[275,1534,1535],{"class":375},"    logOut",[275,1537,379],{"class":285},[275,1539,295],{"class":382},[275,1541,385],{"class":289},[275,1543,1544],{"class":285},"():",[275,1546,402],{"class":401},[275,1548,419],{"class":359},[275,1550,304],{"class":285},[275,1552,1553],{"class":307},"loggedOut",[275,1555,311],{"class":285},[275,1557,467],{"class":289},[275,1559,470],{"class":285},[275,1561,1562,1564,1566,1568],{"class":277,"line":561},[275,1563,298],{"class":285},[275,1565,626],{"class":281},[275,1567,629],{"class":401},[275,1569,314],{"class":285},[275,1571,1572],{"class":277,"line":612},[275,1573,350],{"emptyLinePlaceholder":349},[275,1575,1576,1578,1580,1582],{"class":277,"line":621},[275,1577,784],{"class":359},[275,1579,363],{"class":289},[275,1581,366],{"class":285},[275,1583,369],{"class":285},[275,1585,1586,1589,1591,1593,1595,1597,1599,1601,1603,1605,1608,1610,1613,1615,1617,1620,1622,1624,1627,1629,1632,1634],{"class":277,"line":895},[275,1587,1588],{"class":375},"    auth",[275,1590,379],{"class":285},[275,1592,1396],{"class":382},[275,1594,385],{"class":289},[275,1596,385],{"class":285},[275,1598,1495],{"class":390},[275,1600,379],{"class":285},[275,1602,1453],{"class":401},[275,1604,292],{"class":285},[275,1606,1607],{"class":390}," h",[275,1609,379],{"class":285},[275,1611,1612],{"class":401}," HeadersSubset",[275,1614,513],{"class":285},[275,1616,311],{"class":285},[275,1618,1619],{"class":307},"Authorization",[275,1621,311],{"class":285},[275,1623,1285],{"class":285},[275,1625,1626],{"class":401}," void",[275,1628,419],{"class":359},[275,1630,1631],{"class":285}," undefined",[275,1633,467],{"class":289},[275,1635,470],{"class":285},[275,1637,1638,1640,1642,1644,1646,1648,1650,1652,1654,1656,1658,1660,1662,1664,1666,1669,1671,1674,1677],{"class":277,"line":901},[275,1639,376],{"class":375},[275,1641,379],{"class":285},[275,1643,295],{"class":382},[275,1645,385],{"class":289},[275,1647,385],{"class":285},[275,1649,1495],{"class":390},[275,1651,292],{"class":285},[275,1653,986],{"class":390},[275,1655,379],{"class":285},[275,1657,402],{"class":401},[275,1659,414],{"class":285},[275,1661,402],{"class":401},[275,1663,419],{"class":359},[275,1665,304],{"class":285},[275,1667,1668],{"class":307},"hello",[275,1670,311],{"class":285},[275,1672,1673],{"class":285}," +",[275,1675,1676],{"class":289}," name)",[275,1678,470],{"class":285},[275,1680,1681,1684,1686,1688,1690,1692,1694,1696,1698,1700,1702,1704,1706,1708,1710,1712,1714,1716,1718],{"class":277,"line":907},[275,1682,1683],{"class":375},"    sayHello2",[275,1685,379],{"class":285},[275,1687,295],{"class":382},[275,1689,385],{"class":289},[275,1691,385],{"class":285},[275,1693,1495],{"class":390},[275,1695,292],{"class":285},[275,1697,986],{"class":390},[275,1699,379],{"class":285},[275,1701,402],{"class":401},[275,1703,414],{"class":285},[275,1705,402],{"class":401},[275,1707,419],{"class":359},[275,1709,304],{"class":285},[275,1711,1668],{"class":307},[275,1713,311],{"class":285},[275,1715,1673],{"class":285},[275,1717,1676],{"class":289},[275,1719,470],{"class":285},[275,1721,1722,1724,1726,1728],{"class":277,"line":940},[275,1723,298],{"class":285},[275,1725,626],{"class":281},[275,1727,629],{"class":401},[275,1729,314],{"class":285},[275,1731,1732],{"class":277,"line":949},[275,1733,350],{"emptyLinePlaceholder":349},[275,1735,1736,1738,1740,1743,1745,1747,1750,1753],{"class":277,"line":958},[275,1737,356],{"class":281},[275,1739,360],{"class":359},[275,1741,1742],{"class":289}," mayApi ",[275,1744,366],{"class":285},[275,1746,542],{"class":281},[275,1748,1749],{"class":382}," initMionRouter",[275,1751,1752],{"class":289},"(routes)",[275,1754,314],{"class":285},[275,1756,1757,1759,1761,1764,1766,1768,1770,1773],{"class":277,"line":963},[275,1758,356],{"class":281},[275,1760,360],{"class":359},[275,1762,1763],{"class":289}," authApi ",[275,1765,366],{"class":285},[275,1767,542],{"class":281},[275,1769,1387],{"class":382},[275,1771,1772],{"class":289},"(authRoutes)",[275,1774,314],{"class":285},[275,1776,1777],{"class":277,"line":969},[275,1778,350],{"emptyLinePlaceholder":349},[275,1780,1781],{"class":277,"line":1001},[275,1782,1783],{"class":795},"\u002F\u002F export api types to be consumed by the clients\n",[275,1785,1786,1788,1790,1793,1795,1798,1801],{"class":277,"line":1019},[275,1787,356],{"class":281},[275,1789,595],{"class":359},[275,1791,1792],{"class":401}," MyApi",[275,1794,539],{"class":285},[275,1796,1797],{"class":285}," typeof",[275,1799,1800],{"class":289}," mayApi",[275,1802,314],{"class":285},[275,1804,1805,1807,1809,1812,1814,1816,1819],{"class":277,"line":1028},[275,1806,356],{"class":281},[275,1808,595],{"class":359},[275,1810,1811],{"class":401}," AuthApi",[275,1813,539],{"class":285},[275,1815,1797],{"class":285},[275,1817,1818],{"class":289}," authApi",[275,1820,314],{"class":285},[223,1822,1824],{"id":1823},"naming-routes","Naming Routes",[201,1826,1827],{},"Keep it simple and use regular valid JS variable names for routes. It is not recommended to use the array notation (using quotes) to define route names.",[1829,1830,1831],"note",{},"When a route lookup is done there is no URL decoding done so if you define names that include special URL encoded characters then routes won't be found.",[266,1833,1835],{"className":268,"code":1834,"language":270,"meta":271,"style":271},"import {Routes, route} from '@mionjs\u002Frouter';\n\nconst sayHello = route((ctx, name: string): string => {\n    return `Hello ${name}.`;\n});\n\nconst routes = {\n    'say-Hello': sayHello, \u002F\u002F path = \u002Fsay-Hello  !! NOT Recommended\n    'say Hello': sayHello, \u002F\u002F path = \u002Fsay%20Hello  !! ROUTE WONT BE FOUND\n} satisfies Routes;\n",[231,1836,1837,1861,1865,1898,1919,1927,1931,1941,1961,1979],{"__ignoreMap":271},[275,1838,1839,1841,1843,1845,1847,1849,1851,1853,1855,1857,1859],{"class":277,"line":278},[275,1840,282],{"class":281},[275,1842,286],{"class":285},[275,1844,38],{"class":289},[275,1846,292],{"class":285},[275,1848,295],{"class":289},[275,1850,298],{"class":285},[275,1852,301],{"class":281},[275,1854,304],{"class":285},[275,1856,308],{"class":307},[275,1858,311],{"class":285},[275,1860,314],{"class":285},[275,1862,1863],{"class":277,"line":317},[275,1864,350],{"emptyLinePlaceholder":349},[275,1866,1867,1869,1872,1874,1876,1878,1880,1882,1884,1886,1888,1890,1892,1894,1896],{"class":277,"line":346},[275,1868,784],{"class":359},[275,1870,1871],{"class":289}," sayHello ",[275,1873,366],{"class":285},[275,1875,295],{"class":382},[275,1877,385],{"class":289},[275,1879,385],{"class":285},[275,1881,391],{"class":390},[275,1883,292],{"class":285},[275,1885,986],{"class":390},[275,1887,379],{"class":285},[275,1889,402],{"class":401},[275,1891,414],{"class":285},[275,1893,402],{"class":401},[275,1895,419],{"class":359},[275,1897,369],{"class":285},[275,1899,1900,1903,1905,1907,1909,1911,1913,1915,1917],{"class":277,"line":353},[275,1901,1902],{"class":281},"    return",[275,1904,430],{"class":285},[275,1906,433],{"class":307},[275,1908,436],{"class":285},[275,1910,758],{"class":289},[275,1912,298],{"class":285},[275,1914,221],{"class":307},[275,1916,456],{"class":285},[275,1918,314],{"class":285},[275,1920,1921,1923,1925],{"class":277,"line":372},[275,1922,298],{"class":285},[275,1924,467],{"class":289},[275,1926,314],{"class":285},[275,1928,1929],{"class":277,"line":424},[275,1930,350],{"emptyLinePlaceholder":349},[275,1932,1933,1935,1937,1939],{"class":277,"line":461},[275,1934,784],{"class":359},[275,1936,363],{"class":289},[275,1938,366],{"class":285},[275,1940,369],{"class":285},[275,1942,1943,1946,1949,1951,1953,1956,1958],{"class":277,"line":473},[275,1944,1945],{"class":285},"    '",[275,1947,1948],{"class":375},"say-Hello",[275,1950,311],{"class":285},[275,1952,379],{"class":285},[275,1954,1955],{"class":289}," sayHello",[275,1957,292],{"class":285},[275,1959,1960],{"class":795}," \u002F\u002F path = \u002Fsay-Hello  !! NOT Recommended\n",[275,1962,1963,1965,1968,1970,1972,1974,1976],{"class":277,"line":530},[275,1964,1945],{"class":285},[275,1966,1967],{"class":375},"say Hello",[275,1969,311],{"class":285},[275,1971,379],{"class":285},[275,1973,1955],{"class":289},[275,1975,292],{"class":285},[275,1977,1978],{"class":795}," \u002F\u002F path = \u002Fsay%20Hello  !! ROUTE WONT BE FOUND\n",[275,1980,1981,1983,1985,1987],{"class":277,"line":561},[275,1982,298],{"class":285},[275,1984,626],{"class":281},[275,1986,629],{"class":401},[275,1988,314],{"class":285},[1990,1991],"spacer",{},[223,1993,210],{"id":1994},"call-context",[201,1996,1997,1998,2004],{},"The ",[208,1999,2001],{"href":2000},"#callcontext",[231,2002,2003],{},"CallContext"," contains all the data related to the ongoing call.",[201,2006,2007],{},"Most of the data within the CallContext is marked as read-only, this is because it is not recommended to modify the context manually. It is still possible to modify it (the context is not a real Immutable JS object).",[248,2009,2010,2012],{},[251,2011,253],{},"\nTo avoid memory leak issues you should never store a reference to the context or any of its properties within a Route or MiddleFn.\nThe context is passed to every handler so there shouldn't be any reason to do so.",[2014,2015,2017],"h3",{"id":2016},"sharing-data-between-middlefns-and-routes","Sharing Data between MiddleFns and Routes",[201,2019,2020,2021,2024],{},"To share data between middleFns and routes use the ",[231,2022,2023],{},"shared"," object within the Call Context.",[266,2026,2028],{"className":268,"code":2027,"language":270,"meta":271,"style":271},"import {RpcError, HeadersSubset} from '@mionjs\u002Fcore';\nimport {Routes, initMionRouter, headersFn, route} from '@mionjs\u002Frouter';\nimport {getAuthUser, isAuthorized} from 'MyAuth';\n\nconst authorizationMiddleFn = headersFn(\n    async (context, {headers}: HeadersSubset\u003C'Authorization', 'User-id'>): Promise\u003Cvoid | RpcError\u003C'not-authorized'>> => {\n        const token = headers.Authorization;\n        const userId = headers['User-id'];\n        const me = await getAuthUser(token, userId);\n        if (!isAuthorized(me)) {\n            return new RpcError({publicMessage: 'user is not authorized', type: 'not-authorized'});\n        }\n        context.shared.myUser = me; \u002F\u002F user is added to ctx to shared with other routes\u002FmiddleFns\n    }\n);\n\nconst sayMyName = route((context): string => {\n    return `hello ${context.shared.myUser.name}`;\n});\n\nconst routes = {\n    authorizationMiddleFn,\n    sayMyName,\n} satisfies Routes;\n\nexport const apiSpec = await initMionRouter(routes);\n",[231,2029,2030,2054,2086,2113,2117,2131,2200,2218,2243,2270,2294,2336,2341,2364,2369,2375,2379,2404,2433,2441,2445,2455,2462,2469,2480,2485],{"__ignoreMap":271},[275,2031,2032,2034,2036,2038,2040,2042,2044,2046,2048,2050,2052],{"class":277,"line":278},[275,2033,282],{"class":281},[275,2035,286],{"class":285},[275,2037,692],{"class":289},[275,2039,292],{"class":285},[275,2041,1612],{"class":289},[275,2043,298],{"class":285},[275,2045,301],{"class":281},[275,2047,304],{"class":285},[275,2049,701],{"class":307},[275,2051,311],{"class":285},[275,2053,314],{"class":285},[275,2055,2056,2058,2060,2062,2064,2066,2068,2070,2072,2074,2076,2078,2080,2082,2084],{"class":277,"line":317},[275,2057,282],{"class":281},[275,2059,286],{"class":285},[275,2061,38],{"class":289},[275,2063,292],{"class":285},[275,2065,1749],{"class":289},[275,2067,292],{"class":285},[275,2069,1396],{"class":289},[275,2071,292],{"class":285},[275,2073,295],{"class":289},[275,2075,298],{"class":285},[275,2077,301],{"class":281},[275,2079,304],{"class":285},[275,2081,308],{"class":307},[275,2083,311],{"class":285},[275,2085,314],{"class":285},[275,2087,2088,2090,2092,2095,2097,2100,2102,2104,2106,2109,2111],{"class":277,"line":346},[275,2089,282],{"class":281},[275,2091,286],{"class":285},[275,2093,2094],{"class":289},"getAuthUser",[275,2096,292],{"class":285},[275,2098,2099],{"class":289}," isAuthorized",[275,2101,298],{"class":285},[275,2103,301],{"class":281},[275,2105,304],{"class":285},[275,2107,2108],{"class":307},"MyAuth",[275,2110,311],{"class":285},[275,2112,314],{"class":285},[275,2114,2115],{"class":277,"line":353},[275,2116,350],{"emptyLinePlaceholder":349},[275,2118,2119,2121,2124,2126,2128],{"class":277,"line":372},[275,2120,784],{"class":359},[275,2122,2123],{"class":289}," authorizationMiddleFn ",[275,2125,366],{"class":285},[275,2127,1396],{"class":382},[275,2129,2130],{"class":289},"(\n",[275,2132,2133,2136,2138,2141,2143,2145,2148,2151,2153,2155,2157,2159,2161,2163,2165,2168,2170,2172,2175,2177,2180,2182,2184,2186,2188,2191,2193,2196,2198],{"class":277,"line":424},[275,2134,2135],{"class":359},"    async",[275,2137,488],{"class":285},[275,2139,2140],{"class":390},"context",[275,2142,292],{"class":285},[275,2144,286],{"class":285},[275,2146,2147],{"class":390},"headers",[275,2149,2150],{"class":285},"}:",[275,2152,1612],{"class":401},[275,2154,513],{"class":285},[275,2156,311],{"class":285},[275,2158,1619],{"class":307},[275,2160,311],{"class":285},[275,2162,292],{"class":285},[275,2164,304],{"class":285},[275,2166,2167],{"class":307},"User-id",[275,2169,311],{"class":285},[275,2171,1285],{"class":285},[275,2173,2174],{"class":401}," Promise",[275,2176,513],{"class":285},[275,2178,2179],{"class":401},"void",[275,2181,507],{"class":285},[275,2183,510],{"class":401},[275,2185,513],{"class":285},[275,2187,311],{"class":285},[275,2189,2190],{"class":307},"not-authorized",[275,2192,311],{"class":285},[275,2194,2195],{"class":285},">>",[275,2197,419],{"class":359},[275,2199,369],{"class":285},[275,2201,2202,2204,2207,2209,2212,2214,2216],{"class":277,"line":461},[275,2203,533],{"class":359},[275,2205,2206],{"class":289}," token",[275,2208,539],{"class":285},[275,2210,2211],{"class":289}," headers",[275,2213,221],{"class":285},[275,2215,1619],{"class":289},[275,2217,314],{"class":285},[275,2219,2220,2222,2225,2227,2229,2232,2234,2236,2238,2241],{"class":277,"line":473},[275,2221,533],{"class":359},[275,2223,2224],{"class":289}," userId",[275,2226,539],{"class":285},[275,2228,2211],{"class":289},[275,2230,2231],{"class":375},"[",[275,2233,311],{"class":285},[275,2235,2167],{"class":307},[275,2237,311],{"class":285},[275,2239,2240],{"class":375},"]",[275,2242,314],{"class":285},[275,2244,2245,2247,2250,2252,2254,2257,2259,2262,2264,2266,2268],{"class":277,"line":530},[275,2246,533],{"class":359},[275,2248,2249],{"class":289}," me",[275,2251,539],{"class":285},[275,2253,542],{"class":281},[275,2255,2256],{"class":382}," getAuthUser",[275,2258,385],{"class":375},[275,2260,2261],{"class":289},"token",[275,2263,292],{"class":285},[275,2265,2224],{"class":289},[275,2267,467],{"class":375},[275,2269,314],{"class":285},[275,2271,2272,2275,2277,2280,2283,2285,2288,2291],{"class":277,"line":561},[275,2273,2274],{"class":281},"        if",[275,2276,488],{"class":375},[275,2278,2279],{"class":285},"!",[275,2281,2282],{"class":382},"isAuthorized",[275,2284,385],{"class":375},[275,2286,2287],{"class":289},"me",[275,2289,2290],{"class":375},")) ",[275,2292,2293],{"class":285},"{\n",[275,2295,2296,2299,2301,2303,2305,2307,2309,2311,2313,2316,2318,2320,2322,2324,2326,2328,2330,2332,2334],{"class":277,"line":612},[275,2297,2298],{"class":281},"            return",[275,2300,571],{"class":285},[275,2302,510],{"class":382},[275,2304,385],{"class":375},[275,2306,578],{"class":285},[275,2308,581],{"class":375},[275,2310,379],{"class":285},[275,2312,304],{"class":285},[275,2314,2315],{"class":307},"user is not authorized",[275,2317,311],{"class":285},[275,2319,292],{"class":285},[275,2321,595],{"class":375},[275,2323,379],{"class":285},[275,2325,304],{"class":285},[275,2327,2190],{"class":307},[275,2329,311],{"class":285},[275,2331,298],{"class":285},[275,2333,467],{"class":375},[275,2335,314],{"class":285},[275,2337,2338],{"class":277,"line":621},[275,2339,2340],{"class":285},"        }\n",[275,2342,2343,2346,2348,2350,2352,2355,2357,2359,2361],{"class":277,"line":895},[275,2344,2345],{"class":289},"        context",[275,2347,221],{"class":285},[275,2349,2023],{"class":289},[275,2351,221],{"class":285},[275,2353,2354],{"class":289},"myUser",[275,2356,539],{"class":285},[275,2358,2249],{"class":289},[275,2360,765],{"class":285},[275,2362,2363],{"class":795}," \u002F\u002F user is added to ctx to shared with other routes\u002FmiddleFns\n",[275,2365,2366],{"class":277,"line":901},[275,2367,2368],{"class":285},"    }\n",[275,2370,2371,2373],{"class":277,"line":907},[275,2372,467],{"class":289},[275,2374,314],{"class":285},[275,2376,2377],{"class":277,"line":940},[275,2378,350],{"emptyLinePlaceholder":349},[275,2380,2381,2383,2386,2388,2390,2392,2394,2396,2398,2400,2402],{"class":277,"line":949},[275,2382,784],{"class":359},[275,2384,2385],{"class":289}," sayMyName ",[275,2387,366],{"class":285},[275,2389,295],{"class":382},[275,2391,385],{"class":289},[275,2393,385],{"class":285},[275,2395,2140],{"class":390},[275,2397,414],{"class":285},[275,2399,402],{"class":401},[275,2401,419],{"class":359},[275,2403,369],{"class":285},[275,2405,2406,2408,2410,2413,2415,2417,2419,2421,2423,2425,2427,2429,2431],{"class":277,"line":958},[275,2407,1902],{"class":281},[275,2409,430],{"class":285},[275,2411,2412],{"class":307},"hello ",[275,2414,436],{"class":285},[275,2416,2140],{"class":289},[275,2418,221],{"class":285},[275,2420,2023],{"class":289},[275,2422,221],{"class":285},[275,2424,2354],{"class":289},[275,2426,221],{"class":285},[275,2428,758],{"class":289},[275,2430,1014],{"class":285},[275,2432,314],{"class":285},[275,2434,2435,2437,2439],{"class":277,"line":963},[275,2436,298],{"class":285},[275,2438,467],{"class":289},[275,2440,314],{"class":285},[275,2442,2443],{"class":277,"line":969},[275,2444,350],{"emptyLinePlaceholder":349},[275,2446,2447,2449,2451,2453],{"class":277,"line":1001},[275,2448,784],{"class":359},[275,2450,363],{"class":289},[275,2452,366],{"class":285},[275,2454,369],{"class":285},[275,2456,2457,2460],{"class":277,"line":1019},[275,2458,2459],{"class":289},"    authorizationMiddleFn",[275,2461,470],{"class":285},[275,2463,2464,2467],{"class":277,"line":1028},[275,2465,2466],{"class":289},"    sayMyName",[275,2468,470],{"class":285},[275,2470,2472,2474,2476,2478],{"class":277,"line":2471},24,[275,2473,298],{"class":285},[275,2475,626],{"class":281},[275,2477,629],{"class":401},[275,2479,314],{"class":285},[275,2481,2483],{"class":277,"line":2482},25,[275,2484,350],{"emptyLinePlaceholder":349},[275,2486,2488,2490,2492,2495,2497,2499,2501,2503],{"class":277,"line":2487},26,[275,2489,356],{"class":281},[275,2491,360],{"class":359},[275,2493,2494],{"class":289}," apiSpec ",[275,2496,366],{"class":285},[275,2498,542],{"class":281},[275,2500,1749],{"class":382},[275,2502,1752],{"class":289},[275,2504,314],{"class":285},[2014,2506,2508],{"id":2507},"context-data-factory","Context Data Factory",[201,2510,2511,2512,2515],{},"It is possible to define a ",[231,2513,2514],{},"contextDataFactory"," function used to initialize the context data object on every request.\nThis factory function will be called before any route or middleFn gets executed and the returned value will be the default shared object for all routes and middleFns.",[2517,2518,2520],"h4",{"id":2519},"defining-a-context-data-factory","Defining a context data factory",[266,2522,2524],{"className":268,"code":2523,"language":270,"meta":271,"style":271},"import {initMionRouter, route} from '@mionjs\u002Frouter';\nimport type {CallContext, Routes} from '@mionjs\u002Frouter';\nimport type {User} from '.\u002Ffull-example.app.ts';\n\ninterface ContextData {\n    myUser: User | null;\n    \u002F\u002F ... other context data properties\n}\nconst initContextData = (): ContextData => ({myUser: null});\n\ntype MyContext = CallContext\u003CContextData>;\n\nconst routes = {\n    getMyPet: route(async (ctx: MyContext): Promise\u003CPet> => {\n        const user = ctx.shared.myUser;\n        const pet = await myApp.db.getPetFromUser(user);\n        return pet;\n    }),\n} satisfies Routes;\n\nexport const myApi = await initMionRouter(routes, {contextDataFactory: initContextData});\n",[231,2525,2526,2550,2576,2598,2602,2611,2627,2632,2636,2667,2671,2689,2693,2703,2739,2760,2793,2801,2809,2819,2823],{"__ignoreMap":271},[275,2527,2528,2530,2532,2534,2536,2538,2540,2542,2544,2546,2548],{"class":277,"line":278},[275,2529,282],{"class":281},[275,2531,286],{"class":285},[275,2533,1334],{"class":289},[275,2535,292],{"class":285},[275,2537,295],{"class":289},[275,2539,298],{"class":285},[275,2541,301],{"class":281},[275,2543,304],{"class":285},[275,2545,308],{"class":307},[275,2547,311],{"class":285},[275,2549,314],{"class":285},[275,2551,2552,2554,2556,2558,2560,2562,2564,2566,2568,2570,2572,2574],{"class":277,"line":317},[275,2553,282],{"class":281},[275,2555,595],{"class":281},[275,2557,286],{"class":285},[275,2559,2003],{"class":289},[275,2561,292],{"class":285},[275,2563,629],{"class":289},[275,2565,298],{"class":285},[275,2567,301],{"class":281},[275,2569,304],{"class":285},[275,2571,308],{"class":307},[275,2573,311],{"class":285},[275,2575,314],{"class":285},[275,2577,2578,2580,2582,2584,2586,2588,2590,2592,2594,2596],{"class":277,"line":346},[275,2579,282],{"class":281},[275,2581,595],{"class":281},[275,2583,286],{"class":285},[275,2585,1282],{"class":289},[275,2587,298],{"class":285},[275,2589,301],{"class":281},[275,2591,304],{"class":285},[275,2593,339],{"class":307},[275,2595,311],{"class":285},[275,2597,314],{"class":285},[275,2599,2600],{"class":277,"line":353},[275,2601,350],{"emptyLinePlaceholder":349},[275,2603,2604,2606,2609],{"class":277,"line":372},[275,2605,1102],{"class":359},[275,2607,2608],{"class":401}," ContextData",[275,2610,369],{"class":285},[275,2612,2613,2616,2618,2620,2622,2625],{"class":277,"line":424},[275,2614,2615],{"class":375},"    myUser",[275,2617,379],{"class":285},[275,2619,751],{"class":401},[275,2621,507],{"class":285},[275,2623,2624],{"class":401}," null",[275,2626,314],{"class":285},[275,2628,2629],{"class":277,"line":461},[275,2630,2631],{"class":795},"    \u002F\u002F ... other context data properties\n",[275,2633,2634],{"class":277,"line":473},[275,2635,1144],{"class":285},[275,2637,2638,2640,2643,2645,2648,2650,2652,2654,2656,2658,2660,2663,2665],{"class":277,"line":530},[275,2639,784],{"class":359},[275,2641,2642],{"class":289}," initContextData ",[275,2644,366],{"class":285},[275,2646,2647],{"class":285}," ():",[275,2649,2608],{"class":401},[275,2651,419],{"class":359},[275,2653,488],{"class":289},[275,2655,578],{"class":285},[275,2657,2354],{"class":375},[275,2659,379],{"class":285},[275,2661,2662],{"class":285}," null}",[275,2664,467],{"class":289},[275,2666,314],{"class":285},[275,2668,2669],{"class":277,"line":561},[275,2670,350],{"emptyLinePlaceholder":349},[275,2672,2673,2675,2678,2680,2682,2684,2687],{"class":277,"line":612},[275,2674,748],{"class":359},[275,2676,2677],{"class":401}," MyContext",[275,2679,539],{"class":285},[275,2681,1382],{"class":401},[275,2683,513],{"class":285},[275,2685,2686],{"class":401},"ContextData",[275,2688,1444],{"class":285},[275,2690,2691],{"class":277,"line":621},[275,2692,350],{"emptyLinePlaceholder":349},[275,2694,2695,2697,2699,2701],{"class":277,"line":895},[275,2696,784],{"class":359},[275,2698,363],{"class":289},[275,2700,366],{"class":285},[275,2702,369],{"class":285},[275,2704,2705,2708,2710,2712,2714,2716,2718,2720,2722,2724,2726,2728,2730,2733,2735,2737],{"class":277,"line":901},[275,2706,2707],{"class":375},"    getMyPet",[275,2709,379],{"class":285},[275,2711,295],{"class":382},[275,2713,385],{"class":289},[275,2715,485],{"class":359},[275,2717,488],{"class":285},[275,2719,391],{"class":390},[275,2721,379],{"class":285},[275,2723,2677],{"class":401},[275,2725,414],{"class":285},[275,2727,2174],{"class":401},[275,2729,513],{"class":285},[275,2731,2732],{"class":401},"Pet",[275,2734,523],{"class":285},[275,2736,419],{"class":359},[275,2738,369],{"class":285},[275,2740,2741,2743,2745,2747,2750,2752,2754,2756,2758],{"class":277,"line":907},[275,2742,533],{"class":359},[275,2744,925],{"class":289},[275,2746,539],{"class":285},[275,2748,2749],{"class":289}," ctx",[275,2751,221],{"class":285},[275,2753,2023],{"class":289},[275,2755,221],{"class":285},[275,2757,2354],{"class":289},[275,2759,314],{"class":285},[275,2761,2762,2764,2767,2769,2771,2774,2776,2779,2781,2784,2786,2789,2791],{"class":277,"line":940},[275,2763,533],{"class":359},[275,2765,2766],{"class":289}," pet",[275,2768,539],{"class":285},[275,2770,542],{"class":281},[275,2772,2773],{"class":289}," myApp",[275,2775,221],{"class":285},[275,2777,2778],{"class":289},"db",[275,2780,221],{"class":285},[275,2782,2783],{"class":382},"getPetFromUser",[275,2785,385],{"class":375},[275,2787,2788],{"class":289},"user",[275,2790,467],{"class":375},[275,2792,314],{"class":285},[275,2794,2795,2797,2799],{"class":277,"line":949},[275,2796,427],{"class":281},[275,2798,2766],{"class":289},[275,2800,314],{"class":285},[275,2802,2803,2805,2807],{"class":277,"line":958},[275,2804,464],{"class":285},[275,2806,467],{"class":289},[275,2808,470],{"class":285},[275,2810,2811,2813,2815,2817],{"class":277,"line":963},[275,2812,298],{"class":285},[275,2814,626],{"class":281},[275,2816,629],{"class":401},[275,2818,314],{"class":285},[275,2820,2821],{"class":277,"line":969},[275,2822,350],{"emptyLinePlaceholder":349},[275,2824,2825,2827,2829,2832,2834,2836,2838,2841,2843,2845,2847,2849,2852,2854,2856],{"class":277,"line":1001},[275,2826,356],{"class":281},[275,2828,360],{"class":359},[275,2830,2831],{"class":289}," myApi ",[275,2833,366],{"class":285},[275,2835,542],{"class":281},[275,2837,1749],{"class":382},[275,2839,2840],{"class":289},"(routes",[275,2842,292],{"class":285},[275,2844,286],{"class":285},[275,2846,2514],{"class":375},[275,2848,379],{"class":285},[275,2850,2851],{"class":289}," initContextData",[275,2853,298],{"class":285},[275,2855,467],{"class":289},[275,2857,314],{"class":285},[2859,2860,2861],"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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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 .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}","Learn how to define and register routes in mion APIs.","md",null,{"toc":26},{"title":38,"description":2862},"yorPW9apOs50QfqW2rLR_t3B7XM0w6znYcuo9wk99zQ",[2869,2871],{"title":34,"path":35,"stem":36,"description":2870,"children":-1},"Core concepts and terminology used in mion APIs.",{"title":42,"path":43,"stem":44,"description":2872,"children":-1},"Learn how to define and use middleFns (middleware) in mion APIs.",1778674527219]