@mionjs/client 0.8.10 → 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 @@
1
+ {"version":3,"file":"clientResponse.js","names":[],"sources":["../../../../src/lib/clientResponse.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\nimport {MION_ROUTES, ROUTER_ITEM_SEPARATOR_CHAR} from '@mionjs/core';\nimport type {RpcError} from '@mionjs/core';\nimport type {RemoteApi} from '@mionjs/router';\nimport type {ClientResponse} from '../types.ts';\n\ntype ResponseNode = Record<string, unknown>;\n\nexport function addThrownError(response: ClientResponse<RemoteApi>, error: RpcError<string>): void {\n const thrownErrors = response[MION_ROUTES.thrownErrors];\n if (Array.isArray(thrownErrors)) thrownErrors.push(error);\n else response[MION_ROUTES.thrownErrors] = [error];\n}\n\nexport function hasResponseValue(response: ClientResponse<RemoteApi>, id: string): boolean {\n const {parent, key} = findParent(response, id);\n return !!parent && Object.hasOwn(parent, key);\n}\n\nexport function getResponseValue(response: ClientResponse<RemoteApi>, id: string): unknown {\n const {parent, key} = findParent(response, id);\n return parent && Object.hasOwn(parent, key) ? parent[key] : undefined;\n}\n\n/** False when the id has no safe path, so the caller keeps the value somewhere else */\nexport function setResponseValue(response: ClientResponse<RemoteApi>, id: string, value: unknown): boolean {\n const {parent, key} = findParent(response, id, true);\n if (parent) parent[key] = value;\n return !!parent;\n}\n\n/** Also drops every group it leaves empty: the response never holds what the body did not */\nexport function deleteResponseValue(response: ClientResponse<RemoteApi>, id: string): void {\n const pointer = id.split(ROUTER_ITEM_SEPARATOR_CHAR);\n for (let depth = pointer.length; depth > 0; depth--) {\n const {parent, key} = findParent(response, pointer.slice(0, depth).join(ROUTER_ITEM_SEPARATOR_CHAR));\n if (!parent || !Object.hasOwn(parent, key)) return;\n const child = parent[key];\n if (depth < pointer.length && !(isNode(child) && !Object.keys(child).length)) return;\n delete parent[key];\n }\n}\n\nfunction findParent(response: ClientResponse<RemoteApi>, id: string, create = false): {parent?: ResponseNode; key: string} {\n const pointer = id.split(ROUTER_ITEM_SEPARATOR_CHAR);\n const key = pointer[pointer.length - 1];\n // a response key is untrusted: `__proto__` would write the prototype, and the top-level thrown list is not a group\n if (pointer.includes('__proto__') || pointer[0] === MION_ROUTES.thrownErrors) return {key};\n let node: ResponseNode = response;\n for (let i = 0; i < pointer.length - 1; i++) {\n let next = Object.hasOwn(node, pointer[i]) ? node[pointer[i]] : undefined;\n if (next === undefined && create) next = node[pointer[i]] = {};\n if (!isNode(next)) return {key};\n node = next;\n }\n return {parent: node, key};\n}\n\nfunction isNode(value: unknown): value is ResponseNode {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],"mappings":";AAcA,SAAgB,eAAe,UAAqC,OAA+B;AACjG,QAAM,eAAe,SAAS,YAAY,YAAA;AAC1C,EAAI,MAAM,QAAQ,YAAY,IAAG,aAAa,KAAK,KAAK,IACnD,SAAS,YAAY,YAAA,IAAgB,CAAC,KAAK;AAClD;AAEA,SAAgB,iBAAiB,UAAqC,IAAqB;AACzF,QAAM,EAAC,QAAQ,IAAA,IAAO,WAAW,UAAU,EAAE;AAC7C,SAAO,CAAC,CAAC,UAAU,OAAO,OAAO,QAAQ,GAAG;AAC9C;AAEA,SAAgB,iBAAiB,UAAqC,IAAqB;AACzF,QAAM,EAAC,QAAQ,IAAA,IAAO,WAAW,UAAU,EAAE;AAC7C,SAAO,UAAU,OAAO,OAAO,QAAQ,GAAG,IAAI,OAAO,GAAA,IAAO;AAC9D;AAGA,SAAgB,iBAAiB,UAAqC,IAAY,OAAyB;AACzG,QAAM,EAAC,QAAQ,IAAA,IAAO,WAAW,UAAU,IAAI,EAAI;AACnD,SAAI,WAAQ,OAAO,GAAA,IAAO,QACnB,CAAC,CAAC;AACX;AAGA,SAAgB,oBAAoB,UAAqC,IAAkB;AACzF,QAAM,UAAU,GAAG,MAAM,0BAA0B;AACnD,WAAS,QAAQ,QAAQ,QAAQ,QAAQ,GAAG,SAAS;AACnD,UAAM,EAAC,QAAQ,IAAA,IAAO,WAAW,UAAU,QAAQ,MAAM,GAAG,KAAK,EAAE,KAAK,0BAA0B,CAAC;AACnG,QAAI,CAAC,UAAU,CAAC,OAAO,OAAO,QAAQ,GAAG,EAAG;AAC5C,UAAM,QAAQ,OAAO,GAAA;AACrB,QAAI,QAAQ,QAAQ,UAAU,EAAE,OAAO,KAAK,KAAK,CAAC,OAAO,KAAK,KAAK,EAAE,QAAS;AAC9E,WAAO,OAAO,GAAA;AAAA,EAChB;AACF;AAEA,SAAS,WAAW,UAAqC,IAAY,SAAS,IAA6C;AACzH,QAAM,UAAU,GAAG,MAAM,0BAA0B,GAC7C,MAAM,QAAQ,QAAQ,SAAS,CAAA;AAErC,MAAI,QAAQ,SAAS,WAAW,KAAK,QAAQ,CAAA,MAAO,YAAY,aAAc,QAAO,EAAC,IAAG;AACzF,MAAI,OAAqB;AACzB,WAAS,IAAI,GAAG,IAAI,QAAQ,SAAS,GAAG,KAAK;AAC3C,QAAI,OAAO,OAAO,OAAO,MAAM,QAAQ,CAAA,CAAE,IAAI,KAAK,QAAQ,CAAA,CAAA,IAAM;AAEhE,QADI,SAAS,UAAa,WAAQ,OAAO,KAAK,QAAQ,CAAA,CAAA,IAAM,CAAC,IACzD,CAAC,OAAO,IAAI,EAAG,QAAO,EAAC,IAAG;AAC9B,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IAAC,QAAQ;AAAA,IAAM;AAAA,EAAG;AAC3B;AAEA,SAAS,OAAO,OAAuC;AACrD,SAAO,OAAO,SAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E"}
@@ -1,3 +1,3 @@
1
1
  import { ClientOptions } from '../types.ts';
2
- export declare function fetchRemoteMethodsMetadata(methodIds: string[], options: ClientOptions, signal?: AbortSignal): Promise<void>;
2
+ export declare function fetchRemoteMethodsMetadata(methodIds: string[], routePointer: string[], options: ClientOptions, signal?: AbortSignal, middlewareId?: string): Promise<void>;
3
3
  //# sourceMappingURL=fetchRemoteMethodsMetadata.d.ts.map
@@ -1,26 +1,28 @@
1
- import { routesCache, MION_ROUTES, getRoutePath, isRpcError } from "@mionjs/core";
2
- import { restoreFromLocalStorage } from "./clientMethodsMetadata.js";
3
- import { deserializeResponseBody } from "./serializer.js";
4
- async function fetchRemoteMethodsMetadata(methodIds, options, signal) {
5
- restoreFromLocalStorage(methodIds, options);
6
- const missingAfterLocal = methodIds.filter((path) => !routesCache.hasMetadata(path));
7
- if (!missingAfterLocal.length)
8
- return;
1
+ import { hasMethod } from "./methods.js";
2
+ import { hydrateMetadataCache, installMethodRows } from "./clientMethodsMetadata.js";
3
+ import { MION_ROUTES, RpcError, getRoutePath, getRouterItemId, isRpcError } from "@mionjs/core";
4
+ var FETCH_METADATA_ID = "mionFetchMetadata";
5
+ async function fetchRemoteMethodsMetadata(methodIds, routePointer, options, signal, middlewareId = FETCH_METADATA_ID) {
6
+ await hydrateMetadataCache(options);
7
+ const missingAfterLocal = methodIds.filter((path) => !hasMethod(path));
8
+ if (!missingAfterLocal.length) return;
9
9
  const body = {
10
- [MION_ROUTES.methodsMetadataById]: [missingAfterLocal]
10
+ [middlewareId]: [missingAfterLocal, "only"],
11
+ [getRouterItemId(routePointer)]: "metadata-only"
11
12
  };
12
13
  try {
13
- const path = getRoutePath([MION_ROUTES.methodsMetadataById], options), url = new URL(path, options.baseURL), response = await fetch(url, {
14
+ const url = new URL(getRoutePath(routePointer, options), options.baseURL), parsedBody = await (await fetch(url, {
14
15
  method: "POST",
15
16
  headers: { "Content-Type": "application/json" },
16
17
  body: JSON.stringify(body),
17
18
  signal
18
- }), platformError = (await deserializeResponseBody(response, options))[MION_ROUTES.platformError];
19
- if (isRpcError(platformError))
20
- throw platformError;
21
- const stillMissing = missingAfterLocal.filter((id) => !routesCache.hasMetadata(id));
22
- if (stillMissing.length)
23
- throw new Error(`Failed to fetch metadata for: ${stillMissing.join(", ")}`);
19
+ })).json(), platformError = parsedBody?.[MION_ROUTES.thrownErrors]?.[MION_ROUTES.platformError];
20
+ if (isRpcError(platformError)) throw new RpcError(platformError);
21
+ const slot = parsedBody?.[middlewareId], answer = Array.isArray(slot) ? slot[1] : slot;
22
+ if (!isRpcError(answer) || answer.type !== "metadata-only" || !answer.errorData?.metadata) throw new Error(`the server answered no metadata; place ${middlewareId} first in its routes`);
23
+ installMethodRows(answer.errorData.metadata, options);
24
+ const stillMissing = missingAfterLocal.filter((id) => !hasMethod(id));
25
+ if (stillMissing.length) throw new Error(`Failed to fetch metadata for: ${stillMissing.join(", ")}`);
24
26
  } catch (error) {
25
27
  throw signal?.aborted ? error : new Error(`Error fetching validation and serialization metadata: ${error?.message}`);
26
28
  }
@@ -28,4 +30,5 @@ async function fetchRemoteMethodsMetadata(methodIds, options, signal) {
28
30
  export {
29
31
  fetchRemoteMethodsMetadata
30
32
  };
31
- //# sourceMappingURL=fetchRemoteMethodsMetadata.js.map
33
+
34
+ //# sourceMappingURL=fetchRemoteMethodsMetadata.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetchRemoteMethodsMetadata.js","sources":["../../../../src/lib/fetchRemoteMethodsMetadata.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 {isRpcError, MION_ROUTES, getRoutePath, routesCache} from '@mionjs/core';\nimport {ClientOptions, RequestBody} from '../types.ts';\nimport {restoreFromLocalStorage} from './clientMethodsMetadata.ts';\nimport {deserializeResponseBody} from './serializer.ts';\n\n/** Manually calls mionGetRemoteMethodsInfoById to get Remote Api Metadata */\nexport async function fetchRemoteMethodsMetadata(\n methodIds: string[],\n options: ClientOptions,\n signal?: AbortSignal\n): Promise<void> {\n restoreFromLocalStorage(methodIds, options);\n const missingAfterLocal = methodIds.filter((path) => !routesCache.hasMetadata(path));\n if (!missingAfterLocal.length) return;\n const body: RequestBody = {\n [MION_ROUTES.methodsMetadataById]: [missingAfterLocal],\n };\n try {\n const path = getRoutePath([MION_ROUTES.methodsMetadataById], options);\n const url = new URL(path, options.baseURL);\n const response = await fetch(url, {\n method: 'POST',\n headers: {'Content-Type': 'application/json'},\n body: JSON.stringify(body),\n signal,\n });\n const deserialized = await deserializeResponseBody(response, options);\n const platformError = deserialized[MION_ROUTES.platformError];\n if (isRpcError(platformError)) throw platformError;\n const stillMissing = missingAfterLocal.filter((id) => !routesCache.hasMetadata(id));\n if (stillMissing.length) throw new Error(`Failed to fetch metadata for: ${stillMissing.join(', ')}`);\n } catch (error: any) {\n // Preserve abort/timeout DOMException so the caller's onError can classify it correctly\n if (signal?.aborted) throw error;\n throw new Error(`Error fetching validation and serialization metadata: ${error?.message}`);\n }\n}\n"],"names":[],"mappings":";;;AAaA,eAAsB,2BAClB,WACA,SACA,QAAoB;AAEpB,0BAAwB,WAAW,OAAO;AAC1C,QAAM,oBAAoB,UAAU,OAAO,CAAC,SAAS,CAAC,YAAY,YAAY,IAAI,CAAC;AACnF,MAAI,CAAC,kBAAkB;AAAQ;AAC/B,QAAM,OAAoB;AAAA,IACtB,CAAC,YAAY,mBAAmB,GAAG,CAAC,iBAAiB;AAAA,EAAA;AAEzD,MAAI;AACA,UAAM,OAAO,aAAa,CAAC,YAAY,mBAAmB,GAAG,OAAO,GAC9D,MAAM,IAAI,IAAI,MAAM,QAAQ,OAAO,GACnC,WAAW,MAAM,MAAM,KAAK;AAAA,MAC9B,QAAQ;AAAA,MACR,SAAS,EAAC,gBAAgB,mBAAA;AAAA,MAC1B,MAAM,KAAK,UAAU,IAAI;AAAA,MACzB;AAAA,IAAA,CACH,GAEK,iBADe,MAAM,wBAAwB,UAAU,OAAO,GACjC,YAAY,aAAa;AAC5D,QAAI,WAAW,aAAa;AAAG,YAAM;AACrC,UAAM,eAAe,kBAAkB,OAAO,CAAC,OAAO,CAAC,YAAY,YAAY,EAAE,CAAC;AAClF,QAAI,aAAa;AAAQ,YAAM,IAAI,MAAM,iCAAiC,aAAa,KAAK,IAAI,CAAC,EAAE;AAAA,EACvG,SAAS,OAAY;AAEjB,UAAI,QAAQ,UAAe,QACrB,IAAI,MAAM,yDAAyD,OAAO,OAAO,EAAE;AAAA,EAC7F;AACJ;"}
1
+ {"version":3,"file":"fetchRemoteMethodsMetadata.js","names":[],"sources":["../../../../src/lib/fetchRemoteMethodsMetadata.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 {isRpcError, MION_ROUTES, getRoutePath, RpcError, getRouterItemId} from '@mionjs/core';\nimport type {FetchMetadataOnlyData} from '@mionjs/core/middlewares';\nimport {ClientOptions} from '../types.ts';\nimport {hydrateMetadataCache, installMethodRows} from './clientMethodsMetadata.ts';\nimport {hasMethod} from './methods.ts';\n\n/** The key `mionFetchMetadata` sits under when placed by its own name. */\nconst FETCH_METADATA_ID = 'mionFetchMetadata';\n\n/** Sent to a route's path: the metadata middleware answers and stops the call before the route runs. */\nexport async function fetchRemoteMethodsMetadata(\n methodIds: string[],\n routePointer: string[],\n options: ClientOptions,\n signal?: AbortSignal,\n middlewareId: string = FETCH_METADATA_ID\n): Promise<void> {\n await hydrateMetadataCache(options);\n const missingAfterLocal = methodIds.filter((path) => !hasMethod(path));\n if (!missingAfterLocal.length) return;\n const body: Record<string, unknown> = {\n [middlewareId]: [missingAfterLocal, 'only'],\n // not params: a server without the middleware refuses this slot instead of running the route\n [getRouterItemId(routePointer)]: 'metadata-only',\n };\n try {\n const url = new URL(getRoutePath(routePointer, options), options.baseURL);\n const response = await fetch(url, {\n method: 'POST',\n headers: {'Content-Type': 'application/json'},\n body: JSON.stringify(body),\n signal,\n });\n // the middleware pins the built-in parser on both wires, so its answer is plain JSON\n const parsedBody = await response.json();\n const platformError = parsedBody?.[MION_ROUTES.thrownErrors]?.[MION_ROUTES.platformError];\n if (isRpcError(platformError)) throw new RpcError(platformError);\n const slot = parsedBody?.[middlewareId];\n // a union answer rides the `[index, value]` envelope\n const answer = (Array.isArray(slot) ? slot[1] : slot) as RpcError<string, FetchMetadataOnlyData> | undefined;\n if (!isRpcError(answer) || answer.type !== 'metadata-only' || !answer.errorData?.metadata)\n throw new Error(`the server answered no metadata; place ${middlewareId} first in its routes`);\n installMethodRows(answer.errorData.metadata, options);\n const stillMissing = missingAfterLocal.filter((id) => !hasMethod(id));\n if (stillMissing.length) throw new Error(`Failed to fetch metadata for: ${stillMissing.join(', ')}`);\n } catch (error: any) {\n // Preserve the abort/timeout DOMException so the caller's onError can classify it\n if (signal?.aborted) throw error;\n throw new Error(`Error fetching validation and serialization metadata: ${error?.message}`);\n }\n}\n"],"mappings":";;;AAcA,IAAM,oBAAoB;AAG1B,eAAsB,2BACpB,WACA,cACA,SACA,QACA,eAAuB,mBACR;AACf,QAAM,qBAAqB,OAAO;AAClC,QAAM,oBAAoB,UAAU,OAAA,CAAQ,SAAS,CAAC,UAAU,IAAI,CAAC;AACrE,MAAI,CAAC,kBAAkB,OAAQ;AAC/B,QAAM,OAAgC;AAAA,KACnC,YAAA,GAAe,CAAC,mBAAmB,MAAM;AAAA,KAEzC,gBAAgB,YAAY,CAAA,GAAI;AAAA,EACnC;AACA,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,aAAa,cAAc,OAAO,GAAG,QAAQ,OAAO,GAQlE,aAAa,OAAM,MAPF,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS,EAAC,gBAAgB,mBAAkB;AAAA,MAC5C,MAAM,KAAK,UAAU,IAAI;AAAA,MACzB;AAAA,IACF,CAAC,GAEiC,KAAK,GACjC,gBAAgB,aAAa,YAAY,YAAA,IAAgB,YAAY,aAAA;AAC3E,QAAI,WAAW,aAAa,EAAG,OAAM,IAAI,SAAS,aAAa;AAC/D,UAAM,OAAO,aAAa,YAAA,GAEpB,SAAU,MAAM,QAAQ,IAAI,IAAI,KAAK,CAAA,IAAK;AAChD,QAAI,CAAC,WAAW,MAAM,KAAK,OAAO,SAAS,mBAAmB,CAAC,OAAO,WAAW,SAC/E,OAAM,IAAI,MAAM,0CAA0C,YAAA,sBAAkC;AAC9F,sBAAkB,OAAO,UAAU,UAAU,OAAO;AACpD,UAAM,eAAe,kBAAkB,OAAA,CAAQ,OAAO,CAAC,UAAU,EAAE,CAAC;AACpE,QAAI,aAAa,OAAQ,OAAM,IAAI,MAAM,iCAAiC,aAAa,KAAK,IAAI,CAAA,EAAG;AAAA,EACrG,SAAS,OAAY;AAEnB,UAAI,QAAQ,UAAe,QACrB,IAAI,MAAM,yDAAyD,OAAO,OAAA,EAAS;AAAA,EAC3F;AACF"}
@@ -1,16 +1,25 @@
1
- import { RpcError } from '@mionjs/core';
2
- import { ErrorHandler, SuccessHandler } from '../types.ts';
1
+ import { ErrorHandler, RequestHandler, ResponseHandler, SubRequest } from '../types.ts';
2
+ export interface RequestHandlerEntry {
3
+ handler: RequestHandler<any>;
4
+ createSubRequest: (params: any[]) => SubRequest<any>;
5
+ }
3
6
  export declare class HandlersRegistry {
4
7
  private errorHandlers;
5
- private successHandlers;
8
+ private responseHandlers;
9
+ private requestHandlers;
6
10
  register(handlerId: string, errorType: string, handler: ErrorHandler<any>): void;
7
- unregister(handlerId: string, errorType: string): void;
11
+ unregister(handlerId: string, errorType: string, handler: ErrorHandler<any>): void;
8
12
  hasHandler(handlerId: string, errorType: string): boolean;
9
- executeHandler(handlerId: string, error: RpcError<string>): boolean;
10
- registerSuccess(handlerId: string, handler: SuccessHandler<any>): void;
11
- unregisterSuccess(handlerId: string): void;
12
- hasSuccessHandler(handlerId: string): boolean;
13
- executeSuccessHandler(handlerId: string, result: any): boolean;
13
+ getErrorHandlers(handlerId: string, errorType: string): ErrorHandler<any>[];
14
+ registerResponse(handlerId: string, handler: ResponseHandler<any>): void;
15
+ unregisterResponse(handlerId: string, handler: ResponseHandler<any>): void;
16
+ hasResponseHandler(handlerId: string): boolean;
17
+ getResponseHandlers(handlerId: string): ResponseHandler<any>[];
18
+ registerRequest(handlerId: string, handler: RequestHandler<any>, createSubRequest: RequestHandlerEntry['createSubRequest']): void;
19
+ unregisterRequest(handlerId: string): void;
20
+ hasRequestHandler(handlerId: string): boolean;
21
+ getRequestHandler(handlerId: string): RequestHandlerEntry | undefined;
22
+ getRequestHandlerIds(): string[];
14
23
  clearHandlers(handlerId: string): void;
15
24
  clearAll(): void;
16
25
  getHandlerIds(): string[];
@@ -1,65 +1,80 @@
1
- class HandlersRegistry {
1
+ var HandlersRegistry = class {
2
2
  errorHandlers = /* @__PURE__ */ new Map();
3
- successHandlers = /* @__PURE__ */ new Map();
4
- /** Register an error handler for a specific handler (middleFn) and error type */
3
+ responseHandlers = /* @__PURE__ */ new Map();
4
+ requestHandlers = /* @__PURE__ */ new Map();
5
5
  register(handlerId, errorType, handler) {
6
6
  let handlerMap = this.errorHandlers.get(handlerId);
7
- handlerMap || (handlerMap = /* @__PURE__ */ new Map(), this.errorHandlers.set(handlerId, handlerMap)), handlerMap.set(errorType, handler);
7
+ handlerMap || (handlerMap = /* @__PURE__ */ new Map(), this.errorHandlers.set(handlerId, handlerMap));
8
+ const handlers = handlerMap.get(errorType);
9
+ handlers ? handlers.push(handler) : handlerMap.set(errorType, [handler]);
8
10
  }
9
- /** Unregister an error handler for a specific handler and error type */
10
- unregister(handlerId, errorType) {
11
- const handlerMap = this.errorHandlers.get(handlerId);
12
- handlerMap && (handlerMap.delete(errorType), handlerMap.size === 0 && this.errorHandlers.delete(handlerId));
11
+ unregister(handlerId, errorType, handler) {
12
+ const handlerMap = this.errorHandlers.get(handlerId), handlers = handlerMap?.get(errorType);
13
+ !handlerMap || !handlers || (removeFrom(handlers, handler), handlers.length || handlerMap.delete(errorType), handlerMap.size === 0 && this.errorHandlers.delete(handlerId));
13
14
  }
14
- /** Check if an error handler exists for a specific handler ID and error type */
15
15
  hasHandler(handlerId, errorType) {
16
16
  return this.errorHandlers.get(handlerId)?.has(errorType) ?? !1;
17
17
  }
18
- /** Get and execute the handler for an error, if it exists */
19
- executeHandler(handlerId, error) {
20
- const handlerMap = this.errorHandlers.get(handlerId);
21
- if (!handlerMap)
22
- return !1;
23
- const handler = handlerMap.get(error.type);
24
- return handler ? (handler(error), !0) : !1;
18
+ getErrorHandlers(handlerId, errorType) {
19
+ return [...this.errorHandlers.get(handlerId)?.get(errorType) ?? []];
20
+ }
21
+ registerResponse(handlerId, handler) {
22
+ const handlers = this.responseHandlers.get(handlerId);
23
+ handlers ? handlers.push(handler) : this.responseHandlers.set(handlerId, [handler]);
24
+ }
25
+ unregisterResponse(handlerId, handler) {
26
+ const handlers = this.responseHandlers.get(handlerId);
27
+ handlers && (removeFrom(handlers, handler), handlers.length || this.responseHandlers.delete(handlerId));
25
28
  }
26
- /** Register a success handler for a specific middleFn */
27
- registerSuccess(handlerId, handler) {
28
- this.successHandlers.set(handlerId, handler);
29
+ hasResponseHandler(handlerId) {
30
+ return this.responseHandlers.has(handlerId);
29
31
  }
30
- /** Unregister a success handler for a specific middleFn */
31
- unregisterSuccess(handlerId) {
32
- this.successHandlers.delete(handlerId);
32
+ getResponseHandlers(handlerId) {
33
+ return [...this.responseHandlers.get(handlerId) ?? []];
33
34
  }
34
- /** Check if a success handler exists for a specific handler ID */
35
- hasSuccessHandler(handlerId) {
36
- return this.successHandlers.has(handlerId);
35
+ registerRequest(handlerId, handler, createSubRequest) {
36
+ this.requestHandlers.set(handlerId, {
37
+ handler,
38
+ createSubRequest
39
+ });
37
40
  }
38
- /** Get and execute the success handler for a middleFn result, if it exists */
39
- executeSuccessHandler(handlerId, result) {
40
- const handler = this.successHandlers.get(handlerId);
41
- return handler ? (handler(result), !0) : !1;
41
+ unregisterRequest(handlerId) {
42
+ this.requestHandlers.delete(handlerId);
43
+ }
44
+ hasRequestHandler(handlerId) {
45
+ return this.requestHandlers.has(handlerId);
46
+ }
47
+ getRequestHandler(handlerId) {
48
+ return this.requestHandlers.get(handlerId);
49
+ }
50
+ getRequestHandlerIds() {
51
+ return Array.from(this.requestHandlers.keys());
42
52
  }
43
- /** Clear all handlers (both error and success) for a specific handler ID */
44
53
  clearHandlers(handlerId) {
45
- this.errorHandlers.delete(handlerId), this.successHandlers.delete(handlerId);
54
+ this.errorHandlers.delete(handlerId), this.responseHandlers.delete(handlerId), this.requestHandlers.delete(handlerId);
46
55
  }
47
- /** Clear all registered handlers (both error and success) */
48
56
  clearAll() {
49
- this.errorHandlers.clear(), this.successHandlers.clear();
57
+ this.errorHandlers.clear(), this.responseHandlers.clear(), this.requestHandlers.clear();
50
58
  }
51
- /** Get all registered handler IDs */
52
59
  getHandlerIds() {
53
- const errorIds = Array.from(this.errorHandlers.keys()), successIds = Array.from(this.successHandlers.keys());
54
- return [.../* @__PURE__ */ new Set([...errorIds, ...successIds])];
60
+ const errorIds = Array.from(this.errorHandlers.keys()), responseIds = Array.from(this.responseHandlers.keys()), requestIds = Array.from(this.requestHandlers.keys());
61
+ return [.../* @__PURE__ */ new Set([
62
+ ...errorIds,
63
+ ...responseIds,
64
+ ...requestIds
65
+ ])];
55
66
  }
56
- /** Get all error types registered for a handler ID */
57
67
  getErrorTypes(handlerId) {
58
68
  const handlerMap = this.errorHandlers.get(handlerId);
59
69
  return handlerMap ? Array.from(handlerMap.keys()) : [];
60
70
  }
71
+ };
72
+ function removeFrom(handlers, handler) {
73
+ const index = handlers.indexOf(handler);
74
+ index !== -1 && handlers.splice(index, 1);
61
75
  }
62
76
  export {
63
77
  HandlersRegistry
64
78
  };
65
- //# sourceMappingURL=handlersRegistry.js.map
79
+
80
+ //# sourceMappingURL=handlersRegistry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handlersRegistry.js","sources":["../../../../src/lib/handlersRegistry.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 type {RpcError} from '@mionjs/core';\nimport type {ErrorHandler, SuccessHandler} from '../types.ts';\n\n/** Central registry for persistent middleFn handlers (both success and error) */\nexport class HandlersRegistry {\n private errorHandlers: Map<string, Map<string, ErrorHandler<any>>> = new Map();\n private successHandlers: Map<string, SuccessHandler<any>> = new Map();\n\n /** Register an error handler for a specific handler (middleFn) and error type */\n register(handlerId: string, errorType: string, handler: ErrorHandler<any>): void {\n let handlerMap = this.errorHandlers.get(handlerId);\n if (!handlerMap) {\n handlerMap = new Map();\n this.errorHandlers.set(handlerId, handlerMap);\n }\n handlerMap.set(errorType, handler);\n }\n\n /** Unregister an error handler for a specific handler and error type */\n unregister(handlerId: string, errorType: string): void {\n const handlerMap = this.errorHandlers.get(handlerId);\n if (handlerMap) {\n handlerMap.delete(errorType);\n if (handlerMap.size === 0) this.errorHandlers.delete(handlerId);\n }\n }\n\n /** Check if an error handler exists for a specific handler ID and error type */\n hasHandler(handlerId: string, errorType: string): boolean {\n const handlerMap = this.errorHandlers.get(handlerId);\n return handlerMap?.has(errorType) ?? false;\n }\n\n /** Get and execute the handler for an error, if it exists */\n executeHandler(handlerId: string, error: RpcError<string>): boolean {\n const handlerMap = this.errorHandlers.get(handlerId);\n if (!handlerMap) return false;\n\n const handler = handlerMap.get(error.type);\n if (!handler) return false;\n\n handler(error);\n return true;\n }\n\n /** Register a success handler for a specific middleFn */\n registerSuccess(handlerId: string, handler: SuccessHandler<any>): void {\n this.successHandlers.set(handlerId, handler);\n }\n\n /** Unregister a success handler for a specific middleFn */\n unregisterSuccess(handlerId: string): void {\n this.successHandlers.delete(handlerId);\n }\n\n /** Check if a success handler exists for a specific handler ID */\n hasSuccessHandler(handlerId: string): boolean {\n return this.successHandlers.has(handlerId);\n }\n\n /** Get and execute the success handler for a middleFn result, if it exists */\n executeSuccessHandler(handlerId: string, result: any): boolean {\n const handler = this.successHandlers.get(handlerId);\n if (!handler) return false;\n\n handler(result);\n return true;\n }\n\n /** Clear all handlers (both error and success) for a specific handler ID */\n clearHandlers(handlerId: string): void {\n this.errorHandlers.delete(handlerId);\n this.successHandlers.delete(handlerId);\n }\n\n /** Clear all registered handlers (both error and success) */\n clearAll(): void {\n this.errorHandlers.clear();\n this.successHandlers.clear();\n }\n\n /** Get all registered handler IDs */\n getHandlerIds(): string[] {\n const errorIds = Array.from(this.errorHandlers.keys());\n const successIds = Array.from(this.successHandlers.keys());\n return [...new Set([...errorIds, ...successIds])];\n }\n\n /** Get all error types registered for a handler ID */\n getErrorTypes(handlerId: string): string[] {\n const handlerMap = this.errorHandlers.get(handlerId);\n return handlerMap ? Array.from(handlerMap.keys()) : [];\n }\n}\n"],"names":[],"mappings":"MAWa,iBAAgB;AAAA,EACjB,oCAAiE,IAAA;AAAA,EACjE,sCAAwD,IAAA;AAAA;AAAA,EAGhE,SAAS,WAAmB,WAAmB,SAA0B;AACrE,QAAI,aAAa,KAAK,cAAc,IAAI,SAAS;AACjD,IAAK,eACD,iCAAiB,IAAA,GACjB,KAAK,cAAc,IAAI,WAAW,UAAU,IAEhD,WAAW,IAAI,WAAW,OAAO;AAAA,EACrC;AAAA;AAAA,EAGA,WAAW,WAAmB,WAAiB;AAC3C,UAAM,aAAa,KAAK,cAAc,IAAI,SAAS;AACnD,IAAI,eACA,WAAW,OAAO,SAAS,GACvB,WAAW,SAAS,KAAG,KAAK,cAAc,OAAO,SAAS;AAAA,EAEtE;AAAA;AAAA,EAGA,WAAW,WAAmB,WAAiB;AAE3C,WADmB,KAAK,cAAc,IAAI,SAAS,GAChC,IAAI,SAAS,KAAK;AAAA,EACzC;AAAA;AAAA,EAGA,eAAe,WAAmB,OAAuB;AACrD,UAAM,aAAa,KAAK,cAAc,IAAI,SAAS;AACnD,QAAI,CAAC;AAAY,aAAO;AAExB,UAAM,UAAU,WAAW,IAAI,MAAM,IAAI;AACzC,WAAK,WAEL,QAAQ,KAAK,GACN,MAHc;AAAA,EAIzB;AAAA;AAAA,EAGA,gBAAgB,WAAmB,SAA4B;AAC3D,SAAK,gBAAgB,IAAI,WAAW,OAAO;AAAA,EAC/C;AAAA;AAAA,EAGA,kBAAkB,WAAiB;AAC/B,SAAK,gBAAgB,OAAO,SAAS;AAAA,EACzC;AAAA;AAAA,EAGA,kBAAkB,WAAiB;AAC/B,WAAO,KAAK,gBAAgB,IAAI,SAAS;AAAA,EAC7C;AAAA;AAAA,EAGA,sBAAsB,WAAmB,QAAW;AAChD,UAAM,UAAU,KAAK,gBAAgB,IAAI,SAAS;AAClD,WAAK,WAEL,QAAQ,MAAM,GACP,MAHc;AAAA,EAIzB;AAAA;AAAA,EAGA,cAAc,WAAiB;AAC3B,SAAK,cAAc,OAAO,SAAS,GACnC,KAAK,gBAAgB,OAAO,SAAS;AAAA,EACzC;AAAA;AAAA,EAGA,WAAQ;AACJ,SAAK,cAAc,MAAA,GACnB,KAAK,gBAAgB,MAAA;AAAA,EACzB;AAAA;AAAA,EAGA,gBAAa;AACT,UAAM,WAAW,MAAM,KAAK,KAAK,cAAc,MAAM,GAC/C,aAAa,MAAM,KAAK,KAAK,gBAAgB,MAAM;AACzD,WAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,UAAU,GAAG,UAAU,CAAC,CAAC;AAAA,EACpD;AAAA;AAAA,EAGA,cAAc,WAAiB;AAC3B,UAAM,aAAa,KAAK,cAAc,IAAI,SAAS;AACnD,WAAO,aAAa,MAAM,KAAK,WAAW,KAAA,CAAM,IAAI,CAAA;AAAA,EACxD;AACH;"}
1
+ {"version":3,"file":"handlersRegistry.js","names":[],"sources":["../../../../src/lib/handlersRegistry.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 type {ErrorHandler, RequestHandler, ResponseHandler, SubRequest} from '../types.ts';\n\n/** A request handler plus the middleware function that turns its params into a sub request */\nexport interface RequestHandlerEntry {\n handler: RequestHandler<any>;\n createSubRequest: (params: any[]) => SubRequest<any>;\n}\n\n/** Central registry for persistent middleware handlers: request, response and error */\nexport class HandlersRegistry {\n private errorHandlers: Map<string, Map<string, ErrorHandler<any>[]>> = new Map();\n private responseHandlers: Map<string, ResponseHandler<any>[]> = new Map();\n private requestHandlers: Map<string, RequestHandlerEntry> = new Map();\n\n register(handlerId: string, errorType: string, handler: ErrorHandler<any>): void {\n let handlerMap = this.errorHandlers.get(handlerId);\n if (!handlerMap) {\n handlerMap = new Map();\n this.errorHandlers.set(handlerId, handlerMap);\n }\n const handlers = handlerMap.get(errorType);\n if (handlers) handlers.push(handler);\n else handlerMap.set(errorType, [handler]);\n }\n\n unregister(handlerId: string, errorType: string, handler: ErrorHandler<any>): void {\n const handlerMap = this.errorHandlers.get(handlerId);\n const handlers = handlerMap?.get(errorType);\n if (!handlerMap || !handlers) return;\n removeFrom(handlers, handler);\n if (!handlers.length) handlerMap.delete(errorType);\n if (handlerMap.size === 0) this.errorHandlers.delete(handlerId);\n }\n\n hasHandler(handlerId: string, errorType: string): boolean {\n const handlerMap = this.errorHandlers.get(handlerId);\n return handlerMap?.has(errorType) ?? false;\n }\n\n /** A copy, so a handler that adds or removes one leaves this run unchanged */\n getErrorHandlers(handlerId: string, errorType: string): ErrorHandler<any>[] {\n return [...(this.errorHandlers.get(handlerId)?.get(errorType) ?? [])];\n }\n\n registerResponse(handlerId: string, handler: ResponseHandler<any>): void {\n const handlers = this.responseHandlers.get(handlerId);\n if (handlers) handlers.push(handler);\n else this.responseHandlers.set(handlerId, [handler]);\n }\n\n unregisterResponse(handlerId: string, handler: ResponseHandler<any>): void {\n const handlers = this.responseHandlers.get(handlerId);\n if (!handlers) return;\n removeFrom(handlers, handler);\n if (!handlers.length) this.responseHandlers.delete(handlerId);\n }\n\n hasResponseHandler(handlerId: string): boolean {\n return this.responseHandlers.has(handlerId);\n }\n\n /** A copy, so a handler that adds or removes one leaves this run unchanged */\n getResponseHandlers(handlerId: string): ResponseHandler<any>[] {\n return [...(this.responseHandlers.get(handlerId) ?? [])];\n }\n\n registerRequest(\n handlerId: string,\n handler: RequestHandler<any>,\n createSubRequest: RequestHandlerEntry['createSubRequest']\n ): void {\n this.requestHandlers.set(handlerId, {handler, createSubRequest});\n }\n\n unregisterRequest(handlerId: string): void {\n this.requestHandlers.delete(handlerId);\n }\n\n hasRequestHandler(handlerId: string): boolean {\n return this.requestHandlers.has(handlerId);\n }\n\n getRequestHandler(handlerId: string): RequestHandlerEntry | undefined {\n return this.requestHandlers.get(handlerId);\n }\n\n getRequestHandlerIds(): string[] {\n return Array.from(this.requestHandlers.keys());\n }\n\n clearHandlers(handlerId: string): void {\n this.errorHandlers.delete(handlerId);\n this.responseHandlers.delete(handlerId);\n this.requestHandlers.delete(handlerId);\n }\n\n clearAll(): void {\n this.errorHandlers.clear();\n this.responseHandlers.clear();\n this.requestHandlers.clear();\n }\n\n getHandlerIds(): string[] {\n const errorIds = Array.from(this.errorHandlers.keys());\n const responseIds = Array.from(this.responseHandlers.keys());\n const requestIds = Array.from(this.requestHandlers.keys());\n return [...new Set([...errorIds, ...responseIds, ...requestIds])];\n }\n\n getErrorTypes(handlerId: string): string[] {\n const handlerMap = this.errorHandlers.get(handlerId);\n return handlerMap ? Array.from(handlerMap.keys()) : [];\n }\n}\n\n/** A handler registered twice needs two removals */\nfunction removeFrom<H>(handlers: H[], handler: H): void {\n const index = handlers.indexOf(handler);\n if (index !== -1) handlers.splice(index, 1);\n}\n"],"mappings":"AAgBA,IAAa,mBAAb,MAA8B;AAAA,EAC5B,gBAAuE,oBAAI,IAAI;AAAA,EAC/E,mBAAgE,oBAAI,IAAI;AAAA,EACxE,kBAA4D,oBAAI,IAAI;AAAA,EAEpE,SAAS,WAAmB,WAAmB,SAAkC;AAC/E,QAAI,aAAa,KAAK,cAAc,IAAI,SAAS;AACjD,IAAK,eACH,aAAa,oBAAI,IAAI,GACrB,KAAK,cAAc,IAAI,WAAW,UAAU;AAE9C,UAAM,WAAW,WAAW,IAAI,SAAS;AACzC,IAAI,WAAU,SAAS,KAAK,OAAO,IAC9B,WAAW,IAAI,WAAW,CAAC,OAAO,CAAC;AAAA,EAC1C;AAAA,EAEA,WAAW,WAAmB,WAAmB,SAAkC;AACjF,UAAM,aAAa,KAAK,cAAc,IAAI,SAAS,GAC7C,WAAW,YAAY,IAAI,SAAS;AAC1C,IAAI,CAAC,cAAc,CAAC,aACpB,WAAW,UAAU,OAAO,GACvB,SAAS,UAAQ,WAAW,OAAO,SAAS,GAC7C,WAAW,SAAS,KAAG,KAAK,cAAc,OAAO,SAAS;AAAA,EAChE;AAAA,EAEA,WAAW,WAAmB,WAA4B;AAExD,WADmB,KAAK,cAAc,IAAI,SACnC,GAAY,IAAI,SAAS,KAAK;AAAA,EACvC;AAAA,EAGA,iBAAiB,WAAmB,WAAwC;AAC1E,WAAO,CAAC,GAAI,KAAK,cAAc,IAAI,SAAS,GAAG,IAAI,SAAS,KAAK,CAAC,CAAE;AAAA,EACtE;AAAA,EAEA,iBAAiB,WAAmB,SAAqC;AACvE,UAAM,WAAW,KAAK,iBAAiB,IAAI,SAAS;AACpD,IAAI,WAAU,SAAS,KAAK,OAAO,IAC9B,KAAK,iBAAiB,IAAI,WAAW,CAAC,OAAO,CAAC;AAAA,EACrD;AAAA,EAEA,mBAAmB,WAAmB,SAAqC;AACzE,UAAM,WAAW,KAAK,iBAAiB,IAAI,SAAS;AACpD,IAAK,aACL,WAAW,UAAU,OAAO,GACvB,SAAS,UAAQ,KAAK,iBAAiB,OAAO,SAAS;AAAA,EAC9D;AAAA,EAEA,mBAAmB,WAA4B;AAC7C,WAAO,KAAK,iBAAiB,IAAI,SAAS;AAAA,EAC5C;AAAA,EAGA,oBAAoB,WAA2C;AAC7D,WAAO,CAAC,GAAI,KAAK,iBAAiB,IAAI,SAAS,KAAK,CAAC,CAAE;AAAA,EACzD;AAAA,EAEA,gBACE,WACA,SACA,kBACM;AACN,SAAK,gBAAgB,IAAI,WAAW;AAAA,MAAC;AAAA,MAAS;AAAA,IAAgB,CAAC;AAAA,EACjE;AAAA,EAEA,kBAAkB,WAAyB;AACzC,SAAK,gBAAgB,OAAO,SAAS;AAAA,EACvC;AAAA,EAEA,kBAAkB,WAA4B;AAC5C,WAAO,KAAK,gBAAgB,IAAI,SAAS;AAAA,EAC3C;AAAA,EAEA,kBAAkB,WAAoD;AACpE,WAAO,KAAK,gBAAgB,IAAI,SAAS;AAAA,EAC3C;AAAA,EAEA,uBAAiC;AAC/B,WAAO,MAAM,KAAK,KAAK,gBAAgB,KAAK,CAAC;AAAA,EAC/C;AAAA,EAEA,cAAc,WAAyB;AACrC,SAAK,cAAc,OAAO,SAAS,GACnC,KAAK,iBAAiB,OAAO,SAAS,GACtC,KAAK,gBAAgB,OAAO,SAAS;AAAA,EACvC;AAAA,EAEA,WAAiB;AACf,SAAK,cAAc,MAAM,GACzB,KAAK,iBAAiB,MAAM,GAC5B,KAAK,gBAAgB,MAAM;AAAA,EAC7B;AAAA,EAEA,gBAA0B;AACxB,UAAM,WAAW,MAAM,KAAK,KAAK,cAAc,KAAK,CAAC,GAC/C,cAAc,MAAM,KAAK,KAAK,iBAAiB,KAAK,CAAC,GACrD,aAAa,MAAM,KAAK,KAAK,gBAAgB,KAAK,CAAC;AACzD,WAAO,CAAC,GAAG,oBAAI,IAAI;AAAA,MAAC,GAAG;AAAA,MAAU,GAAG;AAAA,MAAa,GAAG;AAAA,IAAU,CAAC,CAAC;AAAA,EAClE;AAAA,EAEA,cAAc,WAA6B;AACzC,UAAM,aAAa,KAAK,cAAc,IAAI,SAAS;AACnD,WAAO,aAAa,MAAM,KAAK,WAAW,KAAK,CAAC,IAAI,CAAC;AAAA,EACvD;AACF;AAGA,SAAS,WAAc,UAAe,SAAkB;AACtD,QAAM,QAAQ,SAAS,QAAQ,OAAO;AACtC,EAAI,UAAU,MAAI,SAAS,OAAO,OAAO,CAAC;AAC5C"}
@@ -0,0 +1,7 @@
1
+ import { HeadersSubset } from '@mionjs/core';
2
+ import { CallContext } from '../types.ts';
3
+ export declare function hasHeadersSubsetParam(id: string, params: any[] | undefined): boolean;
4
+ export declare function headersToRecord(headers: HeadersInit | undefined): Record<string, string>;
5
+ export declare function extractRequestHeaders(context: CallContext): Record<string, string>;
6
+ export declare function reconstructHeadersSubsetFromResponse(methodId: string, responseHeaders: Headers): HeadersSubset<string, string> | undefined;
7
+ //# sourceMappingURL=headers.d.ts.map
@@ -0,0 +1,47 @@
1
+ import { getMethod } from "./methods.js";
2
+ import { HandlerType, HeadersSubset, RpcError, trustedHeadersSubset } from "@mionjs/core";
3
+ function hasHeadersSubsetParam(id, params) {
4
+ const method = getMethod(id);
5
+ return method ? method.type === HandlerType.headersMiddleware && !!method.headersParam : params?.[0] instanceof HeadersSubset;
6
+ }
7
+ function headersToRecord(headers) {
8
+ return headers ? typeof Headers < "u" && headers instanceof Headers ? Object.fromEntries(headers.entries()) : typeof headers[Symbol.iterator] == "function" ? Object.fromEntries(headers) : { ...headers } : {};
9
+ }
10
+ function extractRequestHeaders(context) {
11
+ const headers = {}, subRequestIds = Object.keys(context.subRequestList);
12
+ for (let i = 0; i < subRequestIds.length; i++) {
13
+ const id = subRequestIds[i], subRequest = context.subRequestList[id];
14
+ !subRequest || !hasHeadersSubsetParam(id, subRequest.params) || Object.assign(headers, extractHeadersFromParams(subRequest.params));
15
+ }
16
+ return headers;
17
+ }
18
+ function extractHeadersFromParams(params) {
19
+ if (!params || params.length === 0) throw new RpcError({
20
+ type: "missing-headers-param",
21
+ publicMessage: "HeadersMiddleware requires a HeadersSubset parameter."
22
+ });
23
+ const firstParam = params[0];
24
+ if (firstParam instanceof HeadersSubset || firstParam && typeof firstParam == "object" && "headers" in firstParam && typeof firstParam.headers == "object") return firstParam.headers;
25
+ throw new RpcError({
26
+ type: "invalid-headers-param",
27
+ publicMessage: "HeadersMiddleware first parameter must be a HeadersSubset instance or object with headers property."
28
+ });
29
+ }
30
+ function reconstructHeadersSubsetFromResponse(methodId, responseHeaders) {
31
+ const method = getMethod(methodId);
32
+ if (!method?.headersReturn?.headerNames || method.headersReturn.headerNames.length === 0) return;
33
+ const headerNames = method.headersReturn.headerNames, headersMap = {};
34
+ for (const name of headerNames) {
35
+ const value = responseHeaders.get(name);
36
+ value != null && (headersMap[name] = value);
37
+ }
38
+ if (Object.keys(headersMap).length > 0) return trustedHeadersSubset(headersMap);
39
+ }
40
+ export {
41
+ extractRequestHeaders,
42
+ hasHeadersSubsetParam,
43
+ headersToRecord,
44
+ reconstructHeadersSubsetFromResponse
45
+ };
46
+
47
+ //# sourceMappingURL=headers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.js","names":[],"sources":["../../../../src/lib/headers.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\nimport {HandlerType, HeadersSubset, RpcError, trustedHeadersSubset} from '@mionjs/core';\nimport {getMethod} from './methods.ts';\nimport type {CallContext} from '../types.ts';\n\n/** True when a subrequest's first param travels as HTTP headers rather than in the body; with no\n * cached metadata yet (a route's FIRST optimistic call) the value itself answers. */\nexport function hasHeadersSubsetParam(id: string, params: any[] | undefined): boolean {\n const method = getMethod(id);\n if (method) return method.type === HandlerType.headersMiddleware && !!method.headersParam;\n return params?.[0] instanceof HeadersSubset;\n}\n\n/** Spreading a `HeadersInit` only works for the plain-object form: a `Headers` instance has no own\n * enumerable properties and the `[name, value][]` form spreads as numeric indices. Internal, never exported. */\nexport function headersToRecord(headers: HeadersInit | undefined): Record<string, string> {\n if (!headers) return {};\n if (typeof Headers !== 'undefined' && headers instanceof Headers) return Object.fromEntries(headers.entries());\n // Any iterable of pairs (the `[name, value][]` form, a Map): spreading gives numeric indices, not headers.\n if (typeof (headers as Iterable<readonly [string, string]>)[Symbol.iterator] === 'function') {\n return Object.fromEntries(headers as Iterable<readonly [string, string]>);\n }\n return {...(headers as Record<string, string>)};\n}\n\nexport function extractRequestHeaders(context: CallContext): Record<string, string> {\n const headers: Record<string, string> = {};\n const subRequestIds = Object.keys(context.subRequestList);\n\n for (let i = 0; i < subRequestIds.length; i++) {\n const id = subRequestIds[i];\n const subRequest = context.subRequestList[id];\n if (!subRequest || !hasHeadersSubsetParam(id, subRequest.params)) continue;\n Object.assign(headers, extractHeadersFromParams(subRequest.params));\n }\n\n return headers;\n}\n\nfunction extractHeadersFromParams(params: any[]): Record<string, string> {\n if (!params || params.length === 0) {\n throw new RpcError({\n type: 'missing-headers-param',\n publicMessage: 'HeadersMiddleware requires a HeadersSubset parameter.',\n });\n }\n\n const firstParam = params[0];\n\n if (firstParam instanceof HeadersSubset) {\n return firstParam.headers as Record<string, string>;\n }\n\n if (firstParam && typeof firstParam === 'object' && 'headers' in firstParam && typeof firstParam.headers === 'object') {\n return firstParam.headers as Record<string, string>;\n }\n\n throw new RpcError({\n type: 'invalid-headers-param',\n publicMessage: 'HeadersMiddleware first parameter must be a HeadersSubset instance or object with headers property.',\n });\n}\n\nexport function reconstructHeadersSubsetFromResponse(\n methodId: string,\n responseHeaders: Headers\n): HeadersSubset<string, string> | undefined {\n const method = getMethod(methodId);\n\n if (!method?.headersReturn?.headerNames || method.headersReturn.headerNames.length === 0) {\n return undefined;\n }\n\n const headerNames = method.headersReturn.headerNames;\n const headersMap: Record<string, string> = {};\n\n for (const name of headerNames) {\n const value = responseHeaders.get(name);\n if (value !== undefined && value !== null) {\n headersMap[name] = value;\n }\n }\n\n if (Object.keys(headersMap).length > 0) {\n return trustedHeadersSubset(headersMap);\n }\n\n return undefined;\n}\n"],"mappings":";;AAaA,SAAgB,sBAAsB,IAAY,QAAoC;AACpF,QAAM,SAAS,UAAU,EAAE;AAC3B,SAAI,SAAe,OAAO,SAAS,YAAY,qBAAqB,CAAC,CAAC,OAAO,eACtE,SAAS,CAAA,aAAc;AAChC;AAIA,SAAgB,gBAAgB,SAA0D;AACxF,SAAK,UACD,OAAO,UAAY,OAAe,mBAAmB,UAAgB,OAAO,YAAY,QAAQ,QAAQ,CAAC,IAEzG,OAAQ,QAAgD,OAAO,QAAA,KAAc,aACxE,OAAO,YAAY,OAA8C,IAEnE,EAAC,GAAI,QAAkC,IANzB,CAAC;AAOxB;AAEA,SAAgB,sBAAsB,SAA8C;AAClF,QAAM,UAAkC,CAAC,GACnC,gBAAgB,OAAO,KAAK,QAAQ,cAAc;AAExD,WAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,UAAM,KAAK,cAAc,CAAA,GACnB,aAAa,QAAQ,eAAe,EAAA;AAC1C,IAAI,CAAC,cAAc,CAAC,sBAAsB,IAAI,WAAW,MAAM,KAC/D,OAAO,OAAO,SAAS,yBAAyB,WAAW,MAAM,CAAC;AAAA,EACpE;AAEA,SAAO;AACT;AAEA,SAAS,yBAAyB,QAAuC;AACvE,MAAI,CAAC,UAAU,OAAO,WAAW,EAC/B,OAAM,IAAI,SAAS;AAAA,IACjB,MAAM;AAAA,IACN,eAAe;AAAA,EACjB,CAAC;AAGH,QAAM,aAAa,OAAO,CAAA;AAM1B,MAJI,sBAAsB,iBAItB,cAAc,OAAO,cAAe,YAAY,aAAa,cAAc,OAAO,WAAW,WAAY,SAC3G,QAAO,WAAW;AAGpB,QAAM,IAAI,SAAS;AAAA,IACjB,MAAM;AAAA,IACN,eAAe;AAAA,EACjB,CAAC;AACH;AAEA,SAAgB,qCACd,UACA,iBAC2C;AAC3C,QAAM,SAAS,UAAU,QAAQ;AAEjC,MAAI,CAAC,QAAQ,eAAe,eAAe,OAAO,cAAc,YAAY,WAAW,EACrF;AAGF,QAAM,cAAc,OAAO,cAAc,aACnC,aAAqC,CAAC;AAE5C,aAAW,QAAQ,aAAa;AAC9B,UAAM,QAAQ,gBAAgB,IAAI,IAAI;AACtC,IAA2B,SAAU,SACnC,WAAW,IAAA,IAAQ;AAAA,EAEvB;AAEA,MAAI,OAAO,KAAK,UAAU,EAAE,SAAS,EACnC,QAAO,qBAAqB,UAAU;AAI1C"}
@@ -0,0 +1,9 @@
1
+ import { CompiledFnData, MethodWithOptions, PureFunctionData } from '@mionjs/core';
2
+ import { MetadataRecordKey } from './storage.ts';
3
+ export interface CacheGraph {
4
+ methods: Record<string, MethodWithOptions>;
5
+ deps: Record<string, CompiledFnData>;
6
+ pureFns: Record<string, PureFunctionData>;
7
+ }
8
+ export declare function findOrphans(graph: CacheGraph): MetadataRecordKey[];
9
+ //# sourceMappingURL=metadataEviction.d.ts.map
@@ -0,0 +1,33 @@
1
+ import { DEFAULT_PARSER, EMPTY_HASH, getJitFnHashes } from "@mionjs/core";
2
+ function methodRootHashes(metadata) {
3
+ const parser = metadata.options?.parser ?? DEFAULT_PARSER, roots = [], addSet = (jitHash, strategy) => {
4
+ if (!(!jitHash || jitHash === EMPTY_HASH))
5
+ for (const hash of Object.values(getJitFnHashes(jitHash, strategy))) typeof hash == "string" && roots.push(hash);
6
+ };
7
+ return addSet(metadata.paramsJitHash, parser.params), addSet(metadata.returnJitHash, parser.return), metadata.headersParam && addSet(metadata.headersParam.jitHash, "mutate"), metadata.headersReturn && addSet(metadata.headersReturn.jitHash, "mutate"), roots;
8
+ }
9
+ function findOrphans(graph) {
10
+ const reachedDeps = /* @__PURE__ */ new Set(), reachedPureFns = /* @__PURE__ */ new Set(), pending = [];
11
+ for (const metadata of Object.values(graph.methods)) for (const hash of methodRootHashes(metadata)) graph.deps[hash] && !reachedDeps.has(hash) && (reachedDeps.add(hash), pending.push(hash));
12
+ const reachPureFn = (key) => {
13
+ if (!reachedPureFns.has(key)) {
14
+ reachedPureFns.add(key);
15
+ for (const nested of graph.pureFns[key]?.pureFnDependencies ?? []) reachPureFn(nested);
16
+ }
17
+ };
18
+ for (; pending.length; ) {
19
+ const entry = graph.deps[pending.pop()];
20
+ for (const hash of entry?.rtDependencies ?? [])
21
+ !graph.deps[hash] || reachedDeps.has(hash) || (reachedDeps.add(hash), pending.push(hash));
22
+ for (const key of entry?.pureFnDependencies ?? []) reachPureFn(key);
23
+ }
24
+ const orphans = [];
25
+ for (const hash of Object.keys(graph.deps)) reachedDeps.has(hash) || orphans.push(["j", hash]);
26
+ for (const key of Object.keys(graph.pureFns)) reachedPureFns.has(key) || orphans.push(["p", key]);
27
+ return orphans;
28
+ }
29
+ export {
30
+ findOrphans
31
+ };
32
+
33
+ //# sourceMappingURL=metadataEviction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadataEviction.js","names":[],"sources":["../../../../src/lib/metadataEviction.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\nimport {DEFAULT_PARSER, EMPTY_HASH, getJitFnHashes} from '@mionjs/core';\nimport type {CompiledFnData, MethodWithOptions, PureFunctionData} from '@mionjs/core';\nimport type {MetadataRecordKey} from './storage.ts';\n\n/** The stored cache as one graph: methods point at compiled functions by hash, and those point at\n * each other. Everything already parsed by the hydrator, so the sweep costs no extra reads. */\nexport interface CacheGraph {\n /** by methodId */\n methods: Record<string, MethodWithOptions>;\n /** by compiled function hash */\n deps: Record<string, CompiledFnData>;\n /** by `${namespace}::${fnName}` */\n pureFns: Record<string, PureFunctionData>;\n}\n\n/** Every compiled function hash the method itself names, across both wires and both header sets. */\nfunction methodRootHashes(metadata: MethodWithOptions): string[] {\n const parser = metadata.options?.parser ?? DEFAULT_PARSER;\n const roots: string[] = [];\n // a root is anything the method COULD reach; a hash it never uses is simply absent from the store\n const addSet = (jitHash: string, strategy: Parameters<typeof getJitFnHashes>[1]) => {\n if (!jitHash || jitHash === EMPTY_HASH) return;\n // the optional hashes are absent on the returned shape, so only the real strings become roots\n for (const hash of Object.values(getJitFnHashes(jitHash, strategy)) as (string | undefined)[]) {\n if (typeof hash === 'string') roots.push(hash);\n }\n };\n addSet(metadata.paramsJitHash, parser.params);\n addSet(metadata.returnJitHash, parser.return);\n if (metadata.headersParam) addSet(metadata.headersParam.jitHash, 'mutate');\n if (metadata.headersReturn) addSet(metadata.headersReturn.jitHash, 'mutate');\n return roots;\n}\n\n/** The compiled functions no stored method can reach any more. Hashes are content addresses, so an entry is\n * never stale, only unreachable: a deploy rewrites a method's row and leaves the old hashes behind. */\nexport function findOrphans(graph: CacheGraph): MetadataRecordKey[] {\n const reachedDeps = new Set<string>();\n const reachedPureFns = new Set<string>();\n const pending: string[] = [];\n\n for (const metadata of Object.values(graph.methods)) {\n for (const hash of methodRootHashes(metadata)) {\n if (graph.deps[hash] && !reachedDeps.has(hash)) {\n reachedDeps.add(hash);\n pending.push(hash);\n }\n }\n }\n\n const reachPureFn = (key: string) => {\n if (reachedPureFns.has(key)) return;\n reachedPureFns.add(key);\n for (const nested of graph.pureFns[key]?.pureFnDependencies ?? []) reachPureFn(nested);\n };\n\n while (pending.length) {\n const entry = graph.deps[pending.pop() as string];\n for (const hash of entry?.rtDependencies ?? []) {\n if (!graph.deps[hash] || reachedDeps.has(hash)) continue;\n reachedDeps.add(hash);\n pending.push(hash);\n }\n for (const key of entry?.pureFnDependencies ?? []) reachPureFn(key);\n }\n\n const orphans: MetadataRecordKey[] = [];\n for (const hash of Object.keys(graph.deps)) if (!reachedDeps.has(hash)) orphans.push(['j', hash]);\n for (const key of Object.keys(graph.pureFns)) if (!reachedPureFns.has(key)) orphans.push(['p', key]);\n return orphans;\n}\n"],"mappings":";AAuBA,SAAS,iBAAiB,UAAuC;AAC/D,QAAM,SAAS,SAAS,SAAS,UAAU,gBACrC,QAAkB,CAAC,GAEnB,SAAA,CAAU,SAAiB,aAAmD;AAClF,QAAI,GAAC,WAAW,YAAY;AAE5B,iBAAW,QAAQ,OAAO,OAAO,eAAe,SAAS,QAAQ,CAAC,EAChE,CAAI,OAAO,QAAS,YAAU,MAAM,KAAK,IAAI;AAAA,EAEjD;AACA,gBAAO,SAAS,eAAe,OAAO,MAAM,GAC5C,OAAO,SAAS,eAAe,OAAO,MAAM,GACxC,SAAS,gBAAc,OAAO,SAAS,aAAa,SAAS,QAAQ,GACrE,SAAS,iBAAe,OAAO,SAAS,cAAc,SAAS,QAAQ,GACpE;AACT;AAIA,SAAgB,YAAY,OAAwC;AAClE,QAAM,cAAc,oBAAI,IAAY,GAC9B,iBAAiB,oBAAI,IAAY,GACjC,UAAoB,CAAC;AAE3B,aAAW,YAAY,OAAO,OAAO,MAAM,OAAO,EAChD,YAAW,QAAQ,iBAAiB,QAAQ,EAC1C,CAAI,MAAM,KAAK,IAAA,KAAS,CAAC,YAAY,IAAI,IAAI,MAC3C,YAAY,IAAI,IAAI,GACpB,QAAQ,KAAK,IAAI;AAKvB,QAAM,cAAA,CAAe,QAAgB;AACnC,QAAI,gBAAe,IAAI,GAAG,GAC1B;AAAA,qBAAe,IAAI,GAAG;AACtB,iBAAW,UAAU,MAAM,QAAQ,GAAA,GAAM,sBAAsB,CAAC,EAAG,aAAY,MAAM;AAAA;AAAA,EACvF;AAEA,SAAO,QAAQ,UAAQ;AACrB,UAAM,QAAQ,MAAM,KAAK,QAAQ,IAAI,CAAA;AACrC,eAAW,QAAQ,OAAO,kBAAkB,CAAC;AAC3C,MAAI,CAAC,MAAM,KAAK,IAAA,KAAS,YAAY,IAAI,IAAI,MAC7C,YAAY,IAAI,IAAI,GACpB,QAAQ,KAAK,IAAI;AAEnB,eAAW,OAAO,OAAO,sBAAsB,CAAC,EAAG,aAAY,GAAG;AAAA,EACpE;AAEA,QAAM,UAA+B,CAAC;AACtC,aAAW,QAAQ,OAAO,KAAK,MAAM,IAAI,EAAG,CAAK,YAAY,IAAI,IAAI,KAAG,QAAQ,KAAK,CAAC,KAAK,IAAI,CAAC;AAChG,aAAW,OAAO,OAAO,KAAK,MAAM,OAAO,EAAG,CAAK,eAAe,IAAI,GAAG,KAAG,QAAQ,KAAK,CAAC,KAAK,GAAG,CAAC;AACnG,SAAO;AACT"}
@@ -0,0 +1,29 @@
1
+ import { RpcError } from '@mionjs/core';
2
+ import { ClientCallContext, ClientOptions, RequestErrors } from '../types.ts';
3
+ import { HandlersRegistry } from './handlersRegistry.ts';
4
+ export interface MetadataFetcher {
5
+ fetchRows(ids: string[], routePointer: string[], options: ClientOptions, signal?: AbortSignal): Promise<void>;
6
+ startCall(context: ClientCallContext): MetadataCall;
7
+ }
8
+ export interface MetadataCall {
9
+ readonly id: string;
10
+ prepare(skipOptimistic: boolean): Promise<{
11
+ ids: string[];
12
+ optimistic: boolean;
13
+ }>;
14
+ askRows(): void;
15
+ fetchRows(ids: string[], signal?: AbortSignal): Promise<void>;
16
+ readRows(parsedBody: Record<string, unknown>): Record<string, RpcError<string>> | undefined;
17
+ shouldResend(errors: RequestErrors): Promise<boolean>;
18
+ takeError(): RpcError<string> | undefined;
19
+ }
20
+ export declare const MIDDLEWARE_TARGET: unique symbol;
21
+ export interface MiddlewareTarget {
22
+ id: string;
23
+ registry: HandlersRegistry;
24
+ }
25
+ export declare function middlewareTargetOf(middleware: object): MiddlewareTarget;
26
+ export declare function setMetadataFetcher(registry: HandlersRegistry, fetcher: MetadataFetcher): void;
27
+ export declare function getMetadataFetcher(registry: HandlersRegistry | undefined): MetadataFetcher | undefined;
28
+ export declare function metadataFetcherOf(middleware: object): MetadataFetcher | undefined;
29
+ //# sourceMappingURL=metadataFetcher.d.ts.map
@@ -0,0 +1,24 @@
1
+ var MIDDLEWARE_TARGET = /* @__PURE__ */ Symbol("mion.middlewareTarget"), fetchers = /* @__PURE__ */ new WeakMap(), readTarget = (middleware) => middleware[MIDDLEWARE_TARGET];
2
+ function middlewareTargetOf(middleware) {
3
+ const target = readTarget(middleware);
4
+ if (!target) throw new Error("Expected a middleware from the client, like middlewares.mionFetchMetadata");
5
+ return target;
6
+ }
7
+ function setMetadataFetcher(registry, fetcher) {
8
+ fetchers.set(registry, fetcher);
9
+ }
10
+ function getMetadataFetcher(registry) {
11
+ return registry && fetchers.get(registry);
12
+ }
13
+ function metadataFetcherOf(middleware) {
14
+ return getMetadataFetcher(readTarget(middleware)?.registry);
15
+ }
16
+ export {
17
+ MIDDLEWARE_TARGET,
18
+ getMetadataFetcher,
19
+ metadataFetcherOf,
20
+ middlewareTargetOf,
21
+ setMetadataFetcher
22
+ };
23
+
24
+ //# sourceMappingURL=metadataFetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadataFetcher.js","names":[],"sources":["../../../../src/lib/metadataFetcher.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// Internal hooks between the dispatch and `useFetchMetadata`. Never exported from the package: the public\n// middleware type stays hooks only, and a client that never sets metadata fetching up ships none of it.\n\nimport type {RpcError} from '@mionjs/core';\nimport type {ClientCallContext, ClientOptions, RequestErrors} from '../types.ts';\nimport type {HandlersRegistry} from './handlersRegistry.ts';\n\n/** What `useFetchMetadata` hands the dispatch, once per client. */\nexport interface MetadataFetcher {\n /** Rows for the given ids without running any route; route sync refetches through it. */\n fetchRows(ids: string[], routePointer: string[], options: ClientOptions, signal?: AbortSignal): Promise<void>;\n startCall(context: ClientCallContext): MetadataCall;\n}\n\n/** One call's metadata state, driven by the dispatch attempt by attempt. */\nexport interface MetadataCall {\n /** the metadata middleware's id: the rows a call asks for ride the request under it */\n readonly id: string;\n /** Before the chain is read. `ids` omits its own entry; `optimistic`: sent before rows are known, in plain wire forms. */\n prepare(skipOptimistic: boolean): Promise<{ids: string[]; optimistic: boolean}>;\n /** Optimistic attempt: asks the server for the rows of every id in the call. */\n askRows(): void;\n /** Rows for the given ids without running any route: `typeErrors()`, a body that cannot go out plain. */\n fetchRows(ids: string[], signal?: AbortSignal): Promise<void>;\n /** Takes this call's rows out of the raw body before anything is decoded; returns a refusal to put back. */\n readRows(parsedBody: Record<string, unknown>): Record<string, RpcError<string>> | undefined;\n /** After a failed attempt: true when a resend with fresh rows can fix it. Called at most once per call. */\n shouldResend(errors: RequestErrors): Promise<boolean>;\n /** a store write the browser refused, reported once in a later call's @thrownErrors */\n takeError(): RpcError<string> | undefined;\n}\n\n/** A middleware's client and id, read off `middlewares.<name>` through a key no public type names. */\nexport const MIDDLEWARE_TARGET = Symbol('mion.middlewareTarget');\n\nexport interface MiddlewareTarget {\n id: string;\n registry: HandlersRegistry;\n}\n\nconst fetchers = new WeakMap<HandlersRegistry, MetadataFetcher>();\n\nconst readTarget = (middleware: object) => (middleware as {[MIDDLEWARE_TARGET]?: MiddlewareTarget})[MIDDLEWARE_TARGET];\n\nexport function middlewareTargetOf(middleware: object): MiddlewareTarget {\n const target = readTarget(middleware);\n if (!target) throw new Error('Expected a middleware from the client, like middlewares.mionFetchMetadata');\n return target;\n}\n\nexport function setMetadataFetcher(registry: HandlersRegistry, fetcher: MetadataFetcher): void {\n fetchers.set(registry, fetcher);\n}\n\nexport function getMetadataFetcher(registry: HandlersRegistry | undefined): MetadataFetcher | undefined {\n return registry && fetchers.get(registry);\n}\n\n/** The fetcher of the client a middleware belongs to, if it set one up; route sync refetches through it. */\nexport function metadataFetcherOf(middleware: object): MetadataFetcher | undefined {\n return getMetadataFetcher(readTarget(middleware)?.registry);\n}\n"],"mappings":"AAwCA,IAAa,oBAAoB,uBAAO,uBAAuB,GAOzD,WAAW,oBAAI,QAA2C,GAE1D,aAAA,CAAc,eAAwB,WAAwD,iBAAA;AAEpG,SAAgB,mBAAmB,YAAsC;AACvE,QAAM,SAAS,WAAW,UAAU;AACpC,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,2EAA2E;AACxG,SAAO;AACT;AAEA,SAAgB,mBAAmB,UAA4B,SAAgC;AAC7F,WAAS,IAAI,UAAU,OAAO;AAChC;AAEA,SAAgB,mBAAmB,UAAqE;AACtG,SAAO,YAAY,SAAS,IAAI,QAAQ;AAC1C;AAGA,SAAgB,kBAAkB,YAAiD;AACjF,SAAO,mBAAmB,WAAW,UAAU,GAAG,QAAQ;AAC5D"}
@@ -0,0 +1,4 @@
1
+ export { forgetFetchedMetadata, hydrateMetadataCache, installMethodRows, purgeHydratedMetadata, takeMetadataCacheError, wasHydratedFromCache, } from './clientMethodsMetadata.ts';
2
+ export { fetchRemoteMethodsMetadata } from './fetchRemoteMethodsMetadata.ts';
3
+ export { unverifiedIds, verifyMethodRows } from './apiVersionRecovery.ts';
4
+ //# sourceMappingURL=metadataFromServer.d.ts.map
@@ -0,0 +1,15 @@
1
+ import { forgetFetchedMetadata, hydrateMetadataCache, installMethodRows, purgeHydratedMetadata, takeMetadataCacheError, wasHydratedFromCache } from "./clientMethodsMetadata.js";
2
+ import { fetchRemoteMethodsMetadata } from "./fetchRemoteMethodsMetadata.js";
3
+ import { unverifiedIds, verifyMethodRows } from "./apiVersionRecovery.js";
4
+ import "@mionjs/run-types/formats";
5
+ export {
6
+ fetchRemoteMethodsMetadata,
7
+ forgetFetchedMetadata,
8
+ hydrateMetadataCache,
9
+ installMethodRows,
10
+ purgeHydratedMetadata,
11
+ takeMetadataCacheError,
12
+ unverifiedIds,
13
+ verifyMethodRows,
14
+ wasHydratedFromCache
15
+ };
@@ -0,0 +1,6 @@
1
+ type MetadataFromServer = typeof import('./metadataFromServer.ts');
2
+ export declare function loadMetadataFromServer(): Promise<MetadataFromServer>;
3
+ export declare function loadedMetadataFromServer(): MetadataFromServer | undefined;
4
+ export declare function resetMetadataFromServer(): void;
5
+ export {};
6
+ //# sourceMappingURL=metadataFromServerLoader.d.ts.map
@@ -0,0 +1,27 @@
1
+ import { RpcError } from "@mionjs/core";
2
+ var laneModule, loading;
3
+ function loadMetadataFromServer() {
4
+ return laneModule ? Promise.resolve(laneModule) : (loading ??= import("#metadata-from-server").then((loaded) => (laneModule = loaded, loaded)).catch((error) => {
5
+ throw loading = void 0, laneLoadError(error);
6
+ }), loading);
7
+ }
8
+ function loadedMetadataFromServer() {
9
+ return laneModule;
10
+ }
11
+ function resetMetadataFromServer() {
12
+ laneModule = void 0, loading = void 0;
13
+ }
14
+ function laneLoadError(error) {
15
+ return new RpcError({
16
+ type: "metadata-load-error",
17
+ publicMessage: "Could not load the code that asks the server how a route works. Build with client routes bundled to ship every route the client calls, or check that the app can load its own chunks.",
18
+ originalError: error instanceof Error ? error : void 0
19
+ });
20
+ }
21
+ export {
22
+ loadMetadataFromServer,
23
+ loadedMetadataFromServer,
24
+ resetMetadataFromServer
25
+ };
26
+
27
+ //# sourceMappingURL=metadataFromServerLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadataFromServerLoader.js","names":[],"sources":["../../../../src/lib/metadataFromServerLoader.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\nimport {RpcError} from '@mionjs/core';\n\n// Reaches the lane through `#metadata-from-server`, an @mionjs/client `imports` entry no consumer alias can collide with.\n\ntype MetadataFromServer = typeof import('./metadataFromServer.ts');\n\nlet laneModule: MetadataFromServer | undefined;\nlet loading: Promise<MetadataFromServer> | undefined;\n\n/** Awaited inside the request's own try, so a failed load reaches @thrownErrors; it is forgotten for a retry. */\nexport function loadMetadataFromServer(): Promise<MetadataFromServer> {\n if (laneModule) return Promise.resolve(laneModule);\n loading ??= (import('#metadata-from-server') as Promise<MetadataFromServer>)\n .then((loaded) => {\n laneModule = loaded;\n return loaded;\n })\n .catch((error) => {\n loading = undefined;\n throw laneLoadError(error);\n });\n return loading;\n}\n\n/** The lane if a call already loaded it, never loading it. */\nexport function loadedMetadataFromServer(): MetadataFromServer | undefined {\n return laneModule;\n}\n\n/** Forgets the loaded lane. Tests only: simulates a process that never reached it. */\nexport function resetMetadataFromServer(): void {\n laneModule = undefined;\n loading = undefined;\n}\n\nfunction laneLoadError(error: unknown): RpcError<'metadata-load-error'> {\n return new RpcError({\n type: 'metadata-load-error',\n publicMessage:\n 'Could not load the code that asks the server how a route works. Build with client routes bundled to ship every route the client calls, or check that the app can load its own chunks.',\n originalError: error instanceof Error ? error : undefined,\n });\n}\n"],"mappings":";AAaA,IAAI,YACA;AAGJ,SAAgB,yBAAsD;AACpE,SAAI,aAAmB,QAAQ,QAAQ,UAAU,KACjD,YAAa,OAAO,uBAAA,EACjB,KAAA,CAAM,YACL,aAAa,QACN,OACR,EACA,MAAA,CAAO,UAAU;AAChB,oBAAU,QACJ,cAAc,KAAK;AAAA,EAC3B,CAAC,GACI;AACT;AAGA,SAAgB,2BAA2D;AACzE,SAAO;AACT;AAGA,SAAgB,0BAAgC;AAC9C,eAAa,QACb,UAAU;AACZ;AAEA,SAAS,cAAc,OAAiD;AACtE,SAAO,IAAI,SAAS;AAAA,IAClB,MAAM;AAAA,IACN,eACE;AAAA,IACF,eAAe,iBAAiB,QAAQ,QAAQ;AAAA,EAClD,CAAC;AACH"}
@@ -0,0 +1,23 @@
1
+ import { MetadataRecord, MetadataRecordKey, MetadataStore, StorageEngine } from './storage.ts';
2
+ export declare class MemoryMetadataStore implements MetadataStore {
3
+ readonly kind: "memory";
4
+ private readonly records;
5
+ readAll(baseURL: string): Promise<MetadataRecord[]>;
6
+ write(records: MetadataRecord[]): Promise<void>;
7
+ remove(baseURL: string, keys: MetadataRecordKey[]): Promise<void>;
8
+ clear(baseURL?: string): Promise<void>;
9
+ }
10
+ export declare class IdbMetadataStore implements MetadataStore {
11
+ private readonly db;
12
+ readonly kind: "indexeddb";
13
+ constructor(db: IDBDatabase);
14
+ readAll(baseURL: string): Promise<MetadataRecord[]>;
15
+ write(records: MetadataRecord[]): Promise<void>;
16
+ remove(baseURL: string, keys: MetadataRecordKey[]): Promise<void>;
17
+ clear(baseURL?: string): Promise<void>;
18
+ private transact;
19
+ }
20
+ export declare function getMetadataStore(engine?: StorageEngine): Promise<MetadataStore>;
21
+ export declare function setMetadataStoreForTesting(store: MetadataStore): void;
22
+ export declare function resetMetadataStore(): Promise<void>;
23
+ //# sourceMappingURL=metadataStore.d.ts.map