@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
@@ -1,7 +1,6 @@
1
+ import { isInputFromRef } from "./batch.js";
1
2
  import { RpcError } from "@mionjs/core";
2
- import { TypedEvent } from "./lib/typedEvent.js";
3
- import { isMapFromRef } from "./routesFlow.js";
4
- class MionSubRequest {
3
+ var MionSubRequest = class {
5
4
  client;
6
5
  pointer;
7
6
  id;
@@ -12,39 +11,18 @@ class MionSubRequest {
12
11
  serializedParams;
13
12
  mappings = [];
14
13
  constructor(parentProps, handlerId, argArray, client) {
15
- this.client = client, this.pointer = [...parentProps], this.id = handlerId, this.params = argArray.map((arg, index) => isMapFromRef(arg) ? (arg.toRequestId = this.id, arg.paramIndex = index, this.mappings.push(arg), null) : arg);
14
+ this.client = client, this.pointer = [...parentProps], this.id = handlerId, this.params = argArray.map((arg, index) => isInputFromRef(arg) ? (arg.toRequestId = this.id, arg.paramIndex = index, this.mappings.push(arg), null) : arg);
16
15
  }
17
- /** Prefills MiddleFn's parameters and returns TypedEvent for event handler registration */
18
- prefill() {
19
- const typedEvent = new TypedEvent(this.id, this.client.handlersRegistry);
20
- return this.client.prefill(this).catch((errors) => {
21
- console.error("Prefill error:", findSubRequestError(this, errors));
22
- }), typedEvent;
16
+ call(setup, apiMetadata) {
17
+ return this.client.useBundledApi(apiMetadata), this.client.execute(this, void 0, void 0, setup?.signal, setup?.timeout);
23
18
  }
24
- /** Removes prefilled value and clears any registered error handlers for this middleFn */
25
- removePrefill() {
26
- return this.client.handlersRegistry.clearHandlers(this.id), this.client.removePrefill(this);
19
+ typeErrors(apiMetadata) {
20
+ return this.client.useBundledApi(apiMetadata), this.client.typeErrors(this).catch((errors) => Promise.reject(findSubRequestError(this, errors)));
27
21
  }
28
- /** Calls a remote route with optional setup (middleFns, otherRoutes, signal, timeout) */
29
- call(setup) {
30
- const signal = setup?.signal, timeout = setup?.timeout;
31
- return !setup || !setup.otherRoutes && !setup.middleFns ? this.client.execute(this, void 0, void 0, signal, timeout) : setup.otherRoutes && setup.otherRoutes.length > 0 ? this.executeWithOtherRoutes(setup.otherRoutes, setup.middleFns, signal, timeout) : this.client.execute(this, void 0, setup.middleFns, signal, timeout);
32
- }
33
- async executeWithOtherRoutes(otherRoutes, middleFns, signal, timeout) {
34
- const allRoutes = [this, ...otherRoutes], [results, errors, mfR, mfE] = await this.client.execute(void 0, allRoutes, middleFns ?? {}, signal, timeout), emptyResults = allRoutes.map(() => {
35
- }), emptyErrors = allRoutes.map(() => {
36
- });
37
- return [results ?? emptyResults, errors ?? emptyErrors, mfR, mfE];
38
- }
39
- /** Validates parameters and returns type errors */
40
- typeErrors() {
41
- return this.client.typeErrors(this).catch((errors) => Promise.reject(findSubRequestError(this, errors)));
42
- }
43
- }
22
+ };
44
23
  function findSubRequestError(subRequest, errors) {
45
24
  const specificError = errors.get(subRequest.id);
46
- if (specificError)
47
- return specificError;
25
+ if (specificError) return specificError;
48
26
  const firstError = errors.values().next().value;
49
27
  return firstError || new RpcError({
50
28
  type: "unknown-error",
@@ -55,4 +33,5 @@ export {
55
33
  MionSubRequest,
56
34
  findSubRequestError
57
35
  };
58
- //# sourceMappingURL=subRequest.js.map
36
+
37
+ //# sourceMappingURL=subRequest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"subRequest.js","sources":["../../../src/subRequest.ts"],"sourcesContent":["/* ########\n * 2025 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\nimport {RpcError} from '@mionjs/core';\nimport type {RunTypeError} from '@mionjs/core';\nimport type {CallSetup, MiddlewareSubRequest, RequestErrors, RouteSubRequest, SubRequest} from './types.ts';\nimport type {MapFromServerFnRef} from '@mionjs/core';\nimport type {MionClient} from './client.ts';\nimport {TypedEvent} from './lib/typedEvent.ts';\nimport {isMapFromRef} from './routesFlow.ts';\n\n/** Implementation of both RouteSubRequest and MiddleFnSubRequest interfaces */\nexport class MionSubRequest<S = any, E extends RpcError<string, any> = any>\n implements RouteSubRequest<any>, MiddlewareSubRequest<any>\n{\n pointer: string[];\n id: string;\n isResolved: boolean = false;\n params: any[];\n resolvedValue?: S;\n error?: E;\n serializedParams?: any[];\n mappings: MapFromServerFnRef[] = [];\n\n constructor(\n parentProps: string[],\n handlerId: string,\n argArray: any[],\n readonly client: MionClient\n ) {\n this.pointer = [...parentProps];\n this.id = handlerId;\n this.params = argArray.map((arg, index) => {\n if (isMapFromRef(arg)) {\n arg.toRequestId = this.id;\n arg.paramIndex = index;\n this.mappings.push(arg);\n return null;\n }\n return arg;\n });\n }\n\n /** Prefills MiddleFn's parameters and returns TypedEvent for event handler registration */\n prefill(): TypedEvent<S, E> {\n const typedEvent = new TypedEvent<S, E>(this.id, this.client.handlersRegistry);\n\n this.client.prefill(this as MiddlewareSubRequest<any>).catch((errors: RequestErrors) => {\n console.error('Prefill error:', findSubRequestError(this, errors));\n });\n\n return typedEvent;\n }\n\n /** Removes prefilled value and clears any registered error handlers for this middleFn */\n removePrefill(): Promise<void> {\n this.client.handlersRegistry.clearHandlers(this.id);\n return this.client.removePrefill(this as MiddlewareSubRequest<any>);\n }\n\n /** Calls a remote route with optional setup (middleFns, otherRoutes, signal, timeout) */\n call(setup?: CallSetup<any, any>): Promise<any> {\n const signal = setup?.signal;\n const timeout = setup?.timeout;\n if (!setup || (!setup.otherRoutes && !setup.middleFns)) {\n return this.client.execute(this as unknown as RouteSubRequest<any>, undefined, undefined, signal, timeout);\n }\n if (setup.otherRoutes && setup.otherRoutes.length > 0) {\n return this.executeWithOtherRoutes(setup.otherRoutes, setup.middleFns, signal, timeout);\n }\n return this.client.execute(this as unknown as RouteSubRequest<any>, undefined, setup.middleFns, signal, timeout);\n }\n\n private async executeWithOtherRoutes(\n otherRoutes: RouteSubRequest<any>[],\n middleFns?: Record<string, MiddlewareSubRequest<any>>,\n signal?: AbortSignal,\n timeout?: number\n ): Promise<any> {\n const allRoutes = [this as unknown as RouteSubRequest<any>, ...otherRoutes];\n const [results, errors, mfR, mfE] = await this.client.execute(undefined, allRoutes, middleFns ?? {}, signal, timeout);\n const emptyResults = allRoutes.map(() => undefined);\n const emptyErrors = allRoutes.map(() => undefined);\n return [results ?? emptyResults, errors ?? emptyErrors, mfR, mfE];\n }\n\n /** Validates parameters and returns type errors */\n typeErrors(): Promise<RunTypeError[]> {\n return this.client\n .typeErrors(this as SubRequest<any>)\n .catch((errors: RequestErrors) => Promise.reject(findSubRequestError(this, errors)));\n }\n}\n\n/** Finds the most relevant error from the errors map for a given sub-request */\nexport function findSubRequestError(subRequest: SubRequest<any>, errors: RequestErrors): RpcError<string> {\n const specificError = errors.get(subRequest.id);\n if (specificError) return specificError;\n\n const firstError = errors.values().next().value;\n if (firstError) return firstError;\n\n return new RpcError({\n type: 'unknown-error',\n publicMessage: 'An unknown error occurred',\n });\n}\n"],"names":[],"mappings":";;;MAgBa,eAAc;AAAA,EAgBV;AAAA,EAbb;AAAA,EACA;AAAA,EACA,aAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAiC,CAAA;AAAA,EAEjC,YACI,aACA,WACA,UACS,QAAkB;AAAlB,SAAA,SAAA,QAET,KAAK,UAAU,CAAC,GAAG,WAAW,GAC9B,KAAK,KAAK,WACV,KAAK,SAAS,SAAS,IAAI,CAAC,KAAK,UACzB,aAAa,GAAG,KAChB,IAAI,cAAc,KAAK,IACvB,IAAI,aAAa,OACjB,KAAK,SAAS,KAAK,GAAG,GACf,QAEJ,GACV;AAAA,EACL;AAAA;AAAA,EAGA,UAAO;AACH,UAAM,aAAa,IAAI,WAAiB,KAAK,IAAI,KAAK,OAAO,gBAAgB;AAE7E,gBAAK,OAAO,QAAQ,IAAiC,EAAE,MAAM,CAAC,WAAyB;AACnF,cAAQ,MAAM,kBAAkB,oBAAoB,MAAM,MAAM,CAAC;AAAA,IACrE,CAAC,GAEM;AAAA,EACX;AAAA;AAAA,EAGA,gBAAa;AACT,gBAAK,OAAO,iBAAiB,cAAc,KAAK,EAAE,GAC3C,KAAK,OAAO,cAAc,IAAiC;AAAA,EACtE;AAAA;AAAA,EAGA,KAAK,OAA2B;AAC5B,UAAM,SAAS,OAAO,QAChB,UAAU,OAAO;AACvB,WAAI,CAAC,SAAU,CAAC,MAAM,eAAe,CAAC,MAAM,YACjC,KAAK,OAAO,QAAQ,MAAyC,QAAW,QAAW,QAAQ,OAAO,IAEzG,MAAM,eAAe,MAAM,YAAY,SAAS,IACzC,KAAK,uBAAuB,MAAM,aAAa,MAAM,WAAW,QAAQ,OAAO,IAEnF,KAAK,OAAO,QAAQ,MAAyC,QAAW,MAAM,WAAW,QAAQ,OAAO;AAAA,EACnH;AAAA,EAEQ,MAAM,uBACV,aACA,WACA,QACA,SAAgB;AAEhB,UAAM,YAAY,CAAC,MAAyC,GAAG,WAAW,GACpE,CAAC,SAAS,QAAQ,KAAK,GAAG,IAAI,MAAM,KAAK,OAAO,QAAQ,QAAW,WAAW,aAAa,CAAA,GAAI,QAAQ,OAAO,GAC9G,eAAe,UAAU,IAAI,MAAA;AAAA,KAAe,GAC5C,cAAc,UAAU,IAAI,MAAA;AAAA,KAAe;AACjD,WAAO,CAAC,WAAW,cAAc,UAAU,aAAa,KAAK,GAAG;AAAA,EACpE;AAAA;AAAA,EAGA,aAAU;AACN,WAAO,KAAK,OACP,WAAW,IAAuB,EAClC,MAAM,CAAC,WAA0B,QAAQ,OAAO,oBAAoB,MAAM,MAAM,CAAC,CAAC;AAAA,EAC3F;AACH;AAGK,SAAU,oBAAoB,YAA6B,QAAqB;AAClF,QAAM,gBAAgB,OAAO,IAAI,WAAW,EAAE;AAC9C,MAAI;AAAe,WAAO;AAE1B,QAAM,aAAa,OAAO,OAAA,EAAS,OAAO;AAC1C,SAAI,cAEG,IAAI,SAAS;AAAA,IAChB,MAAM;AAAA,IACN,eAAe;AAAA,EAAA,CAClB;AACL;"}
1
+ {"version":3,"file":"subRequest.js","names":[],"sources":["../../../src/subRequest.ts"],"sourcesContent":["/* ########\n * 2025 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\nimport {RpcError} from '@mionjs/core';\nimport type {RunTypeError} from '@mionjs/core';\nimport type {CallSetup, RequestErrors, RouteSubRequest, SubRequest} from './types.ts';\nimport type {InjectedApiMetadata} from './types.ts';\n\nimport type {InputFromRef} from '@mionjs/core';\nimport type {MionClient} from './client.ts';\nimport {isInputFromRef} from './batch.ts';\n\nexport class MionSubRequest<S = any, E extends RpcError<string, any> = any> implements RouteSubRequest<any> {\n pointer: string[];\n id: string;\n isResolved: boolean = false;\n params: any[];\n resolvedValue?: S;\n error?: E;\n serializedParams?: any[];\n mappings: InputFromRef[] = [];\n\n constructor(\n parentProps: string[],\n handlerId: string,\n argArray: any[],\n readonly client: MionClient\n ) {\n this.pointer = [...parentProps];\n this.id = handlerId;\n this.params = argArray.map((arg, index) => {\n if (isInputFromRef(arg)) {\n arg.toRequestId = this.id;\n arg.paramIndex = index;\n this.mappings.push(arg);\n return null;\n }\n return arg;\n });\n }\n\n /** `apiMetadata` is filled by the build when routes are bundled, never by hand. */\n call(setup?: CallSetup, apiMetadata?: InjectedApiMetadata): Promise<any> {\n this.client.useBundledApi(apiMetadata);\n return this.client.execute(this as unknown as RouteSubRequest<any>, undefined, undefined, setup?.signal, setup?.timeout);\n }\n\n /** `apiMetadata` is filled by the build when routes are bundled, never by hand. */\n typeErrors(apiMetadata?: InjectedApiMetadata): Promise<RunTypeError[]> {\n this.client.useBundledApi(apiMetadata);\n return this.client\n .typeErrors(this as SubRequest<any>)\n .catch((errors: RequestErrors) => Promise.reject(findSubRequestError(this, errors)));\n }\n}\n\n/** Finds the most relevant error from the errors map for a given sub-request */\nexport function findSubRequestError(subRequest: SubRequest<any>, errors: RequestErrors): RpcError<string> {\n const specificError = errors.get(subRequest.id);\n if (specificError) return specificError;\n\n const firstError = errors.values().next().value;\n if (firstError) return firstError;\n\n return new RpcError({\n type: 'unknown-error',\n publicMessage: 'An unknown error occurred',\n });\n}\n"],"mappings":";;AAgBA,IAAa,iBAAb,MAA4G;AAAA,EAc/F;AAAA,EAbX;AAAA,EACA;AAAA,EACA,aAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAA2B,CAAC;AAAA,EAE5B,YACE,aACA,WACA,UACA,QACA;AADS,SAAA,SAAA,QAET,KAAK,UAAU,CAAC,GAAG,WAAW,GAC9B,KAAK,KAAK,WACV,KAAK,SAAS,SAAS,IAAA,CAAK,KAAK,UAC3B,eAAe,GAAG,KACpB,IAAI,cAAc,KAAK,IACvB,IAAI,aAAa,OACjB,KAAK,SAAS,KAAK,GAAG,GACf,QAEF,GACR;AAAA,EACH;AAAA,EAGA,KAAK,OAAmB,aAAiD;AACvE,gBAAK,OAAO,cAAc,WAAW,GAC9B,KAAK,OAAO,QAAQ,MAAyC,QAAW,QAAW,OAAO,QAAQ,OAAO,OAAO;AAAA,EACzH;AAAA,EAGA,WAAW,aAA4D;AACrE,gBAAK,OAAO,cAAc,WAAW,GAC9B,KAAK,OACT,WAAW,IAAuB,EAClC,MAAA,CAAO,WAA0B,QAAQ,OAAO,oBAAoB,MAAM,MAAM,CAAC,CAAC;AAAA,EACvF;AACF;AAGA,SAAgB,oBAAoB,YAA6B,QAAyC;AACxG,QAAM,gBAAgB,OAAO,IAAI,WAAW,EAAE;AAC9C,MAAI,cAAe,QAAO;AAE1B,QAAM,aAAa,OAAO,OAAO,EAAE,KAAK,EAAE;AAC1C,SAAI,cAEG,IAAI,SAAS;AAAA,IAClB,MAAM;AAAA,IACN,eAAe;AAAA,EACjB,CAAC;AACH"}
@@ -1,37 +1,32 @@
1
- import { RpcError, CoreRouterOptions, Prettify, RunTypeError, SerializerMode, ValidationError } from '@mionjs/core';
2
- import { PublicHeadersFn, PublicMiddleFn, RemoteApi, PublicRoute } from '@mionjs/router';
1
+ import { HandlerType, RpcError, InputFromRef, Prettify, RunTypeError, ValidationError } from '@mionjs/core';
2
+ import { PublicHeadersMiddleware, PublicMiddleware, RemoteApi, PublicRoute } from '@mionjs/router';
3
+ import { InjectApiMetadata } from '@mionjs/run-types';
3
4
  import { TypedEvent } from './lib/typedEvent.ts';
4
- export type Result<RouteSuccess, RouteError, MiddleFnsResults extends Record<string, unknown> = Record<string, unknown>, MiddleFnsErrors extends Record<string, unknown> = Record<string, RpcError<string, unknown>>> = [RouteSuccess | undefined, RouteError | undefined, MiddleFnsResults | undefined, MiddleFnsErrors | undefined];
5
- export type MiddleFnSuccess<H> = H extends MiddlewareSubRequest<infer PH> ? HandlerSuccessResponse<PH> : never;
6
- export type MiddleFnError<H> = H extends MiddlewareSubRequest<infer PH> ? Simplify<HandlerErrors<PH>> : never;
7
- export type WorkflowResult<Routes extends RouteSubRequest<any>[], MiddleFns extends Record<string, MiddlewareSubRequest<any>> = Record<string, MiddlewareSubRequest<any>>> = [
8
- WorkflowRouteResults<Routes>,
9
- WorkflowRouteErrors<Routes>,
10
- {
11
- [K in keyof MiddleFns]?: MiddleFnSuccess<MiddleFns[K]>;
12
- } | undefined,
13
- {
14
- [K in keyof MiddleFns]?: MiddleFnError<MiddleFns[K]>;
15
- } | undefined
5
+ import { MIDDLEWARE_HOOKS } from './constants.ts';
6
+ import { StorageEngine } from './lib/storage.ts';
7
+ export type Result<RouteSuccess, RouteError, RA = RemoteApi> = [
8
+ RouteSuccess | undefined,
9
+ RouteError | undefined,
10
+ ClientResponse<RA>
16
11
  ];
17
- export type WorkflowRouteResults<Routes extends RouteSubRequest<any>[]> = {
18
- [K in keyof Routes]: Routes[K] extends RouteSubRequest<infer PH> ? HandlerSuccessResponse<PH> | undefined : never;
12
+ export type BatchResult<Routes extends RouteSubRequest<any>[]> = {
13
+ [K in keyof Routes]: Routes[K] extends RouteSubRequest<any> ? Awaited<ReturnType<Routes[K]['call']>> : never;
19
14
  };
20
- export type WorkflowRouteErrors<Routes extends RouteSubRequest<any>[]> = {
21
- [K in keyof Routes]: Routes[K] extends RouteSubRequest<infer PH> ? Simplify<HandlerErrors<PH>> | undefined : never;
22
- };
23
- export interface ClientOptions extends CoreRouterOptions {
15
+ export type ClientFetchOptions = Omit<RequestInit, 'method' | 'body' | 'signal'>;
16
+ export interface ClientOptions {
24
17
  baseURL: string;
25
18
  basePath: string;
26
19
  suffix: string;
27
- autoGenerateErrorId: boolean;
28
- fetchOptions: RequestInit;
20
+ fetchOptions: ClientFetchOptions;
29
21
  validateParams: boolean;
30
- serializer: SerializerMode;
22
+ validateServerResponses: boolean;
23
+ sanitizeParams: boolean;
24
+ storageEngine: StorageEngine;
31
25
  timeout?: number;
32
26
  }
27
+ export type InjectedApiMetadata = InjectApiMetadata<RemoteApi, string>;
33
28
  type PublicHandler = (...args: any[]) => Promise<any>;
34
- type PublicMethod = PublicRoute | PublicMiddleFn | PublicHeadersFn;
29
+ type PublicMethod = PublicRoute | PublicMiddleware | PublicHeadersMiddleware;
35
30
  type ExtractHandler<PM extends PublicMethod> = PM extends {
36
31
  handler: infer H;
37
32
  } ? H : never;
@@ -46,7 +41,7 @@ export type RequestBody = {
46
41
  };
47
42
  export type RouteParamsType<PM extends PublicMethod> = Parameters<ExtractHandler<PM>>;
48
43
  export type RouteParamType<PM extends PublicMethod, Index extends number> = Parameters<ExtractHandler<PM>>[Index];
49
- export type HeadersParamsType<PM extends PublicHeadersFn> = Parameters<ExtractHandler<PM>>[0];
44
+ export type HeadersParamsType<PM extends PublicHeadersMiddleware> = Parameters<ExtractHandler<PM>>[0];
50
45
  export type RouteReturnType<PM extends PublicMethod> = HandlerSuccessResponse<ExtractHandler<PM>>;
51
46
  export type HandlerResponse<PH extends PublicHandler> = Awaited<ReturnType<PH>>;
52
47
  export type HandlerSuccessResponse<PH extends PublicHandler> = Exclude<HandlerResponse<PH>, RpcError<string>>;
@@ -60,78 +55,95 @@ export type FailResponses<List extends SubRequest<any>[]> = {
60
55
  [P in keyof List]: FailResponse<List[P]>;
61
56
  };
62
57
  export type RequestErrors = Map<string, RpcError<string>>;
63
- export type ErrorHandler<E extends RpcError<string, any>> = (error: E) => void;
64
- export type UnknownErrorHandler = (error: RpcError<string, any>) => void;
65
- export type SuccessHandler<S> = (result: S) => void;
58
+ export type ErrorOfType<E extends RpcError<string, any>, T extends E['type']> = E extends any ? T extends E['type'] ? E : never : never;
59
+ export type ErrorHandler<E extends RpcError<string, any>> = (error: E, context: MiddlewareContext) => unknown;
60
+ export type ResponseHandler<S> = (result: S, context: MiddlewareContext) => unknown;
61
+ export interface MiddlewareContext extends CallContext {
62
+ retry(): boolean;
63
+ }
64
+ export type RequestHandler<P extends any[] = any[]> = (call: (...params: P) => void, context: CallContext) => void | Promise<void>;
65
+ export interface CallContext {
66
+ readonly route?: RouteSubRequest<any>;
67
+ readonly batchSubRequests?: RouteSubRequest<any>[];
68
+ readonly subRequestList: Readonly<Record<string, SubRequest<any>>>;
69
+ readonly options: ClientOptions;
70
+ readonly signal?: AbortSignal;
71
+ }
72
+ export interface ClientCallContext extends CallContext {
73
+ readonly path: string;
74
+ readonly requestId: string;
75
+ readonly subRequestList: Record<string, SubRequest<any>>;
76
+ readonly thrownErrorIds: Set<string>;
77
+ httpResponse: Response | undefined;
78
+ response: ClientResponse<RemoteApi>;
79
+ }
66
80
  type Simplify<T> = T extends any ? T : never;
67
81
  export type HandlerErrors<PH extends (...args: any[]) => Promise<any>> = Simplify<Extract<HandlerResponse<PH>, RpcError<string, any>> | ValidationError>;
68
- export interface SubRequest<PH extends PublicHandler> {
82
+ export interface SubRequest<PH extends PublicHandler, Id extends string = string> {
69
83
  pointer: string[];
70
- id: string;
84
+ id: Id;
71
85
  isResolved: boolean;
72
86
  params: Parameters<PH>;
73
87
  resolvedValue?: HandlerSuccessResponse<PH>;
74
88
  error?: HandlerFailResponse<PH>;
75
89
  serializedParams?: any[];
90
+ mappings?: InputFromRef[];
76
91
  }
77
- export interface CallSetup<H extends Record<string, MiddlewareSubRequest<any>> = Record<string, never>, OtherRoutes extends RouteSubRequest<any>[] = []> {
78
- middleFns?: H;
79
- otherRoutes?: [...OtherRoutes];
92
+ export interface CallSetup {
80
93
  signal?: AbortSignal;
81
94
  timeout?: number;
82
95
  }
83
- export interface RoutesFlowBuilder<Routes extends RouteSubRequest<any>[]> {
84
- call(setup?: {
85
- middleFns?: never;
86
- signal?: AbortSignal;
87
- timeout?: number;
88
- }): Promise<WorkflowResult<Routes>>;
89
- call<H extends Record<string, MiddlewareSubRequest<any>>>(setup: {
90
- middleFns: H;
91
- signal?: AbortSignal;
92
- timeout?: number;
93
- }): Promise<WorkflowResult<Routes, H>>;
96
+ export type ApiOf<Routes extends SubRequest<any>[]> = Routes[number] extends RouteSubRequest<any, any, infer RA> ? RA : never;
97
+ export interface BatchBuilder<Routes extends RouteSubRequest<any>[]> {
98
+ call(setup?: CallSetup, apiMetadata?: InjectApiMetadata<ApiOf<Routes>, Routes[number]['id']>): Promise<BatchResult<Routes>>;
94
99
  }
95
- export interface RouteSubRequest<PH extends PublicHandler> extends SubRequest<PH> {
96
- typeErrors: () => Promise<RunTypeError[]>;
97
- call(setup?: {
98
- middleFns?: never;
99
- otherRoutes?: never;
100
- signal?: AbortSignal;
101
- timeout?: number;
102
- }): Promise<Result<HandlerSuccessResponse<PH>, Simplify<HandlerErrors<PH>>>>;
103
- call<H extends Record<string, MiddlewareSubRequest<any>>>(setup: {
104
- middleFns: H;
105
- otherRoutes?: never;
106
- signal?: AbortSignal;
107
- timeout?: number;
108
- }): Promise<Result<HandlerSuccessResponse<PH>, Simplify<HandlerErrors<PH>>, {
109
- [K in keyof H]?: MiddleFnSuccess<H[K]>;
110
- }, {
111
- [K in keyof H]?: MiddleFnError<H[K]>;
112
- }>>;
113
- call<OtherRoutes extends RouteSubRequest<any>[], H extends Record<string, MiddlewareSubRequest<any>> = Record<string, never>>(setup: {
114
- otherRoutes: [...OtherRoutes];
115
- middleFns?: H;
116
- signal?: AbortSignal;
117
- timeout?: number;
118
- }): Promise<WorkflowResult<any, H>>;
100
+ export interface RouteSubRequest<PH extends PublicHandler, Id extends string = string, RA extends RemoteApi = any> extends SubRequest<PH, Id> {
101
+ typeErrors(apiMetadata?: InjectApiMetadata<RA, Id>): Promise<RunTypeError[]>;
102
+ call(setup?: CallSetup, apiMetadata?: InjectApiMetadata<RA, Id>): Promise<Result<HandlerSuccessResponse<PH>, Simplify<HandlerErrors<PH>>, RA>>;
119
103
  }
120
- export interface MiddlewareSubRequest<PH extends PublicHandler> extends SubRequest<PH> {
121
- typeErrors: () => Promise<RunTypeError[]>;
122
- prefill: () => TypedEvent<HandlerSuccessResponse<PH>, Simplify<HandlerErrors<PH>>>;
123
- removePrefill: () => Promise<void>;
104
+ export type MiddlewareSubRequest<PH extends PublicHandler, Id extends string = string> = SubRequest<PH, Id>;
105
+ export type MiddlewareEvents<PH extends PublicHandler> = TypedEvent<HandlerSuccessResponse<PH>, Simplify<HandlerErrors<PH>>, Parameters<PH>>;
106
+ export interface ClientMiddleware<PH extends PublicHandler, Id extends string = string> extends Pick<MiddlewareEvents<PH>, (typeof MIDDLEWARE_HOOKS)[number]> {
124
107
  }
125
- export type NonClientRoute = never | PublicMiddleFn | PublicHeadersFn;
126
- export type ClientRoutes<RA extends RemoteApi> = Prettify<{
127
- [Property in keyof RA as RA[Property] extends NonClientRoute ? never : Property]: RA[Property] extends PublicRoute ? (...params: Parameters<RA[Property]['handler']>) => RouteSubRequest<RA[Property]['handler']> : RA[Property] extends RemoteApi ? ClientRoutes<RA[Property]> : never;
108
+ export type ClientMiddlewareOf<H extends (ctx: any, ...params: any[]) => any> = H extends (ctx: any, ...params: infer P) => infer R ? ClientMiddleware<(...params: P) => Promise<Awaited<R>>> : never;
109
+ type RouteLeaf = {
110
+ type: typeof HandlerType.route;
111
+ handler: PublicHandler;
112
+ };
113
+ type MiddlewareLeaf = {
114
+ type: typeof HandlerType.middleware | typeof HandlerType.headersMiddleware;
115
+ handler: PublicHandler;
116
+ };
117
+ type AnyLeaf = {
118
+ type: number;
119
+ };
120
+ export type NonClientRoute = MiddlewareLeaf;
121
+ export type ClientRoutes<RA, Prefix extends string = '', Root extends RemoteApi = RA extends RemoteApi ? RA : RemoteApi> = Prettify<{
122
+ [Property in keyof RA & string as RA[Property] extends NonClientRoute ? never : Property]: RA[Property] extends {
123
+ type: typeof HandlerType.route;
124
+ handler: infer H extends PublicHandler;
125
+ } ? (...params: Parameters<H>) => RouteSubRequest<H, `${Prefix}${Property & string}`, Root> : RA[Property] extends AnyLeaf ? never : ClientRoutes<RA[Property], `${Prefix}${Property & string}/`, Root>;
128
126
  }>;
129
- export type NonClientMiddleFn = never | PublicRoute | {
130
- [key: string]: PublicRoute;
127
+ export type NonClientMiddleware = RouteLeaf | {
128
+ [key: string]: RouteLeaf;
131
129
  };
132
- export type ClientMiddleFns<RA extends RemoteApi> = Prettify<{
133
- [Property in keyof RA as RA[Property] extends NonClientMiddleFn ? never : Property]: RA[Property] extends PublicMiddleFn | PublicHeadersFn ? (...params: Parameters<RA[Property]['handler']>) => MiddlewareSubRequest<RA[Property]['handler']> : RA[Property] extends RemoteApi ? ClientMiddleFns<RA[Property]> : never;
130
+ export type ClientMiddlewares<RA, Prefix extends string = ''> = Prettify<{
131
+ [Property in keyof RA & string as RA[Property] extends NonClientMiddleware ? never : Property]: RA[Property] extends {
132
+ type: typeof HandlerType.middleware | typeof HandlerType.headersMiddleware;
133
+ handler: infer H extends PublicHandler;
134
+ } ? ClientMiddleware<H, `${Prefix}${Property & string}`> : RA[Property] extends AnyLeaf ? never : ClientMiddlewares<RA[Property], `${Prefix}${Property & string}/`>;
134
135
  }>;
136
+ export type ClientResponse<RA> = (string extends keyof RA ? {
137
+ [key: string]: unknown;
138
+ } : ClientMiddlewareResponses<RA>) & {
139
+ '@thrownErrors'?: RpcError<string>[];
140
+ };
141
+ type ClientMiddlewareResponses<RA> = {
142
+ [Property in keyof RA & string as RA[Property] extends NonClientMiddleware ? never : Property]?: RA[Property] extends {
143
+ type: typeof HandlerType.middleware | typeof HandlerType.headersMiddleware;
144
+ handler: infer H extends PublicHandler;
145
+ } ? HandlerResponse<H> | ValidationError : RA[Property] extends AnyLeaf ? never : ClientMiddlewareResponses<RA[Property]>;
146
+ };
135
147
  export type Cleaned<RMS extends RemoteApi> = {
136
148
  [Property in keyof RMS as RMS[Property] extends never ? never : Property]: RMS[Property];
137
149
  };
@@ -139,6 +151,5 @@ export type SuccessClientResponse<RS extends RouteSubRequest<any>, RHList extend
139
151
  SuccessResponse<RS>,
140
152
  ...SuccessResponses<RHList>
141
153
  ];
142
- export type PrefilledMiddleFnsCache = Map<string, SubRequest<any>>;
143
154
  export {};
144
155
  //# sourceMappingURL=types.d.ts.map
@@ -1,2 +0,0 @@
1
-
2
- //# sourceMappingURL=types.js.map
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024 Mion
3
+ Copyright (c) 2026 Ma Jerez
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  <p align="center">
2
2
  <picture>
3
- <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/MionKit/mion/master/assets/public/bannerx90-dark.png">
4
- <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/MionKit/mion/master/assets/public/bannerx90.png">
5
- <img alt='mion, a mikro kit for Typescript Serverless APIs' src='https://raw.githubusercontent.com/MionKit/mion/master/assets/public/bannerx90.png'>
3
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/MionKit/mion/main/assets/public/bannerx90-dark.png">
4
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/MionKit/mion/main/assets/public/bannerx90.png">
5
+ <img alt='mion, a mikro kit for Typescript Serverless APIs' src='https://raw.githubusercontent.com/MionKit/mion/main/assets/public/bannerx90.png'>
6
6
  </picture>
7
7
  </p>
8
8
  <p align="center">
@@ -20,14 +20,14 @@ Modern client for mion APIs:
20
20
 
21
21
  - Strongly typed apis with autocompletion ans static type checking.
22
22
  - Fully typed list of remote methods with it's parameters and return values.
23
- - Automattic Validation and Serialization out of the box.
23
+ - Automatic Validation and JSON Round Trip out of the box.
24
24
  - Local Validation (no need to make a server request to validate parameters)
25
- - Prefill request data to persist across multiple calls.
25
+ - Middleware hooks that set their data before every request.
26
26
  - No compilation needed
27
27
 
28
28
  ## Check Out The [Website And Documentation](http://mion.io) 📚
29
29
 
30
- [![mion-website-banner](https://raw.githubusercontent.com/MionKit/mion/master/assets/public/mion-website-banner.png)](http://mion.io)
30
+ [![mion-website-banner](https://raw.githubusercontent.com/MionKit/mion/main/assets/public/mion-website-banner.png)](http://mion.io)
31
31
 
32
32
  ---
33
33
 
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "@mionjs/client",
3
- "version": "0.8.8",
3
+ "version": "0.13.0",
4
4
  "type": "module",
5
+ "sideEffects": false,
5
6
  "description": "Browser client for mion Apps.",
6
7
  "keywords": [
7
8
  "typescript",
@@ -20,10 +21,24 @@
20
21
  "license": "MIT",
21
22
  "exports": {
22
23
  ".": {
23
- "source": "./index.ts",
24
24
  "types": "./.dist/esm/index.d.ts",
25
25
  "require": "./.dist/cjs/index.cjs",
26
26
  "default": "./.dist/esm/index.js"
27
+ },
28
+ "./middlewares": {
29
+ "types": "./.dist/esm/middlewares.d.ts",
30
+ "require": "./.dist/cjs/middlewares.cjs",
31
+ "default": "./.dist/esm/middlewares.js"
32
+ }
33
+ },
34
+ "imports": {
35
+ "#metadata-from-server": {
36
+ "require": "./.dist/cjs/src/lib/metadataFromServer.cjs",
37
+ "default": "./.dist/esm/src/lib/metadataFromServer.js"
38
+ },
39
+ "#bundled-api": {
40
+ "require": "./.dist/cjs/src/lib/bundledApi.cjs",
41
+ "default": "./.dist/esm/src/lib/bundledApi.js"
27
42
  }
28
43
  },
29
44
  "directories": {
@@ -31,10 +46,8 @@
31
46
  },
32
47
  "files": [
33
48
  ".dist",
34
- "index.ts",
35
- "src",
36
- "!src/**/*.spec.ts",
37
- "!src/**/*.test.ts"
49
+ "!.dist/**/*.tsbuildinfo",
50
+ "!.dist/**/*.d.ts.map"
38
51
  ],
39
52
  "repository": {
40
53
  "type": "git",
@@ -43,30 +56,29 @@
43
56
  "publishConfig": {
44
57
  "access": "public"
45
58
  },
46
- "scripts": {
47
- "test": "vitest run && npm run test:e2e:ssr",
48
- "test:e2e:ssr": "node --experimental-strip-types src/aotSSR.e2e.test.ts",
49
- "dev": "vite build --watch",
50
- "dev:test": "vitest watch",
51
- "lint": "npx eslint src",
52
- "format": "prettier --write src/**/*.ts",
53
- "build": "vite build",
54
- "clean": "rimraf .dist & rimraf .coverage",
55
- "fresh-start": "npm run clean && rimraf node_modules",
56
- "run-test-server": "ts-node --project test/tsconfig.json test/test-server.ts"
57
- },
58
59
  "bugs": {
59
60
  "url": "https://github.com/MionKit/mion/issues"
60
61
  },
61
- "gitHead": "a92a438011336a078d394b75054422f3a56f8468",
62
+ "gitHead": "afd6e1d61525b4bf11bb84b3f85089038d70062d",
62
63
  "devDependencies": {
63
- "@mionjs/platform-node": "0.8.8",
64
- "@mionjs/router": "0.8.8",
65
- "@mionjs/run-types": "0.8.8",
66
- "@mionjs/test-server": "0.8.8",
67
- "jest-environment-jsdom": "^29.6.2"
64
+ "@mionjs/devtools": "0.13.0",
65
+ "@mionjs/platform-node": "0.13.0",
66
+ "@mionjs/router": "0.13.0",
67
+ "@mionjs/test-server": "0.13.0"
68
68
  },
69
69
  "dependencies": {
70
- "@mionjs/core": "0.8.8"
70
+ "@mionjs/core": "0.13.0",
71
+ "@mionjs/run-types": "0.13.0"
72
+ },
73
+ "scripts": {
74
+ "test": "vitest run",
75
+ "dev": "vite build --watch",
76
+ "dev:test": "vitest watch",
77
+ "lint": "eslint src",
78
+ "typecheck:test": "tsc -p tsconfig.json --noEmit",
79
+ "format": "prettier --write src/**/*.ts",
80
+ "build": "vite build",
81
+ "clean": "rimraf .dist .coverage .mion .mion",
82
+ "fresh-start": "pnpm run clean && rimraf node_modules"
71
83
  }
72
- }
84
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"AAOA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/client.ts"],"names":[],"mappings":"AAQA,OAAO,EACH,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,UAAU,EAEV,YAAY,EACZ,eAAe,EAGlB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAI9C,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAC,gBAAgB,EAAC,MAAM,2BAA2B,CAAC;AAG3D,wBAAgB,UAAU,CAAC,EAAE,SAAS,SAAS,EAC3C,OAAO,EAAE,iBAAiB,GAC3B;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;IAAC,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC,CAAA;CAAC,CAahF;AAED,qBAAa,UAAU;IAeP,OAAO,CAAC,aAAa;IAbjC,QAAQ,CAAC,gBAAgB,mBAA0B;IAGnD,QAAQ,CAAC,uBAAuB,+BAAsC;IAGtE,OAAO,CAAC,eAAe,CAAuB;IAE9C,OAAO,CAAC,qBAAqB,CAAyB;IACtD,OAAO,KAAK,YAAY,GAEvB;gBAEmB,aAAa,EAAE,aAAa;IAGhD,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,aAAa;IASrB,OAAO,CACH,eAAe,CAAC,EAAE,eAAe,CAAC,GAAG,CAAC,EACtC,mBAAmB,CAAC,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAC5C,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC,EAC3D,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,GAAG,CAAC;YAID,cAAc;IAsC5B,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,0BAA0B;IAUlC,OAAO,CAAC,yBAAyB;IAYjC,OAAO,CAAC,WAAW;IA2EnB,UAAU,CAAC,IAAI,SAAS,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAKxF,OAAO,CAAC,IAAI,SAAS,oBAAoB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrF,aAAa,CAAC,IAAI,SAAS,oBAAoB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3F,OAAO,IAAI,IAAI;CAIlB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/constants.ts"],"names":[],"mappings":"AAOA,OAAO,EAAC,aAAa,EAAC,MAAM,YAAY,CAAC;AAEzC,eAAO,MAAM,uBAAuB,EAAE,aAgBrC,CAAC;AAGF,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAEvC,eAAO,MAAM,WAAW,gBAAgB,CAAC;AAGzC,eAAO,MAAM,eAAe,qBAAqB,CAAC;AAGlD,eAAO,MAAM,gBAAgB,sBAAwB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"clientMethodsMetadata.d.ts","sourceRoot":"","sources":["../../../../src/lib/clientMethodsMetadata.ts"],"names":[],"mappings":"AAQA,OAAO,EAAC,WAAW,EAAC,MAAM,cAAc,CAAC;AACzC,OAAO,EAAC,aAAa,EAAE,UAAU,EAAC,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EACR,iBAAiB,EACjB,YAAY,EAIZ,gBAAgB,EACnB,MAAM,cAAc,CAAC;AAStB,KAAK,gBAAgB,GAAG,OAAO,WAAW,CAAC,eAAe,GAAG,OAAO,WAAW,CAAC,mBAAmB,CAAC;AAGpG,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CASnH;AAsBD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,aAAa,QAqB9H;AAGD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,QASjF;AAGD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,aAAa,QA0C5D;AAGD,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAO7E;AAGD,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,QA8BlF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetchRemoteMethodsMetadata.d.ts","sourceRoot":"","sources":["../../../../src/lib/fetchRemoteMethodsMetadata.ts"],"names":[],"mappings":"AAQA,OAAO,EAAC,aAAa,EAAc,MAAM,aAAa,CAAC;AAKvD,wBAAsB,0BAA0B,CAC5C,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,EAAE,aAAa,EACtB,MAAM,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"handlersRegistry.d.ts","sourceRoot":"","sources":["../../../../src/lib/handlersRegistry.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAC,YAAY,EAAE,cAAc,EAAC,MAAM,aAAa,CAAC;AAG9D,qBAAa,gBAAgB;IACzB,OAAO,CAAC,aAAa,CAA0D;IAC/E,OAAO,CAAC,eAAe,CAA+C;IAGtE,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI;IAUhF,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAStD,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAMzD,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,OAAO;IAYnE,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,GAAG,IAAI;IAKtE,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAK1C,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAK7C,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO;IAS9D,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAMtC,QAAQ,IAAI,IAAI;IAMhB,aAAa,IAAI,MAAM,EAAE;IAOzB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;CAI7C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../../../../src/lib/serializer.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAYjD,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,eAAe,CAAC;AAGrD,OAAO,EAAC,aAAa,EAAC,MAAM,aAAa,CAAC;AAG1C,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,CAAC;AAGjD,MAAM,MAAM,WAAW,GAAG,iCAAiC,GAAG,0BAA0B,CAAC;AAGzF,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;CAC5B;AAKD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,iBAAiB,CAsBxF;AA8ED,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAiB/G"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"storage.cjs","sources":["../../../../src/lib/storage.ts"],"sourcesContent":["/* ########\n * 2024 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\nconst STORAGE_GLOBAL_KEY = '__mion_storage__';\n\n/** In-memory Storage implementation for SSR/Node environments where localStorage is not available */\nexport class MemoryStorage {\n private data = new Map<string, string>();\n get length() {\n return this.data.size;\n }\n getItem(key: string): string | null {\n return this.data.get(key) ?? null;\n }\n setItem(key: string, value: string) {\n this.data.set(key, value);\n }\n removeItem(key: string) {\n this.data.delete(key);\n }\n clear() {\n this.data.clear();\n }\n key(index: number): string | null {\n return [...this.data.keys()][index] ?? null;\n }\n}\n\n/** Returns localStorage if available, otherwise a MemoryStorage instance.\n * Uses globalThis to ensure the same instance is shared across module boundaries. */\nexport function getStorage(): Storage | MemoryStorage {\n const existing = (globalThis as any)[STORAGE_GLOBAL_KEY];\n if (existing) return existing;\n let storage: Storage | MemoryStorage;\n try {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem('__mion_test__', '1');\n localStorage.removeItem('__mion_test__');\n storage = localStorage;\n } else {\n storage = new MemoryStorage();\n }\n } catch {\n storage = new MemoryStorage();\n }\n (globalThis as any)[STORAGE_GLOBAL_KEY] = storage;\n return storage;\n}\n\n/** Reset storage instance, useful for testing */\nexport function resetStorageInstance() {\n delete (globalThis as any)[STORAGE_GLOBAL_KEY];\n}\n"],"names":[],"mappings":"gFAOA,MAAM,mBAAqB,yBAGd,aAAa,CACd,SAAW,IACnB,IAAI,QAAM,CACN,OAAO,KAAK,KAAK,IACrB,CACA,QAAQ,IAAW,CACf,OAAO,KAAK,KAAK,IAAI,GAAG,GAAK,IACjC,CACA,QAAQ,IAAa,MAAa,CAC9B,KAAK,KAAK,IAAI,IAAK,KAAK,CAC5B,CACA,WAAW,IAAW,CAClB,KAAK,KAAK,OAAO,GAAG,CACxB,CACA,OAAK,CACD,KAAK,KAAK,MAAA,CACd,CACA,IAAI,MAAa,CACb,MAAO,CAAC,GAAG,KAAK,KAAK,MAAM,EAAE,KAAK,GAAK,IAC3C,CACH,UAIe,YAAU,CACtB,MAAM,SAAY,WAAmB,kBAAkB,EACvD,GAAI,SAAU,OAAO,SACrB,IAAI,QACJ,GAAI,CACI,OAAO,aAAiB,KACxB,aAAa,QAAQ,gBAAiB,GAAG,EACzC,aAAa,WAAW,eAAe,EACvC,QAAU,cAEV,QAAU,IAAI,aAEtB,MAAQ,CACJ,QAAU,IAAI,aAClB,CACC,kBAAmB,kBAAkB,EAAI,QACnC,OACX,UAGgB,sBAAoB,CAChC,OAAQ,WAAmB,kBAAkB,CACjD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../../src/lib/storage.ts"],"names":[],"mappings":"AAUA,qBAAa,aAAa;IACtB,OAAO,CAAC,IAAI,CAA6B;IACzC,IAAI,MAAM,WAET;IACD,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAGnC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAGlC,UAAU,CAAC,GAAG,EAAE,MAAM;IAGtB,KAAK;IAGL,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAGpC;AAID,wBAAgB,UAAU,IAAI,OAAO,GAAG,aAAa,CAiBpD;AAGD,wBAAgB,oBAAoB,SAEnC"}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const core=require("@mionjs/core");function resetClientCaches(){const cache=core.routesCache.getCache();for(const key in cache)delete cache[key];core.resetJitFnCaches(),core.resetJitFunctionsCache()}exports.resetClientCaches=resetClientCaches;
2
- //# sourceMappingURL=testUtils.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testUtils.cjs","sources":["../../../../src/lib/testUtils.ts"],"sourcesContent":["/* ########\n * 2024 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\nimport {resetJitFnCaches, resetJitFunctionsCache, routesCache} from '@mionjs/core';\n\n/** Resets all client caches. Only for testing — simulates app restart. */\nexport function resetClientCaches() {\n const cache = routesCache.getCache();\n for (const key in cache) delete cache[key];\n resetJitFnCaches();\n resetJitFunctionsCache();\n}\n"],"names":["routesCache","resetJitFnCaches","resetJitFunctionsCache"],"mappings":"4HAUgB,mBAAiB,CAC7B,MAAM,MAAQA,KAAAA,YAAY,SAAA,EAC1B,UAAW,OAAO,MAAO,OAAO,MAAM,GAAG,EACzCC,sBAAA,EACAC,4BAAA,CACJ"}
@@ -1,2 +0,0 @@
1
- export declare function resetClientCaches(): void;
2
- //# sourceMappingURL=testUtils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../../../src/lib/testUtils.ts"],"names":[],"mappings":"AAUA,wBAAgB,iBAAiB,SAKhC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"typedEvent.d.ts","sourceRoot":"","sources":["../../../../src/lib/typedEvent.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAe,cAAc,EAAC,MAAM,aAAa,CAAC;AAG9D,qBAAa,UAAU,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,SAAS,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,KAAK;IAEjE,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBADR,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,gBAAgB;IAI/C,SAAS,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;IAMvD,UAAU,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;IAM9B,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE;QAAC,IAAI,EAAE,CAAC,CAAA;KAAC,CAAC,KAAK,IAAI,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;IAM7G,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;IAM7D,YAAY,IAAI,MAAM;IAKtB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAK3C,iBAAiB,IAAI,OAAO;CAG/B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../src/lib/validation.ts"],"names":[],"mappings":"AAQA,OAAO,EAAC,aAAa,EAAE,UAAU,EAAC,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,eAAe,CAAC;AAGrD,wBAAgB,mBAAmB,CAC/B,aAAa,EAAE,MAAM,EAAE,EACvB,GAAG,EAAE,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,EAChC,MAAM,EAAE,aAAa,EACrB,sBAAsB,UAAO,GAC9B,IAAI,CAYN;AAGD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAiBvG"}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const core=require("@mionjs/core"),src_lib_fetchRemoteMethodsMetadata=require("./lib/fetchRemoteMethodsMetadata.cjs"),src_lib_clientMethodsMetadata=require("./lib/clientMethodsMetadata.cjs"),src_lib_validation=require("./lib/validation.cjs"),src_lib_serializer=require("./lib/serializer.cjs"),src_constants=require("./constants.cjs");class MionClientRequest{options;prefilledMiddleFnsCache;route;middleFns;workflowSubRequests;signal;path;requestId;subRequestList={};response;constructor(options,prefilledMiddleFnsCache,route,middleFns,workflowSubRequests,signal){if(this.options=options,this.prefilledMiddleFnsCache=prefilledMiddleFnsCache,this.route=route,this.middleFns=middleFns,this.workflowSubRequests=workflowSubRequests,this.signal=signal,workflowSubRequests&&workflowSubRequests.length>0){const routePaths=workflowSubRequests.map(sr=>core.getRoutePath(sr.pointer,this.options)),query=buildRoutesFlowQuery(routePaths,workflowSubRequests),flowPath=core.getRoutePath([src_constants.ROUTES_FLOW_KEY],this.options);this.path=`${flowPath}?data=${core.toBase64Url(JSON.stringify(query))}`,this.requestId="mion-routes-flow",workflowSubRequests.forEach(sr=>this.addSubRequest(sr))}else this.path=route?core.getRoutePath(route.pointer,this.options):"no-route",this.requestId=route?route.id:"no-route",route&&this.addSubRequest(route);middleFns&&middleFns.forEach(middleFn=>this.addSubRequest(middleFn))}async call(){if(this.signal?.aborted){const errors=new Map;return this.onError(this.signal.reason??new DOMException("This operation was aborted","AbortError"),"Request aborted",errors),Promise.reject(errors)}return this.makeCall(this.options.serializer)}async makeCall(originalSerializer,skipOptimistic){const errors=new Map,subRequestIds=Object.keys(this.subRequestList),isOptimistic=!subRequestIds.every(id=>core.routesCache.hasMetadata(id))&&!skipOptimistic;try{if(isOptimistic){this.options.serializer="optimistic",this.restorePrefilledMiddleFns();const allSubRequestIds=Object.keys(this.subRequestList);this.addSubRequest(src_lib_clientMethodsMetadata.createMetadataSubRequest(allSubRequestIds))}else if(this.options.serializer=originalSerializer,await src_lib_fetchRemoteMethodsMetadata.fetchRemoteMethodsMetadata(subRequestIds,this.options,this.signal),this.restorePrefilledMiddleFns(errors),errors.size||(src_lib_validation.validateSubRequests(subRequestIds,this,errors),errors.size))return Promise.reject(errors)}catch(error){return this.onError(error,"Error preparing request",errors),Promise.reject(errors)}try{let serialized;try{serialized=src_lib_serializer.serializeRequestBody(this)}catch(serializeError){if(isOptimistic)return delete this.subRequestList[core.MION_ROUTES.methodsMetadata],this.makeCall(originalSerializer,!0);throw serializeError}const headersFromParams=extractRequestHeaders(this),url=new URL(this.path,this.options.baseURL),fetchOptions=buildFetchOptions(url,serialized,headersFromParams,this.options,isOptimistic,this.isQueryRoute(),this.signal);this.response=await fetch(url,fetchOptions)}catch(error){return this.onError(error,"Error executing request",errors),Promise.reject(errors)}try{if(this.signal?.aborted)return this.onError(this.signal.reason,"Request aborted",errors),Promise.reject(errors);const deserialized=await src_lib_serializer.deserializeResponseBody(this.response,this.options);return this.handlePlatformError(deserialized,errors)?Promise.reject(errors):isOptimistic&&!this.signal?.aborted&&this.shouldRetryWithProperSerialization(deserialized)?this.retryWithProperSerialization(originalSerializer):(this.resolveSubRequests(deserialized,errors,isOptimistic?core.MION_ROUTES.methodsMetadata:void 0),errors.size?Promise.reject(errors):deserialized)}catch(error){return this.onError(error,"Error parsing response",errors),Promise.reject(errors)}}shouldRetryWithProperSerialization(deserialized){return Object.values(deserialized).some(value=>core.isRpcError(value)&&(value.type==="serialization-error"||value.type==="validation-error"||value.type==="parsing-json-request-error"))}async retryWithProperSerialization(originalSerializer){return delete this.subRequestList[core.MION_ROUTES.methodsMetadata],Object.values(this.subRequestList).forEach(sr=>{sr.isResolved=!1,sr.resolvedValue=void 0,sr.error=void 0}),this.makeCall(originalSerializer)}async validateParams(subReqList){subReqList&&subReqList.forEach(subRequest=>this.addSubRequest(subRequest));const errors=new Map;try{const subRequestIds=Object.keys(this.subRequestList);return await src_lib_fetchRemoteMethodsMetadata.fetchRemoteMethodsMetadata(subRequestIds,this.options),src_lib_validation.validateSubRequests(subRequestIds,this,errors,!1),Object.values(this.subRequestList).map(subRequest=>subRequest.error?.errorData||[]).flat()}catch(error){return this.onError(error,"Error preparing request",errors),Promise.reject(errors)}}async prefill(subReqList){subReqList&&subReqList.forEach(subRequest=>this.addSubRequest(subRequest));const errors=new Map;try{const subRequestIds=Object.keys(this.subRequestList);return await src_lib_fetchRemoteMethodsMetadata.fetchRemoteMethodsMetadata(subRequestIds,this.options),src_lib_validation.validateSubRequests(subRequestIds,this,errors,!1),errors.size||(src_lib_serializer.serializeRequestBody(this),this.storePrefilledMiddleFns(errors),errors.size)?Promise.reject(errors):void 0}catch(error){return this.onError(error,"Error preparing request",errors),Promise.reject(errors)}}async removePrefill(subRequests){subRequests&&subRequests.forEach(subRequest=>this.addSubRequest(subRequest)),this.removePrefilledMiddleFns()}addSubRequest(subRequest){if(subRequest.isResolved)throw new Error(`SubRequest ${subRequest.id} is already resolved`);this.subRequestList[subRequest.id]=subRequest}handlePlatformError(deserialized,errors){if(!(core.MION_ROUTES.platformError in deserialized))return!1;const platformError=deserialized[core.MION_ROUTES.platformError];return Object.entries(this.subRequestList).forEach(([id,methodMeta])=>{methodMeta.isResolved=!0,methodMeta.error=platformError,errors.set(id,platformError)}),!0}resolveSubRequests(deserialized,errors,skipId){Object.entries(this.subRequestList).forEach(([id,methodMeta])=>{if(id===skipId)return;const resp=this.getResponseValueFromBodyOrHeader(id,deserialized,this.response.headers);methodMeta.isResolved=!0,core.isRpcError(resp)?(methodMeta.error=resp,errors.set(id,resp)):methodMeta.resolvedValue=resp}),Object.entries(deserialized).forEach(([id,value])=>{!(id in this.subRequestList)&&core.isRpcError(value)&&errors.set(id,value)})}onError(error,stageMessage,errors){const reason=this.signal?.aborted?this.signal.reason:void 0;if(reason instanceof DOMException){if(reason.name==="TimeoutError"){errors.set(this.requestId,new core.RpcError({type:"request-timeout",publicMessage:"Request timed out",originalError:error instanceof Error?error:void 0}));return}if(reason.name==="AbortError"){errors.set(this.requestId,new core.RpcError({type:"request-aborted",publicMessage:"Request was aborted",originalError:error instanceof Error?error:void 0}));return}}if(core.isRpcError(error)){errors.set(this.requestId,error);return}const message=error?.message?`${stageMessage}: ${error.message}`:`${stageMessage}: Unknown Error`;errors.set(this.requestId,new core.RpcError({type:error?.name||"unknown-error",publicMessage:message,originalError:error instanceof Error?error:void 0}))}getResponseValueFromBodyOrHeader(id,respBody,headers){const headersSubset=reconstructHeadersSubsetFromResponse(id,headers);return headersSubset||respBody[id]}restorePrefilledMiddleFns(errors){if(this.workflowSubRequests&&this.workflowSubRequests.length>0){this.restorePrefilledMiddleFnsForWorkflow(errors);return}const methodMeta=core.routesCache.getMetadata(this.requestId);if(!methodMeta){errors&&errors.set(this.requestId,new core.RpcError({type:"route-metadata-not-found",publicMessage:`Metadata for Route '${this.requestId} not found.'.`}));return}(methodMeta.middleFnIds?.filter(id=>!!id&&this.requestId!==id)||[]).forEach(id=>{if(this.subRequestList[id])return;const cacheKey=this.getPrefilledMiddleFnCacheKey(id),cachedSubRequest=this.prefilledMiddleFnsCache.get(cacheKey);if(cachedSubRequest){const clonedSubRequest={...cachedSubRequest,isResolved:!1,resolvedValue:void 0,error:void 0};this.addSubRequest(clonedSubRequest)}})}restorePrefilledMiddleFnsForWorkflow(errors){const workflowRouteIds=new Set(this.workflowSubRequests.map(sr=>sr.id));for(const routeSubRequest of this.workflowSubRequests){const methodMeta=core.routesCache.getMetadata(routeSubRequest.id);if(!methodMeta){errors&&errors.set(routeSubRequest.id,new core.RpcError({type:"route-metadata-not-found",publicMessage:`Metadata for Route '${routeSubRequest.id}' not found.`}));continue}(methodMeta.middleFnIds?.filter(id=>!!id&&!workflowRouteIds.has(id))||[]).forEach(id=>{if(this.subRequestList[id])return;const cacheKey=this.getPrefilledMiddleFnCacheKey(id),cachedSubRequest=this.prefilledMiddleFnsCache.get(cacheKey);if(cachedSubRequest){const clonedSubRequest={...cachedSubRequest,isResolved:!1,resolvedValue:void 0,error:void 0};this.addSubRequest(clonedSubRequest)}})}}storePrefilledMiddleFns(errors){Object.keys(this.subRequestList).forEach(id=>{const subRequest=this.subRequestList[id],methodMeta=core.routesCache.getMetadata(id);if(!methodMeta)throw new Error(`Remote method ${id} not found.`);if(methodMeta.type===core.HandlerType.route){errors.set(id,new core.RpcError({type:"routes-cant-be-prefilled",publicMessage:`Remote method ${id} is a route and can't be prefilled.`}));return}const cacheKey=this.getPrefilledMiddleFnCacheKey(id);this.prefilledMiddleFnsCache.set(cacheKey,subRequest)})}removePrefilledMiddleFns(){Object.keys(this.subRequestList).forEach(id=>{const cacheKey=this.getPrefilledMiddleFnCacheKey(id);this.prefilledMiddleFnsCache.delete(cacheKey)})}isQueryRoute(){return this.workflowSubRequests?!1:core.routesCache.getMetadata(this.requestId)?.options?.isMutation===!1}getPrefilledMiddleFnCacheKey(id){return`${this.options.baseURL}:${id}`}}function buildFetchOptions(url,serialized,headersFromParams,options,isOptimistic,isQuery,signal){if(!isOptimistic&&isQuery&&serialized.contentType.includes("json")){const encoded=core.toBase64Url(serialized.body),testUrl=new URL(url.pathname+url.search,url.origin);if(testUrl.searchParams.set("data",encoded),testUrl.toString().length<=src_constants.MAX_GET_URL_LENGTH)return url.searchParams.set("data",encoded),{...options.fetchOptions,method:"GET",headers:{...options.fetchOptions.headers,...headersFromParams},body:void 0,signal}}return{...options.fetchOptions,method:"POST",headers:{...options.fetchOptions.headers,...headersFromParams,"Content-Type":serialized.contentType},body:serialized.body,signal}}function extractRequestHeaders(req){const headers={},subRequestIds=Object.keys(req.subRequestList);for(let i=0;i<subRequestIds.length;i++){const id=subRequestIds[i],subRequest=req.subRequestList[id];if(!subRequest)continue;const method=core.routesCache.getMetadata(id);if(!method||method.type!==core.HandlerType.headersMiddleFn||!method.headersParam)continue;const params=subRequest.params,extracted=extractHeadersFromParams(params);Object.assign(headers,extracted)}return headers}function extractHeadersFromParams(params){if(!params||params.length===0)throw new core.RpcError({type:"missing-headers-param",publicMessage:"HeadersFn requires a HeadersSubset parameter."});const firstParam=params[0];if(firstParam instanceof core.HeadersSubset||firstParam&&typeof firstParam=="object"&&"headers"in firstParam&&typeof firstParam.headers=="object")return firstParam.headers;throw new core.RpcError({type:"invalid-headers-param",publicMessage:"HeadersFn first parameter must be a HeadersSubset instance or object with headers property."})}function reconstructHeadersSubsetFromResponse(methodId,responseHeaders){const method=core.routesCache.getMetadata(methodId);if(!method?.headersReturn?.headerNames||method.headersReturn.headerNames.length===0)return;const headerNames=method.headersReturn.headerNames,headersMap={};for(const name of headerNames){const value=responseHeaders.get(name);value!=null&&(headersMap[name]=value)}if(Object.keys(headersMap).length>0)return new core.HeadersSubset(headersMap)}function buildRoutesFlowQuery(routePaths,workflowSubRequests){const allMappings=[];for(const sr of workflowSubRequests){const mappings=sr.mappings;if(Array.isArray(mappings)&&mappings.length>0)for(const ref of mappings)allMappings.push({fromId:ref.fromRequestId,toId:ref.toRequestId,bodyHash:ref.bodyHash,paramIndex:ref.paramIndex})}return{routes:routePaths,mappings:allMappings.length>0?allMappings:void 0}}exports.MionClientRequest=MionClientRequest;
2
- //# sourceMappingURL=request.cjs.map