[{"data":1,"prerenderedAt":2246},["ShallowReactive",2],{"navigation_docs":3,"-client-cancellation-timeouts":195,"-client-cancellation-timeouts-surround":2241},[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","/introduction/about-mion","/introduction","1.introduction",[11,14,18,22],{"title":12,"path":7,"stem":13},"About mion","1.introduction/1.about-mion",{"title":15,"path":16,"stem":17},"Quick Start","/introduction/quick-start","1.introduction/2.quick-start",{"title":19,"path":20,"stem":21},"Manual Install","/introduction/manual-install","1.introduction/3.manual-install",{"title":23,"path":24,"stem":25},"What's Next","/introduction/what-is-next","1.introduction/4.what-is-next",false,{"title":28,"icon":29,"path":30,"stem":31,"children":32,"page":26},"Server","icon-park-outline:server","/server","20.server",[33,37,41,45,49,53,57],{"title":34,"path":35,"stem":36},"Router Overview","/server/overview","20.server/0.overview",{"title":38,"path":39,"stem":40},"Routes","/server/routes","20.server/1.routes",{"title":42,"path":43,"stem":44},"Middleware","/server/middle-fns","20.server/2.middle-fns",{"title":46,"path":47,"stem":48},"Request & Response","/server/request-and-response","20.server/5.request-and-response",{"title":50,"path":51,"stem":52},"Error Handling","/server/error-handling","20.server/6.error-handling",{"title":54,"path":55,"stem":56},"Validation","/server/validation","20.server/7.validation",{"title":58,"path":59,"stem":60},"Serialization","/server/serialization","20.server/8.serialization",{"title":62,"icon":63,"path":64,"stem":65,"children":66,"page":26},"Drizzle ORM","i-lineicons-drizzle","/drizzle-orm","21.drizzle-orm",[67,71],{"title":68,"path":69,"stem":70},"Drizzle Overview","/drizzle-orm/drizzle-overview","21.drizzle-orm/0.drizzle-overview",{"title":72,"path":73,"stem":74},"Column Mapping","/drizzle-orm/column-mapping","21.drizzle-orm/1.column-mapping",{"title":76,"icon":77,"path":78,"stem":79,"children":80,"page":26},"Client","icon-park-outline:computer","/client","3.client",[81,85,88,92,96],{"title":82,"path":83,"stem":84},"Client Overview","/client/client-overview","3.client/0.client-overview",{"title":50,"path":86,"stem":87},"/client/error-handling","3.client/1.error-handling",{"title":89,"path":90,"stem":91},"Validation Errors","/client/validation-errors","3.client/2.validation-errors",{"title":93,"path":94,"stem":95},"Routes Flow","/client/client-flow","3.client/3.client-flow",{"title":97,"path":98,"stem":99},"Cancellation & Timeouts","/client/cancellation-timeouts","3.client/4.cancellation-timeouts",{"title":101,"icon":102,"redirect":103,"path":104,"stem":105,"children":106,"page":26},"RunTypes","i-lucide-scan-text","/run-types/overview","/run-types","4.run-types",[107,110,114,118,122],{"title":108,"path":103,"stem":109},"RunTypes Overview","4.run-types/0.overview",{"title":111,"path":112,"stem":113},"Supported Types","/run-types/features","4.run-types/1.features",{"title":115,"path":116,"stem":117},"Type Formats","/run-types/type-formats","4.run-types/2.type-formats",{"title":119,"path":120,"stem":121},"Built-in Formats","/run-types/built-in-formats","4.run-types/3.built-in-formats",{"title":123,"path":124,"stem":125},"Caveats","/run-types/caveats","4.run-types/4.caveats",{"title":127,"path":128,"stem":129,"children":130,"page":26},"Devtools","/devtools","5.devtools",[131,135,139,143],{"title":132,"path":133,"stem":134},"AOT Compilation","/devtools/aot-compilation","5.devtools/0.aot-compilation",{"title":136,"path":137,"stem":138},"Pure Functions","/devtools/pure-functions","5.devtools/1.pure-functions",{"title":140,"path":141,"stem":142},"ESLint Rules","/devtools/eslint-rules","5.devtools/2.eslint-rules",{"title":144,"path":145,"stem":146},"Vite Configuration","/devtools/vite-config","5.devtools/3.vite-config",{"title":148,"redirect":149,"icon":150,"path":151,"stem":152,"children":153,"page":26},"Platforms","/platforms/node-js","icon-park-outline:play","/platforms","6.platforms",[154,157,161,165,169,173],{"title":155,"path":149,"stem":156},"Node.js","6.platforms/1.node-js",{"title":158,"path":159,"stem":160},"Bun","/platforms/bun","6.platforms/2.bun",{"title":162,"path":163,"stem":164},"AWS Lambda","/platforms/aws-lambda","6.platforms/3.aws-lambda",{"title":166,"path":167,"stem":168},"Google Cloud Functions","/platforms/google-cloud-functions","6.platforms/4.google-cloud-functions",{"title":170,"path":171,"stem":172},"Cloudflare Workers","/platforms/cloudflare","6.platforms/5.cloudflare",{"title":174,"path":175,"stem":176},"Vercel","/platforms/vercel","6.platforms/6.vercel",{"title":178,"icon":179,"redirect":180,"path":181,"stem":182,"children":183,"page":26},"Benchmarks","icon-park-outline:chart-line","/benchmarks/hello-world","/benchmarks","7.benchmarks",[184,187,191],{"title":185,"path":180,"stem":186},"Hello World","7.benchmarks/1.hello-world",{"title":188,"path":189,"stem":190},"Light Validation","/benchmarks/light-validation","7.benchmarks/2.light-validation",{"title":192,"path":193,"stem":194},"Heavy Validation","/benchmarks/heavy-validation","7.benchmarks/3.heavy-validation",{"id":196,"title":97,"body":197,"description":2235,"extension":2236,"links":2237,"meta":2238,"navigation":298,"path":98,"seo":2239,"stem":99,"__hash__":2240},"docs/3.client/4.cancellation-timeouts.md",{"type":198,"value":199},"minimark",[200,205,222,567,571,581,835,839,845,1147,1151,1161,1540,1547,1551,1567,2101,2108,2112,2123,2136,2148,2164,2169,2199,2203,2231],[201,202,204],"h2",{"id":203},"per-request-cancellation","Per-request Cancellation",[206,207,208,209,213,214,217,218,221],"p",{},"Use a standard ",[210,211,212],"code",{},"AbortController"," to cancel a specific request. Pass the signal via the ",[210,215,216],{},"call()"," setup object. Aborted requests return an error with ",[210,219,220],{},"type === 'request-aborted'",".",[223,224,229],"pre",{"className":225,"code":226,"language":227,"meta":228,"style":228},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import {initClient} from '@mionjs/client';\nimport type {MyApi} from './server.routes.ts';\n\nconst {routes} = initClient\u003CMyApi>({baseURL: 'http://localhost:3000'});\n\n// create an AbortController for this request\nconst controller = new AbortController();\n\n// pass the signal via call setup\nconst resultPromise = routes.users.sayHello({id: '1', name: 'John', surname: 'Doe'}).call({signal: controller.signal});\n\n// cancel the request (e.g. on component unmount or user action)\ncontroller.abort();\n\nconst [result, error] = await resultPromise;\n// error.type === 'request-aborted'\n","ts","",[210,230,231,267,293,300,357,362,369,391,396,402,501,506,512,527,532,561],{"__ignoreMap":228},[232,233,236,240,244,248,251,254,257,261,264],"span",{"class":234,"line":235},"line",1,[232,237,239],{"class":238},"s7zQu","import",[232,241,243],{"class":242},"sMK4o"," {",[232,245,247],{"class":246},"sTEyZ","initClient",[232,249,250],{"class":242},"}",[232,252,253],{"class":238}," from",[232,255,256],{"class":242}," '",[232,258,260],{"class":259},"sfazB","@mionjs/client",[232,262,263],{"class":242},"'",[232,265,266],{"class":242},";\n",[232,268,270,272,275,277,280,282,284,286,289,291],{"class":234,"line":269},2,[232,271,239],{"class":238},[232,273,274],{"class":238}," type",[232,276,243],{"class":242},[232,278,279],{"class":246},"MyApi",[232,281,250],{"class":242},[232,283,253],{"class":238},[232,285,256],{"class":242},[232,287,288],{"class":259},"./server.routes.ts",[232,290,263],{"class":242},[232,292,266],{"class":242},[232,294,296],{"class":234,"line":295},3,[232,297,299],{"emptyLinePlaceholder":298},true,"\n",[232,301,303,307,309,312,314,317,321,324,327,330,333,336,340,343,345,348,350,352,355],{"class":234,"line":302},4,[232,304,306],{"class":305},"spNyl","const",[232,308,243],{"class":242},[232,310,311],{"class":246},"routes",[232,313,250],{"class":242},[232,315,316],{"class":242}," =",[232,318,320],{"class":319},"s2Zo4"," initClient",[232,322,323],{"class":242},"\u003C",[232,325,279],{"class":326},"sBMFI",[232,328,329],{"class":242},">",[232,331,332],{"class":246},"(",[232,334,335],{"class":242},"{",[232,337,339],{"class":338},"swJcz","baseURL",[232,341,342],{"class":242},":",[232,344,256],{"class":242},[232,346,347],{"class":259},"http://localhost:3000",[232,349,263],{"class":242},[232,351,250],{"class":242},[232,353,354],{"class":246},")",[232,356,266],{"class":242},[232,358,360],{"class":234,"line":359},5,[232,361,299],{"emptyLinePlaceholder":298},[232,363,365],{"class":234,"line":364},6,[232,366,368],{"class":367},"sHwdD","// create an AbortController for this request\n",[232,370,372,374,377,380,383,386,389],{"class":234,"line":371},7,[232,373,306],{"class":305},[232,375,376],{"class":246}," controller ",[232,378,379],{"class":242},"=",[232,381,382],{"class":242}," new",[232,384,385],{"class":319}," AbortController",[232,387,388],{"class":246},"()",[232,390,266],{"class":242},[232,392,394],{"class":234,"line":393},8,[232,395,299],{"emptyLinePlaceholder":298},[232,397,399],{"class":234,"line":398},9,[232,400,401],{"class":367},"// pass the signal via call setup\n",[232,403,405,407,410,412,415,417,420,422,425,427,429,432,434,436,439,441,444,447,449,451,454,456,458,461,463,465,468,470,472,474,476,479,481,483,486,488,491,493,495,497,499],{"class":234,"line":404},10,[232,406,306],{"class":305},[232,408,409],{"class":246}," resultPromise ",[232,411,379],{"class":242},[232,413,414],{"class":246}," routes",[232,416,221],{"class":242},[232,418,419],{"class":246},"users",[232,421,221],{"class":242},[232,423,424],{"class":319},"sayHello",[232,426,332],{"class":246},[232,428,335],{"class":242},[232,430,431],{"class":338},"id",[232,433,342],{"class":242},[232,435,256],{"class":242},[232,437,438],{"class":259},"1",[232,440,263],{"class":242},[232,442,443],{"class":242},",",[232,445,446],{"class":338}," name",[232,448,342],{"class":242},[232,450,256],{"class":242},[232,452,453],{"class":259},"John",[232,455,263],{"class":242},[232,457,443],{"class":242},[232,459,460],{"class":338}," surname",[232,462,342],{"class":242},[232,464,256],{"class":242},[232,466,467],{"class":259},"Doe",[232,469,263],{"class":242},[232,471,250],{"class":242},[232,473,354],{"class":246},[232,475,221],{"class":242},[232,477,478],{"class":319},"call",[232,480,332],{"class":246},[232,482,335],{"class":242},[232,484,485],{"class":338},"signal",[232,487,342],{"class":242},[232,489,490],{"class":246}," controller",[232,492,221],{"class":242},[232,494,485],{"class":246},[232,496,250],{"class":242},[232,498,354],{"class":246},[232,500,266],{"class":242},[232,502,504],{"class":234,"line":503},11,[232,505,299],{"emptyLinePlaceholder":298},[232,507,509],{"class":234,"line":508},12,[232,510,511],{"class":367},"// cancel the request (e.g. on component unmount or user action)\n",[232,513,515,518,520,523,525],{"class":234,"line":514},13,[232,516,517],{"class":246},"controller",[232,519,221],{"class":242},[232,521,522],{"class":319},"abort",[232,524,388],{"class":246},[232,526,266],{"class":242},[232,528,530],{"class":234,"line":529},14,[232,531,299],{"emptyLinePlaceholder":298},[232,533,535,537,540,543,545,548,551,553,556,559],{"class":234,"line":534},15,[232,536,306],{"class":305},[232,538,539],{"class":242}," [",[232,541,542],{"class":246},"result",[232,544,443],{"class":242},[232,546,547],{"class":246}," error",[232,549,550],{"class":242},"]",[232,552,316],{"class":242},[232,554,555],{"class":238}," await",[232,557,558],{"class":246}," resultPromise",[232,560,266],{"class":242},[232,562,564],{"class":234,"line":563},16,[232,565,566],{"class":367},"// error.type === 'request-aborted'\n",[201,568,570],{"id":569},"per-request-timeout","Per-request Timeout",[206,572,573,574,577,578,221],{},"Set a ",[210,575,576],{},"timeout"," in milliseconds to automatically cancel a request if it takes too long. Timed-out requests return an error with ",[210,579,580],{},"type === 'request-timeout'",[223,582,584],{"className":225,"code":583,"language":227,"meta":228,"style":228},"import {initClient} from '@mionjs/client';\nimport type {MyApi} from './server.routes.ts';\n\nconst {routes} = initClient\u003CMyApi>({baseURL: 'http://localhost:3000'});\n\n// this request will fail if it takes longer than 5 seconds\nconst [result, error] = await routes.users.sayHello({id: '1', name: 'John', surname: 'Doe'}).call({timeout: 5000});\n\nif (error?.type === 'request-timeout') {\n    console.log('Request took too long');\n}\n",[210,585,586,606,628,632,672,676,681,773,777,807,830],{"__ignoreMap":228},[232,587,588,590,592,594,596,598,600,602,604],{"class":234,"line":235},[232,589,239],{"class":238},[232,591,243],{"class":242},[232,593,247],{"class":246},[232,595,250],{"class":242},[232,597,253],{"class":238},[232,599,256],{"class":242},[232,601,260],{"class":259},[232,603,263],{"class":242},[232,605,266],{"class":242},[232,607,608,610,612,614,616,618,620,622,624,626],{"class":234,"line":269},[232,609,239],{"class":238},[232,611,274],{"class":238},[232,613,243],{"class":242},[232,615,279],{"class":246},[232,617,250],{"class":242},[232,619,253],{"class":238},[232,621,256],{"class":242},[232,623,288],{"class":259},[232,625,263],{"class":242},[232,627,266],{"class":242},[232,629,630],{"class":234,"line":295},[232,631,299],{"emptyLinePlaceholder":298},[232,633,634,636,638,640,642,644,646,648,650,652,654,656,658,660,662,664,666,668,670],{"class":234,"line":302},[232,635,306],{"class":305},[232,637,243],{"class":242},[232,639,311],{"class":246},[232,641,250],{"class":242},[232,643,316],{"class":242},[232,645,320],{"class":319},[232,647,323],{"class":242},[232,649,279],{"class":326},[232,651,329],{"class":242},[232,653,332],{"class":246},[232,655,335],{"class":242},[232,657,339],{"class":338},[232,659,342],{"class":242},[232,661,256],{"class":242},[232,663,347],{"class":259},[232,665,263],{"class":242},[232,667,250],{"class":242},[232,669,354],{"class":246},[232,671,266],{"class":242},[232,673,674],{"class":234,"line":359},[232,675,299],{"emptyLinePlaceholder":298},[232,677,678],{"class":234,"line":364},[232,679,680],{"class":367},"// this request will fail if it takes longer than 5 seconds\n",[232,682,683,685,687,689,691,693,695,697,699,701,703,705,707,709,711,713,715,717,719,721,723,725,727,729,731,733,735,737,739,741,743,745,747,749,751,753,755,757,759,761,763,767,769,771],{"class":234,"line":371},[232,684,306],{"class":305},[232,686,539],{"class":242},[232,688,542],{"class":246},[232,690,443],{"class":242},[232,692,547],{"class":246},[232,694,550],{"class":242},[232,696,316],{"class":242},[232,698,555],{"class":238},[232,700,414],{"class":246},[232,702,221],{"class":242},[232,704,419],{"class":246},[232,706,221],{"class":242},[232,708,424],{"class":319},[232,710,332],{"class":246},[232,712,335],{"class":242},[232,714,431],{"class":338},[232,716,342],{"class":242},[232,718,256],{"class":242},[232,720,438],{"class":259},[232,722,263],{"class":242},[232,724,443],{"class":242},[232,726,446],{"class":338},[232,728,342],{"class":242},[232,730,256],{"class":242},[232,732,453],{"class":259},[232,734,263],{"class":242},[232,736,443],{"class":242},[232,738,460],{"class":338},[232,740,342],{"class":242},[232,742,256],{"class":242},[232,744,467],{"class":259},[232,746,263],{"class":242},[232,748,250],{"class":242},[232,750,354],{"class":246},[232,752,221],{"class":242},[232,754,478],{"class":319},[232,756,332],{"class":246},[232,758,335],{"class":242},[232,760,576],{"class":338},[232,762,342],{"class":242},[232,764,766],{"class":765},"sbssI"," 5000",[232,768,250],{"class":242},[232,770,354],{"class":246},[232,772,266],{"class":242},[232,774,775],{"class":234,"line":393},[232,776,299],{"emptyLinePlaceholder":298},[232,778,779,782,785,788,791,794,796,799,801,804],{"class":234,"line":398},[232,780,781],{"class":238},"if",[232,783,784],{"class":246}," (error",[232,786,787],{"class":242},"?.",[232,789,790],{"class":246},"type ",[232,792,793],{"class":242},"===",[232,795,256],{"class":242},[232,797,798],{"class":259},"request-timeout",[232,800,263],{"class":242},[232,802,803],{"class":246},") ",[232,805,806],{"class":242},"{\n",[232,808,809,812,814,817,819,821,824,826,828],{"class":234,"line":404},[232,810,811],{"class":246},"    console",[232,813,221],{"class":242},[232,815,816],{"class":319},"log",[232,818,332],{"class":338},[232,820,263],{"class":242},[232,822,823],{"class":259},"Request took too long",[232,825,263],{"class":242},[232,827,354],{"class":338},[232,829,266],{"class":242},[232,831,832],{"class":234,"line":503},[232,833,834],{"class":242},"}\n",[201,836,838],{"id":837},"client-level-default-timeout","Client-level Default Timeout",[206,840,841,842,844],{},"Set a default timeout for all requests via ",[210,843,247],{},". Per-request timeouts override the client default.",[223,846,848],{"className":225,"code":847,"language":227,"meta":228,"style":228},"import {initClient} from '@mionjs/client';\nimport type {MyApi} from './server.routes.ts';\n\n// all requests timeout after 10 seconds unless overridden per-request\nconst {routes} = initClient\u003CMyApi>({\n    baseURL: 'http://localhost:3000',\n    timeout: 10_000,\n});\n\n// uses the 10s default timeout\nconst [r1] = await routes.users.sayHello({id: '1', name: 'John', surname: 'Doe'}).call();\n\n// overrides to 2s for this specific call\nconst [r2, err] = await routes.users.sayHello({id: '1', name: 'John', surname: 'Doe'}).call({timeout: 2000});\n",[210,849,850,870,892,896,901,925,941,953,961,965,970,1045,1049,1054],{"__ignoreMap":228},[232,851,852,854,856,858,860,862,864,866,868],{"class":234,"line":235},[232,853,239],{"class":238},[232,855,243],{"class":242},[232,857,247],{"class":246},[232,859,250],{"class":242},[232,861,253],{"class":238},[232,863,256],{"class":242},[232,865,260],{"class":259},[232,867,263],{"class":242},[232,869,266],{"class":242},[232,871,872,874,876,878,880,882,884,886,888,890],{"class":234,"line":269},[232,873,239],{"class":238},[232,875,274],{"class":238},[232,877,243],{"class":242},[232,879,279],{"class":246},[232,881,250],{"class":242},[232,883,253],{"class":238},[232,885,256],{"class":242},[232,887,288],{"class":259},[232,889,263],{"class":242},[232,891,266],{"class":242},[232,893,894],{"class":234,"line":295},[232,895,299],{"emptyLinePlaceholder":298},[232,897,898],{"class":234,"line":302},[232,899,900],{"class":367},"// all requests timeout after 10 seconds unless overridden per-request\n",[232,902,903,905,907,909,911,913,915,917,919,921,923],{"class":234,"line":359},[232,904,306],{"class":305},[232,906,243],{"class":242},[232,908,311],{"class":246},[232,910,250],{"class":242},[232,912,316],{"class":242},[232,914,320],{"class":319},[232,916,323],{"class":242},[232,918,279],{"class":326},[232,920,329],{"class":242},[232,922,332],{"class":246},[232,924,806],{"class":242},[232,926,927,930,932,934,936,938],{"class":234,"line":364},[232,928,929],{"class":338},"    baseURL",[232,931,342],{"class":242},[232,933,256],{"class":242},[232,935,347],{"class":259},[232,937,263],{"class":242},[232,939,940],{"class":242},",\n",[232,942,943,946,948,951],{"class":234,"line":371},[232,944,945],{"class":338},"    timeout",[232,947,342],{"class":242},[232,949,950],{"class":765}," 10_000",[232,952,940],{"class":242},[232,954,955,957,959],{"class":234,"line":393},[232,956,250],{"class":242},[232,958,354],{"class":246},[232,960,266],{"class":242},[232,962,963],{"class":234,"line":398},[232,964,299],{"emptyLinePlaceholder":298},[232,966,967],{"class":234,"line":404},[232,968,969],{"class":367},"// uses the 10s default timeout\n",[232,971,972,974,976,979,981,983,985,987,989,991,993,995,997,999,1001,1003,1005,1007,1009,1011,1013,1015,1017,1019,1021,1023,1025,1027,1029,1031,1033,1035,1037,1039,1041,1043],{"class":234,"line":503},[232,973,306],{"class":305},[232,975,539],{"class":242},[232,977,978],{"class":246},"r1",[232,980,550],{"class":242},[232,982,316],{"class":242},[232,984,555],{"class":238},[232,986,414],{"class":246},[232,988,221],{"class":242},[232,990,419],{"class":246},[232,992,221],{"class":242},[232,994,424],{"class":319},[232,996,332],{"class":246},[232,998,335],{"class":242},[232,1000,431],{"class":338},[232,1002,342],{"class":242},[232,1004,256],{"class":242},[232,1006,438],{"class":259},[232,1008,263],{"class":242},[232,1010,443],{"class":242},[232,1012,446],{"class":338},[232,1014,342],{"class":242},[232,1016,256],{"class":242},[232,1018,453],{"class":259},[232,1020,263],{"class":242},[232,1022,443],{"class":242},[232,1024,460],{"class":338},[232,1026,342],{"class":242},[232,1028,256],{"class":242},[232,1030,467],{"class":259},[232,1032,263],{"class":242},[232,1034,250],{"class":242},[232,1036,354],{"class":246},[232,1038,221],{"class":242},[232,1040,478],{"class":319},[232,1042,388],{"class":246},[232,1044,266],{"class":242},[232,1046,1047],{"class":234,"line":508},[232,1048,299],{"emptyLinePlaceholder":298},[232,1050,1051],{"class":234,"line":514},[232,1052,1053],{"class":367},"// overrides to 2s for this specific call\n",[232,1055,1056,1058,1060,1063,1065,1068,1070,1072,1074,1076,1078,1080,1082,1084,1086,1088,1090,1092,1094,1096,1098,1100,1102,1104,1106,1108,1110,1112,1114,1116,1118,1120,1122,1124,1126,1128,1130,1132,1134,1136,1138,1141,1143,1145],{"class":234,"line":529},[232,1057,306],{"class":305},[232,1059,539],{"class":242},[232,1061,1062],{"class":246},"r2",[232,1064,443],{"class":242},[232,1066,1067],{"class":246}," err",[232,1069,550],{"class":242},[232,1071,316],{"class":242},[232,1073,555],{"class":238},[232,1075,414],{"class":246},[232,1077,221],{"class":242},[232,1079,419],{"class":246},[232,1081,221],{"class":242},[232,1083,424],{"class":319},[232,1085,332],{"class":246},[232,1087,335],{"class":242},[232,1089,431],{"class":338},[232,1091,342],{"class":242},[232,1093,256],{"class":242},[232,1095,438],{"class":259},[232,1097,263],{"class":242},[232,1099,443],{"class":242},[232,1101,446],{"class":338},[232,1103,342],{"class":242},[232,1105,256],{"class":242},[232,1107,453],{"class":259},[232,1109,263],{"class":242},[232,1111,443],{"class":242},[232,1113,460],{"class":338},[232,1115,342],{"class":242},[232,1117,256],{"class":242},[232,1119,467],{"class":259},[232,1121,263],{"class":242},[232,1123,250],{"class":242},[232,1125,354],{"class":246},[232,1127,221],{"class":242},[232,1129,478],{"class":319},[232,1131,332],{"class":246},[232,1133,335],{"class":242},[232,1135,576],{"class":338},[232,1137,342],{"class":242},[232,1139,1140],{"class":765}," 2000",[232,1142,250],{"class":242},[232,1144,354],{"class":246},[232,1146,266],{"class":242},[201,1148,1150],{"id":1149},"global-abort","Global Abort",[206,1152,1153,1154,1157,1158,221],{},"Use ",[210,1155,1156],{},"client.abort()"," to cancel all in-flight requests at once -- useful for SPA page navigation. New requests work normally after calling ",[210,1159,1160],{},"abort()",[223,1162,1164],{"className":225,"code":1163,"language":227,"meta":228,"style":228},"import {initClient} from '@mionjs/client';\nimport type {MyApi} from './server.routes.ts';\n\nconst {client, routes} = initClient\u003CMyApi>({baseURL: 'http://localhost:3000'});\n\n// start multiple requests\nconst p1 = routes.users.sayHello({id: '1', name: 'John', surname: 'Doe'}).call();\nconst p2 = routes.utils.sum(5, 2).call();\n\n// cancel ALL in-flight requests (e.g. user navigated away)\nclient.abort();\n\n// both return 'request-aborted' errors\nconst [, err1] = await p1; // err1.type === 'request-aborted'\nconst [, err2] = await p2; // err2.type === 'request-aborted'\n\n// new requests work normally after abort\nconst [greeting] = await routes.users.sayHello({id: '1', name: 'John', surname: 'Doe'}).call();\n",[210,1165,1166,1186,1208,1212,1257,1261,1266,1335,1376,1380,1385,1397,1401,1406,1431,1454,1458,1464],{"__ignoreMap":228},[232,1167,1168,1170,1172,1174,1176,1178,1180,1182,1184],{"class":234,"line":235},[232,1169,239],{"class":238},[232,1171,243],{"class":242},[232,1173,247],{"class":246},[232,1175,250],{"class":242},[232,1177,253],{"class":238},[232,1179,256],{"class":242},[232,1181,260],{"class":259},[232,1183,263],{"class":242},[232,1185,266],{"class":242},[232,1187,1188,1190,1192,1194,1196,1198,1200,1202,1204,1206],{"class":234,"line":269},[232,1189,239],{"class":238},[232,1191,274],{"class":238},[232,1193,243],{"class":242},[232,1195,279],{"class":246},[232,1197,250],{"class":242},[232,1199,253],{"class":238},[232,1201,256],{"class":242},[232,1203,288],{"class":259},[232,1205,263],{"class":242},[232,1207,266],{"class":242},[232,1209,1210],{"class":234,"line":295},[232,1211,299],{"emptyLinePlaceholder":298},[232,1213,1214,1216,1218,1221,1223,1225,1227,1229,1231,1233,1235,1237,1239,1241,1243,1245,1247,1249,1251,1253,1255],{"class":234,"line":302},[232,1215,306],{"class":305},[232,1217,243],{"class":242},[232,1219,1220],{"class":246},"client",[232,1222,443],{"class":242},[232,1224,414],{"class":246},[232,1226,250],{"class":242},[232,1228,316],{"class":242},[232,1230,320],{"class":319},[232,1232,323],{"class":242},[232,1234,279],{"class":326},[232,1236,329],{"class":242},[232,1238,332],{"class":246},[232,1240,335],{"class":242},[232,1242,339],{"class":338},[232,1244,342],{"class":242},[232,1246,256],{"class":242},[232,1248,347],{"class":259},[232,1250,263],{"class":242},[232,1252,250],{"class":242},[232,1254,354],{"class":246},[232,1256,266],{"class":242},[232,1258,1259],{"class":234,"line":359},[232,1260,299],{"emptyLinePlaceholder":298},[232,1262,1263],{"class":234,"line":364},[232,1264,1265],{"class":367},"// start multiple requests\n",[232,1267,1268,1270,1273,1275,1277,1279,1281,1283,1285,1287,1289,1291,1293,1295,1297,1299,1301,1303,1305,1307,1309,1311,1313,1315,1317,1319,1321,1323,1325,1327,1329,1331,1333],{"class":234,"line":371},[232,1269,306],{"class":305},[232,1271,1272],{"class":246}," p1 ",[232,1274,379],{"class":242},[232,1276,414],{"class":246},[232,1278,221],{"class":242},[232,1280,419],{"class":246},[232,1282,221],{"class":242},[232,1284,424],{"class":319},[232,1286,332],{"class":246},[232,1288,335],{"class":242},[232,1290,431],{"class":338},[232,1292,342],{"class":242},[232,1294,256],{"class":242},[232,1296,438],{"class":259},[232,1298,263],{"class":242},[232,1300,443],{"class":242},[232,1302,446],{"class":338},[232,1304,342],{"class":242},[232,1306,256],{"class":242},[232,1308,453],{"class":259},[232,1310,263],{"class":242},[232,1312,443],{"class":242},[232,1314,460],{"class":338},[232,1316,342],{"class":242},[232,1318,256],{"class":242},[232,1320,467],{"class":259},[232,1322,263],{"class":242},[232,1324,250],{"class":242},[232,1326,354],{"class":246},[232,1328,221],{"class":242},[232,1330,478],{"class":319},[232,1332,388],{"class":246},[232,1334,266],{"class":242},[232,1336,1337,1339,1342,1344,1346,1348,1351,1353,1356,1358,1361,1363,1366,1368,1370,1372,1374],{"class":234,"line":393},[232,1338,306],{"class":305},[232,1340,1341],{"class":246}," p2 ",[232,1343,379],{"class":242},[232,1345,414],{"class":246},[232,1347,221],{"class":242},[232,1349,1350],{"class":246},"utils",[232,1352,221],{"class":242},[232,1354,1355],{"class":319},"sum",[232,1357,332],{"class":246},[232,1359,1360],{"class":765},"5",[232,1362,443],{"class":242},[232,1364,1365],{"class":765}," 2",[232,1367,354],{"class":246},[232,1369,221],{"class":242},[232,1371,478],{"class":319},[232,1373,388],{"class":246},[232,1375,266],{"class":242},[232,1377,1378],{"class":234,"line":398},[232,1379,299],{"emptyLinePlaceholder":298},[232,1381,1382],{"class":234,"line":404},[232,1383,1384],{"class":367},"// cancel ALL in-flight requests (e.g. user navigated away)\n",[232,1386,1387,1389,1391,1393,1395],{"class":234,"line":503},[232,1388,1220],{"class":246},[232,1390,221],{"class":242},[232,1392,522],{"class":319},[232,1394,388],{"class":246},[232,1396,266],{"class":242},[232,1398,1399],{"class":234,"line":508},[232,1400,299],{"emptyLinePlaceholder":298},[232,1402,1403],{"class":234,"line":514},[232,1404,1405],{"class":367},"// both return 'request-aborted' errors\n",[232,1407,1408,1410,1413,1416,1418,1420,1422,1425,1428],{"class":234,"line":529},[232,1409,306],{"class":305},[232,1411,1412],{"class":242}," [,",[232,1414,1415],{"class":246}," err1",[232,1417,550],{"class":242},[232,1419,316],{"class":242},[232,1421,555],{"class":238},[232,1423,1424],{"class":246}," p1",[232,1426,1427],{"class":242},";",[232,1429,1430],{"class":367}," // err1.type === 'request-aborted'\n",[232,1432,1433,1435,1437,1440,1442,1444,1446,1449,1451],{"class":234,"line":534},[232,1434,306],{"class":305},[232,1436,1412],{"class":242},[232,1438,1439],{"class":246}," err2",[232,1441,550],{"class":242},[232,1443,316],{"class":242},[232,1445,555],{"class":238},[232,1447,1448],{"class":246}," p2",[232,1450,1427],{"class":242},[232,1452,1453],{"class":367}," // err2.type === 'request-aborted'\n",[232,1455,1456],{"class":234,"line":563},[232,1457,299],{"emptyLinePlaceholder":298},[232,1459,1461],{"class":234,"line":1460},17,[232,1462,1463],{"class":367},"// new requests work normally after abort\n",[232,1465,1467,1469,1471,1474,1476,1478,1480,1482,1484,1486,1488,1490,1492,1494,1496,1498,1500,1502,1504,1506,1508,1510,1512,1514,1516,1518,1520,1522,1524,1526,1528,1530,1532,1534,1536,1538],{"class":234,"line":1466},18,[232,1468,306],{"class":305},[232,1470,539],{"class":242},[232,1472,1473],{"class":246},"greeting",[232,1475,550],{"class":242},[232,1477,316],{"class":242},[232,1479,555],{"class":238},[232,1481,414],{"class":246},[232,1483,221],{"class":242},[232,1485,419],{"class":246},[232,1487,221],{"class":242},[232,1489,424],{"class":319},[232,1491,332],{"class":246},[232,1493,335],{"class":242},[232,1495,431],{"class":338},[232,1497,342],{"class":242},[232,1499,256],{"class":242},[232,1501,438],{"class":259},[232,1503,263],{"class":242},[232,1505,443],{"class":242},[232,1507,446],{"class":338},[232,1509,342],{"class":242},[232,1511,256],{"class":242},[232,1513,453],{"class":259},[232,1515,263],{"class":242},[232,1517,443],{"class":242},[232,1519,460],{"class":338},[232,1521,342],{"class":242},[232,1523,256],{"class":242},[232,1525,467],{"class":259},[232,1527,263],{"class":242},[232,1529,250],{"class":242},[232,1531,354],{"class":246},[232,1533,221],{"class":242},[232,1535,478],{"class":319},[232,1537,388],{"class":246},[232,1539,266],{"class":242},[1541,1542,1543,1546],"note",{},[210,1544,1545],{},"client.destroy()"," also aborts all in-flight requests before clearing handlers.",[201,1548,1550],{"id":1549},"combined-with-middlefns-and-routesflow","Combined with MiddleFns and RoutesFlow",[206,1552,1553,1554,1557,1558,1561,1562,1557,1564,1566],{},"Cancellation and timeouts work seamlessly with ",[210,1555,1556],{},"middleFns"," and ",[210,1559,1560],{},"routesFlow",". Pass ",[210,1563,485],{},[210,1565,576],{}," alongside other setup options.",[223,1568,1570],{"className":225,"code":1569,"language":227,"meta":228,"style":228},"import {initClient, routesFlow} from '@mionjs/client';\nimport type {MyApi} from './server.routes.ts';\nimport {HeadersSubset} from '@mionjs/core';\n\nconst {routes, middleFns} = initClient\u003CMyApi>({baseURL: 'http://localhost:3000'});\n\nconst controller = new AbortController();\n\n// cancellation works with middleFns\nconst [result, error, mfResults, mfErrors] = await routes.users.sayHello({id: '1', name: 'John', surname: 'Doe'}).call({\n    middleFns: {auth: middleFns.auth(new HeadersSubset({Authorization: 'myToken-XYZ'}))},\n    timeout: 5000,\n    signal: controller.signal,\n});\n\n// and with routesFlow\nconst [[sum, greeting], [sumError, greetingError]] = await routesFlow([\n    routes.utils.sum(5, 2),\n    routes.users.sayHello({id: '1', name: 'John', surname: 'Doe'}),\n]).call({\n    middleFns: {auth: middleFns.auth(new HeadersSubset({Authorization: 'myToken-XYZ'}))},\n    timeout: 10_000,\n});\n",[210,1571,1572,1597,1619,1641,1645,1690,1694,1710,1714,1719,1807,1859,1869,1884,1892,1896,1901,1940,1965,2022,2036,2081,2092],{"__ignoreMap":228},[232,1573,1574,1576,1578,1580,1582,1585,1587,1589,1591,1593,1595],{"class":234,"line":235},[232,1575,239],{"class":238},[232,1577,243],{"class":242},[232,1579,247],{"class":246},[232,1581,443],{"class":242},[232,1583,1584],{"class":246}," routesFlow",[232,1586,250],{"class":242},[232,1588,253],{"class":238},[232,1590,256],{"class":242},[232,1592,260],{"class":259},[232,1594,263],{"class":242},[232,1596,266],{"class":242},[232,1598,1599,1601,1603,1605,1607,1609,1611,1613,1615,1617],{"class":234,"line":269},[232,1600,239],{"class":238},[232,1602,274],{"class":238},[232,1604,243],{"class":242},[232,1606,279],{"class":246},[232,1608,250],{"class":242},[232,1610,253],{"class":238},[232,1612,256],{"class":242},[232,1614,288],{"class":259},[232,1616,263],{"class":242},[232,1618,266],{"class":242},[232,1620,1621,1623,1625,1628,1630,1632,1634,1637,1639],{"class":234,"line":295},[232,1622,239],{"class":238},[232,1624,243],{"class":242},[232,1626,1627],{"class":246},"HeadersSubset",[232,1629,250],{"class":242},[232,1631,253],{"class":238},[232,1633,256],{"class":242},[232,1635,1636],{"class":259},"@mionjs/core",[232,1638,263],{"class":242},[232,1640,266],{"class":242},[232,1642,1643],{"class":234,"line":302},[232,1644,299],{"emptyLinePlaceholder":298},[232,1646,1647,1649,1651,1653,1655,1658,1660,1662,1664,1666,1668,1670,1672,1674,1676,1678,1680,1682,1684,1686,1688],{"class":234,"line":359},[232,1648,306],{"class":305},[232,1650,243],{"class":242},[232,1652,311],{"class":246},[232,1654,443],{"class":242},[232,1656,1657],{"class":246}," middleFns",[232,1659,250],{"class":242},[232,1661,316],{"class":242},[232,1663,320],{"class":319},[232,1665,323],{"class":242},[232,1667,279],{"class":326},[232,1669,329],{"class":242},[232,1671,332],{"class":246},[232,1673,335],{"class":242},[232,1675,339],{"class":338},[232,1677,342],{"class":242},[232,1679,256],{"class":242},[232,1681,347],{"class":259},[232,1683,263],{"class":242},[232,1685,250],{"class":242},[232,1687,354],{"class":246},[232,1689,266],{"class":242},[232,1691,1692],{"class":234,"line":364},[232,1693,299],{"emptyLinePlaceholder":298},[232,1695,1696,1698,1700,1702,1704,1706,1708],{"class":234,"line":371},[232,1697,306],{"class":305},[232,1699,376],{"class":246},[232,1701,379],{"class":242},[232,1703,382],{"class":242},[232,1705,385],{"class":319},[232,1707,388],{"class":246},[232,1709,266],{"class":242},[232,1711,1712],{"class":234,"line":393},[232,1713,299],{"emptyLinePlaceholder":298},[232,1715,1716],{"class":234,"line":398},[232,1717,1718],{"class":367},"// cancellation works with middleFns\n",[232,1720,1721,1723,1725,1727,1729,1731,1733,1736,1738,1741,1743,1745,1747,1749,1751,1753,1755,1757,1759,1761,1763,1765,1767,1769,1771,1773,1775,1777,1779,1781,1783,1785,1787,1789,1791,1793,1795,1797,1799,1801,1803,1805],{"class":234,"line":404},[232,1722,306],{"class":305},[232,1724,539],{"class":242},[232,1726,542],{"class":246},[232,1728,443],{"class":242},[232,1730,547],{"class":246},[232,1732,443],{"class":242},[232,1734,1735],{"class":246}," mfResults",[232,1737,443],{"class":242},[232,1739,1740],{"class":246}," mfErrors",[232,1742,550],{"class":242},[232,1744,316],{"class":242},[232,1746,555],{"class":238},[232,1748,414],{"class":246},[232,1750,221],{"class":242},[232,1752,419],{"class":246},[232,1754,221],{"class":242},[232,1756,424],{"class":319},[232,1758,332],{"class":246},[232,1760,335],{"class":242},[232,1762,431],{"class":338},[232,1764,342],{"class":242},[232,1766,256],{"class":242},[232,1768,438],{"class":259},[232,1770,263],{"class":242},[232,1772,443],{"class":242},[232,1774,446],{"class":338},[232,1776,342],{"class":242},[232,1778,256],{"class":242},[232,1780,453],{"class":259},[232,1782,263],{"class":242},[232,1784,443],{"class":242},[232,1786,460],{"class":338},[232,1788,342],{"class":242},[232,1790,256],{"class":242},[232,1792,467],{"class":259},[232,1794,263],{"class":242},[232,1796,250],{"class":242},[232,1798,354],{"class":246},[232,1800,221],{"class":242},[232,1802,478],{"class":319},[232,1804,332],{"class":246},[232,1806,806],{"class":242},[232,1808,1809,1812,1814,1816,1819,1821,1823,1825,1827,1829,1832,1835,1837,1839,1842,1844,1846,1849,1851,1853,1856],{"class":234,"line":503},[232,1810,1811],{"class":338},"    middleFns",[232,1813,342],{"class":242},[232,1815,243],{"class":242},[232,1817,1818],{"class":338},"auth",[232,1820,342],{"class":242},[232,1822,1657],{"class":246},[232,1824,221],{"class":242},[232,1826,1818],{"class":319},[232,1828,332],{"class":246},[232,1830,1831],{"class":242},"new",[232,1833,1834],{"class":319}," HeadersSubset",[232,1836,332],{"class":246},[232,1838,335],{"class":242},[232,1840,1841],{"class":338},"Authorization",[232,1843,342],{"class":242},[232,1845,256],{"class":242},[232,1847,1848],{"class":259},"myToken-XYZ",[232,1850,263],{"class":242},[232,1852,250],{"class":242},[232,1854,1855],{"class":246},"))",[232,1857,1858],{"class":242},"},\n",[232,1860,1861,1863,1865,1867],{"class":234,"line":508},[232,1862,945],{"class":338},[232,1864,342],{"class":242},[232,1866,766],{"class":765},[232,1868,940],{"class":242},[232,1870,1871,1874,1876,1878,1880,1882],{"class":234,"line":514},[232,1872,1873],{"class":338},"    signal",[232,1875,342],{"class":242},[232,1877,490],{"class":246},[232,1879,221],{"class":242},[232,1881,485],{"class":246},[232,1883,940],{"class":242},[232,1885,1886,1888,1890],{"class":234,"line":529},[232,1887,250],{"class":242},[232,1889,354],{"class":246},[232,1891,266],{"class":242},[232,1893,1894],{"class":234,"line":534},[232,1895,299],{"emptyLinePlaceholder":298},[232,1897,1898],{"class":234,"line":563},[232,1899,1900],{"class":367},"// and with routesFlow\n",[232,1902,1903,1905,1908,1910,1912,1915,1918,1920,1923,1925,1928,1931,1933,1935,1937],{"class":234,"line":1460},[232,1904,306],{"class":305},[232,1906,1907],{"class":242}," [[",[232,1909,1355],{"class":246},[232,1911,443],{"class":242},[232,1913,1914],{"class":246}," greeting",[232,1916,1917],{"class":242},"],",[232,1919,539],{"class":242},[232,1921,1922],{"class":246},"sumError",[232,1924,443],{"class":242},[232,1926,1927],{"class":246}," greetingError",[232,1929,1930],{"class":242},"]]",[232,1932,316],{"class":242},[232,1934,555],{"class":238},[232,1936,1584],{"class":319},[232,1938,1939],{"class":246},"([\n",[232,1941,1942,1945,1947,1949,1951,1953,1955,1957,1959,1961,1963],{"class":234,"line":1466},[232,1943,1944],{"class":246},"    routes",[232,1946,221],{"class":242},[232,1948,1350],{"class":246},[232,1950,221],{"class":242},[232,1952,1355],{"class":319},[232,1954,332],{"class":246},[232,1956,1360],{"class":765},[232,1958,443],{"class":242},[232,1960,1365],{"class":765},[232,1962,354],{"class":246},[232,1964,940],{"class":242},[232,1966,1968,1970,1972,1974,1976,1978,1980,1982,1984,1986,1988,1990,1992,1994,1996,1998,2000,2002,2004,2006,2008,2010,2012,2014,2016,2018,2020],{"class":234,"line":1967},19,[232,1969,1944],{"class":246},[232,1971,221],{"class":242},[232,1973,419],{"class":246},[232,1975,221],{"class":242},[232,1977,424],{"class":319},[232,1979,332],{"class":246},[232,1981,335],{"class":242},[232,1983,431],{"class":338},[232,1985,342],{"class":242},[232,1987,256],{"class":242},[232,1989,438],{"class":259},[232,1991,263],{"class":242},[232,1993,443],{"class":242},[232,1995,446],{"class":338},[232,1997,342],{"class":242},[232,1999,256],{"class":242},[232,2001,453],{"class":259},[232,2003,263],{"class":242},[232,2005,443],{"class":242},[232,2007,460],{"class":338},[232,2009,342],{"class":242},[232,2011,256],{"class":242},[232,2013,467],{"class":259},[232,2015,263],{"class":242},[232,2017,250],{"class":242},[232,2019,354],{"class":246},[232,2021,940],{"class":242},[232,2023,2025,2028,2030,2032,2034],{"class":234,"line":2024},20,[232,2026,2027],{"class":246},"])",[232,2029,221],{"class":242},[232,2031,478],{"class":319},[232,2033,332],{"class":246},[232,2035,806],{"class":242},[232,2037,2039,2041,2043,2045,2047,2049,2051,2053,2055,2057,2059,2061,2063,2065,2067,2069,2071,2073,2075,2077,2079],{"class":234,"line":2038},21,[232,2040,1811],{"class":338},[232,2042,342],{"class":242},[232,2044,243],{"class":242},[232,2046,1818],{"class":338},[232,2048,342],{"class":242},[232,2050,1657],{"class":246},[232,2052,221],{"class":242},[232,2054,1818],{"class":319},[232,2056,332],{"class":246},[232,2058,1831],{"class":242},[232,2060,1834],{"class":319},[232,2062,332],{"class":246},[232,2064,335],{"class":242},[232,2066,1841],{"class":338},[232,2068,342],{"class":242},[232,2070,256],{"class":242},[232,2072,1848],{"class":259},[232,2074,263],{"class":242},[232,2076,250],{"class":242},[232,2078,1855],{"class":246},[232,2080,1858],{"class":242},[232,2082,2084,2086,2088,2090],{"class":234,"line":2083},22,[232,2085,945],{"class":338},[232,2087,342],{"class":242},[232,2089,950],{"class":765},[232,2091,940],{"class":242},[232,2093,2095,2097,2099],{"class":234,"line":2094},23,[232,2096,250],{"class":242},[232,2098,354],{"class":246},[232,2100,266],{"class":242},[2102,2103,2104,2105,2107],"tip",{},"When using ",[210,2106,1560],{}," with a timeout, the timeout applies to the entire batch request, not to individual routes within it.",[201,2109,2111],{"id":2110},"aborting-mutations-what-actually-happens","Aborting Mutations: What Actually Happens",[206,2113,2114,2115,2118,2119,2122],{},"Aborting an in-flight HTTP request stops the ",[2116,2117,1220],"strong",{}," from waiting — it does ",[2116,2120,2121],{},"not"," undo work on the server. By the time the abort signal fires, the server may have:",[2124,2125,2126,2130,2133],"ul",{},[2127,2128,2129],"li",{},"Not yet received the request — safe, no side effects",[2127,2131,2132],{},"Received and started processing — partially committed",[2127,2134,2135],{},"Fully processed and committed the result before the client noticed",[2137,2138,2139,2140,2143,2144,2147],"warning",{},"Aborted mutations should be treated as ",[2116,2141,2142],{},"unknown",", not as ",[2116,2145,2146],{},"failed",". The server may have changed state. There is no client-side way to tell the difference.",[206,2149,2150,2151,2153,2154,2156,2157,2159,2160,2163],{},"mion's ",[210,2152,1156],{},", per-request ",[210,2155,485],{},", and ",[210,2158,576],{}," options are best-effort: they cleanly cancel the ",[2116,2161,2162],{},"client-side wait",", but the server-side outcome is the same as if the connection had simply dropped. Server-side cancellation propagation is a separate concern not currently implemented.",[2165,2166,2168],"h3",{"id":2167},"patterns-to-handle-this-safely","Patterns to handle this safely",[2124,2170,2171,2177,2183,2189],{},[2127,2172,2173,2176],{},[2116,2174,2175],{},"Idempotency keys"," — generate a unique key per logical action and include it in the request (e.g. as a header or parameter). The server stores the key with the result; retries with the same key return the cached result. This makes \"abort + retry\" safe and is the pattern used by Stripe, Square, GitHub, and most production payment/mutation APIs.",[2127,2178,2179,2182],{},[2116,2180,2181],{},"Refetch & reconcile"," — after an abort, refetch the affected resource to determine its actual state. Show \"syncing…\" rather than \"failed\".",[2127,2184,2185,2188],{},[2116,2186,2187],{},"Don't expose abort for critical mutations"," — only allow cancellation for safe-to-retry operations. Let payments and similar irrevocable actions run to completion.",[2127,2190,2191,2198],{},[2116,2192,2193,2194,2197],{},"Treat ",[210,2195,2196],{},"request-aborted"," differently in your UI"," — don't show an error toast for user-initiated cancels; ignore them silently or show a neutral indicator.",[2165,2200,2202],{"id":2201},"queries-vs-mutations","Queries vs mutations",[206,2204,2205,2206,2209,2210,2213,2214,2217,2218,2221,2222,2225,2226,2230],{},"Cancellation is unconditionally safe for ",[2116,2207,2208],{},"queries"," (GET routes defined with ",[210,2211,2212],{},"query()","): the worst case is wasted work on the server. For ",[2116,2215,2216],{},"mutations"," (",[210,2219,2220],{},"mutation()"," and default ",[210,2223,2224],{},"route()"," calls), apply the patterns above and design with the assumption that any aborted request ",[2227,2228,2229],"em",{},"might"," have committed.",[2232,2233,2234],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .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}","Cancel in-flight requests and enforce timeouts using AbortSignal.","md",null,{"toc":26},{"title":97,"description":2235},"--sMrvBjXG6fB9HjWzqp06-igqdzMFbHGHW8AijSlYw",[2242,2244],{"title":93,"path":94,"stem":95,"description":2243,"children":-1},"Client-orchestrated queries that batch and compose API calls in a single request — a type-safe, deterministic alternative to GraphQL.",{"title":108,"path":103,"stem":109,"description":2245,"children":-1},"JIT compilation library that generates optimized validation, serialization, and mocking functions from TypeScript types.",1777152487674]