@mionjs/client 0.8.8 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/.dist/cjs/index.cjs +1 -2
  2. package/.dist/cjs/index.d.ts +5 -2
  3. package/.dist/cjs/middlewares.cjs +1 -0
  4. package/.dist/cjs/middlewares.d.ts +3 -0
  5. package/.dist/cjs/src/batch.cjs +3 -0
  6. package/.dist/cjs/src/batch.cjs.map +1 -0
  7. package/.dist/cjs/src/batch.d.ts +7 -0
  8. package/.dist/cjs/src/callContext.cjs +3 -0
  9. package/.dist/cjs/src/callContext.cjs.map +1 -0
  10. package/.dist/cjs/src/callContext.d.ts +6 -0
  11. package/.dist/cjs/src/client.cjs +3 -2
  12. package/.dist/cjs/src/client.cjs.map +1 -1
  13. package/.dist/cjs/src/client.d.ts +8 -13
  14. package/.dist/cjs/src/constants.cjs +3 -2
  15. package/.dist/cjs/src/constants.cjs.map +1 -1
  16. package/.dist/cjs/src/constants.d.ts +7 -3
  17. package/.dist/cjs/src/dispatch.cjs +3 -0
  18. package/.dist/cjs/src/dispatch.cjs.map +1 -0
  19. package/.dist/cjs/src/dispatch.d.ts +8 -0
  20. package/.dist/cjs/src/lib/apiBuildVersion.cjs +3 -0
  21. package/.dist/cjs/src/lib/apiBuildVersion.cjs.map +1 -0
  22. package/.dist/cjs/src/lib/apiBuildVersion.d.ts +10 -0
  23. package/.dist/cjs/src/lib/apiVersionRecovery.cjs +3 -0
  24. package/.dist/cjs/src/lib/apiVersionRecovery.cjs.map +1 -0
  25. package/.dist/cjs/src/lib/apiVersionRecovery.d.ts +7 -0
  26. package/.dist/cjs/src/lib/bundledApi.cjs +3 -0
  27. package/.dist/cjs/src/lib/bundledApi.cjs.map +1 -0
  28. package/.dist/cjs/src/lib/bundledApi.d.ts +12 -0
  29. package/.dist/cjs/src/lib/clientMethodsMetadata.cjs +3 -2
  30. package/.dist/cjs/src/lib/clientMethodsMetadata.cjs.map +1 -1
  31. package/.dist/cjs/src/lib/clientMethodsMetadata.d.ts +10 -10
  32. package/.dist/cjs/src/lib/clientResponse.cjs +3 -0
  33. package/.dist/cjs/src/lib/clientResponse.cjs.map +1 -0
  34. package/.dist/cjs/src/lib/clientResponse.d.ts +9 -0
  35. package/.dist/cjs/src/lib/fetchRemoteMethodsMetadata.cjs +3 -2
  36. package/.dist/cjs/src/lib/fetchRemoteMethodsMetadata.cjs.map +1 -1
  37. package/.dist/cjs/src/lib/fetchRemoteMethodsMetadata.d.ts +1 -1
  38. package/.dist/cjs/src/lib/handlersRegistry.cjs +3 -2
  39. package/.dist/cjs/src/lib/handlersRegistry.cjs.map +1 -1
  40. package/.dist/cjs/src/lib/handlersRegistry.d.ts +18 -9
  41. package/.dist/cjs/src/lib/headers.cjs +3 -0
  42. package/.dist/cjs/src/lib/headers.cjs.map +1 -0
  43. package/.dist/cjs/src/lib/headers.d.ts +7 -0
  44. package/.dist/cjs/src/lib/metadataEviction.cjs +3 -0
  45. package/.dist/cjs/src/lib/metadataEviction.cjs.map +1 -0
  46. package/.dist/cjs/src/lib/metadataEviction.d.ts +9 -0
  47. package/.dist/cjs/src/lib/metadataFetcher.cjs +3 -0
  48. package/.dist/cjs/src/lib/metadataFetcher.cjs.map +1 -0
  49. package/.dist/cjs/src/lib/metadataFetcher.d.ts +29 -0
  50. package/.dist/cjs/src/lib/metadataFromServer.cjs +1 -0
  51. package/.dist/cjs/src/lib/metadataFromServer.d.ts +4 -0
  52. package/.dist/cjs/src/lib/metadataFromServerLoader.cjs +3 -0
  53. package/.dist/cjs/src/lib/metadataFromServerLoader.cjs.map +1 -0
  54. package/.dist/cjs/src/lib/metadataFromServerLoader.d.ts +6 -0
  55. package/.dist/cjs/src/lib/metadataStore.cjs +3 -0
  56. package/.dist/cjs/src/lib/metadataStore.cjs.map +1 -0
  57. package/.dist/cjs/src/lib/metadataStore.d.ts +23 -0
  58. package/.dist/cjs/src/lib/methods.cjs +3 -0
  59. package/.dist/cjs/src/lib/methods.cjs.map +1 -0
  60. package/.dist/cjs/src/lib/methods.d.ts +15 -0
  61. package/.dist/cjs/src/lib/persistentStorage.cjs +3 -0
  62. package/.dist/cjs/src/lib/persistentStorage.cjs.map +1 -0
  63. package/.dist/cjs/src/lib/persistentStorage.d.ts +3 -0
  64. package/.dist/cjs/src/lib/sanitize.cjs +3 -0
  65. package/.dist/cjs/src/lib/sanitize.cjs.map +1 -0
  66. package/.dist/cjs/src/lib/sanitize.d.ts +3 -0
  67. package/.dist/cjs/src/lib/serializer.cjs +3 -2
  68. package/.dist/cjs/src/lib/serializer.cjs.map +1 -1
  69. package/.dist/cjs/src/lib/serializer.d.ts +8 -6
  70. package/.dist/cjs/src/lib/storage.cjs +0 -2
  71. package/.dist/cjs/src/lib/storage.d.ts +17 -10
  72. package/.dist/cjs/src/lib/typedEvent.cjs +3 -2
  73. package/.dist/cjs/src/lib/typedEvent.cjs.map +1 -1
  74. package/.dist/cjs/src/lib/typedEvent.d.ts +12 -10
  75. package/.dist/cjs/src/lib/validation.cjs +3 -2
  76. package/.dist/cjs/src/lib/validation.cjs.map +1 -1
  77. package/.dist/cjs/src/lib/validation.d.ts +4 -3
  78. package/.dist/cjs/src/middlewares/fetchMetadata.cjs +3 -0
  79. package/.dist/cjs/src/middlewares/fetchMetadata.cjs.map +1 -0
  80. package/.dist/cjs/src/middlewares/fetchMetadata.d.ts +4 -0
  81. package/.dist/cjs/src/middlewares/syncRoutes.cjs +3 -0
  82. package/.dist/cjs/src/middlewares/syncRoutes.cjs.map +1 -0
  83. package/.dist/cjs/src/middlewares/syncRoutes.d.ts +4 -0
  84. package/.dist/cjs/src/subRequest.cjs +3 -2
  85. package/.dist/cjs/src/subRequest.cjs.map +1 -1
  86. package/.dist/cjs/src/subRequest.d.ts +6 -10
  87. package/.dist/cjs/src/types.cjs +0 -2
  88. package/.dist/cjs/src/types.d.ts +91 -80
  89. package/.dist/esm/index.d.ts +5 -2
  90. package/.dist/esm/index.js +47 -28
  91. package/.dist/esm/middlewares.d.ts +3 -0
  92. package/.dist/esm/middlewares.js +6 -0
  93. package/.dist/esm/src/batch.d.ts +7 -0
  94. package/.dist/esm/src/batch.js +50 -0
  95. package/.dist/esm/src/batch.js.map +1 -0
  96. package/.dist/esm/src/callContext.d.ts +6 -0
  97. package/.dist/esm/src/callContext.js +34 -0
  98. package/.dist/esm/src/callContext.js.map +1 -0
  99. package/.dist/esm/src/client.d.ts +8 -13
  100. package/.dist/esm/src/client.js +54 -108
  101. package/.dist/esm/src/client.js.map +1 -1
  102. package/.dist/esm/src/constants.d.ts +7 -3
  103. package/.dist/esm/src/constants.js +21 -17
  104. package/.dist/esm/src/constants.js.map +1 -1
  105. package/.dist/esm/src/dispatch.d.ts +8 -0
  106. package/.dist/esm/src/dispatch.js +390 -0
  107. package/.dist/esm/src/dispatch.js.map +1 -0
  108. package/.dist/esm/src/lib/apiBuildVersion.d.ts +10 -0
  109. package/.dist/esm/src/lib/apiBuildVersion.js +43 -0
  110. package/.dist/esm/src/lib/apiBuildVersion.js.map +1 -0
  111. package/.dist/esm/src/lib/apiVersionRecovery.d.ts +7 -0
  112. package/.dist/esm/src/lib/apiVersionRecovery.js +43 -0
  113. package/.dist/esm/src/lib/apiVersionRecovery.js.map +1 -0
  114. package/.dist/esm/src/lib/bundledApi.d.ts +12 -0
  115. package/.dist/esm/src/lib/bundledApi.js +52 -0
  116. package/.dist/esm/src/lib/bundledApi.js.map +1 -0
  117. package/.dist/esm/src/lib/clientMethodsMetadata.d.ts +10 -10
  118. package/.dist/esm/src/lib/clientMethodsMetadata.js +257 -101
  119. package/.dist/esm/src/lib/clientMethodsMetadata.js.map +1 -1
  120. package/.dist/esm/src/lib/clientResponse.d.ts +9 -0
  121. package/.dist/esm/src/lib/clientResponse.js +53 -0
  122. package/.dist/esm/src/lib/clientResponse.js.map +1 -0
  123. package/.dist/esm/src/lib/fetchRemoteMethodsMetadata.d.ts +1 -1
  124. package/.dist/esm/src/lib/fetchRemoteMethodsMetadata.js +20 -17
  125. package/.dist/esm/src/lib/fetchRemoteMethodsMetadata.js.map +1 -1
  126. package/.dist/esm/src/lib/handlersRegistry.d.ts +18 -9
  127. package/.dist/esm/src/lib/handlersRegistry.js +53 -38
  128. package/.dist/esm/src/lib/handlersRegistry.js.map +1 -1
  129. package/.dist/esm/src/lib/headers.d.ts +7 -0
  130. package/.dist/esm/src/lib/headers.js +47 -0
  131. package/.dist/esm/src/lib/headers.js.map +1 -0
  132. package/.dist/esm/src/lib/metadataEviction.d.ts +9 -0
  133. package/.dist/esm/src/lib/metadataEviction.js +33 -0
  134. package/.dist/esm/src/lib/metadataEviction.js.map +1 -0
  135. package/.dist/esm/src/lib/metadataFetcher.d.ts +29 -0
  136. package/.dist/esm/src/lib/metadataFetcher.js +24 -0
  137. package/.dist/esm/src/lib/metadataFetcher.js.map +1 -0
  138. package/.dist/esm/src/lib/metadataFromServer.d.ts +4 -0
  139. package/.dist/esm/src/lib/metadataFromServer.js +15 -0
  140. package/.dist/esm/src/lib/metadataFromServerLoader.d.ts +6 -0
  141. package/.dist/esm/src/lib/metadataFromServerLoader.js +27 -0
  142. package/.dist/esm/src/lib/metadataFromServerLoader.js.map +1 -0
  143. package/.dist/esm/src/lib/metadataStore.d.ts +23 -0
  144. package/.dist/esm/src/lib/metadataStore.js +152 -0
  145. package/.dist/esm/src/lib/metadataStore.js.map +1 -0
  146. package/.dist/esm/src/lib/methods.d.ts +15 -0
  147. package/.dist/esm/src/lib/methods.js +41 -0
  148. package/.dist/esm/src/lib/methods.js.map +1 -0
  149. package/.dist/esm/src/lib/persistentStorage.d.ts +3 -0
  150. package/.dist/esm/src/lib/persistentStorage.js +26 -0
  151. package/.dist/esm/src/lib/persistentStorage.js.map +1 -0
  152. package/.dist/esm/src/lib/sanitize.d.ts +3 -0
  153. package/.dist/esm/src/lib/sanitize.js +25 -0
  154. package/.dist/esm/src/lib/sanitize.js.map +1 -0
  155. package/.dist/esm/src/lib/serializer.d.ts +8 -6
  156. package/.dist/esm/src/lib/serializer.js +75 -110
  157. package/.dist/esm/src/lib/serializer.js.map +1 -1
  158. package/.dist/esm/src/lib/storage.d.ts +17 -10
  159. package/.dist/esm/src/lib/storage.js +0 -43
  160. package/.dist/esm/src/lib/typedEvent.d.ts +12 -10
  161. package/.dist/esm/src/lib/typedEvent.js +25 -20
  162. package/.dist/esm/src/lib/typedEvent.js.map +1 -1
  163. package/.dist/esm/src/lib/validation.d.ts +4 -3
  164. package/.dist/esm/src/lib/validation.js +38 -33
  165. package/.dist/esm/src/lib/validation.js.map +1 -1
  166. package/.dist/esm/src/middlewares/fetchMetadata.d.ts +4 -0
  167. package/.dist/esm/src/middlewares/fetchMetadata.js +85 -0
  168. package/.dist/esm/src/middlewares/fetchMetadata.js.map +1 -0
  169. package/.dist/esm/src/middlewares/syncRoutes.d.ts +4 -0
  170. package/.dist/esm/src/middlewares/syncRoutes.js +20 -0
  171. package/.dist/esm/src/middlewares/syncRoutes.js.map +1 -0
  172. package/.dist/esm/src/subRequest.d.ts +6 -10
  173. package/.dist/esm/src/subRequest.js +11 -32
  174. package/.dist/esm/src/subRequest.js.map +1 -1
  175. package/.dist/esm/src/types.d.ts +91 -80
  176. package/.dist/esm/src/types.js +0 -2
  177. package/LICENSE +1 -1
  178. package/README.md +6 -6
  179. package/package.json +38 -26
  180. package/.dist/cjs/index.cjs.map +0 -1
  181. package/.dist/cjs/index.d.ts.map +0 -1
  182. package/.dist/cjs/src/client.d.ts.map +0 -1
  183. package/.dist/cjs/src/constants.d.ts.map +0 -1
  184. package/.dist/cjs/src/lib/clientMethodsMetadata.d.ts.map +0 -1
  185. package/.dist/cjs/src/lib/fetchRemoteMethodsMetadata.d.ts.map +0 -1
  186. package/.dist/cjs/src/lib/handlersRegistry.d.ts.map +0 -1
  187. package/.dist/cjs/src/lib/serializer.d.ts.map +0 -1
  188. package/.dist/cjs/src/lib/storage.cjs.map +0 -1
  189. package/.dist/cjs/src/lib/storage.d.ts.map +0 -1
  190. package/.dist/cjs/src/lib/testUtils.cjs +0 -2
  191. package/.dist/cjs/src/lib/testUtils.cjs.map +0 -1
  192. package/.dist/cjs/src/lib/testUtils.d.ts +0 -2
  193. package/.dist/cjs/src/lib/testUtils.d.ts.map +0 -1
  194. package/.dist/cjs/src/lib/typedEvent.d.ts.map +0 -1
  195. package/.dist/cjs/src/lib/validation.d.ts.map +0 -1
  196. package/.dist/cjs/src/request.cjs +0 -2
  197. package/.dist/cjs/src/request.cjs.map +0 -1
  198. package/.dist/cjs/src/request.d.ts +0 -37
  199. package/.dist/cjs/src/request.d.ts.map +0 -1
  200. package/.dist/cjs/src/routesFlow.cjs +0 -2
  201. package/.dist/cjs/src/routesFlow.cjs.map +0 -1
  202. package/.dist/cjs/src/routesFlow.d.ts +0 -7
  203. package/.dist/cjs/src/routesFlow.d.ts.map +0 -1
  204. package/.dist/cjs/src/subRequest.d.ts.map +0 -1
  205. package/.dist/cjs/src/types.cjs.map +0 -1
  206. package/.dist/cjs/src/types.d.ts.map +0 -1
  207. package/.dist/esm/index.d.ts.map +0 -1
  208. package/.dist/esm/index.js.map +0 -1
  209. package/.dist/esm/src/client.d.ts.map +0 -1
  210. package/.dist/esm/src/constants.d.ts.map +0 -1
  211. package/.dist/esm/src/lib/clientMethodsMetadata.d.ts.map +0 -1
  212. package/.dist/esm/src/lib/fetchRemoteMethodsMetadata.d.ts.map +0 -1
  213. package/.dist/esm/src/lib/handlersRegistry.d.ts.map +0 -1
  214. package/.dist/esm/src/lib/serializer.d.ts.map +0 -1
  215. package/.dist/esm/src/lib/storage.d.ts.map +0 -1
  216. package/.dist/esm/src/lib/storage.js.map +0 -1
  217. package/.dist/esm/src/lib/testUtils.d.ts +0 -2
  218. package/.dist/esm/src/lib/testUtils.d.ts.map +0 -1
  219. package/.dist/esm/src/lib/testUtils.js +0 -11
  220. package/.dist/esm/src/lib/testUtils.js.map +0 -1
  221. package/.dist/esm/src/lib/typedEvent.d.ts.map +0 -1
  222. package/.dist/esm/src/lib/validation.d.ts.map +0 -1
  223. package/.dist/esm/src/request.d.ts +0 -37
  224. package/.dist/esm/src/request.d.ts.map +0 -1
  225. package/.dist/esm/src/request.js +0 -334
  226. package/.dist/esm/src/request.js.map +0 -1
  227. package/.dist/esm/src/routesFlow.d.ts +0 -7
  228. package/.dist/esm/src/routesFlow.d.ts.map +0 -1
  229. package/.dist/esm/src/routesFlow.js +0 -60
  230. package/.dist/esm/src/routesFlow.js.map +0 -1
  231. package/.dist/esm/src/subRequest.d.ts.map +0 -1
  232. package/.dist/esm/src/types.d.ts.map +0 -1
  233. package/.dist/esm/src/types.js.map +0 -1
  234. package/index.ts +0 -19
  235. package/src/client.ts +0 -290
  236. package/src/constants.ts +0 -37
  237. package/src/lib/clientMethodsMetadata.ts +0 -187
  238. package/src/lib/fetchRemoteMethodsMetadata.ts +0 -44
  239. package/src/lib/handlersRegistry.ts +0 -101
  240. package/src/lib/serializer.ts +0 -245
  241. package/src/lib/storage.ts +0 -57
  242. package/src/lib/testUtils.ts +0 -16
  243. package/src/lib/typedEvent.ts +0 -57
  244. package/src/lib/validation.ts +0 -72
  245. package/src/request.ts +0 -563
  246. package/src/routesFlow.ts +0 -101
  247. package/src/subRequest.ts +0 -111
  248. package/src/types.ts +0 -237
