@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.
- package/CHANGELOG.md +94 -0
- package/README.md +77 -44
- 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 +54 -22
- 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 +67 -6
- 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/node.d.ts +30 -0
- package/dist/adapters/websocket/client/node.d.ts.map +1 -0
- package/dist/adapters/websocket/client/node.js +32 -0
- package/dist/adapters/websocket/client/node.js.map +1 -0
- 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 +229 -75
- package/dist/adapters/websocket/client/transport.js.map +1 -1
- package/dist/adapters/websocket/client/types.d.ts +71 -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/errors/http-errors.d.ts.map +1 -1
- package/dist/client/errors/http-errors.js +6 -0
- package/dist/client/errors/http-errors.js.map +1 -1
- package/dist/client/errors/index.d.ts +1 -1
- package/dist/client/errors/index.js +1 -1
- package/dist/client/errors/registry.d.ts +2 -1
- package/dist/client/errors/registry.d.ts.map +1 -1
- package/dist/client/errors/registry.js +72 -22
- package/dist/client/errors/registry.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 -7
- 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 +48 -46
- 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/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- 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/node.d.ts +11 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +10 -0
- package/dist/node.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 +7 -8
- 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 +1 -1
- package/dist/procedures/core/array.d.ts.map +1 -1
- package/dist/procedures/core/array.js +81 -29
- 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 +17 -2
- package/dist/procedures/core/index.js.map +1 -1
- package/dist/procedures/core/logic.js +1 -1
- package/dist/procedures/core/logic.js.map +1 -1
- package/dist/procedures/core/math.d.ts.map +1 -1
- package/dist/procedures/core/math.js +5 -1
- package/dist/procedures/core/math.js.map +1 -1
- package/dist/procedures/core/meta.d.ts.map +1 -1
- package/dist/procedures/core/meta.js +43 -8
- 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/core/type.d.ts.map +1 -1
- package/dist/procedures/core/type.js +4 -2
- package/dist/procedures/core/type.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 +57 -17
- package/dist/procedures/define-procedure.js.map +1 -1
- package/dist/procedures/discovery.d.ts +4 -6
- package/dist/procedures/discovery.d.ts.map +1 -1
- package/dist/procedures/discovery.js +4 -6
- package/dist/procedures/discovery.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/ref.d.ts +4 -2
- package/dist/procedures/ref.d.ts.map +1 -1
- package/dist/procedures/ref.js +2 -1
- package/dist/procedures/ref.js.map +1 -1
- 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 +16 -0
- package/dist/procedures/types.d.ts.map +1 -1
- package/dist/procedures/types.js.map +1 -1
- package/dist/protocol.d.ts +47 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +68 -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 +112 -5
- package/dist/server/procedure-server.d.ts.map +1 -1
- package/dist/server/procedure-server.js +273 -19
- 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 +11 -4
- 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 +61 -26
- package/src/adapters/http/shared/headers.ts +7 -6
- package/src/adapters/local/client/transport.ts +74 -7
- 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/node.ts +34 -0
- package/src/adapters/websocket/client/transport.ts +251 -81
- package/src/adapters/websocket/client/types.ts +81 -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/README.md +2 -0
- package/src/client/errors/factory.ts +12 -8
- package/src/client/errors/http-errors.ts +5 -0
- package/src/client/errors/index.ts +1 -1
- package/src/client/errors/registry.ts +79 -22
- 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 -9
- package/src/client/middleware/resilience.ts +81 -0
- package/src/client/middleware/retry.ts +146 -34
- package/src/client/middleware/timeout.ts +57 -55
- 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/index.ts +4 -0
- package/src/machines.ts +186 -0
- package/src/node.ts +11 -0
- package/src/procedures/capability.ts +7 -8
- 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 +79 -31
- package/src/procedures/core/index.ts +17 -2
- package/src/procedures/core/logic.ts +1 -1
- package/src/procedures/core/math.ts +5 -1
- package/src/procedures/core/meta.ts +45 -8
- 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/core/type.ts +4 -2
- package/src/procedures/define-procedure.ts +73 -20
- package/src/procedures/discovery.ts +4 -6
- 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/ref.ts +4 -2
- package/src/procedures/runtime-programs.ts +27 -0
- package/src/procedures/types.ts +16 -0
- package/src/protocol.ts +108 -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 +328 -12
- 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
- package/dist/procedures/cli/announce.d.ts +0 -67
- package/dist/procedures/cli/announce.d.ts.map +0 -1
- package/dist/procedures/cli/announce.js +0 -392
- package/dist/procedures/cli/announce.js.map +0 -1
- package/dist/procedures/cli/discover.d.ts +0 -66
- package/dist/procedures/cli/discover.d.ts.map +0 -1
- package/dist/procedures/cli/discover.js +0 -310
- package/dist/procedures/cli/discover.js.map +0 -1
- package/dist/procedures/cli/index.d.ts +0 -13
- package/dist/procedures/cli/index.d.ts.map +0 -1
- package/dist/procedures/cli/index.js +0 -203
- package/dist/procedures/cli/index.js.map +0 -1
- package/dist/procedures/cli/init.d.ts +0 -17
- package/dist/procedures/cli/init.d.ts.map +0 -1
- package/dist/procedures/cli/init.js +0 -336
- package/dist/procedures/cli/init.js.map +0 -1
- package/src/procedures/cli/announce.ts +0 -470
- package/src/procedures/cli/discover.ts +0 -390
- package/src/procedures/cli/index.ts +0 -231
- package/src/procedures/cli/init.ts +0 -370
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contexts.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/contexts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"contexts.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/contexts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contexts.js","sourceRoot":"","sources":["../../../src/client/middleware/contexts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"contexts.js","sourceRoot":"","sources":["../../../src/client/middleware/contexts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AA4OH,gFAAgF;AAChF,sBAAsB;AACtB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,OAAO,IAAI,GAAG;QACd,OAAQ,GAAoB,CAAC,KAAK,KAAK,QAAQ,CAChD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,OAAO,IAAI,GAAG;QACd,OAAQ,GAAoB,CAAC,KAAK,KAAK,QAAQ,CAChD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,MAAM,IAAI,GAAG;QACb,OAAQ,GAAmB,CAAC,IAAI,KAAK,QAAQ,CAC9C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,SAAS,IAAI,GAAG;QAChB,OAAQ,GAAsB,CAAC,OAAO,KAAK,QAAQ,CACpD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAY;IACnD,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,gBAAgB,IAAI,GAAG;QACvB,OAAQ,GAA6B,CAAC,cAAc,KAAK,QAAQ,CAClE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,WAAW,IAAI,GAAG;QAClB,OAAQ,GAAwB,CAAC,SAAS,KAAK,QAAQ,CACxD,CAAC;AACJ,CAAC"}
|
|
@@ -7,26 +7,55 @@
|
|
|
7
7
|
* thrown error that the transports never threw).
|
|
8
8
|
*/
|
|
9
9
|
import type { ResponseItem } from "../types.js";
|
|
10
|
+
import { type Clock } from "../../clock.js";
|
|
10
11
|
/** This function makes an error item. */
|
|
11
12
|
export declare function errorItem<TRes>(id: string, code: string, message: string, retryable: boolean): ResponseItem<TRes>;
|
|
12
13
|
/** The error item of a request that its caller aborted. A retry does not repeat it. */
|
|
13
14
|
export declare function abortedItem<TRes>(id: string): ResponseItem<TRes>;
|
|
15
|
+
/**
|
|
16
|
+
* What a failed try tells about its request, in the metadata of the error item (`delivery`).
|
|
17
|
+
* - `not-sent`: the request did not leave the client. A retry is safe.
|
|
18
|
+
* - `indeterminate`: the request left, and no answer came. The server can have run it, so only
|
|
19
|
+
* an idempotent call can go again (the three outcomes of `@mark1russell7/service`).
|
|
20
|
+
* An error item without the field is an answer of the server: its `retryable` flag decides.
|
|
21
|
+
*/
|
|
22
|
+
export type Delivery = "not-sent" | "indeterminate";
|
|
23
|
+
/** The metadata key of the delivery of a failed try. */
|
|
24
|
+
export declare const DELIVERY_METADATA_KEY = "delivery";
|
|
25
|
+
/** This function marks an error item with the delivery of its request. */
|
|
26
|
+
export declare function withDelivery<TRes>(item: ResponseItem<TRes>, delivery: Delivery): ResponseItem<TRes>;
|
|
27
|
+
/** The metadata key of the time that the server asks a client to wait before a retry, in milliseconds. */
|
|
28
|
+
export declare const RETRY_AFTER_METADATA_KEY = "retry-after";
|
|
29
|
+
/** The time that an error item asks a client to wait before a retry, in milliseconds, or undefined. */
|
|
30
|
+
export declare function retryAfterOf(item: ResponseItem<unknown>): number | undefined;
|
|
31
|
+
/** True when an error says that the service is not available (see AVAILABILITY_CODES). */
|
|
32
|
+
export declare function isAvailabilityFailure(error: unknown): boolean;
|
|
33
|
+
/** The time of a monotonic clock in milliseconds: a change of the wall clock does not move it. */
|
|
34
|
+
export declare function monotonicNow(): number;
|
|
35
|
+
/** The delivery of a failed try, or undefined for an answer of the server. */
|
|
36
|
+
export declare function deliveryOf(item: ResponseItem<unknown>): Delivery | undefined;
|
|
14
37
|
/**
|
|
15
38
|
* This function tells if a thrown error is a network failure: the connection failed or broke.
|
|
16
39
|
* A retry can repair a network failure. A validation error, an open circuit breaker or a rate
|
|
17
40
|
* limit cannot be repaired by a retry (deep dive TRN-8).
|
|
18
41
|
*/
|
|
19
42
|
export declare function isNetworkError(error: unknown): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* This function tells if a thrown error proves that the request did not leave the client: the
|
|
45
|
+
* connection was refused, the name did not resolve, or the WebSocket did not open in time.
|
|
46
|
+
* A reset or a close during the request does not prove it (the request can have arrived).
|
|
47
|
+
*/
|
|
48
|
+
export declare function isNotSentError(error: unknown): boolean;
|
|
20
49
|
/**
|
|
21
50
|
* The item that stands for a thrown error, so that `shouldRetry` can decide about it. It is
|
|
22
|
-
* retryable only when the error is a network failure.
|
|
51
|
+
* retryable only when the error is a network failure. Its delivery tells if the request left.
|
|
23
52
|
*/
|
|
24
53
|
export declare function thrownItem<TRes>(id: string, error: unknown): ResponseItem<TRes>;
|
|
25
54
|
/**
|
|
26
55
|
* This function waits `ms` milliseconds. It returns false at once when the signal aborts (deep
|
|
27
56
|
* dive TRN-8: before, the backoff of the retry middleware ignored the signal).
|
|
28
57
|
*/
|
|
29
|
-
export declare function sleep(ms: number, signal?: AbortSignal): Promise<boolean>;
|
|
58
|
+
export declare function sleep(ms: number, signal?: AbortSignal, clock?: Clock): Promise<boolean>;
|
|
30
59
|
/** The value that `nextOrAbort` gives when the signal aborts first. */
|
|
31
60
|
export declare const ABORTED_FIRST: unique symbol;
|
|
32
61
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"items.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/items.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"items.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/items.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAa,KAAK,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvD,yCAAyC;AACzC,wBAAgB,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAEjH;AAED,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAEhE;AAED;;;;;;GAMG;AACH,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,eAAe,CAAC;AAEpD,wDAAwD;AACxD,eAAO,MAAM,qBAAqB,aAAa,CAAC;AAEhD,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAEnG;AAED,0GAA0G;AAC1G,eAAO,MAAM,wBAAwB,gBAAgB,CAAC;AAEtD,uGAAuG;AACvG,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAG5E;AAuBD,0FAA0F;AAC1F,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAI7D;AAED,kGAAkG;AAClG,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,QAAQ,GAAG,SAAS,CAG5E;AAkBD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAUtD;AAaD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQtD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAS/E;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,KAAK,GAAE,KAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAclG;AAED,uEAAuE;AACvE,eAAO,MAAM,aAAa,EAAE,OAAO,MAAgC,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,aAAa,CAAC,CAgBnD"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* it when `throwOnError` is on (deep dive TRN-7: before, the timeout middleware waited for a
|
|
7
7
|
* thrown error that the transports never threw).
|
|
8
8
|
*/
|
|
9
|
+
import { realClock } from "../../clock.js";
|
|
9
10
|
/** This function makes an error item. */
|
|
10
11
|
export function errorItem(id, code, message, retryable) {
|
|
11
12
|
return { id, status: { type: "error", code, message, retryable }, payload: null, metadata: {} };
|
|
@@ -14,6 +15,56 @@ export function errorItem(id, code, message, retryable) {
|
|
|
14
15
|
export function abortedItem(id) {
|
|
15
16
|
return errorItem(id, "ABORTED", "Request was aborted", false);
|
|
16
17
|
}
|
|
18
|
+
/** The metadata key of the delivery of a failed try. */
|
|
19
|
+
export const DELIVERY_METADATA_KEY = "delivery";
|
|
20
|
+
/** This function marks an error item with the delivery of its request. */
|
|
21
|
+
export function withDelivery(item, delivery) {
|
|
22
|
+
return { ...item, metadata: { ...item.metadata, [DELIVERY_METADATA_KEY]: delivery } };
|
|
23
|
+
}
|
|
24
|
+
/** The metadata key of the time that the server asks a client to wait before a retry, in milliseconds. */
|
|
25
|
+
export const RETRY_AFTER_METADATA_KEY = "retry-after";
|
|
26
|
+
/** The time that an error item asks a client to wait before a retry, in milliseconds, or undefined. */
|
|
27
|
+
export function retryAfterOf(item) {
|
|
28
|
+
const value = item.metadata?.[RETRY_AFTER_METADATA_KEY];
|
|
29
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : undefined;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The error codes that say that the service is not available: the server is down, busy, slow or
|
|
33
|
+
* stopping, or the network failed. A circuit breaker counts only these (roadmap R12). An abort,
|
|
34
|
+
* a validation error, a refusal or an error of the handler says nothing about the health of the
|
|
35
|
+
* service.
|
|
36
|
+
*/
|
|
37
|
+
const AVAILABILITY_CODES = new Set([
|
|
38
|
+
"UNAVAILABLE",
|
|
39
|
+
"TIMEOUT",
|
|
40
|
+
"SERVER_STOPPED",
|
|
41
|
+
"SERVICE_UNAVAILABLE",
|
|
42
|
+
"BAD_GATEWAY",
|
|
43
|
+
"GATEWAY_TIMEOUT",
|
|
44
|
+
"NETWORK_ERROR",
|
|
45
|
+
"CONNECTION_REFUSED",
|
|
46
|
+
"STREAM_ENDED",
|
|
47
|
+
// The connection to the other side closed before the call left (roadmap R30: before, the list
|
|
48
|
+
// did not have this code of R24)
|
|
49
|
+
"CONNECTION_CLOSED",
|
|
50
|
+
]);
|
|
51
|
+
/** True when an error says that the service is not available (see AVAILABILITY_CODES). */
|
|
52
|
+
export function isAvailabilityFailure(error) {
|
|
53
|
+
const code = error?.code;
|
|
54
|
+
if (typeof code === "string" && AVAILABILITY_CODES.has(code))
|
|
55
|
+
return true;
|
|
56
|
+
return isNetworkError(error);
|
|
57
|
+
}
|
|
58
|
+
/** The time of a monotonic clock in milliseconds: a change of the wall clock does not move it. */
|
|
59
|
+
export function monotonicNow() {
|
|
60
|
+
const performance = globalThis.performance;
|
|
61
|
+
return performance ? performance.now() : Date.now();
|
|
62
|
+
}
|
|
63
|
+
/** The delivery of a failed try, or undefined for an answer of the server. */
|
|
64
|
+
export function deliveryOf(item) {
|
|
65
|
+
const delivery = item.metadata?.[DELIVERY_METADATA_KEY];
|
|
66
|
+
return delivery === "not-sent" || delivery === "indeterminate" ? delivery : undefined;
|
|
67
|
+
}
|
|
17
68
|
const NETWORK_CODES = new Set([
|
|
18
69
|
"ECONNREFUSED",
|
|
19
70
|
"ECONNRESET",
|
|
@@ -49,30 +100,59 @@ export function isNetworkError(error) {
|
|
|
49
100
|
// The WebSocket transport fails the requests of a connection that closed or never opened
|
|
50
101
|
return /WebSocket (connection closed|disconnected)|Connection timeout/.test(error.message);
|
|
51
102
|
}
|
|
103
|
+
/** The network codes that tell that the connection never opened, so no request left. */
|
|
104
|
+
const NOT_SENT_CODES = new Set([
|
|
105
|
+
"ECONNREFUSED",
|
|
106
|
+
"ENETUNREACH",
|
|
107
|
+
"EHOSTUNREACH",
|
|
108
|
+
"ENOTFOUND",
|
|
109
|
+
"EAI_AGAIN",
|
|
110
|
+
"UND_ERR_CONNECT_TIMEOUT",
|
|
111
|
+
"CONNECTION_REFUSED",
|
|
112
|
+
]);
|
|
113
|
+
/**
|
|
114
|
+
* This function tells if a thrown error proves that the request did not leave the client: the
|
|
115
|
+
* connection was refused, the name did not resolve, or the WebSocket did not open in time.
|
|
116
|
+
* A reset or a close during the request does not prove it (the request can have arrived).
|
|
117
|
+
*/
|
|
118
|
+
export function isNotSentError(error) {
|
|
119
|
+
if (!(error instanceof Error))
|
|
120
|
+
return false;
|
|
121
|
+
const code = error.code;
|
|
122
|
+
if (typeof code === "string" && NOT_SENT_CODES.has(code))
|
|
123
|
+
return true;
|
|
124
|
+
const cause = error.cause;
|
|
125
|
+
if (cause !== undefined && cause !== error && isNotSentError(cause))
|
|
126
|
+
return true;
|
|
127
|
+
// The WebSocket transport fails a request that waited for a connection that did not come
|
|
128
|
+
return /^(WebSocket disconnected|Connection timeout)$/.test(error.message);
|
|
129
|
+
}
|
|
52
130
|
/**
|
|
53
131
|
* The item that stands for a thrown error, so that `shouldRetry` can decide about it. It is
|
|
54
|
-
* retryable only when the error is a network failure.
|
|
132
|
+
* retryable only when the error is a network failure. Its delivery tells if the request left.
|
|
55
133
|
*/
|
|
56
134
|
export function thrownItem(id, error) {
|
|
57
135
|
const code = error?.code;
|
|
58
|
-
|
|
136
|
+
const item = errorItem(id, typeof code === "string" ? code : "THROWN", error instanceof Error ? error.message : String(error), isNetworkError(error));
|
|
137
|
+
return withDelivery(item, isNotSentError(error) ? "not-sent" : "indeterminate");
|
|
59
138
|
}
|
|
60
139
|
/**
|
|
61
140
|
* This function waits `ms` milliseconds. It returns false at once when the signal aborts (deep
|
|
62
141
|
* dive TRN-8: before, the backoff of the retry middleware ignored the signal).
|
|
63
142
|
*/
|
|
64
|
-
export function sleep(ms, signal) {
|
|
143
|
+
export function sleep(ms, signal, clock = realClock) {
|
|
65
144
|
if (signal?.aborted)
|
|
66
145
|
return Promise.resolve(false);
|
|
67
146
|
return new Promise((resolve) => {
|
|
68
147
|
const onAbort = () => {
|
|
69
|
-
|
|
148
|
+
cancel();
|
|
70
149
|
resolve(false);
|
|
71
150
|
};
|
|
72
|
-
|
|
151
|
+
// The clock of the caller (roadmap R35): a test gives a fake clock
|
|
152
|
+
const cancel = clock.after(Math.max(0, ms), () => {
|
|
73
153
|
signal?.removeEventListener("abort", onAbort);
|
|
74
154
|
resolve(true);
|
|
75
|
-
}
|
|
155
|
+
});
|
|
76
156
|
signal?.addEventListener("abort", onAbort, { once: true });
|
|
77
157
|
});
|
|
78
158
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"items.js","sourceRoot":"","sources":["../../../src/client/middleware/items.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"items.js","sourceRoot":"","sources":["../../../src/client/middleware/items.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,5 +28,7 @@ export declare class LruMap<K, V> {
|
|
|
28
28
|
delete(key: K): boolean;
|
|
29
29
|
/** Delete every key. */
|
|
30
30
|
clear(): void;
|
|
31
|
+
/** Delete each key whose value matches. This does not count as a use. The number deleted. */
|
|
32
|
+
deleteWhere(matches: (value: V, key: K) => boolean): number;
|
|
31
33
|
}
|
|
32
34
|
//# sourceMappingURL=lru.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lru.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/lru.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,qBAAa,MAAM,CAAC,CAAC,EAAE,CAAC;IAQpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAR3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAE3C;;;OAGG;IACH,YACmB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,GAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,aAAA,EAKtD;IAED,0BAA0B;IAC1B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,mEAAmE;IACnE,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAEnB;IAED,2FAA2F;IAC3F,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAMzB;IAED,qGAAqG;IACrG,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAS1B;IAED,0CAA0C;IAC1C,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAEtB;IAED,wBAAwB;IACxB,KAAK,IAAI,IAAI,CAEZ;CACF"}
|
|
1
|
+
{"version":3,"file":"lru.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/lru.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,qBAAa,MAAM,CAAC,CAAC,EAAE,CAAC;IAQpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAR3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAE3C;;;OAGG;IACH,YACmB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,GAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,aAAA,EAKtD;IAED,0BAA0B;IAC1B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,mEAAmE;IACnE,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAEnB;IAED,2FAA2F;IAC3F,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAMzB;IAED,qGAAqG;IACrG,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAS1B;IAED,0CAA0C;IAC1C,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAEtB;IAED,wBAAwB;IACxB,KAAK,IAAI,IAAI,CAEZ;IAED,6FAA6F;IAC7F,WAAW,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,MAAM,CAS1D;CACF"}
|
|
@@ -58,5 +58,16 @@ export class LruMap {
|
|
|
58
58
|
clear() {
|
|
59
59
|
this.entries.clear();
|
|
60
60
|
}
|
|
61
|
+
/** Delete each key whose value matches. This does not count as a use. The number deleted. */
|
|
62
|
+
deleteWhere(matches) {
|
|
63
|
+
let deleted = 0;
|
|
64
|
+
for (const [key, value] of this.entries) {
|
|
65
|
+
if (matches(value, key)) {
|
|
66
|
+
this.entries.delete(key);
|
|
67
|
+
deleted++;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return deleted;
|
|
71
|
+
}
|
|
61
72
|
}
|
|
62
73
|
//# sourceMappingURL=lru.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lru.js","sourceRoot":"","sources":["../../../src/client/middleware/lru.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,OAAO,MAAM;IAQE,QAAQ;IACR,OAAO;IART,OAAO,GAAG,IAAI,GAAG,EAAQ,CAAC;IAE3C;;;OAGG;IACH,YACmB,QAAgB,EAChB,OAAoC;wBADpC,QAAQ;uBACR,OAAO;QAExB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,UAAU,CAAC,mEAAmE,QAAQ,EAAE,CAAC,CAAC;QACtG,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,mEAAmE;IACnE,GAAG,CAAC,GAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,2FAA2F;IAC3F,GAAG,CAAC,GAAM;QACR,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAM,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,qGAAqG;IACrG,GAAG,CAAC,GAAM,EAAE,KAAQ;QAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAU,CAAC;YACrD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAM,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,MAAM,CAAC,GAAM;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,wBAAwB;IACxB,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"lru.js","sourceRoot":"","sources":["../../../src/client/middleware/lru.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,OAAO,MAAM;IAQE,QAAQ;IACR,OAAO;IART,OAAO,GAAG,IAAI,GAAG,EAAQ,CAAC;IAE3C;;;OAGG;IACH,YACmB,QAAgB,EAChB,OAAoC;wBADpC,QAAQ;uBACR,OAAO;QAExB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,UAAU,CAAC,mEAAmE,QAAQ,EAAE,CAAC,CAAC;QACtG,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,mEAAmE;IACnE,GAAG,CAAC,GAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,2FAA2F;IAC3F,GAAG,CAAC,GAAM;QACR,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAM,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,qGAAqG;IACrG,GAAG,CAAC,GAAM,EAAE,KAAQ;QAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAU,CAAC;YACrD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAM,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,MAAM,CAAC,GAAM;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,wBAAwB;IACxB,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,6FAA6F;IAC7F,WAAW,CAAC,OAAsC;QAChD,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxC,IAAI,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACzB,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import type { ClientMiddleware, TypedClientMiddleware } from "../types.js";
|
|
10
10
|
import type { RateLimitContext } from "./contexts.js";
|
|
11
|
+
import { type Duration } from "../../duration.js";
|
|
11
12
|
/**
|
|
12
13
|
* Rate limiting options.
|
|
13
14
|
*/
|
|
@@ -21,7 +22,7 @@ export interface RateLimitOptions {
|
|
|
21
22
|
* Time window in milliseconds.
|
|
22
23
|
* @default 60000 (1 minute)
|
|
23
24
|
*/
|
|
24
|
-
window?:
|
|
25
|
+
window?: Duration;
|
|
25
26
|
/**
|
|
26
27
|
* Behavior when rate limit is exceeded.
|
|
27
28
|
* - "reject": Throw error immediately
|
|
@@ -71,14 +72,14 @@ export declare class RateLimitError extends Error {
|
|
|
71
72
|
* // Reject strategy (default)
|
|
72
73
|
* client.use(createRateLimitMiddleware({
|
|
73
74
|
* maxRequests: 100, // 100 requests
|
|
74
|
-
* window:
|
|
75
|
+
* window: minutes(1),
|
|
75
76
|
* strategy: "reject" // Throw error when exceeded
|
|
76
77
|
* }));
|
|
77
78
|
*
|
|
78
79
|
* // Queue strategy
|
|
79
80
|
* client.use(createRateLimitMiddleware({
|
|
80
81
|
* maxRequests: 10,
|
|
81
|
-
* window:
|
|
82
|
+
* window: seconds(1),
|
|
82
83
|
* strategy: "queue", // Queue requests when exceeded
|
|
83
84
|
* maxQueueSize: 50
|
|
84
85
|
* }));
|
|
@@ -93,9 +94,9 @@ export declare function createRateLimitMiddleware(options?: RateLimitOptions): T
|
|
|
93
94
|
* @example
|
|
94
95
|
* ```typescript
|
|
95
96
|
* client.use(createPerServiceRateLimiter({
|
|
96
|
-
* users: { maxRequests: 100, window:
|
|
97
|
-
* orders: { maxRequests: 50, window:
|
|
98
|
-
* default: { maxRequests: 200, window:
|
|
97
|
+
* users: { maxRequests: 100, window: minutes(1) },
|
|
98
|
+
* orders: { maxRequests: 50, window: minutes(1) },
|
|
99
|
+
* default: { maxRequests: 200, window: minutes(1) }
|
|
99
100
|
* }));
|
|
100
101
|
* ```
|
|
101
102
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAA+B,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACxG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAA+B,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACxG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG9D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC;IAElB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAE9B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;CACvD;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,KAAK;aAGrB,KAAK,EAAE,cAAc;IAFvC,YACE,OAAO,EAAE,MAAM,EACC,KAAK,EAAE,cAAc,EAItC;CACF;AAUD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,gBAAqB,GAC7B,qBAAqB,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAuJ7C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,gBAAgB,CAAA;CAAE,GACxE,gBAAgB,CA+BlB"}
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
* Works with both client and server!
|
|
8
8
|
*/
|
|
9
9
|
import { abortedItem } from "./items.js";
|
|
10
|
+
import { optionalMs } from "../../duration.js";
|
|
11
|
+
import { TIMER_DEFAULTS } from "../../timers.js";
|
|
10
12
|
/**
|
|
11
13
|
* Rate limit error thrown when limit exceeded.
|
|
12
14
|
*/
|
|
@@ -29,21 +31,22 @@ export class RateLimitError extends Error {
|
|
|
29
31
|
* // Reject strategy (default)
|
|
30
32
|
* client.use(createRateLimitMiddleware({
|
|
31
33
|
* maxRequests: 100, // 100 requests
|
|
32
|
-
* window:
|
|
34
|
+
* window: minutes(1),
|
|
33
35
|
* strategy: "reject" // Throw error when exceeded
|
|
34
36
|
* }));
|
|
35
37
|
*
|
|
36
38
|
* // Queue strategy
|
|
37
39
|
* client.use(createRateLimitMiddleware({
|
|
38
40
|
* maxRequests: 10,
|
|
39
|
-
* window:
|
|
41
|
+
* window: seconds(1),
|
|
40
42
|
* strategy: "queue", // Queue requests when exceeded
|
|
41
43
|
* maxQueueSize: 50
|
|
42
44
|
* }));
|
|
43
45
|
* ```
|
|
44
46
|
*/
|
|
45
47
|
export function createRateLimitMiddleware(options = {}) {
|
|
46
|
-
const { maxRequests = 100,
|
|
48
|
+
const { maxRequests = 100, strategy = "reject", maxQueueSize = 100, message = "Rate limit exceeded", onRateLimitExceeded, } = options;
|
|
49
|
+
const window = optionalMs(options.window, "window") ?? TIMER_DEFAULTS.rateLimit.windowMs;
|
|
47
50
|
// Token bucket state
|
|
48
51
|
let tokens = maxRequests;
|
|
49
52
|
let lastRefill = Date.now();
|
|
@@ -120,7 +123,6 @@ export function createRateLimitMiddleware(options = {}) {
|
|
|
120
123
|
signal?.removeEventListener("abort", onAbort);
|
|
121
124
|
resolve(true);
|
|
122
125
|
},
|
|
123
|
-
reject: () => resolve(false),
|
|
124
126
|
timestamp: Date.now(),
|
|
125
127
|
};
|
|
126
128
|
// A queued request whose caller aborts leaves the queue (before, it kept its place)
|
|
@@ -185,9 +187,9 @@ export function createRateLimitMiddleware(options = {}) {
|
|
|
185
187
|
* @example
|
|
186
188
|
* ```typescript
|
|
187
189
|
* client.use(createPerServiceRateLimiter({
|
|
188
|
-
* users: { maxRequests: 100, window:
|
|
189
|
-
* orders: { maxRequests: 50, window:
|
|
190
|
-
* default: { maxRequests: 200, window:
|
|
190
|
+
* users: { maxRequests: 100, window: minutes(1) },
|
|
191
|
+
* orders: { maxRequests: 50, window: minutes(1) },
|
|
192
|
+
* default: { maxRequests: 200, window: minutes(1) }
|
|
191
193
|
* }));
|
|
192
194
|
* ```
|
|
193
195
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../src/client/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../src/client/middleware/rate-limit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The resilience preset (roadmap R10): the timeouts, the cache, the retry, the circuit breaker and
|
|
3
|
+
* the rate limit of a client, in the one order that works.
|
|
4
|
+
*
|
|
5
|
+
* The first layer is the outermost one:
|
|
6
|
+
*
|
|
7
|
+
* 1. The overall timeout: it covers the whole call, retries included.
|
|
8
|
+
* 2. The cache: a hit makes no request, so no try and no slot of the rate limit.
|
|
9
|
+
* 3. The retry: it starts each try.
|
|
10
|
+
* 4. The circuit breaker: it counts each try, and an open breaker stops a retry loop.
|
|
11
|
+
* 5. The rate limit: each try takes a slot.
|
|
12
|
+
* 6. The timeout of one try: inside the retry, so the retry can start the next try.
|
|
13
|
+
*
|
|
14
|
+
* Each order pitfall of a hand-made stack is impossible here: an overall timeout inside the
|
|
15
|
+
* retry, a per-try timeout outside it, or a rate limit outside the retry. The deadline of the
|
|
16
|
+
* call goes to the server as `procedure-timeout` with each try (`client/deadline.ts`).
|
|
17
|
+
*/
|
|
18
|
+
import type { TypedClientMiddleware } from "../types.js";
|
|
19
|
+
import type { CacheContext, CircuitBreakerContext, RateLimitContext, RetryContext, TimeoutContext } from "./contexts.js";
|
|
20
|
+
import { type CacheOptions } from "./cache.js";
|
|
21
|
+
import { type CircuitBreakerOptions } from "./circuit-breaker.js";
|
|
22
|
+
import { type RateLimitOptions } from "./rate-limit.js";
|
|
23
|
+
import { type RetryOptions } from "./retry.js";
|
|
24
|
+
import type { Duration } from "../../duration.js";
|
|
25
|
+
/** The parts of the preset. An absent part is not in the stack. */
|
|
26
|
+
export interface ResilienceOptions {
|
|
27
|
+
/** The time of the whole call, retries included. */
|
|
28
|
+
overall?: Duration | undefined;
|
|
29
|
+
/** The time of one try. It is at most the remaining time of the call. */
|
|
30
|
+
perAttempt?: Duration | undefined;
|
|
31
|
+
/** The retry. Its `idempotent` option decides which calls go again after an indeterminate try. */
|
|
32
|
+
retry?: RetryOptions | undefined;
|
|
33
|
+
/** The circuit breaker. */
|
|
34
|
+
breaker?: CircuitBreakerOptions | undefined;
|
|
35
|
+
/** The cache of the reads that opt in. */
|
|
36
|
+
cache?: CacheOptions | undefined;
|
|
37
|
+
/** The rate limit of the tries. */
|
|
38
|
+
rateLimit?: RateLimitOptions | undefined;
|
|
39
|
+
/** The message of a timeout error. */
|
|
40
|
+
message?: string | undefined;
|
|
41
|
+
}
|
|
42
|
+
/** The context that the preset gives: the context of each part that it can have. */
|
|
43
|
+
export type ResilienceContext = TimeoutContext & Partial<RetryContext & CacheContext & CircuitBreakerContext & RateLimitContext>;
|
|
44
|
+
/**
|
|
45
|
+
* This function gives one middleware with the parts of `options` in the correct order (see the
|
|
46
|
+
* file comment). Add it with one `use()`.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* const client = new Client(transport).use(
|
|
51
|
+
* resilience({
|
|
52
|
+
* overall: seconds(10),
|
|
53
|
+
* perAttempt: seconds(3),
|
|
54
|
+
* retry: { maxRetries: 2, idempotent: idempotentIn(registry) },
|
|
55
|
+
* breaker: { failureThreshold: 5 },
|
|
56
|
+
* }),
|
|
57
|
+
* );
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare function resilience(options: ResilienceOptions): TypedClientMiddleware<ResilienceContext, {}>;
|
|
61
|
+
//# sourceMappingURL=resilience.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resilience.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/resilience.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAkC,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACzH,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAkC,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClG,OAAO,EAA6B,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnF,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEtE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,mEAAmE;AACnE,MAAM,WAAW,iBAAiB;IAChC,oDAAoD;IACpD,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC/B,yEAAyE;IACzE,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAClC,kGAAkG;IAClG,KAAK,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACjC,2BAA2B;IAC3B,OAAO,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC5C,0CAA0C;IAC1C,KAAK,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACjC,mCAAmC;IACnC,SAAS,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACzC,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,oFAAoF;AACpF,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG,OAAO,CAAC,YAAY,GAAG,YAAY,GAAG,qBAAqB,GAAG,gBAAgB,CAAC,CAAC;AAEjI;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,qBAAqB,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAgBnG"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The resilience preset (roadmap R10): the timeouts, the cache, the retry, the circuit breaker and
|
|
3
|
+
* the rate limit of a client, in the one order that works.
|
|
4
|
+
*
|
|
5
|
+
* The first layer is the outermost one:
|
|
6
|
+
*
|
|
7
|
+
* 1. The overall timeout: it covers the whole call, retries included.
|
|
8
|
+
* 2. The cache: a hit makes no request, so no try and no slot of the rate limit.
|
|
9
|
+
* 3. The retry: it starts each try.
|
|
10
|
+
* 4. The circuit breaker: it counts each try, and an open breaker stops a retry loop.
|
|
11
|
+
* 5. The rate limit: each try takes a slot.
|
|
12
|
+
* 6. The timeout of one try: inside the retry, so the retry can start the next try.
|
|
13
|
+
*
|
|
14
|
+
* Each order pitfall of a hand-made stack is impossible here: an overall timeout inside the
|
|
15
|
+
* retry, a per-try timeout outside it, or a rate limit outside the retry. The deadline of the
|
|
16
|
+
* call goes to the server as `procedure-timeout` with each try (`client/deadline.ts`).
|
|
17
|
+
*/
|
|
18
|
+
import { createCacheMiddleware } from "./cache.js";
|
|
19
|
+
import { createCircuitBreakerMiddleware } from "./circuit-breaker.js";
|
|
20
|
+
import { createRateLimitMiddleware } from "./rate-limit.js";
|
|
21
|
+
import { createRetryMiddleware } from "./retry.js";
|
|
22
|
+
import { createOverallTimeoutMiddleware, createTimeoutMiddleware } from "./timeout.js";
|
|
23
|
+
/**
|
|
24
|
+
* This function gives one middleware with the parts of `options` in the correct order (see the
|
|
25
|
+
* file comment). Add it with one `use()`.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const client = new Client(transport).use(
|
|
30
|
+
* resilience({
|
|
31
|
+
* overall: seconds(10),
|
|
32
|
+
* perAttempt: seconds(3),
|
|
33
|
+
* retry: { maxRetries: 2, idempotent: idempotentIn(registry) },
|
|
34
|
+
* breaker: { failureThreshold: 5 },
|
|
35
|
+
* }),
|
|
36
|
+
* );
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export function resilience(options) {
|
|
40
|
+
const layers = [];
|
|
41
|
+
const message = options.message;
|
|
42
|
+
if (options.overall) {
|
|
43
|
+
layers.push(createOverallTimeoutMiddleware({ overall: options.overall, ...(message ? { message: `${message} (overall)` } : {}) }));
|
|
44
|
+
}
|
|
45
|
+
if (options.cache)
|
|
46
|
+
layers.push(createCacheMiddleware(options.cache));
|
|
47
|
+
if (options.retry)
|
|
48
|
+
layers.push(createRetryMiddleware(options.retry));
|
|
49
|
+
if (options.breaker)
|
|
50
|
+
layers.push(createCircuitBreakerMiddleware(options.breaker));
|
|
51
|
+
if (options.rateLimit)
|
|
52
|
+
layers.push(createRateLimitMiddleware(options.rateLimit));
|
|
53
|
+
if (options.perAttempt) {
|
|
54
|
+
layers.push(createTimeoutMiddleware({ perAttempt: options.perAttempt, ...(message ? { message: `${message} (per-attempt)` } : {}) }));
|
|
55
|
+
}
|
|
56
|
+
const composed = (next) => layers.reduceRight((inner, layer) => layer(inner), next);
|
|
57
|
+
return composed;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=resilience.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resilience.js","sourceRoot":"","sources":["../../../src/client/middleware/resilience.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EAAE,qBAAqB,EAAqB,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,8BAA8B,EAA8B,MAAM,sBAAsB,CAAC;AAClG,OAAO,EAAE,yBAAyB,EAAyB,MAAM,iBAAiB,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAqB,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,8BAA8B,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAwBvF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,UAAU,CAAC,OAA0B;IACnD,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAqB,CAAC,CAAC;IACzJ,CAAC;IACD,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,KAAK,CAAqB,CAAC,CAAC;IACzF,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,KAAK,CAAqB,CAAC,CAAC;IACzF,IAAI,OAAO,CAAC,OAAO;QAAE,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,OAAO,CAAC,OAAO,CAAqB,CAAC,CAAC;IACtG,IAAI,OAAO,CAAC,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,SAAS,CAAqB,CAAC,CAAC;IACrG,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAqB,CAAC,CAAC;IAC5J,CAAC;IACD,MAAM,QAAQ,GAAG,CAAa,IAA8B,EAA4B,EAAE,CACxF,MAAM,CAAC,WAAW,CAA2B,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAE,KAAsC,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IACvH,OAAO,QAAwD,CAAC;AAClE,CAAC"}
|