@procedures/client 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +71 -0
- package/README.md +61 -38
- package/dist/.tsbuildinfo +1 -1
- package/dist/adapters/http/client/transport.d.ts.map +1 -1
- package/dist/adapters/http/client/transport.js +35 -3
- package/dist/adapters/http/client/transport.js.map +1 -1
- package/dist/adapters/http/client/types.d.ts +3 -2
- package/dist/adapters/http/client/types.d.ts.map +1 -1
- package/dist/adapters/http/server/transport.d.ts +2 -2
- package/dist/adapters/http/server/transport.d.ts.map +1 -1
- package/dist/adapters/http/server/transport.js +53 -20
- package/dist/adapters/http/server/transport.js.map +1 -1
- package/dist/adapters/http/shared/headers.d.ts +1 -1
- package/dist/adapters/http/shared/headers.d.ts.map +1 -1
- package/dist/adapters/http/shared/headers.js +7 -6
- package/dist/adapters/http/shared/headers.js.map +1 -1
- package/dist/adapters/local/client/transport.d.ts +3 -0
- package/dist/adapters/local/client/transport.d.ts.map +1 -1
- package/dist/adapters/local/client/transport.js +63 -4
- package/dist/adapters/local/client/transport.js.map +1 -1
- package/dist/adapters/local/client/types.d.ts +15 -0
- package/dist/adapters/local/client/types.d.ts.map +1 -1
- package/dist/adapters/local/client/types.js.map +1 -1
- package/dist/adapters/mock/client/transport.d.ts +3 -2
- package/dist/adapters/mock/client/transport.d.ts.map +1 -1
- package/dist/adapters/mock/client/transport.js +8 -5
- package/dist/adapters/mock/client/transport.js.map +1 -1
- package/dist/adapters/mock/client/types.d.ts +7 -6
- package/dist/adapters/mock/client/types.d.ts.map +1 -1
- package/dist/adapters/port/transport.d.ts +62 -0
- package/dist/adapters/port/transport.d.ts.map +1 -0
- package/dist/adapters/port/transport.js +94 -0
- package/dist/adapters/port/transport.js.map +1 -0
- package/dist/adapters/websocket/client/index.d.ts +1 -1
- package/dist/adapters/websocket/client/index.d.ts.map +1 -1
- package/dist/adapters/websocket/client/index.js.map +1 -1
- package/dist/adapters/websocket/client/transport.d.ts +47 -7
- package/dist/adapters/websocket/client/transport.d.ts.map +1 -1
- package/dist/adapters/websocket/client/transport.js +213 -67
- package/dist/adapters/websocket/client/transport.js.map +1 -1
- package/dist/adapters/websocket/client/types.d.ts +70 -21
- package/dist/adapters/websocket/client/types.d.ts.map +1 -1
- package/dist/adapters/websocket/client/types.js.map +1 -1
- package/dist/adapters/websocket/server/transport.d.ts +65 -24
- package/dist/adapters/websocket/server/transport.d.ts.map +1 -1
- package/dist/adapters/websocket/server/transport.js +192 -263
- package/dist/adapters/websocket/server/transport.js.map +1 -1
- package/dist/adapters/websocket/server/types.d.ts +20 -1
- package/dist/adapters/websocket/server/types.d.ts.map +1 -1
- package/dist/adapters/websocket/shared/rpc.d.ts +129 -0
- package/dist/adapters/websocket/shared/rpc.d.ts.map +1 -0
- package/dist/adapters/websocket/shared/rpc.js +425 -0
- package/dist/adapters/websocket/shared/rpc.js.map +1 -0
- package/dist/browser.d.ts +29 -7
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +26 -3
- package/dist/browser.js.map +1 -1
- package/dist/client/call-types.d.ts +10 -10
- package/dist/client/call-types.d.ts.map +1 -1
- package/dist/client/call-types.js +1 -6
- package/dist/client/call-types.js.map +1 -1
- package/dist/client/client.d.ts +6 -1
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +23 -9
- package/dist/client/client.js.map +1 -1
- package/dist/client/deadline.d.ts +38 -0
- package/dist/client/deadline.d.ts.map +1 -0
- package/dist/client/deadline.js +60 -0
- package/dist/client/deadline.js.map +1 -0
- package/dist/client/errors/factory.d.ts.map +1 -1
- package/dist/client/errors/factory.js +11 -7
- package/dist/client/errors/factory.js.map +1 -1
- package/dist/client/index.d.ts +9 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +8 -2
- package/dist/client/index.js.map +1 -1
- package/dist/client/middleware/cache.d.ts +19 -5
- package/dist/client/middleware/cache.d.ts.map +1 -1
- package/dist/client/middleware/cache.js +106 -18
- package/dist/client/middleware/cache.js.map +1 -1
- package/dist/client/middleware/circuit-breaker.d.ts +28 -10
- package/dist/client/middleware/circuit-breaker.d.ts.map +1 -1
- package/dist/client/middleware/circuit-breaker.js +35 -24
- package/dist/client/middleware/circuit-breaker.js.map +1 -1
- package/dist/client/middleware/contexts.d.ts +16 -10
- package/dist/client/middleware/contexts.d.ts.map +1 -1
- package/dist/client/middleware/contexts.js.map +1 -1
- package/dist/client/middleware/items.d.ts +31 -2
- package/dist/client/middleware/items.d.ts.map +1 -1
- package/dist/client/middleware/items.js +86 -6
- package/dist/client/middleware/items.js.map +1 -1
- package/dist/client/middleware/lru.d.ts +2 -0
- package/dist/client/middleware/lru.d.ts.map +1 -1
- package/dist/client/middleware/lru.js +11 -0
- package/dist/client/middleware/lru.js.map +1 -1
- package/dist/client/middleware/rate-limit.d.ts +7 -6
- package/dist/client/middleware/rate-limit.d.ts.map +1 -1
- package/dist/client/middleware/rate-limit.js +9 -6
- package/dist/client/middleware/rate-limit.js.map +1 -1
- package/dist/client/middleware/resilience.d.ts +61 -0
- package/dist/client/middleware/resilience.d.ts.map +1 -0
- package/dist/client/middleware/resilience.js +59 -0
- package/dist/client/middleware/resilience.js.map +1 -0
- package/dist/client/middleware/retry.d.ts +45 -11
- package/dist/client/middleware/retry.d.ts.map +1 -1
- package/dist/client/middleware/retry.js +102 -22
- package/dist/client/middleware/retry.js.map +1 -1
- package/dist/client/middleware/timeout.d.ts +15 -12
- package/dist/client/middleware/timeout.d.ts.map +1 -1
- package/dist/client/middleware/timeout.js +46 -37
- package/dist/client/middleware/timeout.js.map +1 -1
- package/dist/client/middleware/tracing.d.ts.map +1 -1
- package/dist/client/middleware/tracing.js +11 -3
- package/dist/client/middleware/tracing.js.map +1 -1
- package/dist/client/types.d.ts +9 -1
- package/dist/client/types.d.ts.map +1 -1
- package/dist/client/types.js.map +1 -1
- package/dist/clock.d.ts +19 -0
- package/dist/clock.d.ts.map +1 -0
- package/dist/clock.js +18 -0
- package/dist/clock.js.map +1 -0
- package/dist/duration.d.ts +37 -0
- package/dist/duration.d.ts.map +1 -0
- package/dist/duration.js +44 -0
- package/dist/duration.js.map +1 -0
- package/dist/machines.d.ts +90 -0
- package/dist/machines.d.ts.map +1 -0
- package/dist/machines.js +127 -0
- package/dist/machines.js.map +1 -0
- package/dist/procedures/capability.d.ts +3 -6
- package/dist/procedures/capability.d.ts.map +1 -1
- package/dist/procedures/capability.js +11 -9
- package/dist/procedures/capability.js.map +1 -1
- package/dist/procedures/collection/index.d.ts +3 -3
- package/dist/procedures/collection/index.d.ts.map +1 -1
- package/dist/procedures/collection/index.js +1 -1
- package/dist/procedures/collection/index.js.map +1 -1
- package/dist/procedures/collection/procedures.d.ts.map +1 -1
- package/dist/procedures/collection/procedures.js +49 -1
- package/dist/procedures/collection/procedures.js.map +1 -1
- package/dist/procedures/collection/schemas.d.ts +33 -0
- package/dist/procedures/collection/schemas.d.ts.map +1 -1
- package/dist/procedures/collection/schemas.js +68 -0
- package/dist/procedures/collection/schemas.js.map +1 -1
- package/dist/procedures/collection/storage.d.ts +37 -0
- package/dist/procedures/collection/storage.d.ts.map +1 -1
- package/dist/procedures/core/array.d.ts.map +1 -1
- package/dist/procedures/core/array.js +26 -15
- package/dist/procedures/core/array.js.map +1 -1
- package/dist/procedures/core/index.d.ts.map +1 -1
- package/dist/procedures/core/index.js +8 -0
- package/dist/procedures/core/index.js.map +1 -1
- package/dist/procedures/core/meta.d.ts.map +1 -1
- package/dist/procedures/core/meta.js +2 -1
- package/dist/procedures/core/meta.js.map +1 -1
- package/dist/procedures/core/object.d.ts.map +1 -1
- package/dist/procedures/core/object.js +42 -13
- package/dist/procedures/core/object.js.map +1 -1
- package/dist/procedures/core/operands.d.ts.map +1 -1
- package/dist/procedures/core/operands.js +6 -1
- package/dist/procedures/core/operands.js.map +1 -1
- package/dist/procedures/core/string.d.ts.map +1 -1
- package/dist/procedures/core/string.js +4 -2
- package/dist/procedures/core/string.js.map +1 -1
- package/dist/procedures/define-procedure.d.ts +19 -7
- package/dist/procedures/define-procedure.d.ts.map +1 -1
- package/dist/procedures/define-procedure.js +66 -21
- package/dist/procedures/define-procedure.js.map +1 -1
- package/dist/procedures/effects.d.ts +16 -0
- package/dist/procedures/effects.d.ts.map +1 -1
- package/dist/procedures/effects.js +33 -0
- package/dist/procedures/effects.js.map +1 -1
- package/dist/procedures/idempotency.d.ts +73 -0
- package/dist/procedures/idempotency.d.ts.map +1 -0
- package/dist/procedures/idempotency.js +131 -0
- package/dist/procedures/idempotency.js.map +1 -0
- package/dist/procedures/index.d.ts +7 -3
- package/dist/procedures/index.d.ts.map +1 -1
- package/dist/procedures/index.js +6 -2
- package/dist/procedures/index.js.map +1 -1
- package/dist/procedures/interceptors.d.ts +17 -4
- package/dist/procedures/interceptors.d.ts.map +1 -1
- package/dist/procedures/interceptors.js +18 -7
- package/dist/procedures/interceptors.js.map +1 -1
- package/dist/procedures/invoke.d.ts +15 -3
- package/dist/procedures/invoke.d.ts.map +1 -1
- package/dist/procedures/invoke.js +8 -3
- package/dist/procedures/invoke.js.map +1 -1
- package/dist/procedures/manifest.d.ts +83 -0
- package/dist/procedures/manifest.d.ts.map +1 -0
- package/dist/procedures/manifest.js +90 -0
- package/dist/procedures/manifest.js.map +1 -0
- package/dist/procedures/runtime-programs.d.ts +19 -0
- package/dist/procedures/runtime-programs.d.ts.map +1 -0
- package/dist/procedures/runtime-programs.js +24 -0
- package/dist/procedures/runtime-programs.js.map +1 -0
- package/dist/procedures/types.d.ts +20 -1
- package/dist/procedures/types.d.ts.map +1 -1
- package/dist/procedures/types.js.map +1 -1
- package/dist/protocol.d.ts +40 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +58 -0
- package/dist/protocol.js.map +1 -0
- package/dist/server/host-policy.d.ts +4 -3
- package/dist/server/host-policy.d.ts.map +1 -1
- package/dist/server/host-policy.js +6 -3
- package/dist/server/host-policy.js.map +1 -1
- package/dist/server/host-procedures.d.ts +31 -0
- package/dist/server/host-procedures.d.ts.map +1 -0
- package/dist/server/host-procedures.js +75 -0
- package/dist/server/host-procedures.js.map +1 -0
- package/dist/server/index.d.ts +3 -3
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/procedure-server.d.ts +110 -4
- package/dist/server/procedure-server.d.ts.map +1 -1
- package/dist/server/procedure-server.js +269 -17
- package/dist/server/procedure-server.js.map +1 -1
- package/dist/server/request-auth.d.ts +19 -0
- package/dist/server/request-auth.d.ts.map +1 -0
- package/dist/server/request-auth.js +32 -0
- package/dist/server/request-auth.js.map +1 -0
- package/dist/server/types.d.ts +32 -0
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js.map +1 -1
- package/dist/timers.d.ts +60 -0
- package/dist/timers.d.ts.map +1 -0
- package/dist/timers.js +33 -0
- package/dist/timers.js.map +1 -0
- package/dist/tracing/traceparent.d.ts +26 -0
- package/dist/tracing/traceparent.d.ts.map +1 -0
- package/dist/tracing/traceparent.js +53 -0
- package/dist/tracing/traceparent.js.map +1 -0
- package/package.json +7 -1
- package/src/adapters/http/client/transport.ts +31 -3
- package/src/adapters/http/client/types.ts +3 -2
- package/src/adapters/http/server/transport.ts +60 -24
- package/src/adapters/http/shared/headers.ts +7 -6
- package/src/adapters/local/client/transport.ts +70 -5
- package/src/adapters/local/client/types.ts +18 -0
- package/src/adapters/mock/client/transport.ts +9 -6
- package/src/adapters/mock/client/types.ts +7 -6
- package/src/adapters/port/transport.ts +124 -0
- package/src/adapters/websocket/client/index.ts +1 -0
- package/src/adapters/websocket/client/transport.ts +232 -73
- package/src/adapters/websocket/client/types.ts +80 -21
- package/src/adapters/websocket/server/transport.ts +199 -301
- package/src/adapters/websocket/server/types.ts +20 -1
- package/src/adapters/websocket/shared/rpc.ts +453 -0
- package/src/browser.ts +51 -3
- package/src/client/call-types.ts +10 -14
- package/src/client/client.ts +28 -9
- package/src/client/deadline.ts +64 -0
- package/src/client/errors/factory.ts +12 -8
- package/src/client/index.ts +21 -3
- package/src/client/middleware/cache.ts +120 -23
- package/src/client/middleware/circuit-breaker.ts +65 -35
- package/src/client/middleware/contexts.ts +17 -10
- package/src/client/middleware/items.ts +101 -6
- package/src/client/middleware/lru.ts +12 -0
- package/src/client/middleware/rate-limit.ts +9 -7
- package/src/client/middleware/resilience.ts +81 -0
- package/src/client/middleware/retry.ts +146 -34
- package/src/client/middleware/timeout.ts +55 -46
- package/src/client/middleware/tracing.ts +13 -4
- package/src/client/types.ts +9 -1
- package/src/clock.ts +21 -0
- package/src/duration.ts +56 -0
- package/src/machines.ts +186 -0
- package/src/procedures/capability.ts +11 -9
- package/src/procedures/collection/index.ts +9 -1
- package/src/procedures/collection/procedures.ts +57 -0
- package/src/procedures/collection/schemas.ts +110 -0
- package/src/procedures/collection/storage.ts +38 -0
- package/src/procedures/core/array.ts +27 -16
- package/src/procedures/core/index.ts +8 -0
- package/src/procedures/core/meta.ts +2 -1
- package/src/procedures/core/object.ts +48 -14
- package/src/procedures/core/operands.ts +7 -0
- package/src/procedures/core/string.ts +4 -2
- package/src/procedures/define-procedure.ts +82 -24
- package/src/procedures/effects.ts +35 -0
- package/src/procedures/idempotency.ts +152 -0
- package/src/procedures/index.ts +18 -2
- package/src/procedures/interceptors.ts +28 -11
- package/src/procedures/invoke.ts +19 -5
- package/src/procedures/manifest.ts +158 -0
- package/src/procedures/runtime-programs.ts +27 -0
- package/src/procedures/types.ts +20 -1
- package/src/protocol.ts +97 -0
- package/src/server/host-policy.ts +8 -5
- package/src/server/host-procedures.ts +102 -0
- package/src/server/index.ts +5 -2
- package/src/server/procedure-server.ts +324 -10
- package/src/server/request-auth.ts +35 -0
- package/src/server/types.ts +37 -0
- package/src/timers.ts +82 -0
- package/src/tracing/traceparent.ts +61 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One deadline for a call (roadmap R10).
|
|
3
|
+
*
|
|
4
|
+
* A call has one absolute deadline in its metadata (`__deadline`, a time of `Date.now()`). The
|
|
5
|
+
* key starts with `__`, so it stays in this process. Each part of the client can only make it
|
|
6
|
+
* earlier: the remaining time that the caller sends, the overall timeout and the timeout of each
|
|
7
|
+
* try. Just before the transport sends a try, the client writes the remaining time into
|
|
8
|
+
* `procedure-timeout`. The server uses it to make its own deadline earlier, so a handler stops
|
|
9
|
+
* when its caller stops waiting.
|
|
10
|
+
*
|
|
11
|
+
* Before, the overall timeout and the timeout of each try did not reach the server, and a
|
|
12
|
+
* client could also send `X-Timeout`, which the server ignored.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* The metadata key of the remaining time of a remote call, in milliseconds. A server uses it
|
|
16
|
+
* only to make its deadline earlier.
|
|
17
|
+
*/
|
|
18
|
+
export const TIMEOUT_METADATA_KEY = "procedure-timeout";
|
|
19
|
+
/** The metadata key of the absolute deadline of a call. It stays in this process. */
|
|
20
|
+
export const DEADLINE_METADATA_KEY = "__deadline";
|
|
21
|
+
/** The deadline of a call, or undefined. */
|
|
22
|
+
export function deadlineOf(metadata) {
|
|
23
|
+
const deadline = metadata[DEADLINE_METADATA_KEY];
|
|
24
|
+
return typeof deadline === "number" && Number.isFinite(deadline) ? deadline : undefined;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* This function makes the deadline of a call earlier: the earlier of its deadline and `at`. It
|
|
28
|
+
* gives the deadline from before, to put back with `restoreDeadline`.
|
|
29
|
+
*/
|
|
30
|
+
export function narrowDeadline(metadata, at) {
|
|
31
|
+
const before = deadlineOf(metadata);
|
|
32
|
+
metadata[DEADLINE_METADATA_KEY] = before === undefined ? at : Math.min(before, at);
|
|
33
|
+
return before;
|
|
34
|
+
}
|
|
35
|
+
/** This function puts back the deadline from before a `narrowDeadline`. */
|
|
36
|
+
export function restoreDeadline(metadata, before) {
|
|
37
|
+
if (before === undefined)
|
|
38
|
+
delete metadata[DEADLINE_METADATA_KEY];
|
|
39
|
+
else
|
|
40
|
+
metadata[DEADLINE_METADATA_KEY] = before;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The remaining time that the caller gives in `procedure-timeout` becomes the deadline of the
|
|
44
|
+
* call, when the call starts. The client then writes the remaining time again for each try.
|
|
45
|
+
*/
|
|
46
|
+
export function absorbTimeout(metadata, now = Date.now()) {
|
|
47
|
+
const timeoutMs = metadata[TIMEOUT_METADATA_KEY];
|
|
48
|
+
if (typeof timeoutMs !== "number" || !Number.isFinite(timeoutMs) || timeoutMs < 0)
|
|
49
|
+
return;
|
|
50
|
+
delete metadata[TIMEOUT_METADATA_KEY];
|
|
51
|
+
narrowDeadline(metadata, now + timeoutMs);
|
|
52
|
+
}
|
|
53
|
+
/** This function writes the remaining time of the deadline into `procedure-timeout`, for one try. */
|
|
54
|
+
export function writeRemainingTime(metadata, now = Date.now()) {
|
|
55
|
+
const deadline = deadlineOf(metadata);
|
|
56
|
+
if (deadline === undefined)
|
|
57
|
+
return;
|
|
58
|
+
metadata[TIMEOUT_METADATA_KEY] = Math.max(0, Math.floor(deadline - now));
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=deadline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deadline.js","sourceRoot":"","sources":["../../src/client/deadline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;AAExD,qFAAqF;AACrF,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAAC;AAElD,4CAA4C;AAC5C,MAAM,UAAU,UAAU,CAAC,QAAkB;IAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IACjD,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1F,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAkB,EAAE,EAAU;IAC3D,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACpC,QAAQ,CAAC,qBAAqB,CAAC,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACnF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,eAAe,CAAC,QAAkB,EAAE,MAA0B;IAC5E,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC,qBAAqB,CAAC,CAAC;;QAC5D,QAAQ,CAAC,qBAAqB,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAkB,EAAE,GAAG,GAAW,IAAI,CAAC,GAAG,EAAE;IACxE,MAAM,SAAS,GAAG,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IACjD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC;QAAE,OAAO;IAC1F,OAAO,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IACtC,cAAc,CAAC,QAAQ,EAAE,GAAG,GAAG,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,kBAAkB,CAAC,QAAkB,EAAE,GAAG,GAAW,IAAI,CAAC,GAAG,EAAE;IAC7E,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO;IACnC,QAAQ,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/client/errors/factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,EAC/B,KAAK,CAAC,EAAE,KAAK,GACZ,SAAS,CAcX;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAC9B,SAAS,CAIX;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;CACpD,CAAA;
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/client/errors/factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,EAC/B,KAAK,CAAC,EAAE,KAAK,GACZ,SAAS,CAcX;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAC9B,SAAS,CAIX;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;CACpD,CAAA;AA6DD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,KAAK,EACZ,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAC9B,SAAS,CASX;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG;IACnD,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,aAAa,CAAC;CACzB,CAQA;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,UAAQ,GAAG,MAAM,CAwC1E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAErD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAET"}
|
|
@@ -72,7 +72,9 @@ export function createErrorFromHTTPStatus(status, context) {
|
|
|
72
72
|
const ERROR_PATTERNS = [
|
|
73
73
|
{
|
|
74
74
|
code: ErrorCode.ABORTED,
|
|
75
|
-
|
|
75
|
+
// The reason of AbortSignal.timeout() is a TimeoutError with the message "The operation was
|
|
76
|
+
// aborted due to timeout": it is a timeout (roadmap R30: before, it was ABORTED)
|
|
77
|
+
detect: (name, message) => name === "aborterror" || (name !== "timeouterror" && message.includes("abort")),
|
|
76
78
|
},
|
|
77
79
|
{
|
|
78
80
|
code: ErrorCode.TIMEOUT,
|
|
@@ -97,18 +99,20 @@ const ERROR_PATTERNS = [
|
|
|
97
99
|
message.includes("network") ||
|
|
98
100
|
message.includes("connection"),
|
|
99
101
|
},
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
detect: (_name, message) => message.includes("parse") ||
|
|
103
|
-
message.includes("json") ||
|
|
104
|
-
message.includes("unexpected token"),
|
|
105
|
-
},
|
|
102
|
+
// Before the parse errors: "Converting circular structure to JSON" names JSON too (roadmap R30:
|
|
103
|
+
// before, it was PARSE_ERROR)
|
|
106
104
|
{
|
|
107
105
|
code: ErrorCode.SERIALIZE_ERROR,
|
|
108
106
|
detect: (_name, message) => message.includes("serialize") ||
|
|
109
107
|
message.includes("stringify") ||
|
|
110
108
|
message.includes("circular"),
|
|
111
109
|
},
|
|
110
|
+
{
|
|
111
|
+
code: ErrorCode.PARSE_ERROR,
|
|
112
|
+
detect: (_name, message) => message.includes("parse") ||
|
|
113
|
+
message.includes("json") ||
|
|
114
|
+
message.includes("unexpected token"),
|
|
115
|
+
},
|
|
112
116
|
];
|
|
113
117
|
/**
|
|
114
118
|
* Create error from native Error exception.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/client/errors/factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAIN,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,WAAW,CACzB,IAAY,EACZ,OAA+B,EAC/B,KAAa;IAEb,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAExC,MAAM,WAAW,GAAiB;QAChC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,GAAG,OAAO;KACX,CAAC;IAEF,OAAO;QACL,IAAI;QACJ,QAAQ;QACR,OAAO,EAAE,WAAW;QACpB,GAAG,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,CAAC;KACxB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAAc,EACd,OAA+B;IAE/B,mCAAmC;IACnC,MAAM,IAAI,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC3C,OAAO,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC;AAOD;;;;;GAKG;AACH,MAAM,cAAc,GAAoB;IACtC;QACE,IAAI,EAAE,SAAS,CAAC,OAAO;QACvB,MAAM,EAAE,CAAC,IAAY,EAAE,OAAe,EAAE,EAAE,CACxC,IAAI,KAAK,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/client/errors/factory.ts"],"names":[],"mappings":"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"}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -13,16 +13,23 @@ export type { HttpTransportOptions, UrlStrategy, HttpMethodStrategy } from "../a
|
|
|
13
13
|
export { LocalTransport } from "../adapters/local/client/index.js";
|
|
14
14
|
export type { LocalTransportOptions, Handler } from "../adapters/local/client/index.js";
|
|
15
15
|
export { WebSocketTransport } from "../adapters/websocket/client/index.js";
|
|
16
|
-
export type { WebSocketTransportOptions } from "../adapters/websocket/client/index.js";
|
|
16
|
+
export type { WebSocketTransportOptions, WebSocketClass } from "../adapters/websocket/client/index.js";
|
|
17
17
|
export { WebSocketState } from "../adapters/websocket/client/index.js";
|
|
18
18
|
export { MockTransport, mockBuilder } from "../adapters/mock/client/index.js";
|
|
19
19
|
export type { MockTransportOptions, MockResponse, ResponseMatcher, CallHistoryEntry, } from "../adapters/mock/client//index.js";
|
|
20
20
|
export { createRetryMiddleware } from "./middleware/retry.js";
|
|
21
|
+
export { DELIVERY_METADATA_KEY, deliveryOf, isNotSentError } from "./middleware/items.js";
|
|
22
|
+
export type { Delivery } from "./middleware/items.js";
|
|
21
23
|
export type { RetryOptions } from "./middleware/retry.js";
|
|
22
|
-
export { createCacheMiddleware } from "./middleware/cache.js";
|
|
24
|
+
export { createCacheMiddleware, invalidateCache } from "./middleware/cache.js";
|
|
23
25
|
export type { CacheOptions, CacheStats } from "./middleware/cache.js";
|
|
24
26
|
export { createTimeoutMiddleware, createOverallTimeoutMiddleware, createCombinedTimeoutMiddleware, } from "./middleware/timeout.js";
|
|
25
27
|
export type { TimeoutOptions } from "./middleware/timeout.js";
|
|
28
|
+
export { ms, seconds, minutes, hours, toMs, isDuration } from "../duration.js";
|
|
29
|
+
export type { Duration } from "../duration.js";
|
|
30
|
+
export { resilience } from "./middleware/resilience.js";
|
|
31
|
+
export type { ResilienceOptions, ResilienceContext } from "./middleware/resilience.js";
|
|
32
|
+
export { TIMEOUT_METADATA_KEY, DEADLINE_METADATA_KEY, deadlineOf, narrowDeadline, restoreDeadline, absorbTimeout, writeRemainingTime, } from "./deadline.js";
|
|
26
33
|
export { createPaginationMiddleware, paginateAll } from "./middleware/pagination.js";
|
|
27
34
|
export type { PaginationOptions } from "./middleware/pagination.js";
|
|
28
35
|
export { createCircuitBreakerMiddleware, CircuitBreakerError } from "./middleware/circuit-breaker.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,yBAAyB,EACzB,wBAAwB,EACxB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACjI,YAAY,EAAE,oBAAoB,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAE9G,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,YAAY,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAExF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,YAAY,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
|
package/dist/client/index.js
CHANGED
|
@@ -18,9 +18,15 @@ export { WebSocketState } from "../adapters/websocket/client/index.js";
|
|
|
18
18
|
export { MockTransport, mockBuilder } from "../adapters/mock/client/index.js";
|
|
19
19
|
// Middleware
|
|
20
20
|
export { createRetryMiddleware } from "./middleware/retry.js";
|
|
21
|
-
|
|
22
|
-
export {
|
|
21
|
+
// The delivery of a failed try: it did not leave, or its outcome is indeterminate (roadmap R1)
|
|
22
|
+
export { DELIVERY_METADATA_KEY, deliveryOf, isNotSentError } from "./middleware/items.js";
|
|
23
|
+
export { createCacheMiddleware, invalidateCache } from "./middleware/cache.js";
|
|
23
24
|
export { createTimeoutMiddleware, createOverallTimeoutMiddleware, createCombinedTimeoutMiddleware, } from "./middleware/timeout.js";
|
|
25
|
+
// Typed durations (roadmap R11)
|
|
26
|
+
export { ms, seconds, minutes, hours, toMs, isDuration } from "../duration.js";
|
|
27
|
+
// The resilience preset and the deadline of a call (roadmap R10)
|
|
28
|
+
export { resilience } from "./middleware/resilience.js";
|
|
29
|
+
export { TIMEOUT_METADATA_KEY, DEADLINE_METADATA_KEY, deadlineOf, narrowDeadline, restoreDeadline, absorbTimeout, writeRemainingTime, } from "./deadline.js";
|
|
24
30
|
export { createPaginationMiddleware, paginateAll } from "./middleware/pagination.js";
|
|
25
31
|
export { createCircuitBreakerMiddleware, CircuitBreakerError } from "./middleware/circuit-breaker.js";
|
|
26
32
|
export { createRateLimitMiddleware, createPerServiceRateLimiter, RateLimitError } from "./middleware/rate-limit.js";
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc;AACd,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIrC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,yBAAyB,EACzB,wBAAwB,EACxB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAE3B,qBAAqB;AACrB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAGjI,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAGnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAE3E,gGAAgG;AAChG,6FAA6F;AAC7F,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAEvE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAQ9E,aAAa;AACb,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc;AACd,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIrC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,yBAAyB,EACzB,wBAAwB,EACxB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAE3B,qBAAqB;AACrB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAGjI,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAGnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAE3E,gGAAgG;AAChG,6FAA6F;AAC7F,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAEvE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAQ9E,aAAa;AACb,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,+FAA+F;AAC/F,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAI1F,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG/E,OAAO,EACL,uBAAuB,EACvB,8BAA8B,EAC9B,+BAA+B,GAChC,MAAM,yBAAyB,CAAC;AAEjC,gCAAgC;AAChC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE/E,iEAAiE;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,UAAU,EACV,cAAc,EACd,eAAe,EACf,aAAa,EACb,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAErF,OAAO,EAAE,8BAA8B,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAGtG,OAAO,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAGpH,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAGjC,4BAA4B;AAC5B,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAWvG,iBAAiB;AACjB,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAiBjF,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,eAAe;AACf,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -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
|
|
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?:
|
|
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
|
|
37
|
+
* Interval for emitting cache statistics.
|
|
36
38
|
* Only used if onStats is provided.
|
|
37
39
|
* @default 60000 (1 minute)
|
|
38
40
|
*/
|
|
39
|
-
statsInterval?:
|
|
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:
|
|
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;
|
|
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
|
|
37
|
-
*
|
|
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([
|
|
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
|
-
...(
|
|
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:
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;
|
|
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
|
|
29
|
-
* @default
|
|
31
|
+
* Time window for counting failures.
|
|
32
|
+
* @default 10 seconds
|
|
30
33
|
*/
|
|
31
|
-
failureWindow?:
|
|
34
|
+
failureWindow?: Duration;
|
|
32
35
|
/**
|
|
33
|
-
* Time to wait before attempting to close circuit
|
|
34
|
-
* @default
|
|
36
|
+
* Time to wait before attempting to close circuit.
|
|
37
|
+
* @default 30 seconds
|
|
35
38
|
*/
|
|
36
|
-
resetTimeout?:
|
|
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
|
-
*
|
|
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:
|
|
92
|
-
* resetTimeout:
|
|
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;
|
|
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"}
|