@procedures/client 0.2.3 → 0.4.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 (369) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/README.md +77 -44
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/adapters/http/client/transport.d.ts.map +1 -1
  5. package/dist/adapters/http/client/transport.js +35 -3
  6. package/dist/adapters/http/client/transport.js.map +1 -1
  7. package/dist/adapters/http/client/types.d.ts +3 -2
  8. package/dist/adapters/http/client/types.d.ts.map +1 -1
  9. package/dist/adapters/http/server/transport.d.ts +2 -2
  10. package/dist/adapters/http/server/transport.d.ts.map +1 -1
  11. package/dist/adapters/http/server/transport.js +54 -22
  12. package/dist/adapters/http/server/transport.js.map +1 -1
  13. package/dist/adapters/http/shared/headers.d.ts +1 -1
  14. package/dist/adapters/http/shared/headers.d.ts.map +1 -1
  15. package/dist/adapters/http/shared/headers.js +7 -6
  16. package/dist/adapters/http/shared/headers.js.map +1 -1
  17. package/dist/adapters/local/client/transport.d.ts +3 -0
  18. package/dist/adapters/local/client/transport.d.ts.map +1 -1
  19. package/dist/adapters/local/client/transport.js +67 -6
  20. package/dist/adapters/local/client/transport.js.map +1 -1
  21. package/dist/adapters/local/client/types.d.ts +15 -0
  22. package/dist/adapters/local/client/types.d.ts.map +1 -1
  23. package/dist/adapters/local/client/types.js.map +1 -1
  24. package/dist/adapters/mock/client/transport.d.ts +3 -2
  25. package/dist/adapters/mock/client/transport.d.ts.map +1 -1
  26. package/dist/adapters/mock/client/transport.js +8 -5
  27. package/dist/adapters/mock/client/transport.js.map +1 -1
  28. package/dist/adapters/mock/client/types.d.ts +7 -6
  29. package/dist/adapters/mock/client/types.d.ts.map +1 -1
  30. package/dist/adapters/port/transport.d.ts +62 -0
  31. package/dist/adapters/port/transport.d.ts.map +1 -0
  32. package/dist/adapters/port/transport.js +94 -0
  33. package/dist/adapters/port/transport.js.map +1 -0
  34. package/dist/adapters/websocket/client/index.d.ts +1 -1
  35. package/dist/adapters/websocket/client/index.d.ts.map +1 -1
  36. package/dist/adapters/websocket/client/index.js.map +1 -1
  37. package/dist/adapters/websocket/client/node.d.ts +30 -0
  38. package/dist/adapters/websocket/client/node.d.ts.map +1 -0
  39. package/dist/adapters/websocket/client/node.js +32 -0
  40. package/dist/adapters/websocket/client/node.js.map +1 -0
  41. package/dist/adapters/websocket/client/transport.d.ts +47 -7
  42. package/dist/adapters/websocket/client/transport.d.ts.map +1 -1
  43. package/dist/adapters/websocket/client/transport.js +229 -75
  44. package/dist/adapters/websocket/client/transport.js.map +1 -1
  45. package/dist/adapters/websocket/client/types.d.ts +71 -21
  46. package/dist/adapters/websocket/client/types.d.ts.map +1 -1
  47. package/dist/adapters/websocket/client/types.js.map +1 -1
  48. package/dist/adapters/websocket/server/transport.d.ts +65 -24
  49. package/dist/adapters/websocket/server/transport.d.ts.map +1 -1
  50. package/dist/adapters/websocket/server/transport.js +192 -263
  51. package/dist/adapters/websocket/server/transport.js.map +1 -1
  52. package/dist/adapters/websocket/server/types.d.ts +20 -1
  53. package/dist/adapters/websocket/server/types.d.ts.map +1 -1
  54. package/dist/adapters/websocket/shared/rpc.d.ts +129 -0
  55. package/dist/adapters/websocket/shared/rpc.d.ts.map +1 -0
  56. package/dist/adapters/websocket/shared/rpc.js +425 -0
  57. package/dist/adapters/websocket/shared/rpc.js.map +1 -0
  58. package/dist/browser.d.ts +29 -7
  59. package/dist/browser.d.ts.map +1 -1
  60. package/dist/browser.js +26 -3
  61. package/dist/browser.js.map +1 -1
  62. package/dist/client/call-types.d.ts +10 -10
  63. package/dist/client/call-types.d.ts.map +1 -1
  64. package/dist/client/call-types.js +1 -6
  65. package/dist/client/call-types.js.map +1 -1
  66. package/dist/client/client.d.ts +6 -1
  67. package/dist/client/client.d.ts.map +1 -1
  68. package/dist/client/client.js +23 -9
  69. package/dist/client/client.js.map +1 -1
  70. package/dist/client/deadline.d.ts +38 -0
  71. package/dist/client/deadline.d.ts.map +1 -0
  72. package/dist/client/deadline.js +60 -0
  73. package/dist/client/deadline.js.map +1 -0
  74. package/dist/client/errors/factory.d.ts.map +1 -1
  75. package/dist/client/errors/factory.js +11 -7
  76. package/dist/client/errors/factory.js.map +1 -1
  77. package/dist/client/errors/http-errors.d.ts.map +1 -1
  78. package/dist/client/errors/http-errors.js +6 -0
  79. package/dist/client/errors/http-errors.js.map +1 -1
  80. package/dist/client/errors/index.d.ts +1 -1
  81. package/dist/client/errors/index.js +1 -1
  82. package/dist/client/errors/registry.d.ts +2 -1
  83. package/dist/client/errors/registry.d.ts.map +1 -1
  84. package/dist/client/errors/registry.js +72 -22
  85. package/dist/client/errors/registry.js.map +1 -1
  86. package/dist/client/index.d.ts +9 -2
  87. package/dist/client/index.d.ts.map +1 -1
  88. package/dist/client/index.js +8 -2
  89. package/dist/client/index.js.map +1 -1
  90. package/dist/client/middleware/cache.d.ts +19 -5
  91. package/dist/client/middleware/cache.d.ts.map +1 -1
  92. package/dist/client/middleware/cache.js +106 -18
  93. package/dist/client/middleware/cache.js.map +1 -1
  94. package/dist/client/middleware/circuit-breaker.d.ts +28 -10
  95. package/dist/client/middleware/circuit-breaker.d.ts.map +1 -1
  96. package/dist/client/middleware/circuit-breaker.js +35 -24
  97. package/dist/client/middleware/circuit-breaker.js.map +1 -1
  98. package/dist/client/middleware/contexts.d.ts +16 -10
  99. package/dist/client/middleware/contexts.d.ts.map +1 -1
  100. package/dist/client/middleware/contexts.js.map +1 -1
  101. package/dist/client/middleware/items.d.ts +31 -2
  102. package/dist/client/middleware/items.d.ts.map +1 -1
  103. package/dist/client/middleware/items.js +86 -6
  104. package/dist/client/middleware/items.js.map +1 -1
  105. package/dist/client/middleware/lru.d.ts +2 -0
  106. package/dist/client/middleware/lru.d.ts.map +1 -1
  107. package/dist/client/middleware/lru.js +11 -0
  108. package/dist/client/middleware/lru.js.map +1 -1
  109. package/dist/client/middleware/rate-limit.d.ts +7 -6
  110. package/dist/client/middleware/rate-limit.d.ts.map +1 -1
  111. package/dist/client/middleware/rate-limit.js +9 -7
  112. package/dist/client/middleware/rate-limit.js.map +1 -1
  113. package/dist/client/middleware/resilience.d.ts +61 -0
  114. package/dist/client/middleware/resilience.d.ts.map +1 -0
  115. package/dist/client/middleware/resilience.js +59 -0
  116. package/dist/client/middleware/resilience.js.map +1 -0
  117. package/dist/client/middleware/retry.d.ts +45 -11
  118. package/dist/client/middleware/retry.d.ts.map +1 -1
  119. package/dist/client/middleware/retry.js +102 -22
  120. package/dist/client/middleware/retry.js.map +1 -1
  121. package/dist/client/middleware/timeout.d.ts +15 -12
  122. package/dist/client/middleware/timeout.d.ts.map +1 -1
  123. package/dist/client/middleware/timeout.js +48 -46
  124. package/dist/client/middleware/timeout.js.map +1 -1
  125. package/dist/client/middleware/tracing.d.ts.map +1 -1
  126. package/dist/client/middleware/tracing.js +11 -3
  127. package/dist/client/middleware/tracing.js.map +1 -1
  128. package/dist/client/types.d.ts +9 -1
  129. package/dist/client/types.d.ts.map +1 -1
  130. package/dist/client/types.js.map +1 -1
  131. package/dist/clock.d.ts +19 -0
  132. package/dist/clock.d.ts.map +1 -0
  133. package/dist/clock.js +18 -0
  134. package/dist/clock.js.map +1 -0
  135. package/dist/duration.d.ts +37 -0
  136. package/dist/duration.d.ts.map +1 -0
  137. package/dist/duration.js +44 -0
  138. package/dist/duration.js.map +1 -0
  139. package/dist/index.d.ts +4 -0
  140. package/dist/index.d.ts.map +1 -1
  141. package/dist/index.js +4 -0
  142. package/dist/index.js.map +1 -1
  143. package/dist/machines.d.ts +90 -0
  144. package/dist/machines.d.ts.map +1 -0
  145. package/dist/machines.js +127 -0
  146. package/dist/machines.js.map +1 -0
  147. package/dist/node.d.ts +11 -0
  148. package/dist/node.d.ts.map +1 -0
  149. package/dist/node.js +10 -0
  150. package/dist/node.js.map +1 -0
  151. package/dist/procedures/capability.d.ts +3 -6
  152. package/dist/procedures/capability.d.ts.map +1 -1
  153. package/dist/procedures/capability.js +7 -8
  154. package/dist/procedures/capability.js.map +1 -1
  155. package/dist/procedures/collection/index.d.ts +3 -3
  156. package/dist/procedures/collection/index.d.ts.map +1 -1
  157. package/dist/procedures/collection/index.js +1 -1
  158. package/dist/procedures/collection/index.js.map +1 -1
  159. package/dist/procedures/collection/procedures.d.ts.map +1 -1
  160. package/dist/procedures/collection/procedures.js +49 -1
  161. package/dist/procedures/collection/procedures.js.map +1 -1
  162. package/dist/procedures/collection/schemas.d.ts +33 -0
  163. package/dist/procedures/collection/schemas.d.ts.map +1 -1
  164. package/dist/procedures/collection/schemas.js +68 -0
  165. package/dist/procedures/collection/schemas.js.map +1 -1
  166. package/dist/procedures/collection/storage.d.ts +37 -0
  167. package/dist/procedures/collection/storage.d.ts.map +1 -1
  168. package/dist/procedures/core/array.d.ts +1 -1
  169. package/dist/procedures/core/array.d.ts.map +1 -1
  170. package/dist/procedures/core/array.js +81 -29
  171. package/dist/procedures/core/array.js.map +1 -1
  172. package/dist/procedures/core/index.d.ts.map +1 -1
  173. package/dist/procedures/core/index.js +17 -2
  174. package/dist/procedures/core/index.js.map +1 -1
  175. package/dist/procedures/core/logic.js +1 -1
  176. package/dist/procedures/core/logic.js.map +1 -1
  177. package/dist/procedures/core/math.d.ts.map +1 -1
  178. package/dist/procedures/core/math.js +5 -1
  179. package/dist/procedures/core/math.js.map +1 -1
  180. package/dist/procedures/core/meta.d.ts.map +1 -1
  181. package/dist/procedures/core/meta.js +43 -8
  182. package/dist/procedures/core/meta.js.map +1 -1
  183. package/dist/procedures/core/object.d.ts.map +1 -1
  184. package/dist/procedures/core/object.js +42 -13
  185. package/dist/procedures/core/object.js.map +1 -1
  186. package/dist/procedures/core/operands.d.ts.map +1 -1
  187. package/dist/procedures/core/operands.js +6 -1
  188. package/dist/procedures/core/operands.js.map +1 -1
  189. package/dist/procedures/core/string.d.ts.map +1 -1
  190. package/dist/procedures/core/string.js +4 -2
  191. package/dist/procedures/core/string.js.map +1 -1
  192. package/dist/procedures/core/type.d.ts.map +1 -1
  193. package/dist/procedures/core/type.js +4 -2
  194. package/dist/procedures/core/type.js.map +1 -1
  195. package/dist/procedures/define-procedure.d.ts +19 -7
  196. package/dist/procedures/define-procedure.d.ts.map +1 -1
  197. package/dist/procedures/define-procedure.js +57 -17
  198. package/dist/procedures/define-procedure.js.map +1 -1
  199. package/dist/procedures/discovery.d.ts +4 -6
  200. package/dist/procedures/discovery.d.ts.map +1 -1
  201. package/dist/procedures/discovery.js +4 -6
  202. package/dist/procedures/discovery.js.map +1 -1
  203. package/dist/procedures/effects.d.ts +16 -0
  204. package/dist/procedures/effects.d.ts.map +1 -1
  205. package/dist/procedures/effects.js +33 -0
  206. package/dist/procedures/effects.js.map +1 -1
  207. package/dist/procedures/idempotency.d.ts +73 -0
  208. package/dist/procedures/idempotency.d.ts.map +1 -0
  209. package/dist/procedures/idempotency.js +131 -0
  210. package/dist/procedures/idempotency.js.map +1 -0
  211. package/dist/procedures/index.d.ts +7 -3
  212. package/dist/procedures/index.d.ts.map +1 -1
  213. package/dist/procedures/index.js +6 -2
  214. package/dist/procedures/index.js.map +1 -1
  215. package/dist/procedures/interceptors.d.ts +17 -4
  216. package/dist/procedures/interceptors.d.ts.map +1 -1
  217. package/dist/procedures/interceptors.js +18 -7
  218. package/dist/procedures/interceptors.js.map +1 -1
  219. package/dist/procedures/invoke.d.ts +15 -3
  220. package/dist/procedures/invoke.d.ts.map +1 -1
  221. package/dist/procedures/invoke.js +8 -3
  222. package/dist/procedures/invoke.js.map +1 -1
  223. package/dist/procedures/manifest.d.ts +83 -0
  224. package/dist/procedures/manifest.d.ts.map +1 -0
  225. package/dist/procedures/manifest.js +90 -0
  226. package/dist/procedures/manifest.js.map +1 -0
  227. package/dist/procedures/ref.d.ts +4 -2
  228. package/dist/procedures/ref.d.ts.map +1 -1
  229. package/dist/procedures/ref.js +2 -1
  230. package/dist/procedures/ref.js.map +1 -1
  231. package/dist/procedures/runtime-programs.d.ts +19 -0
  232. package/dist/procedures/runtime-programs.d.ts.map +1 -0
  233. package/dist/procedures/runtime-programs.js +24 -0
  234. package/dist/procedures/runtime-programs.js.map +1 -0
  235. package/dist/procedures/types.d.ts +16 -0
  236. package/dist/procedures/types.d.ts.map +1 -1
  237. package/dist/procedures/types.js.map +1 -1
  238. package/dist/protocol.d.ts +47 -0
  239. package/dist/protocol.d.ts.map +1 -0
  240. package/dist/protocol.js +68 -0
  241. package/dist/protocol.js.map +1 -0
  242. package/dist/server/host-policy.d.ts +4 -3
  243. package/dist/server/host-policy.d.ts.map +1 -1
  244. package/dist/server/host-policy.js +6 -3
  245. package/dist/server/host-policy.js.map +1 -1
  246. package/dist/server/host-procedures.d.ts +31 -0
  247. package/dist/server/host-procedures.d.ts.map +1 -0
  248. package/dist/server/host-procedures.js +75 -0
  249. package/dist/server/host-procedures.js.map +1 -0
  250. package/dist/server/index.d.ts +3 -3
  251. package/dist/server/index.d.ts.map +1 -1
  252. package/dist/server/index.js +1 -1
  253. package/dist/server/index.js.map +1 -1
  254. package/dist/server/procedure-server.d.ts +112 -5
  255. package/dist/server/procedure-server.d.ts.map +1 -1
  256. package/dist/server/procedure-server.js +273 -19
  257. package/dist/server/procedure-server.js.map +1 -1
  258. package/dist/server/request-auth.d.ts +19 -0
  259. package/dist/server/request-auth.d.ts.map +1 -0
  260. package/dist/server/request-auth.js +32 -0
  261. package/dist/server/request-auth.js.map +1 -0
  262. package/dist/server/types.d.ts +32 -0
  263. package/dist/server/types.d.ts.map +1 -1
  264. package/dist/server/types.js.map +1 -1
  265. package/dist/timers.d.ts +60 -0
  266. package/dist/timers.d.ts.map +1 -0
  267. package/dist/timers.js +33 -0
  268. package/dist/timers.js.map +1 -0
  269. package/dist/tracing/traceparent.d.ts +26 -0
  270. package/dist/tracing/traceparent.d.ts.map +1 -0
  271. package/dist/tracing/traceparent.js +53 -0
  272. package/dist/tracing/traceparent.js.map +1 -0
  273. package/package.json +11 -4
  274. package/src/adapters/http/client/transport.ts +31 -3
  275. package/src/adapters/http/client/types.ts +3 -2
  276. package/src/adapters/http/server/transport.ts +61 -26
  277. package/src/adapters/http/shared/headers.ts +7 -6
  278. package/src/adapters/local/client/transport.ts +74 -7
  279. package/src/adapters/local/client/types.ts +18 -0
  280. package/src/adapters/mock/client/transport.ts +9 -6
  281. package/src/adapters/mock/client/types.ts +7 -6
  282. package/src/adapters/port/transport.ts +124 -0
  283. package/src/adapters/websocket/client/index.ts +1 -0
  284. package/src/adapters/websocket/client/node.ts +34 -0
  285. package/src/adapters/websocket/client/transport.ts +251 -81
  286. package/src/adapters/websocket/client/types.ts +81 -21
  287. package/src/adapters/websocket/server/transport.ts +199 -301
  288. package/src/adapters/websocket/server/types.ts +20 -1
  289. package/src/adapters/websocket/shared/rpc.ts +453 -0
  290. package/src/browser.ts +51 -3
  291. package/src/client/call-types.ts +10 -14
  292. package/src/client/client.ts +28 -9
  293. package/src/client/deadline.ts +64 -0
  294. package/src/client/errors/README.md +2 -0
  295. package/src/client/errors/factory.ts +12 -8
  296. package/src/client/errors/http-errors.ts +5 -0
  297. package/src/client/errors/index.ts +1 -1
  298. package/src/client/errors/registry.ts +79 -22
  299. package/src/client/index.ts +21 -3
  300. package/src/client/middleware/cache.ts +120 -23
  301. package/src/client/middleware/circuit-breaker.ts +65 -35
  302. package/src/client/middleware/contexts.ts +17 -10
  303. package/src/client/middleware/items.ts +101 -6
  304. package/src/client/middleware/lru.ts +12 -0
  305. package/src/client/middleware/rate-limit.ts +9 -9
  306. package/src/client/middleware/resilience.ts +81 -0
  307. package/src/client/middleware/retry.ts +146 -34
  308. package/src/client/middleware/timeout.ts +57 -55
  309. package/src/client/middleware/tracing.ts +13 -4
  310. package/src/client/types.ts +9 -1
  311. package/src/clock.ts +21 -0
  312. package/src/duration.ts +56 -0
  313. package/src/index.ts +4 -0
  314. package/src/machines.ts +186 -0
  315. package/src/node.ts +11 -0
  316. package/src/procedures/capability.ts +7 -8
  317. package/src/procedures/collection/index.ts +9 -1
  318. package/src/procedures/collection/procedures.ts +57 -0
  319. package/src/procedures/collection/schemas.ts +110 -0
  320. package/src/procedures/collection/storage.ts +38 -0
  321. package/src/procedures/core/array.ts +79 -31
  322. package/src/procedures/core/index.ts +17 -2
  323. package/src/procedures/core/logic.ts +1 -1
  324. package/src/procedures/core/math.ts +5 -1
  325. package/src/procedures/core/meta.ts +45 -8
  326. package/src/procedures/core/object.ts +48 -14
  327. package/src/procedures/core/operands.ts +7 -0
  328. package/src/procedures/core/string.ts +4 -2
  329. package/src/procedures/core/type.ts +4 -2
  330. package/src/procedures/define-procedure.ts +73 -20
  331. package/src/procedures/discovery.ts +4 -6
  332. package/src/procedures/effects.ts +35 -0
  333. package/src/procedures/idempotency.ts +152 -0
  334. package/src/procedures/index.ts +18 -2
  335. package/src/procedures/interceptors.ts +28 -11
  336. package/src/procedures/invoke.ts +19 -5
  337. package/src/procedures/manifest.ts +158 -0
  338. package/src/procedures/ref.ts +4 -2
  339. package/src/procedures/runtime-programs.ts +27 -0
  340. package/src/procedures/types.ts +16 -0
  341. package/src/protocol.ts +108 -0
  342. package/src/server/host-policy.ts +8 -5
  343. package/src/server/host-procedures.ts +102 -0
  344. package/src/server/index.ts +5 -2
  345. package/src/server/procedure-server.ts +328 -12
  346. package/src/server/request-auth.ts +35 -0
  347. package/src/server/types.ts +37 -0
  348. package/src/timers.ts +82 -0
  349. package/src/tracing/traceparent.ts +61 -0
  350. package/dist/procedures/cli/announce.d.ts +0 -67
  351. package/dist/procedures/cli/announce.d.ts.map +0 -1
  352. package/dist/procedures/cli/announce.js +0 -392
  353. package/dist/procedures/cli/announce.js.map +0 -1
  354. package/dist/procedures/cli/discover.d.ts +0 -66
  355. package/dist/procedures/cli/discover.d.ts.map +0 -1
  356. package/dist/procedures/cli/discover.js +0 -310
  357. package/dist/procedures/cli/discover.js.map +0 -1
  358. package/dist/procedures/cli/index.d.ts +0 -13
  359. package/dist/procedures/cli/index.d.ts.map +0 -1
  360. package/dist/procedures/cli/index.js +0 -203
  361. package/dist/procedures/cli/index.js.map +0 -1
  362. package/dist/procedures/cli/init.d.ts +0 -17
  363. package/dist/procedures/cli/init.d.ts.map +0 -1
  364. package/dist/procedures/cli/init.js +0 -336
  365. package/dist/procedures/cli/init.js.map +0 -1
  366. package/src/procedures/cli/announce.ts +0 -470
  367. package/src/procedures/cli/discover.ts +0 -390
  368. package/src/procedures/cli/index.ts +0 -231
  369. package/src/procedures/cli/init.ts +0 -370
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Wire protocol v1 (roadmap R25). `documentation/WIRE-PROTOCOL.md` specifies the formats.
3
+ *
4
+ * - The version: a WebSocket connection starts with a `hello` frame of each side, and an HTTP
5
+ * request and its response carry the `Procedures-Protocol` header. A side refuses a newer
6
+ * version with `PROTOCOL_VERSION`.
7
+ * - One list of error codes for all faces, with the HTTP status of each.
8
+ * - A change after v1 adds only optional fields, or it makes v2.
9
+ */
10
+
11
+ /** The version of the wire protocol that this package speaks. */
12
+ export const PROTOCOL_VERSION = 1;
13
+
14
+ /** The HTTP header of the protocol version, on a request and on its response. */
15
+ export const PROTOCOL_HEADER = "Procedures-Protocol";
16
+
17
+ /** The facts of one error code. */
18
+ export interface ErrorCodeInfo {
19
+ /** The HTTP status of an error with this code. */
20
+ readonly http: number;
21
+ /** True when a retry of the same call can succeed. The error item can say otherwise. */
22
+ readonly retryable: boolean;
23
+ /** What the code means. */
24
+ readonly meaning: string;
25
+ }
26
+
27
+ /** An error code of the protocol. */
28
+ export type ProtocolErrorCode =
29
+ | "NOT_FOUND"
30
+ | "NO_HANDLER"
31
+ | "NOT_EXPOSED"
32
+ | "NOT_DECLARED"
33
+ | "FORBIDDEN"
34
+ | "UNAUTHORIZED"
35
+ | "VALIDATION_ERROR"
36
+ | "INVALID_REQUEST"
37
+ | "PROTOCOL_VERSION"
38
+ | "OUTPUT_VALIDATION_ERROR"
39
+ | "NO_OUTPUT"
40
+ | "HANDLER_ERROR"
41
+ | "INTERNAL_ERROR"
42
+ | "NOT_ACCEPTABLE"
43
+ | "DUPLICATE"
44
+ | "DUPLICATE_REQUEST"
45
+ | "ABORTED"
46
+ | "TIMEOUT"
47
+ | "UNAVAILABLE"
48
+ | "CONNECTION_CLOSED"
49
+ | "CONNECTION_NOT_FOUND";
50
+
51
+ /**
52
+ * The error codes of the protocol, on each face (HTTP, WebSocket, MCP, local). An error that a
53
+ * handler throws with its own `code` keeps it, for a value and for a stream (`errorCodeOf`). The
54
+ * HTTP status follows the code: the status of this list, the status of `ERROR_REGISTRY` for
55
+ * another known code, or 500.
56
+ */
57
+ export const ERROR_CODES: Readonly<Record<ProtocolErrorCode, ErrorCodeInfo>> = {
58
+ NOT_FOUND: { http: 404, retryable: false, meaning: "No procedure has the path, or the host does not expose it" },
59
+ NO_HANDLER: { http: 404, retryable: false, meaning: "The procedure has no handler here (a stub of a remote host)" },
60
+ NOT_EXPOSED: { http: 403, retryable: false, meaning: "A nested call reached a procedure that the host does not expose" },
61
+ NOT_DECLARED: { http: 403, retryable: false, meaning: "A nested call is not in the calls that the procedure declares" },
62
+ FORBIDDEN: { http: 403, retryable: false, meaning: "The capability of the call refuses it. The metadata key reason tells why" },
63
+ UNAUTHORIZED: { http: 401, retryable: false, meaning: "The request does not present the token of the server" },
64
+ VALIDATION_ERROR: { http: 400, retryable: false, meaning: "The input does not agree with the input schema" },
65
+ INVALID_REQUEST: { http: 400, retryable: false, meaning: "The request is not a valid request of the protocol" },
66
+ PROTOCOL_VERSION: { http: 400, retryable: false, meaning: "The other side speaks a newer version of the protocol" },
67
+ OUTPUT_VALIDATION_ERROR: { http: 500, retryable: false, meaning: "The output does not agree with the output schema" },
68
+ NO_OUTPUT: { http: 500, retryable: false, meaning: "The procedure gave no output" },
69
+ HANDLER_ERROR: { http: 500, retryable: false, meaning: "The handler threw an error without a code" },
70
+ INTERNAL_ERROR: { http: 500, retryable: false, meaning: "The server failed outside the handler" },
71
+ NOT_ACCEPTABLE: { http: 406, retryable: false, meaning: "The face cannot give the output: a stream without an end, without NDJSON" },
72
+ DUPLICATE: { http: 409, retryable: false, meaning: "An idempotency key gave a stream, and a stream cannot be given again" },
73
+ DUPLICATE_REQUEST: { http: 409, retryable: false, meaning: "A request with this id is still running on the connection" },
74
+ ABORTED: { http: 499, retryable: false, meaning: "The caller aborted the call" },
75
+ TIMEOUT: { http: 504, retryable: false, meaning: "The deadline of the call passed" },
76
+ UNAVAILABLE: { http: 503, retryable: true, meaning: "The server cannot take the call now: it stops, or it is busy" },
77
+ CONNECTION_CLOSED: { http: 503, retryable: true, meaning: "The connection closed before the call left" },
78
+ CONNECTION_NOT_FOUND: { http: 404, retryable: false, meaning: "The server has no connection with this id" },
79
+ };
80
+
81
+ /** True when a code is an error code of the protocol. */
82
+ export function isProtocolErrorCode(code: unknown): code is ProtocolErrorCode {
83
+ return typeof code === "string" && Object.prototype.hasOwnProperty.call(ERROR_CODES, code);
84
+ }
85
+
86
+ /**
87
+ * The code of an error that a handler or an invocation throws, on each face: its own code when
88
+ * it is a string, or `HANDLER_ERROR`. An invocation error has a code of this list. Before, a
89
+ * value lost the own code of a handler error, and a stream kept it (roadmap R30).
90
+ */
91
+ export function errorCodeOf(error: unknown): string {
92
+ const code = (error as { code?: unknown } | null | undefined)?.code;
93
+ return typeof code === "string" ? code : "HANDLER_ERROR";
94
+ }
95
+
96
+ /** The HTTP status of an error code, or undefined for a code that is not in the list. */
97
+ export function httpStatusOf(code: unknown): number | undefined {
98
+ return isProtocolErrorCode(code) ? ERROR_CODES[code].http : undefined;
99
+ }
100
+
101
+ /**
102
+ * The protocol version that a peer sends, or undefined when it sends none (an older peer, which
103
+ * speaks the formats of v1 without the version).
104
+ */
105
+ export function protocolVersionOf(value: unknown): number | undefined {
106
+ const version = typeof value === "number" ? value : typeof value === "string" ? Number(value) : NaN;
107
+ return Number.isInteger(version) && version > 0 ? version : undefined;
108
+ }
@@ -10,7 +10,7 @@
10
10
  * procedure.
