@procedures/client 0.2.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/README.md +77 -44
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/adapters/http/client/transport.d.ts.map +1 -1
  5. package/dist/adapters/http/client/transport.js +35 -3
  6. package/dist/adapters/http/client/transport.js.map +1 -1
  7. package/dist/adapters/http/client/types.d.ts +3 -2
  8. package/dist/adapters/http/client/types.d.ts.map +1 -1
  9. package/dist/adapters/http/server/transport.d.ts +2 -2
  10. package/dist/adapters/http/server/transport.d.ts.map +1 -1
  11. package/dist/adapters/http/server/transport.js +54 -22
  12. package/dist/adapters/http/server/transport.js.map +1 -1
  13. package/dist/adapters/http/shared/headers.d.ts +1 -1
  14. package/dist/adapters/http/shared/headers.d.ts.map +1 -1
  15. package/dist/adapters/http/shared/headers.js +7 -6
  16. package/dist/adapters/http/shared/headers.js.map +1 -1
  17. package/dist/adapters/local/client/transport.d.ts +3 -0
  18. package/dist/adapters/local/client/transport.d.ts.map +1 -1
  19. package/dist/adapters/local/client/transport.js +67 -6
  20. package/dist/adapters/local/client/transport.js.map +1 -1
  21. package/dist/adapters/local/client/types.d.ts +15 -0
  22. package/dist/adapters/local/client/types.d.ts.map +1 -1
  23. package/dist/adapters/local/client/types.js.map +1 -1
  24. package/dist/adapters/mock/client/transport.d.ts +3 -2
  25. package/dist/adapters/mock/client/transport.d.ts.map +1 -1
  26. package/dist/adapters/mock/client/transport.js +8 -5
  27. package/dist/adapters/mock/client/transport.js.map +1 -1
  28. package/dist/adapters/mock/client/types.d.ts +7 -6
  29. package/dist/adapters/mock/client/types.d.ts.map +1 -1
  30. package/dist/adapters/port/transport.d.ts +62 -0
  31. package/dist/adapters/port/transport.d.ts.map +1 -0
  32. package/dist/adapters/port/transport.js +94 -0
  33. package/dist/adapters/port/transport.js.map +1 -0
  34. package/dist/adapters/websocket/client/index.d.ts +1 -1
  35. package/dist/adapters/websocket/client/index.d.ts.map +1 -1
  36. package/dist/adapters/websocket/client/index.js.map +1 -1
  37. package/dist/adapters/websocket/client/node.d.ts +30 -0
  38. package/dist/adapters/websocket/client/node.d.ts.map +1 -0
  39. package/dist/adapters/websocket/client/node.js +32 -0
  40. package/dist/adapters/websocket/client/node.js.map +1 -0
  41. package/dist/adapters/websocket/client/transport.d.ts +47 -7
  42. package/dist/adapters/websocket/client/transport.d.ts.map +1 -1
  43. package/dist/adapters/websocket/client/transport.js +229 -75
  44. package/dist/adapters/websocket/client/transport.js.map +1 -1
  45. package/dist/adapters/websocket/client/types.d.ts +71 -21
  46. package/dist/adapters/websocket/client/types.d.ts.map +1 -1
  47. package/dist/adapters/websocket/client/types.js.map +1 -1
  48. package/dist/adapters/websocket/server/transport.d.ts +65 -24
  49. package/dist/adapters/websocket/server/transport.d.ts.map +1 -1
  50. package/dist/adapters/websocket/server/transport.js +192 -263
  51. package/dist/adapters/websocket/server/transport.js.map +1 -1
  52. package/dist/adapters/websocket/server/types.d.ts +20 -1
  53. package/dist/adapters/websocket/server/types.d.ts.map +1 -1
  54. package/dist/adapters/websocket/shared/rpc.d.ts +129 -0
  55. package/dist/adapters/websocket/shared/rpc.d.ts.map +1 -0
  56. package/dist/adapters/websocket/shared/rpc.js +425 -0
  57. package/dist/adapters/websocket/shared/rpc.js.map +1 -0
  58. package/dist/browser.d.ts +29 -7
  59. package/dist/browser.d.ts.map +1 -1
  60. package/dist/browser.js +26 -3
  61. package/dist/browser.js.map +1 -1
  62. package/dist/client/call-types.d.ts +10 -10
  63. package/dist/client/call-types.d.ts.map +1 -1
  64. package/dist/client/call-types.js +1 -6
  65. package/dist/client/call-types.js.map +1 -1
  66. package/dist/client/client.d.ts +6 -1
  67. package/dist/client/client.d.ts.map +1 -1
  68. package/dist/client/client.js +23 -9
  69. package/dist/client/client.js.map +1 -1
  70. package/dist/client/deadline.d.ts +38 -0
  71. package/dist/client/deadline.d.ts.map +1 -0
  72. package/dist/client/deadline.js +60 -0
  73. package/dist/client/deadline.js.map +1 -0
  74. package/dist/client/errors/factory.d.ts.map +1 -1
  75. package/dist/client/errors/factory.js +11 -7
  76. package/dist/client/errors/factory.js.map +1 -1
  77. package/dist/client/errors/http-errors.d.ts.map +1 -1
  78. package/dist/client/errors/http-errors.js +6 -0
  79. package/dist/client/errors/http-errors.js.map +1 -1
  80. package/dist/client/errors/index.d.ts +1 -1
  81. package/dist/client/errors/index.js +1 -1
  82. package/dist/client/errors/registry.d.ts +2 -1
  83. package/dist/client/errors/registry.d.ts.map +1 -1
  84. package/dist/client/errors/registry.js +72 -22
  85. package/dist/client/errors/registry.js.map +1 -1
  86. package/dist/client/index.d.ts +9 -2
  87. package/dist/client/index.d.ts.map +1 -1
  88. package/dist/client/index.js +8 -2
  89. package/dist/client/index.js.map +1 -1
  90. package/dist/client/middleware/cache.d.ts +19 -5
  91. package/dist/client/middleware/cache.d.ts.map +1 -1
  92. package/dist/client/middleware/cache.js +106 -18
  93. package/dist/client/middleware/cache.js.map +1 -1
  94. package/dist/client/middleware/circuit-breaker.d.ts +28 -10
  95. package/dist/client/middleware/circuit-breaker.d.ts.map +1 -1
  96. package/dist/client/middleware/circuit-breaker.js +35 -24
  97. package/dist/client/middleware/circuit-breaker.js.map +1 -1
  98. package/dist/client/middleware/contexts.d.ts +16 -10
  99. package/dist/client/middleware/contexts.d.ts.map +1 -1
  100. package/dist/client/middleware/contexts.js.map +1 -1
  101. package/dist/client/middleware/items.d.ts +31 -2
  102. package/dist/client/middleware/items.d.ts.map +1 -1
  103. package/dist/client/middleware/items.js +86 -6
  104. package/dist/client/middleware/items.js.map +1 -1
  105. package/dist/client/middleware/lru.d.ts +2 -0
  106. package/dist/client/middleware/lru.d.ts.map +1 -1
  107. package/dist/client/middleware/lru.js +11 -0
  108. package/dist/client/middleware/lru.js.map +1 -1
  109. package/dist/client/middleware/rate-limit.d.ts +7 -6
  110. package/dist/client/middleware/rate-limit.d.ts.map +1 -1
  111. package/dist/client/middleware/rate-limit.js +9 -7
  112. package/dist/client/middleware/rate-limit.js.map +1 -1
  113. package/dist/client/middleware/resilience.d.ts +61 -0
  114. package/dist/client/middleware/resilience.d.ts.map +1 -0
  115. package/dist/client/middleware/resilience.js +59 -0
  116. package/dist/client/middleware/resilience.js.map +1 -0
  117. package/dist/client/middleware/retry.d.ts +45 -11
  118. package/dist/client/middleware/retry.d.ts.map +1 -1
  119. package/dist/client/middleware/retry.js +102 -22
  120. package/dist/client/middleware/retry.js.map +1 -1
  121. package/dist/client/middleware/timeout.d.ts +15 -12
  122. package/dist/client/middleware/timeout.d.ts.map +1 -1
  123. package/dist/client/middleware/timeout.js +48 -46
  124. package/dist/client/middleware/timeout.js.map +1 -1
  125. package/dist/client/middleware/tracing.d.ts.map +1 -1
  126. package/dist/client/middleware/tracing.js +11 -3
  127. package/dist/client/middleware/tracing.js.map +1 -1
  128. package/dist/client/types.d.ts +9 -1
  129. package/dist/client/types.d.ts.map +1 -1
  130. package/dist/client/types.js.map +1 -1
  131. package/dist/clock.d.ts +19 -0
  132. package/dist/clock.d.ts.map +1 -0
  133. package/dist/clock.js +18 -0
  134. package/dist/clock.js.map +1 -0
  135. package/dist/duration.d.ts +37 -0
  136. package/dist/duration.d.ts.map +1 -0
  137. package/dist/duration.js +44 -0
  138. package/dist/duration.js.map +1 -0
  139. package/dist/index.d.ts +4 -0
  140. package/dist/index.d.ts.map +1 -1
  141. package/dist/index.js +4 -0
  142. package/dist/index.js.map +1 -1
  143. package/dist/machines.d.ts +90 -0
  144. package/dist/machines.d.ts.map +1 -0
  145. package/dist/machines.js +127 -0
  146. package/dist/machines.js.map +1 -0
  147. package/dist/node.d.ts +11 -0
  148. package/dist/node.d.ts.map +1 -0
  149. package/dist/node.js +10 -0
  150. package/dist/node.js.map +1 -0
  151. package/dist/procedures/capability.d.ts +3 -6
  152. package/dist/procedures/capability.d.ts.map +1 -1
  153. package/dist/procedures/capability.js +7 -8
  154. package/dist/procedures/capability.js.map +1 -1
  155. package/dist/procedures/collection/index.d.ts +3 -3
  156. package/dist/procedures/collection/index.d.ts.map +1 -1
  157. package/dist/procedures/collection/index.js +1 -1
  158. package/dist/procedures/collection/index.js.map +1 -1
  159. package/dist/procedures/collection/procedures.d.ts.map +1 -1
  160. package/dist/procedures/collection/procedures.js +49 -1
  161. package/dist/procedures/collection/procedures.js.map +1 -1
  162. package/dist/procedures/collection/schemas.d.ts +33 -0
  163. package/dist/procedures/collection/schemas.d.ts.map +1 -1
  164. package/dist/procedures/collection/schemas.js +68 -0
  165. package/dist/procedures/collection/schemas.js.map +1 -1
  166. package/dist/procedures/collection/storage.d.ts +37 -0
  167. package/dist/procedures/collection/storage.d.ts.map +1 -1
  168. package/dist/procedures/core/array.d.ts +1 -1
  169. package/dist/procedures/core/array.d.ts.map +1 -1
  170. package/dist/procedures/core/array.js +81 -29
  171. package/dist/procedures/core/array.js.map +1 -1
  172. package/dist/procedures/core/index.d.ts.map +1 -1
  173. package/dist/procedures/core/index.js +17 -2
  174. package/dist/procedures/core/index.js.map +1 -1
  175. package/dist/procedures/core/logic.js +1 -1
  176. package/dist/procedures/core/logic.js.map +1 -1
  177. package/dist/procedures/core/math.d.ts.map +1 -1
  178. package/dist/procedures/core/math.js +5 -1
  179. package/dist/procedures/core/math.js.map +1 -1
  180. package/dist/procedures/core/meta.d.ts.map +1 -1
  181. package/dist/procedures/core/meta.js +43 -8
  182. package/dist/procedures/core/meta.js.map +1 -1
  183. package/dist/procedures/core/object.d.ts.map +1 -1
  184. package/dist/procedures/core/object.js +42 -13
  185. package/dist/procedures/core/object.js.map +1 -1
  186. package/dist/procedures/core/operands.d.ts.map +1 -1
  187. package/dist/procedures/core/operands.js +6 -1
  188. package/dist/procedures/core/operands.js.map +1 -1
  189. package/dist/procedures/core/string.d.ts.map +1 -1
  190. package/dist/procedures/core/string.js +4 -2
  191. package/dist/procedures/core/string.js.map +1 -1
  192. package/dist/procedures/core/type.d.ts.map +1 -1
  193. package/dist/procedures/core/type.js +4 -2
  194. package/dist/procedures/core/type.js.map +1 -1
  195. package/dist/procedures/define-procedure.d.ts +19 -7
  196. package/dist/procedures/define-procedure.d.ts.map +1 -1
  197. package/dist/procedures/define-procedure.js +57 -17
  198. package/dist/procedures/define-procedure.js.map +1 -1
  199. package/dist/procedures/discovery.d.ts +4 -6
  200. package/dist/procedures/discovery.d.ts.map +1 -1
  201. package/dist/procedures/discovery.js +4 -6
  202. package/dist/procedures/discovery.js.map +1 -1
  203. package/dist/procedures/effects.d.ts +16 -0
  204. package/dist/procedures/effects.d.ts.map +1 -1
  205. package/dist/procedures/effects.js +33 -0
  206. package/dist/procedures/effects.js.map +1 -1
  207. package/dist/procedures/idempotency.d.ts +73 -0
  208. package/dist/procedures/idempotency.d.ts.map +1 -0
  209. package/dist/procedures/idempotency.js +131 -0
  210. package/dist/procedures/idempotency.js.map +1 -0
  211. package/dist/procedures/index.d.ts +7 -3
  212. package/dist/procedures/index.d.ts.map +1 -1
  213. package/dist/procedures/index.js +6 -2
  214. package/dist/procedures/index.js.map +1 -1
  215. package/dist/procedures/interceptors.d.ts +17 -4
  216. package/dist/procedures/interceptors.d.ts.map +1 -1
  217. package/dist/procedures/interceptors.js +18 -7
  218. package/dist/procedures/interceptors.js.map +1 -1
  219. package/dist/procedures/invoke.d.ts +15 -3
  220. package/dist/procedures/invoke.d.ts.map +1 -1
  221. package/dist/procedures/invoke.js +8 -3
  222. package/dist/procedures/invoke.js.map +1 -1
  223. package/dist/procedures/manifest.d.ts +83 -0
  224. package/dist/procedures/manifest.d.ts.map +1 -0
  225. package/dist/procedures/manifest.js +90 -0
  226. package/dist/procedures/manifest.js.map +1 -0
  227. package/dist/procedures/ref.d.ts +4 -2
  228. package/dist/procedures/ref.d.ts.map +1 -1
  229. package/dist/procedures/ref.js +2 -1
  230. package/dist/procedures/ref.js.map +1 -1
  231. package/dist/procedures/runtime-programs.d.ts +19 -0
  232. package/dist/procedures/runtime-programs.d.ts.map +1 -0
  233. package/dist/procedures/runtime-programs.js +24 -0
  234. package/dist/procedures/runtime-programs.js.map +1 -0
  235. package/dist/procedures/types.d.ts +16 -0
  236. package/dist/procedures/types.d.ts.map +1 -1
  237. package/dist/procedures/types.js.map +1 -1
  238. package/dist/protocol.d.ts +47 -0
  239. package/dist/protocol.d.ts.map +1 -0
  240. package/dist/protocol.js +68 -0
  241. package/dist/protocol.js.map +1 -0
  242. package/dist/server/host-policy.d.ts +4 -3
  243. package/dist/server/host-policy.d.ts.map +1 -1
  244. package/dist/server/host-policy.js +6 -3
  245. package/dist/server/host-policy.js.map +1 -1
  246. package/dist/server/host-procedures.d.ts +31 -0
  247. package/dist/server/host-procedures.d.ts.map +1 -0
  248. package/dist/server/host-procedures.js +75 -0
  249. package/dist/server/host-procedures.js.map +1 -0
  250. package/dist/server/index.d.ts +3 -3
  251. package/dist/server/index.d.ts.map +1 -1
  252. package/dist/server/index.js +1 -1
  253. package/dist/server/index.js.map +1 -1
  254. package/dist/server/procedure-server.d.ts +112 -5
  255. package/dist/server/procedure-server.d.ts.map +1 -1
  256. package/dist/server/procedure-server.js +273 -19
  257. package/dist/server/procedure-server.js.map +1 -1
  258. package/dist/server/request-auth.d.ts +19 -0
  259. package/dist/server/request-auth.d.ts.map +1 -0
  260. package/dist/server/request-auth.js +32 -0
  261. package/dist/server/request-auth.js.map +1 -0
  262. package/dist/server/types.d.ts +32 -0
  263. package/dist/server/types.d.ts.map +1 -1
  264. package/dist/server/types.js.map +1 -1
  265. package/dist/timers.d.ts +60 -0
  266. package/dist/timers.d.ts.map +1 -0
  267. package/dist/timers.js +33 -0
  268. package/dist/timers.js.map +1 -0
  269. package/dist/tracing/traceparent.d.ts +26 -0
  270. package/dist/tracing/traceparent.d.ts.map +1 -0
  271. package/dist/tracing/traceparent.js +53 -0
  272. package/dist/tracing/traceparent.js.map +1 -0
  273. package/package.json +11 -4
  274. package/src/adapters/http/client/transport.ts +31 -3
  275. package/src/adapters/http/client/types.ts +3 -2
  276. package/src/adapters/http/server/transport.ts +61 -26
  277. package/src/adapters/http/shared/headers.ts +7 -6
  278. package/src/adapters/local/client/transport.ts +74 -7
  279. package/src/adapters/local/client/types.ts +18 -0
  280. package/src/adapters/mock/client/transport.ts +9 -6
  281. package/src/adapters/mock/client/types.ts +7 -6
  282. package/src/adapters/port/transport.ts +124 -0
  283. package/src/adapters/websocket/client/index.ts +1 -0
  284. package/src/adapters/websocket/client/node.ts +34 -0
  285. package/src/adapters/websocket/client/transport.ts +251 -81
  286. package/src/adapters/websocket/client/types.ts +81 -21
  287. package/src/adapters/websocket/server/transport.ts +199 -301
  288. package/src/adapters/websocket/server/types.ts +20 -1
  289. package/src/adapters/websocket/shared/rpc.ts +453 -0
  290. package/src/browser.ts +51 -3
  291. package/src/client/call-types.ts +10 -14
  292. package/src/client/client.ts +28 -9
  293. package/src/client/deadline.ts +64 -0
  294. package/src/client/errors/README.md +2 -0
  295. package/src/client/errors/factory.ts +12 -8
  296. package/src/client/errors/http-errors.ts +5 -0
  297. package/src/client/errors/index.ts +1 -1
  298. package/src/client/errors/registry.ts +79 -22
  299. package/src/client/index.ts +21 -3
  300. package/src/client/middleware/cache.ts +120 -23
  301. package/src/client/middleware/circuit-breaker.ts +65 -35
  302. package/src/client/middleware/contexts.ts +17 -10
  303. package/src/client/middleware/items.ts +101 -6
  304. package/src/client/middleware/lru.ts +12 -0
  305. package/src/client/middleware/rate-limit.ts +9 -9
  306. package/src/client/middleware/resilience.ts +81 -0
  307. package/src/client/middleware/retry.ts +146 -34
  308. package/src/client/middleware/timeout.ts +57 -55
  309. package/src/client/middleware/tracing.ts +13 -4
  310. package/src/client/types.ts +9 -1
  311. package/src/clock.ts +21 -0
  312. package/src/duration.ts +56 -0
  313. package/src/index.ts +4 -0
  314. package/src/machines.ts +186 -0
  315. package/src/node.ts +11 -0
  316. package/src/procedures/capability.ts +7 -8
  317. package/src/procedures/collection/index.ts +9 -1
  318. package/src/procedures/collection/procedures.ts +57 -0
  319. package/src/procedures/collection/schemas.ts +110 -0
  320. package/src/procedures/collection/storage.ts +38 -0
  321. package/src/procedures/core/array.ts +79 -31
  322. package/src/procedures/core/index.ts +17 -2
  323. package/src/procedures/core/logic.ts +1 -1
  324. package/src/procedures/core/math.ts +5 -1
  325. package/src/procedures/core/meta.ts +45 -8
  326. package/src/procedures/core/object.ts +48 -14
  327. package/src/procedures/core/operands.ts +7 -0
  328. package/src/procedures/core/string.ts +4 -2
  329. package/src/procedures/core/type.ts +4 -2
  330. package/src/procedures/define-procedure.ts +73 -20
  331. package/src/procedures/discovery.ts +4 -6
  332. package/src/procedures/effects.ts +35 -0
  333. package/src/procedures/idempotency.ts +152 -0
  334. package/src/procedures/index.ts +18 -2
  335. package/src/procedures/interceptors.ts +28 -11
  336. package/src/procedures/invoke.ts +19 -5
  337. package/src/procedures/manifest.ts +158 -0
  338. package/src/procedures/ref.ts +4 -2
  339. package/src/procedures/runtime-programs.ts +27 -0
  340. package/src/procedures/types.ts +16 -0
  341. package/src/protocol.ts +108 -0
  342. package/src/server/host-policy.ts +8 -5
  343. package/src/server/host-procedures.ts +102 -0
  344. package/src/server/index.ts +5 -2
  345. package/src/server/procedure-server.ts +328 -12
  346. package/src/server/request-auth.ts +35 -0
  347. package/src/server/types.ts +37 -0
  348. package/src/timers.ts +82 -0
  349. package/src/tracing/traceparent.ts +61 -0
  350. package/dist/procedures/cli/announce.d.ts +0 -67
  351. package/dist/procedures/cli/announce.d.ts.map +0 -1
  352. package/dist/procedures/cli/announce.js +0 -392
  353. package/dist/procedures/cli/announce.js.map +0 -1
  354. package/dist/procedures/cli/discover.d.ts +0 -66
  355. package/dist/procedures/cli/discover.d.ts.map +0 -1
  356. package/dist/procedures/cli/discover.js +0 -310
  357. package/dist/procedures/cli/discover.js.map +0 -1
  358. package/dist/procedures/cli/index.d.ts +0 -13
  359. package/dist/procedures/cli/index.d.ts.map +0 -1
  360. package/dist/procedures/cli/index.js +0 -203
  361. package/dist/procedures/cli/index.js.map +0 -1
  362. package/dist/procedures/cli/init.d.ts +0 -17
  363. package/dist/procedures/cli/init.d.ts.map +0 -1
  364. package/dist/procedures/cli/init.js +0 -336
  365. package/dist/procedures/cli/init.js.map +0 -1
  366. package/src/procedures/cli/announce.ts +0 -470
  367. package/src/procedures/cli/discover.ts +0 -390
  368. package/src/procedures/cli/index.ts +0 -231
  369. package/src/procedures/cli/init.ts +0 -370
