@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,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal Error System - Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* Protocol-agnostic error metadata system.
|
|
5
|
+
* Works across HTTP, WebSocket, gRPC, Local transports.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Error severity levels.
|
|
10
|
+
*/
|
|
11
|
+
export enum ErrorSeverity {
|
|
12
|
+
/** Informational - not an actual error */
|
|
13
|
+
INFO = "info",
|
|
14
|
+
/** Warning - degraded but functional */
|
|
15
|
+
WARNING = "warning",
|
|
16
|
+
/** Error - operation failed */
|
|
17
|
+
ERROR = "error",
|
|
18
|
+
/** Critical - system-level failure */
|
|
19
|
+
CRITICAL = "critical",
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Error categories for classification.
|
|
24
|
+
*/
|
|
25
|
+
export enum ErrorCategory {
|
|
26
|
+
/** Network-level errors (connectivity, DNS, etc.) */
|
|
27
|
+
NETWORK = "network",
|
|
28
|
+
/** Client-side errors (validation, configuration) */
|
|
29
|
+
CLIENT = "client",
|
|
30
|
+
/** Server-side errors (5xx, internal errors) */
|
|
31
|
+
SERVER = "server",
|
|
32
|
+
/** Protocol-level errors (parsing, encoding) */
|
|
33
|
+
PROTOCOL = "protocol",
|
|
34
|
+
/** Authentication/authorization errors */
|
|
35
|
+
AUTH = "auth",
|
|
36
|
+
/** Rate limiting and throttling */
|
|
37
|
+
RATE_LIMIT = "rate_limit",
|
|
38
|
+
/** Timeout errors */
|
|
39
|
+
TIMEOUT = "timeout",
|
|
40
|
+
/** Cancellation errors */
|
|
41
|
+
CANCELLED = "cancelled",
|
|
42
|
+
/** Unknown/uncategorized errors */
|
|
43
|
+
UNKNOWN = "unknown",
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Complete error metadata for an error code.
|
|
48
|
+
*
|
|
49
|
+
* Central registry entry containing all information about an error.
|
|
50
|
+
*/
|
|
51
|
+
export interface ErrorMetadata {
|
|
52
|
+
/** Unique error code identifier */
|
|
53
|
+
code: string;
|
|
54
|
+
|
|
55
|
+
/** Short human-readable summary (1 line) */
|
|
56
|
+
summary: string;
|
|
57
|
+
|
|
58
|
+
/** Detailed explanation of what this error means */
|
|
59
|
+
detail: string;
|
|
60
|
+
|
|
61
|
+
/** Error category for classification */
|
|
62
|
+
category: ErrorCategory;
|
|
63
|
+
|
|
64
|
+
/** Whether this error is retryable */
|
|
65
|
+
retryable: boolean;
|
|
66
|
+
|
|
67
|
+
/** Severity level */
|
|
68
|
+
severity: ErrorSeverity;
|
|
69
|
+
|
|
70
|
+
/** End-user friendly message (non-technical) */
|
|
71
|
+
userMessage: string;
|
|
72
|
+
|
|
73
|
+
/** Developer-facing diagnostic message */
|
|
74
|
+
devMessage: string;
|
|
75
|
+
|
|
76
|
+
/** HTTP status code (if applicable) */
|
|
77
|
+
httpStatus?: number;
|
|
78
|
+
|
|
79
|
+
/** Suggested user actions */
|
|
80
|
+
suggestions?: string[];
|
|
81
|
+
|
|
82
|
+
/** Related documentation URL */
|
|
83
|
+
docsUrl?: string;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Error registry - maps error codes to metadata.
|
|
88
|
+
*/
|
|
89
|
+
export type ErrorRegistry = Record<string, ErrorMetadata>;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Error context - runtime information attached to an error.
|
|
93
|
+
*/
|
|
94
|
+
export interface ErrorContext {
|
|
95
|
+
/** Timestamp when error occurred */
|
|
96
|
+
timestamp: number;
|
|
97
|
+
|
|
98
|
+
/** Request ID for correlation */
|
|
99
|
+
requestId?: string;
|
|
100
|
+
|
|
101
|
+
/** Transport that generated the error */
|
|
102
|
+
transport?: string;
|
|
103
|
+
|
|
104
|
+
/** Method that was being called */
|
|
105
|
+
method?: {
|
|
106
|
+
service: string;
|
|
107
|
+
operation: string;
|
|
108
|
+
version?: string;
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
/** Additional runtime context */
|
|
112
|
+
[key: string]: unknown;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Rich error details combining metadata and context.
|
|
117
|
+
*/
|
|
118
|
+
export interface RichError {
|
|
119
|
+
/** Error code from registry */
|
|
120
|
+
code: string;
|
|
121
|
+
|
|
122
|
+
/** Error metadata (summary, detail, etc.) */
|
|
123
|
+
metadata: ErrorMetadata;
|
|
124
|
+
|
|
125
|
+
/** Runtime context */
|
|
126
|
+
context: ErrorContext;
|
|
127
|
+
|
|
128
|
+
/** Original cause (if wrapped) */
|
|
129
|
+
cause?: Error;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Error factory function type.
|
|
134
|
+
*/
|
|
135
|
+
export type ErrorFactory = (
|
|
136
|
+
code: string,
|
|
137
|
+
context?: Partial<ErrorContext>,
|
|
138
|
+
cause?: Error
|
|
139
|
+
) => RichError;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal Client System
|
|
3
|
+
*
|
|
4
|
+
* Protocol-agnostic RPC client with middleware composition.
|
|
5
|
+
* Works with HTTP, gRPC, WebSocket, and local transports.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// Core Client
|
|
9
|
+
export { Client } from "./client.js";
|
|
10
|
+
|
|
11
|
+
// Universal Error System
|
|
12
|
+
export type { ErrorMetadata, ErrorRegistry, ErrorContext, RichError } from "./errors/index.js";
|
|
13
|
+
export { ErrorSeverity, ErrorCategory } from "./errors/index.js";
|
|
14
|
+
export {
|
|
15
|
+
ERROR_REGISTRY,
|
|
16
|
+
getErrorMetadata,
|
|
17
|
+
isKnownError,
|
|
18
|
+
createError,
|
|
19
|
+
createErrorFromHTTPStatus,
|
|
20
|
+
createErrorFromException,
|
|
21
|
+
formatError,
|
|
22
|
+
} from "./errors/index.js";
|
|
23
|
+
|
|
24
|
+
// Transport Adapters
|
|
25
|
+
export { HttpTransport, defaultUrlPattern, restfulHttpMethodStrategy, postOnlyStrategy } from "../adapters/http/client/index.js";
|
|
26
|
+
export type { HttpTransportOptions, UrlStrategy, HttpMethodStrategy } from "../adapters/http/client/index.js";
|
|
27
|
+
|
|
28
|
+
export { LocalTransport } from "../adapters/local/client/index.js";
|
|
29
|
+
export type { LocalTransportOptions, Handler } from "../adapters/local/client/index.js";
|
|
30
|
+
|
|
31
|
+
export { WebSocketTransport } from "../adapters/websocket/client/index.js";
|
|
32
|
+
export type { WebSocketTransportOptions } from "../adapters/websocket/client/index.js";
|
|
33
|
+
// WebSocketState is a runtime enum — export as a value (not type-only) so consumers can compare
|
|
34
|
+
// transport.getState() === WebSocketState.CONNECTED. See documentation/BUGS-2026-07.md (L1).
|
|
35
|
+
export { WebSocketState } from "../adapters/websocket/client/index.js";
|
|
36
|
+
|
|
37
|
+
export { MockTransport, mockBuilder } from "../adapters/mock/client/index.js";
|
|
38
|
+
export type {
|
|
39
|
+
MockTransportOptions,
|
|
40
|
+
MockResponse,
|
|
41
|
+
ResponseMatcher,
|
|
42
|
+
CallHistoryEntry,
|
|
43
|
+
} from "../adapters/mock/client//index.js";
|
|
44
|
+
|
|
45
|
+
// Middleware
|
|
46
|
+
export { createRetryMiddleware } from "./middleware/retry.js";``
|
|
47
|
+
export type { RetryOptions } from "./middleware/retry.js";
|
|
48
|
+
|
|
49
|
+
export { createCacheMiddleware } from "./middleware/cache.js";
|
|
50
|
+
export type { CacheOptions, CacheStats } from "./middleware/cache.js";
|
|
51
|
+
|
|
52
|
+
export {
|
|
53
|
+
createTimeoutMiddleware,
|
|
54
|
+
createOverallTimeoutMiddleware,
|
|
55
|
+
createCombinedTimeoutMiddleware,
|
|
56
|
+
} from "./middleware/timeout.js";
|
|
57
|
+
export type { TimeoutOptions } from "./middleware/timeout.js";
|
|
58
|
+
|
|
59
|
+
export { createPaginationMiddleware, paginateAll } from "./middleware/pagination.js";
|
|
60
|
+
export type { PaginationOptions } from "./middleware/pagination.js";
|
|
61
|
+
export { createCircuitBreakerMiddleware, CircuitBreakerError } from "./middleware/circuit-breaker.js";
|
|
62
|
+
export type { CircuitBreakerOptions, CircuitBreakerStats, CircuitState } from "./middleware/circuit-breaker.js";
|
|
63
|
+
|
|
64
|
+
export { createRateLimitMiddleware, createPerServiceRateLimiter, RateLimitError } from "./middleware/rate-limit.js";
|
|
65
|
+
export type { RateLimitOptions, RateLimitStats } from "./middleware/rate-limit.js";
|
|
66
|
+
|
|
67
|
+
export {
|
|
68
|
+
createAuthMiddleware,
|
|
69
|
+
createBearerAuthMiddleware,
|
|
70
|
+
createApiKeyAuthMiddleware,
|
|
71
|
+
} from "./middleware/auth.js";
|
|
72
|
+
export type { AuthOptions } from "./middleware/auth.js";
|
|
73
|
+
|
|
74
|
+
export {
|
|
75
|
+
createTracingMiddleware,
|
|
76
|
+
createSimpleTracingMiddleware,
|
|
77
|
+
extractTracingInfo,
|
|
78
|
+
} from "./middleware/tracing.js";
|
|
79
|
+
export type { TracingOptions } from "./middleware/tracing.js";
|
|
80
|
+
|
|
81
|
+
// Zod Validation Middleware
|
|
82
|
+
export { createZodMiddleware, ValidationError, methodToKey, keyToMethod } from "./validation/index.js";
|
|
83
|
+
export type {
|
|
84
|
+
ZodMiddlewareOptions,
|
|
85
|
+
ValidationMode,
|
|
86
|
+
ZodLike,
|
|
87
|
+
ZodErrorLike,
|
|
88
|
+
SchemaDefinition,
|
|
89
|
+
ValidationPhase,
|
|
90
|
+
ZodValidationContext,
|
|
91
|
+
} from "./validation/index.js";
|
|
92
|
+
|
|
93
|
+
// Context System
|
|
94
|
+
export { mergeContext, normalizeCallOptions, isCallOptions } from "./context.js";
|
|
95
|
+
export type { CallOptions, ClientContextInput, MiddlewareContextFields, SchemaOverride } from "./context.js";
|
|
96
|
+
|
|
97
|
+
// Core Types
|
|
98
|
+
export type {
|
|
99
|
+
Transport,
|
|
100
|
+
Method,
|
|
101
|
+
Metadata,
|
|
102
|
+
Message,
|
|
103
|
+
ResponseItem,
|
|
104
|
+
Status,
|
|
105
|
+
ClientContext,
|
|
106
|
+
ClientRunner,
|
|
107
|
+
ClientMiddleware,
|
|
108
|
+
ClientOptions,
|
|
109
|
+
} from "./types.js";
|
|
110
|
+
|
|
111
|
+
export { ClientError } from "./types.js";
|
|
112
|
+
|
|
113
|
+
// Typed Caller
|
|
114
|
+
export { createTypedCaller } from "./typed.js";
|
|
115
|
+
export type {
|
|
116
|
+
TypedCaller,
|
|
117
|
+
BaseCaller,
|
|
118
|
+
ProcedureDef,
|
|
119
|
+
ProcedureNamespace,
|
|
120
|
+
ProcedurePaths,
|
|
121
|
+
PathInput,
|
|
122
|
+
PathOutput,
|
|
123
|
+
MergeProcedures,
|
|
124
|
+
} from "./typed.js";
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication Middleware
|
|
3
|
+
*
|
|
4
|
+
* Adds authentication metadata to requests.
|
|
5
|
+
* Works with ALL transports (HTTP, WebSocket, Local, Mock).
|
|
6
|
+
*
|
|
7
|
+
* Each transport converts metadata.auth to its protocol format:
|
|
8
|
+
* - HTTP: Authorization header, X-API-Key header
|
|
9
|
+
* - WebSocket: Frame metadata
|
|
10
|
+
* - Local: Passed directly to handler
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { TypedClientMiddleware } from "../types.js";
|
|
14
|
+
import type { AuthContext } from "./contexts.js";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Authentication Options
|
|
18
|
+
*/
|
|
19
|
+
export interface AuthOptions {
|
|
20
|
+
/** Bearer token for Authorization header */
|
|
21
|
+
token?: string;
|
|
22
|
+
|
|
23
|
+
/** API key for X-API-Key header */
|
|
24
|
+
apiKey?: string;
|
|
25
|
+
|
|
26
|
+
/** User ID for context */
|
|
27
|
+
userId?: string;
|
|
28
|
+
|
|
29
|
+
/** Additional custom auth fields */
|
|
30
|
+
[key: string]: unknown;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Create authentication middleware
|
|
35
|
+
*
|
|
36
|
+
* Adds auth metadata to all requests. The transport layer
|
|
37
|
+
* converts this to protocol-specific format.
|
|
38
|
+
*
|
|
39
|
+
* **Context Override**: User-provided context (via withContext or per-call)
|
|
40
|
+
* takes precedence. Middleware options serve as defaults.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* // Create middleware with default auth
|
|
45
|
+
* client.use(createAuthMiddleware({ token: "default-token" }));
|
|
46
|
+
*
|
|
47
|
+
* // Override per-call via context
|
|
48
|
+
* await client.call(method, payload, {
|
|
49
|
+
* context: { auth: { token: "override-token" } }
|
|
50
|
+
* });
|
|
51
|
+
* ```
|
|
52
|
+
*
|
|
53
|
+
* @example Bearer Token
|
|
54
|
+
* ```typescript
|
|
55
|
+
* createAuthMiddleware({ token: process.env.API_TOKEN })
|
|
56
|
+
* // HTTP: Authorization: Bearer abc123
|
|
57
|
+
* // WebSocket: frame.metadata.auth.token
|
|
58
|
+
* ```
|
|
59
|
+
*
|
|
60
|
+
* @example API Key
|
|
61
|
+
* ```typescript
|
|
62
|
+
* createAuthMiddleware({ apiKey: process.env.API_KEY })
|
|
63
|
+
* // HTTP: X-API-Key: xyz789
|
|
64
|
+
* // WebSocket: frame.metadata.auth.apiKey
|
|
65
|
+
* ```
|
|
66
|
+
*
|
|
67
|
+
* @example Dynamic Auth (from function)
|
|
68
|
+
* ```typescript
|
|
69
|
+
* createAuthMiddleware(() => ({
|
|
70
|
+
* token: getTokenFromStore(),
|
|
71
|
+
* userId: getCurrentUserId(),
|
|
72
|
+
* }))
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
export function createAuthMiddleware(
|
|
76
|
+
authOptionsOrFn: AuthOptions | (() => AuthOptions)
|
|
77
|
+
): TypedClientMiddleware<AuthContext, {}> {
|
|
78
|
+
return (next) => async function* (context) {
|
|
79
|
+
// Get auth options (static or dynamic)
|
|
80
|
+
const authOptions = typeof authOptionsOrFn === "function"
|
|
81
|
+
? authOptionsOrFn()
|
|
82
|
+
: authOptionsOrFn;
|
|
83
|
+
|
|
84
|
+
// Merge: middleware defaults first, then user-provided context takes precedence
|
|
85
|
+
// User context is already in metadata.auth from Client.stream()
|
|
86
|
+
context.message.metadata.auth = {
|
|
87
|
+
...authOptions, // Middleware defaults
|
|
88
|
+
...context.message.metadata.auth, // User context overrides
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// Continue middleware chain
|
|
92
|
+
yield* next(context);
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Create Bearer token auth middleware (convenience)
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* createBearerAuthMiddleware("abc123")
|
|
102
|
+
* // Equivalent to: createAuthMiddleware({ token: "abc123" })
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
export function createBearerAuthMiddleware(
|
|
106
|
+
tokenOrFn: string | (() => string)
|
|
107
|
+
): TypedClientMiddleware<AuthContext, {}> {
|
|
108
|
+
return createAuthMiddleware(
|
|
109
|
+
typeof tokenOrFn === "function"
|
|
110
|
+
? () => ({ token: tokenOrFn() })
|
|
111
|
+
: { token: tokenOrFn }
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Create API key auth middleware (convenience)
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```typescript
|
|
120
|
+
* createApiKeyAuthMiddleware("xyz789")
|
|
121
|
+
* // Equivalent to: createAuthMiddleware({ apiKey: "xyz789" })
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
export function createApiKeyAuthMiddleware(
|
|
125
|
+
apiKeyOrFn: string | (() => string)
|
|
126
|
+
): TypedClientMiddleware<AuthContext, {}> {
|
|
127
|
+
return createAuthMiddleware(
|
|
128
|
+
typeof apiKeyOrFn === "function"
|
|
129
|
+
? () => ({ apiKey: apiKeyOrFn() })
|
|
130
|
+
: { apiKey: apiKeyOrFn }
|
|
131
|
+
);
|
|
132
|
+
}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal Cache Middleware
|
|
3
|
+
*
|
|
4
|
+
* Protocol-agnostic caching with LRU eviction and TTL expiration.
|
|
5
|
+
* Works with any transport!
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { ClientRunner, ClientContext, ResponseItem, Metadata, Method, TypedClientMiddleware } from "../types.js";
|
|
9
|
+
import type { CacheContext } from "./contexts.js";
|
|
10
|
+
import { LruMap } from "./lru.js";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Cache middleware options.
|
|
14
|
+
*/
|
|
15
|
+
export interface CacheOptions {
|
|
16
|
+
/**
|
|
17
|
+
* The methods whose responses the middleware caches: a list of `"service.operation"` names,
|
|
18
|
+
* or a predicate. Caching is opt-in for each method: before, the middleware cached every
|
|
19
|
+
* call, mutations too (deep dive TRN-5).
|
|
20
|
+
*/
|
|
21
|
+
methods: readonly string[] | ((method: Method) => boolean);
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Time-to-live for cache entries in milliseconds. A call can give its own: `cache: { ttl }`.
|
|
25
|
+
* @default 60000 (1 minute)
|
|
26
|
+
*/
|
|
27
|
+
ttl?: number;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Maximum number of cache entries (LRU eviction when exceeded).
|
|
31
|
+
* @default 100
|
|
32
|
+
*/
|
|
33
|
+
capacity?: number;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Optional callback for cache statistics.
|
|
37
|
+
* Called periodically with hit/miss/eviction metrics.
|
|
38
|
+
*/
|
|
39
|
+
onStats?: (stats: CacheStats) => void;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Interval in milliseconds for emitting cache statistics.
|
|
43
|
+
* Only used if onStats is provided.
|
|
44
|
+
* @default 60000 (1 minute)
|
|
45
|
+
*/
|
|
46
|
+
statsInterval?: number;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Custom cache key generator.
|
|
50
|
+
* Default: the method, the payload and the request metadata (see `defaultKeyGenerator`).
|
|
51
|
+
*
|
|
52
|
+
* @param method - Method being called
|
|
53
|
+
* @param payload - Request payload
|
|
54
|
+
* @param metadata - Request metadata (auth, pagination, custom fields)
|
|
55
|
+
* @returns Cache key string
|
|
56
|
+
*/
|
|
57
|
+
keyGenerator?: (method: Method, payload: unknown, metadata: Metadata) => string;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Predicate to determine if a response should be cached.
|
|
61
|
+
* Default: Only cache successful responses
|
|
62
|
+
*
|
|
63
|
+
* @param item - Response item
|
|
64
|
+
* @returns true if response should be cached
|
|
65
|
+
*/
|
|
66
|
+
shouldCache?: (item: ResponseItem<unknown>) => boolean;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Cache performance statistics.
|
|
71
|
+
*/
|
|
72
|
+
export interface CacheStats {
|
|
73
|
+
/** Number of cache hits */
|
|
74
|
+
hits: number;
|
|
75
|
+
/** Number of cache misses */
|
|
76
|
+
misses: number;
|
|
77
|
+
/** Current cache size */
|
|
78
|
+
size: number;
|
|
79
|
+
/** Number of entries evicted */
|
|
80
|
+
evictions: number;
|
|
81
|
+
/** Hit rate as a percentage (0-100) */
|
|
82
|
+
hitRate: number;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Deterministic stringify for cache keys: recursively sorts object keys at every depth, so
|
|
87
|
+
* payloads that are structurally equal (regardless of key order) map to the same key, and
|
|
88
|
+
* null / primitive / array payloads are handled without throwing.
|
|
89
|
+
*
|
|
90
|
+
* Replaces a prior `JSON.stringify(payload, Object.keys(payload).sort())` which misused the
|
|
91
|
+
* array-replacer form of JSON.stringify: that filters keys at *every* depth (so `{filter:{a:1}}`
|
|
92
|
+
* and `{filter:{b:2}}` collided to the same key and returned each other's cached response) and
|
|
93
|
+
* threw `TypeError` on null/primitive payloads. See documentation/BUGS-2026-07.md (C1).
|
|
94
|
+
*/
|
|
95
|
+
export function stableStringify(value: unknown): string {
|
|
96
|
+
if (typeof value === "bigint") return `${value}n`;
|
|
97
|
+
if (value === null || typeof value !== "object") {
|
|
98
|
+
// Primitives — and undefined/function/symbol (JSON.stringify → undefined): never throw.
|
|
99
|
+
return JSON.stringify(value) ?? String(value);
|
|
100
|
+
}
|
|
101
|
+
if (Array.isArray(value)) {
|
|
102
|
+
return `[${value.map(stableStringify).join(",")}]`;
|
|
103
|
+
}
|
|
104
|
+
const obj = value as Record<string, unknown>;
|
|
105
|
+
const body = Object.keys(obj)
|
|
106
|
+
.sort()
|
|
107
|
+
.map((key) => `${JSON.stringify(key)}:${stableStringify(obj[key])}`)
|
|
108
|
+
.join(",");
|
|
109
|
+
return `{${body}}`;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* The metadata keys that do not change a response: middleware state and tracing. The other
|
|
114
|
+
* keys (auth, pagination, custom fields) are part of the cache key.
|
|
115
|
+
*/
|
|
116
|
+
const VOLATILE_METADATA = new Set(["retry", "timeout", "tracing", "cache", "circuitBreaker", "rateLimit"]);
|
|
117
|
+
|
|
118
|
+
/** The part of the metadata that can change a response. */
|
|
119
|
+
function keyMetadata(metadata: Metadata): Record<string, unknown> {
|
|
120
|
+
const out: Record<string, unknown> = {};
|
|
121
|
+
for (const [key, value] of Object.entries(metadata)) {
|
|
122
|
+
if (VOLATILE_METADATA.has(key) || key.startsWith("__") || value === undefined) continue;
|
|
123
|
+
out[key] = value;
|
|
124
|
+
}
|
|
125
|
+
return out;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Default cache key generator: the method, the payload and the metadata that can change the
|
|
130
|
+
* response. Before, the key ignored the metadata: with `withContext({ auth })`, one user got
|
|
131
|
+
* the cached response of another user, and a pagination cursor in the metadata returned the
|
|
132
|
+
* first page forever (deep dive TRN-5).
|
|
133
|
+
*/
|
|
134
|
+
export function defaultKeyGenerator(method: Method, payload: unknown, metadata?: Metadata): string {
|
|
135
|
+
const methodKey = method.version
|
|
136
|
+
? `${method.version}:${method.service}.${method.operation}`
|
|
137
|
+
: `${method.service}.${method.operation}`;
|
|
138
|
+
|
|
139
|
+
const base = `${methodKey}:${stableStringify(payload)}`;
|
|
140
|
+
return metadata ? `${base}|${stableStringify(keyMetadata(metadata))}` : base;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** A deep copy of a cache entry, or undefined when the payload cannot be copied. */
|
|
144
|
+
function copyItem<T>(item: ResponseItem<T>): ResponseItem<T> | undefined {
|
|
145
|
+
try {
|
|
146
|
+
return structuredClone(item);
|
|
147
|
+
} catch {
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** A stored response and the time at which it expires. */
|
|
153
|
+
interface CacheEntry {
|
|
154
|
+
items: ResponseItem<unknown>[];
|
|
155
|
+
expiresAt: number;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/** The overrides of one call: `cache: { ttl, bypass, refresh }` in its context. */
|
|
159
|
+
function cacheOverrides(value: unknown): { ttl?: number; bypass?: boolean; refresh?: boolean } {
|
|
160
|
+
if (typeof value !== "object" || value === null) return {};
|
|
161
|
+
const { ttl, bypass, refresh } = value as Record<string, unknown>;
|
|
162
|
+
return {
|
|
163
|
+
...(typeof ttl === "number" && ttl >= 0 ? { ttl } : {}),
|
|
164
|
+
...(bypass === true ? { bypass: true } : {}),
|
|
165
|
+
...(refresh === true ? { refresh: true } : {}),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Default should cache predicate - only cache successful responses.
|
|
171
|
+
*/
|
|
172
|
+
function defaultShouldCache(item: ResponseItem<unknown>): boolean {
|
|
173
|
+
return item.status.type === "success";
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Create cache middleware with LRU eviction and TTL expiration.
|
|
178
|
+
*
|
|
179
|
+
* Memory management:
|
|
180
|
+
* - LRU eviction when capacity is reached (bounded memory, a small map of the core)
|
|
181
|
+
* - Each entry has its own expiry time, so a call can give its own TTL
|
|
182
|
+
*
|
|
183
|
+
* Each call can give overrides in its context (`route()` overrides, or `withContext`):
|
|
184
|
+
* `cache: { ttl }` for the entry that it stores, `cache: { bypass: true }` to skip the cache, and
|
|
185
|
+
* `cache: { refresh: true }` to fetch and replace the stored response. After the call, the
|
|
186
|
+
* context has `cache.hit` (CacheContext).
|
|
187
|
+
*
|
|
188
|
+
* Features:
|
|
189
|
+
* - Protocol-agnostic: Works with HTTP, gRPC, WebSocket, local
|
|
190
|
+
* - Automatic eviction: LRU + TTL composition
|
|
191
|
+
* - Observable: Optional stats callback
|
|
192
|
+
* - Customizable: Custom key generation and cache predicates
|
|
193
|
+
*
|
|
194
|
+
* @param options - Cache configuration options
|
|
195
|
+
* @returns Middleware function
|
|
196
|
+
*
|
|
197
|
+
* @example
|
|
198
|
+
* ```typescript
|
|
199
|
+
* client.use(createCacheMiddleware({
|
|
200
|
+
* methods: ["users.get", "users.list"], // only these calls are cached
|
|
201
|
+
* capacity: 100,
|
|
202
|
+
* ttl: 60000, // 1 minute
|
|
203
|
+
* onStats: (stats) => console.log(`Hit rate: ${stats.hitRate}%`)
|
|
204
|
+
* }));
|
|
205
|
+
* ```
|
|
206
|
+
*/
|
|
207
|
+
export function createCacheMiddleware(options: CacheOptions): TypedClientMiddleware<CacheContext, {}> {
|
|
208
|
+
const {
|
|
209
|
+
methods,
|
|
210
|
+
ttl = 60000,
|
|
211
|
+
capacity = 100,
|
|
212
|
+
onStats,
|
|
213
|
+
statsInterval = 60000,
|
|
214
|
+
keyGenerator = defaultKeyGenerator,
|
|
215
|
+
shouldCache = defaultShouldCache,
|
|
216
|
+
} = options;
|
|
217
|
+
|
|
218
|
+
// An LRU map bounds the memory. Each entry keeps its own expiry time, so a call can give its
|
|
219
|
+
// own TTL: before, one TTL map expired every entry after the TTL of the middleware.
|
|
220
|
+
const cache = new LruMap<string, CacheEntry>(capacity, () => {
|
|
221
|
+
stats.evictions++;
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
// Track cache statistics
|
|
225
|
+
const stats = {
|
|
226
|
+
hits: 0,
|
|
227
|
+
misses: 0,
|
|
228
|
+
evictions: 0,
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
// Emit stats periodically if callback provided
|
|
232
|
+
if (onStats) {
|
|
233
|
+
const statsTimer = setInterval(() => {
|
|
234
|
+
const total = stats.hits + stats.misses;
|
|
235
|
+
const hitRate = total > 0 ? (stats.hits / total) * 100 : 0;
|
|
236
|
+
|
|
237
|
+
onStats({
|
|
238
|
+
hits: stats.hits,
|
|
239
|
+
misses: stats.misses,
|
|
240
|
+
size: cache.size,
|
|
241
|
+
evictions: stats.evictions,
|
|
242
|
+
hitRate: Math.round(hitRate * 100) / 100, // Round to 2 decimal places
|
|
243
|
+
});
|
|
244
|
+
}, statsInterval);
|
|
245
|
+
// Unref so the stats timer never keeps the process alive on its own (its lifecycle is tied
|
|
246
|
+
// to the client, not the event loop). See documentation/BUGS-2026-07.md (M4).
|
|
247
|
+
statsTimer.unref?.();
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const cacheable =
|
|
251
|
+
typeof methods === "function"
|
|
252
|
+
? methods
|
|
253
|
+
: ((names: ReadonlySet<string>) => (method: Method): boolean => names.has(`${method.service}.${method.operation}`))(
|
|
254
|
+
new Set(methods),
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
return <TReq, TRes>(next: ClientRunner<TReq, TRes>): ClientRunner<TReq, TRes> => {
|
|
258
|
+
return async function* (context: ClientContext<TReq>) {
|
|
259
|
+
if (!cacheable(context.message.method)) {
|
|
260
|
+
yield* next(context);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
const metadata = context.message.metadata;
|
|
265
|
+
const overrides = cacheOverrides(metadata["cache"]);
|
|
266
|
+
// The state for the outer middlewares (CacheContext). The key is not written: it holds the
|
|
267
|
+
// payload, and the metadata of a retry travels in a header.
|
|
268
|
+
const setState = (hit: boolean): void => {
|
|
269
|
+
metadata["cache"] = { ...overrides, hit };
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
if (overrides.bypass) {
|
|
273
|
+
yield* next(context);
|
|
274
|
+
setState(false);
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// Generate cache key
|
|
279
|
+
const cacheKey = keyGenerator(context.message.method, context.message.payload, metadata);
|
|
280
|
+
|
|
281
|
+
// Check cache - use has() to avoid throwing "Key not found" error. A refresh skips the read.
|
|
282
|
+
if (!overrides.refresh && cache.has(cacheKey)) {
|
|
283
|
+
const cached = cache.get(cacheKey);
|
|
284
|
+
if (cached && cached.expiresAt > Date.now()) {
|
|
285
|
+
// Cache hit - yield a copy: a caller that changes its result does not change the cache
|
|
286
|
+
stats.hits++;
|
|
287
|
+
setState(true);
|
|
288
|
+
for (const item of cached.items) {
|
|
289
|
+
yield (copyItem(item) ?? item) as ResponseItem<TRes>;
|
|
290
|
+
}
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
// Expired
|
|
294
|
+
cache.delete(cacheKey);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Cache miss - fetch and store. Only a response of one item is cached: a stream is never
|
|
298
|
+
// collected or cached (before, the middleware kept every item of a stream in memory).
|
|
299
|
+
stats.misses++;
|
|
300
|
+
let first: ResponseItem<TRes> | undefined;
|
|
301
|
+
let count = 0;
|
|
302
|
+
|
|
303
|
+
for await (const item of next(context)) {
|
|
304
|
+
count++;
|
|
305
|
+
if (count === 1) first = item;
|
|
306
|
+
yield item;
|
|
307
|
+
}
|
|
308
|
+
setState(false);
|
|
309
|
+
|
|
310
|
+
if (count === 1 && first && shouldCache(first)) {
|
|
311
|
+
const copy = copyItem(first);
|
|
312
|
+
if (copy) cache.set(cacheKey, { items: [copy as ResponseItem<unknown>], expiresAt: Date.now() + (overrides.ttl ?? ttl) });
|
|
313
|
+
}
|
|
314
|
+
};
|
|
315
|
+
};
|
|
316
|
+
}
|