@procedures/client 0.0.0-stage → 0.2.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 +42 -0
- package/LICENSE +21 -0
- package/README.md +832 -2
- package/dist/.tsbuildinfo +1 -0
- package/dist/adapters/http/client/index.d.ts +11 -0
- package/dist/adapters/http/client/index.d.ts.map +1 -0
- package/dist/adapters/http/client/index.js +18 -0
- package/dist/adapters/http/client/index.js.map +1 -0
- package/dist/adapters/http/client/transport.d.ts +72 -0
- package/dist/adapters/http/client/transport.d.ts.map +1 -0
- package/dist/adapters/http/client/transport.js +282 -0
- package/dist/adapters/http/client/transport.js.map +1 -0
- package/dist/adapters/http/client/types.d.ts +27 -0
- package/dist/adapters/http/client/types.d.ts.map +1 -0
- package/dist/adapters/http/client/types.js +8 -0
- package/dist/adapters/http/client/types.js.map +1 -0
- package/dist/adapters/http/index.d.ts +7 -0
- package/dist/adapters/http/index.d.ts.map +1 -0
- package/dist/adapters/http/index.js +7 -0
- package/dist/adapters/http/index.js.map +1 -0
- package/dist/adapters/http/server/index.d.ts +9 -0
- package/dist/adapters/http/server/index.d.ts.map +1 -0
- package/dist/adapters/http/server/index.js +10 -0
- package/dist/adapters/http/server/index.js.map +1 -0
- package/dist/adapters/http/server/strategies.d.ts +39 -0
- package/dist/adapters/http/server/strategies.d.ts.map +1 -0
- package/dist/adapters/http/server/strategies.js +90 -0
- package/dist/adapters/http/server/strategies.js.map +1 -0
- package/dist/adapters/http/server/transport.d.ts +66 -0
- package/dist/adapters/http/server/transport.d.ts.map +1 -0
- package/dist/adapters/http/server/transport.js +562 -0
- package/dist/adapters/http/server/transport.js.map +1 -0
- package/dist/adapters/http/server/types.d.ts +71 -0
- package/dist/adapters/http/server/types.d.ts.map +1 -0
- package/dist/adapters/http/server/types.js +7 -0
- package/dist/adapters/http/server/types.js.map +1 -0
- package/dist/adapters/http/shared/constants.d.ts +95 -0
- package/dist/adapters/http/shared/constants.d.ts.map +1 -0
- package/dist/adapters/http/shared/constants.js +102 -0
- package/dist/adapters/http/shared/constants.js.map +1 -0
- package/dist/adapters/http/shared/errors.d.ts +78 -0
- package/dist/adapters/http/shared/errors.d.ts.map +1 -0
- package/dist/adapters/http/shared/errors.js +151 -0
- package/dist/adapters/http/shared/errors.js.map +1 -0
- package/dist/adapters/http/shared/headers.d.ts +122 -0
- package/dist/adapters/http/shared/headers.d.ts.map +1 -0
- package/dist/adapters/http/shared/headers.js +216 -0
- package/dist/adapters/http/shared/headers.js.map +1 -0
- package/dist/adapters/http/shared/index.d.ts +12 -0
- package/dist/adapters/http/shared/index.d.ts.map +1 -0
- package/dist/adapters/http/shared/index.js +17 -0
- package/dist/adapters/http/shared/index.js.map +1 -0
- package/dist/adapters/http/shared/status-codes.d.ts +92 -0
- package/dist/adapters/http/shared/status-codes.d.ts.map +1 -0
- package/dist/adapters/http/shared/status-codes.js +189 -0
- package/dist/adapters/http/shared/status-codes.js.map +1 -0
- package/dist/adapters/http/shared/strategies.d.ts +90 -0
- package/dist/adapters/http/shared/strategies.d.ts.map +1 -0
- package/dist/adapters/http/shared/strategies.js +180 -0
- package/dist/adapters/http/shared/strategies.js.map +1 -0
- package/dist/adapters/local/client/index.d.ts +8 -0
- package/dist/adapters/local/client/index.d.ts.map +1 -0
- package/dist/adapters/local/client/index.js +8 -0
- package/dist/adapters/local/client/index.js.map +1 -0
- package/dist/adapters/local/client/transport.d.ts +81 -0
- package/dist/adapters/local/client/transport.d.ts.map +1 -0
- package/dist/adapters/local/client/transport.js +172 -0
- package/dist/adapters/local/client/transport.js.map +1 -0
- package/dist/adapters/local/client/types.d.ts +39 -0
- package/dist/adapters/local/client/types.d.ts.map +1 -0
- package/dist/adapters/local/client/types.js +13 -0
- package/dist/adapters/local/client/types.js.map +1 -0
- package/dist/adapters/metadata.d.ts +10 -0
- package/dist/adapters/metadata.d.ts.map +1 -0
- package/dist/adapters/metadata.js +19 -0
- package/dist/adapters/metadata.js.map +1 -0
- package/dist/adapters/mock/client/builder.d.ts +35 -0
- package/dist/adapters/mock/client/builder.d.ts.map +1 -0
- package/dist/adapters/mock/client/builder.js +58 -0
- package/dist/adapters/mock/client/builder.js.map +1 -0
- package/dist/adapters/mock/client/index.d.ts +9 -0
- package/dist/adapters/mock/client/index.d.ts.map +1 -0
- package/dist/adapters/mock/client/index.js +10 -0
- package/dist/adapters/mock/client/index.js.map +1 -0
- package/dist/adapters/mock/client/transport.d.ts +149 -0
- package/dist/adapters/mock/client/transport.d.ts.map +1 -0
- package/dist/adapters/mock/client/transport.js +289 -0
- package/dist/adapters/mock/client/transport.js.map +1 -0
- package/dist/adapters/mock/client/types.d.ts +86 -0
- package/dist/adapters/mock/client/types.d.ts.map +1 -0
- package/dist/adapters/mock/client/types.js +7 -0
- package/dist/adapters/mock/client/types.js.map +1 -0
- package/dist/adapters/websocket/client/index.d.ts +9 -0
- package/dist/adapters/websocket/client/index.d.ts.map +1 -0
- package/dist/adapters/websocket/client/index.js +9 -0
- package/dist/adapters/websocket/client/index.js.map +1 -0
- package/dist/adapters/websocket/client/transport.d.ts +106 -0
- package/dist/adapters/websocket/client/transport.d.ts.map +1 -0
- package/dist/adapters/websocket/client/transport.js +647 -0
- package/dist/adapters/websocket/client/transport.js.map +1 -0
- package/dist/adapters/websocket/client/types.d.ts +192 -0
- package/dist/adapters/websocket/client/types.d.ts.map +1 -0
- package/dist/adapters/websocket/client/types.js +17 -0
- package/dist/adapters/websocket/client/types.js.map +1 -0
- package/dist/adapters/websocket/index.d.ts +8 -0
- package/dist/adapters/websocket/index.d.ts.map +1 -0
- package/dist/adapters/websocket/index.js +8 -0
- package/dist/adapters/websocket/index.js.map +1 -0
- package/dist/adapters/websocket/server/index.d.ts +8 -0
- package/dist/adapters/websocket/server/index.d.ts.map +1 -0
- package/dist/adapters/websocket/server/index.js +8 -0
- package/dist/adapters/websocket/server/index.js.map +1 -0
- package/dist/adapters/websocket/server/transport.d.ts +112 -0
- package/dist/adapters/websocket/server/transport.d.ts.map +1 -0
- package/dist/adapters/websocket/server/transport.js +619 -0
- package/dist/adapters/websocket/server/transport.js.map +1 -0
- package/dist/adapters/websocket/server/types.d.ts +140 -0
- package/dist/adapters/websocket/server/types.d.ts.map +1 -0
- package/dist/adapters/websocket/server/types.js +7 -0
- package/dist/adapters/websocket/server/types.js.map +1 -0
- package/dist/browser.d.ts +51 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +89 -0
- package/dist/browser.js.map +1 -0
- package/dist/client/batch-executor.d.ts +160 -0
- package/dist/client/batch-executor.d.ts.map +1 -0
- package/dist/client/batch-executor.js +397 -0
- package/dist/client/batch-executor.js.map +1 -0
- package/dist/client/call-types.d.ts +271 -0
- package/dist/client/call-types.d.ts.map +1 -0
- package/dist/client/call-types.js +208 -0
- package/dist/client/call-types.js.map +1 -0
- package/dist/client/client.d.ts +525 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +1011 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/consumption.d.ts +191 -0
- package/dist/client/consumption.d.ts.map +1 -0
- package/dist/client/consumption.js +98 -0
- package/dist/client/consumption.js.map +1 -0
- package/dist/client/context.d.ts +116 -0
- package/dist/client/context.d.ts.map +1 -0
- package/dist/client/context.js +111 -0
- package/dist/client/context.js.map +1 -0
- package/dist/client/errors/codes.d.ts +71 -0
- package/dist/client/errors/codes.d.ts.map +1 -0
- package/dist/client/errors/codes.js +81 -0
- package/dist/client/errors/codes.js.map +1 -0
- package/dist/client/errors/factory.d.ts +102 -0
- package/dist/client/errors/factory.d.ts.map +1 -0
- package/dist/client/errors/factory.js +210 -0
- package/dist/client/errors/factory.js.map +1 -0
- package/dist/client/errors/http-errors.d.ts +47 -0
- package/dist/client/errors/http-errors.d.ts.map +1 -0
- package/dist/client/errors/http-errors.js +548 -0
- package/dist/client/errors/http-errors.js.map +1 -0
- package/dist/client/errors/http-status.d.ts +73 -0
- package/dist/client/errors/http-status.d.ts.map +1 -0
- package/dist/client/errors/http-status.js +79 -0
- package/dist/client/errors/http-status.js.map +1 -0
- package/dist/client/errors/index.d.ts +36 -0
- package/dist/client/errors/index.d.ts.map +1 -0
- package/dist/client/errors/index.js +40 -0
- package/dist/client/errors/index.js.map +1 -0
- package/dist/client/errors/registry.d.ts +38 -0
- package/dist/client/errors/registry.d.ts.map +1 -0
- package/dist/client/errors/registry.js +535 -0
- package/dist/client/errors/registry.js.map +1 -0
- package/dist/client/errors/types.d.ts +112 -0
- package/dist/client/errors/types.d.ts.map +1 -0
- package/dist/client/errors/types.js +45 -0
- package/dist/client/errors/types.js.map +1 -0
- package/dist/client/index.d.ts +44 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +36 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/middleware/auth.d.ts +90 -0
- package/dist/client/middleware/auth.d.ts.map +1 -0
- package/dist/client/middleware/auth.js +98 -0
- package/dist/client/middleware/auth.js.map +1 -0
- package/dist/client/middleware/batching.d.ts +102 -0
- package/dist/client/middleware/batching.d.ts.map +1 -0
- package/dist/client/middleware/batching.js +245 -0
- package/dist/client/middleware/batching.js.map +1 -0
- package/dist/client/middleware/cache.d.ts +124 -0
- package/dist/client/middleware/cache.d.ts.map +1 -0
- package/dist/client/middleware/cache.js +208 -0
- package/dist/client/middleware/cache.js.map +1 -0
- package/dist/client/middleware/circuit-breaker.d.ts +113 -0
- package/dist/client/middleware/circuit-breaker.d.ts.map +1 -0
- package/dist/client/middleware/circuit-breaker.js +236 -0
- package/dist/client/middleware/circuit-breaker.js.map +1 -0
- package/dist/client/middleware/contexts.d.ts +199 -0
- package/dist/client/middleware/contexts.d.ts.map +1 -0
- package/dist/client/middleware/contexts.js +74 -0
- package/dist/client/middleware/contexts.js.map +1 -0
- package/dist/client/middleware/items.d.ts +37 -0
- package/dist/client/middleware/items.d.ts.map +1 -0
- package/dist/client/middleware/items.js +100 -0
- package/dist/client/middleware/items.js.map +1 -0
- package/dist/client/middleware/lru.d.ts +32 -0
- package/dist/client/middleware/lru.d.ts.map +1 -0
- package/dist/client/middleware/lru.js +62 -0
- package/dist/client/middleware/lru.js.map +1 -0
- package/dist/client/middleware/pagination.d.ts +114 -0
- package/dist/client/middleware/pagination.d.ts.map +1 -0
- package/dist/client/middleware/pagination.js +148 -0
- package/dist/client/middleware/pagination.js.map +1 -0
- package/dist/client/middleware/rate-limit.d.ts +105 -0
- package/dist/client/middleware/rate-limit.d.ts.map +1 -0
- package/dist/client/middleware/rate-limit.js +222 -0
- package/dist/client/middleware/rate-limit.js.map +1 -0
- package/dist/client/middleware/retry.d.ts +100 -0
- package/dist/client/middleware/retry.d.ts.map +1 -0
- package/dist/client/middleware/retry.js +150 -0
- package/dist/client/middleware/retry.js.map +1 -0
- package/dist/client/middleware/timeout.d.ts +91 -0
- package/dist/client/middleware/timeout.d.ts.map +1 -0
- package/dist/client/middleware/timeout.js +253 -0
- package/dist/client/middleware/timeout.js.map +1 -0
- package/dist/client/middleware/tracing.d.ts +118 -0
- package/dist/client/middleware/tracing.d.ts.map +1 -0
- package/dist/client/middleware/tracing.js +152 -0
- package/dist/client/middleware/tracing.js.map +1 -0
- package/dist/client/route-resolver.d.ts +181 -0
- package/dist/client/route-resolver.d.ts.map +1 -0
- package/dist/client/route-resolver.js +300 -0
- package/dist/client/route-resolver.js.map +1 -0
- package/dist/client/typed-method.d.ts +29 -0
- package/dist/client/typed-method.d.ts.map +1 -0
- package/dist/client/typed-method.js +36 -0
- package/dist/client/typed-method.js.map +1 -0
- package/dist/client/typed.d.ts +102 -0
- package/dist/client/typed.d.ts.map +1 -0
- package/dist/client/typed.js +52 -0
- package/dist/client/typed.js.map +1 -0
- package/dist/client/types.d.ts +305 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +26 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client/validation/index.d.ts +34 -0
- package/dist/client/validation/index.d.ts.map +1 -0
- package/dist/client/validation/index.js +36 -0
- package/dist/client/validation/index.js.map +1 -0
- package/dist/client/validation/middleware.d.ts +82 -0
- package/dist/client/validation/middleware.d.ts.map +1 -0
- package/dist/client/validation/middleware.js +138 -0
- package/dist/client/validation/middleware.js.map +1 -0
- package/dist/client/validation/types.d.ts +118 -0
- package/dist/client/validation/types.d.ts.map +1 -0
- package/dist/client/validation/types.js +59 -0
- package/dist/client/validation/types.js.map +1 -0
- package/dist/collections/async/async-queue.d.ts +144 -0
- package/dist/collections/async/async-queue.d.ts.map +1 -0
- package/dist/collections/async/async-queue.js +347 -0
- package/dist/collections/async/async-queue.js.map +1 -0
- package/dist/collections/async/channels.d.ts +188 -0
- package/dist/collections/async/channels.d.ts.map +1 -0
- package/dist/collections/async/channels.js +312 -0
- package/dist/collections/async/channels.js.map +1 -0
- package/dist/collections/behaviors/bounded.d.ts +79 -0
- package/dist/collections/behaviors/bounded.d.ts.map +1 -0
- package/dist/collections/behaviors/bounded.js +384 -0
- package/dist/collections/behaviors/bounded.js.map +1 -0
- package/dist/collections/behaviors/evented.d.ts +154 -0
- package/dist/collections/behaviors/evented.d.ts.map +1 -0
- package/dist/collections/behaviors/evented.js +299 -0
- package/dist/collections/behaviors/evented.js.map +1 -0
- package/dist/collections/behaviors/lru.d.ts +84 -0
- package/dist/collections/behaviors/lru.d.ts.map +1 -0
- package/dist/collections/behaviors/lru.js +330 -0
- package/dist/collections/behaviors/lru.js.map +1 -0
- package/dist/collections/behaviors/readonly.d.ts +73 -0
- package/dist/collections/behaviors/readonly.d.ts.map +1 -0
- package/dist/collections/behaviors/readonly.js +158 -0
- package/dist/collections/behaviors/readonly.js.map +1 -0
- package/dist/collections/behaviors/safe.d.ts +163 -0
- package/dist/collections/behaviors/safe.d.ts.map +1 -0
- package/dist/collections/behaviors/safe.js +172 -0
- package/dist/collections/behaviors/safe.js.map +1 -0
- package/dist/collections/behaviors/synchronized.d.ts +88 -0
- package/dist/collections/behaviors/synchronized.d.ts.map +1 -0
- package/dist/collections/behaviors/synchronized.js +294 -0
- package/dist/collections/behaviors/synchronized.js.map +1 -0
- package/dist/collections/behaviors/ttl.d.ts +118 -0
- package/dist/collections/behaviors/ttl.d.ts.map +1 -0
- package/dist/collections/behaviors/ttl.js +338 -0
- package/dist/collections/behaviors/ttl.js.map +1 -0
- package/dist/collections/core/effects.d.ts +176 -0
- package/dist/collections/core/effects.d.ts.map +1 -0
- package/dist/collections/core/effects.js +180 -0
- package/dist/collections/core/effects.js.map +1 -0
- package/dist/collections/core/events.d.ts +192 -0
- package/dist/collections/core/events.d.ts.map +1 -0
- package/dist/collections/core/events.js +291 -0
- package/dist/collections/core/events.js.map +1 -0
- package/dist/collections/core/middleware.d.ts +231 -0
- package/dist/collections/core/middleware.d.ts.map +1 -0
- package/dist/collections/core/middleware.js +161 -0
- package/dist/collections/core/middleware.js.map +1 -0
- package/dist/collections/core/policies.d.ts +220 -0
- package/dist/collections/core/policies.d.ts.map +1 -0
- package/dist/collections/core/policies.js +48 -0
- package/dist/collections/core/policies.js.map +1 -0
- package/dist/collections/core/traits.d.ts +142 -0
- package/dist/collections/core/traits.d.ts.map +1 -0
- package/dist/collections/core/traits.js +8 -0
- package/dist/collections/core/traits.js.map +1 -0
- package/dist/collections/examples.d.ts +13 -0
- package/dist/collections/examples.d.ts.map +1 -0
- package/dist/collections/examples.js +302 -0
- package/dist/collections/examples.js.map +1 -0
- package/dist/collections/fx/collectors.d.ts +190 -0
- package/dist/collections/fx/collectors.d.ts.map +1 -0
- package/dist/collections/fx/collectors.js +369 -0
- package/dist/collections/fx/collectors.js.map +1 -0
- package/dist/collections/fx/iter.d.ts +166 -0
- package/dist/collections/fx/iter.d.ts.map +1 -0
- package/dist/collections/fx/iter.js +421 -0
- package/dist/collections/fx/iter.js.map +1 -0
- package/dist/collections/impl/array-deque.d.ts +107 -0
- package/dist/collections/impl/array-deque.d.ts.map +1 -0
- package/dist/collections/impl/array-deque.js +381 -0
- package/dist/collections/impl/array-deque.js.map +1 -0
- package/dist/collections/impl/array-list.d.ts +101 -0
- package/dist/collections/impl/array-list.d.ts.map +1 -0
- package/dist/collections/impl/array-list.js +387 -0
- package/dist/collections/impl/array-list.js.map +1 -0
- package/dist/collections/impl/hash-map.d.ts +141 -0
- package/dist/collections/impl/hash-map.d.ts.map +1 -0
- package/dist/collections/impl/hash-map.js +450 -0
- package/dist/collections/impl/hash-map.js.map +1 -0
- package/dist/collections/impl/hash-set.d.ts +125 -0
- package/dist/collections/impl/hash-set.d.ts.map +1 -0
- package/dist/collections/impl/hash-set.js +264 -0
- package/dist/collections/impl/hash-set.js.map +1 -0
- package/dist/collections/impl/linked-hash-map.d.ts +141 -0
- package/dist/collections/impl/linked-hash-map.d.ts.map +1 -0
- package/dist/collections/impl/linked-hash-map.js +472 -0
- package/dist/collections/impl/linked-hash-map.js.map +1 -0
- package/dist/collections/impl/linked-list.d.ts +109 -0
- package/dist/collections/impl/linked-list.d.ts.map +1 -0
- package/dist/collections/impl/linked-list.js +491 -0
- package/dist/collections/impl/linked-list.js.map +1 -0
- package/dist/collections/impl/priority-queue.d.ts +134 -0
- package/dist/collections/impl/priority-queue.d.ts.map +1 -0
- package/dist/collections/impl/priority-queue.js +336 -0
- package/dist/collections/impl/priority-queue.js.map +1 -0
- package/dist/collections/impl/tree-map.d.ts +146 -0
- package/dist/collections/impl/tree-map.d.ts.map +1 -0
- package/dist/collections/impl/tree-map.js +781 -0
- package/dist/collections/impl/tree-map.js.map +1 -0
- package/dist/collections/impl/tree-set.d.ts +112 -0
- package/dist/collections/impl/tree-set.d.ts.map +1 -0
- package/dist/collections/impl/tree-set.js +374 -0
- package/dist/collections/impl/tree-set.js.map +1 -0
- package/dist/collections/index.d.ts +105 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/collections/index.js +135 -0
- package/dist/collections/index.js.map +1 -0
- package/dist/collections/interfaces/collection.d.ts +119 -0
- package/dist/collections/interfaces/collection.d.ts.map +1 -0
- package/dist/collections/interfaces/collection.js +8 -0
- package/dist/collections/interfaces/collection.js.map +1 -0
- package/dist/collections/interfaces/list.d.ts +247 -0
- package/dist/collections/interfaces/list.d.ts.map +1 -0
- package/dist/collections/interfaces/list.js +8 -0
- package/dist/collections/interfaces/list.js.map +1 -0
- package/dist/collections/interfaces/map.d.ts +344 -0
- package/dist/collections/interfaces/map.d.ts.map +1 -0
- package/dist/collections/interfaces/map.js +8 -0
- package/dist/collections/interfaces/map.js.map +1 -0
- package/dist/collections/interfaces/queue.d.ts +304 -0
- package/dist/collections/interfaces/queue.d.ts.map +1 -0
- package/dist/collections/interfaces/queue.js +8 -0
- package/dist/collections/interfaces/queue.js.map +1 -0
- package/dist/collections/interfaces/set.d.ts +137 -0
- package/dist/collections/interfaces/set.d.ts.map +1 -0
- package/dist/collections/interfaces/set.js +8 -0
- package/dist/collections/interfaces/set.js.map +1 -0
- package/dist/collections/storage/api.d.ts +109 -0
- package/dist/collections/storage/api.d.ts.map +1 -0
- package/dist/collections/storage/api.js +182 -0
- package/dist/collections/storage/api.js.map +1 -0
- package/dist/collections/storage/hybrid.d.ts +164 -0
- package/dist/collections/storage/hybrid.d.ts.map +1 -0
- package/dist/collections/storage/hybrid.js +416 -0
- package/dist/collections/storage/hybrid.js.map +1 -0
- package/dist/collections/storage/index.d.ts +16 -0
- package/dist/collections/storage/index.d.ts.map +1 -0
- package/dist/collections/storage/index.js +13 -0
- package/dist/collections/storage/index.js.map +1 -0
- package/dist/collections/storage/interface.d.ts +141 -0
- package/dist/collections/storage/interface.d.ts.map +1 -0
- package/dist/collections/storage/interface.js +23 -0
- package/dist/collections/storage/interface.js.map +1 -0
- package/dist/collections/storage/memory.d.ts +68 -0
- package/dist/collections/storage/memory.d.ts.map +1 -0
- package/dist/collections/storage/memory.js +154 -0
- package/dist/collections/storage/memory.js.map +1 -0
- package/dist/collections/utils/defaults.d.ts +135 -0
- package/dist/collections/utils/defaults.d.ts.map +1 -0
- package/dist/collections/utils/defaults.js +322 -0
- package/dist/collections/utils/defaults.js.map +1 -0
- package/dist/collections/utils/factories.d.ts +144 -0
- package/dist/collections/utils/factories.d.ts.map +1 -0
- package/dist/collections/utils/factories.js +293 -0
- package/dist/collections/utils/factories.js.map +1 -0
- package/dist/collections/utils/helpers.d.ts +137 -0
- package/dist/collections/utils/helpers.d.ts.map +1 -0
- package/dist/collections/utils/helpers.js +221 -0
- package/dist/collections/utils/helpers.js.map +1 -0
- package/dist/collections.d.ts +12 -0
- package/dist/collections.d.ts.map +1 -0
- package/dist/collections.js +10 -0
- package/dist/collections.js.map +1 -0
- package/dist/components/define.d.ts +134 -0
- package/dist/components/define.d.ts.map +1 -0
- package/dist/components/define.js +486 -0
- package/dist/components/define.js.map +1 -0
- package/dist/components/index.d.ts +39 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +38 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/types.d.ts +264 -0
- package/dist/components/types.d.ts.map +1 -0
- package/dist/components/types.js +46 -0
- package/dist/components/types.js.map +1 -0
- package/dist/events/bus.d.ts +193 -0
- package/dist/events/bus.d.ts.map +1 -0
- package/dist/events/bus.js +511 -0
- package/dist/events/bus.js.map +1 -0
- package/dist/events/index.d.ts +34 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +36 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/types.d.ts +242 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +8 -0
- package/dist/events/types.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/compose.d.ts +88 -0
- package/dist/middleware/compose.d.ts.map +1 -0
- package/dist/middleware/compose.js +108 -0
- package/dist/middleware/compose.js.map +1 -0
- package/dist/middleware/index.d.ts +12 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +11 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/types.d.ts +112 -0
- package/dist/middleware/types.d.ts.map +1 -0
- package/dist/middleware/types.js +14 -0
- package/dist/middleware/types.js.map +1 -0
- package/dist/procedures/capability.d.ts +111 -0
- package/dist/procedures/capability.d.ts.map +1 -0
- package/dist/procedures/capability.js +269 -0
- package/dist/procedures/capability.js.map +1 -0
- package/dist/procedures/cli/announce.d.ts +67 -0
- package/dist/procedures/cli/announce.d.ts.map +1 -0
- package/dist/procedures/cli/announce.js +392 -0
- package/dist/procedures/cli/announce.js.map +1 -0
- package/dist/procedures/cli/discover.d.ts +66 -0
- package/dist/procedures/cli/discover.d.ts.map +1 -0
- package/dist/procedures/cli/discover.js +310 -0
- package/dist/procedures/cli/discover.js.map +1 -0
- package/dist/procedures/cli/index.d.ts +13 -0
- package/dist/procedures/cli/index.d.ts.map +1 -0
- package/dist/procedures/cli/index.js +203 -0
- package/dist/procedures/cli/index.js.map +1 -0
- package/dist/procedures/cli/init.d.ts +17 -0
- package/dist/procedures/cli/init.d.ts.map +1 -0
- package/dist/procedures/cli/init.js +336 -0
- package/dist/procedures/cli/init.js.map +1 -0
- package/dist/procedures/collection/index.d.ts +10 -0
- package/dist/procedures/collection/index.d.ts.map +1 -0
- package/dist/procedures/collection/index.js +10 -0
- package/dist/procedures/collection/index.js.map +1 -0
- package/dist/procedures/collection/procedures.d.ts +21 -0
- package/dist/procedures/collection/procedures.d.ts.map +1 -0
- package/dist/procedures/collection/procedures.js +210 -0
- package/dist/procedures/collection/procedures.js.map +1 -0
- package/dist/procedures/collection/schemas.d.ts +131 -0
- package/dist/procedures/collection/schemas.d.ts.map +1 -0
- package/dist/procedures/collection/schemas.js +422 -0
- package/dist/procedures/collection/schemas.js.map +1 -0
- package/dist/procedures/collection/storage.d.ts +53 -0
- package/dist/procedures/collection/storage.d.ts.map +1 -0
- package/dist/procedures/collection/storage.js +2 -0
- package/dist/procedures/collection/storage.js.map +1 -0
- package/dist/procedures/core/array.d.ts +276 -0
- package/dist/procedures/core/array.d.ts.map +1 -0
- package/dist/procedures/core/array.js +639 -0
- package/dist/procedures/core/array.js.map +1 -0
- package/dist/procedures/core/comparison.d.ts +85 -0
- package/dist/procedures/core/comparison.d.ts.map +1 -0
- package/dist/procedures/core/comparison.js +158 -0
- package/dist/procedures/core/comparison.js.map +1 -0
- package/dist/procedures/core/index.d.ts +261 -0
- package/dist/procedures/core/index.d.ts.map +1 -0
- package/dist/procedures/core/index.js +588 -0
- package/dist/procedures/core/index.js.map +1 -0
- package/dist/procedures/core/logic.d.ts +144 -0
- package/dist/procedures/core/logic.d.ts.map +1 -0
- package/dist/procedures/core/logic.js +169 -0
- package/dist/procedures/core/logic.js.map +1 -0
- package/dist/procedures/core/math.d.ts +139 -0
- package/dist/procedures/core/math.d.ts.map +1 -0
- package/dist/procedures/core/math.js +275 -0
- package/dist/procedures/core/math.js.map +1 -0
- package/dist/procedures/core/meta.d.ts +111 -0
- package/dist/procedures/core/meta.d.ts.map +1 -0
- package/dist/procedures/core/meta.js +244 -0
- package/dist/procedures/core/meta.js.map +1 -0
- package/dist/procedures/core/object.d.ts +109 -0
- package/dist/procedures/core/object.d.ts.map +1 -0
- package/dist/procedures/core/object.js +272 -0
- package/dist/procedures/core/object.js.map +1 -0
- package/dist/procedures/core/operands.d.ts +51 -0
- package/dist/procedures/core/operands.d.ts.map +1 -0
- package/dist/procedures/core/operands.js +90 -0
- package/dist/procedures/core/operands.js.map +1 -0
- package/dist/procedures/core/outputs.d.ts +28 -0
- package/dist/procedures/core/outputs.d.ts.map +1 -0
- package/dist/procedures/core/outputs.js +42 -0
- package/dist/procedures/core/outputs.js.map +1 -0
- package/dist/procedures/core/results.d.ts +202 -0
- package/dist/procedures/core/results.d.ts.map +1 -0
- package/dist/procedures/core/results.js +106 -0
- package/dist/procedures/core/results.js.map +1 -0
- package/dist/procedures/core/schemas.d.ts +48 -0
- package/dist/procedures/core/schemas.d.ts.map +1 -0
- package/dist/procedures/core/schemas.js +102 -0
- package/dist/procedures/core/schemas.js.map +1 -0
- package/dist/procedures/core/string.d.ts +138 -0
- package/dist/procedures/core/string.d.ts.map +1 -0
- package/dist/procedures/core/string.js +270 -0
- package/dist/procedures/core/string.js.map +1 -0
- package/dist/procedures/core/type.d.ts +101 -0
- package/dist/procedures/core/type.d.ts.map +1 -0
- package/dist/procedures/core/type.js +210 -0
- package/dist/procedures/core/type.js.map +1 -0
- package/dist/procedures/define-procedure.d.ts +187 -0
- package/dist/procedures/define-procedure.d.ts.map +1 -0
- package/dist/procedures/define-procedure.js +357 -0
- package/dist/procedures/define-procedure.js.map +1 -0
- package/dist/procedures/define.d.ts +228 -0
- package/dist/procedures/define.d.ts.map +1 -0
- package/dist/procedures/define.js +300 -0
- package/dist/procedures/define.js.map +1 -0
- package/dist/procedures/discovery.d.ts +57 -0
- package/dist/procedures/discovery.d.ts.map +1 -0
- package/dist/procedures/discovery.js +68 -0
- package/dist/procedures/discovery.js.map +1 -0
- package/dist/procedures/effects.d.ts +15 -0
- package/dist/procedures/effects.d.ts.map +1 -0
- package/dist/procedures/effects.js +18 -0
- package/dist/procedures/effects.js.map +1 -0
- package/dist/procedures/index.d.ts +27 -0
- package/dist/procedures/index.d.ts.map +1 -0
- package/dist/procedures/index.js +54 -0
- package/dist/procedures/index.js.map +1 -0
- package/dist/procedures/interceptors.d.ts +82 -0
- package/dist/procedures/interceptors.d.ts.map +1 -0
- package/dist/procedures/interceptors.js +194 -0
- package/dist/procedures/interceptors.js.map +1 -0
- package/dist/procedures/invoke.d.ts +155 -0
- package/dist/procedures/invoke.d.ts.map +1 -0
- package/dist/procedures/invoke.js +343 -0
- package/dist/procedures/invoke.js.map +1 -0
- package/dist/procedures/module.d.ts +54 -0
- package/dist/procedures/module.d.ts.map +1 -0
- package/dist/procedures/module.js +103 -0
- package/dist/procedures/module.js.map +1 -0
- package/dist/procedures/policy.d.ts +70 -0
- package/dist/procedures/policy.d.ts.map +1 -0
- package/dist/procedures/policy.js +138 -0
- package/dist/procedures/policy.js.map +1 -0
- package/dist/procedures/ref.d.ts +606 -0
- package/dist/procedures/ref.d.ts.map +1 -0
- package/dist/procedures/ref.js +895 -0
- package/dist/procedures/ref.js.map +1 -0
- package/dist/procedures/registry.d.ts +208 -0
- package/dist/procedures/registry.d.ts.map +1 -0
- package/dist/procedures/registry.js +402 -0
- package/dist/procedures/registry.js.map +1 -0
- package/dist/procedures/schema.d.ts +126 -0
- package/dist/procedures/schema.d.ts.map +1 -0
- package/dist/procedures/schema.js +108 -0
- package/dist/procedures/schema.js.map +1 -0
- package/dist/procedures/storage/adapter.d.ts +148 -0
- package/dist/procedures/storage/adapter.d.ts.map +1 -0
- package/dist/procedures/storage/adapter.js +214 -0
- package/dist/procedures/storage/adapter.js.map +1 -0
- package/dist/procedures/storage/api.d.ts +125 -0
- package/dist/procedures/storage/api.d.ts.map +1 -0
- package/dist/procedures/storage/api.js +220 -0
- package/dist/procedures/storage/api.js.map +1 -0
- package/dist/procedures/storage/factory.d.ts +134 -0
- package/dist/procedures/storage/factory.d.ts.map +1 -0
- package/dist/procedures/storage/factory.js +166 -0
- package/dist/procedures/storage/factory.js.map +1 -0
- package/dist/procedures/storage/hybrid.d.ts +193 -0
- package/dist/procedures/storage/hybrid.d.ts.map +1 -0
- package/dist/procedures/storage/hybrid.js +519 -0
- package/dist/procedures/storage/hybrid.js.map +1 -0
- package/dist/procedures/storage/index.d.ts +17 -0
- package/dist/procedures/storage/index.d.ts.map +1 -0
- package/dist/procedures/storage/index.js +17 -0
- package/dist/procedures/storage/index.js.map +1 -0
- package/dist/procedures/storage/procedures.d.ts +39 -0
- package/dist/procedures/storage/procedures.d.ts.map +1 -0
- package/dist/procedures/storage/procedures.js +261 -0
- package/dist/procedures/storage/procedures.js.map +1 -0
- package/dist/procedures/storage/serialization.d.ts +123 -0
- package/dist/procedures/storage/serialization.d.ts.map +1 -0
- package/dist/procedures/storage/serialization.js +216 -0
- package/dist/procedures/storage/serialization.js.map +1 -0
- package/dist/procedures/storage/synced-registry.d.ts +246 -0
- package/dist/procedures/storage/synced-registry.d.ts.map +1 -0
- package/dist/procedures/storage/synced-registry.js +575 -0
- package/dist/procedures/storage/synced-registry.js.map +1 -0
- package/dist/procedures/storage/types.d.ts +130 -0
- package/dist/procedures/storage/types.d.ts.map +1 -0
- package/dist/procedures/storage/types.js +8 -0
- package/dist/procedures/storage/types.js.map +1 -0
- package/dist/procedures/types.d.ts +468 -0
- package/dist/procedures/types.d.ts.map +1 -0
- package/dist/procedures/types.js +23 -0
- package/dist/procedures/types.js.map +1 -0
- package/dist/register.d.ts +8 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +9 -0
- package/dist/register.js.map +1 -0
- package/dist/server/browser-guard.d.ts +69 -0
- package/dist/server/browser-guard.d.ts.map +1 -0
- package/dist/server/browser-guard.js +103 -0
- package/dist/server/browser-guard.js.map +1 -0
- package/dist/server/host-policy.d.ts +81 -0
- package/dist/server/host-policy.d.ts.map +1 -0
- package/dist/server/host-policy.js +104 -0
- package/dist/server/host-policy.js.map +1 -0
- package/dist/server/index.d.ts +46 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +42 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/method.d.ts +24 -0
- package/dist/server/method.d.ts.map +1 -0
- package/dist/server/method.js +29 -0
- package/dist/server/method.js.map +1 -0
- package/dist/server/procedure-server.d.ts +226 -0
- package/dist/server/procedure-server.d.ts.map +1 -0
- package/dist/server/procedure-server.js +348 -0
- package/dist/server/procedure-server.js.map +1 -0
- package/dist/server/server.d.ts +161 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +279 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/types.d.ts +106 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +29 -0
- package/dist/server/types.js.map +1 -0
- package/package.json +117 -3
- package/src/adapters/http/client/index.ts +51 -0
- package/src/adapters/http/client/transport.ts +338 -0
- package/src/adapters/http/client/types.ts +33 -0
- package/src/adapters/http/index.ts +7 -0
- package/src/adapters/http/server/index.ts +14 -0
- package/src/adapters/http/server/strategies.ts +105 -0
- package/src/adapters/http/server/transport.ts +623 -0
- package/src/adapters/http/server/types.ts +81 -0
- package/src/adapters/http/shared/constants.ts +108 -0
- package/src/adapters/http/shared/errors.ts +199 -0
- package/src/adapters/http/shared/headers.ts +291 -0
- package/src/adapters/http/shared/index.ts +21 -0
- package/src/adapters/http/shared/status-codes.ts +212 -0
- package/src/adapters/http/shared/strategies.ts +255 -0
- package/src/adapters/local/client/index.ts +11 -0
- package/src/adapters/local/client/transport.ts +188 -0
- package/src/adapters/local/client/types.ts +50 -0
- package/src/adapters/metadata.ts +17 -0
- package/src/adapters/mock/client/builder.ts +64 -0
- package/src/adapters/mock/client/index.ts +19 -0
- package/src/adapters/mock/client/transport.ts +352 -0
- package/src/adapters/mock/client/types.ts +99 -0
- package/src/adapters/websocket/client/index.ts +18 -0
- package/src/adapters/websocket/client/transport.ts +733 -0
- package/src/adapters/websocket/client/types.ts +235 -0
- package/src/adapters/websocket/index.ts +24 -0
- package/src/adapters/websocket/server/index.ts +18 -0
- package/src/adapters/websocket/server/transport.ts +705 -0
- package/src/adapters/websocket/server/types.ts +169 -0
- package/src/browser.ts +401 -0
- package/src/client/batch-executor.ts +514 -0
- package/src/client/call-types.ts +491 -0
- package/src/client/client.ts +1229 -0
- package/src/client/consumption.ts +288 -0
- package/src/client/context.ts +228 -0
- package/src/client/errors/README.md +279 -0
- package/src/client/errors/codes.ts +88 -0
- package/src/client/errors/factory.ts +263 -0
- package/src/client/errors/http-errors.ts +601 -0
- package/src/client/errors/http-status.ts +82 -0
- package/src/client/errors/index.ts +72 -0
- package/src/client/errors/registry.ts +595 -0
- package/src/client/errors/types.ts +139 -0
- package/src/client/index.ts +124 -0
- package/src/client/middleware/auth.ts +132 -0
- package/src/client/middleware/cache.ts +316 -0
- package/src/client/middleware/circuit-breaker.ts +339 -0
- package/src/client/middleware/contexts.ts +319 -0
- package/src/client/middleware/items.ts +114 -0
- package/src/client/middleware/lru.ts +66 -0
- package/src/client/middleware/pagination.ts +213 -0
- package/src/client/middleware/rate-limit.ts +315 -0
- package/src/client/middleware/retry.ts +236 -0
- package/src/client/middleware/timeout.ts +308 -0
- package/src/client/middleware/tracing.ts +191 -0
- package/src/client/route-resolver.ts +407 -0
- package/src/client/typed-method.ts +65 -0
- package/src/client/typed.ts +140 -0
- package/src/client/types.ts +372 -0
- package/src/client/validation/index.ts +56 -0
- package/src/client/validation/middleware.ts +254 -0
- package/src/client/validation/types.ts +162 -0
- package/src/events/bus.ts +594 -0
- package/src/events/index.ts +67 -0
- package/src/events/types.ts +263 -0
- package/src/index.ts +33 -0
- package/src/middleware/compose.ts +159 -0
- package/src/middleware/index.ts +28 -0
- package/src/middleware/types.ts +166 -0
- package/src/procedures/capability.ts +333 -0
- package/src/procedures/cli/announce.ts +470 -0
- package/src/procedures/cli/discover.ts +390 -0
- package/src/procedures/cli/index.ts +231 -0
- package/src/procedures/cli/init.ts +370 -0
- package/src/procedures/collection/index.ts +51 -0
- package/src/procedures/collection/procedures.ts +257 -0
- package/src/procedures/collection/schemas.ts +550 -0
- package/src/procedures/collection/storage.ts +53 -0
- package/src/procedures/core/array.ts +1026 -0
- package/src/procedures/core/comparison.ts +265 -0
- package/src/procedures/core/index.ts +898 -0
- package/src/procedures/core/logic.ts +225 -0
- package/src/procedures/core/math.ts +471 -0
- package/src/procedures/core/meta.ts +389 -0
- package/src/procedures/core/object.ts +429 -0
- package/src/procedures/core/operands.ts +119 -0
- package/src/procedures/core/outputs.ts +48 -0
- package/src/procedures/core/results.ts +296 -0
- package/src/procedures/core/schemas.ts +123 -0
- package/src/procedures/core/string.ts +460 -0
- package/src/procedures/core/type.ts +346 -0
- package/src/procedures/define-procedure.ts +532 -0
- package/src/procedures/define.ts +387 -0
- package/src/procedures/discovery.ts +76 -0
- package/src/procedures/effects.ts +24 -0
- package/src/procedures/index.ts +239 -0
- package/src/procedures/interceptors.ts +273 -0
- package/src/procedures/invoke.ts +506 -0
- package/src/procedures/module.ts +117 -0
- package/src/procedures/policy.ts +171 -0
- package/src/procedures/ref.ts +1305 -0
- package/src/procedures/registry.ts +473 -0
- package/src/procedures/schema.ts +225 -0
- package/src/procedures/types.ts +596 -0
- package/src/register.ts +10 -0
- package/src/server/browser-guard.ts +147 -0
- package/src/server/host-policy.ts +163 -0
- package/src/server/index.ts +70 -0
- package/src/server/method.ts +33 -0
- package/src/server/procedure-server.ts +459 -0
- package/src/server/server.ts +364 -0
- package/src/server/types.ts +147 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal Retry Middleware
|
|
3
|
+
*
|
|
4
|
+
* Protocol-agnostic retry with exponential backoff and jitter.
|
|
5
|
+
* Works with any transport!
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { ClientRunner, ClientContext, ResponseItem, TypedClientMiddleware } from "../types.js";
|
|
9
|
+
import type { RetryContext } from "./contexts.js";
|
|
10
|
+
import { abortedItem, sleep, thrownItem } from "./items.js";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Retry middleware options.
|
|
14
|
+
*/
|
|
15
|
+
export interface RetryOptions {
|
|
16
|
+
/**
|
|
17
|
+
* Maximum number of retry attempts.
|
|
18
|
+
* @default 3
|
|
19
|
+
*/
|
|
20
|
+
maxRetries?: number;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Base delay in milliseconds for exponential backoff.
|
|
24
|
+
* Actual delay will be: baseDelay * 2^attempt + jitter
|
|
25
|
+
* @default 1000
|
|
26
|
+
*/
|
|
27
|
+
retryDelay?: number;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* The factor of the delay from one attempt to the next.
|
|
31
|
+
* @default 2
|
|
32
|
+
*/
|
|
33
|
+
backoffMultiplier?: number;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The longest delay between two attempts, in milliseconds.
|
|
37
|
+
* @default no limit
|
|
38
|
+
*/
|
|
39
|
+
maxDelay?: number;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Maximum jitter as a fraction of the delay (0-1).
|
|
43
|
+
* Adds randomness to prevent thundering herd.
|
|
44
|
+
* @default 0.1 (10% jitter)
|
|
45
|
+
*/
|
|
46
|
+
jitter?: number;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Custom function to determine if a request should be retried.
|
|
50
|
+
* Takes precedence over Status.retryable flag.
|
|
51
|
+
*
|
|
52
|
+
* @param item - The response item
|
|
53
|
+
* @param attempt - Current attempt number (0-indexed)
|
|
54
|
+
* @returns true if the request should be retried
|
|
55
|
+
*/
|
|
56
|
+
shouldRetry?: (item: ResponseItem<unknown>, attempt: number) => boolean;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Hook called before each retry attempt.
|
|
60
|
+
* Can modify delay or abort retry.
|
|
61
|
+
*
|
|
62
|
+
* @param item - The response item that triggered retry
|
|
63
|
+
* @param attempt - Current attempt number (0-indexed)
|
|
64
|
+
* @returns Object with shouldRetry and optional delayMs override
|
|
65
|
+
*/
|
|
66
|
+
onBeforeRetry?: (
|
|
67
|
+
item: ResponseItem<unknown>,
|
|
68
|
+
attempt: number,
|
|
69
|
+
) => Promise<{ shouldRetry: boolean; delayMs?: number }> | { shouldRetry: boolean; delayMs?: number };
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Hook called after each retry completes (success or failure).
|
|
73
|
+
*
|
|
74
|
+
* @param success - Whether the retry succeeded
|
|
75
|
+
* @param attempt - Attempt number that just completed
|
|
76
|
+
*/
|
|
77
|
+
onAfterRetry?: (success: boolean, attempt: number) => Promise<void> | void;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Create retry middleware with exponential backoff and jitter.
|
|
82
|
+
*
|
|
83
|
+
* Features:
|
|
84
|
+
* - Protocol-agnostic: Works with HTTP, gRPC, WebSocket, local
|
|
85
|
+
* - Uses Status.retryable flag (no protocol-specific knowledge)
|
|
86
|
+
* - Exponential backoff with jitter
|
|
87
|
+
* - Custom retry predicates
|
|
88
|
+
* - Before/after retry hooks
|
|
89
|
+
* - Respects AbortSignal
|
|
90
|
+
* - **Context override**: Values from metadata.retry take precedence over options:
|
|
91
|
+
* `maxAttempts`, `delay`, `backoffMultiplier` and `maxDelay` (the `route()` overrides)
|
|
92
|
+
*
|
|
93
|
+
* @param options - Retry configuration (defaults, can be overridden per-call)
|
|
94
|
+
* @returns Middleware function
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```typescript
|
|
98
|
+
* // Create middleware with defaults
|
|
99
|
+
* client.use(createRetryMiddleware({ maxRetries: 3 }));
|
|
100
|
+
*
|
|
101
|
+
* // Override per-call via context
|
|
102
|
+
* await client.call(method, payload, {
|
|
103
|
+
* context: { retry: { maxAttempts: 5 } }
|
|
104
|
+
* });
|
|
105
|
+
* ```
|
|
106
|
+
*/
|
|
107
|
+
export function createRetryMiddleware(options: RetryOptions = {}): TypedClientMiddleware<RetryContext, {}> {
|
|
108
|
+
const {
|
|
109
|
+
retryDelay: defaultRetryDelay = 1000,
|
|
110
|
+
jitter: defaultJitter = 0.1,
|
|
111
|
+
shouldRetry: customShouldRetry,
|
|
112
|
+
onBeforeRetry,
|
|
113
|
+
onAfterRetry,
|
|
114
|
+
} = options;
|
|
115
|
+
const defaultMaxRetries = options.maxRetries ?? 3;
|
|
116
|
+
const defaultMultiplier = options.backoffMultiplier ?? 2;
|
|
117
|
+
const defaultMaxDelay = options.maxDelay ?? Number.POSITIVE_INFINITY;
|
|
118
|
+
|
|
119
|
+
/** The overrides of one call (`retry: { ... }` in its context). Before, only maxAttempts was read. */
|
|
120
|
+
const overridesOf = (value: unknown): Partial<Pick<RetryContext["retry"], "maxAttempts" | "delay" | "backoffMultiplier" | "maxDelay">> => {
|
|
121
|
+
if (typeof value !== "object" || value === null) return {};
|
|
122
|
+
const out: Partial<Pick<RetryContext["retry"], "maxAttempts" | "delay" | "backoffMultiplier" | "maxDelay">> = {};
|
|
123
|
+
for (const key of ["maxAttempts", "delay", "backoffMultiplier", "maxDelay"] as const) {
|
|
124
|
+
const field = (value as Record<string, unknown>)[key];
|
|
125
|
+
if (typeof field === "number" && Number.isFinite(field) && field >= 0) out[key] = field;
|
|
126
|
+
}
|
|
127
|
+
return out;
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
/** The backoff delay of an attempt: exponential, with jitter, at most the maximum delay */
|
|
131
|
+
const backoffDelay = (attempt: number, overrides: ReturnType<typeof overridesOf>): number => {
|
|
132
|
+
const baseDelay = (overrides.delay ?? defaultRetryDelay) * Math.pow(overrides.backoffMultiplier ?? defaultMultiplier, attempt);
|
|
133
|
+
const jitterAmount = defaultJitter * baseDelay * (Math.random() * 2 - 1);
|
|
134
|
+
return Math.max(0, Math.min(overrides.maxDelay ?? defaultMaxDelay, baseDelay + jitterAmount));
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
return <TReq, TRes>(next: ClientRunner<TReq, TRes>): ClientRunner<TReq, TRes> => {
|
|
138
|
+
return async function* (context: ClientContext<TReq>) {
|
|
139
|
+
// Read from metadata first (user-provided context), then fall back to options
|
|
140
|
+
const overrides = overridesOf(context.message.metadata.retry);
|
|
141
|
+
const maxRetries = overrides.maxAttempts ?? defaultMaxRetries;
|
|
142
|
+
const shouldRetryItem = (item: ResponseItem<TRes>, attempt: number): boolean =>
|
|
143
|
+
customShouldRetry
|
|
144
|
+
? customShouldRetry(item, attempt)
|
|
145
|
+
: item.status.type === "error" && item.status.retryable;
|
|
146
|
+
const signal = context.message.signal;
|
|
147
|
+
const baseId = context.message.id;
|
|
148
|
+
|
|
149
|
+
let attempt = 0;
|
|
150
|
+
for (;;) {
|
|
151
|
+
// Update retry metadata with current state
|
|
152
|
+
context.message.metadata.retry = {
|
|
153
|
+
...overrides,
|
|
154
|
+
attempt,
|
|
155
|
+
maxAttempts: maxRetries,
|
|
156
|
+
};
|
|
157
|
+
// Each attempt gets its own request id. The id correlates the frames of one attempt
|
|
158
|
+
// on the wire: a cancelled attempt can still answer under its id (deep dive TRN-8/9).
|
|
159
|
+
context.message.id = attempt === 0 ? baseId : `${baseId}.retry${attempt}`;
|
|
160
|
+
|
|
161
|
+
// Check if cancelled before attempt
|
|
162
|
+
if (signal?.aborted) {
|
|
163
|
+
yield abortedItem<TRes>(context.message.id);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// The items pass through as they arrive (BUGS-2026-07 M2: before, the middleware
|
|
168
|
+
// collected the whole stream first). A retry is possible only while no item has
|
|
169
|
+
// reached the reader: the first item is a retryable error, or the attempt throws
|
|
170
|
+
// before its first item. After that, a retry would repeat items.
|
|
171
|
+
let started = false;
|
|
172
|
+
let lastItem: ResponseItem<TRes> | undefined;
|
|
173
|
+
let retryItem: ResponseItem<TRes> | undefined;
|
|
174
|
+
try {
|
|
175
|
+
for await (const item of next(context)) {
|
|
176
|
+
if (!started && attempt < maxRetries && shouldRetryItem(item, attempt)) {
|
|
177
|
+
retryItem = item;
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
started = true;
|
|
181
|
+
lastItem = item;
|
|
182
|
+
yield item;
|
|
183
|
+
}
|
|
184
|
+
} catch (error) {
|
|
185
|
+
const isAborted = signal?.aborted || (error instanceof Error && error.name === "AbortError");
|
|
186
|
+
if (started || isAborted || attempt >= maxRetries) {
|
|
187
|
+
throw error;
|
|
188
|
+
}
|
|
189
|
+
// A thrown error is retried only when it is a network failure, or when shouldRetry
|
|
190
|
+
// says so. Before, every thrown error was retried: a validation error, an open
|
|
191
|
+
// circuit breaker, a rate limit (deep dive TRN-8).
|
|
192
|
+
const item = thrownItem<TRes>(context.message.id, error);
|
|
193
|
+
if (!shouldRetryItem(item, attempt)) {
|
|
194
|
+
throw error;
|
|
195
|
+
}
|
|
196
|
+
retryItem = item;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
if (retryItem === undefined) {
|
|
200
|
+
// Success, a non-retryable error, or the last attempt
|
|
201
|
+
if (onAfterRetry) {
|
|
202
|
+
await onAfterRetry(lastItem?.status.type === "success", attempt);
|
|
203
|
+
}
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
let delay = backoffDelay(attempt, overrides);
|
|
208
|
+
|
|
209
|
+
// Before retry hook
|
|
210
|
+
if (onBeforeRetry) {
|
|
211
|
+
const hookResult = await onBeforeRetry(retryItem, attempt);
|
|
212
|
+
if (!hookResult.shouldRetry) {
|
|
213
|
+
// Hook decided not to retry - yield the error and return
|
|
214
|
+
yield retryItem;
|
|
215
|
+
if (onAfterRetry) {
|
|
216
|
+
await onAfterRetry(false, attempt);
|
|
217
|
+
}
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Use custom delay if provided by hook
|
|
222
|
+
if (hookResult.delayMs !== undefined) {
|
|
223
|
+
delay = hookResult.delayMs;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// The backoff stops at once when the caller aborts (deep dive TRN-8)
|
|
228
|
+
if (!(await sleep(delay, signal))) {
|
|
229
|
+
yield abortedItem<TRes>(context.message.id);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
attempt++;
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
};
|
|
236
|
+
}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal Timeout Middleware
|
|
3
|
+
*
|
|
4
|
+
* Protocol-agnostic timeout handling with per-request and overall timeouts.
|
|
5
|
+
* Works with any transport!
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { ClientMiddleware, ClientRunner, ClientContext, ResponseItem, TypedClientMiddleware } from "../types.js";
|
|
9
|
+
import { ABORTED_FIRST, errorItem, nextOrAbort } from "./items.js";
|
|
10
|
+
import type { TimeoutContext } from "./contexts.js";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Timeout middleware options.
|
|
14
|
+
*/
|
|
15
|
+
export interface TimeoutOptions {
|
|
16
|
+
/**
|
|
17
|
+
* Timeout in milliseconds for the entire request (including retries).
|
|
18
|
+
* @default undefined (no overall timeout)
|
|
19
|
+
*/
|
|
20
|
+
overall?: number;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Timeout in milliseconds for each individual attempt.
|
|
24
|
+
* Useful with retry middleware for per-attempt timeouts.
|
|
25
|
+
* @default undefined (no per-attempt timeout)
|
|
26
|
+
*/
|
|
27
|
+
perAttempt?: number;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Custom timeout error message.
|
|
31
|
+
* @default "Request timeout"
|
|
32
|
+
*/
|
|
33
|
+
message?: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Compose multiple AbortSignals into one.
|
|
38
|
+
*
|
|
39
|
+
* Uses AbortSignal.any() if available (Node 20+, modern browsers),
|
|
40
|
+
* otherwise falls back to manual composition with cleanup.
|
|
41
|
+
*
|
|
42
|
+
* Returns a controller whose signal aborts when ANY of the input signals abort.
|
|
43
|
+
*
|
|
44
|
+
* @param signals - Array of signals to compose (undefined values filtered out)
|
|
45
|
+
* @returns Object with controller and cleanup function
|
|
46
|
+
*/
|
|
47
|
+
function composeAbortSignals(...signals: (AbortSignal | undefined)[]): {
|
|
48
|
+
controller: AbortController;
|
|
49
|
+
cleanup: () => void;
|
|
50
|
+
} {
|
|
51
|
+
const validSignals = signals.filter((s): s is AbortSignal => s !== undefined);
|
|
52
|
+
|
|
53
|
+
if (validSignals.length === 0) {
|
|
54
|
+
return {
|
|
55
|
+
controller: new AbortController(),
|
|
56
|
+
cleanup: () => {},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (validSignals.length === 1) {
|
|
61
|
+
// Single signal - no composition needed
|
|
62
|
+
const signal = validSignals[0];
|
|
63
|
+
// Type guard: signal is guaranteed to be defined since validSignals[0] exists
|
|
64
|
+
if (!signal) {
|
|
65
|
+
return { controller: new AbortController(), cleanup: () => {} };
|
|
66
|
+
}
|
|
67
|
+
if (signal.aborted) {
|
|
68
|
+
const controller = new AbortController();
|
|
69
|
+
controller.abort();
|
|
70
|
+
return { controller, cleanup: () => {} };
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
controller: { signal } as AbortController,
|
|
74
|
+
cleanup: () => {},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Use AbortSignal.any() if available (Node 20+, modern browsers)
|
|
79
|
+
// This is more efficient and handles cleanup automatically
|
|
80
|
+
if ("any" in AbortSignal && typeof (AbortSignal as any).any === "function") {
|
|
81
|
+
try {
|
|
82
|
+
const composedSignal = (AbortSignal as any).any(validSignals);
|
|
83
|
+
return {
|
|
84
|
+
controller: { signal: composedSignal } as AbortController,
|
|
85
|
+
cleanup: () => {}, // AbortSignal.any() handles cleanup internally
|
|
86
|
+
};
|
|
87
|
+
} catch {
|
|
88
|
+
// Fall through to manual composition if AbortSignal.any() fails
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Fallback: Manual composition for older environments
|
|
93
|
+
const controller = new AbortController();
|
|
94
|
+
const abortListeners: Array<() => void> = [];
|
|
95
|
+
|
|
96
|
+
for (const signal of validSignals) {
|
|
97
|
+
if (signal.aborted) {
|
|
98
|
+
controller.abort();
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const listener = () => controller.abort();
|
|
103
|
+
signal.addEventListener("abort", listener, { once: true });
|
|
104
|
+
abortListeners.push(() => signal.removeEventListener("abort", listener));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const cleanup = () => {
|
|
108
|
+
for (const remove of abortListeners) {
|
|
109
|
+
remove();
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
return { controller, cleanup };
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Run `next` with a timeout. When the time runs out, the request's signal aborts, and the
|
|
118
|
+
* reader gets one TIMEOUT error item in place of the transport's ABORTED item or thrown error.
|
|
119
|
+
* The middleware does not wait for a transport that ignores the signal.
|
|
120
|
+
*
|
|
121
|
+
* Before, the middleware waited for a thrown error, but the transports yield error items: the
|
|
122
|
+
* reader got "ABORTED" (not retryable), so a per-attempt timeout with retry never retried, and
|
|
123
|
+
* a transport that ignored the signal kept the caller waiting (deep dive TRN-7).
|
|
124
|
+
*/
|
|
125
|
+
async function* runWithTimeout<TReq, TRes>(
|
|
126
|
+
next: ClientRunner<TReq, TRes>,
|
|
127
|
+
context: ClientContext<TReq>,
|
|
128
|
+
ms: number,
|
|
129
|
+
message: string,
|
|
130
|
+
retryable: boolean,
|
|
131
|
+
): AsyncGenerator<ResponseItem<TRes>, void, undefined> {
|
|
132
|
+
const timeoutController = new AbortController();
|
|
133
|
+
const timeoutId = setTimeout(() => timeoutController.abort(), ms);
|
|
134
|
+
|
|
135
|
+
// Compose with existing signal
|
|
136
|
+
const originalSignal = context.message.signal;
|
|
137
|
+
const { controller: composedController, cleanup } = composeAbortSignals(originalSignal, timeoutController.signal);
|
|
138
|
+
context.message.signal = composedController.signal;
|
|
139
|
+
const timedOut = (): boolean => timeoutController.signal.aborted && !originalSignal?.aborted;
|
|
140
|
+
const timeoutItem = (): ResponseItem<TRes> => errorItem<TRes>(context.message.id, "TIMEOUT", message, retryable);
|
|
141
|
+
|
|
142
|
+
const iterator = next(context)[Symbol.asyncIterator]();
|
|
143
|
+
// "running": a next() may be pending; "done": the iterator ended; "abandoned": the timeout won
|
|
144
|
+
let phase: "running" | "done" | "abandoned" = "running";
|
|
145
|
+
try {
|
|
146
|
+
for (;;) {
|
|
147
|
+
const result = await nextOrAbort(iterator, timeoutController.signal);
|
|
148
|
+
if (result === ABORTED_FIRST) {
|
|
149
|
+
phase = "abandoned";
|
|
150
|
+
// The transport did not stop in time: end it in the background, and give the timeout
|
|
151
|
+
void Promise.resolve(iterator.return?.()).catch(() => undefined);
|
|
152
|
+
yield timeoutItem();
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (result.done) {
|
|
156
|
+
phase = "done";
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (result.value.status.type === "error" && timedOut()) {
|
|
160
|
+
// The transport saw the aborted signal and reported ABORTED: it is a timeout
|
|
161
|
+
yield timeoutItem();
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
yield result.value;
|
|
165
|
+
}
|
|
166
|
+
} catch (error) {
|
|
167
|
+
phase = "done";
|
|
168
|
+
if (timedOut()) {
|
|
169
|
+
yield timeoutItem();
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
throw error;
|
|
173
|
+
} finally {
|
|
174
|
+
clearTimeout(timeoutId);
|
|
175
|
+
cleanup();
|
|
176
|
+
// Restore the caller's original signal; we only swapped in the composed signal for this
|
|
177
|
+
// attempt. Leaving the (possibly aborted) composed signal in place poisons subsequent
|
|
178
|
+
// retry attempts with instant aborts. See documentation/BUGS-2026-07.md (H10).
|
|
179
|
+
if (originalSignal) {
|
|
180
|
+
context.message.signal = originalSignal;
|
|
181
|
+
} else {
|
|
182
|
+
delete context.message.signal;
|
|
183
|
+
}
|
|
184
|
+
// The reader stopped early: the transport stops too
|
|
185
|
+
if (phase === "running") await iterator.return?.();
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Create overall timeout middleware.
|
|
191
|
+
*
|
|
192
|
+
* Applies timeout to the entire request, including all retry attempts.
|
|
193
|
+
* If timeout is exceeded, the request is aborted.
|
|
194
|
+
*
|
|
195
|
+
* **Context Override**: metadata.timeout.overall takes precedence over options.
|
|
196
|
+
*
|
|
197
|
+
* @param options - Timeout configuration (defaults, can be overridden per-call)
|
|
198
|
+
* @returns Middleware function
|
|
199
|
+
*
|
|
200
|
+
* @example
|
|
201
|
+
* ```typescript
|
|
202
|
+
* // Create middleware with default timeout
|
|
203
|
+
* client.use(createOverallTimeoutMiddleware({ overall: 5000 }));
|
|
204
|
+
*
|
|
205
|
+
* // Override per-call via context
|
|
206
|
+
* await client.call(method, payload, {
|
|
207
|
+
* context: { timeout: { overall: 10000 } }
|
|
208
|
+
* });
|
|
209
|
+
* ```
|
|
210
|
+
*/
|
|
211
|
+
export function createOverallTimeoutMiddleware(options: Pick<TimeoutOptions, "overall" | "message">): TypedClientMiddleware<TimeoutContext, {}> {
|
|
212
|
+
const { overall: defaultOverall, message = "Overall request timeout" } = options;
|
|
213
|
+
|
|
214
|
+
return <TReq, TRes>(next: ClientRunner<TReq, TRes>): ClientRunner<TReq, TRes> => {
|
|
215
|
+
return async function* (context: ClientContext<TReq>) {
|
|
216
|
+
// Read from metadata first (user-provided context), then fall back to options
|
|
217
|
+
const overall = (context.message.metadata.timeout as TimeoutContext["timeout"] | undefined)?.overall
|
|
218
|
+
?? defaultOverall;
|
|
219
|
+
|
|
220
|
+
if (!overall) {
|
|
221
|
+
// No timeout - passthrough
|
|
222
|
+
yield* next(context);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// The overall timeout ends the request: a retry inside it cannot help
|
|
227
|
+
yield* runWithTimeout(next, context, overall, message, false);
|
|
228
|
+
};
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Create per-attempt timeout middleware.
|
|
234
|
+
*
|
|
235
|
+
* Applies timeout to each individual attempt (useful with retry middleware).
|
|
236
|
+
* Each retry gets a fresh timeout.
|
|
237
|
+
*
|
|
238
|
+
* **Context Override**: metadata.timeout.perAttempt takes precedence over options.
|
|
239
|
+
*
|
|
240
|
+
* @param options - Timeout configuration (defaults, can be overridden per-call)
|
|
241
|
+
* @returns Middleware function
|
|
242
|
+
*
|
|
243
|
+
* @example
|
|
244
|
+
* ```typescript
|
|
245
|
+
* // Create middleware with default timeout
|
|
246
|
+
* client.use(createTimeoutMiddleware({ perAttempt: 1000 }));
|
|
247
|
+
*
|
|
248
|
+
* // Override per-call via context
|
|
249
|
+
* await client.call(method, payload, {
|
|
250
|
+
* context: { timeout: { perAttempt: 2000 } }
|
|
251
|
+
* });
|
|
252
|
+
* ```
|
|
253
|
+
*/
|
|
254
|
+
export function createTimeoutMiddleware(options: Pick<TimeoutOptions, "perAttempt" | "message">): TypedClientMiddleware<TimeoutContext, {}> {
|
|
255
|
+
const { perAttempt: defaultPerAttempt, message = "Request timeout" } = options;
|
|
256
|
+
|
|
257
|
+
return <TReq, TRes>(next: ClientRunner<TReq, TRes>): ClientRunner<TReq, TRes> => {
|
|
258
|
+
return async function* (context: ClientContext<TReq>) {
|
|
259
|
+
// Read from metadata first (user-provided context), then fall back to options
|
|
260
|
+
const perAttempt = (context.message.metadata.timeout as TimeoutContext["timeout"] | undefined)?.perAttempt
|
|
261
|
+
?? defaultPerAttempt;
|
|
262
|
+
|
|
263
|
+
if (!perAttempt) {
|
|
264
|
+
// No timeout - passthrough
|
|
265
|
+
yield* next(context);
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// A retry middleware outside this one can start a new attempt
|
|
270
|
+
yield* runWithTimeout(next, context, perAttempt, message, true);
|
|
271
|
+
};
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Create combined timeout middleware with both overall and per-attempt timeouts.
|
|
277
|
+
*
|
|
278
|
+
* @param options - Timeout configuration
|
|
279
|
+
* @returns Middleware function
|
|
280
|
+
*
|
|
281
|
+
* @example
|
|
282
|
+
* ```typescript
|
|
283
|
+
* client.use(createCombinedTimeoutMiddleware({
|
|
284
|
+
* overall: 5000, // 5 seconds total
|
|
285
|
+
* perAttempt: 1000 // 1 second per attempt
|
|
286
|
+
* }));
|
|
287
|
+
* ```
|
|
288
|
+
*/
|
|
289
|
+
export function createCombinedTimeoutMiddleware(options: TimeoutOptions): TypedClientMiddleware<TimeoutContext, {}> {
|
|
290
|
+
const { overall, perAttempt, message = "Request timeout" } = options;
|
|
291
|
+
|
|
292
|
+
return <TReq, TRes>(next: ClientRunner<TReq, TRes>): ClientRunner<TReq, TRes> => {
|
|
293
|
+
// Compose both timeout middlewares
|
|
294
|
+
let composed: ClientRunner<TReq, TRes> = next;
|
|
295
|
+
|
|
296
|
+
if (perAttempt) {
|
|
297
|
+
const perAttemptMiddleware = createTimeoutMiddleware({ perAttempt, message: `${message} (per-attempt)` }) as ClientMiddleware<TReq, TRes>;
|
|
298
|
+
composed = perAttemptMiddleware(composed);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
if (overall) {
|
|
302
|
+
const overallMiddleware = createOverallTimeoutMiddleware({ overall, message: `${message} (overall)` }) as ClientMiddleware<TReq, TRes>;
|
|
303
|
+
composed = overallMiddleware(composed);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
return composed;
|
|
307
|
+
};
|
|
308
|
+
}
|