@procedures/client 0.0.0-stage → 0.2.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 (777) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/LICENSE +21 -0
  3. package/README.md +832 -2
  4. package/dist/.tsbuildinfo +1 -0
  5. package/dist/adapters/http/client/index.d.ts +11 -0
  6. package/dist/adapters/http/client/index.d.ts.map +1 -0
  7. package/dist/adapters/http/client/index.js +18 -0
  8. package/dist/adapters/http/client/index.js.map +1 -0
  9. package/dist/adapters/http/client/transport.d.ts +72 -0
  10. package/dist/adapters/http/client/transport.d.ts.map +1 -0
  11. package/dist/adapters/http/client/transport.js +282 -0
  12. package/dist/adapters/http/client/transport.js.map +1 -0
  13. package/dist/adapters/http/client/types.d.ts +27 -0
  14. package/dist/adapters/http/client/types.d.ts.map +1 -0
  15. package/dist/adapters/http/client/types.js +8 -0
  16. package/dist/adapters/http/client/types.js.map +1 -0
  17. package/dist/adapters/http/index.d.ts +7 -0
  18. package/dist/adapters/http/index.d.ts.map +1 -0
  19. package/dist/adapters/http/index.js +7 -0
  20. package/dist/adapters/http/index.js.map +1 -0
  21. package/dist/adapters/http/server/index.d.ts +9 -0
  22. package/dist/adapters/http/server/index.d.ts.map +1 -0
  23. package/dist/adapters/http/server/index.js +10 -0
  24. package/dist/adapters/http/server/index.js.map +1 -0
  25. package/dist/adapters/http/server/strategies.d.ts +39 -0
  26. package/dist/adapters/http/server/strategies.d.ts.map +1 -0
  27. package/dist/adapters/http/server/strategies.js +90 -0
  28. package/dist/adapters/http/server/strategies.js.map +1 -0
  29. package/dist/adapters/http/server/transport.d.ts +66 -0
  30. package/dist/adapters/http/server/transport.d.ts.map +1 -0
  31. package/dist/adapters/http/server/transport.js +562 -0
  32. package/dist/adapters/http/server/transport.js.map +1 -0
  33. package/dist/adapters/http/server/types.d.ts +71 -0
  34. package/dist/adapters/http/server/types.d.ts.map +1 -0
  35. package/dist/adapters/http/server/types.js +7 -0
  36. package/dist/adapters/http/server/types.js.map +1 -0
  37. package/dist/adapters/http/shared/constants.d.ts +95 -0
  38. package/dist/adapters/http/shared/constants.d.ts.map +1 -0
  39. package/dist/adapters/http/shared/constants.js +102 -0
  40. package/dist/adapters/http/shared/constants.js.map +1 -0
  41. package/dist/adapters/http/shared/errors.d.ts +78 -0
  42. package/dist/adapters/http/shared/errors.d.ts.map +1 -0
  43. package/dist/adapters/http/shared/errors.js +151 -0
  44. package/dist/adapters/http/shared/errors.js.map +1 -0
  45. package/dist/adapters/http/shared/headers.d.ts +122 -0
  46. package/dist/adapters/http/shared/headers.d.ts.map +1 -0
  47. package/dist/adapters/http/shared/headers.js +216 -0
  48. package/dist/adapters/http/shared/headers.js.map +1 -0
  49. package/dist/adapters/http/shared/index.d.ts +12 -0
  50. package/dist/adapters/http/shared/index.d.ts.map +1 -0
  51. package/dist/adapters/http/shared/index.js +17 -0
  52. package/dist/adapters/http/shared/index.js.map +1 -0
  53. package/dist/adapters/http/shared/status-codes.d.ts +92 -0
  54. package/dist/adapters/http/shared/status-codes.d.ts.map +1 -0
  55. package/dist/adapters/http/shared/status-codes.js +189 -0
  56. package/dist/adapters/http/shared/status-codes.js.map +1 -0
  57. package/dist/adapters/http/shared/strategies.d.ts +90 -0
  58. package/dist/adapters/http/shared/strategies.d.ts.map +1 -0
  59. package/dist/adapters/http/shared/strategies.js +180 -0
  60. package/dist/adapters/http/shared/strategies.js.map +1 -0
  61. package/dist/adapters/local/client/index.d.ts +8 -0
  62. package/dist/adapters/local/client/index.d.ts.map +1 -0
  63. package/dist/adapters/local/client/index.js +8 -0
  64. package/dist/adapters/local/client/index.js.map +1 -0
  65. package/dist/adapters/local/client/transport.d.ts +81 -0
  66. package/dist/adapters/local/client/transport.d.ts.map +1 -0
  67. package/dist/adapters/local/client/transport.js +172 -0
  68. package/dist/adapters/local/client/transport.js.map +1 -0
  69. package/dist/adapters/local/client/types.d.ts +39 -0
  70. package/dist/adapters/local/client/types.d.ts.map +1 -0
  71. package/dist/adapters/local/client/types.js +13 -0
  72. package/dist/adapters/local/client/types.js.map +1 -0
  73. package/dist/adapters/metadata.d.ts +10 -0
  74. package/dist/adapters/metadata.d.ts.map +1 -0
  75. package/dist/adapters/metadata.js +19 -0
  76. package/dist/adapters/metadata.js.map +1 -0
  77. package/dist/adapters/mock/client/builder.d.ts +35 -0
  78. package/dist/adapters/mock/client/builder.d.ts.map +1 -0
  79. package/dist/adapters/mock/client/builder.js +58 -0
  80. package/dist/adapters/mock/client/builder.js.map +1 -0
  81. package/dist/adapters/mock/client/index.d.ts +9 -0
  82. package/dist/adapters/mock/client/index.d.ts.map +1 -0
  83. package/dist/adapters/mock/client/index.js +10 -0
  84. package/dist/adapters/mock/client/index.js.map +1 -0
  85. package/dist/adapters/mock/client/transport.d.ts +149 -0
  86. package/dist/adapters/mock/client/transport.d.ts.map +1 -0
  87. package/dist/adapters/mock/client/transport.js +289 -0
  88. package/dist/adapters/mock/client/transport.js.map +1 -0
  89. package/dist/adapters/mock/client/types.d.ts +86 -0
  90. package/dist/adapters/mock/client/types.d.ts.map +1 -0
  91. package/dist/adapters/mock/client/types.js +7 -0
  92. package/dist/adapters/mock/client/types.js.map +1 -0
  93. package/dist/adapters/websocket/client/index.d.ts +9 -0
  94. package/dist/adapters/websocket/client/index.d.ts.map +1 -0
  95. package/dist/adapters/websocket/client/index.js +9 -0
  96. package/dist/adapters/websocket/client/index.js.map +1 -0
  97. package/dist/adapters/websocket/client/transport.d.ts +106 -0
  98. package/dist/adapters/websocket/client/transport.d.ts.map +1 -0
  99. package/dist/adapters/websocket/client/transport.js +647 -0
  100. package/dist/adapters/websocket/client/transport.js.map +1 -0
  101. package/dist/adapters/websocket/client/types.d.ts +192 -0
  102. package/dist/adapters/websocket/client/types.d.ts.map +1 -0
  103. package/dist/adapters/websocket/client/types.js +17 -0
  104. package/dist/adapters/websocket/client/types.js.map +1 -0
  105. package/dist/adapters/websocket/index.d.ts +8 -0
  106. package/dist/adapters/websocket/index.d.ts.map +1 -0
  107. package/dist/adapters/websocket/index.js +8 -0
  108. package/dist/adapters/websocket/index.js.map +1 -0
  109. package/dist/adapters/websocket/server/index.d.ts +8 -0
  110. package/dist/adapters/websocket/server/index.d.ts.map +1 -0
  111. package/dist/adapters/websocket/server/index.js +8 -0
  112. package/dist/adapters/websocket/server/index.js.map +1 -0
  113. package/dist/adapters/websocket/server/transport.d.ts +112 -0
  114. package/dist/adapters/websocket/server/transport.d.ts.map +1 -0
  115. package/dist/adapters/websocket/server/transport.js +619 -0
  116. package/dist/adapters/websocket/server/transport.js.map +1 -0
  117. package/dist/adapters/websocket/server/types.d.ts +140 -0
  118. package/dist/adapters/websocket/server/types.d.ts.map +1 -0
  119. package/dist/adapters/websocket/server/types.js +7 -0
  120. package/dist/adapters/websocket/server/types.js.map +1 -0
  121. package/dist/browser.d.ts +51 -0
  122. package/dist/browser.d.ts.map +1 -0
  123. package/dist/browser.js +89 -0
  124. package/dist/browser.js.map +1 -0
  125. package/dist/client/batch-executor.d.ts +160 -0
  126. package/dist/client/batch-executor.d.ts.map +1 -0
  127. package/dist/client/batch-executor.js +397 -0
  128. package/dist/client/batch-executor.js.map +1 -0
  129. package/dist/client/call-types.d.ts +271 -0
  130. package/dist/client/call-types.d.ts.map +1 -0
  131. package/dist/client/call-types.js +208 -0
  132. package/dist/client/call-types.js.map +1 -0
  133. package/dist/client/client.d.ts +525 -0
  134. package/dist/client/client.d.ts.map +1 -0
  135. package/dist/client/client.js +1011 -0
  136. package/dist/client/client.js.map +1 -0
  137. package/dist/client/consumption.d.ts +191 -0
  138. package/dist/client/consumption.d.ts.map +1 -0
  139. package/dist/client/consumption.js +98 -0
  140. package/dist/client/consumption.js.map +1 -0
  141. package/dist/client/context.d.ts +116 -0
  142. package/dist/client/context.d.ts.map +1 -0
  143. package/dist/client/context.js +111 -0
  144. package/dist/client/context.js.map +1 -0
  145. package/dist/client/errors/codes.d.ts +71 -0
  146. package/dist/client/errors/codes.d.ts.map +1 -0
  147. package/dist/client/errors/codes.js +81 -0
  148. package/dist/client/errors/codes.js.map +1 -0
  149. package/dist/client/errors/factory.d.ts +102 -0
  150. package/dist/client/errors/factory.d.ts.map +1 -0
  151. package/dist/client/errors/factory.js +210 -0
  152. package/dist/client/errors/factory.js.map +1 -0
  153. package/dist/client/errors/http-errors.d.ts +47 -0
  154. package/dist/client/errors/http-errors.d.ts.map +1 -0
  155. package/dist/client/errors/http-errors.js +548 -0
  156. package/dist/client/errors/http-errors.js.map +1 -0
  157. package/dist/client/errors/http-status.d.ts +73 -0
  158. package/dist/client/errors/http-status.d.ts.map +1 -0
  159. package/dist/client/errors/http-status.js +79 -0
  160. package/dist/client/errors/http-status.js.map +1 -0
  161. package/dist/client/errors/index.d.ts +36 -0
  162. package/dist/client/errors/index.d.ts.map +1 -0
  163. package/dist/client/errors/index.js +40 -0
  164. package/dist/client/errors/index.js.map +1 -0
  165. package/dist/client/errors/registry.d.ts +38 -0
  166. package/dist/client/errors/registry.d.ts.map +1 -0
  167. package/dist/client/errors/registry.js +535 -0
  168. package/dist/client/errors/registry.js.map +1 -0
  169. package/dist/client/errors/types.d.ts +112 -0
  170. package/dist/client/errors/types.d.ts.map +1 -0
  171. package/dist/client/errors/types.js +45 -0
  172. package/dist/client/errors/types.js.map +1 -0
  173. package/dist/client/index.d.ts +44 -0
  174. package/dist/client/index.d.ts.map +1 -0
  175. package/dist/client/index.js +36 -0
  176. package/dist/client/index.js.map +1 -0
  177. package/dist/client/middleware/auth.d.ts +90 -0
  178. package/dist/client/middleware/auth.d.ts.map +1 -0
  179. package/dist/client/middleware/auth.js +98 -0
  180. package/dist/client/middleware/auth.js.map +1 -0
  181. package/dist/client/middleware/batching.d.ts +102 -0
  182. package/dist/client/middleware/batching.d.ts.map +1 -0
  183. package/dist/client/middleware/batching.js +245 -0
  184. package/dist/client/middleware/batching.js.map +1 -0
  185. package/dist/client/middleware/cache.d.ts +124 -0
  186. package/dist/client/middleware/cache.d.ts.map +1 -0
  187. package/dist/client/middleware/cache.js +208 -0
  188. package/dist/client/middleware/cache.js.map +1 -0
  189. package/dist/client/middleware/circuit-breaker.d.ts +113 -0
  190. package/dist/client/middleware/circuit-breaker.d.ts.map +1 -0
  191. package/dist/client/middleware/circuit-breaker.js +236 -0
  192. package/dist/client/middleware/circuit-breaker.js.map +1 -0
  193. package/dist/client/middleware/contexts.d.ts +199 -0
  194. package/dist/client/middleware/contexts.d.ts.map +1 -0
  195. package/dist/client/middleware/contexts.js +74 -0
  196. package/dist/client/middleware/contexts.js.map +1 -0
  197. package/dist/client/middleware/items.d.ts +37 -0
  198. package/dist/client/middleware/items.d.ts.map +1 -0
  199. package/dist/client/middleware/items.js +100 -0
  200. package/dist/client/middleware/items.js.map +1 -0
  201. package/dist/client/middleware/lru.d.ts +32 -0
  202. package/dist/client/middleware/lru.d.ts.map +1 -0
  203. package/dist/client/middleware/lru.js +62 -0
  204. package/dist/client/middleware/lru.js.map +1 -0
  205. package/dist/client/middleware/pagination.d.ts +114 -0
  206. package/dist/client/middleware/pagination.d.ts.map +1 -0
  207. package/dist/client/middleware/pagination.js +148 -0
  208. package/dist/client/middleware/pagination.js.map +1 -0
  209. package/dist/client/middleware/rate-limit.d.ts +105 -0
  210. package/dist/client/middleware/rate-limit.d.ts.map +1 -0
  211. package/dist/client/middleware/rate-limit.js +222 -0
  212. package/dist/client/middleware/rate-limit.js.map +1 -0
  213. package/dist/client/middleware/retry.d.ts +100 -0
  214. package/dist/client/middleware/retry.d.ts.map +1 -0
  215. package/dist/client/middleware/retry.js +150 -0
  216. package/dist/client/middleware/retry.js.map +1 -0
  217. package/dist/client/middleware/timeout.d.ts +91 -0
  218. package/dist/client/middleware/timeout.d.ts.map +1 -0
  219. package/dist/client/middleware/timeout.js +253 -0
  220. package/dist/client/middleware/timeout.js.map +1 -0
  221. package/dist/client/middleware/tracing.d.ts +118 -0
  222. package/dist/client/middleware/tracing.d.ts.map +1 -0
  223. package/dist/client/middleware/tracing.js +152 -0
  224. package/dist/client/middleware/tracing.js.map +1 -0
  225. package/dist/client/route-resolver.d.ts +181 -0
  226. package/dist/client/route-resolver.d.ts.map +1 -0
  227. package/dist/client/route-resolver.js +300 -0
  228. package/dist/client/route-resolver.js.map +1 -0
  229. package/dist/client/typed-method.d.ts +29 -0
  230. package/dist/client/typed-method.d.ts.map +1 -0
  231. package/dist/client/typed-method.js +36 -0
  232. package/dist/client/typed-method.js.map +1 -0
  233. package/dist/client/typed.d.ts +102 -0
  234. package/dist/client/typed.d.ts.map +1 -0
  235. package/dist/client/typed.js +52 -0
  236. package/dist/client/typed.js.map +1 -0
  237. package/dist/client/types.d.ts +305 -0
  238. package/dist/client/types.d.ts.map +1 -0
  239. package/dist/client/types.js +26 -0
  240. package/dist/client/types.js.map +1 -0
  241. package/dist/client/validation/index.d.ts +34 -0
  242. package/dist/client/validation/index.d.ts.map +1 -0
  243. package/dist/client/validation/index.js +36 -0
  244. package/dist/client/validation/index.js.map +1 -0
  245. package/dist/client/validation/middleware.d.ts +82 -0
  246. package/dist/client/validation/middleware.d.ts.map +1 -0
  247. package/dist/client/validation/middleware.js +138 -0
  248. package/dist/client/validation/middleware.js.map +1 -0
  249. package/dist/client/validation/types.d.ts +118 -0
  250. package/dist/client/validation/types.d.ts.map +1 -0
  251. package/dist/client/validation/types.js +59 -0
  252. package/dist/client/validation/types.js.map +1 -0
  253. package/dist/collections/async/async-queue.d.ts +144 -0
  254. package/dist/collections/async/async-queue.d.ts.map +1 -0
  255. package/dist/collections/async/async-queue.js +347 -0
  256. package/dist/collections/async/async-queue.js.map +1 -0
  257. package/dist/collections/async/channels.d.ts +188 -0
  258. package/dist/collections/async/channels.d.ts.map +1 -0
  259. package/dist/collections/async/channels.js +312 -0
  260. package/dist/collections/async/channels.js.map +1 -0
  261. package/dist/collections/behaviors/bounded.d.ts +79 -0
  262. package/dist/collections/behaviors/bounded.d.ts.map +1 -0
  263. package/dist/collections/behaviors/bounded.js +384 -0
  264. package/dist/collections/behaviors/bounded.js.map +1 -0
  265. package/dist/collections/behaviors/evented.d.ts +154 -0
  266. package/dist/collections/behaviors/evented.d.ts.map +1 -0
  267. package/dist/collections/behaviors/evented.js +299 -0
  268. package/dist/collections/behaviors/evented.js.map +1 -0
  269. package/dist/collections/behaviors/lru.d.ts +84 -0
  270. package/dist/collections/behaviors/lru.d.ts.map +1 -0
  271. package/dist/collections/behaviors/lru.js +330 -0
  272. package/dist/collections/behaviors/lru.js.map +1 -0
  273. package/dist/collections/behaviors/readonly.d.ts +73 -0
  274. package/dist/collections/behaviors/readonly.d.ts.map +1 -0
  275. package/dist/collections/behaviors/readonly.js +158 -0
  276. package/dist/collections/behaviors/readonly.js.map +1 -0
  277. package/dist/collections/behaviors/safe.d.ts +163 -0
  278. package/dist/collections/behaviors/safe.d.ts.map +1 -0
  279. package/dist/collections/behaviors/safe.js +172 -0
  280. package/dist/collections/behaviors/safe.js.map +1 -0
  281. package/dist/collections/behaviors/synchronized.d.ts +88 -0
  282. package/dist/collections/behaviors/synchronized.d.ts.map +1 -0
  283. package/dist/collections/behaviors/synchronized.js +294 -0
  284. package/dist/collections/behaviors/synchronized.js.map +1 -0
  285. package/dist/collections/behaviors/ttl.d.ts +118 -0
  286. package/dist/collections/behaviors/ttl.d.ts.map +1 -0
  287. package/dist/collections/behaviors/ttl.js +338 -0
  288. package/dist/collections/behaviors/ttl.js.map +1 -0
  289. package/dist/collections/core/effects.d.ts +176 -0
  290. package/dist/collections/core/effects.d.ts.map +1 -0
  291. package/dist/collections/core/effects.js +180 -0
  292. package/dist/collections/core/effects.js.map +1 -0
  293. package/dist/collections/core/events.d.ts +192 -0
  294. package/dist/collections/core/events.d.ts.map +1 -0
  295. package/dist/collections/core/events.js +291 -0
  296. package/dist/collections/core/events.js.map +1 -0
  297. package/dist/collections/core/middleware.d.ts +231 -0
  298. package/dist/collections/core/middleware.d.ts.map +1 -0
  299. package/dist/collections/core/middleware.js +161 -0
  300. package/dist/collections/core/middleware.js.map +1 -0
  301. package/dist/collections/core/policies.d.ts +220 -0
  302. package/dist/collections/core/policies.d.ts.map +1 -0
  303. package/dist/collections/core/policies.js +48 -0
  304. package/dist/collections/core/policies.js.map +1 -0
  305. package/dist/collections/core/traits.d.ts +142 -0
  306. package/dist/collections/core/traits.d.ts.map +1 -0
  307. package/dist/collections/core/traits.js +8 -0
  308. package/dist/collections/core/traits.js.map +1 -0
  309. package/dist/collections/examples.d.ts +13 -0
  310. package/dist/collections/examples.d.ts.map +1 -0
  311. package/dist/collections/examples.js +302 -0
  312. package/dist/collections/examples.js.map +1 -0
  313. package/dist/collections/fx/collectors.d.ts +190 -0
  314. package/dist/collections/fx/collectors.d.ts.map +1 -0
  315. package/dist/collections/fx/collectors.js +369 -0
  316. package/dist/collections/fx/collectors.js.map +1 -0
  317. package/dist/collections/fx/iter.d.ts +166 -0
  318. package/dist/collections/fx/iter.d.ts.map +1 -0
  319. package/dist/collections/fx/iter.js +421 -0
  320. package/dist/collections/fx/iter.js.map +1 -0
  321. package/dist/collections/impl/array-deque.d.ts +107 -0
  322. package/dist/collections/impl/array-deque.d.ts.map +1 -0
  323. package/dist/collections/impl/array-deque.js +381 -0
  324. package/dist/collections/impl/array-deque.js.map +1 -0
  325. package/dist/collections/impl/array-list.d.ts +101 -0
  326. package/dist/collections/impl/array-list.d.ts.map +1 -0
  327. package/dist/collections/impl/array-list.js +387 -0
  328. package/dist/collections/impl/array-list.js.map +1 -0
  329. package/dist/collections/impl/hash-map.d.ts +141 -0
  330. package/dist/collections/impl/hash-map.d.ts.map +1 -0
  331. package/dist/collections/impl/hash-map.js +450 -0
  332. package/dist/collections/impl/hash-map.js.map +1 -0
  333. package/dist/collections/impl/hash-set.d.ts +125 -0
  334. package/dist/collections/impl/hash-set.d.ts.map +1 -0
  335. package/dist/collections/impl/hash-set.js +264 -0
  336. package/dist/collections/impl/hash-set.js.map +1 -0
  337. package/dist/collections/impl/linked-hash-map.d.ts +141 -0
  338. package/dist/collections/impl/linked-hash-map.d.ts.map +1 -0
  339. package/dist/collections/impl/linked-hash-map.js +472 -0
  340. package/dist/collections/impl/linked-hash-map.js.map +1 -0
  341. package/dist/collections/impl/linked-list.d.ts +109 -0
  342. package/dist/collections/impl/linked-list.d.ts.map +1 -0
  343. package/dist/collections/impl/linked-list.js +491 -0
  344. package/dist/collections/impl/linked-list.js.map +1 -0
  345. package/dist/collections/impl/priority-queue.d.ts +134 -0
  346. package/dist/collections/impl/priority-queue.d.ts.map +1 -0
  347. package/dist/collections/impl/priority-queue.js +336 -0
  348. package/dist/collections/impl/priority-queue.js.map +1 -0
  349. package/dist/collections/impl/tree-map.d.ts +146 -0
  350. package/dist/collections/impl/tree-map.d.ts.map +1 -0
  351. package/dist/collections/impl/tree-map.js +781 -0
  352. package/dist/collections/impl/tree-map.js.map +1 -0
  353. package/dist/collections/impl/tree-set.d.ts +112 -0
  354. package/dist/collections/impl/tree-set.d.ts.map +1 -0
  355. package/dist/collections/impl/tree-set.js +374 -0
  356. package/dist/collections/impl/tree-set.js.map +1 -0
  357. package/dist/collections/index.d.ts +105 -0
  358. package/dist/collections/index.d.ts.map +1 -0
  359. package/dist/collections/index.js +135 -0
  360. package/dist/collections/index.js.map +1 -0
  361. package/dist/collections/interfaces/collection.d.ts +119 -0
  362. package/dist/collections/interfaces/collection.d.ts.map +1 -0
  363. package/dist/collections/interfaces/collection.js +8 -0
  364. package/dist/collections/interfaces/collection.js.map +1 -0
  365. package/dist/collections/interfaces/list.d.ts +247 -0
  366. package/dist/collections/interfaces/list.d.ts.map +1 -0
  367. package/dist/collections/interfaces/list.js +8 -0
  368. package/dist/collections/interfaces/list.js.map +1 -0
  369. package/dist/collections/interfaces/map.d.ts +344 -0
  370. package/dist/collections/interfaces/map.d.ts.map +1 -0
  371. package/dist/collections/interfaces/map.js +8 -0
  372. package/dist/collections/interfaces/map.js.map +1 -0
  373. package/dist/collections/interfaces/queue.d.ts +304 -0
  374. package/dist/collections/interfaces/queue.d.ts.map +1 -0
  375. package/dist/collections/interfaces/queue.js +8 -0
  376. package/dist/collections/interfaces/queue.js.map +1 -0
  377. package/dist/collections/interfaces/set.d.ts +137 -0
  378. package/dist/collections/interfaces/set.d.ts.map +1 -0
  379. package/dist/collections/interfaces/set.js +8 -0
  380. package/dist/collections/interfaces/set.js.map +1 -0
  381. package/dist/collections/storage/api.d.ts +109 -0
  382. package/dist/collections/storage/api.d.ts.map +1 -0
  383. package/dist/collections/storage/api.js +182 -0
  384. package/dist/collections/storage/api.js.map +1 -0
  385. package/dist/collections/storage/hybrid.d.ts +164 -0
  386. package/dist/collections/storage/hybrid.d.ts.map +1 -0
  387. package/dist/collections/storage/hybrid.js +416 -0
  388. package/dist/collections/storage/hybrid.js.map +1 -0
  389. package/dist/collections/storage/index.d.ts +16 -0
  390. package/dist/collections/storage/index.d.ts.map +1 -0
  391. package/dist/collections/storage/index.js +13 -0
  392. package/dist/collections/storage/index.js.map +1 -0
  393. package/dist/collections/storage/interface.d.ts +141 -0
  394. package/dist/collections/storage/interface.d.ts.map +1 -0
  395. package/dist/collections/storage/interface.js +23 -0
  396. package/dist/collections/storage/interface.js.map +1 -0
  397. package/dist/collections/storage/memory.d.ts +68 -0
  398. package/dist/collections/storage/memory.d.ts.map +1 -0
  399. package/dist/collections/storage/memory.js +154 -0
  400. package/dist/collections/storage/memory.js.map +1 -0
  401. package/dist/collections/utils/defaults.d.ts +135 -0
  402. package/dist/collections/utils/defaults.d.ts.map +1 -0
  403. package/dist/collections/utils/defaults.js +322 -0
  404. package/dist/collections/utils/defaults.js.map +1 -0
  405. package/dist/collections/utils/factories.d.ts +144 -0
  406. package/dist/collections/utils/factories.d.ts.map +1 -0
  407. package/dist/collections/utils/factories.js +293 -0
  408. package/dist/collections/utils/factories.js.map +1 -0
  409. package/dist/collections/utils/helpers.d.ts +137 -0
  410. package/dist/collections/utils/helpers.d.ts.map +1 -0
  411. package/dist/collections/utils/helpers.js +221 -0
  412. package/dist/collections/utils/helpers.js.map +1 -0
  413. package/dist/collections.d.ts +12 -0
  414. package/dist/collections.d.ts.map +1 -0
  415. package/dist/collections.js +10 -0
  416. package/dist/collections.js.map +1 -0
  417. package/dist/components/define.d.ts +134 -0
  418. package/dist/components/define.d.ts.map +1 -0
  419. package/dist/components/define.js +486 -0
  420. package/dist/components/define.js.map +1 -0
  421. package/dist/components/index.d.ts +39 -0
  422. package/dist/components/index.d.ts.map +1 -0
  423. package/dist/components/index.js +38 -0
  424. package/dist/components/index.js.map +1 -0
  425. package/dist/components/types.d.ts +264 -0
  426. package/dist/components/types.d.ts.map +1 -0
  427. package/dist/components/types.js +46 -0
  428. package/dist/components/types.js.map +1 -0
  429. package/dist/events/bus.d.ts +193 -0
  430. package/dist/events/bus.d.ts.map +1 -0
  431. package/dist/events/bus.js +511 -0
  432. package/dist/events/bus.js.map +1 -0
  433. package/dist/events/index.d.ts +34 -0
  434. package/dist/events/index.d.ts.map +1 -0
  435. package/dist/events/index.js +36 -0
  436. package/dist/events/index.js.map +1 -0
  437. package/dist/events/types.d.ts +242 -0
  438. package/dist/events/types.d.ts.map +1 -0
  439. package/dist/events/types.js +8 -0
  440. package/dist/events/types.js.map +1 -0
  441. package/dist/index.d.ts +17 -0
  442. package/dist/index.d.ts.map +1 -0
  443. package/dist/index.js +17 -0
  444. package/dist/index.js.map +1 -0
  445. package/dist/middleware/compose.d.ts +88 -0
  446. package/dist/middleware/compose.d.ts.map +1 -0
  447. package/dist/middleware/compose.js +108 -0
  448. package/dist/middleware/compose.js.map +1 -0
  449. package/dist/middleware/index.d.ts +12 -0
  450. package/dist/middleware/index.d.ts.map +1 -0
  451. package/dist/middleware/index.js +11 -0
  452. package/dist/middleware/index.js.map +1 -0
  453. package/dist/middleware/types.d.ts +112 -0
  454. package/dist/middleware/types.d.ts.map +1 -0
  455. package/dist/middleware/types.js +14 -0
  456. package/dist/middleware/types.js.map +1 -0
  457. package/dist/procedures/capability.d.ts +111 -0
  458. package/dist/procedures/capability.d.ts.map +1 -0
  459. package/dist/procedures/capability.js +269 -0
  460. package/dist/procedures/capability.js.map +1 -0
  461. package/dist/procedures/cli/announce.d.ts +67 -0
  462. package/dist/procedures/cli/announce.d.ts.map +1 -0
  463. package/dist/procedures/cli/announce.js +392 -0
  464. package/dist/procedures/cli/announce.js.map +1 -0
  465. package/dist/procedures/cli/discover.d.ts +66 -0
  466. package/dist/procedures/cli/discover.d.ts.map +1 -0
  467. package/dist/procedures/cli/discover.js +310 -0
  468. package/dist/procedures/cli/discover.js.map +1 -0
  469. package/dist/procedures/cli/index.d.ts +13 -0
  470. package/dist/procedures/cli/index.d.ts.map +1 -0
  471. package/dist/procedures/cli/index.js +203 -0
  472. package/dist/procedures/cli/index.js.map +1 -0
  473. package/dist/procedures/cli/init.d.ts +17 -0
  474. package/dist/procedures/cli/init.d.ts.map +1 -0
  475. package/dist/procedures/cli/init.js +336 -0
  476. package/dist/procedures/cli/init.js.map +1 -0
  477. package/dist/procedures/collection/index.d.ts +10 -0
  478. package/dist/procedures/collection/index.d.ts.map +1 -0
  479. package/dist/procedures/collection/index.js +10 -0
  480. package/dist/procedures/collection/index.js.map +1 -0
  481. package/dist/procedures/collection/procedures.d.ts +21 -0
  482. package/dist/procedures/collection/procedures.d.ts.map +1 -0
  483. package/dist/procedures/collection/procedures.js +210 -0
  484. package/dist/procedures/collection/procedures.js.map +1 -0
  485. package/dist/procedures/collection/schemas.d.ts +131 -0
  486. package/dist/procedures/collection/schemas.d.ts.map +1 -0
  487. package/dist/procedures/collection/schemas.js +422 -0
  488. package/dist/procedures/collection/schemas.js.map +1 -0
  489. package/dist/procedures/collection/storage.d.ts +53 -0
  490. package/dist/procedures/collection/storage.d.ts.map +1 -0
  491. package/dist/procedures/collection/storage.js +2 -0
  492. package/dist/procedures/collection/storage.js.map +1 -0
  493. package/dist/procedures/core/array.d.ts +276 -0
  494. package/dist/procedures/core/array.d.ts.map +1 -0
  495. package/dist/procedures/core/array.js +639 -0
  496. package/dist/procedures/core/array.js.map +1 -0
  497. package/dist/procedures/core/comparison.d.ts +85 -0
  498. package/dist/procedures/core/comparison.d.ts.map +1 -0
  499. package/dist/procedures/core/comparison.js +158 -0
  500. package/dist/procedures/core/comparison.js.map +1 -0
  501. package/dist/procedures/core/index.d.ts +261 -0
  502. package/dist/procedures/core/index.d.ts.map +1 -0
  503. package/dist/procedures/core/index.js +588 -0
  504. package/dist/procedures/core/index.js.map +1 -0
  505. package/dist/procedures/core/logic.d.ts +144 -0
  506. package/dist/procedures/core/logic.d.ts.map +1 -0
  507. package/dist/procedures/core/logic.js +169 -0
  508. package/dist/procedures/core/logic.js.map +1 -0
  509. package/dist/procedures/core/math.d.ts +139 -0
  510. package/dist/procedures/core/math.d.ts.map +1 -0
  511. package/dist/procedures/core/math.js +275 -0
  512. package/dist/procedures/core/math.js.map +1 -0
  513. package/dist/procedures/core/meta.d.ts +111 -0
  514. package/dist/procedures/core/meta.d.ts.map +1 -0
  515. package/dist/procedures/core/meta.js +244 -0
  516. package/dist/procedures/core/meta.js.map +1 -0
  517. package/dist/procedures/core/object.d.ts +109 -0
  518. package/dist/procedures/core/object.d.ts.map +1 -0
  519. package/dist/procedures/core/object.js +272 -0
  520. package/dist/procedures/core/object.js.map +1 -0
  521. package/dist/procedures/core/operands.d.ts +51 -0
  522. package/dist/procedures/core/operands.d.ts.map +1 -0
  523. package/dist/procedures/core/operands.js +90 -0
  524. package/dist/procedures/core/operands.js.map +1 -0
  525. package/dist/procedures/core/outputs.d.ts +28 -0
  526. package/dist/procedures/core/outputs.d.ts.map +1 -0
  527. package/dist/procedures/core/outputs.js +42 -0
  528. package/dist/procedures/core/outputs.js.map +1 -0
  529. package/dist/procedures/core/results.d.ts +202 -0
  530. package/dist/procedures/core/results.d.ts.map +1 -0
  531. package/dist/procedures/core/results.js +106 -0
  532. package/dist/procedures/core/results.js.map +1 -0
  533. package/dist/procedures/core/schemas.d.ts +48 -0
  534. package/dist/procedures/core/schemas.d.ts.map +1 -0
  535. package/dist/procedures/core/schemas.js +102 -0
  536. package/dist/procedures/core/schemas.js.map +1 -0
  537. package/dist/procedures/core/string.d.ts +138 -0
  538. package/dist/procedures/core/string.d.ts.map +1 -0
  539. package/dist/procedures/core/string.js +270 -0
  540. package/dist/procedures/core/string.js.map +1 -0
  541. package/dist/procedures/core/type.d.ts +101 -0
  542. package/dist/procedures/core/type.d.ts.map +1 -0
  543. package/dist/procedures/core/type.js +210 -0
  544. package/dist/procedures/core/type.js.map +1 -0
  545. package/dist/procedures/define-procedure.d.ts +187 -0
  546. package/dist/procedures/define-procedure.d.ts.map +1 -0
  547. package/dist/procedures/define-procedure.js +357 -0
  548. package/dist/procedures/define-procedure.js.map +1 -0
  549. package/dist/procedures/define.d.ts +228 -0
  550. package/dist/procedures/define.d.ts.map +1 -0
  551. package/dist/procedures/define.js +300 -0
  552. package/dist/procedures/define.js.map +1 -0
  553. package/dist/procedures/discovery.d.ts +57 -0
  554. package/dist/procedures/discovery.d.ts.map +1 -0
  555. package/dist/procedures/discovery.js +68 -0
  556. package/dist/procedures/discovery.js.map +1 -0
  557. package/dist/procedures/effects.d.ts +15 -0
  558. package/dist/procedures/effects.d.ts.map +1 -0
  559. package/dist/procedures/effects.js +18 -0
  560. package/dist/procedures/effects.js.map +1 -0
  561. package/dist/procedures/index.d.ts +27 -0
  562. package/dist/procedures/index.d.ts.map +1 -0
  563. package/dist/procedures/index.js +54 -0
  564. package/dist/procedures/index.js.map +1 -0
  565. package/dist/procedures/interceptors.d.ts +82 -0
  566. package/dist/procedures/interceptors.d.ts.map +1 -0
  567. package/dist/procedures/interceptors.js +194 -0
  568. package/dist/procedures/interceptors.js.map +1 -0
  569. package/dist/procedures/invoke.d.ts +155 -0
  570. package/dist/procedures/invoke.d.ts.map +1 -0
  571. package/dist/procedures/invoke.js +343 -0
  572. package/dist/procedures/invoke.js.map +1 -0
  573. package/dist/procedures/module.d.ts +54 -0
  574. package/dist/procedures/module.d.ts.map +1 -0
  575. package/dist/procedures/module.js +103 -0
  576. package/dist/procedures/module.js.map +1 -0
  577. package/dist/procedures/policy.d.ts +70 -0
  578. package/dist/procedures/policy.d.ts.map +1 -0
  579. package/dist/procedures/policy.js +138 -0
  580. package/dist/procedures/policy.js.map +1 -0
  581. package/dist/procedures/ref.d.ts +606 -0
  582. package/dist/procedures/ref.d.ts.map +1 -0
  583. package/dist/procedures/ref.js +895 -0
  584. package/dist/procedures/ref.js.map +1 -0
  585. package/dist/procedures/registry.d.ts +208 -0
  586. package/dist/procedures/registry.d.ts.map +1 -0
  587. package/dist/procedures/registry.js +402 -0
  588. package/dist/procedures/registry.js.map +1 -0
  589. package/dist/procedures/schema.d.ts +126 -0
  590. package/dist/procedures/schema.d.ts.map +1 -0
  591. package/dist/procedures/schema.js +108 -0
  592. package/dist/procedures/schema.js.map +1 -0
  593. package/dist/procedures/storage/adapter.d.ts +148 -0
  594. package/dist/procedures/storage/adapter.d.ts.map +1 -0
  595. package/dist/procedures/storage/adapter.js +214 -0
  596. package/dist/procedures/storage/adapter.js.map +1 -0
  597. package/dist/procedures/storage/api.d.ts +125 -0
  598. package/dist/procedures/storage/api.d.ts.map +1 -0
  599. package/dist/procedures/storage/api.js +220 -0
  600. package/dist/procedures/storage/api.js.map +1 -0
  601. package/dist/procedures/storage/factory.d.ts +134 -0
  602. package/dist/procedures/storage/factory.d.ts.map +1 -0
  603. package/dist/procedures/storage/factory.js +166 -0
  604. package/dist/procedures/storage/factory.js.map +1 -0
  605. package/dist/procedures/storage/hybrid.d.ts +193 -0
  606. package/dist/procedures/storage/hybrid.d.ts.map +1 -0
  607. package/dist/procedures/storage/hybrid.js +519 -0
  608. package/dist/procedures/storage/hybrid.js.map +1 -0
  609. package/dist/procedures/storage/index.d.ts +17 -0
  610. package/dist/procedures/storage/index.d.ts.map +1 -0
  611. package/dist/procedures/storage/index.js +17 -0
  612. package/dist/procedures/storage/index.js.map +1 -0
  613. package/dist/procedures/storage/procedures.d.ts +39 -0
  614. package/dist/procedures/storage/procedures.d.ts.map +1 -0
  615. package/dist/procedures/storage/procedures.js +261 -0
  616. package/dist/procedures/storage/procedures.js.map +1 -0
  617. package/dist/procedures/storage/serialization.d.ts +123 -0
  618. package/dist/procedures/storage/serialization.d.ts.map +1 -0
  619. package/dist/procedures/storage/serialization.js +216 -0
  620. package/dist/procedures/storage/serialization.js.map +1 -0
  621. package/dist/procedures/storage/synced-registry.d.ts +246 -0
  622. package/dist/procedures/storage/synced-registry.d.ts.map +1 -0
  623. package/dist/procedures/storage/synced-registry.js +575 -0
  624. package/dist/procedures/storage/synced-registry.js.map +1 -0
  625. package/dist/procedures/storage/types.d.ts +130 -0
  626. package/dist/procedures/storage/types.d.ts.map +1 -0
  627. package/dist/procedures/storage/types.js +8 -0
  628. package/dist/procedures/storage/types.js.map +1 -0
  629. package/dist/procedures/types.d.ts +468 -0
  630. package/dist/procedures/types.d.ts.map +1 -0
  631. package/dist/procedures/types.js +23 -0
  632. package/dist/procedures/types.js.map +1 -0
  633. package/dist/register.d.ts +8 -0
  634. package/dist/register.d.ts.map +1 -0
  635. package/dist/register.js +9 -0
  636. package/dist/register.js.map +1 -0
  637. package/dist/server/browser-guard.d.ts +69 -0
  638. package/dist/server/browser-guard.d.ts.map +1 -0
  639. package/dist/server/browser-guard.js +103 -0
  640. package/dist/server/browser-guard.js.map +1 -0
  641. package/dist/server/host-policy.d.ts +81 -0
  642. package/dist/server/host-policy.d.ts.map +1 -0
  643. package/dist/server/host-policy.js +104 -0
  644. package/dist/server/host-policy.js.map +1 -0
  645. package/dist/server/index.d.ts +46 -0
  646. package/dist/server/index.d.ts.map +1 -0
  647. package/dist/server/index.js +42 -0
  648. package/dist/server/index.js.map +1 -0
  649. package/dist/server/method.d.ts +24 -0
  650. package/dist/server/method.d.ts.map +1 -0
  651. package/dist/server/method.js +29 -0
  652. package/dist/server/method.js.map +1 -0
  653. package/dist/server/procedure-server.d.ts +226 -0
  654. package/dist/server/procedure-server.d.ts.map +1 -0
  655. package/dist/server/procedure-server.js +348 -0
  656. package/dist/server/procedure-server.js.map +1 -0
  657. package/dist/server/server.d.ts +161 -0
  658. package/dist/server/server.d.ts.map +1 -0
  659. package/dist/server/server.js +279 -0
  660. package/dist/server/server.js.map +1 -0
  661. package/dist/server/types.d.ts +106 -0
  662. package/dist/server/types.d.ts.map +1 -0
  663. package/dist/server/types.js +29 -0
  664. package/dist/server/types.js.map +1 -0
  665. package/package.json +117 -3
  666. package/src/adapters/http/client/index.ts +51 -0
  667. package/src/adapters/http/client/transport.ts +338 -0
  668. package/src/adapters/http/client/types.ts +33 -0
  669. package/src/adapters/http/index.ts +7 -0
  670. package/src/adapters/http/server/index.ts +14 -0
  671. package/src/adapters/http/server/strategies.ts +105 -0
  672. package/src/adapters/http/server/transport.ts +623 -0
  673. package/src/adapters/http/server/types.ts +81 -0
  674. package/src/adapters/http/shared/constants.ts +108 -0
  675. package/src/adapters/http/shared/errors.ts +199 -0
  676. package/src/adapters/http/shared/headers.ts +291 -0
  677. package/src/adapters/http/shared/index.ts +21 -0
  678. package/src/adapters/http/shared/status-codes.ts +212 -0
  679. package/src/adapters/http/shared/strategies.ts +255 -0
  680. package/src/adapters/local/client/index.ts +11 -0
  681. package/src/adapters/local/client/transport.ts +188 -0
  682. package/src/adapters/local/client/types.ts +50 -0
  683. package/src/adapters/metadata.ts +17 -0
  684. package/src/adapters/mock/client/builder.ts +64 -0
  685. package/src/adapters/mock/client/index.ts +19 -0
  686. package/src/adapters/mock/client/transport.ts +352 -0
  687. package/src/adapters/mock/client/types.ts +99 -0
  688. package/src/adapters/websocket/client/index.ts +18 -0
  689. package/src/adapters/websocket/client/transport.ts +733 -0
  690. package/src/adapters/websocket/client/types.ts +235 -0
  691. package/src/adapters/websocket/index.ts +24 -0
  692. package/src/adapters/websocket/server/index.ts +18 -0
  693. package/src/adapters/websocket/server/transport.ts +705 -0
  694. package/src/adapters/websocket/server/types.ts +169 -0
  695. package/src/browser.ts +401 -0
  696. package/src/client/batch-executor.ts +514 -0
  697. package/src/client/call-types.ts +491 -0
  698. package/src/client/client.ts +1229 -0
  699. package/src/client/consumption.ts +288 -0
  700. package/src/client/context.ts +228 -0
  701. package/src/client/errors/README.md +279 -0
  702. package/src/client/errors/codes.ts +88 -0
  703. package/src/client/errors/factory.ts +263 -0
  704. package/src/client/errors/http-errors.ts +601 -0
  705. package/src/client/errors/http-status.ts +82 -0
  706. package/src/client/errors/index.ts +72 -0
  707. package/src/client/errors/registry.ts +595 -0
  708. package/src/client/errors/types.ts +139 -0
  709. package/src/client/index.ts +124 -0
  710. package/src/client/middleware/auth.ts +132 -0
  711. package/src/client/middleware/cache.ts +316 -0
  712. package/src/client/middleware/circuit-breaker.ts +339 -0
  713. package/src/client/middleware/contexts.ts +319 -0
  714. package/src/client/middleware/items.ts +114 -0
  715. package/src/client/middleware/lru.ts +66 -0
  716. package/src/client/middleware/pagination.ts +213 -0
  717. package/src/client/middleware/rate-limit.ts +315 -0
  718. package/src/client/middleware/retry.ts +236 -0
  719. package/src/client/middleware/timeout.ts +308 -0
  720. package/src/client/middleware/tracing.ts +191 -0
  721. package/src/client/route-resolver.ts +407 -0
  722. package/src/client/typed-method.ts +65 -0
  723. package/src/client/typed.ts +140 -0
  724. package/src/client/types.ts +372 -0
  725. package/src/client/validation/index.ts +56 -0
  726. package/src/client/validation/middleware.ts +254 -0
  727. package/src/client/validation/types.ts +162 -0
  728. package/src/events/bus.ts +594 -0
  729. package/src/events/index.ts +67 -0
  730. package/src/events/types.ts +263 -0
  731. package/src/index.ts +33 -0
  732. package/src/middleware/compose.ts +159 -0
  733. package/src/middleware/index.ts +28 -0
  734. package/src/middleware/types.ts +166 -0
  735. package/src/procedures/capability.ts +333 -0
  736. package/src/procedures/cli/announce.ts +470 -0
  737. package/src/procedures/cli/discover.ts +390 -0
  738. package/src/procedures/cli/index.ts +231 -0
  739. package/src/procedures/cli/init.ts +370 -0
  740. package/src/procedures/collection/index.ts +51 -0
  741. package/src/procedures/collection/procedures.ts +257 -0
  742. package/src/procedures/collection/schemas.ts +550 -0
  743. package/src/procedures/collection/storage.ts +53 -0
  744. package/src/procedures/core/array.ts +1026 -0
  745. package/src/procedures/core/comparison.ts +265 -0
  746. package/src/procedures/core/index.ts +898 -0
  747. package/src/procedures/core/logic.ts +225 -0
  748. package/src/procedures/core/math.ts +471 -0
  749. package/src/procedures/core/meta.ts +389 -0
  750. package/src/procedures/core/object.ts +429 -0
  751. package/src/procedures/core/operands.ts +119 -0
  752. package/src/procedures/core/outputs.ts +48 -0
  753. package/src/procedures/core/results.ts +296 -0
  754. package/src/procedures/core/schemas.ts +123 -0
  755. package/src/procedures/core/string.ts +460 -0
  756. package/src/procedures/core/type.ts +346 -0
  757. package/src/procedures/define-procedure.ts +532 -0
  758. package/src/procedures/define.ts +387 -0
  759. package/src/procedures/discovery.ts +76 -0
  760. package/src/procedures/effects.ts +24 -0
  761. package/src/procedures/index.ts +239 -0
  762. package/src/procedures/interceptors.ts +273 -0
  763. package/src/procedures/invoke.ts +506 -0
  764. package/src/procedures/module.ts +117 -0
  765. package/src/procedures/policy.ts +171 -0
  766. package/src/procedures/ref.ts +1305 -0
  767. package/src/procedures/registry.ts +473 -0
  768. package/src/procedures/schema.ts +225 -0
  769. package/src/procedures/types.ts +596 -0
  770. package/src/register.ts +10 -0
  771. package/src/server/browser-guard.ts +147 -0
  772. package/src/server/host-policy.ts +163 -0
  773. package/src/server/index.ts +70 -0
  774. package/src/server/method.ts +33 -0
  775. package/src/server/procedure-server.ts +459 -0
  776. package/src/server/server.ts +364 -0
  777. package/src/server/types.ts +147 -0
