@procedures/client 0.2.2 → 0.3.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 (299) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/README.md +61 -38
  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 +53 -20
  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 +63 -4
  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/transport.d.ts +47 -7
  38. package/dist/adapters/websocket/client/transport.d.ts.map +1 -1
  39. package/dist/adapters/websocket/client/transport.js +213 -67
  40. package/dist/adapters/websocket/client/transport.js.map +1 -1
  41. package/dist/adapters/websocket/client/types.d.ts +70 -21
  42. package/dist/adapters/websocket/client/types.d.ts.map +1 -1
  43. package/dist/adapters/websocket/client/types.js.map +1 -1
  44. package/dist/adapters/websocket/server/transport.d.ts +65 -24
  45. package/dist/adapters/websocket/server/transport.d.ts.map +1 -1
  46. package/dist/adapters/websocket/server/transport.js +192 -263
  47. package/dist/adapters/websocket/server/transport.js.map +1 -1
  48. package/dist/adapters/websocket/server/types.d.ts +20 -1
  49. package/dist/adapters/websocket/server/types.d.ts.map +1 -1
  50. package/dist/adapters/websocket/shared/rpc.d.ts +129 -0
  51. package/dist/adapters/websocket/shared/rpc.d.ts.map +1 -0
  52. package/dist/adapters/websocket/shared/rpc.js +425 -0
  53. package/dist/adapters/websocket/shared/rpc.js.map +1 -0
  54. package/dist/browser.d.ts +29 -7
  55. package/dist/browser.d.ts.map +1 -1
  56. package/dist/browser.js +26 -3
  57. package/dist/browser.js.map +1 -1
  58. package/dist/client/call-types.d.ts +10 -10
  59. package/dist/client/call-types.d.ts.map +1 -1
  60. package/dist/client/call-types.js +1 -6
  61. package/dist/client/call-types.js.map +1 -1
  62. package/dist/client/client.d.ts +6 -1
  63. package/dist/client/client.d.ts.map +1 -1
  64. package/dist/client/client.js +23 -9
  65. package/dist/client/client.js.map +1 -1
  66. package/dist/client/deadline.d.ts +38 -0
  67. package/dist/client/deadline.d.ts.map +1 -0
  68. package/dist/client/deadline.js +60 -0
  69. package/dist/client/deadline.js.map +1 -0
  70. package/dist/client/errors/factory.d.ts.map +1 -1
  71. package/dist/client/errors/factory.js +11 -7
  72. package/dist/client/errors/factory.js.map +1 -1
  73. package/dist/client/index.d.ts +9 -2
  74. package/dist/client/index.d.ts.map +1 -1
  75. package/dist/client/index.js +8 -2
  76. package/dist/client/index.js.map +1 -1
  77. package/dist/client/middleware/cache.d.ts +19 -5
  78. package/dist/client/middleware/cache.d.ts.map +1 -1
  79. package/dist/client/middleware/cache.js +106 -18
  80. package/dist/client/middleware/cache.js.map +1 -1
  81. package/dist/client/middleware/circuit-breaker.d.ts +28 -10
  82. package/dist/client/middleware/circuit-breaker.d.ts.map +1 -1
  83. package/dist/client/middleware/circuit-breaker.js +35 -24
  84. package/dist/client/middleware/circuit-breaker.js.map +1 -1
  85. package/dist/client/middleware/contexts.d.ts +16 -10
  86. package/dist/client/middleware/contexts.d.ts.map +1 -1
  87. package/dist/client/middleware/contexts.js.map +1 -1
  88. package/dist/client/middleware/items.d.ts +31 -2
  89. package/dist/client/middleware/items.d.ts.map +1 -1
  90. package/dist/client/middleware/items.js +86 -6
  91. package/dist/client/middleware/items.js.map +1 -1
  92. package/dist/client/middleware/lru.d.ts +2 -0
  93. package/dist/client/middleware/lru.d.ts.map +1 -1
  94. package/dist/client/middleware/lru.js +11 -0
  95. package/dist/client/middleware/lru.js.map +1 -1
  96. package/dist/client/middleware/rate-limit.d.ts +7 -6
  97. package/dist/client/middleware/rate-limit.d.ts.map +1 -1
  98. package/dist/client/middleware/rate-limit.js +9 -6
  99. package/dist/client/middleware/rate-limit.js.map +1 -1
  100. package/dist/client/middleware/resilience.d.ts +61 -0
  101. package/dist/client/middleware/resilience.d.ts.map +1 -0
  102. package/dist/client/middleware/resilience.js +59 -0
  103. package/dist/client/middleware/resilience.js.map +1 -0
  104. package/dist/client/middleware/retry.d.ts +45 -11
  105. package/dist/client/middleware/retry.d.ts.map +1 -1
  106. package/dist/client/middleware/retry.js +102 -22
  107. package/dist/client/middleware/retry.js.map +1 -1
  108. package/dist/client/middleware/timeout.d.ts +15 -12
  109. package/dist/client/middleware/timeout.d.ts.map +1 -1
  110. package/dist/client/middleware/timeout.js +46 -37
  111. package/dist/client/middleware/timeout.js.map +1 -1
  112. package/dist/client/middleware/tracing.d.ts.map +1 -1
  113. package/dist/client/middleware/tracing.js +11 -3
  114. package/dist/client/middleware/tracing.js.map +1 -1
  115. package/dist/client/types.d.ts +9 -1
  116. package/dist/client/types.d.ts.map +1 -1
  117. package/dist/client/types.js.map +1 -1
  118. package/dist/clock.d.ts +19 -0
  119. package/dist/clock.d.ts.map +1 -0
  120. package/dist/clock.js +18 -0
  121. package/dist/clock.js.map +1 -0
  122. package/dist/duration.d.ts +37 -0
  123. package/dist/duration.d.ts.map +1 -0
  124. package/dist/duration.js +44 -0
  125. package/dist/duration.js.map +1 -0
  126. package/dist/machines.d.ts +90 -0
  127. package/dist/machines.d.ts.map +1 -0
  128. package/dist/machines.js +127 -0
  129. package/dist/machines.js.map +1 -0
  130. package/dist/procedures/capability.d.ts +3 -6
  131. package/dist/procedures/capability.d.ts.map +1 -1
  132. package/dist/procedures/capability.js +11 -9
  133. package/dist/procedures/capability.js.map +1 -1
  134. package/dist/procedures/collection/index.d.ts +3 -3
  135. package/dist/procedures/collection/index.d.ts.map +1 -1
  136. package/dist/procedures/collection/index.js +1 -1
  137. package/dist/procedures/collection/index.js.map +1 -1
  138. package/dist/procedures/collection/procedures.d.ts.map +1 -1
  139. package/dist/procedures/collection/procedures.js +49 -1
  140. package/dist/procedures/collection/procedures.js.map +1 -1
  141. package/dist/procedures/collection/schemas.d.ts +33 -0
  142. package/dist/procedures/collection/schemas.d.ts.map +1 -1
  143. package/dist/procedures/collection/schemas.js +68 -0
  144. package/dist/procedures/collection/schemas.js.map +1 -1
  145. package/dist/procedures/collection/storage.d.ts +37 -0
  146. package/dist/procedures/collection/storage.d.ts.map +1 -1
  147. package/dist/procedures/core/array.d.ts.map +1 -1
  148. package/dist/procedures/core/array.js +26 -15
  149. package/dist/procedures/core/array.js.map +1 -1
  150. package/dist/procedures/core/index.d.ts.map +1 -1
  151. package/dist/procedures/core/index.js +8 -0
  152. package/dist/procedures/core/index.js.map +1 -1
  153. package/dist/procedures/core/meta.d.ts.map +1 -1
  154. package/dist/procedures/core/meta.js +2 -1
  155. package/dist/procedures/core/meta.js.map +1 -1
  156. package/dist/procedures/core/object.d.ts.map +1 -1
  157. package/dist/procedures/core/object.js +42 -13
  158. package/dist/procedures/core/object.js.map +1 -1
  159. package/dist/procedures/core/operands.d.ts.map +1 -1
  160. package/dist/procedures/core/operands.js +6 -1
  161. package/dist/procedures/core/operands.js.map +1 -1
  162. package/dist/procedures/core/string.d.ts.map +1 -1
  163. package/dist/procedures/core/string.js +4 -2
  164. package/dist/procedures/core/string.js.map +1 -1
  165. package/dist/procedures/define-procedure.d.ts +19 -7
  166. package/dist/procedures/define-procedure.d.ts.map +1 -1
  167. package/dist/procedures/define-procedure.js +66 -21
  168. package/dist/procedures/define-procedure.js.map +1 -1
  169. package/dist/procedures/effects.d.ts +16 -0
  170. package/dist/procedures/effects.d.ts.map +1 -1
  171. package/dist/procedures/effects.js +33 -0
  172. package/dist/procedures/effects.js.map +1 -1
  173. package/dist/procedures/idempotency.d.ts +73 -0
  174. package/dist/procedures/idempotency.d.ts.map +1 -0
  175. package/dist/procedures/idempotency.js +131 -0
  176. package/dist/procedures/idempotency.js.map +1 -0
  177. package/dist/procedures/index.d.ts +7 -3
  178. package/dist/procedures/index.d.ts.map +1 -1
  179. package/dist/procedures/index.js +6 -2
  180. package/dist/procedures/index.js.map +1 -1
  181. package/dist/procedures/interceptors.d.ts +17 -4
  182. package/dist/procedures/interceptors.d.ts.map +1 -1
  183. package/dist/procedures/interceptors.js +18 -7
  184. package/dist/procedures/interceptors.js.map +1 -1
  185. package/dist/procedures/invoke.d.ts +15 -3
  186. package/dist/procedures/invoke.d.ts.map +1 -1
  187. package/dist/procedures/invoke.js +8 -3
  188. package/dist/procedures/invoke.js.map +1 -1
  189. package/dist/procedures/manifest.d.ts +83 -0
  190. package/dist/procedures/manifest.d.ts.map +1 -0
  191. package/dist/procedures/manifest.js +90 -0
  192. package/dist/procedures/manifest.js.map +1 -0
  193. package/dist/procedures/runtime-programs.d.ts +19 -0
  194. package/dist/procedures/runtime-programs.d.ts.map +1 -0
  195. package/dist/procedures/runtime-programs.js +24 -0
  196. package/dist/procedures/runtime-programs.js.map +1 -0
  197. package/dist/procedures/types.d.ts +20 -1
  198. package/dist/procedures/types.d.ts.map +1 -1
  199. package/dist/procedures/types.js.map +1 -1
  200. package/dist/protocol.d.ts +40 -0
  201. package/dist/protocol.d.ts.map +1 -0
  202. package/dist/protocol.js +58 -0
  203. package/dist/protocol.js.map +1 -0
  204. package/dist/server/host-policy.d.ts +4 -3
  205. package/dist/server/host-policy.d.ts.map +1 -1
  206. package/dist/server/host-policy.js +6 -3
  207. package/dist/server/host-policy.js.map +1 -1
  208. package/dist/server/host-procedures.d.ts +31 -0
  209. package/dist/server/host-procedures.d.ts.map +1 -0
  210. package/dist/server/host-procedures.js +75 -0
  211. package/dist/server/host-procedures.js.map +1 -0
  212. package/dist/server/index.d.ts +3 -3
  213. package/dist/server/index.d.ts.map +1 -1
  214. package/dist/server/index.js +1 -1
  215. package/dist/server/index.js.map +1 -1
  216. package/dist/server/procedure-server.d.ts +110 -4
  217. package/dist/server/procedure-server.d.ts.map +1 -1
  218. package/dist/server/procedure-server.js +269 -17
  219. package/dist/server/procedure-server.js.map +1 -1
  220. package/dist/server/request-auth.d.ts +19 -0
  221. package/dist/server/request-auth.d.ts.map +1 -0
  222. package/dist/server/request-auth.js +32 -0
  223. package/dist/server/request-auth.js.map +1 -0
  224. package/dist/server/types.d.ts +32 -0
  225. package/dist/server/types.d.ts.map +1 -1
  226. package/dist/server/types.js.map +1 -1
  227. package/dist/timers.d.ts +60 -0
  228. package/dist/timers.d.ts.map +1 -0
  229. package/dist/timers.js +33 -0
  230. package/dist/timers.js.map +1 -0
  231. package/dist/tracing/traceparent.d.ts +26 -0
  232. package/dist/tracing/traceparent.d.ts.map +1 -0
  233. package/dist/tracing/traceparent.js +53 -0
  234. package/dist/tracing/traceparent.js.map +1 -0
  235. package/package.json +7 -1
  236. package/src/adapters/http/client/transport.ts +31 -3
  237. package/src/adapters/http/client/types.ts +3 -2
  238. package/src/adapters/http/server/transport.ts +60 -24
  239. package/src/adapters/http/shared/headers.ts +7 -6
  240. package/src/adapters/local/client/transport.ts +70 -5
  241. package/src/adapters/local/client/types.ts +18 -0
  242. package/src/adapters/mock/client/transport.ts +9 -6
  243. package/src/adapters/mock/client/types.ts +7 -6
  244. package/src/adapters/port/transport.ts +124 -0
  245. package/src/adapters/websocket/client/index.ts +1 -0
  246. package/src/adapters/websocket/client/transport.ts +232 -73
  247. package/src/adapters/websocket/client/types.ts +80 -21
  248. package/src/adapters/websocket/server/transport.ts +199 -301
  249. package/src/adapters/websocket/server/types.ts +20 -1
  250. package/src/adapters/websocket/shared/rpc.ts +453 -0
  251. package/src/browser.ts +51 -3
  252. package/src/client/call-types.ts +10 -14
  253. package/src/client/client.ts +28 -9
  254. package/src/client/deadline.ts +64 -0
  255. package/src/client/errors/factory.ts +12 -8
  256. package/src/client/index.ts +21 -3
  257. package/src/client/middleware/cache.ts +120 -23
  258. package/src/client/middleware/circuit-breaker.ts +65 -35
  259. package/src/client/middleware/contexts.ts +17 -10
  260. package/src/client/middleware/items.ts +101 -6
  261. package/src/client/middleware/lru.ts +12 -0
  262. package/src/client/middleware/rate-limit.ts +9 -7
  263. package/src/client/middleware/resilience.ts +81 -0
  264. package/src/client/middleware/retry.ts +146 -34
  265. package/src/client/middleware/timeout.ts +55 -46
  266. package/src/client/middleware/tracing.ts +13 -4
  267. package/src/client/types.ts +9 -1
  268. package/src/clock.ts +21 -0
  269. package/src/duration.ts +56 -0
  270. package/src/machines.ts +186 -0
  271. package/src/procedures/capability.ts +11 -9
  272. package/src/procedures/collection/index.ts +9 -1
  273. package/src/procedures/collection/procedures.ts +57 -0
  274. package/src/procedures/collection/schemas.ts +110 -0
  275. package/src/procedures/collection/storage.ts +38 -0
  276. package/src/procedures/core/array.ts +27 -16
  277. package/src/procedures/core/index.ts +8 -0
  278. package/src/procedures/core/meta.ts +2 -1
  279. package/src/procedures/core/object.ts +48 -14
  280. package/src/procedures/core/operands.ts +7 -0
  281. package/src/procedures/core/string.ts +4 -2
  282. package/src/procedures/define-procedure.ts +82 -24
  283. package/src/procedures/effects.ts +35 -0
  284. package/src/procedures/idempotency.ts +152 -0
  285. package/src/procedures/index.ts +18 -2
  286. package/src/procedures/interceptors.ts +28 -11
  287. package/src/procedures/invoke.ts +19 -5
  288. package/src/procedures/manifest.ts +158 -0
  289. package/src/procedures/runtime-programs.ts +27 -0
  290. package/src/procedures/types.ts +20 -1
  291. package/src/protocol.ts +97 -0
  292. package/src/server/host-policy.ts +8 -5
  293. package/src/server/host-procedures.ts +102 -0
  294. package/src/server/index.ts +5 -2
  295. package/src/server/procedure-server.ts +324 -10
  296. package/src/server/request-auth.ts +35 -0
  297. package/src/server/types.ts +37 -0
  298. package/src/timers.ts +82 -0
  299. package/src/tracing/traceparent.ts +61 -0