@@ -6,6 +6,8 @@
6
6
  */
7
7
  import type { ResponseItem, Metadata, Method, TypedClientMiddleware } from "../types.js";
8
8
  import type { CacheContext } from "./contexts.js";
9
+ import { type Duration } from "../../duration.js";
10
+ import type { Effects } from "../../procedures/types.js";
9
11
  /**
10
12
  * Cache middleware options.
11
13
  */
@@ -17,10 +19,10 @@ export interface CacheOptions {
17
19
  */
18
20
  methods: readonly string[] | ((method: Method) => boolean);
19
21
  /**
20
- * Time-to-live for cache entries in milliseconds. A call can give its own: `cache: { ttl }`.
22
+ * Time-to-live for cache entries, for example `minutes(1)`. A call can give its own: `cache: { ttl }`.
21
23
  * @default 60000 (1 minute)
22
24
  */
23
- ttl?: number;
25
+ ttl?: Duration;
24
26
  /**
25
27
  * Maximum number of cache entries (LRU eviction when exceeded).
26
28
  * @default 100
@@ -32,11 +34,11 @@ export interface CacheOptions {
32
34
  */
33
35
  onStats?: (stats: CacheStats) => void;
34
36
  /**
35
- * Interval in milliseconds for emitting cache statistics.
37
+ * Interval for emitting cache statistics.
36
38
  * Only used if onStats is provided.
37
39
  * @default 60000 (1 minute)
38
40
  */
39
- statsInterval?: number;
41
+ statsInterval?: Duration;
40
42
  /**
41
43
  * Custom cache key generator.
42
44
  * Default: the method, the payload and the request metadata (see `defaultKeyGenerator`).
@@ -55,6 +57,13 @@ export interface CacheOptions {
55
57
  * @returns true if response should be cached
56
58
  */
57
59
  shouldCache?: (item: ResponseItem<unknown>) => boolean;
60
+ /**
61
+ * The effects of each method (roadmap R13), for example `effectsIn(registry)`. A call that
62
+ * writes resources deletes the cached entries of the methods that read one of them, when it
63
+ * succeeds. An entry of a method with unknown reads goes too. Without this option, a write
64
+ * deletes nothing, and the entries live until their time to live ends.
65
+ */
66
+ effects?: (method: Method) => Effects | undefined;
58
67
  }