@@ -0,0 +1,390 @@
1
+ import { CLIENT_REQUEST_ERROR_ID } from "./constants.js";
2
+ import { getMethod, hasMethod } from "./lib/methods.js";
3
+ import { getResponseError, validateSubRequests } from "./lib/validation.js";
4
+ import { extractRequestHeaders, headersToRecord, reconstructHeadersSubsetFromResponse } from "./lib/headers.js";
5
+ import { deserializeResponseBody, serializeRequestBody } from "./lib/serializer.js";
6
+ import { addSubRequest, createCallContext, getRouteIds, getRoutePointers } from "./callContext.js";
7
+ import { noteServerApiVersion, reportApiVersionMismatch, takeApiVersionError } from "./lib/apiBuildVersion.js";
8
+ import { getMetadataFetcher } from "./lib/metadataFetcher.js";
9
+ import { sanitizeSubRequests } from "./lib/sanitize.js";
10
+ import { addThrownError, deleteResponseValue, getResponseValue, hasResponseValue, setResponseValue } from "./lib/clientResponse.js";
11
+ import { BUILD_VERSION_HEADER, MION_ROUTES, ROUTER_ITEM_SEPARATOR_CHAR, RpcError, isRpcError, toBase64Url } from "@mionjs/core";
12
+ import { takeBundledApiError } from "#bundled-api";
13
+ async function dispatchCall(context, handlersRegistry) {
14
+ const metadata = getMetadataFetcher(handlersRegistry)?.startCall(context), state = {
15
+ context,
16
+ handlersRegistry,
17
+ metadata,
18
+ askedRequestHandlers: /* @__PURE__ */ new Set(),
19
+ sent: !1
20
+ }, retriedBy = /* @__PURE__ */ new Set();
21
+ for (; ; ) {
22
+ let errors;
23
+ try {
24
+ await runCall(state);
25
+ } catch (requestErrors) {
26
+ errors = requestErrors;
27
+ }
28
+ if (metadata && await resendsForMetadata(state, metadata, errors, retriedBy)) {
29
+ retriedBy.add(metadata.id), resetAttempt(state);
30
+ continue;
31
+ }
32
+ const hooks = await runMiddlewareResponses(state, getMiddlewareSubRequests(context), errors, retriedBy);
33
+ if (!hooks.retryIds.length) return buildResult(state, hooks.errors);
34
+ hooks.retryIds.forEach((id) => retriedBy.add(id)), resetForMiddlewareRetry(state);
35
+ }
36
+ }
37
+ async function dispatchTypeErrors(options, subRequests, handlersRegistry) {
38
+ const context = createCallContext(options);
39
+ subRequests.forEach((subRequest) => addSubRequest(context, subRequest));
40
+ const errors = /* @__PURE__ */ new Map();
41
+ try {
42
+ const subRequestIds = Object.keys(context.subRequestList);
43
+ return await loadMethodsMetadata(getMetadataFetcher(handlersRegistry)?.startCall(context), subRequestIds), sanitizeSubRequests(subRequestIds, context), validateSubRequests(subRequestIds, context, errors, !1), Object.values(context.subRequestList).map((subRequest) => subRequest.error?.errorData?.typeErrors || []).flat();
44
+ } catch (error) {
45
+ return onError(context, error, "Error preparing request", errors), Promise.reject(errors);
46
+ }
47
+ }
48
+ async function runCall(state) {
49
+ const { signal } = state.context;
50
+ if (signal?.aborted) {
51
+ const errors = /* @__PURE__ */ new Map();
52
+ return onError(state.context, signal.reason ?? new DOMException("This operation was aborted", "AbortError"), "Request aborted", errors), Promise.reject(errors);
53
+ }
54
+ return makeCall(state);
55
+ }
56
+ async function makeCall(state, skipOptimistic) {
57
+ const { context, metadata } = state, { options, signal } = context, errors = /* @__PURE__ */ new Map();
58
+ let isOptimistic = !1;
59
+ try {
60
+ const prepared = await metadata?.prepare(!!skipOptimistic), subRequestIds = prepared?.ids ?? Object.keys(context.subRequestList);
61
+ if (isOptimistic = !!prepared?.optimistic, signal?.aborted)
62
+ return onError(context, signal.reason ?? new DOMException("This operation was aborted", "AbortError"), "Request aborted", errors), Promise.reject(errors);
63
+ if (isOptimistic) {
64
+ const running = runRequestHandlers(state, getScopedRequestHandlerIds(state));
65
+ if (running && await running, signal?.aborted)
66
+ return onError(context, signal.reason, "Request aborted", errors), Promise.reject(errors);
67
+ metadata?.askRows();
68
+ } else {
69
+ await loadMethodsMetadata(metadata, subRequestIds, signal);
70
+ const chainIds = getChainMiddlewareIds(context, errors);
71
+ if (errors.size) return Promise.reject(errors);
72
+ const beforeHandlers = new Set(Object.keys(context.subRequestList)), running = runRequestHandlers(state, chainIds);
73
+ if (running && await running, signal?.aborted)
74
+ return onError(context, signal.reason, "Request aborted", errors), Promise.reject(errors);
75
+ const addedIds = Object.keys(context.subRequestList).filter((id) => !beforeHandlers.has(id)), allIds = [...subRequestIds, ...addedIds];
76
+ if (await loadMethodsMetadata(metadata, allIds, signal), sanitizeSubRequests(allIds, context), validateSubRequests(allIds, context, errors), errors.forEach((error, id) => setResponseValue(context.response, id, error)), errors.size) return Promise.reject(errors);
77
+ }
78
+ } catch (error) {
79
+ return onError(context, error, "Error preparing request", errors), Promise.reject(errors);
80
+ }
81
+ let response;
82
+ try {
83
+ let serialized;
84
+ try {
85
+ serialized = serializeRequestBody(context, isOptimistic);
86
+ } catch (serializeError) {
87
+ if (isOptimistic) return makeCall(state, !0);
88
+ throw serializeError;
89
+ }
90
+ const headersFromParams = extractRequestHeaders(context), url = new URL(context.path, options.baseURL), fetchOptions = buildFetchOptions(url, serialized, headersFromParams, options, isOptimistic, isQueryRoute(context), signal);
91
+ state.sent = !0, response = await fetch(url, fetchOptions), context.httpResponse = response;
92
+ } catch (error) {
93
+ return onError(context, error, "Error executing request", errors), Promise.reject(errors);
94
+ }
95
+ try {
96
+ if (signal?.aborted)
97
+ return onError(context, signal.reason, "Request aborted", errors), Promise.reject(errors);
98
+ const deserialized = await deserializeResponseBody(response, options, metadata && ((body) => metadata.readRows(body)));
99
+ return handlePlatformError(context, deserialized, errors) || (noteServerApiVersion(options.baseURL, response.headers.get(BUILD_VERSION_HEADER)) && !metadata && reportApiVersionMismatch(options.baseURL), addParamlessMiddlewares(context), resolveSubRequests(context, deserialized, errors), errors.size) ? Promise.reject(errors) : deserialized;
100
+ } catch (error) {
101
+ return onError(context, error, "Error parsing response", errors), Promise.reject(errors);
102
+ }
103
+ }
104
+ async function loadMethodsMetadata(metadata, methodIds, signal) {
105
+ const missing = methodIds.filter((id) => !hasMethod(id));
106
+ if (missing.length) {
107
+ if (metadata) return metadata.fetchRows(missing, signal);
108
+ throw new RpcError({
109
+ type: "route-metadata-not-found",
110
+ publicMessage: `No metadata for ${missing.map((id) => `'${id}'`).join(", ")}: the build did not bundle it and the client does not fetch it. Call the route where the build can see it, or set up useFetchMetadata from '@mionjs/client/middlewares'.`
111
+ });
112
+ }
113
+ }
114
+ async function resendsForMetadata(state, metadata, errors, retriedBy) {
115
+ return !errors || !state.sent || retriedBy.has(metadata.id) ? !1 : await metadata.shouldResend(errors).catch(() => !1) && isRetrySafe(state, errors);
116
+ }
117
+ function handlePlatformError(context, deserialized, errors) {
118
+ if (!(MION_ROUTES.platformError in deserialized)) return !1;
119
+ const platformError = deserialized[MION_ROUTES.platformError];
120
+ return Object.values(context.subRequestList).forEach((methodMeta) => methodMeta.isResolved = !0), setThrownError(context, CLIENT_REQUEST_ERROR_ID, platformError, errors), !0;
121
+ }
122
+ function setThrownError(context, id, error, errors) {
123
+ errors.set(id, error), context.thrownErrorIds.add(id), addThrownError(context.response, error);
124
+ }
125
+ function addParamlessMiddlewares(context) {
126
+ for (const id of getChainMiddlewareIds(context)) {
127
+ const method = getMethod(id);
128
+ context.subRequestList[id] || !method || method.paramsCount || method.headersParam || !method.hasReturnData || addSubRequest(context, {
129
+ pointer: method.pointer,
130
+ id,
131
+ isResolved: !1,
132
+ params: []
133
+ });
134
+ }
135
+ }
136
+ function resolveSubRequests(context, deserialized, errors) {
137
+ const { response, subRequestList } = context;
138
+ for (const [id, value] of Object.entries(deserialized)) id !== MION_ROUTES.thrownErrors && setResponseValue(response, id, value);
139
+ for (const [id, thrownError] of Object.entries(deserialized[MION_ROUTES.thrownErrors] ?? {})) {
140
+ const subRequest = Object.hasOwn(subRequestList, id) ? subRequestList[id] : void 0;
141
+ subRequest && (subRequest.isResolved = !0, subRequest.error = thrownError), thrownError.type === "validation-error" && setResponseValue(response, id, thrownError) ? errors.set(id, thrownError) : setThrownError(context, id, thrownError, errors);
142
+ }
143
+ const checkAnswers = context.options.validateServerResponses, mayHaveStopped = checkAnswers && (errors.size > 0 || Object.values(deserialized).some((value) => isRpcError(value)));
144
+ Object.entries(subRequestList).forEach(([id, methodMeta]) => {
145
+ if (errors.has(id)) return;
146
+ const headersSubset = reconstructHeadersSubsetFromResponse(id, context.httpResponse.headers);
147
+ headersSubset && setResponseValue(response, id, headersSubset);
148
+ const resp = headersSubset ?? getResponseValue(response, id);
149
+ if (methodMeta.isResolved = !0, isRpcError(resp)) {
150
+ methodMeta.error = resp, errors.set(id, resp);
151
+ return;
152
+ }
153
+ const responseError = checkAnswers && (hasResponseValue(response, id) || !mayHaveStopped) ? getResponseError(id, resp) : void 0;
154
+ responseError ? (methodMeta.error = responseError, deleteResponseValue(response, id), setThrownError(context, id, responseError, errors)) : methodMeta.resolvedValue = resp;
155
+ }), Object.entries(deserialized).forEach(([id, value]) => {
156
+ id === MION_ROUTES.thrownErrors || Object.hasOwn(subRequestList, id) || isRpcError(value) && errors.set(id, value);
157
+ });
158
+ }
159
+ function onError(context, error, stageMessage, errors) {
160
+ const reason = context.signal?.aborted ? context.signal.reason : void 0;
161
+ if (reason instanceof DOMException) {
162
+ if (reason.name === "TimeoutError") {
163
+ setThrownError(context, CLIENT_REQUEST_ERROR_ID, new RpcError({
164
+ type: "request-timeout",
165
+ publicMessage: "Request timed out",
166
+ originalError: error instanceof Error ? error : void 0
167
+ }), errors);
168
+ return;
169
+ }
170
+ if (reason.name === "AbortError") {
171
+ setThrownError(context, CLIENT_REQUEST_ERROR_ID, new RpcError({
172
+ type: "request-aborted",
173
+ publicMessage: "Request was aborted",
174
+ originalError: error instanceof Error ? error : void 0
175
+ }), errors);
176
+ return;
177
+ }
178
+ }
179
+ if (isRpcError(error)) {
180
+ setThrownError(context, CLIENT_REQUEST_ERROR_ID, error, errors);
181
+ return;
182
+ }
183
+ const message = error?.message ? `${stageMessage}: ${error.message}` : `${stageMessage}: Unknown Error`;
184
+ setThrownError(context, CLIENT_REQUEST_ERROR_ID, new RpcError({
185
+ type: error?.name || "unknown-error",
186
+ publicMessage: message,
187
+ originalError: error instanceof Error ? error : void 0
188
+ }), errors);
189
+ }
190
+ function isQueryRoute(context) {
191
+ return context.batchSubRequests ? !1 : getMethod(context.requestId)?.options?.isMutation === !1;
192
+ }
193
+ function getChainMiddlewareIds(context, errors) {
194
+ const routeIds = new Set(getRouteIds(context)), chainIds = /* @__PURE__ */ new Set();
195
+ for (const routeId of routeIds) {
196
+ const methodMeta = getMethod(routeId);
197
+ if (!methodMeta) {
198
+ errors && setThrownError(context, routeId, new RpcError({
199
+ type: "route-metadata-not-found",
200
+ publicMessage: `Metadata for Route '${routeId}' not found.`
201
+ }), errors);
202
+ continue;
203
+ }
204
+ methodMeta.middlewareIds?.forEach((id) => !!id && !routeIds.has(id) && chainIds.add(id));
205
+ }
206
+ return [...chainIds];
207
+ }
208
+ function getScopedRequestHandlerIds(state) {
209
+ const routeIds = new Set(getRouteIds(state.context)), routePointers = getRoutePointers(state.context);
210
+ return state.handlersRegistry.getRequestHandlerIds().filter((id) => {
211
+ if (routeIds.has(id)) return !1;
212
+ const middlewarePointer = id.split(ROUTER_ITEM_SEPARATOR_CHAR);
213
+ return routePointers.some((routePointer) => isMiddlewareInScope(middlewarePointer, routePointer));
214
+ });
215
+ }
216
+ function runRequestHandlers(state, ids) {
217
+ const pending = [];
218
+ for (const id of ids) {
219
+ if (state.context.subRequestList[id] || state.askedRequestHandlers.has(id)) continue;
220
+ const entry = state.handlersRegistry.getRequestHandler(id);
221
+ if (!entry) continue;
222
+ state.askedRequestHandlers.add(id);
223
+ const running = runRequestHandler(state.context, id, entry);
224
+ running && pending.push(running);
225
+ }
226
+ if (pending.length) return Promise.all(pending).then(() => {
227
+ });
228
+ }
229
+ function runRequestHandler(context, id, entry) {
230
+ let subRequest, isOpen = !0;
231
+ const call = (...params) => {
232
+ isOpen && (subRequest = entry.createSubRequest(params));
233
+ }, finish = () => {
234
+ isOpen = !1, subRequest && addSubRequest(context, subRequest);
235
+ }, fail = (error) => {
236
+ throw isOpen = !1, requestHandlerError(id, error);
237
+ };
238
+ let returned;
239
+ try {
240
+ returned = entry.handler(call, context);
241
+ } catch (error) {
242
+ return fail(error);
243
+ }
244
+ return isPromiseLike(returned) ? Promise.resolve(returned).then(finish, fail) : finish();
245
+ }
246
+ function isPromiseLike(value) {
247
+ return !!value && typeof value.then == "function";
248
+ }
249
+ function requestHandlerError(id, error) {
250
+ return isRpcError(error) ? error : new RpcError({
251
+ type: "middleware-on-request-failed",
252
+ publicMessage: `onRequest for middleware '${id}' failed: ${error instanceof Error ? error.message : String(error)}`,
253
+ originalError: error instanceof Error ? error : void 0
254
+ });
255
+ }
256
+ function isMiddlewareInScope(middlewarePointer, routePointer) {
257
+ const groupDepth = middlewarePointer.length - 1;
258
+ if (groupDepth >= routePointer.length) return !1;
259
+ for (let i = 0; i < groupDepth; i++) if (middlewarePointer[i] !== routePointer[i]) return !1;
260
+ return !0;
261
+ }
262
+ function buildFetchOptions(url, serialized, headersFromParams, options, isOptimistic, isQuery, signal) {
263
+ if (!isOptimistic && isQuery && serialized.contentType.includes("json")) {
264
+ const encoded = toBase64Url(serialized.body), testUrl = new URL(url.pathname + url.search, url.origin);
265
+ if (testUrl.searchParams.set("data", encoded), testUrl.toString().length <= 4096)
266
+ return url.searchParams.set("data", encoded), {
267
+ ...options.fetchOptions,
268
+ method: "GET",
269
+ headers: {
270
+ ...headersToRecord(options.fetchOptions.headers),
271
+ ...headersFromParams
272
+ },
273
+ body: void 0,
274
+ signal
275
+ };
276
+ }
277
+ return {
278
+ ...options.fetchOptions,
279
+ method: "POST",
280
+ headers: {
281
+ ...headersToRecord(options.fetchOptions.headers),
282
+ ...headersFromParams,
283
+ "Content-Type": serialized.contentType
284
+ },
285
+ body: serialized.body,
286
+ signal
287
+ };
288
+ }
289
+ function getMiddlewareSubRequests(context) {
290
+ const routeIds = /* @__PURE__ */ new Set();
291
+ return context.route && routeIds.add(context.route.id), context.batchSubRequests && context.batchSubRequests.forEach((sr) => routeIds.add(sr.id)), Object.entries(context.subRequestList).filter(([id]) => !routeIds.has(id)).map(([, subRequest]) => subRequest);
292
+ }
293
+ async function runMiddlewareResponses(state, middlewareSubRequests, errors, retriedBy) {
294
+ const { context, handlersRegistry } = state, retryIds = [], pending = [];
295
+ let retrySafe;
296
+ const requestRetry = (id) => retriedBy.has(id) || (retrySafe ??= isRetrySafe(state, errors), !retrySafe) ? !1 : (retryIds.includes(id) || retryIds.push(id), !0), baseContext = {
297
+ route: context.route,
298
+ batchSubRequests: context.batchSubRequests,
299
+ subRequestList: context.subRequestList,
300
+ options: context.options,
301
+ signal: context.signal,
302
+ retry: () => !1
303
+ };
304
+ for (const middleware of middlewareSubRequests) {
305
+ const id = middleware.id, middlewareError = errors?.get(id), isErrorHandler = !!middlewareError;
306
+ if (isErrorHandler && context.thrownErrorIds.has(id) || !isErrorHandler && middleware.resolvedValue === void 0) continue;
307
+ const handlerName = isErrorHandler ? "onError" : "onResponse", handlers = isErrorHandler ? handlersRegistry.getErrorHandlers(id, middlewareError.type) : handlersRegistry.getResponseHandlers(id);
308
+ for (const handler of handlers) {
309
+ let isOpen = !0;
310
+ const middlewareContext = {
311
+ ...baseContext,
312
+ retry: () => isOpen && requestRetry(id)
313
+ }, fail = (error) => {
314
+ isOpen = !1, errors ??= /* @__PURE__ */ new Map(), setThrownError(context, CLIENT_REQUEST_ERROR_ID, middlewareHandlerError(handlerName, id, error), errors);
315
+ };
316
+ let returned;
317
+ try {
318
+ returned = handler(isErrorHandler ? middlewareError : middleware.resolvedValue, middlewareContext);
319
+ } catch (error) {
320
+ fail(error);
321
+ continue;
322
+ }
323
+ if (!isPromiseLike(returned)) {
324
+ isOpen = !1;
325
+ continue;
326
+ }
327
+ pending.push(Promise.resolve(returned).then(() => {
328
+ isOpen = !1;
329
+ }, (error) => fail(error)));
330
+ }
331
+ }
332
+ return pending.length && await Promise.all(pending), errors?.has("mion-client-request") && retryIds.length && (retryIds.length = 0), {
333
+ errors,
334
+ retryIds
335
+ };
336
+ }
337
+ function isRetrySafe(state, errors) {
338
+ return state.sent ? getRouteIds(state.context).every((id) => getMethod(id)?.options?.isMutation === !1 || !routeSucceeded(state.context, id, errors)) : !0;
339
+ }
340
+ function routeSucceeded(context, routeId, errors) {
341
+ const errorType = errors?.get(routeId)?.type;
342
+ return errorType === "response-validation-error" || errorType === "headers-validation-error" ? !0 : errors?.has(routeId) ? !1 : context.subRequestList[routeId]?.resolvedValue !== void 0 ? !0 : !errors?.size;
343
+ }
344
+ function resetForMiddlewareRetry(state) {
345
+ const { context } = state, routeIds = new Set(getRouteIds(context));
346
+ for (const id of Object.keys(context.subRequestList)) routeIds.has(id) || delete context.subRequestList[id];
347
+ state.askedRequestHandlers.clear(), resetAttempt(state);
348
+ }
349
+ function resetAttempt(state) {
350
+ const { context } = state;
351
+ Object.values(context.subRequestList).forEach((subRequest) => {
352
+ subRequest.isResolved = !1, subRequest.resolvedValue = void 0, subRequest.error = void 0;
353
+ }), context.thrownErrorIds.clear(), context.httpResponse = void 0, context.response = {}, state.sent = !1;
354
+ }
355
+ function middlewareHandlerError(handlerName, id, error) {
356
+ if (isRpcError(error)) return error;
357
+ const message = error instanceof Error ? error.message : String(error);
358
+ return new RpcError({
359
+ type: handlerName === "onError" ? "middleware-on-error-failed" : "middleware-on-response-failed",
360
+ publicMessage: `${handlerName} for middleware '${id}' failed: ${message}`,
361
+ originalError: error instanceof Error ? error : void 0
362
+ });
363
+ }
364
+ function buildResult(state, errors) {
365
+ const { route: routeSubRequest, batchSubRequests, thrownErrorIds, response } = state.context, declaredErrorFor = (id) => {
366
+ const error = errors?.get(id);
367
+ return error && !thrownErrorIds.has(id) ? error : void 0;
368
+ };
369
+ return [
370
+ takeBundledApiError(),
371
+ takeApiVersionError(),
372
+ state.metadata?.takeError()
373
+ ].forEach((error) => error && addThrownError(response, error)), batchSubRequests ? batchSubRequests.map((batchRoute) => [
374
+ batchRoute.resolvedValue,
375
+ declaredErrorFor(batchRoute.id),
376
+ response
377
+ ]) : [
378
+ routeSubRequest?.resolvedValue,
379
+ routeSubRequest && declaredErrorFor(routeSubRequest.id),
380
+ response
381
+ ];
382
+ }
383
+ export {
384
+ dispatchCall,
385
+ dispatchTypeErrors,
386
+ isMiddlewareInScope,
387
+ routeSucceeded
388
+ };
389
+
390
+ //# sourceMappingURL=dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.js","names":[],"sources":["../../../src/dispatch.ts"],"sourcesContent":["/* ########\n * 2023 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\nimport type {ResponseBody} from '@mionjs/router';\nimport type {\n BatchResult,\n ClientCallContext,\n ClientOptions,\n MiddlewareContext,\n MiddlewareSubRequest,\n RequestErrors,\n Result,\n RouteSubRequest,\n SubRequest,\n} from './types.ts';\nimport type {HandlersRegistry, RequestHandlerEntry} from './lib/handlersRegistry.ts';\nimport type {RunTypeError} from '@mionjs/core';\nimport {RpcError, isRpcError, MION_ROUTES, toBase64Url, BUILD_VERSION_HEADER, ROUTER_ITEM_SEPARATOR_CHAR} from '@mionjs/core';\nimport {addSubRequest, createCallContext, getRouteIds, getRoutePointers} from './callContext.ts';\nimport {noteServerApiVersion, reportApiVersionMismatch, takeApiVersionError} from './lib/apiBuildVersion.ts';\nimport {getMethod, hasMethod} from './lib/methods.ts';\nimport {getMetadataFetcher, type MetadataCall} from './lib/metadataFetcher.ts';\nimport {getResponseError, validateSubRequests} from './lib/validation.ts';\nimport {sanitizeSubRequests} from './lib/sanitize.ts';\nimport {serializeRequestBody, deserializeResponseBody} from './lib/serializer.ts';\nimport {MAX_GET_URL_LENGTH, CLIENT_REQUEST_ERROR_ID} from './constants.ts';\nimport {extractRequestHeaders, headersToRecord, reconstructHeadersSubsetFromResponse} from './lib/headers.ts';\nimport {addThrownError, deleteResponseValue, getResponseValue, hasResponseValue, setResponseValue} from './lib/clientResponse.ts';\nimport {takeBundledApiError} from '#bundled-api';\n\n/** One call's retry state: it belongs to the dispatch, never to the context onRequest hooks see */\ninterface DispatchState {\n readonly context: ClientCallContext;\n readonly handlersRegistry: HandlersRegistry;\n /** set only when the client set up `useFetchMetadata` */\n readonly metadata: MetadataCall | undefined;\n /** middlewares whose onRequest already ran, so a retry never asks twice */\n readonly askedRequestHandlers: Set<string>;\n /** the current attempt reached fetch, so the server may have run its routes */\n sent: boolean;\n}\n\n// ############# DISPATCH #############\n\nexport async function dispatchCall(\n context: ClientCallContext,\n handlersRegistry: HandlersRegistry\n): Promise<BatchResult<any> | Result<any, any>> {\n const metadata = getMetadataFetcher(handlersRegistry)?.startCall(context);\n const state: DispatchState = {\n context,\n handlersRegistry,\n metadata,\n askedRequestHandlers: new Set<string>(),\n sent: false,\n };\n // a middleware whose hook asked for a retry never gets another one in this call\n const retriedBy = new Set<string>();\n for (;;) {\n let errors: RequestErrors | undefined;\n try {\n await runCall(state);\n } catch (requestErrors: any) {\n errors = requestErrors;\n }\n // before any hook sees the failed attempt: a resend with fresh rows is the metadata's own, not a hook's\n if (metadata && (await resendsForMetadata(state, metadata, errors, retriedBy))) {\n retriedBy.add(metadata.id);\n // keeps what onRequest hooks sent: the params did not change, only how they are written\n resetAttempt(state);\n continue;\n }\n const hooks = await runMiddlewareResponses(state, getMiddlewareSubRequests(context), errors, retriedBy);\n if (!hooks.retryIds.length) return buildResult(state, hooks.errors);\n hooks.retryIds.forEach((id) => retriedBy.add(id));\n resetForMiddlewareRetry(state);\n }\n}\n\n/** Validates params locally without sending anything */\nexport async function dispatchTypeErrors(\n options: ClientOptions,\n subRequests: SubRequest<any>[],\n handlersRegistry?: HandlersRegistry\n): Promise<RunTypeError[]> {\n const context = createCallContext(options);\n subRequests.forEach((subRequest) => addSubRequest(context, subRequest));\n const errors: RequestErrors = new Map();\n try {\n const subRequestIds = Object.keys(context.subRequestList);\n await loadMethodsMetadata(getMetadataFetcher(handlersRegistry)?.startCall(context), subRequestIds);\n sanitizeSubRequests(subRequestIds, context);\n validateSubRequests(subRequestIds, context, errors, false);\n return Object.values(context.subRequestList)\n .map((subRequest) => subRequest.error?.errorData?.typeErrors || [])\n .flat();\n } catch (error: any) {\n onError(context, error, 'Error preparing request', errors);\n return Promise.reject(errors);\n }\n}\n\nasync function runCall(state: DispatchState): Promise<ResponseBody> {\n const {signal} = state.context;\n if (signal?.aborted) {\n const errors: RequestErrors = new Map();\n onError(\n state.context,\n signal.reason ?? new DOMException('This operation was aborted', 'AbortError'),\n 'Request aborted',\n errors\n );\n return Promise.reject(errors);\n }\n return makeCall(state);\n}\n\nasync function makeCall(state: DispatchState, skipOptimistic?: boolean): Promise<ResponseBody> {\n const {context, metadata} = state;\n const {options, signal} = context;\n const errors: RequestErrors = new Map();\n let isOptimistic = false;\n\n try {\n const prepared = await metadata?.prepare(!!skipOptimistic);\n const subRequestIds = prepared?.ids ?? Object.keys(context.subRequestList);\n isOptimistic = !!prepared?.optimistic;\n if (signal?.aborted) {\n onError(context, signal.reason ?? new DOMException('This operation was aborted', 'AbortError'), 'Request aborted', errors);\n return Promise.reject(errors);\n }\n if (isOptimistic) {\n // No chain before metadata, so scope picks the middlewares; a missed one costs the resend, an extra is ignored.\n const running = runRequestHandlers(state, getScopedRequestHandlerIds(state));\n if (running) await running;\n if (signal?.aborted) {\n onError(context, signal.reason, 'Request aborted', errors);\n return Promise.reject(errors);\n }\n metadata?.askRows();\n } else {\n await loadMethodsMetadata(metadata, subRequestIds, signal);\n const chainIds = getChainMiddlewareIds(context, errors);\n if (errors.size) return Promise.reject(errors);\n const beforeHandlers = new Set(Object.keys(context.subRequestList));\n const running = runRequestHandlers(state, chainIds);\n if (running) await running;\n if (signal?.aborted) {\n onError(context, signal.reason, 'Request aborted', errors);\n return Promise.reject(errors);\n }\n const addedIds = Object.keys(context.subRequestList).filter((id) => !beforeHandlers.has(id));\n const allIds = [...subRequestIds, ...addedIds];\n await loadMethodsMetadata(metadata, allIds, signal);\n sanitizeSubRequests(allIds, context);\n validateSubRequests(allIds, context, errors);\n // a validation error is typed, so it sits at its own path like a returned one\n errors.forEach((error, id) => setResponseValue(context.response, id, error));\n if (errors.size) return Promise.reject(errors);\n }\n } catch (error: any) {\n onError(context, error, 'Error preparing request', errors);\n return Promise.reject(errors);\n }\n\n let response: Response;\n try {\n let serialized: ReturnType<typeof serializeRequestBody>;\n try {\n serialized = serializeRequestBody(context, isOptimistic);\n } catch (serializeError) {\n // plain JSON.stringify failed and nothing was sent: fetch the rows first, then send the real encoders\n if (isOptimistic) return makeCall(state, true);\n throw serializeError;\n }\n\n const headersFromParams = extractRequestHeaders(context);\n const url = new URL(context.path, options.baseURL);\n const fetchOptions = buildFetchOptions(\n url,\n serialized,\n headersFromParams,\n options,\n isOptimistic,\n isQueryRoute(context),\n signal\n );\n state.sent = true;\n response = await fetch(url, fetchOptions);\n context.httpResponse = response;\n } catch (error: any) {\n onError(context, error, 'Error executing request', errors);\n return Promise.reject(errors);\n }\n\n try {\n // A body read after an in-flight abort may be truncated, so report the abort instead.\n if (signal?.aborted) {\n onError(context, signal.reason, 'Request aborted', errors);\n return Promise.reject(errors);\n }\n const deserialized = await deserializeResponseBody(response, options, metadata && ((body) => metadata.readRows(body)));\n if (handlePlatformError(context, deserialized, errors)) return Promise.reject(errors);\n // without the metadata middleware the client cannot check routes one by one, so the whole API is reported\n if (noteServerApiVersion(options.baseURL, response.headers.get(BUILD_VERSION_HEADER)) && !metadata)\n reportApiVersionMismatch(options.baseURL);\n addParamlessMiddlewares(context);\n resolveSubRequests(context, deserialized, errors);\n if (errors.size) return Promise.reject(errors);\n return deserialized;\n } catch (error) {\n onError(context, error, 'Error parsing response', errors);\n return Promise.reject(errors);\n }\n}\n\n/** Rows missing for any id: fetched when the client set up metadata fetching, a clear error otherwise. */\nasync function loadMethodsMetadata(metadata: MetadataCall | undefined, methodIds: string[], signal?: AbortSignal): Promise<void> {\n const missing = methodIds.filter((id) => !hasMethod(id));\n if (!missing.length) return;\n if (metadata) return metadata.fetchRows(missing, signal);\n throw new RpcError({\n type: 'route-metadata-not-found',\n publicMessage:\n `No metadata for ${missing.map((id) => `'${id}'`).join(', ')}: the build did not bundle it and the client does not fetch it. ` +\n `Call the route where the build can see it, or set up useFetchMetadata from '@mionjs/client/middlewares'.`,\n });\n}\n\n/** A metadata resend fixes an attempt that failed on the wire, once per call, never re-running a success. */\nasync function resendsForMetadata(\n state: DispatchState,\n metadata: MetadataCall,\n errors: RequestErrors | undefined,\n retriedBy: ReadonlySet<string>\n): Promise<boolean> {\n if (!errors || !state.sent || retriedBy.has(metadata.id)) return false;\n // a storage engine the app supplied can throw, and a call never rejects\n const resend = await metadata.shouldResend(errors).catch(() => false);\n return resend && isRetrySafe(state, errors);\n}\n\n/** A platform error is request-scoped: one entry, not one per subrequest */\nfunction handlePlatformError(context: ClientCallContext, deserialized: ResponseBody, errors: RequestErrors): boolean {\n if (!(MION_ROUTES.platformError in deserialized)) return false;\n const platformError = deserialized[MION_ROUTES.platformError];\n Object.values(context.subRequestList).forEach((methodMeta) => (methodMeta.isResolved = true));\n setThrownError(context, CLIENT_REQUEST_ERROR_ID, platformError as RpcError<string>, errors);\n return true;\n}\n\n/** An untyped error: only `@thrownErrors`, never a typed slot or a listener */\nfunction setThrownError(context: ClientCallContext, id: string, error: RpcError<string>, errors: RequestErrors): void {\n errors.set(id, error);\n context.thrownErrorIds.add(id);\n addThrownError(context.response, error);\n}\n\n/** A middleware with no params gets no onRequest call, yet its answer and declared errors are the caller's */\nfunction addParamlessMiddlewares(context: ClientCallContext): void {\n for (const id of getChainMiddlewareIds(context)) {\n const method = getMethod(id);\n if (context.subRequestList[id] || !method || method.paramsCount || method.headersParam || !method.hasReturnData) continue;\n addSubRequest(context, {pointer: method.pointer, id, isResolved: false, params: []});\n }\n}\n\n/** A thrown validation error is typed, so it moves to its path */\nfunction resolveSubRequests(context: ClientCallContext, deserialized: ResponseBody, errors: RequestErrors): void {\n const {response, subRequestList} = context;\n for (const [id, value] of Object.entries(deserialized)) {\n if (id !== MION_ROUTES.thrownErrors) setResponseValue(response, id, value);\n }\n for (const [id, thrownError] of Object.entries(deserialized[MION_ROUTES.thrownErrors] ?? {})) {\n // a response key is untrusted: only an own entry is one of this request's subrequests\n const subRequest = Object.hasOwn(subRequestList, id) ? subRequestList[id] : undefined;\n if (subRequest) {\n subRequest.isResolved = true;\n subRequest.error = thrownError;\n }\n if (thrownError.type === 'validation-error' && setResponseValue(response, id, thrownError)) errors.set(id, thrownError);\n else setThrownError(context, id, thrownError, errors);\n }\n\n const checkAnswers = context.options.validateServerResponses;\n // the halting brand never travels, so after any error an absent member may never have run\n const mayHaveStopped = checkAnswers && (errors.size > 0 || Object.values(deserialized).some((value) => isRpcError(value)));\n Object.entries(subRequestList).forEach(([id, methodMeta]) => {\n if (errors.has(id)) return;\n // a headers answer proves the member ran, so it is checked like a body one\n const headersSubset = reconstructHeadersSubsetFromResponse(id, (context.httpResponse as Response).headers);\n if (headersSubset) setResponseValue(response, id, headersSubset);\n const resp = headersSubset ?? getResponseValue(response, id);\n methodMeta.isResolved = true;\n if (isRpcError(resp)) {\n methodMeta.error = resp;\n errors.set(id, resp);\n return;\n }\n const responseError =\n checkAnswers && (hasResponseValue(response, id) || !mayHaveStopped) ? getResponseError(id, resp) : undefined;\n if (responseError) {\n methodMeta.error = responseError;\n deleteResponseValue(response, id);\n setThrownError(context, id, responseError, errors);\n } else {\n methodMeta.resolvedValue = resp;\n }\n });\n\n // an error for an id this request never asked for stays at its path; the map only feeds the retry rules\n Object.entries(deserialized).forEach(([id, value]) => {\n if (id === MION_ROUTES.thrownErrors || Object.hasOwn(subRequestList, id)) return;\n if (isRpcError(value)) errors.set(id, value);\n });\n}\n\nfunction onError(context: ClientCallContext, error: any, stageMessage: string, errors: RequestErrors): void {\n // Check signal.reason before the isRpcError return: a later stage may have wrapped the abort as an RpcError.\n const reason = context.signal?.aborted ? context.signal.reason : undefined;\n if (reason instanceof DOMException) {\n if (reason.name === 'TimeoutError') {\n setThrownError(\n context,\n CLIENT_REQUEST_ERROR_ID,\n new RpcError({\n type: 'request-timeout',\n publicMessage: 'Request timed out',\n originalError: error instanceof Error ? error : undefined,\n }),\n errors\n );\n return;\n }\n if (reason.name === 'AbortError') {\n setThrownError(\n context,\n CLIENT_REQUEST_ERROR_ID,\n new RpcError({\n type: 'request-aborted',\n publicMessage: 'Request was aborted',\n originalError: error instanceof Error ? error : undefined,\n }),\n errors\n );\n return;\n }\n }\n if (isRpcError(error)) {\n setThrownError(context, CLIENT_REQUEST_ERROR_ID, error, errors);\n return;\n }\n const message = error?.message ? `${stageMessage}: ${error.message}` : `${stageMessage}: Unknown Error`;\n setThrownError(\n context,\n CLIENT_REQUEST_ERROR_ID,\n new RpcError({\n type: error?.name || 'unknown-error',\n publicMessage: message,\n originalError: error instanceof Error ? error : undefined,\n }),\n errors\n );\n}\n\nfunction isQueryRoute(context: ClientCallContext): boolean {\n if (context.batchSubRequests) return false;\n const meta = getMethod(context.requestId);\n // strict false value required for queries\n return meta?.options?.isMutation === false;\n}\n\n// ############# ON REQUEST HOOKS #############\n\n/** The middlewares the cached metadata lists in the route's chain (standard flow) */\nfunction getChainMiddlewareIds(context: ClientCallContext, errors?: RequestErrors): string[] {\n const routeIds = new Set(getRouteIds(context));\n const chainIds = new Set<string>();\n for (const routeId of routeIds) {\n const methodMeta = getMethod(routeId);\n if (!methodMeta) {\n // without errors (after the answer) a missing row only means no chain to read\n if (errors) {\n setThrownError(\n context,\n routeId,\n new RpcError({\n type: 'route-metadata-not-found',\n publicMessage: `Metadata for Route '${routeId}' not found.`,\n }),\n errors\n );\n }\n continue;\n }\n methodMeta.middlewareIds?.forEach((id) => !!id && !routeIds.has(id) && chainIds.add(id));\n }\n return [...chainIds];\n}\n\n/** Optimistic flow: the chain is not cached yet, but a middleware's group is part of its pointer */\nfunction getScopedRequestHandlerIds(state: DispatchState): string[] {\n const routeIds = new Set(getRouteIds(state.context));\n const routePointers = getRoutePointers(state.context);\n return state.handlersRegistry.getRequestHandlerIds().filter((id) => {\n if (routeIds.has(id)) return false;\n const middlewarePointer = id.split(ROUTER_ITEM_SEPARATOR_CHAR);\n return routePointers.some((routePointer) => isMiddlewareInScope(middlewarePointer, routePointer));\n });\n}\n\n/** Runs each middleware's onRequest once per call, in chain order; awaits only when one returns a promise */\nfunction runRequestHandlers(state: DispatchState, ids: string[]): Promise<void> | void {\n const pending: Promise<void>[] = [];\n for (const id of ids) {\n if (state.context.subRequestList[id] || state.askedRequestHandlers.has(id)) continue;\n const entry = state.handlersRegistry.getRequestHandler(id);\n if (!entry) continue;\n state.askedRequestHandlers.add(id);\n const running = runRequestHandler(state.context, id, entry);\n if (running) pending.push(running);\n }\n if (pending.length) return Promise.all(pending).then(() => undefined);\n}\n\nfunction runRequestHandler(context: ClientCallContext, id: string, entry: RequestHandlerEntry): Promise<void> | void {\n let subRequest: SubRequest<any> | undefined;\n let isOpen = true;\n // the last call wins; a call after the handler finished belongs to no request\n const call = (...params: any[]) => {\n if (isOpen) subRequest = entry.createSubRequest(params);\n };\n const finish = () => {\n isOpen = false;\n if (subRequest) addSubRequest(context, subRequest);\n };\n const fail = (error: unknown): never => {\n isOpen = false;\n throw requestHandlerError(id, error);\n };\n let returned: void | Promise<void>;\n try {\n returned = entry.handler(call, context);\n } catch (error) {\n return fail(error);\n }\n if (!isPromiseLike(returned)) return finish();\n return Promise.resolve(returned).then(finish, fail);\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return !!value && typeof (value as PromiseLike<unknown>).then === 'function';\n}\n\n/** The result lands in @thrownErrors */\nfunction requestHandlerError(id: string, error: unknown): RpcError<string> {\n if (isRpcError(error)) return error;\n const message = error instanceof Error ? error.message : String(error);\n return new RpcError({\n type: 'middleware-on-request-failed',\n publicMessage: `onRequest for middleware '${id}' failed: ${message}`,\n originalError: error instanceof Error ? error : undefined,\n });\n}\n\n/** A middleware's scope is its pointer minus the last segment; a route is in scope when its pointer starts with it */\nexport function isMiddlewareInScope(middlewarePointer: string[], routePointer: string[]): boolean {\n const groupDepth = middlewarePointer.length - 1;\n if (groupDepth >= routePointer.length) return false;\n for (let i = 0; i < groupDepth; i++) if (middlewarePointer[i] !== routePointer[i]) return false;\n return true;\n}\n\n// ############# FETCH #############\n\n/** GET only for a JSON query whose URL fits MAX_GET_URL_LENGTH; mutations, optimistic calls and batches POST */\nfunction buildFetchOptions(\n url: URL,\n serialized: ReturnType<typeof serializeRequestBody>,\n headersFromParams: Record<string, string>,\n options: ClientOptions,\n isOptimistic: boolean,\n isQuery: boolean,\n signal?: AbortSignal\n): RequestInit {\n if (!isOptimistic && isQuery && serialized.contentType.includes('json')) {\n const encoded = toBase64Url(serialized.body as string);\n const testUrl = new URL(url.pathname + url.search, url.origin);\n testUrl.searchParams.set('data', encoded);\n\n if (testUrl.toString().length <= MAX_GET_URL_LENGTH) {\n url.searchParams.set('data', encoded);\n return {\n ...options.fetchOptions,\n method: 'GET',\n headers: {...headersToRecord(options.fetchOptions.headers), ...headersFromParams},\n body: undefined,\n signal,\n };\n }\n }\n\n return {\n ...options.fetchOptions,\n method: 'POST',\n headers: {...headersToRecord(options.fetchOptions.headers), ...headersFromParams, 'Content-Type': serialized.contentType},\n body: serialized.body as BodyInit,\n signal,\n };\n}\n\n// ############# RESULT #############\n\nfunction getMiddlewareSubRequests(context: ClientCallContext): MiddlewareSubRequest<any>[] {\n const routeIds = new Set<string>();\n if (context.route) routeIds.add(context.route.id);\n if (context.batchSubRequests) context.batchSubRequests.forEach((sr) => routeIds.add(sr.id));\n return Object.entries(context.subRequestList)\n .filter(([id]) => !routeIds.has(id))\n .map(([, subRequest]) => subRequest as MiddlewareSubRequest<any>);\n}\n\ninterface MiddlewareResponsesOutcome {\n errors: RequestErrors | undefined;\n /** middlewares whose hook asked for a retry that was allowed */\n retryIds: string[];\n}\n\n/** onError fires only for declared (returned) errors; thrown ones reach @thrownErrors only */\nasync function runMiddlewareResponses(\n state: DispatchState,\n middlewareSubRequests: MiddlewareSubRequest<any>[],\n errors: RequestErrors | undefined,\n retriedBy: ReadonlySet<string>\n): Promise<MiddlewareResponsesOutcome> {\n const {context, handlersRegistry} = state;\n const retryIds: string[] = [];\n const pending: Promise<void>[] = [];\n let retrySafe: boolean | undefined;\n /** Records the retry and says whether it will happen; the rule is worked out once per attempt */\n const requestRetry = (id: string): boolean => {\n if (retriedBy.has(id)) return false;\n retrySafe ??= isRetrySafe(state, errors);\n if (!retrySafe) return false;\n if (!retryIds.includes(id)) retryIds.push(id);\n return true;\n };\n // every middleware gets this context, with its own retry\n const baseContext: MiddlewareContext = {\n route: context.route,\n batchSubRequests: context.batchSubRequests,\n subRequestList: context.subRequestList,\n options: context.options,\n signal: context.signal,\n retry: () => false,\n };\n for (const middleware of middlewareSubRequests) {\n const id = middleware.id;\n const middlewareError = errors?.get(id);\n const isErrorHandler = !!middlewareError;\n if (isErrorHandler && context.thrownErrorIds.has(id)) continue;\n if (!isErrorHandler && middleware.resolvedValue === undefined) continue;\n const handlerName = isErrorHandler ? 'onError' : 'onResponse';\n const handlers = isErrorHandler\n ? handlersRegistry.getErrorHandlers(id, middlewareError.type)\n : handlersRegistry.getResponseHandlers(id);\n // a failing handler does not stop the rest\n for (const handler of handlers) {\n // a retry asked after the handler finished belongs to no attempt\n let isOpen = true;\n const middlewareContext: MiddlewareContext = {...baseContext, retry: () => isOpen && requestRetry(id)};\n const fail = (error: unknown) => {\n isOpen = false;\n errors ??= new Map();\n setThrownError(context, CLIENT_REQUEST_ERROR_ID, middlewareHandlerError(handlerName, id, error), errors);\n };\n let returned: unknown;\n try {\n returned = isErrorHandler\n ? handler(middlewareError, middlewareContext)\n : handler(middleware.resolvedValue, middlewareContext);\n } catch (error) {\n fail(error);\n continue;\n }\n if (!isPromiseLike(returned)) {\n isOpen = false;\n continue;\n }\n pending.push(\n Promise.resolve(returned).then(\n () => {\n isOpen = false;\n },\n (error) => fail(error)\n )\n );\n }\n }\n if (pending.length) await Promise.all(pending);\n // a failed handler ends the call: its error is the answer, not a resend\n if (errors?.has(CLIENT_REQUEST_ERROR_ID) && retryIds.length) retryIds.length = 0;\n return {errors, retryIds};\n}\n\n/** Safe when nothing was sent, or when every route is a query or did not succeed */\nfunction isRetrySafe(state: DispatchState, errors: RequestErrors | undefined): boolean {\n if (!state.sent) return true;\n return getRouteIds(state.context).every(\n (id) => getMethod(id)?.options?.isMutation === false || !routeSucceeded(state.context, id, errors)\n );\n}\n\n/** A void route answers nothing, so any error in the response counts it as failed */\nexport function routeSucceeded(context: ClientCallContext, routeId: string, errors: RequestErrors | undefined): boolean {\n const errorType = errors?.get(routeId)?.type;\n // the handler ran: its answer was refused, or the headers it built failed their check\n if (errorType === 'response-validation-error' || errorType === 'headers-validation-error') return true;\n if (errors?.has(routeId)) return false;\n if (context.subRequestList[routeId]?.resolvedValue !== undefined) return true;\n return !errors?.size;\n}\n\n/** Hook-driven retries ask every onRequest again: a hook usually retries because what it sends changed */\nfunction resetForMiddlewareRetry(state: DispatchState): void {\n const {context} = state;\n const routeIds = new Set(getRouteIds(context));\n for (const id of Object.keys(context.subRequestList)) {\n if (!routeIds.has(id)) delete context.subRequestList[id];\n }\n state.askedRequestHandlers.clear();\n resetAttempt(state);\n}\n\nfunction resetAttempt(state: DispatchState): void {\n const {context} = state;\n Object.values(context.subRequestList).forEach((subRequest) => {\n subRequest.isResolved = false;\n subRequest.resolvedValue = undefined;\n subRequest.error = undefined;\n });\n context.thrownErrorIds.clear();\n context.httpResponse = undefined;\n context.response = {};\n state.sent = false;\n}\n\n/** The result lands in @thrownErrors */\nfunction middlewareHandlerError(handlerName: 'onResponse' | 'onError', id: string, error: unknown): RpcError<string> {\n if (isRpcError(error)) return error;\n const message = error instanceof Error ? error.message : String(error);\n return new RpcError({\n type: handlerName === 'onError' ? 'middleware-on-error-failed' : 'middleware-on-response-failed',\n publicMessage: `${handlerName} for middleware '${id}' failed: ${message}`,\n originalError: error instanceof Error ? error : undefined,\n });\n}\n\n/** Slot rules are pinned in test/errorDispatch.spec.ts */\nfunction buildResult(\n state: DispatchState,\n errors: RequestErrors | undefined\n): BatchResult<RouteSubRequest<any>[]> | Result<any, any> {\n const {route: routeSubRequest, batchSubRequests, thrownErrorIds, response} = state.context;\n const declaredErrorFor = (id: string): RpcError<string> | undefined => {\n const error = errors?.get(id);\n return error && !thrownErrorIds.has(id) ? error : undefined;\n };\n\n // framework errors the router never saw: the call ran, so they are reported here rather than rejecting\n const frameworkErrors = [takeBundledApiError(), takeApiVersionError(), state.metadata?.takeError()];\n frameworkErrors.forEach((error) => error && addThrownError(response, error));\n\n // every batch entry is a call() Result sharing the same response\n if (batchSubRequests)\n return batchSubRequests.map(\n (batchRoute): Result<any, any> => [batchRoute.resolvedValue, declaredErrorFor(batchRoute.id), response]\n );\n return [routeSubRequest?.resolvedValue, routeSubRequest && declaredErrorFor(routeSubRequest.id), response];\n}\n"],"mappings":";;;;;;;;;;;;AAgDA,eAAsB,aACpB,SACA,kBAC8C;AAC9C,QAAM,WAAW,mBAAmB,gBAAgB,GAAG,UAAU,OAAO,GAClE,QAAuB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA,sBAAsB,oBAAI,IAAY;AAAA,IACtC,MAAM;AAAA,EACR,GAEM,YAAY,oBAAI,IAAY;AAClC,aAAS;AACP,QAAI;AACJ,QAAI;AACF,YAAM,QAAQ,KAAK;AAAA,IACrB,SAAS,eAAoB;AAC3B,eAAS;AAAA,IACX;AAEA,QAAI,YAAa,MAAM,mBAAmB,OAAO,UAAU,QAAQ,SAAS,GAAI;AAC9E,gBAAU,IAAI,SAAS,EAAE,GAEzB,aAAa,KAAK;AAClB;AAAA,IACF;AACA,UAAM,QAAQ,MAAM,uBAAuB,OAAO,yBAAyB,OAAO,GAAG,QAAQ,SAAS;AACtG,QAAI,CAAC,MAAM,SAAS,OAAQ,QAAO,YAAY,OAAO,MAAM,MAAM;AAClE,UAAM,SAAS,QAAA,CAAS,OAAO,UAAU,IAAI,EAAE,CAAC,GAChD,wBAAwB,KAAK;AAAA,EAC/B;AACF;AAGA,eAAsB,mBACpB,SACA,aACA,kBACyB;AACzB,QAAM,UAAU,kBAAkB,OAAO;AACzC,cAAY,QAAA,CAAS,eAAe,cAAc,SAAS,UAAU,CAAC;AACtE,QAAM,SAAwB,oBAAI,IAAI;AACtC,MAAI;AACF,UAAM,gBAAgB,OAAO,KAAK,QAAQ,cAAc;AACxD,iBAAM,oBAAoB,mBAAmB,gBAAgB,GAAG,UAAU,OAAO,GAAG,aAAa,GACjG,oBAAoB,eAAe,OAAO,GAC1C,oBAAoB,eAAe,SAAS,QAAQ,EAAK,GAClD,OAAO,OAAO,QAAQ,cAAc,EACxC,IAAA,CAAK,eAAe,WAAW,OAAO,WAAW,cAAc,CAAC,CAAC,EACjE,KAAK;AAAA,EACV,SAAS,OAAY;AACnB,mBAAQ,SAAS,OAAO,2BAA2B,MAAM,GAClD,QAAQ,OAAO,MAAM;AAAA,EAC9B;AACF;AAEA,eAAe,QAAQ,OAA6C;AAClE,QAAM,EAAC,OAAA,IAAU,MAAM;AACvB,MAAI,QAAQ,SAAS;AACnB,UAAM,SAAwB,oBAAI,IAAI;AACtC,mBACE,MAAM,SACN,OAAO,UAAU,IAAI,aAAa,8BAA8B,YAAY,GAC5E,mBACA,MACF,GACO,QAAQ,OAAO,MAAM;AAAA,EAC9B;AACA,SAAO,SAAS,KAAK;AACvB;AAEA,eAAe,SAAS,OAAsB,gBAAiD;AAC7F,QAAM,EAAC,SAAS,SAAA,IAAY,OACtB,EAAC,SAAS,OAAA,IAAU,SACpB,SAAwB,oBAAI,IAAI;AACtC,MAAI,eAAe;AAEnB,MAAI;AACF,UAAM,WAAW,MAAM,UAAU,QAAQ,CAAC,CAAC,cAAc,GACnD,gBAAgB,UAAU,OAAO,OAAO,KAAK,QAAQ,cAAc;AAEzE,QADA,eAAe,CAAC,CAAC,UAAU,YACvB,QAAQ;AACV,qBAAQ,SAAS,OAAO,UAAU,IAAI,aAAa,8BAA8B,YAAY,GAAG,mBAAmB,MAAM,GAClH,QAAQ,OAAO,MAAM;AAE9B,QAAI,cAAc;AAEhB,YAAM,UAAU,mBAAmB,OAAO,2BAA2B,KAAK,CAAC;AAE3E,UADI,WAAS,MAAM,SACf,QAAQ;AACV,uBAAQ,SAAS,OAAO,QAAQ,mBAAmB,MAAM,GAClD,QAAQ,OAAO,MAAM;AAE9B,gBAAU,QAAQ;AAAA,IACpB,OAAO;AACL,YAAM,oBAAoB,UAAU,eAAe,MAAM;AACzD,YAAM,WAAW,sBAAsB,SAAS,MAAM;AACtD,UAAI,OAAO,KAAM,QAAO,QAAQ,OAAO,MAAM;AAC7C,YAAM,iBAAiB,IAAI,IAAI,OAAO,KAAK,QAAQ,cAAc,CAAC,GAC5D,UAAU,mBAAmB,OAAO,QAAQ;AAElD,UADI,WAAS,MAAM,SACf,QAAQ;AACV,uBAAQ,SAAS,OAAO,QAAQ,mBAAmB,MAAM,GAClD,QAAQ,OAAO,MAAM;AAE9B,YAAM,WAAW,OAAO,KAAK,QAAQ,cAAc,EAAE,OAAA,CAAQ,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC,GACrF,SAAS,CAAC,GAAG,eAAe,GAAG,QAAQ;AAM7C,UALA,MAAM,oBAAoB,UAAU,QAAQ,MAAM,GAClD,oBAAoB,QAAQ,OAAO,GACnC,oBAAoB,QAAQ,SAAS,MAAM,GAE3C,OAAO,QAAA,CAAS,OAAO,OAAO,iBAAiB,QAAQ,UAAU,IAAI,KAAK,CAAC,GACvE,OAAO,KAAM,QAAO,QAAQ,OAAO,MAAM;AAAA,IAC/C;AAAA,EACF,SAAS,OAAY;AACnB,mBAAQ,SAAS,OAAO,2BAA2B,MAAM,GAClD,QAAQ,OAAO,MAAM;AAAA,EAC9B;AAEA,MAAI;AACJ,MAAI;AACF,QAAI;AACJ,QAAI;AACF,mBAAa,qBAAqB,SAAS,YAAY;AAAA,IACzD,SAAS,gBAAgB;AAEvB,UAAI,aAAc,QAAO,SAAS,OAAO,EAAI;AAC7C,YAAM;AAAA,IACR;AAEA,UAAM,oBAAoB,sBAAsB,OAAO,GACjD,MAAM,IAAI,IAAI,QAAQ,MAAM,QAAQ,OAAO,GAC3C,eAAe,kBACnB,KACA,YACA,mBACA,SACA,cACA,aAAa,OAAO,GACpB,MACF;AACA,UAAM,OAAO,IACb,WAAW,MAAM,MAAM,KAAK,YAAY,GACxC,QAAQ,eAAe;AAAA,EACzB,SAAS,OAAY;AACnB,mBAAQ,SAAS,OAAO,2BAA2B,MAAM,GAClD,QAAQ,OAAO,MAAM;AAAA,EAC9B;AAEA,MAAI;AAEF,QAAI,QAAQ;AACV,qBAAQ,SAAS,OAAO,QAAQ,mBAAmB,MAAM,GAClD,QAAQ,OAAO,MAAM;AAE9B,UAAM,eAAe,MAAM,wBAAwB,UAAU,SAAS,aAAA,CAAc,SAAS,SAAS,SAAS,IAAI,EAAE;AAOrH,WANI,oBAAoB,SAAS,cAAc,MAAM,MAEjD,qBAAqB,QAAQ,SAAS,SAAS,QAAQ,IAAI,oBAAoB,CAAC,KAAK,CAAC,YACxF,yBAAyB,QAAQ,OAAO,GAC1C,wBAAwB,OAAO,GAC/B,mBAAmB,SAAS,cAAc,MAAM,GAC5C,OAAO,QAAa,QAAQ,OAAO,MAAM,IACtC;AAAA,EACT,SAAS,OAAO;AACd,mBAAQ,SAAS,OAAO,0BAA0B,MAAM,GACjD,QAAQ,OAAO,MAAM;AAAA,EAC9B;AACF;AAGA,eAAe,oBAAoB,UAAoC,WAAqB,QAAqC;AAC/H,QAAM,UAAU,UAAU,OAAA,CAAQ,OAAO,CAAC,UAAU,EAAE,CAAC;AACvD,MAAK,QAAQ,QACb;AAAA,QAAI,SAAU,QAAO,SAAS,UAAU,SAAS,MAAM;AACvD,UAAM,IAAI,SAAS;AAAA,MACjB,MAAM;AAAA,MACN,eACE,mBAAmB,QAAQ,IAAA,CAAK,OAAO,IAAI,EAAA,GAAK,EAAE,KAAK,IAAI,CAAA;AAAA,IAE/D,CAAC;AAAA;AACH;AAGA,eAAe,mBACb,OACA,UACA,QACA,WACkB;AAClB,SAAI,CAAC,UAAU,CAAC,MAAM,QAAQ,UAAU,IAAI,SAAS,EAAE,IAAU,KAG1D,MADc,SAAS,aAAa,MAAM,EAAE,MAAA,MAAY,EAAK,KACnD,YAAY,OAAO,MAAM;AAC5C;AAGA,SAAS,oBAAoB,SAA4B,cAA4B,QAAgC;AACnH,MAAI,EAAE,YAAY,iBAAiB,cAAe,QAAO;AACzD,QAAM,gBAAgB,aAAa,YAAY,aAAA;AAC/C,gBAAO,OAAO,QAAQ,cAAc,EAAE,QAAA,CAAS,eAAgB,WAAW,aAAa,EAAK,GAC5F,eAAe,SAAS,yBAAyB,eAAmC,MAAM,GACnF;AACT;AAGA,SAAS,eAAe,SAA4B,IAAY,OAAyB,QAA6B;AACpH,SAAO,IAAI,IAAI,KAAK,GACpB,QAAQ,eAAe,IAAI,EAAE,GAC7B,eAAe,QAAQ,UAAU,KAAK;AACxC;AAGA,SAAS,wBAAwB,SAAkC;AACjE,aAAW,MAAM,sBAAsB,OAAO,GAAG;AAC/C,UAAM,SAAS,UAAU,EAAE;AAC3B,IAAI,QAAQ,eAAe,EAAA,KAAO,CAAC,UAAU,OAAO,eAAe,OAAO,gBAAgB,CAAC,OAAO,iBAClG,cAAc,SAAS;AAAA,MAAC,SAAS,OAAO;AAAA,MAAS;AAAA,MAAI,YAAY;AAAA,MAAO,QAAQ,CAAC;AAAA,IAAC,CAAC;AAAA,EACrF;AACF;AAGA,SAAS,mBAAmB,SAA4B,cAA4B,QAA6B;AAC/G,QAAM,EAAC,UAAU,eAAA,IAAkB;AACnC,aAAW,CAAC,IAAI,KAAA,KAAU,OAAO,QAAQ,YAAY,EACnD,CAAI,OAAO,YAAY,gBAAc,iBAAiB,UAAU,IAAI,KAAK;AAE3E,aAAW,CAAC,IAAI,WAAA,KAAgB,OAAO,QAAQ,aAAa,YAAY,YAAA,KAAiB,CAAC,CAAC,GAAG;AAE5F,UAAM,aAAa,OAAO,OAAO,gBAAgB,EAAE,IAAI,eAAe,EAAA,IAAM;AAC5E,IAAI,eACF,WAAW,aAAa,IACxB,WAAW,QAAQ,cAEjB,YAAY,SAAS,sBAAsB,iBAAiB,UAAU,IAAI,WAAW,IAAG,OAAO,IAAI,IAAI,WAAW,IACjH,eAAe,SAAS,IAAI,aAAa,MAAM;AAAA,EACtD;AAEA,QAAM,eAAe,QAAQ,QAAQ,yBAE/B,iBAAiB,iBAAiB,OAAO,OAAO,KAAK,OAAO,OAAO,YAAY,EAAE,KAAA,CAAM,UAAU,WAAW,KAAK,CAAC;AACxH,SAAO,QAAQ,cAAc,EAAE,QAAA,CAAS,CAAC,IAAI,UAAA,MAAgB;AAC3D,QAAI,OAAO,IAAI,EAAE,EAAG;AAEpB,UAAM,gBAAgB,qCAAqC,IAAK,QAAQ,aAA0B,OAAO;AACzG,IAAI,iBAAe,iBAAiB,UAAU,IAAI,aAAa;AAC/D,UAAM,OAAO,iBAAiB,iBAAiB,UAAU,EAAE;AAE3D,QADA,WAAW,aAAa,IACpB,WAAW,IAAI,GAAG;AACpB,iBAAW,QAAQ,MACnB,OAAO,IAAI,IAAI,IAAI;AACnB;AAAA,IACF;AACA,UAAM,gBACJ,iBAAiB,iBAAiB,UAAU,EAAE,KAAK,CAAC,kBAAkB,iBAAiB,IAAI,IAAI,IAAI;AACrG,IAAI,iBACF,WAAW,QAAQ,eACnB,oBAAoB,UAAU,EAAE,GAChC,eAAe,SAAS,IAAI,eAAe,MAAM,KAEjD,WAAW,gBAAgB;AAAA,EAE/B,CAAC,GAGD,OAAO,QAAQ,YAAY,EAAE,QAAA,CAAS,CAAC,IAAI,KAAA,MAAW;AACpD,IAAI,OAAO,YAAY,gBAAgB,OAAO,OAAO,gBAAgB,EAAE,KACnE,WAAW,KAAK,KAAG,OAAO,IAAI,IAAI,KAAK;AAAA,EAC7C,CAAC;AACH;AAEA,SAAS,QAAQ,SAA4B,OAAY,cAAsB,QAA6B;AAE1G,QAAM,SAAS,QAAQ,QAAQ,UAAU,QAAQ,OAAO,SAAS;AACjE,MAAI,kBAAkB,cAAc;AAClC,QAAI,OAAO,SAAS,gBAAgB;AAClC,qBACE,SACA,yBACA,IAAI,SAAS;AAAA,QACX,MAAM;AAAA,QACN,eAAe;AAAA,QACf,eAAe,iBAAiB,QAAQ,QAAQ;AAAA,MAClD,CAAC,GACD,MACF;AACA;AAAA,IACF;AACA,QAAI,OAAO,SAAS,cAAc;AAChC,qBACE,SACA,yBACA,IAAI,SAAS;AAAA,QACX,MAAM;AAAA,QACN,eAAe;AAAA,QACf,eAAe,iBAAiB,QAAQ,QAAQ;AAAA,MAClD,CAAC,GACD,MACF;AACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,WAAW,KAAK,GAAG;AACrB,mBAAe,SAAS,yBAAyB,OAAO,MAAM;AAC9D;AAAA,EACF;AACA,QAAM,UAAU,OAAO,UAAU,GAAG,YAAA,KAAiB,MAAM,OAAA,KAAY,GAAG,YAAA;AAC1E,iBACE,SACA,yBACA,IAAI,SAAS;AAAA,IACX,MAAM,OAAO,QAAQ;AAAA,IACrB,eAAe;AAAA,IACf,eAAe,iBAAiB,QAAQ,QAAQ;AAAA,EAClD,CAAC,GACD,MACF;AACF;AAEA,SAAS,aAAa,SAAqC;AACzD,SAAI,QAAQ,mBAAyB,KACxB,UAAU,QAAQ,SAExB,GAAM,SAAS,eAAe;AACvC;AAKA,SAAS,sBAAsB,SAA4B,QAAkC;AAC3F,QAAM,WAAW,IAAI,IAAI,YAAY,OAAO,CAAC,GACvC,WAAW,oBAAI,IAAY;AACjC,aAAW,WAAW,UAAU;AAC9B,UAAM,aAAa,UAAU,OAAO;AACpC,QAAI,CAAC,YAAY;AAEf,MAAI,UACF,eACE,SACA,SACA,IAAI,SAAS;AAAA,QACX,MAAM;AAAA,QACN,eAAe,uBAAuB,OAAA;AAAA,MACxC,CAAC,GACD,MACF;AAEF;AAAA,IACF;AACA,eAAW,eAAe,QAAA,CAAS,OAAO,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,CAAC;AAAA,EACzF;AACA,SAAO,CAAC,GAAG,QAAQ;AACrB;AAGA,SAAS,2BAA2B,OAAgC;AAClE,QAAM,WAAW,IAAI,IAAI,YAAY,MAAM,OAAO,CAAC,GAC7C,gBAAgB,iBAAiB,MAAM,OAAO;AACpD,SAAO,MAAM,iBAAiB,qBAAqB,EAAE,OAAA,CAAQ,OAAO;AAClE,QAAI,SAAS,IAAI,EAAE,EAAG,QAAO;AAC7B,UAAM,oBAAoB,GAAG,MAAM,0BAA0B;AAC7D,WAAO,cAAc,KAAA,CAAM,iBAAiB,oBAAoB,mBAAmB,YAAY,CAAC;AAAA,EAClG,CAAC;AACH;AAGA,SAAS,mBAAmB,OAAsB,KAAqC;AACrF,QAAM,UAA2B,CAAC;AAClC,aAAW,MAAM,KAAK;AACpB,QAAI,MAAM,QAAQ,eAAe,EAAA,KAAO,MAAM,qBAAqB,IAAI,EAAE,EAAG;AAC5E,UAAM,QAAQ,MAAM,iBAAiB,kBAAkB,EAAE;AACzD,QAAI,CAAC,MAAO;AACZ,UAAM,qBAAqB,IAAI,EAAE;AACjC,UAAM,UAAU,kBAAkB,MAAM,SAAS,IAAI,KAAK;AAC1D,IAAI,WAAS,QAAQ,KAAK,OAAO;AAAA,EACnC;AACA,MAAI,QAAQ,OAAQ,QAAO,QAAQ,IAAI,OAAO,EAAE,KAAA,MAAA;AAAA,GAAoB;AACtE;AAEA,SAAS,kBAAkB,SAA4B,IAAY,OAAkD;AACnH,MAAI,YACA,SAAS;AAEb,QAAM,OAAA,IAAW,WAAkB;AACjC,IAAI,WAAQ,aAAa,MAAM,iBAAiB,MAAM;AAAA,EACxD,GACM,SAAA,MAAe;AACnB,aAAS,IACL,cAAY,cAAc,SAAS,UAAU;AAAA,EACnD,GACM,OAAA,CAAQ,UAA0B;AACtC,mBAAS,IACH,oBAAoB,IAAI,KAAK;AAAA,EACrC;AACA,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,QAAQ,MAAM,OAAO;AAAA,EACxC,SAAS,OAAO;AACd,WAAO,KAAK,KAAK;AAAA,EACnB;AACA,SAAK,cAAc,QAAQ,IACpB,QAAQ,QAAQ,QAAQ,EAAE,KAAK,QAAQ,IAAI,IADb,OAAO;AAE9C;AAEA,SAAS,cAAc,OAA+C;AACpE,SAAO,CAAC,CAAC,SAAS,OAAQ,MAA+B,QAAS;AACpE;AAGA,SAAS,oBAAoB,IAAY,OAAkC;AACzE,SAAI,WAAW,KAAK,IAAU,QAEvB,IAAI,SAAS;AAAA,IAClB,MAAM;AAAA,IACN,eAAe,6BAA6B,EAAA,aAH9B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAA;AAAA,IAInE,eAAe,iBAAiB,QAAQ,QAAQ;AAAA,EAClD,CAAC;AACH;AAGA,SAAgB,oBAAoB,mBAA6B,cAAiC;AAChG,QAAM,aAAa,kBAAkB,SAAS;AAC9C,MAAI,cAAc,aAAa,OAAQ,QAAO;AAC9C,WAAS,IAAI,GAAG,IAAI,YAAY,IAAK,KAAI,kBAAkB,CAAA,MAAO,aAAa,CAAA,EAAI,QAAO;AAC1F,SAAO;AACT;AAKA,SAAS,kBACP,KACA,YACA,mBACA,SACA,cACA,SACA,QACa;AACb,MAAI,CAAC,gBAAgB,WAAW,WAAW,YAAY,SAAS,MAAM,GAAG;AACvE,UAAM,UAAU,YAAY,WAAW,IAAc,GAC/C,UAAU,IAAI,IAAI,IAAI,WAAW,IAAI,QAAQ,IAAI,MAAM;AAG7D,QAFA,QAAQ,aAAa,IAAI,QAAQ,OAAO,GAEpC,QAAQ,SAAS,EAAE,UAAA;AACrB,iBAAI,aAAa,IAAI,QAAQ,OAAO,GAC7B;AAAA,QACL,GAAG,QAAQ;AAAA,QACX,QAAQ;AAAA,QACR,SAAS;AAAA,UAAC,GAAG,gBAAgB,QAAQ,aAAa,OAAO;AAAA,UAAG,GAAG;AAAA,QAAiB;AAAA,QAChF,MAAM;AAAA,QACN;AAAA,MACF;AAAA,EAEJ;AAEA,SAAO;AAAA,IACL,GAAG,QAAQ;AAAA,IACX,QAAQ;AAAA,IACR,SAAS;AAAA,MAAC,GAAG,gBAAgB,QAAQ,aAAa,OAAO;AAAA,MAAG,GAAG;AAAA,MAAmB,gBAAgB,WAAW;AAAA,IAAW;AAAA,IACxH,MAAM,WAAW;AAAA,IACjB;AAAA,EACF;AACF;AAIA,SAAS,yBAAyB,SAAyD;AACzF,QAAM,WAAW,oBAAI,IAAY;AACjC,SAAI,QAAQ,SAAO,SAAS,IAAI,QAAQ,MAAM,EAAE,GAC5C,QAAQ,oBAAkB,QAAQ,iBAAiB,QAAA,CAAS,OAAO,SAAS,IAAI,GAAG,EAAE,CAAC,GACnF,OAAO,QAAQ,QAAQ,cAAc,EACzC,OAAA,CAAQ,CAAC,EAAA,MAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,EAClC,IAAA,CAAK,CAAA,EAAG,UAAA,MAAgB,UAAuC;AACpE;AASA,eAAe,uBACb,OACA,uBACA,QACA,WACqC;AACrC,QAAM,EAAC,SAAS,iBAAA,IAAoB,OAC9B,WAAqB,CAAC,GACtB,UAA2B,CAAC;AAClC,MAAI;AAEJ,QAAM,eAAA,CAAgB,OAChB,UAAU,IAAI,EAAE,MACpB,cAAc,YAAY,OAAO,MAAM,GACnC,CAAC,aAAkB,MAClB,SAAS,SAAS,EAAE,KAAG,SAAS,KAAK,EAAE,GACrC,KAGH,cAAiC;AAAA,IACrC,OAAO,QAAQ;AAAA,IACf,kBAAkB,QAAQ;AAAA,IAC1B,gBAAgB,QAAQ;AAAA,IACxB,SAAS,QAAQ;AAAA,IACjB,QAAQ,QAAQ;AAAA,IAChB,OAAA,MAAa;AAAA,EACf;AACA,aAAW,cAAc,uBAAuB;AAC9C,UAAM,KAAK,WAAW,IAChB,kBAAkB,QAAQ,IAAI,EAAE,GAChC,iBAAiB,CAAC,CAAC;AAEzB,QADI,kBAAkB,QAAQ,eAAe,IAAI,EAAE,KAC/C,CAAC,kBAAkB,WAAW,kBAAkB,OAAW;AAC/D,UAAM,cAAc,iBAAiB,YAAY,cAC3C,WAAW,iBACb,iBAAiB,iBAAiB,IAAI,gBAAgB,IAAI,IAC1D,iBAAiB,oBAAoB,EAAE;AAE3C,eAAW,WAAW,UAAU;AAE9B,UAAI,SAAS;AACb,YAAM,oBAAuC;AAAA,QAAC,GAAG;AAAA,QAAa,OAAA,MAAa,UAAU,aAAa,EAAE;AAAA,MAAC,GAC/F,OAAA,CAAQ,UAAmB;AAC/B,iBAAS,IACT,WAAW,oBAAI,IAAI,GACnB,eAAe,SAAS,yBAAyB,uBAAuB,aAAa,IAAI,KAAK,GAAG,MAAM;AAAA,MACzG;AACA,UAAI;AACJ,UAAI;AACF,mBACI,QADO,iBACC,kBACA,WAAW,eADM,iBAAiB;AAAA,MAEhD,SAAS,OAAO;AACd,aAAK,KAAK;AACV;AAAA,MACF;AACA,UAAI,CAAC,cAAc,QAAQ,GAAG;AAC5B,iBAAS;AACT;AAAA,MACF;AACA,cAAQ,KACN,QAAQ,QAAQ,QAAQ,EAAE,KAAA,MAClB;AACJ,iBAAS;AAAA,MACX,GAAA,CACC,UAAU,KAAK,KAAK,CACvB,CACF;AAAA,IACF;AAAA,EACF;AACA,SAAI,QAAQ,UAAQ,MAAM,QAAQ,IAAI,OAAO,GAEzC,QAAQ,IAAA,qBAA2B,KAAK,SAAS,WAAQ,SAAS,SAAS,IACxE;AAAA,IAAC;AAAA,IAAQ;AAAA,EAAQ;AAC1B;AAGA,SAAS,YAAY,OAAsB,QAA4C;AACrF,SAAK,MAAM,OACJ,YAAY,MAAM,OAAO,EAAE,MAAA,CAC/B,OAAO,UAAU,EAAE,GAAG,SAAS,eAAe,MAAS,CAAC,eAAe,MAAM,SAAS,IAAI,MAAM,CACnG,IAHwB;AAI1B;AAGA,SAAgB,eAAe,SAA4B,SAAiB,QAA4C;AACtH,QAAM,YAAY,QAAQ,IAAI,OAAO,GAAG;AAExC,SAAI,cAAc,+BAA+B,cAAc,6BAAmC,KAC9F,QAAQ,IAAI,OAAO,IAAU,KAC7B,QAAQ,eAAe,OAAA,GAAU,kBAAkB,SAAkB,KAClE,CAAC,QAAQ;AAClB;AAGA,SAAS,wBAAwB,OAA4B;AAC3D,QAAM,EAAC,QAAA,IAAW,OACZ,WAAW,IAAI,IAAI,YAAY,OAAO,CAAC;AAC7C,aAAW,MAAM,OAAO,KAAK,QAAQ,cAAc,EACjD,CAAK,SAAS,IAAI,EAAE,KAAG,OAAO,QAAQ,eAAe,EAAA;AAEvD,QAAM,qBAAqB,MAAM,GACjC,aAAa,KAAK;AACpB;AAEA,SAAS,aAAa,OAA4B;AAChD,QAAM,EAAC,QAAA,IAAW;AAClB,SAAO,OAAO,QAAQ,cAAc,EAAE,QAAA,CAAS,eAAe;AAC5D,eAAW,aAAa,IACxB,WAAW,gBAAgB,QAC3B,WAAW,QAAQ;AAAA,EACrB,CAAC,GACD,QAAQ,eAAe,MAAM,GAC7B,QAAQ,eAAe,QACvB,QAAQ,WAAW,CAAC,GACpB,MAAM,OAAO;AACf;AAGA,SAAS,uBAAuB,aAAuC,IAAY,OAAkC;AACnH,MAAI,WAAW,KAAK,EAAG,QAAO;AAC9B,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,SAAO,IAAI,SAAS;AAAA,IAClB,MAAM,gBAAgB,YAAY,+BAA+B;AAAA,IACjE,eAAe,GAAG,WAAA,oBAA+B,EAAA,aAAe,OAAA;AAAA,IAChE,eAAe,iBAAiB,QAAQ,QAAQ;AAAA,EAClD,CAAC;AACH;AAGA,SAAS,YACP,OACA,QACwD;AACxD,QAAM,EAAC,OAAO,iBAAiB,kBAAkB,gBAAgB,SAAA,IAAY,MAAM,SAC7E,mBAAA,CAAoB,OAA6C;AACrE,UAAM,QAAQ,QAAQ,IAAI,EAAE;AAC5B,WAAO,SAAS,CAAC,eAAe,IAAI,EAAE,IAAI,QAAQ;AAAA,EACpD;AAOA,SAHA;AAAA,IADyB,oBAAoB;AAAA,IAAG,oBAAoB;AAAA,IAAG,MAAM,UAAU,UAAU;AAAA,EACjG,EAAgB,QAAA,CAAS,UAAU,SAAS,eAAe,UAAU,KAAK,CAAC,GAGvE,mBACK,iBAAiB,IAAA,CACrB,eAAiC;AAAA,IAAC,WAAW;AAAA,IAAe,iBAAiB,WAAW,EAAE;AAAA,IAAG;AAAA,EAAQ,CACxG,IACK;AAAA,IAAC,iBAAiB;AAAA,IAAe,mBAAmB,iBAAiB,gBAAgB,EAAE;AAAA,IAAG;AAAA,EAAQ;AAC3G"}
@@ -0,0 +1,10 @@
1
+ import { RpcError } from '@mionjs/core';
2
+ export declare function setApiBuildVersion(version: string | undefined): void;
3
+ export declare function getApiBuildVersion(): string | undefined;
4
+ export declare function noteServerApiVersion(baseURL: string, serverVersion: string | undefined | null): boolean;
5
+ export declare function hasApiVersionMismatch(baseURL: string): boolean;
6
+ export declare function reportApiVersionMismatch(baseURL: string): void;
7
+ export declare function stashApiVersionError(error: RpcError<'api-version-mismatch'>): void;
8
+ export declare function takeApiVersionError(): RpcError<'api-version-mismatch'> | undefined;
9
+ export declare function resetApiBuildVersion(): void;
10
+ //# sourceMappingURL=apiBuildVersion.d.ts.map
@@ -0,0 +1,43 @@
1
+ import { RpcError } from "@mionjs/core";
2
+ var apiBuildVersion, mismatchedServers = /* @__PURE__ */ new Set(), mismatchError;
3
+ function setApiBuildVersion(version) {
4
+ apiBuildVersion = version || void 0;
5
+ }
6
+ function getApiBuildVersion() {
7
+ return apiBuildVersion;
8
+ }
9
+ function noteServerApiVersion(baseURL, serverVersion) {
10
+ return !serverVersion || !apiBuildVersion || serverVersion === apiBuildVersion ? !1 : (mismatchedServers.add(baseURL), !0);
11
+ }
12
+ function hasApiVersionMismatch(baseURL) {
13
+ return mismatchedServers.has(baseURL);
14
+ }
15
+ var reportedServers = /* @__PURE__ */ new Set();
16
+ function reportApiVersionMismatch(baseURL) {
17
+ reportedServers.has(baseURL) || (reportedServers.add(baseURL), mismatchError = new RpcError({
18
+ type: "api-version-mismatch",
19
+ publicMessage: `The server at ${baseURL || "this origin"} runs a different build of the API than this client was built against. Reload the app or rebuild the client against the current API.`
20
+ }));
21
+ }
22
+ function stashApiVersionError(error) {
23
+ mismatchError = error;
24
+ }
25
+ function takeApiVersionError() {
26
+ const error = mismatchError;
27
+ return mismatchError = void 0, error;
28
+ }
29
+ function resetApiBuildVersion() {
30
+ apiBuildVersion = void 0, mismatchedServers.clear(), reportedServers.clear(), mismatchError = void 0;
31
+ }
32
+ export {
33
+ getApiBuildVersion,
34
+ hasApiVersionMismatch,
35
+ noteServerApiVersion,
36
+ reportApiVersionMismatch,
37
+ resetApiBuildVersion,
38
+ setApiBuildVersion,
39
+ stashApiVersionError,
40
+ takeApiVersionError
41
+ };
42
+
43
+ //# sourceMappingURL=apiBuildVersion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiBuildVersion.js","names":[],"sources":["../../../../src/lib/apiBuildVersion.ts"],"sourcesContent":["/* ########\n * 2026 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\n// The version check rides every response, so it cannot be lazily loaded; what a mismatch then does lives in\n// apiVersionRecovery.ts, behind `#metadata-from-server`. Split from client.ts: request.ts\n// must not pull the client in. One build version per program, one mismatch per server.\n\nimport {RpcError} from '@mionjs/core';\n\n/** The API version this client was built against, injected at `initClient` by the build. */\nlet apiBuildVersion: string | undefined;\n/** baseURLs that answered with a version other than this build's. */\nconst mismatchedServers = new Set<string>();\nlet mismatchError: RpcError<'api-version-mismatch'> | undefined;\n\n/** Called by generated code, never by hand: the value comes from the API's types. */\nexport function setApiBuildVersion(version: string | undefined): void {\n apiBuildVersion = version || undefined;\n}\n\nexport function getApiBuildVersion(): string | undefined {\n return apiBuildVersion;\n}\n\n/** A missing version on either side answers false: an end with no version knows too little to call it a mismatch. */\nexport function noteServerApiVersion(baseURL: string, serverVersion: string | undefined | null): boolean {\n if (!serverVersion || !apiBuildVersion || serverVersion === apiBuildVersion) return false;\n mismatchedServers.add(baseURL);\n return true;\n}\n\n/** Whether the recovery module is worth loading: nothing else in this file reaches it. */\nexport function hasApiVersionMismatch(baseURL: string): boolean {\n return mismatchedServers.has(baseURL);\n}\n\n/** baseURLs whose mismatch was already reported for the whole API. */\nconst reportedServers = new Set<string>();\n\n/** Without the metadata middleware no route can be checked alone, so the whole API is reported, once per server. */\nexport function reportApiVersionMismatch(baseURL: string): void {\n if (reportedServers.has(baseURL)) return;\n reportedServers.add(baseURL);\n mismatchError = new RpcError({\n type: 'api-version-mismatch',\n publicMessage:\n `The server at ${baseURL || 'this origin'} runs a different build of the API than this client was built against. ` +\n `Reload the app or rebuild the client against the current API.`,\n });\n}\n\n/** Held for the next call's @thrownErrors, beside the bundled-API error: the call itself ran. */\nexport function stashApiVersionError(error: RpcError<'api-version-mismatch'>): void {\n mismatchError = error;\n}\n\n/** The mismatch error, reported once. */\nexport function takeApiVersionError(): RpcError<'api-version-mismatch'> | undefined {\n const error = mismatchError;\n mismatchError = undefined;\n return error;\n}\n\n/** Tests only: forgets the injected version and the mismatch. */\nexport function resetApiBuildVersion(): void {\n apiBuildVersion = undefined;\n mismatchedServers.clear();\n reportedServers.clear();\n mismatchError = undefined;\n}\n"],"mappings":";AAcA,IAAI,iBAEE,oBAAoB,oBAAI,IAAY,GACtC;AAGJ,SAAgB,mBAAmB,SAAmC;AACpE,oBAAkB,WAAW;AAC/B;AAEA,SAAgB,qBAAyC;AACvD,SAAO;AACT;AAGA,SAAgB,qBAAqB,SAAiB,eAAmD;AACvG,SAAI,CAAC,iBAAiB,CAAC,mBAAmB,kBAAkB,kBAAwB,MACpF,kBAAkB,IAAI,OAAO,GACtB;AACT;AAGA,SAAgB,sBAAsB,SAA0B;AAC9D,SAAO,kBAAkB,IAAI,OAAO;AACtC;AAGA,IAAM,kBAAkB,oBAAI,IAAY;AAGxC,SAAgB,yBAAyB,SAAuB;AAC9D,EAAI,gBAAgB,IAAI,OAAO,MAC/B,gBAAgB,IAAI,OAAO,GAC3B,gBAAgB,IAAI,SAAS;AAAA,IAC3B,MAAM;AAAA,IACN,eACE,iBAAiB,WAAW,aAAA;AAAA,EAEhC,CAAC;AACH;AAGA,SAAgB,qBAAqB,OAA+C;AAClF,kBAAgB;AAClB;AAGA,SAAgB,sBAAoE;AAClF,QAAM,QAAQ;AACd,yBAAgB,QACT;AACT;AAGA,SAAgB,uBAA6B;AAC3C,oBAAkB,QAClB,kBAAkB,MAAM,GACxB,gBAAgB,MAAM,GACtB,gBAAgB;AAClB"}
@@ -0,0 +1,7 @@
1
+ import { MethodWithOptions, SerializableMethodsData } from '@mionjs/core';
2
+ import { ClientOptions } from '../types.ts';
3
+ export declare function unverifiedIds(baseURL: string, ids: string[]): string[];
4
+ export declare function resetApiVersionRecovery(): void;
5
+ export declare function verifyMethodRows(options: ClientOptions, asked: string[], data: SerializableMethodsData): void;
6
+ export declare function rowsAgree(held: MethodWithOptions | undefined, served: MethodWithOptions | undefined): boolean;
7
+ //# sourceMappingURL=apiVersionRecovery.d.ts.map
@@ -0,0 +1,43 @@
1
+ import { getMethod, isBundledMethod } from "./methods.js";
2
+ import { installMethodRows } from "./clientMethodsMetadata.js";
3
+ import { stashApiVersionError } from "./apiBuildVersion.js";
4
+ import { RpcError } from "@mionjs/core";
5
+ var verifiedIds = /* @__PURE__ */ new Map();
6
+ function verifiedBy(baseURL) {
7
+ let ids = verifiedIds.get(baseURL);
8
+ return ids || verifiedIds.set(baseURL, ids = /* @__PURE__ */ new Set()), ids;
9
+ }
10
+ function unverifiedIds(baseURL, ids) {
11
+ const verified = verifiedBy(baseURL);
12
+ return ids.filter((id) => !verified.has(id));
13
+ }
14
+ function resetApiVersionRecovery() {
15
+ verifiedIds.clear();
16
+ }
17
+ function verifyMethodRows(options, asked, data) {
18
+ const verified = verifiedBy(options.baseURL);
19
+ for (const id of asked) verified.add(id);
20
+ const stale = asked.filter((id) => !rowsAgree(getMethod(id), data.methods[id]));
21
+ if (!stale.length) return;
22
+ const fetched = stale.filter((id) => !isBundledMethod(id));
23
+ fetched.length && installMethodRows(data, options, fetched);
24
+ const bundled = stale.filter((id) => isBundledMethod(id));
25
+ bundled.length && stashApiVersionError(staleRoutesError(bundled));
26
+ }
27
+ function rowsAgree(held, served) {
28
+ return !!held?.syncId && held.syncId === served?.syncId;
29
+ }
30
+ function staleRoutesError(stale) {
31
+ return new RpcError({
32
+ type: "api-version-mismatch",
33
+ publicMessage: `This mion client carries routes compiled against an older version of the API: the server answers with a different build version, and ${stale.map((id) => `"${id}"`).join(", ")} no longer matches what it declares. Reload the app or rebuild the client against the current API.`
34
+ });
35
+ }
36
+ export {
37
+ resetApiVersionRecovery,
38
+ rowsAgree,
39
+ unverifiedIds,
40
+ verifyMethodRows
41
+ };
42
+
43
+ //# sourceMappingURL=apiVersionRecovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiVersionRecovery.js","names":[],"sources":["../../../../src/lib/apiVersionRecovery.ts"],"sourcesContent":["/* ########\n * 2026 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\n// Rides the `#metadata-from-server` chunk: like the fetch, it runs only when the bundle comes up short.\n\nimport {RpcError} from '@mionjs/core';\nimport type {MethodWithOptions, SerializableMethodsData} from '@mionjs/core';\nimport type {ClientOptions} from '../types.ts';\nimport {stashApiVersionError} from './apiBuildVersion.ts';\nimport {getMethod, isBundledMethod} from './methods.ts';\nimport {installMethodRows} from './clientMethodsMetadata.ts';\n\n/** Ids each baseURL confirmed: a route is checked once per server, on its first use after the mismatch. */\nconst verifiedIds = new Map<string, Set<string>>();\n\nfunction verifiedBy(baseURL: string): Set<string> {\n let ids = verifiedIds.get(baseURL);\n if (!ids) verifiedIds.set(baseURL, (ids = new Set()));\n return ids;\n}\n\n/** The ids to ask the server to confirm, out of the ones this request calls. */\nexport function unverifiedIds(baseURL: string, ids: string[]): string[] {\n const verified = verifiedBy(baseURL);\n return ids.filter((id) => !verified.has(id));\n}\n\n/** Tests only: forgets which routes were confirmed. */\nexport function resetApiVersionRecovery(): void {\n verifiedIds.clear();\n}\n\n/** A fetched row is a cache: replaced and saved. A bundled one is what the calling code was built against: reported. */\nexport function verifyMethodRows(options: ClientOptions, asked: string[], data: SerializableMethodsData): void {\n const verified = verifiedBy(options.baseURL);\n for (const id of asked) verified.add(id);\n // Only the asked ids: comparing the middleware riding along would report a route this call never uses.\n const stale = asked.filter((id) => !rowsAgree(getMethod(id), data.methods[id] as MethodWithOptions | undefined));\n if (!stale.length) return;\n const fetched = stale.filter((id) => !isBundledMethod(id));\n if (fetched.length) installMethodRows(data, options, fetched);\n const bundled = stale.filter((id) => isBundledMethod(id));\n if (bundled.length) stashApiVersionError(staleRoutesError(bundled));\n}\n\n/** Sync id only: it covers the types and wire formats; a row or id missing on either end never agrees. */\nexport function rowsAgree(held: MethodWithOptions | undefined, served: MethodWithOptions | undefined): boolean {\n return !!held?.syncId && held.syncId === served?.syncId;\n}\n\nfunction staleRoutesError(stale: string[]): RpcError<'api-version-mismatch'> {\n return new RpcError({\n type: 'api-version-mismatch',\n publicMessage:\n `This mion client carries routes compiled against an older version of the API: the server answers with a ` +\n `different build version, and ${stale.map((id) => `\"${id}\"`).join(', ')} no longer matches what it declares. ` +\n `Reload the app or rebuild the client against the current API.`,\n });\n}\n"],"mappings":";;;;AAiBA,IAAM,cAAc,oBAAI,IAAyB;AAEjD,SAAS,WAAW,SAA8B;AAChD,MAAI,MAAM,YAAY,IAAI,OAAO;AACjC,SAAK,OAAK,YAAY,IAAI,SAAU,MAAM,oBAAI,IAAI,CAAE,GAC7C;AACT;AAGA,SAAgB,cAAc,SAAiB,KAAyB;AACtE,QAAM,WAAW,WAAW,OAAO;AACnC,SAAO,IAAI,OAAA,CAAQ,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;AAC7C;AAGA,SAAgB,0BAAgC;AAC9C,cAAY,MAAM;AACpB;AAGA,SAAgB,iBAAiB,SAAwB,OAAiB,MAAqC;AAC7G,QAAM,WAAW,WAAW,QAAQ,OAAO;AAC3C,aAAW,MAAM,MAAO,UAAS,IAAI,EAAE;AAEvC,QAAM,QAAQ,MAAM,OAAA,CAAQ,OAAO,CAAC,UAAU,UAAU,EAAE,GAAG,KAAK,QAAQ,EAAA,CAAoC,CAAC;AAC/G,MAAI,CAAC,MAAM,OAAQ;AACnB,QAAM,UAAU,MAAM,OAAA,CAAQ,OAAO,CAAC,gBAAgB,EAAE,CAAC;AACzD,EAAI,QAAQ,UAAQ,kBAAkB,MAAM,SAAS,OAAO;AAC5D,QAAM,UAAU,MAAM,OAAA,CAAQ,OAAO,gBAAgB,EAAE,CAAC;AACxD,EAAI,QAAQ,UAAQ,qBAAqB,iBAAiB,OAAO,CAAC;AACpE;AAGA,SAAgB,UAAU,MAAqC,QAAgD;AAC7G,SAAO,CAAC,CAAC,MAAM,UAAU,KAAK,WAAW,QAAQ;AACnD;AAEA,SAAS,iBAAiB,OAAmD;AAC3E,SAAO,IAAI,SAAS;AAAA,IAClB,MAAM;AAAA,IACN,eACE,wIACgC,MAAM,IAAA,CAAK,OAAO,IAAI,EAAA,GAAK,EAAE,KAAK,IAAI,CAAA;AAAA,EAE1E,CAAC;AACH"}
@@ -0,0 +1,12 @@
1
+ import { RpcError, MethodWithOptions, RtMarkerPayload } from '@mionjs/core';
2
+ import { InjectedApiMetadata } from '../types.ts';
3
+ export interface BundledMethod extends Pick<MethodWithOptions, 'id' | 'pointer' | 'nestLevel' | 'type' | 'isAsync' | 'options' | 'middlewareIds'> {
4
+ rtFns: RtMarkerPayload;
5
+ }
6
+ export interface BundledApiPayload {
7
+ methods: BundledMethod[];
8
+ }
9
+ export declare function registerBundledApi(payload: InjectedApiMetadata): void;
10
+ export declare function takeBundledApiError(): RpcError<string> | undefined;
11
+ export declare function resetBundledApi(): void;
12
+ //# sourceMappingURL=bundledApi.d.ts.map