@@ -4,7 +4,10 @@
4
4
  * Protocol-agnostic timeout handling with per-request and overall timeouts.
5
5
  * Works with any transport!
6
6
  */
7
- import { ABORTED_FIRST, errorItem, nextOrAbort } from "./items.js";
7
+ import { ABORTED_FIRST, abortedItem, errorItem, nextOrAbort, withDelivery } from "./items.js";
8
+ import { deadlineOf, narrowDeadline, restoreDeadline } from "../deadline.js";
9
+ import { resilience } from "./resilience.js";
10
+ import { optionalMs } from "../../duration.js";
8
11
  /**
9
12
  * Compose multiple AbortSignals into one.
10
13
  *
@@ -55,15 +58,16 @@ function composeAbortSignals(...signals) {
55
58
  // Fall through to manual composition if AbortSignal.any() fails
56
59
  }
57
60
  }
58
- // Fallback: Manual composition for older environments
61
+ // Fallback: Manual composition for older environments. The composed signal keeps the reason of
62
+ // the signal that aborted, as with AbortSignal.any() (before, it got a new AbortError).
59
63
  const controller = new AbortController();
60
64
  const abortListeners = [];
61
65
  for (const signal of validSignals) {
62
66
  if (signal.aborted) {
63
- controller.abort();
67
+ controller.abort(signal.reason);
64
68
  break;
65
69
  }
66
- const listener = () => controller.abort();
70
+ const listener = () => controller.abort(signal.reason);
67
71
  signal.addEventListener("abort", listener, { once: true });
68
72
  abortListeners.push(() => signal.removeEventListener("abort", listener));
69
73
  }
@@ -77,7 +81,8 @@ function composeAbortSignals(...signals) {
77
81
  /**
78
82
  * Run `next` with a timeout. When the time runs out, the request's signal aborts, and the
79
83
  * reader gets one TIMEOUT error item in place of the transport's ABORTED item or thrown error.
80
- * The middleware does not wait for a transport that ignores the signal.
84
+ * The middleware does not wait for a transport that ignores the signal: not after the timeout,
85
+ * and not after an abort of the caller, which gives an ABORTED item.
81
86
  *
82
87
  * Before, the middleware waited for a thrown error, but the transports yield error items: the
83
88
  * reader got "ABORTED" (not retryable), so a per-attempt timeout with retry never retried, and
@@ -86,23 +91,31 @@ function composeAbortSignals(...signals) {
86
91
  async function* runWithTimeout(next, context, ms, message, retryable) {
87
92
  const timeoutController = new AbortController();
88
93
  const timeoutId = setTimeout(() => timeoutController.abort(), ms);
94
+ // The overall timeout is the deadline of the call: the transport sends its remaining time to
95
+ // the server (roadmap R10). The timeout of one try is not: the server keeps a keyed write
96
+ // until the next try can get its result, and the request signal stops another call.
97
+ const deadlineBefore = retryable ? deadlineOf(context.message.metadata) : narrowDeadline(context.message.metadata, Date.now() + ms);
89
98
  // Compose with existing signal
90
99
  const originalSignal = context.message.signal;
91
100
  const { controller: composedController, cleanup } = composeAbortSignals(originalSignal, timeoutController.signal);
92
101
  context.message.signal = composedController.signal;
93
102
  const timedOut = () => timeoutController.signal.aborted && !originalSignal?.aborted;
94
- const timeoutItem = () => errorItem(context.message.id, "TIMEOUT", message, retryable);
103
+ // The request left before the time ran out: the server can still run it (R1)
104
+ const timeoutItem = () => withDelivery(errorItem(context.message.id, "TIMEOUT", message, retryable), "indeterminate");
95
105
  const iterator = next(context)[Symbol.asyncIterator]();
96
106
  // "running": a next() may be pending; "done": the iterator ended; "abandoned": the timeout won
97
107
  let phase = "running";
98
108
  try {
99
109
  for (;;) {
100
- const result = await nextOrAbort(iterator, timeoutController.signal);
110
+ // The timeout and the abort of the caller both end the wait (roadmap R30: before, the wait
111
+ // ignored the abort of the caller, so a transport that ignored the signal kept the caller
112
+ // waiting until the timeout, and the caller got TIMEOUT for its own abort)
113
+ const result = await nextOrAbort(iterator, composedController.signal);
101
114
  if (result === ABORTED_FIRST) {
102
115
  phase = "abandoned";
103
- // The transport did not stop in time: end it in the background, and give the timeout
116
+ // The transport did not stop in time: end it in the background, and give the timeout or the abort
104
117
  void Promise.resolve(iterator.return?.()).catch(() => undefined);
105
- yield timeoutItem();
118
+ yield timedOut() ? timeoutItem() : abortedItem(context.message.id);
106
119
  return;
107
120
  }
108
121
  if (result.done) {
@@ -127,6 +140,7 @@ async function* runWithTimeout(next, context, ms, message, retryable) {
127
140
  }
128
141
  finally {
129
142
  clearTimeout(timeoutId);
143
+ restoreDeadline(context.message.metadata, deadlineBefore);
130
144
  cleanup();
131
145
  // Restore the caller's original signal; we only swapped in the composed signal for this
132
146
  // attempt. Leaving the (possibly aborted) composed signal in place poisons subsequent
@@ -156,21 +170,22 @@ async function* runWithTimeout(next, context, ms, message, retryable) {
156
170
  * @example
157
171
  * ```typescript
158
172
  * // Create middleware with default timeout
159
- * client.use(createOverallTimeoutMiddleware({ overall: 5000 }));
173
+ * client.use(createOverallTimeoutMiddleware({ overall: seconds(5) }));
160
174
  *
161
175
  * // Override per-call via context
162
176
  * await client.call(method, payload, {
163
- * context: { timeout: { overall: 10000 } }
177
+ * context: { timeout: { overall: seconds(10) } }
164
178
  * });
165
179
  * ```
166
180
  */
