@procedures/client 0.0.0-stage → 0.1.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 (762) hide show
  1. package/CHANGELOG.md +16 -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 +561 -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 +48 -0
  122. package/dist/browser.d.ts.map +1 -0
  123. package/dist/browser.js +86 -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 +517 -0
  134. package/dist/client/client.d.ts.map +1 -0
  135. package/dist/client/client.js +990 -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 +296 -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/cli/announce.d.ts +67 -0
  458. package/dist/procedures/cli/announce.d.ts.map +1 -0
  459. package/dist/procedures/cli/announce.js +392 -0
  460. package/dist/procedures/cli/announce.js.map +1 -0
  461. package/dist/procedures/cli/discover.d.ts +66 -0
  462. package/dist/procedures/cli/discover.d.ts.map +1 -0
  463. package/dist/procedures/cli/discover.js +310 -0
  464. package/dist/procedures/cli/discover.js.map +1 -0
  465. package/dist/procedures/cli/index.d.ts +13 -0
  466. package/dist/procedures/cli/index.d.ts.map +1 -0
  467. package/dist/procedures/cli/index.js +201 -0
  468. package/dist/procedures/cli/index.js.map +1 -0
  469. package/dist/procedures/cli/init.d.ts +17 -0
  470. package/dist/procedures/cli/init.d.ts.map +1 -0
  471. package/dist/procedures/cli/init.js +336 -0
  472. package/dist/procedures/cli/init.js.map +1 -0
  473. package/dist/procedures/collection/index.d.ts +10 -0
  474. package/dist/procedures/collection/index.d.ts.map +1 -0
  475. package/dist/procedures/collection/index.js +10 -0
  476. package/dist/procedures/collection/index.js.map +1 -0
  477. package/dist/procedures/collection/procedures.d.ts +21 -0
  478. package/dist/procedures/collection/procedures.d.ts.map +1 -0
  479. package/dist/procedures/collection/procedures.js +198 -0
  480. package/dist/procedures/collection/procedures.js.map +1 -0
  481. package/dist/procedures/collection/schemas.d.ts +131 -0
  482. package/dist/procedures/collection/schemas.d.ts.map +1 -0
  483. package/dist/procedures/collection/schemas.js +422 -0
  484. package/dist/procedures/collection/schemas.js.map +1 -0
  485. package/dist/procedures/collection/storage.d.ts +53 -0
  486. package/dist/procedures/collection/storage.d.ts.map +1 -0
  487. package/dist/procedures/collection/storage.js +2 -0
  488. package/dist/procedures/collection/storage.js.map +1 -0
  489. package/dist/procedures/core/array.d.ts +276 -0
  490. package/dist/procedures/core/array.d.ts.map +1 -0
  491. package/dist/procedures/core/array.js +637 -0
  492. package/dist/procedures/core/array.js.map +1 -0
  493. package/dist/procedures/core/comparison.d.ts +85 -0
  494. package/dist/procedures/core/comparison.d.ts.map +1 -0
  495. package/dist/procedures/core/comparison.js +156 -0
  496. package/dist/procedures/core/comparison.js.map +1 -0
  497. package/dist/procedures/core/index.d.ts +261 -0
  498. package/dist/procedures/core/index.d.ts.map +1 -0
  499. package/dist/procedures/core/index.js +585 -0
  500. package/dist/procedures/core/index.js.map +1 -0
  501. package/dist/procedures/core/logic.d.ts +144 -0
  502. package/dist/procedures/core/logic.d.ts.map +1 -0
  503. package/dist/procedures/core/logic.js +169 -0
  504. package/dist/procedures/core/logic.js.map +1 -0
  505. package/dist/procedures/core/math.d.ts +139 -0
  506. package/dist/procedures/core/math.d.ts.map +1 -0
  507. package/dist/procedures/core/math.js +273 -0
  508. package/dist/procedures/core/math.js.map +1 -0
  509. package/dist/procedures/core/meta.d.ts +111 -0
  510. package/dist/procedures/core/meta.d.ts.map +1 -0
  511. package/dist/procedures/core/meta.js +239 -0
  512. package/dist/procedures/core/meta.js.map +1 -0
  513. package/dist/procedures/core/object.d.ts +109 -0
  514. package/dist/procedures/core/object.d.ts.map +1 -0
  515. package/dist/procedures/core/object.js +270 -0
  516. package/dist/procedures/core/object.js.map +1 -0
  517. package/dist/procedures/core/operands.d.ts +51 -0
  518. package/dist/procedures/core/operands.d.ts.map +1 -0
  519. package/dist/procedures/core/operands.js +90 -0
  520. package/dist/procedures/core/operands.js.map +1 -0
  521. package/dist/procedures/core/outputs.d.ts +28 -0
  522. package/dist/procedures/core/outputs.d.ts.map +1 -0
  523. package/dist/procedures/core/outputs.js +42 -0
  524. package/dist/procedures/core/outputs.js.map +1 -0
  525. package/dist/procedures/core/results.d.ts +202 -0
  526. package/dist/procedures/core/results.d.ts.map +1 -0
  527. package/dist/procedures/core/results.js +106 -0
  528. package/dist/procedures/core/results.js.map +1 -0
  529. package/dist/procedures/core/schemas.d.ts +48 -0
  530. package/dist/procedures/core/schemas.d.ts.map +1 -0
  531. package/dist/procedures/core/schemas.js +102 -0
  532. package/dist/procedures/core/schemas.js.map +1 -0
  533. package/dist/procedures/core/string.d.ts +138 -0
  534. package/dist/procedures/core/string.d.ts.map +1 -0
  535. package/dist/procedures/core/string.js +268 -0
  536. package/dist/procedures/core/string.js.map +1 -0
  537. package/dist/procedures/core/type.d.ts +101 -0
  538. package/dist/procedures/core/type.d.ts.map +1 -0
  539. package/dist/procedures/core/type.js +208 -0
  540. package/dist/procedures/core/type.js.map +1 -0
  541. package/dist/procedures/define-procedure.d.ts +187 -0
  542. package/dist/procedures/define-procedure.d.ts.map +1 -0
  543. package/dist/procedures/define-procedure.js +356 -0
  544. package/dist/procedures/define-procedure.js.map +1 -0
  545. package/dist/procedures/define.d.ts +228 -0
  546. package/dist/procedures/define.d.ts.map +1 -0
  547. package/dist/procedures/define.js +300 -0
  548. package/dist/procedures/define.js.map +1 -0
  549. package/dist/procedures/discovery.d.ts +57 -0
  550. package/dist/procedures/discovery.d.ts.map +1 -0
  551. package/dist/procedures/discovery.js +68 -0
  552. package/dist/procedures/discovery.js.map +1 -0
  553. package/dist/procedures/index.d.ts +24 -0
  554. package/dist/procedures/index.d.ts.map +1 -0
  555. package/dist/procedures/index.js +69 -0
  556. package/dist/procedures/index.js.map +1 -0
  557. package/dist/procedures/interceptors.d.ts +82 -0
  558. package/dist/procedures/interceptors.d.ts.map +1 -0
  559. package/dist/procedures/interceptors.js +193 -0
  560. package/dist/procedures/interceptors.js.map +1 -0
  561. package/dist/procedures/invoke.d.ts +127 -0
  562. package/dist/procedures/invoke.d.ts.map +1 -0
  563. package/dist/procedures/invoke.js +277 -0
  564. package/dist/procedures/invoke.js.map +1 -0
  565. package/dist/procedures/module.d.ts +49 -0
  566. package/dist/procedures/module.d.ts.map +1 -0
  567. package/dist/procedures/module.js +93 -0
  568. package/dist/procedures/module.js.map +1 -0
  569. package/dist/procedures/policy.d.ts +70 -0
  570. package/dist/procedures/policy.d.ts.map +1 -0
  571. package/dist/procedures/policy.js +138 -0
  572. package/dist/procedures/policy.js.map +1 -0
  573. package/dist/procedures/ref.d.ts +606 -0
  574. package/dist/procedures/ref.d.ts.map +1 -0
  575. package/dist/procedures/ref.js +895 -0
  576. package/dist/procedures/ref.js.map +1 -0
  577. package/dist/procedures/registry.d.ts +208 -0
  578. package/dist/procedures/registry.d.ts.map +1 -0
  579. package/dist/procedures/registry.js +402 -0
  580. package/dist/procedures/registry.js.map +1 -0
  581. package/dist/procedures/schema.d.ts +126 -0
  582. package/dist/procedures/schema.d.ts.map +1 -0
  583. package/dist/procedures/schema.js +108 -0
  584. package/dist/procedures/schema.js.map +1 -0
  585. package/dist/procedures/storage/adapter.d.ts +148 -0
  586. package/dist/procedures/storage/adapter.d.ts.map +1 -0
  587. package/dist/procedures/storage/adapter.js +214 -0
  588. package/dist/procedures/storage/adapter.js.map +1 -0
  589. package/dist/procedures/storage/api.d.ts +125 -0
  590. package/dist/procedures/storage/api.d.ts.map +1 -0
  591. package/dist/procedures/storage/api.js +220 -0
  592. package/dist/procedures/storage/api.js.map +1 -0
  593. package/dist/procedures/storage/factory.d.ts +134 -0
  594. package/dist/procedures/storage/factory.d.ts.map +1 -0
  595. package/dist/procedures/storage/factory.js +166 -0
  596. package/dist/procedures/storage/factory.js.map +1 -0
  597. package/dist/procedures/storage/hybrid.d.ts +193 -0
  598. package/dist/procedures/storage/hybrid.d.ts.map +1 -0
  599. package/dist/procedures/storage/hybrid.js +519 -0
  600. package/dist/procedures/storage/hybrid.js.map +1 -0
  601. package/dist/procedures/storage/index.d.ts +17 -0
  602. package/dist/procedures/storage/index.d.ts.map +1 -0
  603. package/dist/procedures/storage/index.js +17 -0
  604. package/dist/procedures/storage/index.js.map +1 -0
  605. package/dist/procedures/storage/procedures.d.ts +39 -0
  606. package/dist/procedures/storage/procedures.d.ts.map +1 -0
  607. package/dist/procedures/storage/procedures.js +261 -0
  608. package/dist/procedures/storage/procedures.js.map +1 -0
  609. package/dist/procedures/storage/serialization.d.ts +123 -0
  610. package/dist/procedures/storage/serialization.d.ts.map +1 -0
  611. package/dist/procedures/storage/serialization.js +216 -0
  612. package/dist/procedures/storage/serialization.js.map +1 -0
  613. package/dist/procedures/storage/synced-registry.d.ts +246 -0
  614. package/dist/procedures/storage/synced-registry.d.ts.map +1 -0
  615. package/dist/procedures/storage/synced-registry.js +575 -0
  616. package/dist/procedures/storage/synced-registry.js.map +1 -0
  617. package/dist/procedures/storage/types.d.ts +130 -0
  618. package/dist/procedures/storage/types.d.ts.map +1 -0
  619. package/dist/procedures/storage/types.js +8 -0
  620. package/dist/procedures/storage/types.js.map +1 -0
  621. package/dist/procedures/types.d.ts +370 -0
  622. package/dist/procedures/types.d.ts.map +1 -0
  623. package/dist/procedures/types.js +23 -0
  624. package/dist/procedures/types.js.map +1 -0
  625. package/dist/server/browser-guard.d.ts +69 -0
  626. package/dist/server/browser-guard.d.ts.map +1 -0
  627. package/dist/server/browser-guard.js +103 -0
  628. package/dist/server/browser-guard.js.map +1 -0
  629. package/dist/server/host-policy.d.ts +59 -0
  630. package/dist/server/host-policy.d.ts.map +1 -0
  631. package/dist/server/host-policy.js +82 -0
  632. package/dist/server/host-policy.js.map +1 -0
  633. package/dist/server/index.d.ts +46 -0
  634. package/dist/server/index.d.ts.map +1 -0
  635. package/dist/server/index.js +42 -0
  636. package/dist/server/index.js.map +1 -0
  637. package/dist/server/method.d.ts +24 -0
  638. package/dist/server/method.d.ts.map +1 -0
  639. package/dist/server/method.js +29 -0
  640. package/dist/server/method.js.map +1 -0
  641. package/dist/server/procedure-server.d.ts +212 -0
  642. package/dist/server/procedure-server.d.ts.map +1 -0
  643. package/dist/server/procedure-server.js +323 -0
  644. package/dist/server/procedure-server.js.map +1 -0
  645. package/dist/server/server.d.ts +161 -0
  646. package/dist/server/server.d.ts.map +1 -0
  647. package/dist/server/server.js +279 -0
  648. package/dist/server/server.js.map +1 -0
  649. package/dist/server/types.d.ts +106 -0
  650. package/dist/server/types.d.ts.map +1 -0
  651. package/dist/server/types.js +29 -0
  652. package/dist/server/types.js.map +1 -0
  653. package/package.json +115 -3
  654. package/src/adapters/http/client/index.ts +51 -0
  655. package/src/adapters/http/client/transport.ts +338 -0
  656. package/src/adapters/http/client/types.ts +33 -0
  657. package/src/adapters/http/index.ts +7 -0
  658. package/src/adapters/http/server/index.ts +14 -0
  659. package/src/adapters/http/server/strategies.ts +105 -0
  660. package/src/adapters/http/server/transport.ts +622 -0
  661. package/src/adapters/http/server/types.ts +81 -0
  662. package/src/adapters/http/shared/constants.ts +108 -0
  663. package/src/adapters/http/shared/errors.ts +199 -0
  664. package/src/adapters/http/shared/headers.ts +291 -0
  665. package/src/adapters/http/shared/index.ts +21 -0
  666. package/src/adapters/http/shared/status-codes.ts +212 -0
  667. package/src/adapters/http/shared/strategies.ts +255 -0
  668. package/src/adapters/local/client/index.ts +11 -0
  669. package/src/adapters/local/client/transport.ts +188 -0
  670. package/src/adapters/local/client/types.ts +50 -0
  671. package/src/adapters/metadata.ts +17 -0
  672. package/src/adapters/mock/client/builder.ts +64 -0
  673. package/src/adapters/mock/client/index.ts +19 -0
  674. package/src/adapters/mock/client/transport.ts +352 -0
  675. package/src/adapters/mock/client/types.ts +99 -0
  676. package/src/adapters/websocket/client/index.ts +18 -0
  677. package/src/adapters/websocket/client/transport.ts +733 -0
  678. package/src/adapters/websocket/client/types.ts +235 -0
  679. package/src/adapters/websocket/index.ts +24 -0
  680. package/src/adapters/websocket/server/index.ts +18 -0
  681. package/src/adapters/websocket/server/transport.ts +705 -0
  682. package/src/adapters/websocket/server/types.ts +169 -0
  683. package/src/browser.ts +373 -0
  684. package/src/client/batch-executor.ts +514 -0
  685. package/src/client/call-types.ts +491 -0
  686. package/src/client/client.ts +1202 -0
  687. package/src/client/consumption.ts +288 -0
  688. package/src/client/context.ts +228 -0
  689. package/src/client/errors/README.md +279 -0
  690. package/src/client/errors/codes.ts +88 -0
  691. package/src/client/errors/factory.ts +263 -0
  692. package/src/client/errors/http-errors.ts +601 -0
  693. package/src/client/errors/http-status.ts +82 -0
  694. package/src/client/errors/index.ts +72 -0
  695. package/src/client/errors/registry.ts +595 -0
  696. package/src/client/errors/types.ts +139 -0
  697. package/src/client/index.ts +124 -0
  698. package/src/client/middleware/auth.ts +132 -0
  699. package/src/client/middleware/cache.ts +316 -0
  700. package/src/client/middleware/circuit-breaker.ts +339 -0
  701. package/src/client/middleware/contexts.ts +319 -0
  702. package/src/client/middleware/items.ts +114 -0
  703. package/src/client/middleware/lru.ts +66 -0
  704. package/src/client/middleware/pagination.ts +213 -0
  705. package/src/client/middleware/rate-limit.ts +315 -0
  706. package/src/client/middleware/retry.ts +236 -0
  707. package/src/client/middleware/timeout.ts +308 -0
  708. package/src/client/middleware/tracing.ts +191 -0
  709. package/src/client/route-resolver.ts +407 -0
  710. package/src/client/typed-method.ts +65 -0
  711. package/src/client/typed.ts +140 -0
  712. package/src/client/types.ts +361 -0
  713. package/src/client/validation/index.ts +56 -0
  714. package/src/client/validation/middleware.ts +254 -0
  715. package/src/client/validation/types.ts +162 -0
  716. package/src/events/bus.ts +594 -0
  717. package/src/events/index.ts +67 -0
  718. package/src/events/types.ts +263 -0
  719. package/src/index.ts +33 -0
  720. package/src/middleware/compose.ts +159 -0
  721. package/src/middleware/index.ts +28 -0
  722. package/src/middleware/types.ts +166 -0
  723. package/src/procedures/cli/announce.ts +470 -0
  724. package/src/procedures/cli/discover.ts +390 -0
  725. package/src/procedures/cli/index.ts +229 -0
  726. package/src/procedures/cli/init.ts +370 -0
  727. package/src/procedures/collection/index.ts +51 -0
  728. package/src/procedures/collection/procedures.ts +245 -0
  729. package/src/procedures/collection/schemas.ts +550 -0
  730. package/src/procedures/collection/storage.ts +53 -0
  731. package/src/procedures/core/array.ts +1024 -0
  732. package/src/procedures/core/comparison.ts +263 -0
  733. package/src/procedures/core/index.ts +895 -0
  734. package/src/procedures/core/logic.ts +225 -0
  735. package/src/procedures/core/math.ts +469 -0
  736. package/src/procedures/core/meta.ts +384 -0
  737. package/src/procedures/core/object.ts +427 -0
  738. package/src/procedures/core/operands.ts +119 -0
  739. package/src/procedures/core/outputs.ts +48 -0
  740. package/src/procedures/core/results.ts +296 -0
  741. package/src/procedures/core/schemas.ts +123 -0
  742. package/src/procedures/core/string.ts +458 -0
  743. package/src/procedures/core/type.ts +344 -0
  744. package/src/procedures/define-procedure.ts +531 -0
  745. package/src/procedures/define.ts +387 -0
  746. package/src/procedures/discovery.ts +76 -0
  747. package/src/procedures/index.ts +228 -0
  748. package/src/procedures/interceptors.ts +272 -0
  749. package/src/procedures/invoke.ts +413 -0
  750. package/src/procedures/module.ts +107 -0
  751. package/src/procedures/policy.ts +171 -0
  752. package/src/procedures/ref.ts +1305 -0
  753. package/src/procedures/registry.ts +473 -0
  754. package/src/procedures/schema.ts +225 -0
  755. package/src/procedures/types.ts +485 -0
  756. package/src/server/browser-guard.ts +147 -0
  757. package/src/server/host-policy.ts +121 -0
  758. package/src/server/index.ts +70 -0
  759. package/src/server/method.ts +33 -0
  760. package/src/server/procedure-server.ts +417 -0
  761. package/src/server/server.ts +364 -0
  762. package/src/server/types.ts +147 -0
