@procedures/client 0.2.3 → 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 +65 -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 +7 -8
  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 +57 -17
  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 +16 -0
  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 +7 -8
  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 +73 -20
  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 +16 -0
  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
@@ -9,6 +9,11 @@
9
9
  *
10
10
  * Works with both client and server!
11
11
  */
12
+ import { optionalMs } from "../../duration.js";
13
+ import { isAvailabilityFailure } from "./items.js";
14
+ import { realClock } from "../../clock.js";
15
+ import { CIRCUIT_BREAKER_MACHINE } from "../../machines.js";
16
+ import { TIMER_DEFAULTS } from "../../timers.js";
12
17
  /**
13
18
  * Circuit breaker error thrown when circuit is open.
14
19
  */
@@ -35,15 +40,17 @@ export class CircuitBreakerError extends Error {
35
40
  * ```typescript
36
41
  * client.use(createCircuitBreakerMiddleware({
37
42
  * failureThreshold: 5, // Open after 5 failures
38
- * failureWindow: 10000, // Within 10 seconds
39
- * resetTimeout: 30000, // Try again after 30 seconds
43
+ * failureWindow: seconds(10), // Within 10 seconds
44
+ * resetTimeout: seconds(30), // Try again after 30 seconds
40
45
  * successThreshold: 2 // Close after 2 successes
41
46
  * }));
42
47
  * ```
43
48
  */
44
49
  export function createCircuitBreakerMiddleware(options = {}) {
45
- const { failureThreshold = 5, failureWindow = 10000, resetTimeout = 30000, successThreshold = 2, isFailure = () => true, onStateChange, } = options;
50
+ const { failureThreshold = 5, successThreshold = 2, isFailure = isAvailabilityFailure, onStateChange, } = options;
46
51
  const halfOpenMaxRequests = options.halfOpenMaxRequests ?? successThreshold;
52
+ const failureWindow = optionalMs(options.failureWindow, "failureWindow") ?? TIMER_DEFAULTS.circuitBreaker.failureWindowMs;
53
+ const resetTimeout = optionalMs(options.resetTimeout, "resetTimeout") ?? TIMER_DEFAULTS.circuitBreaker.resetTimeoutMs;
47
54
  let state = "CLOSED";
48
55
  let failures = [];
49
56
  let successes = 0;
@@ -51,20 +58,23 @@ export function createCircuitBreakerMiddleware(options = {}) {
51
58
  let probesInFlight = 0;
52
59
  let lastStateChange = Date.now();
53
60
  let resetTimer = null;
61
+ const clock = options.clock ?? realClock;
62
+ const instance = options.name ?? "circuit-breaker";
54
63
  /**
55
- * Change circuit state.
64
+ * Change circuit state. `on` is the event of `CIRCUIT_BREAKER_MACHINE`.
56
65
  */
57
- function setState(newState) {
66
+ function setState(newState, on) {
58
67
  const oldState = state;
59
68
  state = newState;
60
69
  if (oldState !== newState)
61
70
  lastStateChange = Date.now();
62
- if (oldState !== newState && onStateChange) {
63
- onStateChange(oldState, newState);
71
+ if (oldState !== newState) {
72
+ options.onTransition?.({ machine: CIRCUIT_BREAKER_MACHINE.id, instance, from: oldState, on, to: newState, at: clock.now() });
73
+ onStateChange?.(oldState, newState);
64
74
  }
65
75
  // Clear reset timer when moving to CLOSED
66
76
  if (newState === "CLOSED" && resetTimer) {
67
- clearTimeout(resetTimer);
77
+ resetTimer();
68
78
  resetTimer = null;
69
79
  }
70
80
  }
@@ -72,20 +82,21 @@ export function createCircuitBreakerMiddleware(options = {}) {
72
82
  * Record a failure.
73
83
  */
74
84
  function recordFailure(error) {
75
- const now = Date.now();
85
+ // The window uses a monotonic clock: a change of the wall clock does not move it (R12)
86
+ const now = clock.now();
76
87
  // Add failure
77
- failures.push({ timestamp: now, error });
88
+ failures.push({ at: now, timestamp: Date.now(), error });
78
89
  // Remove old failures outside window
79
- failures = failures.filter((f) => now - f.timestamp < failureWindow);
90
+ failures = failures.filter((f) => now - f.at < failureWindow);
80
91
  if (state === "HALF_OPEN") {
81
92
  // Any failure while testing reopens the circuit immediately — don't wait for the full
82
93
  // failureThreshold. See documentation/BUGS-2026-07.md (H11).
83
- setState("OPEN");
94
+ setState("OPEN", "probe-failure");
84
95
  successes = 0;
85
96
  scheduleReset();
86
97
  }
87
98
  else if (state === "CLOSED" && failures.length >= failureThreshold) {
88
- setState("OPEN");
99
+ setState("OPEN", "failure-threshold");
89
100
  scheduleReset();
90
101
  }
91
102
  }
@@ -97,15 +108,15 @@ export function createCircuitBreakerMiddleware(options = {}) {
97
108
  successes++;
98
109
  if (successes >= successThreshold) {
99
110
  // Enough successes - close circuit
100
- setState("CLOSED");
111
+ setState("CLOSED", "probe-successes");
101
112
  failures = [];
102
113
  successes = 0;
103
114
  }
104
115
  }
105
116
  else if (state === "CLOSED") {
106
117
  // Clear old failures on success
107
- const now = Date.now();
108
- failures = failures.filter((f) => now - f.timestamp < failureWindow);
118
+ const now = clock.now();
119
+ failures = failures.filter((f) => now - f.at < failureWindow);
109
120
  }
110
121
  }
111
122
  /**
@@ -113,14 +124,14 @@ export function createCircuitBreakerMiddleware(options = {}) {
113
124
  */
114
125
  function scheduleReset() {
115
126
  if (resetTimer) {
116
- clearTimeout(resetTimer);
127
+ resetTimer();
117
128
  }
118
- resetTimer = setTimeout(() => {
129
+ resetTimer = clock.after(resetTimeout, () => {
119
130
  if (state === "OPEN") {
120
- setState("HALF_OPEN");
131
+ setState("HALF_OPEN", "reset-timeout");
121
132
  successes = 0;
122
133
  }
123
- }, resetTimeout);
134
+ });
124
135
  // Don't keep the event loop alive just for the reset timer. See BUGS-2026-07.md (M4).
125
136
  resetTimer.unref?.();
126
137
  }
@@ -139,10 +150,10 @@ export function createCircuitBreakerMiddleware(options = {}) {
139
150
  return probesInFlight < halfOpenMaxRequests;
140
151
  }
141
152
  function getStats() {
142
- const now = Date.now();
153
+ const now = clock.now();
143
154
  return {
144
155
  state,
145
- failures: failures.filter((f) => now - f.timestamp < failureWindow).length,
156
+ failures: failures.filter((f) => now - f.at < failureWindow).length,
146
157
  successes,
147
158
  totalRequests,
148
159
  lastFailureTime: failures.length > 0 ? failures[failures.length - 1].timestamp : null,
@@ -154,10 +165,10 @@ export function createCircuitBreakerMiddleware(options = {}) {
154
165
  totalRequests++;
155
166
  // The state for the other middlewares (CircuitBreakerContext)
156
167
  const writeState = () => {
157
- const now = Date.now();
168
+ const now = clock.now();
158
169
  context.message.metadata["circuitBreaker"] = {
159
170
  state,
160
- failures: failures.filter((f) => now - f.timestamp < failureWindow).length,
171
+ failures: failures.filter((f) => now - f.at < failureWindow).length,
161
172
  successes,
162
173
  };
163
174
  };
@@ -1 +1 @@
1
- {"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../../src/client/middleware/circuit-breaker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../../src/client/middleware/circuit-breaker.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,7 @@
14
14
  * .use(createAuthMiddleware(...)) // Client<... & AuthContext>
15
15
  * ```
16
16
  */
17
+ import type { Duration } from "../../duration.js";
17
18
  /**
18
19
  * Context provided by retry middleware.
19
20
  * Tracks retry state for observability and dependent middleware.
@@ -24,12 +25,17 @@ export interface RetryContext {
24
25
  attempt?: number;
25
26
  /** Maximum number of attempts: an override of a call, then the value that the middleware uses */
26
27
  maxAttempts?: number;
27
- /** An override of the base delay, in milliseconds */
28
- delay?: number;
28
+ /** An override of the base delay */
29
+ delay?: Duration;
29
30
  /** An override of the factor of the delay from one attempt to the next */
30
31
  backoffMultiplier?: number;
31
- /** An override of the longest delay, in milliseconds */
32
- maxDelay?: number;
32
+ /** An override of the longest delay */
33
+ maxDelay?: Duration;
34
+ /**
35
+ * True: the call can go again after a try with an indeterminate outcome, because a second
36
+ * run changes nothing more (roadmap R1). It overrides the `idempotent` option of the middleware.
37
+ */
38
+ idempotent?: boolean;
33
39
  };
34
40
  }
35
41
  /**
@@ -41,8 +47,8 @@ export interface RetryContext {
41
47
  */
42
48
  export interface CacheContext {
43
49
  cache: {
44
- /** The time-to-live of the entry that this call stores, in milliseconds */
45
- ttl?: number;
50
+ /** The time-to-live of the entry that this call stores */
51
+ ttl?: Duration;
46
52
  /** True: the call skips the cache (no read, no write) */
47
53
  bypass?: boolean;
48
54
  /** True: the call fetches and replaces the stored response */
@@ -57,10 +63,10 @@ export interface CacheContext {
57
63
  */
58
64
  export interface TimeoutContext {
59
65
  timeout: {
60
- /** Overall timeout in milliseconds (if configured) */
61
- overall?: number;
62
- /** Per-attempt timeout in milliseconds (if configured) */
63
- perAttempt?: number;
66
+ /** The overall timeout (if configured) */
67
+ overall?: Duration;
68
+ /** The timeout of each attempt (if configured) */
69
+ perAttempt?: Duration;
64
70
  };
65
71
  }
66
72
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"contexts.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/contexts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contexts.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/contexts.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"contexts.js","sourceRoot":"","sources":["../../../src/client/middleware/contexts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAqOH,gFAAgF;AAChF,sBAAsB;AACtB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,OAAO,IAAI,GAAG;QACd,OAAQ,GAAoB,CAAC,KAAK,KAAK,QAAQ,CAChD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,OAAO,IAAI,GAAG;QACd,OAAQ,GAAoB,CAAC,KAAK,KAAK,QAAQ,CAChD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,MAAM,IAAI,GAAG;QACb,OAAQ,GAAmB,CAAC,IAAI,KAAK,QAAQ,CAC9C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,SAAS,IAAI,GAAG;QAChB,OAAQ,GAAsB,CAAC,OAAO,KAAK,QAAQ,CACpD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAY;IACnD,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,gBAAgB,IAAI,GAAG;QACvB,OAAQ,GAA6B,CAAC,cAAc,KAAK,QAAQ,CAClE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,WAAW,IAAI,GAAG;QAClB,OAAQ,GAAwB,CAAC,SAAS,KAAK,QAAQ,CACxD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"contexts.js","sourceRoot":"","sources":["../../../src/client/middleware/contexts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AA4OH,gFAAgF;AAChF,sBAAsB;AACtB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,OAAO,IAAI,GAAG;QACd,OAAQ,GAAoB,CAAC,KAAK,KAAK,QAAQ,CAChD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,OAAO,IAAI,GAAG;QACd,OAAQ,GAAoB,CAAC,KAAK,KAAK,QAAQ,CAChD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,MAAM,IAAI,GAAG;QACb,OAAQ,GAAmB,CAAC,IAAI,KAAK,QAAQ,CAC9C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,SAAS,IAAI,GAAG;QAChB,OAAQ,GAAsB,CAAC,OAAO,KAAK,QAAQ,CACpD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAY;IACnD,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,gBAAgB,IAAI,GAAG;QACvB,OAAQ,GAA6B,CAAC,cAAc,KAAK,QAAQ,CAClE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,WAAW,IAAI,GAAG;QAClB,OAAQ,GAAwB,CAAC,SAAS,KAAK,QAAQ,CACxD,CAAC;AACJ,CAAC"}
@@ -7,26 +7,55 @@
7
7
  * thrown error that the transports never threw).
8
8
  */
9
9
  import type { ResponseItem } from "../types.js";
10
+ import { type Clock } from "../../clock.js";
10
11
  /** This function makes an error item. */
11
12
  export declare function errorItem<TRes>(id: string, code: string, message: string, retryable: boolean): ResponseItem<TRes>;
12
13
  /** The error item of a request that its caller aborted. A retry does not repeat it. */
13
14
  export declare function abortedItem<TRes>(id: string): ResponseItem<TRes>;
15
+ /**
16
+ * What a failed try tells about its request, in the metadata of the error item (`delivery`).
17
+ * - `not-sent`: the request did not leave the client. A retry is safe.
18
+ * - `indeterminate`: the request left, and no answer came. The server can have run it, so only
19
+ * an idempotent call can go again (the three outcomes of `@mark1russell7/service`).
20
+ * An error item without the field is an answer of the server: its `retryable` flag decides.
21
+ */
22
+ export type Delivery = "not-sent" | "indeterminate";
23
+ /** The metadata key of the delivery of a failed try. */
24
+ export declare const DELIVERY_METADATA_KEY = "delivery";
25
+ /** This function marks an error item with the delivery of its request. */
26
+ export declare function withDelivery<TRes>(item: ResponseItem<TRes>, delivery: Delivery): ResponseItem<TRes>;
27
+ /** The metadata key of the time that the server asks a client to wait before a retry, in milliseconds. */
28
+ export declare const RETRY_AFTER_METADATA_KEY = "retry-after";
29
+ /** The time that an error item asks a client to wait before a retry, in milliseconds, or undefined. */
30
+ export declare function retryAfterOf(item: ResponseItem<unknown>): number | undefined;
31
+ /** True when an error says that the service is not available (see AVAILABILITY_CODES). */
32
+ export declare function isAvailabilityFailure(error: unknown): boolean;
33
+ /** The time of a monotonic clock in milliseconds: a change of the wall clock does not move it. */
34
+ export declare function monotonicNow(): number;
35
+ /** The delivery of a failed try, or undefined for an answer of the server. */
36
+ export declare function deliveryOf(item: ResponseItem<unknown>): Delivery | undefined;
14
37
  /**
15
38
  * This function tells if a thrown error is a network failure: the connection failed or broke.
16
39
  * A retry can repair a network failure. A validation error, an open circuit breaker or a rate
17
40
  * limit cannot be repaired by a retry (deep dive TRN-8).
18
41
  */
19
42
  export declare function isNetworkError(error: unknown): boolean;
43
+ /**
44
+ * This function tells if a thrown error proves that the request did not leave the client: the
45
+ * connection was refused, the name did not resolve, or the WebSocket did not open in time.
46
+ * A reset or a close during the request does not prove it (the request can have arrived).
47
+ */
48
+ export declare function isNotSentError(error: unknown): boolean;
20
49
  /**
21
50
  * The item that stands for a thrown error, so that `shouldRetry` can decide about it. It is
22
- * retryable only when the error is a network failure.
51
+ * retryable only when the error is a network failure. Its delivery tells if the request left.
23
52
  */
24
53
  export declare function thrownItem<TRes>(id: string, error: unknown): ResponseItem<TRes>;
25
54
  /**
26
55
  * This function waits `ms` milliseconds. It returns false at once when the signal aborts (deep
27
56
  * dive TRN-8: before, the backoff of the retry middleware ignored the signal).
28
57
  */
29
- export declare function sleep(ms: number, signal?: AbortSignal): Promise<boolean>;
58
+ export declare function sleep(ms: number, signal?: AbortSignal, clock?: Clock): Promise<boolean>;
30
59
  /** The value that `nextOrAbort` gives when the signal aborts first. */
31
60
  export declare const ABORTED_FIRST: unique symbol;
32
61
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"items.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/items.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,yCAAyC;AACzC,wBAAgB,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAEjH;AAED,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAEhE;AAkBD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAUtD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAQ/E;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAaxE;AAED,uEAAuE;AACvE,eAAO,MAAM,aAAa,EAAE,OAAO,MAAgC,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,aAAa,CAAC,CAgBnD"}
1
+ {"version":3,"file":"items.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/items.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAa,KAAK,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvD,yCAAyC;AACzC,wBAAgB,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAEjH;AAED,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAEhE;AAED;;;;;;GAMG;AACH,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,eAAe,CAAC;AAEpD,wDAAwD;AACxD,eAAO,MAAM,qBAAqB,aAAa,CAAC;AAEhD,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAEnG;AAED,0GAA0G;AAC1G,eAAO,MAAM,wBAAwB,gBAAgB,CAAC;AAEtD,uGAAuG;AACvG,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAG5E;AAuBD,0FAA0F;AAC1F,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAI7D;AAED,kGAAkG;AAClG,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,QAAQ,GAAG,SAAS,CAG5E;AAkBD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAUtD;AAaD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQtD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAS/E;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,KAAK,GAAE,KAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAclG;AAED,uEAAuE;AACvE,eAAO,MAAM,aAAa,EAAE,OAAO,MAAgC,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,aAAa,CAAC,CAgBnD"}
@@ -6,6 +6,7 @@
6
6
  * it when `throwOnError` is on (deep dive TRN-7: before, the timeout middleware waited for a
7
7
  * thrown error that the transports never threw).
8
8
  */
9
+ import { realClock } from "../../clock.js";
9
10
  /** This function makes an error item. */
10
11
  export function errorItem(id, code, message, retryable) {
11
12
  return { id, status: { type: "error", code, message, retryable }, payload: null, metadata: {} };
@@ -14,6 +15,56 @@ export function errorItem(id, code, message, retryable) {
14
15
  export function abortedItem(id) {
15
16
  return errorItem(id, "ABORTED", "Request was aborted", false);
16
17
  }
18
+ /** The metadata key of the delivery of a failed try. */
19
+ export const DELIVERY_METADATA_KEY = "delivery";
20
+ /** This function marks an error item with the delivery of its request. */
21
+ export function withDelivery(item, delivery) {
22
+ return { ...item, metadata: { ...item.metadata, [DELIVERY_METADATA_KEY]: delivery } };
23
+ }
24
+ /** The metadata key of the time that the server asks a client to wait before a retry, in milliseconds. */
25
+ export const RETRY_AFTER_METADATA_KEY = "retry-after";
26
+ /** The time that an error item asks a client to wait before a retry, in milliseconds, or undefined. */
27
+ export function retryAfterOf(item) {
28
+ const value = item.metadata?.[RETRY_AFTER_METADATA_KEY];
29
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : undefined;
30
+ }
31
+ /**
32
+ * The error codes that say that the service is not available: the server is down, busy, slow or
33
+ * stopping, or the network failed. A circuit breaker counts only these (roadmap R12). An abort,
34
+ * a validation error, a refusal or an error of the handler says nothing about the health of the
35
+ * service.
36
+ */
37
+ const AVAILABILITY_CODES = new Set([
38
+ "UNAVAILABLE",
39
+ "TIMEOUT",
40
+ "SERVER_STOPPED",
41
+ "SERVICE_UNAVAILABLE",
42
+ "BAD_GATEWAY",
43
+ "GATEWAY_TIMEOUT",
44
+ "NETWORK_ERROR",
45
+ "CONNECTION_REFUSED",
46
+ "STREAM_ENDED",
47
+ // The connection to the other side closed before the call left (roadmap R30: before, the list
48
+ // did not have this code of R24)
49
+ "CONNECTION_CLOSED",
50
+ ]);
51
+ /** True when an error says that the service is not available (see AVAILABILITY_CODES). */
52
+ export function isAvailabilityFailure(error) {
53
+ const code = error?.code;
54
+ if (typeof code === "string" && AVAILABILITY_CODES.has(code))
55
+ return true;
56
+ return isNetworkError(error);
57
+ }
58
+ /** The time of a monotonic clock in milliseconds: a change of the wall clock does not move it. */
59
+ export function monotonicNow() {
60
+ const performance = globalThis.performance;
61
+ return performance ? performance.now() : Date.now();
62
+ }
63
+ /** The delivery of a failed try, or undefined for an answer of the server. */
64
+ export function deliveryOf(item) {
65
+ const delivery = item.metadata?.[DELIVERY_METADATA_KEY];
66
+ return delivery === "not-sent" || delivery === "indeterminate" ? delivery : undefined;
67
+ }
17
68
  const NETWORK_CODES = new Set([
18
69
  "ECONNREFUSED",
19
70
  "ECONNRESET",
@@ -49,30 +100,59 @@ export function isNetworkError(error) {
49
100
  // The WebSocket transport fails the requests of a connection that closed or never opened
50
101
  return /WebSocket (connection closed|disconnected)|Connection timeout/.test(error.message);
51
102
  }
103
+ /** The network codes that tell that the connection never opened, so no request left. */
104
+ const NOT_SENT_CODES = new Set([
105
+ "ECONNREFUSED",
106
+ "ENETUNREACH",
107
+ "EHOSTUNREACH",
108
+ "ENOTFOUND",
109
+ "EAI_AGAIN",
110
+ "UND_ERR_CONNECT_TIMEOUT",
111
+ "CONNECTION_REFUSED",
112
+ ]);
113
+ /**
114
+ * This function tells if a thrown error proves that the request did not leave the client: the
115
+ * connection was refused, the name did not resolve, or the WebSocket did not open in time.
116
+ * A reset or a close during the request does not prove it (the request can have arrived).
117
+ */
118
+ export function isNotSentError(error) {
119
+ if (!(error instanceof Error))
120
+ return false;
121
+ const code = error.code;
122
+ if (typeof code === "string" && NOT_SENT_CODES.has(code))
123
+ return true;
124
+ const cause = error.cause;
125
+ if (cause !== undefined && cause !== error && isNotSentError(cause))
126
+ return true;
127
+ // The WebSocket transport fails a request that waited for a connection that did not come
128
+ return /^(WebSocket disconnected|Connection timeout)$/.test(error.message);
129
+ }
52
130
  /**
53
131
  * The item that stands for a thrown error, so that `shouldRetry` can decide about it. It is
54
- * retryable only when the error is a network failure.
132
+ * retryable only when the error is a network failure. Its delivery tells if the request left.
55
133
  */
56
134
  export function thrownItem(id, error) {
57
135
  const code = error?.code;
58
- return errorItem(id, typeof code === "string" ? code : "THROWN", error instanceof Error ? error.message : String(error), isNetworkError(error));
136
+ const item = errorItem(id, typeof code === "string" ? code : "THROWN", error instanceof Error ? error.message : String(error), isNetworkError(error));
137
+ return withDelivery(item, isNotSentError(error) ? "not-sent" : "indeterminate");
59
138
  }
60
139
  /**
61
140
  * This function waits `ms` milliseconds. It returns false at once when the signal aborts (deep
62
141
  * dive TRN-8: before, the backoff of the retry middleware ignored the signal).
63
142
  */
64
- export function sleep(ms, signal) {
143
+ export function sleep(ms, signal, clock = realClock) {
65
144
  if (signal?.aborted)
66
145
  return Promise.resolve(false);
67
146
  return new Promise((resolve) => {
68
147
  const onAbort = () => {
69
- clearTimeout(timer);
148
+ cancel();
70
149
  resolve(false);
71
150
  };
72
- const timer = setTimeout(() => {
151
+ // The clock of the caller (roadmap R35): a test gives a fake clock
152
+ const cancel = clock.after(Math.max(0, ms), () => {
73
153
  signal?.removeEventListener("abort", onAbort);
74
154
  resolve(true);
75
- }, Math.max(0, ms));
155
+ });
76
156
  signal?.addEventListener("abort", onAbort, { once: true });
77
157
  });
78
158
  }
@@ -1 +1 @@
1
- {"version":3,"file":"items.js","sourceRoot":"","sources":["../../../src/client/middleware/items.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"items.js","sourceRoot":"","sources":["../../../src/client/middleware/items.ts"],"names":[],"mappings":"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"}
@@ -28,5 +28,7 @@ export declare class LruMap<K, V> {
28
28
  delete(key: K): boolean;
29
29
  /** Delete every key. */
30
30
  clear(): void;
31
+ /** Delete each key whose value matches. This does not count as a use. The number deleted. */
32
+ deleteWhere(matches: (value: V, key: K) => boolean): number;
31
33
  }
32
34
  //# sourceMappingURL=lru.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lru.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/lru.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,qBAAa,MAAM,CAAC,CAAC,EAAE,CAAC;IAQpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAR3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAE3C;;;OAGG;IACH,YACmB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,GAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,aAAA,EAKtD;IAED,0BAA0B;IAC1B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,mEAAmE;IACnE,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAEnB;IAED,2FAA2F;IAC3F,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAMzB;IAED,qGAAqG;IACrG,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAS1B;IAED,0CAA0C;IAC1C,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAEtB;IAED,wBAAwB;IACxB,KAAK,IAAI,IAAI,CAEZ;CACF"}
1
+ {"version":3,"file":"lru.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/lru.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,qBAAa,MAAM,CAAC,CAAC,EAAE,CAAC;IAQpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAR3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAE3C;;;OAGG;IACH,YACmB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,GAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,aAAA,EAKtD;IAED,0BAA0B;IAC1B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,mEAAmE;IACnE,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAEnB;IAED,2FAA2F;IAC3F,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAMzB;IAED,qGAAqG;IACrG,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAS1B;IAED,0CAA0C;IAC1C,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAEtB;IAED,wBAAwB;IACxB,KAAK,IAAI,IAAI,CAEZ;IAED,6FAA6F;IAC7F,WAAW,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,MAAM,CAS1D;CACF"}
@@ -58,5 +58,16 @@ export class LruMap {
58
58
  clear() {
59
59
  this.entries.clear();
60
60
  }
61
+ /** Delete each key whose value matches. This does not count as a use. The number deleted. */
62
+ deleteWhere(matches) {
63
+ let deleted = 0;
64
+ for (const [key, value] of this.entries) {
65
+ if (matches(value, key)) {
66
+ this.entries.delete(key);
67
+ deleted++;
68
+ }
69
+ }
70
+ return deleted;
71
+ }
61
72
  }
62
73
  //# sourceMappingURL=lru.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lru.js","sourceRoot":"","sources":["../../../src/client/middleware/lru.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,OAAO,MAAM;IAQE,QAAQ;IACR,OAAO;IART,OAAO,GAAG,IAAI,GAAG,EAAQ,CAAC;IAE3C;;;OAGG;IACH,YACmB,QAAgB,EAChB,OAAoC;wBADpC,QAAQ;uBACR,OAAO;QAExB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,UAAU,CAAC,mEAAmE,QAAQ,EAAE,CAAC,CAAC;QACtG,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,mEAAmE;IACnE,GAAG,CAAC,GAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,2FAA2F;IAC3F,GAAG,CAAC,GAAM;QACR,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAM,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,qGAAqG;IACrG,GAAG,CAAC,GAAM,EAAE,KAAQ;QAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAU,CAAC;YACrD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAM,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,MAAM,CAAC,GAAM;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,wBAAwB;IACxB,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
1
+ {"version":3,"file":"lru.js","sourceRoot":"","sources":["../../../src/client/middleware/lru.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,OAAO,MAAM;IAQE,QAAQ;IACR,OAAO;IART,OAAO,GAAG,IAAI,GAAG,EAAQ,CAAC;IAE3C;;;OAGG;IACH,YACmB,QAAgB,EAChB,OAAoC;wBADpC,QAAQ;uBACR,OAAO;QAExB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,UAAU,CAAC,mEAAmE,QAAQ,EAAE,CAAC,CAAC;QACtG,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,mEAAmE;IACnE,GAAG,CAAC,GAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,2FAA2F;IAC3F,GAAG,CAAC,GAAM;QACR,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAM,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,qGAAqG;IACrG,GAAG,CAAC,GAAM,EAAE,KAAQ;QAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAU,CAAC;YACrD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAM,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,MAAM,CAAC,GAAM;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,wBAAwB;IACxB,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,6FAA6F;IAC7F,WAAW,CAAC,OAAsC;QAChD,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxC,IAAI,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACzB,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import type { ClientMiddleware, TypedClientMiddleware } from "../types.js";
10
10
  import type { RateLimitContext } from "./contexts.js";
11
+ import { type Duration } from "../../duration.js";
11
12
  /**
12
13
  * Rate limiting options.
13
14
  */
@@ -21,7 +22,7 @@ export interface RateLimitOptions {
21
22
  * Time window in milliseconds.
22
23
  * @default 60000 (1 minute)
23
24
  */
24
- window?: number;
25
+ window?: Duration;
25
26
  /**
26
27
  * Behavior when rate limit is exceeded.
27
28
  * - "reject": Throw error immediately
@@ -71,14 +72,14 @@ export declare class RateLimitError extends Error {
71
72
  * // Reject strategy (default)
72
73
  * client.use(createRateLimitMiddleware({
73
74
  * maxRequests: 100, // 100 requests
74
- * window: 60000, // per minute
75
+ * window: minutes(1),
75
76
  * strategy: "reject" // Throw error when exceeded
76
77
  * }));
77
78
  *
78
79
  * // Queue strategy
79
80
  * client.use(createRateLimitMiddleware({
80
81
  * maxRequests: 10,
81
- * window: 1000,
82
+ * window: seconds(1),
82
83
  * strategy: "queue", // Queue requests when exceeded
83
84
  * maxQueueSize: 50
84
85
  * }));
@@ -93,9 +94,9 @@ export declare function createRateLimitMiddleware(options?: RateLimitOptions): T
93
94
  * @example
94
95
  * ```typescript
95
96
  * client.use(createPerServiceRateLimiter({
96
- * users: { maxRequests: 100, window: 60000 },
97
- * orders: { maxRequests: 50, window: 60000 },
98
- * default: { maxRequests: 200, window: 60000 }
97
+ * users: { maxRequests: 100, window: minutes(1) },
98
+ * orders: { maxRequests: 50, window: minutes(1) },
99
+ * default: { maxRequests: 200, window: minutes(1) }
99
100
  * }));
100
101
  * ```
101
102
  */
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAA+B,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACxG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGtD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAE9B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;CACvD;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,KAAK;aAGrB,KAAK,EAAE,cAAc;IAFvC,YACE,OAAO,EAAE,MAAM,EACC,KAAK,EAAE,cAAc,EAItC;CACF;AAWD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,gBAAqB,GAC7B,qBAAqB,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAwJ7C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,gBAAgB,CAAA;CAAE,GACxE,gBAAgB,CA+BlB"}
1
+ {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAA+B,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACxG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG9D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC;IAElB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAE9B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;CACvD;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,KAAK;aAGrB,KAAK,EAAE,cAAc;IAFvC,YACE,OAAO,EAAE,MAAM,EACC,KAAK,EAAE,cAAc,EAItC;CACF;AAWD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,gBAAqB,GAC7B,qBAAqB,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAwJ7C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,gBAAgB,CAAA;CAAE,GACxE,gBAAgB,CA+BlB"}
@@ -7,6 +7,8 @@
7
7
  * Works with both client and server!
8
8
  */
9
9
  import { abortedItem } from "./items.js";
10
+ import { optionalMs } from "../../duration.js";
11
+ import { TIMER_DEFAULTS } from "../../timers.js";
10
12
  /**
11
13
  * Rate limit error thrown when limit exceeded.
12
14
  */
@@ -29,21 +31,22 @@ export class RateLimitError extends Error {
29
31
  * // Reject strategy (default)
30
32
  * client.use(createRateLimitMiddleware({
31
33
  * maxRequests: 100, // 100 requests
32
- * window: 60000, // per minute
34
+ * window: minutes(1),
33
35
  * strategy: "reject" // Throw error when exceeded
34
36
  * }));
35
37
  *
36
38
  * // Queue strategy
37
39
  * client.use(createRateLimitMiddleware({
38
40
  * maxRequests: 10,
39
- * window: 1000,
41
+ * window: seconds(1),
40
42
  * strategy: "queue", // Queue requests when exceeded
41
43
  * maxQueueSize: 50
42
44
  * }));
43
45
  * ```
44
46
  */
45
47
  export function createRateLimitMiddleware(options = {}) {
46
- const { maxRequests = 100, window = 60000, strategy = "reject", maxQueueSize = 100, message = "Rate limit exceeded", onRateLimitExceeded, } = options;
48
+ const { maxRequests = 100, strategy = "reject", maxQueueSize = 100, message = "Rate limit exceeded", onRateLimitExceeded, } = options;
49
+ const window = optionalMs(options.window, "window") ?? TIMER_DEFAULTS.rateLimit.windowMs;
47
50
  // Token bucket state
48
51
  let tokens = maxRequests;
49
52
  let lastRefill = Date.now();
@@ -185,9 +188,9 @@ export function createRateLimitMiddleware(options = {}) {
185
188
  * @example
186
189
  * ```typescript
187
190
  * client.use(createPerServiceRateLimiter({
188
- * users: { maxRequests: 100, window: 60000 },
189
- * orders: { maxRequests: 50, window: 60000 },
190
- * default: { maxRequests: 200, window: 60000 }
191
+ * users: { maxRequests: 100, window: minutes(1) },
192
+ * orders: { maxRequests: 50, window: minutes(1) },
193
+ * default: { maxRequests: 200, window: minutes(1) }
191
194
  * }));
192
195
  * ```
193
196
  */