59
68
  /**
60
69
  * Cache performance statistics.
@@ -89,6 +98,11 @@ export declare function stableStringify(value: unknown): string;
89
98
  * first page forever (deep dive TRN-5).
90
99
  */
91
100
  export declare function defaultKeyGenerator(method: Method, payload: unknown, metadata?: Metadata): string;
101
+ /**
102
+ * This function deletes the entries of a cache middleware: all of them, or the entries of the
103
+ * methods that `matches` selects. It gives the number of deleted entries.
104
+ */
105
+ export declare function invalidateCache(middleware: object, matches?: (method: Method) => boolean): number;
92
106
  /**
93
107
  * Create cache middleware with LRU eviction and TTL expiration.
94
108
  *
@@ -115,7 +129,7 @@ export declare function defaultKeyGenerator(method: Method, payload: unknown, me
115
129
  * client.use(createCacheMiddleware({
116
130
  * methods: ["users.get", "users.list"], // only these calls are cached
117
131
  * capacity: 100,
118
- * ttl: 60000, // 1 minute
132
+ * ttl: minutes(1),
119
133
  * onStats: (stats) => console.log(`Hit rate: ${stats.hitRate}%`)
120
134
  * }));
121
135
  * ```
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAA+B,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACtH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IAE3D;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAEtC;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,KAAK,MAAM,CAAC;IAEhF;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC;CACxD;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAetD;AAkBD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAOjG;AAmCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,GAAG,qBAAqB,CAAC,YAAY,EAAE,EAAE,CAAC,CA6GpG"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAA+B,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACtH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAA0B,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAGzD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IAE3D;;;OAGG;IACH,GAAG,CAAC,EAAE,QAAQ,CAAC;IAEf;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAEtC;;;;OAIG;IACH,aAAa,CAAC,EAAE,QAAQ,CAAC;IAEzB;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,KAAK,MAAM,CAAC;IAEhF;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC;IAEvD;;;;;OAKG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,GAAG,SAAS,CAAC;CACnD;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAetD;AA6BD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAOjG;AAwBD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,CAEjG;AAoBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,GAAG,qBAAqB,CAAC,YAAY,EAAE,EAAE,CAAC,CAyKpG"}
@@ -5,6 +5,8 @@
5
5
  * Works with any transport!
6
6
  */