11
11
  * - `strictCalls`: a procedure of code that declares no `metadata.calls` calls only exposed
12
12
  * procedures (a host for an outside caller sets it).
13
- * - `timeoutMs`: the time limit of each call from a caller (not of its nested calls).
13
+ * - `timeout`: the time limit of each call from a caller (not of its nested calls).
14
14
  * - `token`, `browser`: the checks of the network transports (`client-server` applies them).
15
15
  * - `capability`, `readOnly`, `clearanceOrder`, `resources`, `admitItem`: the capability of each
16
16
  * call and what the host gives for it (CAPABILITIES-2026-10).
@@ -24,6 +24,7 @@ import { timeoutInterceptor } from "../procedures/interceptors.js";
24
24
  import type { BrowserGuardOptions } from "./browser-guard.js";
25
25
  import type { ProcedureRegistry } from "../procedures/registry.js";
26
26
  import type { ProcedureServerOptions } from "./procedure-server.js";
27
+ import { toMs, type Duration } from "../duration.js";
27
28
 
28
29
  /** The procedures of a host that are tools: namespaces (first path segments), less some keys. */
29
30
  export interface ToolSurface {
@@ -63,8 +64,8 @@ export interface HostPolicyOptions {
63
64
  exclude?: readonly string[] | undefined;
64
65
  /** A procedure of code with no `metadata.calls` calls only exposed procedures. */
65
66
  strictCalls?: boolean | undefined;
66
- /** The time limit of each call from a caller, in milliseconds. 0 or no value: no limit. */
67
- timeoutMs?: number | undefined;
67
+ /** The time limit of each call from a caller, for example `minutes(10)`. 0 or no value: no limit. */
68
+ timeout?: Duration | undefined;
68
69
  /** More interceptors, after the policy's own (tracing, metrics). */
69
70
  interceptors?: readonly Interceptor[] | undefined;
70
71
  /** The token that each network request must send (HTTP and WebSocket transports). */
@@ -130,8 +131,8 @@ function exposeOf(options: HostPolicyOptions): ((path: ProcedurePath) => boolean
130
131
  /** This function builds the policy of a host from its options. */
131
132
  export function hostPolicy(options: HostPolicyOptions = {}): HostPolicy {
132
133
  const interceptors: Interceptor[] = [];
133
- if (options.timeoutMs !== undefined && options.timeoutMs > 0) {
134
- interceptors.push(timeoutInterceptor({ ms: options.timeoutMs }));
134
+ if (options.timeout !== undefined && toMs(options.timeout, "timeout") > 0) {
135
+ interceptors.push(timeoutInterceptor({ limit: options.timeout }));
135
136
  }
136
137
  interceptors.push(...(options.interceptors ?? []));
137
138
  return {
@@ -154,6 +155,8 @@ export function procedureServerOptions(policy: HostPolicy, registry?: ProcedureR
154
155
  ...(registry ? { registry } : {}),
155
156
  ...(policy.expose ? { expose: policy.expose } : {}),
156
157
  strictCalls: policy.strictCalls,
158
+ // The token of the policy: ProcedureServer examines it for each network request (R18)
159
+ ...(policy.token !== undefined ? { token: policy.token } : {}),
157
160
  ...(policy.interceptors.length > 0 ? { interceptors: policy.interceptors } : {}),
158
161
  ...(policy.capabilityOf ? { capability: policy.capabilityOf } : {}),
159
162
  ...(policy.clearanceOrder ? { clearanceOrder: policy.clearanceOrder } : {}),
@@ -0,0 +1,102 @@
1
+ /**
2
+ * The procedures of a host (roadmap R19): `host.health`, `host.info` and `host.metrics`.
3
+ *
4
+ * Before, a peer gave its health only as an Express route (`/health`), and the counts of
5
+ * `metricsInterceptor` had no way out. A host pins these procedures on its `ProcedureServer`
6
+ * (`registerProcedure`), so they do not change the registry that the host serves. A call needs
7
+ * the token of the host, as each other call does. The `/health` route stays for the checks
8
+ * that have no token.
9
+ */
10
+
11
+ import { z } from "zod";
12
+ import { createProcedure } from "../procedures/define.js";
13
+ import { PURE_EFFECTS } from "../procedures/effects.js";
14
+ import type { AnyProcedure } from "../procedures/types.js";
15
+ import type { MetricsInterceptor } from "../procedures/interceptors.js";
16
+ import type { ProcedureServer } from "./procedure-server.js";
17
+
18
+ /** What a host tells about itself. */
19
+ export interface HostSource {
20
+ /** The id of the host (the peer id). */
21
+ readonly id: string;
22
+ /** The time at which the host started, from `Date.now()`. */
23
+ readonly startedAt: number;
24
+ /** The server of the host. */
25
+ readonly server: ProcedureServer;
26
+ /** The endpoints of the host, when it has network transports. */
27
+ readonly endpoints?: (() => ReadonlyArray<{ type: string; address: string }>) | undefined;
28
+ /** The metrics interceptor of the host, when it counts its calls. */
29
+ readonly metrics?: MetricsInterceptor | undefined;
30
+ }
31
+
32
+ const healthOutput = z.object({
33
+ status: z.enum(["ok", "stopping"]).describe("ok, or stopping while the host waits for its calls in flight"),
34
+ uptimeMs: z.number().describe("The time since the start of the host, in milliseconds"),
35
+ procedures: z.number().describe("The number of procedures that the host serves"),
36
+ callsInFlight: z.number().describe("The calls that run now, streams included"),
37
+ peerId: z.string().describe("The id of the host"),
38
+ });
39
+
40
+ const infoOutput = z.object({
41
+ peerId: z.string().describe("The id of the host"),
42
+ startedAt: z.string().describe("The start time of the host (ISO 8601)"),
43
+ endpoints: z.array(z.object({ type: z.string(), address: z.string() })).describe("The network endpoints of the host"),
44
+ runtime: z.string().describe("The runtime of the host, for example node 24.1.0"),
45
+ });
46
+
47
+ const metricsOutput = z.object({
48
+ procedures: z
49
+ .record(
50
+ z.string(),
51
+ z.object({ calls: z.number(), errors: z.number(), totalMs: z.number(), maxMs: z.number() }),
52
+ )
53
+ .describe("The calls, the errors and the time of each procedure since the start, by key"),
54
+ });
55
+
56
+ /** The runtime of this process: its name and version. */
57
+ function runtimeOf(): string {
58
+ const process = (globalThis as { process?: { versions?: { node?: string } } }).process;
59
+ if (process?.versions?.node) return `node ${process.versions.node}`;
60
+ const navigator = (globalThis as { navigator?: { userAgent?: string } }).navigator;
61
+ return navigator?.userAgent ?? "unknown";
62
+ }
63
+
64
+ /** This function gives the procedures of a host: `host.health`, `host.info` and `host.metrics`. */
65
+ export function hostProcedures(source: HostSource): AnyProcedure[] {
66
+ const health = createProcedure()
67
+ .path(["host", "health"])
68
+ .input(z.object({}))
69
+ .output(healthOutput)
70
+ .meta({ description: "The health of the host: its state, its uptime and its calls in flight", effects: PURE_EFFECTS })
71
+ .handler(async () => ({
72
+ status: source.server.stopping ? ("stopping" as const) : ("ok" as const),
73
+ uptimeMs: Date.now() - source.startedAt,
74
+ procedures: source.server.procedureCount,
75
+ callsInFlight: source.server.callsInFlight,
76
+ peerId: source.id,
77
+ }))
78
+ .build();
79
+
80
+ const info = createProcedure()
81
+ .path(["host", "info"])
82
+ .input(z.object({}))
83
+ .output(infoOutput)
84
+ .meta({ description: "The identity of the host: its id, its start time, its endpoints and its runtime", effects: PURE_EFFECTS })
85
+ .handler(async () => ({
86
+ peerId: source.id,
87
+ startedAt: new Date(source.startedAt).toISOString(),
88
+ endpoints: [...(source.endpoints?.() ?? [])],
89
+ runtime: runtimeOf(),
90
+ }))
91
+ .build();
92
+
93
+ const metrics = createProcedure()
94
+ .path(["host", "metrics"])
95
+ .input(z.object({}))
96
+ .output(metricsOutput)
97
+ .meta({ description: "The calls, the errors and the time of each procedure since the start of the host", effects: PURE_EFFECTS })
98
+ .handler(async () => ({ procedures: source.metrics?.snapshot() ?? {} }))
99
+ .build();
100
+
101
+ return [health, info, metrics] as AnyProcedure[];
102
+ }
@@ -37,14 +37,17 @@
37
37
  export { Server } from "./server.js";
38
38
  export type { ServerOptions } from "./server.js";
39
39
 
40
- export { ProcedureServer, createProcedureServer } from "./procedure-server.js";
41
- export type { ProcedureServerOptions, StorageConfig } from "./procedure-server.js";
40
+ export { ProcedureServer, createProcedureServer, STREAM_METADATA_KEY, isUnboundedStream } from "./procedure-server.js";
41
+ export type { ProcedureServerOptions, StorageConfig, StopOptions, UseStorageOptions } from "./procedure-server.js";
42
42
  export { pathToMethod, methodToPath } from "./method.js";
43
43
  export {
44
44
  HandlerNotFoundError,
45
45
  ServerError,
46
46
  type ServerRequest,
47
47
  type ServerResponse,
48
+ type RequestHandler,
49
+ type Credentials,
50
+ type Principal,
48
51
  type ServerHandler,
49
52
  type ServerMiddleware,
50
53
  type ServerContext,