@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
package/README.md CHANGED
@@ -1,3 +1,833 @@
1
- # Temporary Holding Version
1
+ # @procedures/client
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ [![npm version](https://img.shields.io/npm/v/@procedures/client.svg)](https://www.npmjs.com/package/@procedures/client)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.7-blue.svg)](https://www.typescriptlang.org/)
6
+ [![Node.js](https://img.shields.io/badge/Node.js-22+-green.svg)](https://nodejs.org/)
7
+
8
+ **Universal protocol-agnostic RPC client/server with middleware composition, type-safe procedures, streaming and procedure-as-data.**
9
+
10
+ The core depends on no other package of the repository. The procedure components are in [`@procedures/splay`](../client-splay), the data structures in [`@procedures/collections`](../client-collections), and the program store with the storage layer in [`@procedures/store`](../client-store).
11
+
12
+ ## Table of Contents
13
+
14
+ - [Overview](#overview)
15
+ - [Installation](#installation)
16
+ - [Architecture](#architecture)
17
+ - [Core Concepts](#core-concepts)
18
+ - [API Reference](#api-reference)
19
+ - [Examples](#examples)
20
+ - [Integration](#integration)
21
+
22
+ ## Overview
23
+
24
+ `@procedures/client` is the foundational package of the Mark ecosystem, providing a complete RPC framework with:
25
+
26
+ - **Universal Client/Server**: Protocol-agnostic RPC supporting HTTP, WebSocket, gRPC, and local transports
27
+ - **Type-Safe Procedures**: Schema-validated procedures with auto-discovery and registry management
28
+ - **Middleware System**: Composable middleware for retry, cache, timeout, circuit breaker, rate limiting, auth, tracing, and validation
29
+ - **Procedure-as-Data**: JSON programs of calls, references and control flow ([PROGRAM-FORMAT.md](../documentation/PROGRAM-FORMAT.md))
30
+ - **Event Bus**: Pub/sub messaging with async iteration support
31
+ - **Error System**: 70+ error codes with rich metadata and recovery suggestions
32
+
33
+ ## Installation
34
+
35
+ ```bash
36
+ npm install github:mark1russell7/client#main
37
+ ```
38
+
39
+ **Peer Dependencies:**
40
+ - `zod` ^3.0.0 (optional, for validation)
41
+ - `express` ^4.0.0 || ^5.0.0 (optional, for HTTP server)
42
+
43
+ ## Architecture
44
+
45
+ ```mermaid
46
+ graph TB
47
+ subgraph "Application Layer"
48
+ Procedures[Procedure System<br/>Type-safe RPC definitions]
49
+ Events[Event Bus<br/>Pub/sub messaging]
50
+ end
51
+
52
+ subgraph "Client/Server Core"
53
+ Client[Universal Client&lt;TContext&gt;<br/>Protocol-agnostic RPC]
54
+ Server[Universal Server<br/>Handler registry]
55
+ Middleware[Middleware Chain<br/>Composable behaviors]
56
+ end
57
+
58
+ subgraph "Transport Layer"
59
+ HTTP[HTTP Transport<br/>RESTful + POST-only]
60
+ WebSocket[WebSocket Transport<br/>Bidirectional streaming]
61
+ Local[Local Transport<br/>In-process calls]
62
+ Mock[Mock Transport<br/>Testing]
63
+ end
64
+
65
+ Procedures --> Client
66
+ Procedures --> Server
67
+ Events -.-> Client
68
+
69
+ Client --> Middleware
70
+ Server --> Middleware
71
+ Middleware --> HTTP
72
+ Middleware --> WebSocket
73
+ Middleware --> Local
74
+ Middleware --> Mock
75
+
76
+ ```
77
+
78
+ ### Data Flow
79
+
80
+ ```mermaid
81
+ sequenceDiagram
82
+ participant App as Application
83
+ participant Client as Client
84
+ participant MW as Middleware Chain
85
+ participant Transport as Transport
86
+ participant Server as Server
87
+ participant Handler as Procedure Handler
88
+
89
+ App->>Client: call(method, payload)
90
+ Client->>MW: compose middleware
91
+ MW->>MW: retry, cache, timeout, auth...
92
+ MW->>Transport: send(message)
93
+ Transport->>Server: HTTP/WS/etc
94
+ Server->>Handler: execute handler
95
+ Handler-->>Server: result
96
+ Server-->>Transport: response
97
+ Transport-->>MW: response stream
98
+ MW-->>Client: unwrap/validate
99
+ Client-->>App: result
100
+ ```
101
+
102
+ ## Core Concepts
103
+
104
+ ### 1. Universal Client
105
+
106
+ The `Client` class provides protocol-agnostic RPC with type-safe middleware composition:
107
+
108
+ - Generic over accumulated context type `Client<TContext>`
109
+ - Middleware chain builds type information through `.use()`
110
+ - Context inheritance via `.withContext()`
111
+ - Supports streaming and single request/response
112
+
113
+ ### 2. Procedure System
114
+
115
+ Type-safe RPC procedure definitions with:
116
+ - Schema validation (Zod)
117
+ - Auto-discovery via package.json
118
+ - Handler execution (local or remote)
119
+ - Procedure-as-data (procedure references)
120
+
121
+ ### 3. Middleware Composition
122
+
123
+ Onion-model middleware with:
124
+ - Type accumulation (`Client<BaseContext & RetryContext & ...>`)
125
+ - Context propagation (parent → client → per-call)
126
+ - Built-in middleware for common patterns
127
+
128
+ ### 4. Call Policy and Interceptors
129
+
130
+ A host controls which procedures its callers reach, also through nested calls. See [docs/POLICY.md](docs/POLICY.md).
131
+ - `expose`: the procedures that the callers of a server can reach.
132
+ - A data-driven procedure (`client.chain`) calls only exposed procedures.
133
+ - A procedure of code declares its nested calls in `metadata.calls`. With `strictCalls`, a procedure that declares nothing calls only exposed procedures.
134
+ - Interceptors run around each invocation and its nested calls: `timeoutInterceptor`, `tracingInterceptor`, `metricsInterceptor`.
135
+
136
+ ### 5. Related Packages
137
+
138
+ - `@procedures/collections`: data structures (`List`, `Map`, `Set`, `Queue`) and composable behaviors (LRU, TTL, bounded, evented).
139
+ - `@procedures/splay`: the procedure components, serializable UI descriptors (`defineComponent`, `simpleComponent`, `streamingComponent`).
140
+ - `@procedures/store`: the program store (`procedure.store`, `load`, `sync`), `ApiStorage`, `HybridStorage` and the synced registry.
141
+
142
+ ## Quick Start
143
+
144
+ ### Client
145
+
146
+ ```typescript
147
+ import { Client, HttpTransport } from "@procedures/client";
148
+
149
+ const client = new Client({
150
+ transport: new HttpTransport({ baseUrl: "https://api.example.com" })
151
+ })
152
+ .use(createRetryMiddleware({ maxRetries: 3 }))
153
+ .use(createAuthMiddleware({ token: "abc123" }));
154
+
155
+ // RPC call
156
+ const user = await client.call({ service: "users", operation: "get" }, { id: "123" });
157
+
158
+ // Streaming
159
+ for await (const event of client.stream({ service: "events", operation: "watch" }, {})) {
160
+ console.log(event);
161
+ }
162
+ ```
163
+
164
+ ### Procedures
165
+
166
+ ```typescript
167
+ import { defineProcedure, registerProcedures } from "client";
168
+ import { z } from "zod";
169
+
170
+ const getUserProcedure = defineProcedure({
171
+ path: ["users", "get"],
172
+ input: z.object({ id: z.string() }),
173
+ output: z.object({ id: z.string(), name: z.string() }),
174
+ handler: async ({ id }, ctx) => {
175
+ return await db.users.findById(id);
176
+ },
177
+ });
178
+
179
+ registerProcedures([getUserProcedure]);
180
+ ```
181
+
182
+ ## API Reference
183
+
184
+ ### Client
185
+
186
+ #### `class Client<TContext = {}>`
187
+
188
+ Universal RPC client with type-safe middleware composition.
189
+
190
+ **Constructor:**
191
+ ```typescript
192
+ new Client(options: ClientOptions | Transport)
193
+
194
+ interface ClientOptions {
195
+ transport: Transport;
196
+ defaultMetadata?: Metadata;
197
+ throwOnError?: boolean; // default: true
198
+ }
199
+ ```
200
+
201
+ **Methods:**
202
+ ```typescript
203
+ // Add middleware (returns new typed client)
204
+ use<TProvides>(middleware: ClientMiddleware): Client<TContext & TProvides>
205
+
206
+ // Create child client with additional context
207
+ withContext<TAdditional>(context: TAdditional): Client<TContext & TAdditional>
208
+
209
+ // Make RPC call (request/response)
210
+ call<TReq, TRes>(method: Method, payload: TReq, options?: CallOptions): Promise<TRes>
211
+
212
+ // Make streaming RPC call
213
+ stream<TReq, TRes>(method: Method, payload: TReq, options?: CallOptions): AsyncIterable<TRes>
214
+
215
+ // Execute procedure by path or reference
216
+ exec<TOutput>(refOrPath: ProcedureRef | ProcedurePath, input?: unknown): Promise<TOutput>
217
+
218
+ // Nested route API (batch calls with middleware overrides)
219
+ route<TRoute>(request: CallRequest<TRoute>): Promise<CallResponse<TRoute>>
220
+ routeStream<TRoute>(request: CallRequest<TRoute>): StreamingCallResponse<TRoute>
221
+
222
+ // Register validation schema (requires Zod middleware)
223
+ schema(method: Method, schemas: { input?: ZodSchema; output?: ZodSchema }): this
224
+
225
+ // Set custom procedure registry
226
+ useRegistry(registry: ProcedureRegistry): this
227
+
228
+ // Close transport
229
+ close(): Promise<void>
230
+ ```
231
+
232
+ ### Transports
233
+
234
+ #### `HttpTransport`
235
+ ```typescript
236
+ new HttpTransport(options: HttpTransportOptions)
237
+
238
+ interface HttpTransportOptions {
239
+ baseUrl: string;
240
+ urlStrategy?: UrlStrategy; // default: defaultUrlPattern
241
+ httpMethodStrategy?: HttpMethodStrategy; // default: restfulHttpMethodStrategy
242
+ headers?: Record<string, string>;
243
+ fetch?: typeof fetch;
244
+ }
245
+ ```
246
+
247
+ #### `WebSocketTransport`
248
+ ```typescript
249
+ new WebSocketTransport(options: WebSocketTransportOptions)
250
+
251
+ interface WebSocketTransportOptions {
252
+ url: string;
253
+ protocols?: string[];
254
+ reconnect?: boolean; // default: true
255
+ reconnectDelay?: number; // default: 1000ms
256
+ heartbeatInterval?: number; // default: 30000ms
257
+ }
258
+ ```
259
+
260
+ #### `LocalTransport`
261
+ ```typescript
262
+ new LocalTransport(options: LocalTransportOptions)
263
+
264
+ interface LocalTransportOptions {
265
+ handlers: Map<string, Handler>;
266
+ }
267
+ ```
268
+
269
+ #### `MockTransport`
270
+ ```typescript
271
+ new MockTransport(options?: MockTransportOptions)
272
+
273
+ // Use builder for mocking
274
+ mockBuilder()
275
+ .method({ service: "users", operation: "get" })
276
+ .response({ id: "123", name: "Alice" })
277
+ .times(3)
278
+ .delay(100)
279
+ .build()
280
+ ```
281
+
282
+ ### Middleware
283
+
284
+ #### Retry Middleware
285
+ ```typescript
286
+ createRetryMiddleware(options?: RetryOptions)
287
+
288
+ interface RetryOptions {
289
+ maxRetries?: number; // default: 3
290
+ retryDelay?: number; // default: 1000ms (the base delay)
291
+ backoffMultiplier?: number; // default: 2
292
+ maxDelay?: number; // default: no limit
293
+ jitter?: number; // default: 0.1 (a fraction of the delay)
294
+ shouldRetry?: (item: ResponseItem<unknown>, attempt: number) => boolean;
295
+ }
296
+
297
+ // The overrides of one call, in its context or as route() overrides
298
+ client.withContext({ retry: { maxAttempts: 5, delay: 200, backoffMultiplier: 3, maxDelay: 2000 } });
299
+ ```
300
+
301
+ #### Cache Middleware
302
+ ```typescript
303
+ createCacheMiddleware(options: CacheOptions)
304
+
305
+ interface CacheOptions {
306
+ methods: string[] | ((method: Method) => boolean); // required: the cached calls
307
+ capacity?: number; // default: 100
308
+ ttl?: number; // default: 60000ms
309
+ keyGenerator?: (method: Method, payload: unknown, metadata: Metadata) => string;
310
+ shouldCache?: (item: ResponseItem<unknown>) => boolean;
311
+ }
312
+
313
+ // The overrides of one call, in its context or as route() overrides
314
+ client.withContext({ cache: { ttl: 5000 } }); // the life of the stored entry
315
+ client.withContext({ cache: { bypass: true } }); // no read, no write
316
+ client.withContext({ cache: { refresh: true } }); // fetch, then replace the stored entry
317
+ ```
318
+
319
+ #### Timeout Middleware
320
+ ```typescript
321
+ createTimeoutMiddleware(options: TimeoutOptions)
322
+ createOverallTimeoutMiddleware(timeout: number)
323
+ createCombinedTimeoutMiddleware(options: { overall: number; perAttempt: number })
324
+
325
+ interface TimeoutOptions {
326
+ overall?: number; // milliseconds
327
+ perAttempt?: number; // milliseconds
328
+ }
329
+ ```
330
+
331
+ #### Auth Middleware
332
+ ```typescript
333
+ createAuthMiddleware(options: AuthOptions)
334
+ createBearerAuthMiddleware(token: string | (() => string))
335
+ createApiKeyAuthMiddleware(apiKey: string, headerName?: string)
336
+
337
+ interface AuthOptions {
338
+ token?: string | (() => string | Promise<string>);
339
+ apiKey?: string;
340
+ headerName?: string;
341
+ scheme?: "Bearer" | "Basic" | string;
342
+ }
343
+ ```
344
+
345
+ #### Circuit Breaker Middleware
346
+ ```typescript
347
+ createCircuitBreakerMiddleware(options?: CircuitBreakerOptions)
348
+
349
+ interface CircuitBreakerOptions {
350
+ threshold?: number; // default: 5 failures
351
+ timeout?: number; // default: 60000ms
352
+ resetTimeout?: number; // default: 30000ms
353
+ }
354
+ ```
355
+
356
+ #### Rate Limit Middleware
357
+ ```typescript
358
+ createRateLimitMiddleware(options?: RateLimitOptions)
359
+
360
+ interface RateLimitOptions {
361
+ maxTokens?: number; // default: 10
362
+ refillRate?: number; // tokens per second, default: 1
363
+ refillInterval?: number; // milliseconds, default: 1000
364
+ }
365
+ ```
366
+
367
+ #### Batching Middleware
368
+ ```typescript
369
+ createBatchingMiddleware(options?: BatchingOptions)
370
+
371
+ interface BatchingOptions {
372
+ maxBatchSize?: number; // default: 10
373
+ maxWaitTime?: number; // default: 10ms
374
+ }
375
+ ```
376
+
377
+ #### Tracing Middleware
378
+ ```typescript
379
+ createTracingMiddleware(options?: TracingOptions)
380
+
381
+ interface TracingOptions {
382
+ generateTraceId?: () => string;
383
+ generateSpanId?: () => string;
384
+ onSpanStart?: (span: Span) => void;
385
+ onSpanEnd?: (span: Span) => void;
386
+ }
387
+ ```
388
+
389
+ #### Validation Middleware (Zod)
390
+ ```typescript
391
+ createZodMiddleware(options?: ZodMiddlewareOptions)
392
+
393
+ interface ZodMiddlewareOptions {
394
+ mode?: "input" | "output" | "both"; // default: "both"
395
+ throwOnError?: boolean; // default: true
396
+ }
397
+ ```
398
+
399
+ ### Procedures
400
+
401
+ #### Define Procedure
402
+ ```typescript
403
+ defineProcedure<TInput, TOutput, TMeta>(def: ProcedureDefinition): Procedure
404
+
405
+ interface ProcedureDefinition<TInput, TOutput, TMeta> {
406
+ path: ProcedurePath; // e.g., ["users", "get"]
407
+ input: ZodSchema<TInput>;
408
+ output: ZodSchema<TOutput>;
409
+ handler?: ProcedureHandler<TInput, TOutput, TMeta>;
410
+ metadata?: TMeta;
411
+ }
412
+
413
+ // Fluent builder
414
+ createProcedure()
415
+ .path(["users", "get"])
416
+ .input(z.object({ id: z.string() }))
417
+ .output(z.object({ id: z.string(), name: z.string() }))
418
+ .meta({ description: "Get user by ID" })
419
+ .handler(async (input, ctx) => {
420
+ return await db.users.findById(input.id);
421
+ })
422
+ .build()
423
+ ```
424
+
425
+ #### Procedure Registry
426
+ ```typescript
427
+ PROCEDURE_REGISTRY.register(procedure: Procedure)
428
+ PROCEDURE_REGISTRY.get(path: ProcedurePath): Procedure | undefined
429
+ PROCEDURE_REGISTRY.has(path: ProcedurePath): boolean
430
+ PROCEDURE_REGISTRY.delete(path: ProcedurePath): boolean
431
+ PROCEDURE_REGISTRY.list(): Procedure[]
432
+ PROCEDURE_REGISTRY.on(event: RegistryEventType, listener: RegistryListener)
433
+ ```
434
+
435
+ #### Procedure References (Procedure-as-Data)
436
+ ```typescript
437
+ // Build procedure reference
438
+ proc(["users", "get"])
439
+ .input({ id: "123" })
440
+ .when("immediate") // "immediate" | "never" | "parent"
441
+ .name("getUser")
442
+ .build()
443
+
444
+ // Execute reference
445
+ const result = await client.exec(procedureRef)
446
+
447
+ // Hydrate nested references
448
+ const hydrated = await hydrateInput(input, executor)
449
+ ```
450
+
451
+ ### Components, Collections and the Program Store
452
+
453
+ They are not in the core. See the README of `@procedures/splay` (components), `@procedures/collections` (data structures) and `@procedures/store` (the program store and the storage layer).
454
+
455
+ ### Event Bus
456
+
457
+ ```typescript
458
+ const bus = createEventBus()
459
+
460
+ // Subscribe
461
+ bus.on("user:created", (user) => console.log(user))
462
+ bus.once("app:ready", () => console.log("Ready"))
463
+
464
+ // Publish
465
+ bus.emit("user:created", { id: "123", name: "Alice" })
466
+
467
+ // Async iteration
468
+ for await (const event of bus.stream("user:*")) {
469
+ console.log(event)
470
+ }
471
+
472
+ // Unsubscribe
473
+ const unsubscribe = bus.on("event", handler)
474
+ unsubscribe()
475
+ ```
476
+
477
+ ### Server
478
+
479
+ ```typescript
480
+ const server = new Server(options?: ServerOptions)
481
+
482
+ // Register handler
483
+ server.register(method: Method, handler: ServerHandler)
484
+
485
+ // Add middleware
486
+ server.use(middleware: ServerMiddleware)
487
+
488
+ // Start server
489
+ await server.start()
490
+
491
+ // Stop server
492
+ await server.stop()
493
+ ```
494
+
495
+ #### HTTP Server Transport
496
+ ```typescript
497
+ new HttpServerTransport(server: Server, options: HttpServerTransportOptions)
498
+
499
+ interface HttpServerTransportOptions {
500
+ port: number;
501
+ hostname?: string;
502
+ urlStrategy?: HttpUrlStrategy;
503
+ cors?: boolean | CorsOptions;
504
+ }
505
+ ```
506
+
507
+ #### WebSocket Server Transport
508
+ ```typescript
509
+ new WebSocketServerTransport(server: Server, options: WebSocketServerTransportOptions)
510
+
511
+ interface WebSocketServerTransportOptions {
512
+ port: number;
513
+ path?: string;
514
+ auth?: WebSocketAuthHandler;
515
+ onConnection?: WebSocketConnectionHandler;
516
+ }
517
+ ```
518
+
519
+ #### Procedure Server
520
+ ```typescript
521
+ const server = createProcedureServer(options?: ProcedureServerOptions)
522
+
523
+ interface ProcedureServerOptions {
524
+ registry?: ProcedureRegistry;
525
+ storage?: StorageConfig;
526
+ transports?: ServerTransport[];
527
+ }
528
+ ```
529
+
530
+ ### Error System
531
+
532
+ ```typescript
533
+ // Create error
534
+ createError(code: string, context?: ErrorContext): RichError
535
+
536
+ // From HTTP status
537
+ createErrorFromHTTPStatus(status: number, context?: ErrorContext): RichError
538
+
539
+ // From exception
540
+ createErrorFromException(error: unknown, context?: ErrorContext): RichError
541
+
542
+ // Format error
543
+ formatError(error: RichError): string
544
+
545
+ // Check if known error
546
+ isKnownError(code: string): boolean
547
+
548
+ // Get error metadata
549
+ getErrorMetadata(code: string): ErrorMetadata | undefined
550
+
551
+ // Error registry
552
+ ERROR_REGISTRY.get(code: string): ErrorMetadata
553
+ ERROR_REGISTRY.has(code: string): boolean
554
+ ERROR_REGISTRY.list(): string[]
555
+ ```
556
+
557
+ ## Subpath Exports
558
+
559
+ ```typescript
560
+ import { Client, HttpTransport, ... } from "@procedures/client";
561
+ import { defineProcedure, PROCEDURE_REGISTRY, ... } from "@procedures/client";
562
+ import { EventBus, createEventBus, ... } from "@procedures/client";
563
+
564
+ // OR use subpath exports
565
+ import { Client } from "@procedures/client/client";
566
+ import { ... } from "@procedures/client/procedures";
567
+ import { ... } from "@procedures/client/events";
568
+ ```
569
+
570
+ ## Procedure Auto-Discovery
571
+
572
+ Packages can declare procedures in `package.json`:
573
+
574
+ ```json
575
+ {
576
+ "client": {
577
+ "procedures": "./dist/register.js"
578
+ },
579
+ "scripts": {
580
+ "postinstall": "client-registry announce"
581
+ }
582
+ }
583
+ ```
584
+
585
+ When installed, procedures auto-register. Run `client-registry discover` to generate the registry.
586
+
587
+ ## Type-Safe Middleware
588
+
589
+ Middleware context types accumulate through the chain:
590
+
591
+ ```typescript
592
+ const client = new Client(transport)
593
+ .use(createRetryMiddleware()) // Client<RetryContext>
594
+ .use(createCacheMiddleware({ methods: ["users.get"] })) // Client<RetryContext & CacheContext>
595
+ .use(createAuthMiddleware()); // Client<... & AuthContext>
596
+ ```
597
+
598
+ ### Available Middleware
599
+
600
+ | Middleware | Purpose |
601
+ |------------|---------|
602
+ | `createRetryMiddleware` | Exponential backoff with jitter |
603
+ | `createCacheMiddleware` | LRU + TTL caching |
604
+ | `createTimeoutMiddleware` | Request timeout |
605
+ | `createAuthMiddleware` | Bearer token / API key |
606
+ | `createTracingMiddleware` | W3C Trace Context |
607
+ | `createCircuitBreakerMiddleware` | Fault tolerance |
608
+ | `createRateLimitMiddleware` | Token bucket throttling |
609
+ | `createBatchingMiddleware` | Request aggregation |
610
+
611
+ ## EventBus
612
+
613
+ ```typescript
614
+ import { createEventBus } from "client";
615
+
616
+ const bus = createEventBus();
617
+
618
+ // Subscribe
619
+ bus.on("user:created", (user) => console.log(user));
620
+
621
+ // Publish
622
+ bus.emit("user:created", { id: "123", name: "Alice" });
623
+
624
+ // Async iteration
625
+ for await (const event of bus.stream("user:*")) {
626
+ console.log(event);
627
+ }
628
+ ```
629
+
630
+ ## Server
631
+
632
+ ```typescript
633
+ import { Server, HttpServerTransport } from "client";
634
+
635
+ const server = new Server({
636
+ transports: [new HttpServerTransport({ port: 3000 })],
637
+ });
638
+
639
+ server.register(
640
+ { service: "users", operation: "get" },
641
+ async (request) => ({
642
+ id: request.id,
643
+ status: { type: "success", code: 200 },
644
+ payload: await db.users.findById(request.payload.id),
645
+ metadata: {},
646
+ })
647
+ );
648
+
649
+ await server.start();
650
+ ```
651
+
652
+ ## Error System
653
+
654
+ 70+ error codes with metadata:
655
+
656
+ ```typescript
657
+ import { createError, ERROR_REGISTRY, ErrorCategory, ErrorSeverity } from "client";
658
+
659
+ const error = createError("E_TIMEOUT", {
660
+ service: "users",
661
+ operation: "get",
662
+ });
663
+ // { code: "E_TIMEOUT", message: "...", severity: "error", category: "timeout", ... }
664
+ ```
665
+
666
+ ## Examples
667
+
668
+ ### Advanced Middleware Composition
669
+ ```typescript
670
+ const client = new Client({ transport: new HttpTransport({ baseUrl: "/api" }) })
671
+ .use(createTimeoutMiddleware({ overall: 10000, perAttempt: 5000 }))
672
+ .use(createRetryMiddleware({ maxAttempts: 3, initialDelay: 1000 }))
673
+ .use(createCacheMiddleware({ methods: ["users.get"], capacity: 100, ttl: 60000 }))
674
+ .use(createCircuitBreakerMiddleware({ threshold: 5, timeout: 60000 }))
675
+ .use(createRateLimitMiddleware({ maxTokens: 10, refillRate: 1 }))
676
+ .use(createTracingMiddleware())
677
+ .use(createZodMiddleware());
678
+
679
+ // Context inheritance
680
+ const authedClient = client.withContext({ auth: { token: "user-token" } });
681
+ const adminClient = authedClient.withContext({ auth: { token: "admin-token" } });
682
+ ```
683
+
684
+ ### Procedure-as-Data (Declarative Composition)
685
+ ```typescript
686
+ // Define procedures
687
+ const addProcedure = defineProcedure({
688
+ path: ["git", "add"],
689
+ input: z.object({ all: z.boolean() }),
690
+ output: z.object({ success: z.boolean() }),
691
+ handler: async ({ all }) => {
692
+ // ... git add logic
693
+ return { success: true };
694
+ },
695
+ });
696
+
697
+ // Compose via procedure references
698
+ const deployPipeline = proc(["chain"]).input({
699
+ steps: [
700
+ proc(["git", "add"]).input({ all: true }).ref,
701
+ proc(["git", "commit"]).input({ message: "deploy" }).ref,
702
+ proc(["git", "push"]).ref,
703
+ ],
704
+ }).build();
705
+
706
+ // Execute
707
+ const result = await client.exec(deployPipeline);
708
+ ```
709
+
710
+ ### Nested Route API (Batch Execution)
711
+ ```typescript
712
+ const result = await client.route({
713
+ batch: { strategy: "all", maxConcurrency: 5 },
714
+ middlewares: {
715
+ retry: { attempts: 3 },
716
+ timeout: { overall: 10000 },
717
+ },
718
+ route: {
719
+ users: {
720
+ get: { id: "123" }, // users.get({ id: "123" })
721
+ list: { limit: 10 }, // users.list({ limit: 10 })
722
+ },
723
+ orders: {
724
+ list: { userId: "123" }, // orders.list({ userId: "123" })
725
+ },
726
+ },
727
+ });
728
+
729
+ // Access results
730
+ console.log(result.users.get.data); // { id: "123", name: "Alice" }
731
+ console.log(result.users.list.data); // [{ id: "1", ... }, ...]
732
+ console.log(result.orders.list.data); // [{ id: "ord_1", ... }, ...]
733
+ ```
734
+
735
+ ### WebSocket Bidirectional RPC
736
+ ```typescript
737
+ // Client
738
+ const client = new Client({
739
+ transport: new WebSocketTransport({ url: "ws://localhost:3000" })
740
+ });
741
+
742
+ for await (const event of client.stream({ service: "events", operation: "watch" }, {})) {
743
+ console.log("Received:", event);
744
+ }
745
+
746
+ // Server
747
+ const server = new Server();
748
+ const wsTransport = new WebSocketServerTransport(server, {
749
+ port: 3000,
750
+ onConnection: (connectionId) => {
751
+ console.log("Client connected:", connectionId);
752
+ },
753
+ });
754
+
755
+ server.register({ service: "events", operation: "watch" }, async function* (request) {
756
+ // Stream events to client
757
+ while (true) {
758
+ const event = await eventSource.next();
759
+ yield {
760
+ id: request.id,
761
+ status: { type: "success", code: 200 },
762
+ payload: event,
763
+ metadata: {},
764
+ };
765
+ }
766
+ });
767
+
768
+ await server.start();
769
+ ```
770
+
771
+ ## Integration with Ecosystem
772
+
773
+ ### Connection Management
774
+ Use with `@mark1russell7/client-connection` for bidirectional RPC:
775
+ ```typescript
776
+ import "@mark1russell7/client-connection/register";
777
+
778
+ // List connected clients
779
+ const { connections } = await client.call(["connection", "list"], {});
780
+
781
+ // Call procedure on specific client
782
+ const result = await client.call(["connection", "call"], {
783
+ clientId: "abc123",
784
+ path: ["render"],
785
+ input: { template: "home" },
786
+ });
787
+ ```
788
+
789
+ ### Shell Execution
790
+ Use with `@procedures/shell`:
791
+ ```typescript
792
+ import "@procedures/shell/register";
793
+
794
+ const result = await client.call(["shell", "run"], {
795
+ command: "git",
796
+ args: ["status"],
797
+ cwd: "/path/to/repo",
798
+ });
799
+ console.log(result.stdout);
800
+ ```
801
+
802
+ ### Procedure Scaffolding
803
+ Use with `@procedures/procedure`:
804
+ ```typescript
805
+ import "@procedures/procedure/register";
806
+
807
+ const result = await client.call(["procedure", "new"], {
808
+ name: "user.create",
809
+ description: "Create a new user",
810
+ });
811
+ ```
812
+
813
+ ## Requirements
814
+
815
+ - **Node.js**: >= 22
816
+ - **Dependencies**: `ws` ^8.18.3, `zod` ^4
817
+ - **Peer Dependencies** (optional):
818
+ - `express` ^4.0.0 || ^5.0.0 (for HTTP server)
819
+
820
+ ## License
821
+
822
+ MIT
823
+
824
+ ## Contributing
825
+
826
+ This package is part of the Mark ecosystem. See the main repository for contribution guidelines.
827
+
828
+ ## See Also
829
+
830
+ - `@mark1russell7/client-connection` - Connection management for bidirectional RPC
831
+ - `@procedures/shell` - Shell command execution procedures
832
+ - `@procedures/procedure` - Procedure scaffolding utilities
833
+ - `@procedures/bundle-dev` - Development bundle with all client packages