7
7
  import { LruMap } from "./lru.js";
8
+ import { isDuration, optionalMs } from "../../duration.js";
9
+ import { TIMER_DEFAULTS } from "../../timers.js";
8
10
  /**
9
11
  * Deterministic stringify for cache keys: recursively sorts object keys at every depth, so
10
12
  * payloads that are structurally equal (regardless of key order) map to the same key, and
@@ -33,10 +35,21 @@ export function stableStringify(value) {
33
35
  return `{${body}}`;
34
36
  }
35
37
  /**
36
- * The metadata keys that do not change a response: middleware state and tracing. The other
37
- * keys (auth, pagination, custom fields) are part of the cache key.
38
+ * The metadata keys that do not change a response: middleware state, tracing, and the keys of
39
+ * one call (its idempotency key and the remaining time of its deadline). The other keys (auth,
40
+ * pagination, custom fields) are part of the cache key.
38
41
  */
39
- const VOLATILE_METADATA = new Set(["retry", "timeout", "tracing", "cache", "circuitBreaker", "rateLimit"]);
42
+ const VOLATILE_METADATA = new Set([
43
+ "retry",
44
+ "timeout",
45
+ "tracing",
46
+ "cache",
47
+ "circuitBreaker",
48
+ "rateLimit",
49
+ "idempotency-key",
50
+ "procedure-timeout",
51
+ "traceparent",
52
+ ]);
40
53
  /** The part of the metadata that can change a response. */