167
181
  export function createOverallTimeoutMiddleware(options) {
168
- const { overall: defaultOverall, message = "Overall request timeout" } = options;
182
+ const { message = "Overall request timeout" } = options;
183
+ const defaultOverall = optionalMs(options.overall, "overall");
169
184
  return (next) => {
170
185
  return async function* (context) {
171
186
  // Read from metadata first (user-provided context), then fall back to options
172
- const overall = context.message.metadata.timeout?.overall
173
- ?? defaultOverall;
187
+ const overall = optionalMs(context.message.metadata.timeout?.overall, "timeout.overall") ??
188
+ defaultOverall;
174
189
  if (!overall) {
175
190
  // No timeout - passthrough
176
191
  yield* next(context);
@@ -195,59 +210,53 @@ export function createOverallTimeoutMiddleware(options) {
195
210
  * @example
196
211
  * ```typescript
197
212
  * // Create middleware with default timeout
198
- * client.use(createTimeoutMiddleware({ perAttempt: 1000 }));
213
+ * client.use(createTimeoutMiddleware({ perAttempt: seconds(1) }));
199
214
  *
200
215
  * // Override per-call via context
201
216
  * await client.call(method, payload, {
202
- * context: { timeout: { perAttempt: 2000 } }
217
+ * context: { timeout: { perAttempt: seconds(2) } }
203
218
  * });
204
219
  * ```
205
220
  */
206
221
  export function createTimeoutMiddleware(options) {
207
- const { perAttempt: defaultPerAttempt, message = "Request timeout" } = options;
222
+ const { message = "Request timeout" } = options;
223
+ const defaultPerAttempt = optionalMs(options.perAttempt, "perAttempt");
208
224
  return (next) => {
209
225
  return async function* (context) {
210
226
  // Read from metadata first (user-provided context), then fall back to options
211
- const perAttempt = context.message.metadata.timeout?.perAttempt
212
- ?? defaultPerAttempt;
227
+ const perAttempt = optionalMs(context.message.metadata.timeout?.perAttempt, "timeout.perAttempt") ??
228
+ defaultPerAttempt;
213
229
  if (!perAttempt) {
214
230
  // No timeout - passthrough
215
231
  yield* next(context);
216
232
  return;
217
233
  }
234
+ // The limit of one try is at most the remaining time of the call (roadmap R10)
235
+ const deadline = deadlineOf(context.message.metadata);
236
+ const limit = deadline === undefined ? perAttempt : Math.max(0, Math.min(perAttempt, deadline - Date.now()));
218
237
  // A retry middleware outside this one can start a new attempt
219
- yield* runWithTimeout(next, context, perAttempt, message, true);
238
+ yield* runWithTimeout(next, context, limit, message, true);
220
239
  };
221
240
  };
222
241
  }
223
242
  /**
224
243
  * Create combined timeout middleware with both overall and per-attempt timeouts.
225
244
  *
245
+ * @deprecated Use `resilience({ overall, perAttempt, retry })`. This function puts the two
246
+ * timeouts in one slot, so a retry middleware that you add with another `use()` cannot sit
247
+ * between them: the retry is outside both, or inside both. `resilience` puts the retry between
248
+ * them (roadmap R10).
249
+ *
226
250
  * @param options - Timeout configuration
227
251
  * @returns Middleware function
228
252
  *
229
253
  * @example
230
254
  * ```typescript
231
- * client.use(createCombinedTimeoutMiddleware({
232
- * overall: 5000, // 5 seconds total
233
- * perAttempt: 1000 // 1 second per attempt
234
- * }));
255
+ * client.use(resilience({ overall: seconds(5), perAttempt: seconds(1), retry: { maxRetries: 2 } }));
235
256
  * ```
236
257
  */
237
258
  export function createCombinedTimeoutMiddleware(options) {
238
259
  const { overall, perAttempt, message = "Request timeout" } = options;
239
- return (next) => {
240
- // Compose both timeout middlewares
241
- let composed = next;
242
- if (perAttempt) {
243
- const perAttemptMiddleware = createTimeoutMiddleware({ perAttempt, message: `${message} (per-attempt)` });
244
- composed = perAttemptMiddleware(composed);
245
- }
246
- if (overall) {
247
- const overallMiddleware = createOverallTimeoutMiddleware({ overall, message: `${message} (overall)` });
248
- composed = overallMiddleware(composed);
249
- }
250
- return composed;
251
- };
260
+ return resilience({ overall, perAttempt, message });
252
261
  }
253
262
  //# sourceMappingURL=timeout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"timeout.js","sourceRoot":"","sources":["../../../src/client/middleware/timeout.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"timeout.js","sourceRoot":"","sources":["../../../src/client/middleware/timeout.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/tracing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,sDAAsD;IACtD,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC;IAE/B,qDAAqD;IACrD,cAAc,CAAC,EAAE,MAAM,MAAM,CAAC;IAE9B,iEAAiE;IACjE,eAAe,CAAC,EAAE,MAAM;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAEnE,+BAA+B;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AASD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,cAAmB,GAC3B,qBAAqB,CAAC,cAAc,EAAE,EAAE,CAAC,CAsC3C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,6BAA6B,IAAI,qBAAqB,CAAC,cAAc,EAAE,EAAE,CAAC,CAWzF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,IAAI,CAWP"}
1
+ {"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/tracing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,sDAAsD;IACtD,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC;IAE/B,qDAAqD;IACrD,cAAc,CAAC,EAAE,MAAM,MAAM,CAAC;IAE9B,iEAAiE;IACjE,eAAe,CAAC,EAAE,MAAM;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAEnE,+BAA+B;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AASD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,cAAmB,GAC3B,qBAAqB,CAAC,cAAc,EAAE,EAAE,CAAC,CA8C3C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,6BAA6B,IAAI,qBAAqB,CAAC,cAAc,EAAE,EAAE,CAAC,CAWzF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,IAAI,CAWP"}
@@ -11,6 +11,7 @@
11
11
  *
12
12
  * Compatible with OpenTelemetry, Jaeger, and custom tracing systems.
13
13
  */
14
+ import { TRACEPARENT_METADATA_KEY, formatTraceparent, isW3cIds, newSpanId, newTraceId, parseTraceparent } from "../../tracing/traceparent.js";
14
15
  /**
15
16
  * Generate a simple unique ID (UUID v4 subset)
16
17
  */
@@ -74,12 +75,14 @@ function generateId() {
74
75
  * ```
75
76
  */
76
77
  export function createTracingMiddleware(options = {}) {
77
- const { generateTraceId = generateId, generateSpanId = generateId, getCurrentTrace, serviceName, } = options;
78
+ // W3C ids by default, so the server continues the trace (roadmap R16)
79
+ const { generateTraceId = newTraceId, generateSpanId = newSpanId, getCurrentTrace, serviceName, } = options;
78
80
  return (next) => async function* (context) {
79
81
  // Check if there's already tracing metadata
80
82
  if (!context.message.metadata.tracing) {
81
- // Try to get current trace context
82
- const currentTrace = getCurrentTrace?.();
83
+ // Try to get current trace context: the function of the options, or the trace context of
84
+ // the caller (a call that a handler makes on a server carries the span of that handler)
85
+ const currentTrace = getCurrentTrace?.() ?? parseTraceparent(context.message.metadata[TRACEPARENT_METADATA_KEY]) ?? null;
83
86
  if (currentTrace) {
84
87
  // Continue existing trace (create child span)
85
88
  context.message.metadata.tracing = {
@@ -100,6 +103,11 @@ export function createTracingMiddleware(options = {}) {
100
103
  context.message.metadata["serviceName"] = serviceName;
101
104
  }
102
105
  }
106
+ // The W3C trace context of the call: the server continues this trace (R16)
107
+ const tracing = context.message.metadata.tracing;
108
+ if (tracing && isW3cIds(tracing.traceId, tracing.spanId)) {
109
+ context.message.metadata[TRACEPARENT_METADATA_KEY] = formatTraceparent(tracing.traceId, tracing.spanId);
110
+ }
103
111
  // Continue middleware chain
104
112
  yield* next(context);
105
113
  };
@@ -1 +1 @@
1
- {"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../../src/client/middleware/tracing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../../src/client/middleware/tracing.ts"],"names":[],"mappings":"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"}
@@ -22,7 +22,13 @@ export interface Method {
22
22
  service: string;
23
23
  /** Operation name (e.g., "get", "create", "update", "delete", "watch") */
24
24
  operation: string;
25
- /** Optional version (e.g., "v1", "v2") */
25
+ /**
26
+ * Optional version (e.g., "v1", "v2").
27
+ *
28
+ * @deprecated The wire protocol (v1, roadmap R25) has no version of a procedure: the server
29
+ * ignores this field. A URL strategy can put it in the path. Use a new path for a procedure
30
+ * that changes in a way that is not compatible.
31
+ */
26
32
  version?: string;
27
33
  }
28
34
  /**
@@ -58,6 +64,8 @@ export interface Metadata {
58
64
  retry?: {
59
65
  attempt: number;
60
66
  maxAttempts: number;
67
+ /** True: a second run of the call changes nothing more, so a retry is safe */
68
+ idempotent?: boolean;
61
69
  };
62
70
  /** Extensible for custom fields */
63
71
  [key: string]: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuTH;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAElB,MAAM;IACN,UAAU;IAF5B,YACkB,MAA0C,EAC1C,UAAkB;QAElC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;sBAHN,MAAM;0BACN,UAAU;QAG1B,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;IAC/B,CAAC;CACF"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+TH;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAElB,MAAM;IACN,UAAU;IAF5B,YACkB,MAA0C,EAC1C,UAAkB;QAElC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;sBAHN,MAAM;0BACN,UAAU;QAG1B,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;IAC/B,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * The clock of the core (roadmap R35). The retry, the circuit breaker and the WebSocket client
3
+ * read the time and start their timers only through a clock. Thus a test gives a fake clock, and
4
+ * the timing is exact and repeatable.
5
+ *
6
+ * The clock comes from `@mark1russell7/service/clock` (roadmap R37). The entry imports nothing
7
+ * else, and it has 228 bytes of gzip. The `fakeClock` of `@mark1russell7/service/testing` fits here.
8
+ * A `Cancel` of the platform also has `unref`. The circuit breaker uses it for its reset: a breaker
9
+ * must not keep a process alive for its reset time (BUGS-2026-07 M4).
10
+ */
11
+ import { type Cancel, type Clock } from "@mark1russell7/service/clock";
12
+ export type { Cancel, Clock };
13
+ /**
14
+ * The clock of the platform: `performance.now()` and `setTimeout`. Its timers keep a Node process
15
+ * alive, as `setTimeout` does: a script that waits for a retry does not end during the wait. The
16
+ * `realClock` of the service package is different: its timers do not keep a process alive.
17
+ */
18
+ export declare const realClock: Clock;
19
+ //# sourceMappingURL=clock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clock.d.ts","sourceRoot":"","sources":["../src/clock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAiB,KAAK,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAEtF,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAE9B;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,KAAuB,CAAC"}
package/dist/clock.js ADDED
@@ -0,0 +1,18 @@
1
+ /**
2
+ * The clock of the core (roadmap R35). The retry, the circuit breaker and the WebSocket client
3
+ * read the time and start their timers only through a clock. Thus a test gives a fake clock, and
4
+ * the timing is exact and repeatable.
5
+ *
6
+ * The clock comes from `@mark1russell7/service/clock` (roadmap R37). The entry imports nothing
7
+ * else, and it has 228 bytes of gzip. The `fakeClock` of `@mark1russell7/service/testing` fits here.
8
+ * A `Cancel` of the platform also has `unref`. The circuit breaker uses it for its reset: a breaker
9
+ * must not keep a process alive for its reset time (BUGS-2026-07 M4).
10
+ */
11
+ import { platformClock } from "@mark1russell7/service/clock";
12
+ /**
13
+ * The clock of the platform: `performance.now()` and `setTimeout`. Its timers keep a Node process
14
+ * alive, as `setTimeout` does: a script that waits for a retry does not end during the wait. The
15
+ * `realClock` of the service package is different: its timers do not keep a process alive.
16
+ */
17
+ export const realClock = platformClock();
18
+ //# sourceMappingURL=clock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clock.js","sourceRoot":"","sources":["../src/clock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAA2B,MAAM,8BAA8B,CAAC;AAItF;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAU,aAAa,EAAE,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Typed durations (roadmap R11).
3
+ *
4
+ * Each public option of this package that is a time takes a `Duration`: a quantity of
5
+ * `@mark1russell7/quantity` with a time unit. A plain number is a type error, so `timeout: 5`
6
+ * cannot mean five milliseconds in one place and five seconds in another. The wire keeps
7
+ * milliseconds (`procedure-timeout`), and the internals convert each duration one time, when an
8
+ * option is read.
9
+ *
10
+ * `@mark1russell7/quantity` has no `Duration` type yet. This alias narrows its `Quantity` to the
11
+ * time units, so the type also refuses `{ value: 5, unit: "kg" }`.
12
+ */
13
+ import { type Quantity } from "@mark1russell7/quantity";
14
+ /** The canonical time units of `@mark1russell7/quantity` that a duration of this package uses. */
15
+ export type TimeUnit = "ns" | "us" | "ms" | "s" | "min" | "h" | "d";
16
+ /** A time: a quantity with a time unit. */
17
+ export type Duration = Quantity & {
18
+ readonly unit: TimeUnit;
19
+ };
20
+ /** This function makes a duration of milliseconds. */
21
+ export declare const ms: (value: number) => Duration;
22
+ /** This function makes a duration of seconds. */
23
+ export declare const seconds: (value: number) => Duration;
24
+ /** This function makes a duration of minutes. */
25
+ export declare const minutes: (value: number) => Duration;
26
+ /** This function makes a duration of hours. */
27
+ export declare const hours: (value: number) => Duration;
28
+ /** True when a value is a duration: a finite number with a time unit. */
29
+ export declare function isDuration(value: unknown): value is Duration;
30
+ /**
31
+ * The number of milliseconds of a duration. A value that is not a duration (a plain number, or
32
+ * a quantity of another kind) throws a `TypeError` that names the option.
33
+ */
34
+ export declare function toMs(duration: Duration, option?: string): number;
35
+ /** The milliseconds of an optional duration, or undefined. */
36
+ export declare function optionalMs(duration: Duration | undefined, option?: string): number | undefined;
37
+ //# sourceMappingURL=duration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duration.d.ts","sourceRoot":"","sources":["../src/duration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAE3E,kGAAkG;AAClG,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC;AAEpE,2CAA2C;AAC3C,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAI9D,sDAAsD;AACtD,eAAO,MAAM,EAAE,UAAW,MAAM,KAAG,QAA6C,CAAC;AACjF,iDAAiD;AACjD,eAAO,MAAM,OAAO,UAAW,MAAM,KAAG,QAA4C,CAAC;AACrF,iDAAiD;AACjD,eAAO,MAAM,OAAO,UAAW,MAAM,KAAG,QAA8C,CAAC;AACvF,+CAA+C;AAC/C,eAAO,MAAM,KAAK,UAAW,MAAM,KAAG,QAA4C,CAAC;AAEnF,yEAAyE;AACzE,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAI5D;AAED;;;GAGG;AACH,wBAAgB,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAa,GAAG,MAAM,CAOpE;AAED,8DAA8D;AAC9D,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE9F"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Typed durations (roadmap R11).
3
+ *
4
+ * Each public option of this package that is a time takes a `Duration`: a quantity of
5
+ * `@mark1russell7/quantity` with a time unit. A plain number is a type error, so `timeout: 5`
6
+ * cannot mean five milliseconds in one place and five seconds in another. The wire keeps
7
+ * milliseconds (`procedure-timeout`), and the internals convert each duration one time, when an
8
+ * option is read.
9
+ *
10
+ * `@mark1russell7/quantity` has no `Duration` type yet. This alias narrows its `Quantity` to the
11
+ * time units, so the type also refuses `{ value: 5, unit: "kg" }`.
12
+ */
13
+ import { quantity, valueIn } from "@mark1russell7/quantity";
14
+ const TIME_UNITS = new Set(["ns", "us", "ms", "s", "min", "h", "d"]);
15
+ /** This function makes a duration of milliseconds. */
16
+ export const ms = (value) => quantity(value, "ms");
17
+ /** This function makes a duration of seconds. */
18
+ export const seconds = (value) => quantity(value, "s");
19
+ /** This function makes a duration of minutes. */
20
+ export const minutes = (value) => quantity(value, "min");
21
+ /** This function makes a duration of hours. */
22
+ export const hours = (value) => quantity(value, "h");
23
+ /** True when a value is a duration: a finite number with a time unit. */
24
+ export function isDuration(value) {
25
+ if (value === null || typeof value !== "object")
26
+ return false;
27
+ const { value: amount, unit } = value;
28
+ return typeof amount === "number" && Number.isFinite(amount) && typeof unit === "string" && TIME_UNITS.has(unit);
29
+ }
30
+ /**
31
+ * The number of milliseconds of a duration. A value that is not a duration (a plain number, or
32
+ * a quantity of another kind) throws a `TypeError` that names the option.
33
+ */
34
+ export function toMs(duration, option = "duration") {
35
+ if (!isDuration(duration)) {
36
+ throw new TypeError(`${option} must be a duration such as ms(500) or seconds(2), got ${JSON.stringify(duration)}. Plain numbers are not durations (roadmap R11).`);
37
+ }
38
+ return valueIn(duration, "ms");
39
+ }
40
+ /** The milliseconds of an optional duration, or undefined. */
41
+ export function optionalMs(duration, option) {
42
+ return duration === undefined ? undefined : toMs(duration, option);
43
+ }
44
+ //# sourceMappingURL=duration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duration.js","sourceRoot":"","sources":["../src/duration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAiB,MAAM,yBAAyB,CAAC;AAQ3E,MAAM,UAAU,GAAwB,IAAI,GAAG,CAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAEpG,sDAAsD;AACtD,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAa,EAAY,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAa,CAAC;AACjF,iDAAiD;AACjD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAa,EAAY,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAa,CAAC;AACrF,iDAAiD;AACjD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAa,EAAY,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAa,CAAC;AACvF,+CAA+C;AAC/C,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAY,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAa,CAAC;AAEnF,yEAAyE;AACzE,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAA4C,CAAC;IAC7E,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACnH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,IAAI,CAAC,QAAkB,EAAE,MAAM,GAAG,UAAU;IAC1D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,SAAS,CACjB,GAAG,MAAM,0DAA0D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,kDAAkD,CAC9I,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,UAAU,CAAC,QAA8B,EAAE,MAAe;IACxE,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * The state machines of the core as data (roadmap R35): the connection of the WebSocket client
3
+ * and the circuit breaker. The documents have the format `mark1russell7.machine/1` of
4
+ * `@mark1russell7/algebra`. They are the specification, and the code implements them. Their knobs
5
+ * are the default times of the core (`TIMER_DEFAULTS`), and their timers say which knob gives each
6
+ * wait.
7
+ *
8
+ * The code reports each change of its state as a `MachineTransition` (the option `onTransition`).
9
+ * `replayTransitions()` replays the reports of a run against a document, so a test finds each
10
+ * change that the document does not allow. It uses `replay` of `@mark1russell7/algebra/replay`
11
+ * (roadmap R37). That entry imports nothing else, and it has 418 bytes of gzip.
12
+ */
13
+ /** A change of state that the code reports. It has the fields of a lifecycle event of `@mark1russell7/service`. */
14
+ export interface MachineTransition {
15
+ /** The id of the document. */
16
+ readonly machine: string;
17
+ /** The instance: one connection, one breaker. */
18
+ readonly instance: string;
19
+ readonly from: string;
20
+ readonly on: string;
21
+ readonly to: string;
22
+ /** The time of the clock of the instance, in milliseconds. */
23
+ readonly at: number;
24
+ }
25
+ /** A time of a timer: one knob, in a unit. */
26
+ export interface MachineDuration {
27
+ readonly knob: string;
28
+ readonly unit: string;
29
+ }
30
+ /** A timer of a document: the events that start and stop it, and the event that it gives. */
31
+ export interface MachineTimer {
32
+ readonly duration: MachineDuration;
33
+ readonly arms: readonly string[];
34
+ readonly cancels?: readonly string[] | undefined;
35
+ readonly fires: string;
36
+ /** A timer that starts again after it fires, with a longer wait each time. */
37
+ readonly backoff?: {
38
+ readonly resets: readonly string[];
39
+ } | undefined;
40
+ readonly note?: string | undefined;
41
+ }
42
+ /** A transition of a document. */
43
+ export interface MachineTransitionDef {
44
+ readonly id: string;
45
+ readonly from: string | readonly string[];
46
+ readonly on: string | readonly string[];
47
+ readonly to: string;
48
+ readonly timer?: string | undefined;
49
+ readonly note?: string | undefined;
50
+ }
51
+ /** A machine document: the subset of `mark1russell7.machine/1` that the core uses. */
52
+ export interface MachineDocument {
53
+ readonly format: "mark1russell7.machine/1";
54
+ readonly id: string;
55
+ readonly title: string;
56
+ readonly layer: "self";
57
+ readonly version: string;
58
+ readonly sources: ReadonlyArray<{
59
+ readonly ref: string;
60
+ readonly rung: "implemented";
61
+ }>;
62
+ readonly states: Readonly<Record<string, {
63
+ readonly initial?: boolean;
64
+ readonly final?: boolean;
65
+ readonly note?: string;
66
+ }>>;
67
+ readonly events: Readonly<Record<string, {
68
+ readonly kind: "rx" | "tx" | "app" | "timer" | "local";
69
+ readonly note?: string;
70
+ }>>;
71
+ readonly knobs: Readonly<Record<string, {
72
+ readonly key: string;
73
+ readonly scope: string;
74
+ readonly unit: string | null;
75
+ readonly default: number | null;
76
+ }>>;
77
+ readonly timers: Readonly<Record<string, MachineTimer>>;
78
+ readonly transitions: readonly MachineTransitionDef[];
79
+ }
80
+ /** The connection of the WebSocket client (`WebSocketTransport`). */
81
+ export declare const WEBSOCKET_CONNECTION_MACHINE: MachineDocument;
82
+ /** The circuit breaker (`createCircuitBreakerMiddleware`). */
83
+ export declare const CIRCUIT_BREAKER_MACHINE: MachineDocument;
84
+ /**
85
+ * This function replays the reported transitions of one document. Each instance starts in the
86
+ * state that its first transition leaves. Each transition must leave the state where the replay
87
+ * is, and the document must allow it. The function gives each disagreement.
88
+ */
89
+ export declare function replayTransitions(machine: MachineDocument, events: readonly MachineTransition[]): string[];
90
+ //# sourceMappingURL=machines.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machines.d.ts","sourceRoot":"","sources":["../src/machines.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,mHAAmH;AACnH,MAAM,WAAW,iBAAiB;IAChC,8BAA8B;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,8CAA8C;AAC9C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,6FAA6F;AAC7F,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,GAAG,SAAS,CAAC;IACtE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,kCAAkC;AAClC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,sFAAsF;AACtF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,yBAAyB,CAAC;IAC3C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;KAAE,CAAC,CAAC;IACxF,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAC5H,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAC9H,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC,CAAC;IAC1J,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IACxD,QAAQ,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACvD;AAMD,qEAAqE;AACrE,eAAO,MAAM,4BAA4B,EAAE,eAgE1C,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,uBAAuB,EAAE,eAiCrC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,iBAAiB,EAAE,GAAG,MAAM,EAAE,CAE1G"}