@@ -0,0 +1,506 @@
1
+ /**
2
+ * Procedure invocation: the one way to run a procedure.
3
+ *
4
+ * `Client.exec()`, `Client.route()`, the local transport and `ProcedureServer` run each
5
+ * procedure through `invokeProcedure()`. The function validates the input, makes the context,
6
+ * runs the handler and validates each output. Thus every host applies the same rules
7
+ * (ARCHITECTURE-PROPOSALS-2026-10 P1).
8
+ *
9
+ * A handler gives one value, or it is a generator that yields values (a stream). The result
10
+ * tells which: `{ kind: "value" }` or `{ kind: "stream" }`. A caller that wants one value uses
11
+ * `outputValue()` (the last item of a stream). A caller that wants each value uses `outputItems()`.
12
+ *
13
+ * Interceptors run around each invocation, the nested calls too (roadmap 1.2): policy, tracing,
14
+ * timeouts and metrics for every host. `interceptors.ts` has a timeout, a tracing and a metrics
15
+ * interceptor.
16
+ *
17
+ * Each invocation operates with a capability (CAPABILITIES-2026-10, `capability.ts`). A nested
18
+ * call gets the same capability or a narrower one. The admission refuses a procedure whose
19
+ * declared effects the capability does not permit (`FORBIDDEN`). The host can give resources
20
+ * for the capability (`ctx.resources`) and a filter of the output that leaves the host.
21
+ */
22
+
23
+ import type {
24
+ AnyProcedure,
25
+ Capability,
26
+ CapabilityRequest,
27
+ ClearanceOrder,
28
+ NestedCallOptions,
29
+ ProcedureClient,
30
+ ProcedureContext,
31
+ ProcedurePath,
32
+ RepositoryProvider,
33
+ ResourcesOf,
34
+ } from "./types.js";
35
+ import { pathToKey } from "./types.js";
36
+ import { validateSchema } from "./schema.js";
37
+ import type { ProcedureRegistry } from "./registry.js";
38
+ import { PROCEDURE_REGISTRY } from "./registry.js";
39
+ import { nestedCallRefusal } from "./policy.js";
40
+ import { scopeOf, withScope, type HydrationEvent } from "./ref.js";
41
+ import { UNLIMITED_CAPABILITY, capabilityRefusal, examinesNestedCall, narrowCapability, type CapabilityRefusalReason } from "./capability.js";
42
+ import { timeoutInterceptor } from "./interceptors.js";
43
+ import type { EventBus } from "../events/types.js";
44
+ import { getGlobalEventBus, withEventBusSignal } from "../events/bus.js";
45
+
46
+ // =============================================================================
47
+ // Errors
48
+ // =============================================================================
49
+
50
+ /** The reasons for which an invocation fails before or after the handler. */
51
+ export type InvocationErrorCode =
52
+ | "NOT_FOUND"
53
+ | "NO_HANDLER"
54
+ | "NOT_EXPOSED"
55
+ | "NOT_DECLARED"
56
+ | "VALIDATION_ERROR"
57
+ | "OUTPUT_VALIDATION_ERROR"
58
+ | "NO_OUTPUT"
59
+ | "ABORTED"
60
+ | "TIMEOUT"
61
+ /** The capability of the call does not permit it (CAPABILITIES-2026-10). `reason` tells why. */
62
+ | "FORBIDDEN";
63
+
64
+ /** An error of the invocation itself. An error that the handler throws passes through unchanged. */
65
+ export class InvocationError extends Error {
66
+ override readonly name = "InvocationError";
67
+ readonly code: InvocationErrorCode;
68
+ readonly path: ProcedurePath;
69
+ readonly retryable: boolean = false;
70
+ /** The reason of a `FORBIDDEN` error: `effects-undeclared`, `effects-exceeded` or `clearance`. */
71
+ readonly reason: CapabilityRefusalReason | undefined;
72
+
73
+ constructor(code: InvocationErrorCode, message: string, path: ProcedurePath, reason?: CapabilityRefusalReason) {
74
+ super(message);
75
+ this.code = code;
76
+ this.path = path;
77
+ this.reason = reason;
78
+ }
79
+ }
80
+
81
+ function abortError(path: ProcedurePath): InvocationError {
82
+ return new InvocationError("ABORTED", `Procedure was aborted: ${pathToKey(path)}`, path);
83
+ }
84
+
85
+ // =============================================================================
86
+ // Types
87
+ // =============================================================================
88
+
89
+ /** The output of an invocation: one value, or a stream of values. */
90
+ export type ProcedureOutput<T = unknown> =
91
+ | { readonly kind: "value"; readonly value: T }
92
+ | { readonly kind: "stream"; readonly items: AsyncGenerator<T, void, undefined> };
93
+
94
+ export interface InvokeOptions {
95
+ /**
96
+ * The hydration observer of the program (see `HydrateOptions.onRef`). It goes to the context
97
+ * (`ctx.onRef`) and to the nested calls, so the hydrations of this program report to it.
98
+ */
99
+ onRef?: ((event: HydrationEvent) => void) | undefined;
100
+ /** The nested calls of `ctx.client` find their procedures here. The default is `PROCEDURE_REGISTRY`. */
101
+ registry?: ProcedureRegistry | undefined;
102
+ metadata?: Record<string, unknown> | undefined;
103
+ /** When the signal aborts, a stream stops, and its handler gets `return()`. */
104
+ signal?: AbortSignal | undefined;
105
+ repository?: RepositoryProvider | undefined;
106
+ /** The bus of `ctx.bus`. The default is the global bus of `getGlobalEventBus()`. */
107
+ bus?: EventBus | undefined;
108
+ /** The input is valid already (for example, the route resolver validated it). */
109
+ inputValidated?: boolean | undefined;
110
+ /**
111
+ * This client replaces the default `ctx.client`, for example a Client that sends unknown paths
112
+ * to its transport. A function gets the invocation, so its nested calls can name their parent.
113
+ */
114
+ client?: ProcedureClient | ((invocation: Invocation) => ProcedureClient) | undefined;
115
+ /**
116
+ * The expose rule of a server. A data-driven procedure (control flow, `runs-refs`, a procedure
117
+ * that `procedure.define` made) can call only the paths for which it gives true. A code
118
+ * procedure with `metadata.calls` can call what it declares and the exposed paths. See
119
+ * `policy.ts` (deep dive MCP-3).
120
+ */
121
+ expose?: ((path: ProcedurePath) => boolean) | undefined;
122
+ /** True: a code procedure without `metadata.calls` can call only the exposed paths. */
123
+ strictCalls?: boolean | undefined;
124
+ /** The interceptors of each invocation, the outermost first. The nested calls get them too. */
125
+ interceptors?: readonly Interceptor[] | undefined;
126
+ /** The invocation whose handler makes this call. The context client sets it for a nested call. */
127
+ parent?: Invocation | undefined;
128
+ /**
129
+ * The capability of the call: its clearance, permitted effects and deadline. The host makes it
130
+ * from its authentication. The nested calls get it, or a narrower one. Absent: no limits.
131
+ */
132
+ capability?: Capability | undefined;
133
+ /** The order of the clearance values. Narrowing two different clearances needs it. */
134
+ clearanceOrder?: ClearanceOrder | undefined;
135
+ /** The resources of an invocation for its capability (`ctx.resources`). */
136
+ resources?: ((invocation: Invocation) => ResourcesOf) | undefined;
137
+ /**
138
+ * The filter of the output that leaves the host (the call of the host, not its nested calls).
139
+ * It drops a refused stream item. A refused value gives `FORBIDDEN` (reason `clearance`).
140
+ */
141
+ admitItem?: ((item: unknown, invocation: Invocation) => boolean) | undefined;
142
+ }
143
+
144
+ // =============================================================================
145
+ // Interceptors
146
+ // =============================================================================
147
+
148
+ let invocationCount = 0;
149
+
150
+ /** One invocation, as an interceptor sees it. */
151
+ export interface Invocation {
152
+ /** A number that identifies the invocation in this process. `next()` keeps it. */
153
+ readonly id: number;
154
+ readonly procedure: AnyProcedure;
155
+ readonly path: ProcedurePath;
156
+ /** The input before its validation. */
157
+ readonly input: unknown;
158
+ readonly metadata: Record<string, unknown>;
159
+ readonly signal: AbortSignal | undefined;
160
+ /** The invocation whose handler made this nested call. A call of a host has none. */
161
+ readonly parent: Invocation | undefined;
162
+ /** 0 for a call of a host, 1 for its nested calls, and so on. */
163
+ readonly depth: number;
164
+ /** The capability of the invocation (frozen). */
165
+ readonly capability: Capability;
166
+ }
167
+
168
+ /** The changes that an interceptor gives to the next step: the handler and the nested calls get them. */
169
+ export interface InvocationChanges {
170
+ signal?: AbortSignal | undefined;
171
+ metadata?: Record<string, unknown> | undefined;
172
+ /** A request for a narrower capability. The framework calculates the result: it is never wider. */
173
+ capability?: CapabilityRequest | undefined;
174
+ }
175
+
176
+ /** The rest of the chain: the next interceptors, then the validation and the handler. */
177
+ export type InvocationNext = (changes?: InvocationChanges) => Promise<ProcedureOutput<unknown>>;
178
+
179
+ /**
180
+ * A function around an invocation. It can examine the invocation, refuse it (throw), change its
181
+ * signal or metadata (`next(changes)`), and examine or wrap the output.
182
+ */
183
+ export type Interceptor = (invocation: Invocation, next: InvocationNext) => Promise<ProcedureOutput<unknown>>;
184
+
185
+ // =============================================================================
186
+ // Invocation
187
+ // =============================================================================
188
+
189
+ /** True for a value that `for await` can read: a generator, a stream. A string is not one. */
190
+ export function isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {
191
+ return (
192
+ value !== null &&
193
+ (typeof value === "object" || typeof value === "function") &&
194
+ typeof (value as { [Symbol.asyncIterator]?: unknown })[Symbol.asyncIterator] === "function"
195
+ );
196
+ }
197
+
198
+ /** The output (or one stream item), validated by the output schema of the procedure. */
199
+ async function validateOutput(procedure: AnyProcedure, output: unknown): Promise<unknown> {
200
+ const result = await validateSchema(procedure.output, output);
201
+ if (!result.ok) {
202
+ throw new InvocationError(
203
+ "OUTPUT_VALIDATION_ERROR",
204
+ `Output validation failed for ${pathToKey(procedure.path)}: ${result.message}`,
205
+ procedure.path,
206
+ );
207
+ }
208
+ return result.value;
209
+ }
210
+
211
+ /** The next item, or an abort error when the signal aborts first. */
212
+ function nextOrAbort<T>(iterator: AsyncIterator<T>, signal: AbortSignal, path: ProcedurePath): Promise<IteratorResult<T>> {
213
+ if (signal.aborted) return Promise.reject(abortError(path));
214
+ return new Promise((resolve, reject) => {
215
+ const onAbort = (): void => reject(abortError(path));
216
+ signal.addEventListener("abort", onAbort, { once: true });
217
+ iterator.next().then(
218
+ (result) => {
219
+ signal.removeEventListener("abort", onAbort);
220
+ resolve(result);
221
+ },
222
+ (error: unknown) => {
223
+ signal.removeEventListener("abort", onAbort);
224
+ reject(error);
225
+ },
226
+ );
227
+ });
228
+ }
229
+
230
+ /**
231
+ * The items of a handler's stream, each validated with the output schema. When the reader stops
232
+ * early or an item is not valid, the handler's generator gets `return()`, so its `finally` runs.
233
+ */
234
+ async function* validatedItems(
235
+ procedure: AnyProcedure,
236
+ source: AsyncIterable<unknown>,
237
+ signal: AbortSignal | undefined,
238
+ ): AsyncGenerator<unknown, void, undefined> {
239
+ const iterator = source[Symbol.asyncIterator]();
240
+ let done = false;
241
+ let aborted = false;
242
+ try {
243
+ for (;;) {
244
+ let step: IteratorResult<unknown>;
245
+ try {
246
+ step = signal ? await nextOrAbort(iterator, signal, procedure.path) : await iterator.next();
247
+ } catch (error) {
248
+ // The handler threw (its generator is done), or the signal aborted (it is not)
249
+ if (error instanceof InvocationError && error.code === "ABORTED") aborted = true;
250
+ else done = true;
251
+ throw error;
252
+ }
253
+ if (step.done) {
254
+ done = true;
255
+ return;
256
+ }
257
+ yield await validateOutput(procedure, step.value);
258
+ }
259
+ } finally {
260
+ if (!done) {
261
+ // The generator of an aborted handler can wait on an await: do not wait for it
262
+ const closing = Promise.resolve(iterator.return?.()).catch(() => undefined);
263
+ if (!aborted) await closing;
264
+ }
265
+ }
266
+ }
267
+
268
+ /**
269
+ * This function runs a procedure: it validates the input, makes the context, runs the handler
270
+ * and validates the output. It throws an `InvocationError` for an invocation that cannot run,
271
+ * and the handler's own error when the handler throws. The interceptors of the options run
272
+ * around these steps.
273
+ */
274
+ export async function invokeProcedure<TOutput = unknown>(
275
+ procedure: AnyProcedure,
276
+ input: unknown,
277
+ options: InvokeOptions = {},
278
+ ): Promise<ProcedureOutput<TOutput>> {
279
+ const { path } = procedure;
280
+ if (!procedure.handler) {
281
+ throw new InvocationError("NO_HANDLER", `Procedure has no handler: ${pathToKey(path)}`, path);
282
+ }
283
+ if (options.signal?.aborted) throw abortError(path);
284
+
285
+ const invocation: Invocation = {
286
+ id: ++invocationCount,
287
+ procedure,
288
+ path,
289
+ input,
290
+ metadata: options.metadata ?? {},
291
+ signal: options.signal,
292
+ parent: options.parent,
293
+ depth: options.parent ? options.parent.depth + 1 : 0,
294
+ capability: options.capability ?? UNLIMITED_CAPABILITY,
295
+ };
296
+ // A deadline that the parent does not have (from a host, a request or a narrowed nested call)
297
+ // ends the invocation at that time, as the timeout interceptor does
298
+ const deadline = invocation.capability.deadline;
299
+ const ownDeadline = deadline !== undefined && options.parent?.capability.deadline !== deadline;
300
+ const interceptors = ownDeadline
301
+ ? [timeoutInterceptor({ ms: Math.max(0, deadline - Date.now()), appliesTo: () => true }), ...(options.interceptors ?? [])]
302
+ : (options.interceptors ?? []);
303
+ if (interceptors.length === 0) return runInvocation<TOutput>(invocation, options);
304
+
305
+ const dispatch = (index: number, current: Invocation, currentOptions: InvokeOptions): Promise<ProcedureOutput<unknown>> => {
306
+ const interceptor = interceptors[index];
307
+ if (!interceptor) return runInvocation(current, currentOptions);
308
+ return interceptor(current, (changes) => {
309
+ if (!changes) return dispatch(index + 1, current, currentOptions);
310
+ const changed: Invocation = {
311
+ ...current,
312
+ signal: changes.signal ?? current.signal,
313
+ metadata: changes.metadata ?? current.metadata,
314
+ capability: changes.capability
315
+ ? narrowCapability(current.capability, changes.capability, currentOptions.clearanceOrder)
316
+ : current.capability,
317
+ };
318
+ return dispatch(index + 1, changed, {
319
+ ...currentOptions,
320
+ signal: changed.signal,
321
+ metadata: changed.metadata,
322
+ capability: changed.capability,
323
+ });
324
+ });
325
+ };
326
+ return dispatch(0, invocation, options) as Promise<ProcedureOutput<TOutput>>;
327
+ }
328
+
329
+ /** The end of the chain: the validation, the context, the handler and the output. */
330
+ async function runInvocation<TOutput>(invocation: Invocation, options: InvokeOptions): Promise<ProcedureOutput<TOutput>> {
331
+ const { procedure, path, input } = invocation;
332
+ const handler = procedure.handler!;
333
+ if (options.signal?.aborted) throw abortError(path);
334
+
335
+ // The admission: before the input validation, so a refused call learns nothing from its input
336
+ const parent = invocation.parent;
337
+ if (!parent || examinesNestedCall(parent.procedure, parent.capability, invocation.capability)) {
338
+ const refusal = capabilityRefusal(procedure, invocation.capability);
339
+ if (refusal?.reason === "deadline") throw new InvocationError("TIMEOUT", refusal.message, path);
340
+ if (refusal) throw new InvocationError("FORBIDDEN", refusal.message, path, refusal.reason);
341
+ }
342
+
343
+ let data: unknown = input;
344
+ if (!options.inputValidated) {
345
+ // A synchronous schema gives its result at once, so the handler starts before an await
346
+ let parsed = validateSchema(procedure.input, input);
347
+ if (parsed instanceof Promise) parsed = await parsed;
348
+ if (!parsed.ok) {
349
+ throw new InvocationError(
350
+ "VALIDATION_ERROR",
351
+ `Input validation failed for ${pathToKey(path)}: ${parsed.message}`,
352
+ path,
353
+ );
354
+ }
355
+ // A parse makes a new object, without the hidden scope of a raw input (`withScope()`). The
356
+ // scope goes onto the parsed data, so a runner with a Zod schema can read the names of the
357
+ // caller (docs review DOC-10: before, each runner needed its own workaround).
358
+ data = parsed.value === input ? input : withScope(parsed.value, scopeOf(input));
359
+ }
360
+
361
+ // The handler starts here, before the first await (the site's trace depends on it)
362
+ const result: unknown = await handler(data, createProcedureContext(procedure, { ...options, capability: invocation.capability }, invocation));
363
+ // The output filter examines only what leaves the host
364
+ const admit = invocation.depth === 0 ? options.admitItem : undefined;
365
+ if (isAsyncIterable(result)) {
366
+ const items = validatedItems(procedure, result, options.signal);
367
+ return {
368
+ kind: "stream",
369
+ items: (admit ? admittedItems(items, admit, invocation) : items) as AsyncGenerator<TOutput, void, undefined>,
370
+ };
371
+ }
372
+ const value = await validateOutput(procedure, result);
373
+ if (admit && !admit(value, invocation)) {
374
+ throw new InvocationError("FORBIDDEN", `The clearance of the call does not permit the output of ${pathToKey(path)}`, path, "clearance");
375
+ }
376
+ return { kind: "value", value: value as TOutput };
377
+ }
378
+
379
+ /** The items that the output filter of the host admits. */
380
+ async function* admittedItems(
381
+ items: AsyncGenerator<unknown, void, undefined>,
382
+ admit: (item: unknown, invocation: Invocation) => boolean,
383
+ invocation: Invocation,
384
+ ): AsyncGenerator<unknown, void, undefined> {
385
+ for await (const item of items) {
386
+ if (admit(item, invocation)) yield item;
387
+ }
388
+ }
389
+
390
+ /** This function finds the procedure at a path in the registry of the options, then runs it. */
391
+ export async function invokePath<TOutput = unknown>(
392
+ path: ProcedurePath,
393
+ input: unknown,
394
+ options: InvokeOptions = {},
395
+ ): Promise<ProcedureOutput<TOutput>> {
396
+ const procedure = (options.registry ?? PROCEDURE_REGISTRY).get(path);
397
+ if (!procedure) {
398
+ throw new InvocationError("NOT_FOUND", `Procedure not found: ${pathToKey(path)}`, path);
399
+ }
400
+ return invokeProcedure<TOutput>(procedure, input, options);
401
+ }
402
+
403
+ // =============================================================================
404
+ // Consumption
405
+ // =============================================================================
406
+
407
+ /**
408
+ * One value of an output: the value, or the last item of a stream (the "sponge" mode). An
409
+ * empty stream is an error.
410
+ */
411
+ export async function outputValue<T>(output: ProcedureOutput<T>, path: ProcedurePath = []): Promise<T> {
412
+ if (output.kind === "value") return output.value;
413
+ let last: { value: T } | undefined;
414
+ for await (const item of output.items) last = { value: item };
415
+ if (!last) {
416
+ throw new InvocationError("NO_OUTPUT", `Procedure gave no output: ${pathToKey(path)}`, path);
417
+ }
418
+ return last.value;
419
+ }
420
+
421
+ /** Each value of an output: the items of a stream, or the one value. */
422
+ export async function* outputItems<T>(output: ProcedureOutput<T>): AsyncGenerator<T, void, undefined> {
423
+ if (output.kind === "value") {
424
+ yield output.value;
425
+ return;
426
+ }
427
+ yield* output.items;
428
+ }
429
+
430
+ /** The items of an output that `start` gives. Nothing runs until the reader asks for the first item. */
431
+ export async function* streamOutput<T>(start: () => Promise<ProcedureOutput<T>>): AsyncGenerator<T, void, undefined> {
432
+ yield* outputItems(await start());
433
+ }
434
+
435
+ // =============================================================================
436
+ // Context
437
+ // =============================================================================
438
+
439
+ /**
440
+ * The context of a procedure. Its `client` calls other procedures through `invokePath()` with
441
+ * the same options, so the nested calls get the same metadata, signal, rules and interceptors.
442
+ * With an invocation, the nested calls name it as their parent.
443
+ */
444
+ export function createProcedureContext(
445
+ procedure: AnyProcedure,
446
+ options: InvokeOptions = {},
447
+ invocation?: Invocation,
448
+ ): ProcedureContext {
449
+ const nestedOptions: InvokeOptions = invocation ? { ...options, parent: invocation } : options;
450
+ let client: ProcedureClient;
451
+ if (typeof options.client === "function") {
452
+ client = invocation ? options.client(invocation) : registryClient(procedure, nestedOptions);
453
+ } else {
454
+ client = options.client ?? registryClient(procedure, nestedOptions);
455
+ }
456
+ const context: ProcedureContext = {
457
+ metadata: options.metadata ?? {},
458
+ path: procedure.path,
459
+ client,
460
+ registry: options.registry ?? PROCEDURE_REGISTRY,
461
+ capability: options.capability ?? UNLIMITED_CAPABILITY,
462
+ resources: invocation && options.resources ? options.resources(invocation) : (EMPTY_RESOURCES as ResourcesOf),
463
+ };
464
+ if (options.signal) context.signal = options.signal;
465
+ if (options.repository) context.repository = options.repository;
466
+ if (options.onRef) context.onRef = options.onRef;
467
+ // Every context has a bus. With a signal, the waits of the handler on the bus end when the
468
+ // invocation aborts, so a stream handler that waits on ctx.bus.stream() can finish. (Before,
469
+ // no host set ctx.bus: deep dive CORE-15.)
470
+ const bus = options.bus ?? getGlobalEventBus();
471
+ context.bus = options.signal ? withEventBusSignal(bus, options.signal) : bus;
472
+ return context;
473
+ }
474
+
475
+ /** The resources of an invocation when the host gives none. */
476
+ const EMPTY_RESOURCES = Object.freeze({});
477
+
478
+ /** The client of a procedure's context: it runs the nested calls from the registry. */
479
+ function registryClient(caller: AnyProcedure, options: InvokeOptions): ProcedureClient {
480
+ const start = <TOutput>(path: ProcedurePath, input: unknown, callOptions?: NestedCallOptions): Promise<ProcedureOutput<TOutput>> => {
481
+ // The call policy of the host, with the immediate caller (BUGS-2026-07 H18, deep dive MCP-3).
482
+ // It runs before the lookup, so a refused path tells nothing about the procedure.
483
+ const refusal = nestedCallRefusal(caller, path, options);
484
+ if (refusal) {
485
+ return Promise.reject(new InvocationError(refusal.code, refusal.message, path));
486
+ }
487
+ // A nested call gets the capability of its caller, or a narrower one that it asks for
488
+ const narrow = callOptions?.narrow;
489
+ if (!narrow) return invokePath<TOutput>(path, input, options);
490
+ let capability: Capability;
491
+ try {
492
+ capability = narrowCapability(options.capability, narrow, options.clearanceOrder);
493
+ } catch (error) {
494
+ return Promise.reject(error);
495
+ }
496
+ return invokePath<TOutput>(path, input, { ...options, capability });
497
+ };
498
+ return {
499
+ async call<TInput, TOutput>(path: ProcedurePath, input: TInput, callOptions?: NestedCallOptions): Promise<TOutput> {
500
+ return outputValue(await start<TOutput>(path, input, callOptions), path);
501
+ },
502
+ stream<TInput, TOutput>(path: ProcedurePath, input: TInput, callOptions?: NestedCallOptions): AsyncIterable<TOutput> {
503
+ return streamOutput(() => start<TOutput>(path, input, callOptions));
504
+ },
505
+ };
506
+ }
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Procedure modules and explicit registries (architecture review, roadmap 3.1).
3
+ *
4
+ * Importing a package registers nothing (ARCHITECTURE-PROPOSALS-2026-10, P9). A host with its own
5
+ * registry gives it the module of each package: the `./module` entry exports the procedures as
6
+ * data. The global `PROCEDURE_REGISTRY` gets the procedures of a package from its `./register`
7
+ * entry (`import "@procedures/git/register"`).
8
+ *
9
+ * ```ts
10
+ * import { createRegistry, Client, LocalTransport } from "@procedures/client";
11
+ * import gitModule from "@procedures/git/module";
12
+ *
13
+ * const registry = createRegistry(gitModule);
14
+ * const client = new Client(new LocalTransport({ registry })).useRegistry(registry);
15
+ * ```
16
+ *
17
+ * Two registries in one process stay apart: a nested call, `procedure.define` and the expose
18
+ * rule of a server all use the registry of the invocation (`ctx.registry`).
19
+ */
20
+
21
+ import { PROCEDURE_REGISTRY, ProcedureRegistry, RegistryError } from "./registry.js";
22
+ import { coreProcedures } from "./core/index.js";
23
+ import { metaProcedures as definitionProcedures } from "./define-procedure.js";
24
+ import type { AnyProcedure, ProcedureModule, RegistrationOptions } from "./types.js";
25
+
26
+ /**
27
+ * The procedures of `@procedures/client`: the control flow (`client.chain`, `client.map` and the
28
+ * others) and `procedure.define`/`get`/`list`/`delete`. `createRegistry()` always registers this
29
+ * module. `import "@procedures/client/register"` registers it in the global registry.
30
+ */
31
+ export const clientModule: ProcedureModule = {
32
+ name: "@procedures/client",
33
+ procedures: [...coreProcedures, ...definitionProcedures],
34
+ };
35
+
36
+ /** This function gives a module: its procedures, and the modules whose procedures it calls. */
37
+ export function defineModule(
38
+ name: string,
39
+ procedures: readonly AnyProcedure[],
40
+ requires: readonly ProcedureModule[] = []
41
+ ): ProcedureModule {
42
+ return { name, procedures: [...procedures], requires };
43
+ }
44
+
45
+ /**
46
+ * The modules and their required modules, each one time, with each required module before the
47
+ * module that requires it.
48
+ */
49
+ export function moduleClosure(modules: readonly ProcedureModule[]): ProcedureModule[] {
50
+ const ordered: ProcedureModule[] = [];
51
+ const seen = new Set<ProcedureModule>();
52
+ const names = new Set<string>();
53
+ const visit = (module: ProcedureModule, trail: readonly ProcedureModule[]): void => {
54
+ if (seen.has(module)) return;
55
+ // Two copies of one package (two installs) have one name: the first one counts
56
+ if (module.name !== undefined && names.has(module.name)) return;
57
+ if (trail.includes(module)) {
58
+ throw new Error(`Modules require each other in a cycle: ${[...trail, module].map((m) => m.name ?? "?").join(" -> ")}`);
59
+ }
60
+ for (const required of module.requires ?? []) visit(required, [...trail, module]);
61
+ seen.add(module);
62
+ if (module.name !== undefined) names.add(module.name);
63
+ ordered.push(module);
64
+ };
65
+ for (const module of modules) visit(module, []);
66
+ return ordered;
67
+ }
68
+
69
+ /** One module, or a list of modules (a bundle can give a list). */
70
+ export type ModuleInput = ProcedureModule | readonly ProcedureModule[];
71
+
72
+ /**
73
+ * Register the procedures of a module and of its required modules in a registry. A procedure
74
+ * that the registry has already (the same handler, from a module that two modules require) is
75
+ * skipped. Another procedure at the same path is an error.
76
+ */
77
+ export function registerModules(
78
+ registry: ProcedureRegistry,
79
+ modules: readonly ModuleInput[],
80
+ options?: RegistrationOptions
81
+ ): ProcedureRegistry {
82
+ const flat = modules.flatMap((input) => (Array.isArray(input) ? (input as readonly ProcedureModule[]) : [input as ProcedureModule]));
83
+ for (const module of moduleClosure(flat)) {
84
+ for (const procedure of module.procedures) {
85
+ const path = options?.pathPrefix ? [...options.pathPrefix, ...procedure.path] : procedure.path;
86
+ const existing = registry.get(path);
87
+ if (existing && !options?.override) {
88
+ if (existing.handler === procedure.handler) continue;
89
+ throw new RegistryError(
90
+ `Two modules give the procedure ${path.join(".")}: the second one is ${module.name ?? "a module without a name"}`,
91
+ path
92
+ );
93
+ }
94
+ registry.register(procedure, options);
95
+ }
96
+ }
97
+ return registry;
98
+ }
99
+
100
+ /**
101
+ * A new registry with the procedures of `clientModule` (what the global registry has after
102
+ * `import "@procedures/client"`) and of each module, with their required modules.
103
+ */
104
+ export function createRegistry(...modules: ModuleInput[]): ProcedureRegistry {
105
+ return registerModules(new ProcedureRegistry(), [clientModule, ...modules]);
106
+ }
107
+
108
+ /**
109
+ * This function registers the procedures of `clientModule` in a registry: the global registry by
110
+ * default. A procedure that the registry has already stays. The `./register` entry of the package
111
+ * starts this function.
112
+ */
113
+ export function registerClientProcedures(registry: ProcedureRegistry = PROCEDURE_REGISTRY): void {
114
+ for (const procedure of clientModule.procedures) {
115
+ if (!registry.has(procedure.path)) registry.register(procedure);
116
+ }
117
+ }