41
54
  function keyMetadata(metadata) {
42
55
  const out = {};
@@ -69,13 +82,22 @@ function copyItem(item) {
69
82
  return undefined;
70
83
  }
71
84
  }
85
+ /** The deleters of each cache middleware, for `invalidateCache` */
86
+ const invalidators = new WeakMap();
87
+ /**
88
+ * This function deletes the entries of a cache middleware: all of them, or the entries of the
89
+ * methods that `matches` selects. It gives the number of deleted entries.
90
+ */
91
+ export function invalidateCache(middleware, matches) {
92
+ return invalidators.get(middleware)?.(matches) ?? 0;
93
+ }
72
94
  /** The overrides of one call: `cache: { ttl, bypass, refresh }` in its context. */
73
95
  function cacheOverrides(value) {
74
96
  if (typeof value !== "object" || value === null)
75
97
  return {};
76
98
  const { ttl, bypass, refresh } = value;
77
99
  return {
78
- ...(typeof ttl === "number" && ttl >= 0 ? { ttl } : {}),
100
+ ...(isDuration(ttl) && ttl.value >= 0 ? { ttl: optionalMs(ttl, "cache.ttl") } : {}),
79
101
  ...(bypass === true ? { bypass: true } : {}),
80
102
  ...(refresh === true ? { refresh: true } : {}),
81
103
  };
@@ -112,13 +134,15 @@ function defaultShouldCache(item) {
112
134
  * client.use(createCacheMiddleware({
113
135
  * methods: ["users.get", "users.list"], // only these calls are cached
114
136
  * capacity: 100,
115
- * ttl: 60000, // 1 minute
137
+ * ttl: minutes(1),
116
138
  * onStats: (stats) => console.log(`Hit rate: ${stats.hitRate}%`)
117
139
  * }));
118
140
  * ```
119
141
  */
120
142
  export function createCacheMiddleware(options) {
121
- const { methods, ttl = 60000, capacity = 100, onStats, statsInterval = 60000, keyGenerator = defaultKeyGenerator, shouldCache = defaultShouldCache, } = options;
143
+ const ttl = optionalMs(options.ttl, "ttl") ?? TIMER_DEFAULTS.cache.ttlMs;
144
+ const statsInterval = optionalMs(options.statsInterval, "statsInterval") ?? TIMER_DEFAULTS.cache.statsIntervalMs;
145
+ const { methods, capacity = 100, onStats, keyGenerator = defaultKeyGenerator, shouldCache = defaultShouldCache, } = options;
122
146
  // An LRU map bounds the memory. Each entry keeps its own expiry time, so a call can give its
123
147
  // own TTL: before, one TTL map expired every entry after the TTL of the middleware.
124
148
  const cache = new LruMap(capacity, () => {
@@ -150,10 +174,30 @@ export function createCacheMiddleware(options) {
150
174
  const cacheable = typeof methods === "function"
151
175
  ? methods
152
176
  : ((names) => (method) => names.has(`${method.service}.${method.operation}`))(new Set(methods));
153
- return (next) => {
177
+ const effectsOf = options.effects;
178
+ /**
179
+ * The calls in flight, by key: a second call with the same key waits for the first one and
180
+ * gets a copy of its response (roadmap R13). Before, each one made its own request.
181
+ */
182
+ const inFlight = new Map();
183
+ /** A write that succeeded deletes the entries that read one of its resources (R13). */
184
+ const invalidateAfterWrite = (method) => {
185
+ const writes = effectsOf?.(method)?.writes;
186
+ if (!writes || writes.length === 0)
187
+ return;
188
+ cache.deleteWhere((entry) => entry.reads === undefined || entry.reads.some((resource) => writes.includes(resource)));
189
+ };
190
+ const middleware = (next) => {
154
191
  return async function* (context) {
155
192
  if (!cacheable(context.message.method)) {
156
- yield* next(context);
193
+ let failed = false;
194
+ for await (const item of next(context)) {
195
+ if (item.status.type === "error")
196
+ failed = true;
197
+ yield item;
198
+ }
199
+ if (!failed && effectsOf)
200
+ invalidateAfterWrite(context.message.method);
157
201
  return;
158
202
  }
159
203
  const metadata = context.message.metadata;
@@ -185,24 +229,68 @@ export function createCacheMiddleware(options) {
185
229
  // Expired
186
230
  cache.delete(cacheKey);
187
231
  }
232
+ // The same call is in flight: wait for it and give a copy of its response (R13)
233
+ const pending = overrides.refresh ? undefined : inFlight.get(cacheKey);
234
+ if (pending) {
235
+ const shared = await pending;
236
+ if (shared) {
237
+ stats.hits++;
238
+ setState(true);
239
+ for (const item of shared.items)
240
+ yield (copyItem(item) ?? item);
241
+ return;
242
+ }
243
+ // The first call gave a stream or an error: this call makes its own request
244
+ }
188
245
  // Cache miss - fetch and store. Only a response of one item is cached: a stream is never
189
246
  // collected or cached (before, the middleware kept every item of a stream in memory).
190
247
  stats.misses++;
191
248
  let first;
192
249
  let count = 0;
193
- for await (const item of next(context)) {
194
- count++;
195
- if (count === 1)
196
- first = item;
197
- yield item;
250
+ let settle = () => undefined;
251
+ const mine = new Promise((resolve) => (settle = resolve));
252
+ if (!overrides.refresh)
253
+ inFlight.set(cacheKey, mine);
254
+ let entry;
255
+ try {
256
+ for await (const item of next(context)) {
257
+ count++;
258
+ if (count === 1)
259
+ first = item;
260
+ yield item;
261
+ }
262
+ setState(false);
263
+ // An inner layer that changed the key metadata during the call (an auth middleware
264
+ // inside the cache) makes the key wrong: such a response is not stored (R13)
265
+ const keyAfter = keyGenerator(context.message.method, context.message.payload, metadata);
266
+ if (count === 1 && first && shouldCache(first) && keyAfter === cacheKey) {
267
+ const copy = copyItem(first);
268
+ if (copy) {
269
+ entry = {
270
+ items: [copy],
271
+ expiresAt: Date.now() + (overrides.ttl ?? ttl),
272
+ reads: effectsOf?.(context.message.method)?.reads,
273
+ method: context.message.method,
274
+ };
275
+ cache.set(cacheKey, entry);
276
+ }
277
+ }
198
278
  }
199
- setState(false);
200
- if (count === 1 && first && shouldCache(first)) {
201
- const copy = copyItem(first);
202
- if (copy)
203
- cache.set(cacheKey, { items: [copy], expiresAt: Date.now() + (overrides.ttl ?? ttl) });
279
+ finally {
280
+ if (inFlight.get(cacheKey) === mine)
281
+ inFlight.delete(cacheKey);
282
+ settle(entry);
204
283
  }
205
284
  };
206
285
  };
286
+ invalidators.set(middleware, (matches) => {
287
+ if (!matches) {
288
+ const size = cache.size;
289
+ cache.clear();
290
+ return size;
291
+ }
292
+ return cache.deleteWhere((entry) => matches(entry.method));
293
+ });
294
+ return middleware;
207
295
  }
208
296
  //# sourceMappingURL=cache.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/client/middleware/cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/client/middleware/cache.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,9 @@
11
11
  */
12
12
  import type { ClientMiddleware, TypedClientMiddleware } from "../types.js";
13
13
  import type { CircuitBreakerContext } from "./contexts.js";
14
+ import { type Duration } from "../../duration.js";
15
+ import { type Clock } from "../../clock.js";
16
+ import { type MachineTransition } from "../../machines.js";
14
17
  /**
15
18
  * Circuit breaker state.
16
19
  */
@@ -25,15 +28,15 @@ export interface CircuitBreakerOptions {
25
28
  */
26
29
  failureThreshold?: number;
27
30
  /**
28
- * Time window for counting failures (in milliseconds).
29
- * @default 10000 (10 seconds)
31
+ * Time window for counting failures.
32
+ * @default 10 seconds
30
33
  */
31
- failureWindow?: number;
34
+ failureWindow?: Duration;
32
35
  /**
33
- * Time to wait before attempting to close circuit (in milliseconds).
34
- * @default 30000 (30 seconds)
36
+ * Time to wait before attempting to close circuit.
37
+ * @default 30 seconds
35
38
  */
36
- resetTimeout?: number;
39
+ resetTimeout?: Duration;
37
40
  /**
38
41
  * Number of successful requests required to close circuit from HALF_OPEN.
39
42
  * @default 2
@@ -47,14 +50,29 @@ export interface CircuitBreakerOptions {
47
50
  halfOpenMaxRequests?: number;
48
51
  /**
49
52
  * Custom error predicate.
50
- * Return true if error should count as failure.
51
- * @default All errors count as failures
53
+ * Return true if error should count as failure. An error that is not a failure counts as
54
+ * nothing: not a failure and not a success.
55
+ * @default `isAvailabilityFailure`: only UNAVAILABLE, TIMEOUT, a stopped server, a gateway
56
+ * error and network errors count. An abort or a validation error does not (roadmap R12: before,
57
+ * every error counted, so a caller that aborted could open the circuit).
52
58
  */
53
59
  isFailure?: (error: Error) => boolean;
54
60
  /**
55
61
  * Callback when circuit state changes.
56
62
  */
57
63
  onStateChange?: (oldState: CircuitState, newState: CircuitState) => void;
64
+ /**
65
+ * The clock of the window and of the reset (roadmap R35). The default is the clock of the
66
+ * platform. A test gives a fake clock.
67
+ */
68
+ clock?: Clock;
69
+ /**
70
+ * This function gets each change of the state, with its event, as a transition of
71
+ * `CIRCUIT_BREAKER_MACHINE` (roadmap R35). A test replays them against the document.
72
+ */
73
+ onTransition?: (transition: MachineTransition) => void;
74
+ /** The name of the breaker in its transitions. The default is "circuit-breaker". */
75
+ name?: string;
58
76
  }
59
77
  /**
60
78
  * Circuit breaker statistics.
@@ -88,8 +106,8 @@ export declare class CircuitBreakerError extends Error {
88
106
  * ```typescript
89
107
  * client.use(createCircuitBreakerMiddleware({
90
108
  * failureThreshold: 5, // Open after 5 failures
91
- * failureWindow: 10000, // Within 10 seconds
92
- * resetTimeout: 30000, // Try again after 30 seconds
109
+ * failureWindow: seconds(10), // Within 10 seconds
110
+ * resetTimeout: seconds(30), // Try again after 30 seconds
93
111
  * successThreshold: 2 // Close after 2 successes
94
112
  * }));
95
113
  * ```
@@ -1 +1 @@
1
- {"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAA+B,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACxG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC;IAEtC;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;CAC1E;AAUD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAE1B,KAAK,EAAE,YAAY;aACnB,SAAS,EAAE,KAAK,GAAG,IAAI;IAFzC,YACkB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,KAAK,GAAG,IAAI,EAMxC;CACF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,GAAE,qBAA0B,GAClC,qBAAqB,CAAC,qBAAqB,EAAE,EAAE,CAAC,CA8LlD;AAKD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,gBAAgB,GAAG,qBAAqB,CAAC,qBAAqB,EAAE,EAAE,CAAC,GAC9E,mBAAmB,GAAG,IAAI,CAG5B"}
1
+ {"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAA+B,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACxG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE9D,OAAO,EAA0B,KAAK,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGpF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,aAAa,CAAC,EAAE,QAAQ,CAAC;IAEzB;;;OAGG;IACH,YAAY,CAAC,EAAE,QAAQ,CAAC;IAExB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC;IAEtC;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAEzE;;;OAGG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,UAAU,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAEvD,oFAAoF;IACpF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAaD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAE1B,KAAK,EAAE,YAAY;aACnB,SAAS,EAAE,KAAK,GAAG,IAAI;IAFzC,YACkB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,KAAK,GAAG,IAAI,EAMxC;CACF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,GAAE,qBAA0B,GAClC,qBAAqB,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAkMlD;AAKD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,gBAAgB,GAAG,qBAAqB,CAAC,qBAAqB,EAAE,EAAE,CAAC,GAC9E,mBAAmB,GAAG,IAAI,CAG5B"}
@@ -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
  /**