@@ -0,0 +1,990 @@
1
+ /**
2
+ * Universal Client
3
+ *
4
+ * Protocol-agnostic RPC client with middleware composition.
5
+ * Works with any transport: HTTP, gRPC, WebSocket, or local.
6
+ *
7
+ * The Client class is generic over its accumulated context type, enabling
8
+ * compile-time validation of middleware chains. Each call to `use()` returns
9
+ * a new type that includes the middleware's provided context.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * // Type accumulates as middleware is added
14
+ * const client = new Client(transport)
15
+ * .use(createRetryMiddleware()) // Client<BaseContext & RetryContext>
16
+ * .use(createCacheMiddleware({ methods: ["users.get"] })) // Client<... & CacheContext>
17
+ * .use(createAuthMiddleware(...)) // Client<... & AuthContext>
18
+ *
19
+ * // Middleware requiring context validates at compile time
20
+ * client.use(middlewareThatRequiresAuth); // OK if AuthContext is in chain
21
+ *
22
+ * // Context passing via withContext() and per-call options
23
+ * const authedClient = client.withContext({ auth: { token: "user-token" } });
24
+ * await authedClient.call(method, payload, { context: { retry: { maxAttempts: 5 } } });
25
+ * ```
26
+ */
27
+ import { ClientError } from "./types.js";
28
+ import { compose } from "../middleware/compose.js";
29
+ import { pathToMethod } from "../server/method.js";
30
+ import { mergeContext, normalizeCallOptions } from "./context.js";
31
+ import { methodToKey } from "./validation/types.js";
32
+ import { SCHEMA_REGISTRY } from "./validation/middleware.js";
33
+ import { buildResponse, toMiddlewareContext } from "./call-types.js";
34
+ import { RouteResolver } from "./route-resolver.js";
35
+ import { BatchExecutor } from "./batch-executor.js";
36
+ import { PROCEDURE_REGISTRY } from "../procedures/registry.js";
37
+ import { validateSchema } from "../procedures/schema.js";
38
+ import { InvocationError, invokeProcedure, outputItems, outputValue, } from "../procedures/invoke.js";
39
+ import { isHandlerConfig, isStreamConfig } from "./consumption.js";
40
+ import { isAnyProcedureRef, isPlainObject, normalizeRef, prepareRootCall, rawInputRule, } from "../procedures/ref.js";
41
+ /** Each element of each array item: the stream form of an `outputMode: "batch"` procedure. */
42
+ async function* batchElements(items) {
43
+ for await (const item of items) {
44
+ if (Array.isArray(item)) {
45
+ yield* item;
46
+ }
47
+ else {
48
+ yield item;
49
+ }
50
+ }
51
+ }
52
+ /**
53
+ * The items of a source, with up to `size` items read ahead of the reader. With size 0, the
54
+ * source runs only when the reader reads (the source itself is returned).
55
+ */
56
+ function readAhead(source, size) {
57
+ if (size <= 0)
58
+ return source;
59
+ return (async function* () {
60
+ const iterator = source[Symbol.asyncIterator]();
61
+ const buffer = [];
62
+ let ended = false;
63
+ const pull = () => {
64
+ while (!ended && buffer.length < size + 1) {
65
+ const next = iterator.next();
66
+ buffer.push(next);
67
+ // The handler marks the end, and keeps a failure from being unhandled until it is read
68
+ next.then((result) => {
69
+ if (result.done)
70
+ ended = true;
71
+ }, () => {
72
+ ended = true;
73
+ });
74
+ }
75
+ };
76
+ let finished = false;
77
+ try {
78
+ // Before each read: the item for the reader, and `size` items ahead
79
+ for (pull(); buffer.length > 0; pull()) {
80
+ const result = await buffer.shift();
81
+ if (result.done)
82
+ break;
83
+ yield result.value;
84
+ }
85
+ finished = true;
86
+ }
87
+ finally {
88
+ if (!finished)
89
+ await iterator.return?.();
90
+ }
91
+ })();
92
+ }
93
+ /**
94
+ * Generate a unique message ID.
95
+ */
96
+ function generateId() {
97
+ return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;
98
+ }
99
+ /**
100
+ * Universal Client for protocol-agnostic RPC.
101
+ *
102
+ * Features:
103
+ * - Works with any transport (HTTP, gRPC, WebSocket, local)
104
+ * - Middleware composition (retry, cache, timeout, custom)
105
+ * - Stream-first API (single response = stream with 1 item)
106
+ * - Type-safe request/response handling
107
+ * - **Type-accumulating middleware**: Context types build through `use()` calls
108
+ *
109
+ * @typeParam TContext - Accumulated context type from applied middleware.
110
+ * Starts as `{}` and grows as middleware is added via `use()`.
111
+ *
112
+ * @example
113
+ * ```typescript
114
+ * // HTTP client with type-accumulating middleware
115
+ * const client = new Client({ transport: new HttpTransport({ baseUrl: "/api" }) })
116
+ * .use(createRetryMiddleware()) // Client<{} & RetryContext>
117
+ * .use(createCacheMiddleware({ methods: ["users.get"] })) // Client<{} & RetryContext & CacheContext>
118
+ * .use(createAuthMiddleware({ // Client<... & AuthContext>
119
+ * token: "abc123"
120
+ * }));
121
+ *
122
+ * // The client type now carries all middleware context
123
+ * const user = await client.call(
124
+ * { service: "users", operation: "get" },
125
+ * { id: 123 }
126
+ * );
127
+ *
128
+ * // Streaming
129
+ * for await (const event of client.stream(
130
+ * { service: "events", operation: "watch" },
131
+ * { topic: "orders" }
132
+ * )) {
133
+ * console.log(event);
134
+ * }
135
+ * ```
136
+ */
137
+ export class Client {
138
+ transport;
139
+ middleware = [];
140
+ defaultMetadata;
141
+ throwOnError;
142
+ /** The bus of the local procedures. Undefined: the global bus. */
143
+ bus;
144
+ /** The interceptors of the local invocations (roadmap 1.2) */
145
+ interceptors = [];
146
+ /**
147
+ * Context values set via withContext().
148
+ * Merged with parent context when creating child clients.
149
+ */
150
+ clientContext;
151
+ /**
152
+ * Parent client reference (for context inheritance).
153
+ * When set, middleware and transport are shared, only context differs.
154
+ */
155
+ parent;
156
+ constructor(options) {
157
+ // Support both new Client(transport) and new Client({ transport, ... })
158
+ if ("send" in options && typeof options.send === "function") {
159
+ // Direct transport passed - narrow to Transport type
160
+ const transport = options;
161
+ this.transport = transport;
162
+ this.defaultMetadata = {};
163
+ this.throwOnError = true;
164
+ }
165
+ else {
166
+ // Options object - narrow to ClientOptions type
167
+ const opts = options;
168
+ this.transport = opts.transport;
169
+ this.defaultMetadata = opts.defaultMetadata || {};
170
+ this.throwOnError = opts.throwOnError !== false;
171
+ this.bus = opts.bus;
172
+ this.interceptors = opts.interceptors ?? [];
173
+ }
174
+ // Initialize empty context (child clients override this)
175
+ this.clientContext = {};
176
+ }
177
+ /**
178
+ * Create a child client from this client (private, for withContext).
179
+ */
180
+ static createChild(parent, additionalContext) {
181
+ // Create a child with shared middleware chain
182
+ const child = Object.create(Client.prototype);
183
+ // Share immutable references (no copying)
184
+ child.transport = parent.transport;
185
+ child.middleware = parent.middleware;
186
+ child.defaultMetadata = parent.defaultMetadata;
187
+ child.throwOnError = parent.throwOnError;
188
+ child.bus = parent.bus;
189
+ child.interceptors = parent.interceptors;
190
+ // Object.create() bypasses class-field initializers, so procedureRegistry (which normally
191
+ // defaults to PROCEDURE_REGISTRY via a field initializer) would be undefined on the child
192
+ // and exec()/route() would throw "Cannot read properties of undefined (reading 'get')".
193
+ // Inherit the parent's registry; leave the lazy resolver/executor undefined so the child
194
+ // builds its own (batchExecutor binds this.executeProcedure, which must be the child's).
195
+ // See documentation/BUGS-2026-07.md (H1).
196
+ child.procedureRegistry = parent.procedureRegistry;
197
+ child.routeResolver = undefined;
198
+ child.batchExecutor = undefined;
199
+ // Set parent and additional context
200
+ child.parent = parent;
201
+ child.clientContext = additionalContext;
202
+ return child;
203
+ }
204
+ /**
205
+ * Create a child client with additional context.
206
+ *
207
+ * Child clients:
208
+ * - Share the middleware chain (cheap to create)
209
+ * - Inherit parent context (merged recursively)
210
+ * - Can override specific context fields
211
+ *
212
+ * Context priority (lowest to highest):
213
+ * 1. Middleware defaults (e.g., maxRetries: 3 from createRetryMiddleware)
214
+ * 2. Parent client context (full inheritance chain)
215
+ * 3. This client's context
216
+ * 4. Per-call context override
217
+ *
218
+ * @param context - Context to set/override on the child client
219
+ * @returns New client with accumulated context
220
+ *
221
+ * @example
222
+ * ```typescript
223
+ * // Create authenticated child client
224
+ * const authedClient = client.withContext({
225
+ * auth: { token: "user-token" },
226
+ * timeout: { overall: 5000 }
227
+ * });
228
+ *
229
+ * // Nested children inherit and can override
230
+ * const adminClient = authedClient.withContext({
231
+ * auth: { token: "admin-token" }, // Overrides parent token
232
+ * // timeout inherited from parent
233
+ * });
234
+ * ```
235
+ */
236
+ withContext(context) {
237
+ return Client.createChild(this, context);
238
+ }
239
+ /**
240
+ * Get effective context by merging entire parent chain.
241
+ *
242
+ * @returns Merged context from all ancestors plus this client
243
+ */
244
+ getEffectiveContext() {
245
+ if (this.parent) {
246
+ return mergeContext(this.parent.getEffectiveContext(), this.clientContext);
247
+ }
248
+ return this.clientContext;
249
+ }
250
+ /**
251
+ * Add middleware to the client.
252
+ *
253
+ * Middleware is composed in the order added (onion model):
254
+ * - First added = outermost layer
255
+ * - Last added = innermost layer (closest to transport)
256
+ *
257
+ * **Type Accumulation**: When using `TypedClientMiddleware`, the return type
258
+ * accumulates the middleware's provided context. This enables compile-time
259
+ * validation of middleware chains.
260
+ *
261
+ * @typeParam TProvides - Context type this middleware provides
262
+ * @typeParam TRequires - Context type this middleware requires (must be subset of TContext)
263
+ * @param middleware - Middleware function (typed or untyped)
264
+ * @returns Client with accumulated context type
265
+ *
266
+ * @example
267
+ * ```typescript
268
+ * // Type accumulation example
269
+ * const client = new Client(transport)
270
+ * .use(createTimeoutMiddleware({ overall: 5000 })) // Client<TimeoutContext>
271
+ * .use(createRetryMiddleware()) // Client<TimeoutContext & RetryContext>
272
+ * .use(createCacheMiddleware({ methods: ["users.get"] })); // Client<... & CacheContext>
273
+ *
274
+ * // Middleware ordering (onion model)
275
+ * client
276
+ * .use(timeoutMiddleware()) // Outer: handles timeouts
277
+ * .use(retryMiddleware()) // Middle: handles retries
278
+ * .use(cacheMiddleware()); // Inner: handles caching
279
+ * ```
280
+ */
281
+ use(middleware) {
282
+ this.middleware.push(middleware);
283
+ // Cast is safe because we're just adding type information
284
+ // Runtime behavior is unchanged
285
+ return this;
286
+ }
287
+ /**
288
+ * Make a single RPC call (request/response).
289
+ *
290
+ * The result is the last item of the response stream: the one item of a request/response
291
+ * call, or the final item of a streaming procedure. To read each item, use `stream()`.
292
+ *
293
+ * @param method - Method to invoke
294
+ * @param payload - Request payload
295
+ * @param options - Call options (context override, metadata, signal, schema)
296
+ * OR legacy Metadata object for backward compatibility
297
+ * @returns Response payload
298
+ * @throws {ClientError} if response has error status (when throwOnError=true)
299
+ *
300
+ * @example
301
+ * ```typescript
302
+ * // Simple call
303
+ * const user = await client.call(
304
+ * { service: "users", operation: "get" },
305
+ * { id: 123 }
306
+ * );
307
+ *
308
+ * // With context override
309
+ * const user = await client.call(
310
+ * { service: "users", operation: "get" },
311
+ * { id: 123 },
312
+ * { context: { timeout: { overall: 10000 } } }
313
+ * );
314
+ * ```
315
+ */
316
+ async call(method, payload, options) {
317
+ // The result of a stream is its last item (the "sponge" mode of procedures/types.ts). Every
318
+ // request/response transport yields one item, so its result does not change. (Before, the
319
+ // result was the first item, and a falsy first item - 0, false, "" - threw "No response".)
320
+ let last;
321
+ for await (const item of this.stream(method, payload, options)) {
322
+ last = { value: item };
323
+ }
324
+ if (!last) {
325
+ throw new Error("No response received from stream");
326
+ }
327
+ return last.value;
328
+ }
329
+ // ===========================================================================
330
+ // Procedure Reference Execution (Procedure-as-Data)
331
+ // ===========================================================================
332
+ /**
333
+ * Execute a procedure reference with automatic input hydration.
334
+ *
335
+ * This method supports procedure-as-data: procedures can be passed as inputs
336
+ * to other procedures, composed declaratively via JSON, or imperatively via TypeScript.
337
+ *
338
+ * **Input Hydration**: Any ProcedureRef or `$proc` objects in the input tree
339
+ * are automatically executed and replaced with their results before the
340
+ * main procedure runs.
341
+ *
342
+ * @param refOrPath - Procedure reference, JSON procedure ref, or procedure path
343
+ * @param input - Input for the procedure. With a reference, its fields go over the fields of the reference's input.
344
+ * @returns Output of the procedure
345
+ *
346
+ * @example
347
+ * ```typescript
348
+ * import { proc } from "@procedures/client";
349
+ *
350
+ * // Using proc() builder
351
+ * const result = await client.exec(
352
+ * proc(["git", "add"]).input({ all: true }).build()
353
+ * );
354
+ *
355
+ * // Using JSON format
356
+ * const result = await client.exec({
357
+ * $proc: ["git", "add"],
358
+ * input: { all: true },
359
+ * });
360
+ *
361
+ * // Using path + input (simple form)
362
+ * const result = await client.exec(["git", "add"], { all: true });
363
+ *
364
+ * // Nested procedure refs (hydrated automatically)
365
+ * const result = await client.exec(
366
+ * proc(["dag", "traverse"]).input({
367
+ * visit: proc(["client", "chain"]).input({
368
+ * steps: [
369
+ * proc(["git", "add"]).input({ all: true }).ref,
370
+ * proc(["git", "commit"]).input({ message: "auto" }).ref,
371
+ * ],
372
+ * }).ref,
373
+ * }).build()
374
+ * );
375
+ * ```
376
+ */
377
+ async exec(refOrPath, input, options = {}) {
378
+ const caller = options.onRef ? { onRef: options.onRef } : {};
379
+ const { path, input: hydratedInput } = await this.prepareRef(refOrPath, input, caller);
380
+ return this.execInternal(path, hydratedInput, caller);
381
+ }
382
+ /**
383
+ * Execute a procedure reference and read each output: each item of a streaming procedure, or
384
+ * the one value of another procedure. The input refs run as in `exec()`. Nothing runs until
385
+ * the caller reads the first item.
386
+ *
387
+ * @example
388
+ * ```typescript
389
+ * for await (const line of client.execStream(["logs", "tail"], { file: "app.log" })) {
390
+ * console.log(line);
391
+ * }
392
+ * ```
393
+ */
394
+ execStream(refOrPath, input, options = {}) {
395
+ const self = this;
396
+ const caller = options.onRef ? { onRef: options.onRef } : {};
397
+ return (async function* () {
398
+ const { path, input: hydratedInput } = await self.prepareRef(refOrPath, input, caller);
399
+ yield* self.execStreamInternal(path, hydratedInput, caller);
400
+ })();
401
+ }
402
+ /**
403
+ * The path and the input of a reference, with the refs of the input run (hydrated).
404
+ */
405
+ async prepareRef(refOrPath, input, caller = {}) {
406
+ // Normalize to ProcedureRef
407
+ let ref;
408
+ if (isAnyProcedureRef(refOrPath)) {
409
+ ref = normalizeRef(refOrPath);
410
+ // The fields of `input` go over the fields of the ref's input (before, `input` was ignored)
411
+ if (input !== undefined) {
412
+ ref = {
413
+ ...ref,
414
+ input: isPlainObject(ref.input) && isPlainObject(input) ? { ...ref.input, ...input } : input,
415
+ };
416
+ }
417
+ }
418
+ else if (Array.isArray(refOrPath) && refOrPath.every((s) => typeof s === "string")) {
419
+ // Path array provided, use second argument as input
420
+ ref = {
421
+ [Symbol.for("@mark/procedure")]: true,
422
+ path: refOrPath,
423
+ input: input ?? {},
424
+ };
425
+ }
426
+ else {
427
+ throw new Error("exec() requires a ProcedureRef, $proc JSON, or procedure path array");
428
+ }
429
+ // Create executor function for hydration
430
+ const executor = async (path, inp) => {
431
+ return this.execInternal(path, inp, caller);
432
+ };
433
+ // A procedure that takes its input raw (control flow, the `runs-refs` and `raw-input` tags,
434
+ // `procedure.define`) gets its operand refs RAW: it runs them itself, with correct
435
+ // ordering/laziness/error-scoping. Eagerly hydrating here would run the operands up-front
436
+ // and can hijack an all-refs array into an implicit chain that clobbers `steps`. See
437
+ // documentation/BUGS-2026-07.md (C2, H2, H3, M35). The procedure in the registry decides,
438
+ // also for the refs nested in the input (deep dive CORE-5: before, the last path segment did).
439
+ // The body of a defined procedure starts its root call the same way (prepareRootCall, DOC-3)
440
+ return prepareRootCall(ref, executor, { rawInput: rawInputRule(this.procedureRegistry), onRef: caller.onRef });
441
+ }
442
+ /**
443
+ * The options of a local invocation. The nested calls of the procedure go through this
444
+ * client, so a path without a local handler goes to the transport. The nested calls get the
445
+ * metadata and the signal of the caller: when the caller aborts, its nested work stops. (Before,
446
+ * each nested call started again with no metadata and no signal: deep dive CORE-10.)
447
+ */
448
+ invokeOptions(caller = {}) {
449
+ const self = this;
450
+ // The nested calls get the metadata and the signal of the invocation (an interceptor can
451
+ // change them), and name it as their parent
452
+ const client = (invocation) => {
453
+ const nested = {
454
+ metadata: invocation.metadata,
455
+ signal: invocation.signal,
456
+ parent: invocation,
457
+ onRef: caller.onRef,
458
+ };
459
+ return {
460
+ call: (path, input) => self.execInternal(path, input, nested),
461
+ stream: (path, input) => self.execStreamInternal(path, input, nested),
462
+ };
463
+ };
464
+ return {
465
+ registry: this.procedureRegistry,
466
+ metadata: caller.metadata ?? {},
467
+ signal: caller.signal,
468
+ client,
469
+ bus: this.bus,
470
+ interceptors: this.interceptors,
471
+ parent: caller.parent,
472
+ onRef: caller.onRef,
473
+ };
474
+ }
475
+ /** The call options of a remote call for a caller: its metadata as context, and its signal. */
476
+ remoteCallOptions(caller) {
477
+ const options = { context: (caller.metadata ?? {}) };
478
+ if (caller.signal) {
479
+ options.signal = caller.signal;
480
+ }
481
+ return options;
482
+ }
483
+ /**
484
+ * The input for a procedure without a local handler: validated with the local schema when
485
+ * the registry has the procedure, then sent to the transport.
486
+ */
487
+ async remoteInput(procedure, path, input) {
488
+ if (!procedure)
489
+ return input;
490
+ const result = await validateSchema(procedure.input, input);
491
+ if (!result.ok) {
492
+ throw new InvocationError("VALIDATION_ERROR", `Input validation failed for ${path.join(".")}: ${result.message}`, path);
493
+ }
494
+ return result.value;
495
+ }
496
+ /**
497
+ * Internal procedure execution (no hydration of the top-level input).
498
+ */
499
+ async execInternal(path, input, caller = {}) {
500
+ const procedure = this.procedureRegistry.get(path);
501
+ if (procedure?.handler) {
502
+ const options = this.invokeOptions(caller);
503
+ return outputValue(await invokeProcedure(procedure, input, options), path);
504
+ }
505
+ // No local handler: the transport runs it (a remote procedure)
506
+ return this.call(this.pathToMethod(path), await this.remoteInput(procedure, path, input), this.remoteCallOptions(caller));
507
+ }
508
+ /**
509
+ * Internal streaming execution (no hydration of the top-level input).
510
+ */
511
+ execStreamInternal(path, input, caller = {}) {
512
+ const self = this;
513
+ return (async function* () {
514
+ const procedure = self.procedureRegistry.get(path);
515
+ if (procedure?.handler) {
516
+ const options = self.invokeOptions(caller);
517
+ yield* outputItems(await invokeProcedure(procedure, input, options));
518
+ return;
519
+ }
520
+ yield* self.stream(self.pathToMethod(path), await self.remoteInput(procedure, path, input), self.remoteCallOptions(caller));
521
+ })();
522
+ }
523
+ /**
524
+ * Make a streaming RPC call.
525
+ *
526
+ * Returns an async iterable that yields response payloads.
527
+ * For single request/response, yields exactly one item.
528
+ *
529
+ * @param method - Method to invoke
530
+ * @param payload - Request payload
531
+ * @param options - Call options (context override, metadata, signal, schema)
532
+ * OR legacy Metadata object for backward compatibility
533
+ * @returns Async iterable of response payloads
534
+ * @throws {ClientError} if any response item has error status (when throwOnError=true)
535
+ *
536
+ * @example
537
+ * ```typescript
538
+ * // Streaming response
539
+ * for await (const event of client.stream(
540
+ * { service: "events", operation: "watch" },
541
+ * { topic: "orders" }
542
+ * )) {
543
+ * console.log(event);
544
+ * }
545
+ *
546
+ * // With context and signal
547
+ * const controller = new AbortController();
548
+ * for await (const event of client.stream(
549
+ * { service: "events", operation: "watch" },
550
+ * { topic: "orders" },
551
+ * { context: { timeout: { overall: 30000 } }, signal: controller.signal }
552
+ * )) {
553
+ * console.log(event);
554
+ * }
555
+ * ```
556
+ */
557
+ async *stream(method, payload, options) {
558
+ // Normalize options (backward compatible with legacy Metadata parameter)
559
+ const opts = normalizeCallOptions(options);
560
+ // Merge context: parent chain -> client context -> per-call context
561
+ const effectiveContext = mergeContext(this.getEffectiveContext(), (opts.context ?? {}));
562
+ // Create message with merged context in metadata
563
+ const message = {
564
+ id: generateId(),
565
+ method,
566
+ payload,
567
+ metadata: {
568
+ ...this.defaultMetadata,
569
+ ...effectiveContext, // Context flows into metadata
570
+ ...opts.metadata, // Raw metadata last (highest priority)
571
+ },
572
+ };
573
+ // Set signal if provided
574
+ if (opts.signal) {
575
+ message.signal = opts.signal;
576
+ }
577
+ // Store schema override in metadata for Zod middleware
578
+ if (opts.schema) {
579
+ message.metadata.__schema = opts.schema;
580
+ }
581
+ // Compose middleware chain
582
+ const runner = this.composeMiddleware();
583
+ // Execute through middleware chain
584
+ const context = { message };
585
+ const responseStream = runner(context);
586
+ // Yield payloads, handling errors
587
+ for await (const item of responseStream) {
588
+ if (item.status.type === "error" && this.throwOnError) {
589
+ throw new ClientError(item.status, item.id);
590
+ }
591
+ yield item.payload;
592
+ }
593
+ }
594
+ /**
595
+ * Compose middleware chain using universal middleware composition.
596
+ *
597
+ * @returns Composed runner function
598
+ * @private
599
+ */
600
+ composeMiddleware() {
601
+ // Innermost function: call transport
602
+ const self = this;
603
+ const transportRunner = async function* (context) {
604
+ yield* self.transport.send(context.message);
605
+ };
606
+ // Use universal middleware composition
607
+ // compose(...middleware, finalRunner) applies middleware in order (onion model)
608
+ return compose(...this.middleware, transportRunner);
609
+ }
610
+ /**
611
+ * Get transport name.
612
+ */
613
+ get transportName() {
614
+ return this.transport.name;
615
+ }
616
+ /**
617
+ * Close client and cleanup transport resources.
618
+ */
619
+ async close() {
620
+ await this.transport.close();
621
+ }
622
+ // ===========================================================================
623
+ // Schema Registration (Zod Validation)
624
+ // ===========================================================================
625
+ /**
626
+ * Cached reference to Zod middleware for schema registration.
627
+ */
628
+ zodMiddleware;
629
+ /**
630
+ * Register a validation schema for a specific method.
631
+ *
632
+ * Requires `createZodMiddleware()` to be added via `.use()` first.
633
+ * Schemas are used to validate request payloads before sending and
634
+ * response payloads after receiving.
635
+ *
636
+ * @param method - Method to register schema for
637
+ * @param schemas - Input and/or output Zod schemas
638
+ * @returns this (for chaining)
639
+ *
640
+ * @example
641
+ * ```typescript
642
+ * import { z } from "zod";
643
+ *
644
+ * const client = new Client({ transport })
645
+ * .use(createZodMiddleware())
646
+ * .schema({ service: "users", operation: "get" }, {
647
+ * input: z.object({ id: z.string() }),
648
+ * output: z.object({ id: z.string(), name: z.string() }),
649
+ * })
650
+ * .schema({ service: "users", operation: "create" }, {
651
+ * input: UserCreateSchema,
652
+ * output: UserSchema,
653
+ * });
654
+ *
655
+ * // Validation happens automatically on call
656
+ * const user = await client.call(
657
+ * { service: "users", operation: "get" },
658
+ * { id: "123" } // Validated against input schema
659
+ * );
660
+ * // Response validated against output schema
661
+ * ```
662
+ */
663
+ schema(method, schemas) {
664
+ // Find Zod middleware (lazy lookup, cached)
665
+ if (!this.zodMiddleware) {
666
+ this.zodMiddleware = this.findZodMiddleware();
667
+ }
668
+ if (!this.zodMiddleware) {
669
+ throw new Error("Cannot register schema: createZodMiddleware() must be added via .use() first");
670
+ }
671
+ const key = methodToKey(method);
672
+ this.zodMiddleware[SCHEMA_REGISTRY].set(key, schemas);
673
+ return this;
674
+ }
675
+ /**
676
+ * Find Zod middleware in the middleware chain.
677
+ */
678
+ findZodMiddleware() {
679
+ // Check parent chain first (child clients share middleware)
680
+ if (this.parent) {
681
+ return this.parent.findZodMiddleware();
682
+ }
683
+ return this.middleware.find((m) => SCHEMA_REGISTRY in m);
684
+ }
685
+ // ===========================================================================
686
+ // Nested Route API
687
+ // ===========================================================================
688
+ /**
689
+ * Procedure registry for route resolution.
690
+ * Uses global registry by default.
691
+ */
692
+ procedureRegistry = PROCEDURE_REGISTRY;
693
+ /**
694
+ * Route resolver instance (lazy initialized).
695
+ */
696
+ routeResolver;
697
+ /**
698
+ * Batch executor instance (lazy initialized).
699
+ */
700
+ batchExecutor;
701
+ /**
702
+ * Set a custom procedure registry for this client.
703
+ *
704
+ * @param registry - Procedure registry to use
705
+ * @returns this (for chaining)
706
+ */
707
+ useRegistry(registry) {
708
+ this.procedureRegistry = registry;
709
+ this.routeResolver = undefined; // Reset resolver
710
+ return this;
711
+ }
712
+ /**
713
+ * Set the event bus of the local procedures of this client (`ctx.bus`).
714
+ *
715
+ * @param bus - Event bus for the procedures
716
+ * @returns this (for chaining)
717
+ */
718
+ useBus(bus) {
719
+ this.bus = bus;
720
+ return this;
721
+ }
722
+ /**
723
+ * Make a call using the nested route API.
724
+ *
725
+ * This method supports:
726
+ * - Per-call middleware overrides
727
+ * - Batch execution with configurable strategies
728
+ * - Type-safe nested route structures
729
+ *
730
+ * @param request - Call request with route and options
731
+ * @returns Response mirroring the route structure
732
+ *
733
+ * @example
734
+ * ```typescript
735
+ * // Single route call
736
+ * const result = await client.route({
737
+ * route: {
738
+ * collections: {
739
+ * users: {
740
+ * get: { id: "123" }
741
+ * }
742
+ * }
743
+ * }
744
+ * });
745
+ * // result.collections.users.get.data = { id: "123", name: "John" }
746
+ *
747
+ * // Batched call with middleware overrides
748
+ * const results = await client.route({
749
+ * middlewares: {
750
+ * retry: { attempts: 3 },
751
+ * timeout: { ms: 5000 }
752
+ * },
753
+ * batch: { strategy: 'all' },
754
+ * route: {
755
+ * collections: {
756
+ * users: { get: { id: "123" } },
757
+ * orders: { list: { userId: "123" } }
758
+ * },
759
+ * weather: {
760
+ * forecast: { city: "NYC", days: 5 }
761
+ * }
762
+ * }
763
+ * });
764
+ * ```
765
+ */
766
+ async route(request) {
767
+ const resolver = this.getRouteResolver();
768
+ const executor = this.getBatchExecutor();
769
+ // Resolve routes to procedures
770
+ const resolution = resolver.resolve(request.route);
771
+ if (!resolution.success) {
772
+ return buildResponse(this.resolutionFailure(resolution));
773
+ }
774
+ // Create execution context
775
+ const context = this.createExecutionContext(request);
776
+ // Execute routes
777
+ const batchConfig = request.batch ?? { strategy: "all" };
778
+ const result = await executor.executeBatch(resolution.resolved, context, batchConfig);
779
+ return result.response;
780
+ }
781
+ /**
782
+ * Make a streaming call using the nested route API.
783
+ *
784
+ * Returns an async iterator that yields results as they complete,
785
+ * plus a promise for the final complete response.
786
+ *
787
+ * @param request - Call request (batch.strategy should be 'stream')
788
+ * @returns Streaming response with iterator and completion promise
789
+ */
790
+ routeStream(request) {
791
+ const resolver = this.getRouteResolver();
792
+ const executor = this.getBatchExecutor();
793
+ const resolution = resolver.resolve(request.route);
794
+ if (!resolution.success) {
795
+ // Return error response immediately
796
+ const errorResults = this.resolutionFailure(resolution);
797
+ return {
798
+ results: (async function* () {
799
+ for (const [path, result] of errorResults) {
800
+ yield { path, result };
801
+ }
802
+ })(),
803
+ complete: Promise.resolve(buildResponse(errorResults)),
804
+ };
805
+ }
806
+ const context = this.createExecutionContext(request);
807
+ const streamConfig = request.batch ?? { strategy: "stream" };
808
+ return executor.getStreamingResponse(resolution.resolved, context, streamConfig);
809
+ }
810
+ /**
811
+ * The results of a route that did not resolve: an error for each leaf that failed, and
812
+ * `SKIPPED` for every other leaf, also the leaves after a validation error. (Before, the leaves
813
+ * after a validation error were missing: deep dive CORE-14.)
814
+ */
815
+ resolutionFailure(resolution) {
816
+ const skipped = (path) => ({
817
+ success: false,
818
+ error: { code: "SKIPPED", message: "Skipped due to other route errors", retryable: false, path },
819
+ });
820
+ const results = resolution.errors.map((error) => [
821
+ error.path,
822
+ {
823
+ success: false,
824
+ error: {
825
+ code: error.type === "not_found" ? "NOT_FOUND" : "VALIDATION_ERROR",
826
+ message: error.message,
827
+ retryable: false,
828
+ path: error.path,
829
+ },
830
+ },
831
+ ]);
832
+ for (const resolved of resolution.resolved)
833
+ results.push([resolved.path, skipped(resolved.path)]);
834
+ for (const path of resolution.skipped)
835
+ results.push([path, skipped(path)]);
836
+ return results;
837
+ }
838
+ /**
839
+ * Get the route resolver (lazy initialization).
840
+ */
841
+ getRouteResolver() {
842
+ if (!this.routeResolver) {
843
+ this.routeResolver = new RouteResolver(this.procedureRegistry);
844
+ }
845
+ return this.routeResolver;
846
+ }
847
+ /**
848
+ * Get the batch executor (lazy initialization).
849
+ */
850
+ getBatchExecutor() {
851
+ if (!this.batchExecutor) {
852
+ this.batchExecutor = new BatchExecutor(this.executeProcedure.bind(this));
853
+ }
854
+ return this.batchExecutor;
855
+ }
856
+ /**
857
+ * Create execution context from call request.
858
+ */
859
+ createExecutionContext(request) {
860
+ // Merge context: parent chain -> client context -> middleware overrides. The override keys
861
+ // become the keys that the middleware reads (deep dive CORE-14). No internal key goes into
862
+ // the metadata: a handler sees it as ctx.metadata (deep dive CORE-10).
863
+ const effectiveContext = mergeContext(this.getEffectiveContext(), toMiddlewareContext(request.middlewares));
864
+ const context = {
865
+ metadata: {
866
+ ...this.defaultMetadata,
867
+ ...effectiveContext,
868
+ },
869
+ };
870
+ // Only set signal if provided (exactOptionalPropertyTypes)
871
+ if (request.signal) {
872
+ context.signal = request.signal;
873
+ }
874
+ return context;
875
+ }
876
+ /**
877
+ * Execute a single procedure call.
878
+ * Used by BatchExecutor.
879
+ *
880
+ * The `out` config of the route leaf chooses the result (BUGS-2026-07 H8):
881
+ * - sponge (the default): the value, or the last item of a stream (or `accumulate` of all items);
882
+ * - stream: `data` is an AsyncIterable of the items. The procedure starts when the reader reads.
883
+ * With `bufferSize`, that many items are read ahead of the reader;
884
+ * - handlers: `progress` gets each item but the last, `complete` gets the last, `error` gets the error.
885
+ *
886
+ * A procedure with `outputMode: "batch"` returns an array: sponge gives the array, and stream
887
+ * gives each element.
888
+ */
889
+ async executeProcedure(resolved, context) {
890
+ const { path, outputConfig } = resolved;
891
+ try {
892
+ const items = this.routeItems(resolved, context);
893
+ if (isStreamConfig(outputConfig)) {
894
+ const elements = resolved.procedure.outputMode === "batch" ? batchElements(items) : items;
895
+ return { success: true, data: readAhead(elements, outputConfig.bufferSize ?? 0) };
896
+ }
897
+ if (isHandlerConfig(outputConfig)) {
898
+ return { success: true, data: await this.consumeWithHandlers(items, outputConfig, path) };
899
+ }
900
+ return { success: true, data: await this.sponge(items, outputConfig, path) };
901
+ }
902
+ catch (error) {
903
+ return {
904
+ success: false,
905
+ error: {
906
+ code: error instanceof ClientError || error instanceof InvocationError ? error.code : "EXECUTION_ERROR",
907
+ message: error instanceof Error ? error.message : String(error),
908
+ retryable: error instanceof ClientError ? error.retryable : false,
909
+ path,
910
+ },
911
+ };
912
+ }
913
+ }
914
+ /**
915
+ * The output items of a resolved route: from the local handler, or from the transport.
916
+ */
917
+ routeItems(resolved, context) {
918
+ const self = this;
919
+ const { path, procedure, input } = resolved;
920
+ return (async function* () {
921
+ if (procedure.handler) {
922
+ // The resolver validated the input already (not an asynchronous schema: see ResolvedRoute)
923
+ const options = {
924
+ ...self.invokeOptions({ metadata: context.metadata, signal: context.signal }),
925
+ inputValidated: resolved.inputValidated !== false,
926
+ };
927
+ yield* outputItems(await invokeProcedure(procedure, input, options));
928
+ return;
929
+ }
930
+ const callOptions = { context: context.metadata };
931
+ if (context.signal) {
932
+ callOptions.signal = context.signal;
933
+ }
934
+ yield* self.stream(self.pathToMethod(path), input, callOptions);
935
+ })();
936
+ }
937
+ /** The sponge mode: the last item, or `accumulate` of all items. */
938
+ async sponge(items, config, path) {
939
+ const accumulate = "type" in config && config.type === "sponge" ? config.accumulate : undefined;
940
+ const all = [];
941
+ let last;
942
+ for await (const item of items) {
943
+ last = { value: item };
944
+ if (accumulate)
945
+ all.push(item);
946
+ }
947
+ if (!last) {
948
+ throw new InvocationError("NO_OUTPUT", `Procedure gave no output: ${path.join(".")}`, path);
949
+ }
950
+ return accumulate ? accumulate(all.slice(0, -1), last.value) : last.value;
951
+ }
952
+ /** The handlers mode: `progress` for each item but the last, then `complete`, or `error`. */
953
+ async consumeWithHandlers(items, config, path) {
954
+ let previous;
955
+ try {
956
+ for await (const item of items) {
957
+ if (previous)
958
+ await this.deliver(config.progress, previous.value);
959
+ previous = { value: item };
960
+ }
961
+ }
962
+ catch (error) {
963
+ await this.deliver(config.error, error instanceof Error ? error : new Error(String(error)));
964
+ throw error;
965
+ }
966
+ if (!previous) {
967
+ throw new InvocationError("NO_OUTPUT", `Procedure gave no output: ${path.join(".")}`, path);
968
+ }
969
+ await this.deliver(config.complete, previous.value);
970
+ return previous.value;
971
+ }
972
+ /** A handler callback gets the data: a function, or a procedure path (the data is its input). */
973
+ async deliver(callback, data) {
974
+ if (callback === undefined)
975
+ return;
976
+ if (Array.isArray(callback)) {
977
+ await this.execInternal(callback, data);
978
+ return;
979
+ }
980
+ await callback(data);
981
+ }
982
+ /**
983
+ * Convert procedure path to Method object.
984
+ */
985
+ pathToMethod(path) {
986
+ // The one mapping of every host (deep dive architecture review 3.3)
987
+ return pathToMethod(path);
988
+ }
989
+ }
990
+ //# sourceMappingURL=client.js.map