@procedures/client 0.0.0-stage → 0.1.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 +16 -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 +561 -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 +48 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +86 -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 +517 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +990 -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 +296 -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/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 +201 -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 +198 -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 +637 -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 +156 -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 +585 -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 +273 -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 +239 -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 +270 -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 +268 -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 +208 -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 +356 -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/index.d.ts +24 -0
- package/dist/procedures/index.d.ts.map +1 -0
- package/dist/procedures/index.js +69 -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 +193 -0
- package/dist/procedures/interceptors.js.map +1 -0
- package/dist/procedures/invoke.d.ts +127 -0
- package/dist/procedures/invoke.d.ts.map +1 -0
- package/dist/procedures/invoke.js +277 -0
- package/dist/procedures/invoke.js.map +1 -0
- package/dist/procedures/module.d.ts +49 -0
- package/dist/procedures/module.d.ts.map +1 -0
- package/dist/procedures/module.js +93 -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 +370 -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/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 +59 -0
- package/dist/server/host-policy.d.ts.map +1 -0
- package/dist/server/host-policy.js +82 -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 +212 -0
- package/dist/server/procedure-server.d.ts.map +1 -0
- package/dist/server/procedure-server.js +323 -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 +115 -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 +622 -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 +373 -0
- package/src/client/batch-executor.ts +514 -0
- package/src/client/call-types.ts +491 -0
- package/src/client/client.ts +1202 -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 +361 -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/cli/announce.ts +470 -0
- package/src/procedures/cli/discover.ts +390 -0
- package/src/procedures/cli/index.ts +229 -0
- package/src/procedures/cli/init.ts +370 -0
- package/src/procedures/collection/index.ts +51 -0
- package/src/procedures/collection/procedures.ts +245 -0
- package/src/procedures/collection/schemas.ts +550 -0
- package/src/procedures/collection/storage.ts +53 -0
- package/src/procedures/core/array.ts +1024 -0
- package/src/procedures/core/comparison.ts +263 -0
- package/src/procedures/core/index.ts +895 -0
- package/src/procedures/core/logic.ts +225 -0
- package/src/procedures/core/math.ts +469 -0
- package/src/procedures/core/meta.ts +384 -0
- package/src/procedures/core/object.ts +427 -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 +458 -0
- package/src/procedures/core/type.ts +344 -0
- package/src/procedures/define-procedure.ts +531 -0
- package/src/procedures/define.ts +387 -0
- package/src/procedures/discovery.ts +76 -0
- package/src/procedures/index.ts +228 -0
- package/src/procedures/interceptors.ts +272 -0
- package/src/procedures/invoke.ts +413 -0
- package/src/procedures/module.ts +107 -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 +485 -0
- package/src/server/browser-guard.ts +147 -0
- package/src/server/host-policy.ts +121 -0
- package/src/server/index.ts +70 -0
- package/src/server/method.ts +33 -0
- package/src/server/procedure-server.ts +417 -0
- package/src/server/server.ts +364 -0
- package/src/server/types.ts +147 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batching Middleware
|
|
3
|
+
*
|
|
4
|
+
* Combines multiple requests into a single batch for efficiency.
|
|
5
|
+
* Reduces network overhead and improves throughput.
|
|
6
|
+
*
|
|
7
|
+
* Works with both client and server!
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Batch queue for collecting requests.
|
|
11
|
+
*/
|
|
12
|
+
class BatchQueue {
|
|
13
|
+
options;
|
|
14
|
+
processBatch;
|
|
15
|
+
requests = new Map();
|
|
16
|
+
timers = new Map();
|
|
17
|
+
stats = {
|
|
18
|
+
totalRequests: 0,
|
|
19
|
+
totalBatches: 0,
|
|
20
|
+
};
|
|
21
|
+
constructor(options, processBatch) {
|
|
22
|
+
this.options = options;
|
|
23
|
+
this.processBatch = processBatch;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Add request to batch queue.
|
|
27
|
+
*/
|
|
28
|
+
add(key, request) {
|
|
29
|
+
this.stats.totalRequests++;
|
|
30
|
+
// Get or create batch for this key
|
|
31
|
+
let batch = this.requests.get(key);
|
|
32
|
+
if (!batch) {
|
|
33
|
+
batch = [];
|
|
34
|
+
this.requests.set(key, batch);
|
|
35
|
+
}
|
|
36
|
+
batch.push(request);
|
|
37
|
+
// Check if batch is full
|
|
38
|
+
if (batch.length >= this.options.maxBatchSize) {
|
|
39
|
+
this.flush(key);
|
|
40
|
+
}
|
|
41
|
+
else if (batch.length === 1) {
|
|
42
|
+
// First request in batch - start timer
|
|
43
|
+
this.startTimer(key);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Start timer for batch.
|
|
48
|
+
*/
|
|
49
|
+
startTimer(key) {
|
|
50
|
+
const timer = setTimeout(() => {
|
|
51
|
+
this.flush(key);
|
|
52
|
+
}, this.options.maxWaitTime);
|
|
53
|
+
this.timers.set(key, timer);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Flush batch (send it).
|
|
57
|
+
*/
|
|
58
|
+
flush(key) {
|
|
59
|
+
const batch = this.requests.get(key);
|
|
60
|
+
if (!batch || batch.length === 0) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// Clear timer
|
|
64
|
+
const timer = this.timers.get(key);
|
|
65
|
+
if (timer) {
|
|
66
|
+
clearTimeout(timer);
|
|
67
|
+
this.timers.delete(key);
|
|
68
|
+
}
|
|
69
|
+
// Remove from queue
|
|
70
|
+
this.requests.delete(key);
|
|
71
|
+
// Update stats
|
|
72
|
+
this.stats.totalBatches++;
|
|
73
|
+
// Notify callback
|
|
74
|
+
if (this.options.onBatchSent) {
|
|
75
|
+
this.options.onBatchSent(batch.length, key);
|
|
76
|
+
}
|
|
77
|
+
// Process batch
|
|
78
|
+
this.processBatch(key, batch);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get statistics.
|
|
82
|
+
*/
|
|
83
|
+
getStats() {
|
|
84
|
+
let pendingRequests = 0;
|
|
85
|
+
for (const batch of this.requests.values()) {
|
|
86
|
+
pendingRequests += batch.length;
|
|
87
|
+
}
|
|
88
|
+
const averageBatchSize = this.stats.totalBatches > 0
|
|
89
|
+
? this.stats.totalRequests / this.stats.totalBatches
|
|
90
|
+
: 0;
|
|
91
|
+
return {
|
|
92
|
+
totalRequests: this.stats.totalRequests,
|
|
93
|
+
totalBatches: this.stats.totalBatches,
|
|
94
|
+
averageBatchSize,
|
|
95
|
+
pendingRequests,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Create batching middleware.
|
|
101
|
+
*
|
|
102
|
+
* Automatically combines multiple requests into batches for efficiency.
|
|
103
|
+
*
|
|
104
|
+
* @param options - Batching configuration
|
|
105
|
+
* @returns Middleware function
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* ```typescript
|
|
109
|
+
* client.use(createBatchingMiddleware({
|
|
110
|
+
* maxBatchSize: 10, // Combine up to 10 requests
|
|
111
|
+
* maxWaitTime: 10, // Wait max 10ms before sending
|
|
112
|
+
* sameServiceOnly: true // Only batch requests to same service
|
|
113
|
+
* }));
|
|
114
|
+
* ```
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```typescript
|
|
118
|
+
* // Custom batching by operation
|
|
119
|
+
* client.use(createBatchingMiddleware({
|
|
120
|
+
* getBatchKey: (msg) => `${msg.method.service}:${msg.method.operation}`
|
|
121
|
+
* }));
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
export function createBatchingMiddleware(options = {}) {
|
|
125
|
+
const sameServiceOnly = options.sameServiceOnly ?? true;
|
|
126
|
+
const opts = {
|
|
127
|
+
maxBatchSize: options.maxBatchSize ?? 10,
|
|
128
|
+
maxWaitTime: options.maxWaitTime ?? 10,
|
|
129
|
+
sameServiceOnly,
|
|
130
|
+
getBatchKey: options.getBatchKey ??
|
|
131
|
+
((msg) => sameServiceOnly
|
|
132
|
+
? msg.method.service
|
|
133
|
+
: "__all__"),
|
|
134
|
+
...(options.onBatchSent !== undefined && { onBatchSent: options.onBatchSent }),
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* Process a batch of requests.
|
|
138
|
+
*/
|
|
139
|
+
async function processBatch(_key, requests) {
|
|
140
|
+
// Note: This is a simplified implementation.
|
|
141
|
+
// In practice, you'd need transport-level support for batching.
|
|
142
|
+
// The transport would need to:
|
|
143
|
+
// 1. Accept multiple messages
|
|
144
|
+
// 2. Send them in a single network request
|
|
145
|
+
// 3. Return multiple responses
|
|
146
|
+
// 4. Match responses to requests by ID
|
|
147
|
+
// For now, we execute requests individually
|
|
148
|
+
// Real batching requires transport cooperation
|
|
149
|
+
for (const request of requests) {
|
|
150
|
+
try {
|
|
151
|
+
const response = request.next(request.context);
|
|
152
|
+
request.resolve(response);
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
request.reject(error);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Create shared batch queue
|
|
160
|
+
const queue = new BatchQueue(opts, processBatch);
|
|
161
|
+
return (next) => {
|
|
162
|
+
return async function* (context) {
|
|
163
|
+
// Get batch key for this request
|
|
164
|
+
const key = opts.getBatchKey(context.message);
|
|
165
|
+
// Create promise for batched response
|
|
166
|
+
const responsePromise = new Promise((resolve, reject) => {
|
|
167
|
+
queue.add(key, {
|
|
168
|
+
context,
|
|
169
|
+
next: next,
|
|
170
|
+
resolve: resolve,
|
|
171
|
+
reject,
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
// Wait for batch to complete and yield response
|
|
175
|
+
const response = await responsePromise;
|
|
176
|
+
yield* response;
|
|
177
|
+
};
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Get batching statistics.
|
|
182
|
+
*
|
|
183
|
+
* Note: This is a placeholder - proper implementation would
|
|
184
|
+
* require exposing the queue through the middleware instance.
|
|
185
|
+
*/
|
|
186
|
+
export function getBatchingStats(_middleware) {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Create adaptive batching middleware.
|
|
191
|
+
*
|
|
192
|
+
* Automatically adjusts batch size based on request patterns.
|
|
193
|
+
*
|
|
194
|
+
* @example
|
|
195
|
+
* ```typescript
|
|
196
|
+
* client.use(createAdaptiveBatchingMiddleware({
|
|
197
|
+
* minBatchSize: 2,
|
|
198
|
+
* maxBatchSize: 50,
|
|
199
|
+
* targetLatency: 20 // Target 20ms latency
|
|
200
|
+
* }));
|
|
201
|
+
* ```
|
|
202
|
+
*/
|
|
203
|
+
export function createAdaptiveBatchingMiddleware(options = {}) {
|
|
204
|
+
const { minBatchSize = 2, maxBatchSize = 50, targetLatency = 20, } = options;
|
|
205
|
+
let currentBatchSize = minBatchSize;
|
|
206
|
+
let recentLatencies = [];
|
|
207
|
+
/**
|
|
208
|
+
* Adjust batch size based on latency.
|
|
209
|
+
*/
|
|
210
|
+
function adjustBatchSize() {
|
|
211
|
+
if (recentLatencies.length < 5) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const avgLatency = recentLatencies.reduce((sum, l) => sum + l, 0) / recentLatencies.length;
|
|
215
|
+
if (avgLatency > targetLatency && currentBatchSize > minBatchSize) {
|
|
216
|
+
// Too slow - reduce batch size
|
|
217
|
+
currentBatchSize = Math.max(minBatchSize, currentBatchSize - 1);
|
|
218
|
+
}
|
|
219
|
+
else if (avgLatency < targetLatency * 0.5 && currentBatchSize < maxBatchSize) {
|
|
220
|
+
// Too fast - increase batch size
|
|
221
|
+
currentBatchSize = Math.min(maxBatchSize, currentBatchSize + 1);
|
|
222
|
+
}
|
|
223
|
+
// Keep only recent latencies
|
|
224
|
+
recentLatencies = recentLatencies.slice(-10);
|
|
225
|
+
}
|
|
226
|
+
return (next) => {
|
|
227
|
+
const batchingMiddleware = createBatchingMiddleware({
|
|
228
|
+
maxBatchSize: currentBatchSize,
|
|
229
|
+
maxWaitTime: targetLatency,
|
|
230
|
+
});
|
|
231
|
+
return async function* (context) {
|
|
232
|
+
const start = Date.now();
|
|
233
|
+
try {
|
|
234
|
+
const batchedNext = batchingMiddleware(next);
|
|
235
|
+
yield* batchedNext(context);
|
|
236
|
+
}
|
|
237
|
+
finally {
|
|
238
|
+
const latency = Date.now() - start;
|
|
239
|
+
recentLatencies.push(latency);
|
|
240
|
+
adjustBatchSize();
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=batching.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batching.js","sourceRoot":"","sources":["../../../src/client/middleware/batching.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA4DH;;GAEG;AACH,MAAM,UAAU;IASJ;IAOA;IAfF,QAAQ,GAAkC,IAAI,GAAG,EAAE,CAAC;IACpD,MAAM,GAA+C,IAAI,GAAG,EAAE,CAAC;IAC/D,KAAK,GAAG;QACd,aAAa,EAAE,CAAC;QAChB,YAAY,EAAE,CAAC;KAChB,CAAC;IAEF,YACU,OAMP,EACO,YAA+D;QAP/D,YAAO,GAAP,OAAO,CAMd;QACO,iBAAY,GAAZ,YAAY,CAAmD;IACtE,CAAC;IAEJ;;OAEG;IACH,GAAG,CACD,GAAW,EACX,OAAmC;QAEnC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QAE3B,mCAAmC;QACnC,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,OAAyB,CAAC,CAAC;QAEtC,yBAAyB;QACzB,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,uCAAuC;YACvC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,GAAW;QAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAE7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,GAAW;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QAED,cAAc;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,EAAE,CAAC;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAE1B,eAAe;QACf,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAE1B,kBAAkB;QAClB,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9C,CAAC;QAED,gBAAgB;QAChB,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,eAAe,IAAI,KAAK,CAAC,MAAM,CAAC;QAClC,CAAC;QAED,MAAM,gBAAgB,GACpB,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC;YACzB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY;YACpD,CAAC,CAAC,CAAC,CAAC;QAER,OAAO;YACL,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;YACvC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;YACrC,gBAAgB;YAChB,eAAe;SAChB,CAAC;IACJ,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,wBAAwB,CACtC,UAA2B,EAAE;IAE7B,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC;IACxD,MAAM,IAAI,GAAG;QACX,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE;QACxC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;QACtC,eAAe;QACf,WAAW,EACT,OAAO,CAAC,WAAW;YACnB,CAAC,CAAC,GAAG,EAAE,EAAE,CACP,eAAe;gBACb,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO;gBACpB,CAAC,CAAC,SAAS,CAAC;QAClB,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;KAC/E,CAAC;IAEF;;OAEG;IACH,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,QAA0B;QAClE,6CAA6C;QAC7C,gEAAgE;QAChE,+BAA+B;QAC/B,8BAA8B;QAC9B,2CAA2C;QAC3C,+BAA+B;QAC/B,uCAAuC;QAEvC,4CAA4C;QAC5C,+CAA+C;QAC/C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC/C,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,MAAM,CAAC,KAAc,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAEjD,OAAO,CAAa,IAA8B,EAA4B,EAAE;QAC9E,OAAO,KAAK,SAAS,CAAC,EAAE,OAA4B;YAClD,iCAAiC;YACjC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAE9C,sCAAsC;YACtC,MAAM,eAAe,GAAG,IAAI,OAAO,CACjC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAClB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;oBACb,OAAO;oBACP,IAAI,EAAE,IAAsC;oBAC5C,OAAO,EAAE,OAAmE;oBAC5E,MAAM;iBACP,CAAC,CAAC;YACL,CAAC,CACF,CAAC;YAEF,gDAAgD;YAChD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC;YACvC,KAAK,CAAC,CAAC,QAAQ,CAAC;QAClB,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,WAA6B;IAE7B,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,gCAAgC,CAAC,UAI7C,EAAE;IACJ,MAAM,EACJ,YAAY,GAAG,CAAC,EAChB,YAAY,GAAG,EAAE,EACjB,aAAa,GAAG,EAAE,GACnB,GAAG,OAAO,CAAC;IAEZ,IAAI,gBAAgB,GAAG,YAAY,CAAC;IACpC,IAAI,eAAe,GAAa,EAAE,CAAC;IAEnC;;OAEG;IACH,SAAS,eAAe;QACtB,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GACd,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC;QAE1E,IAAI,UAAU,GAAG,aAAa,IAAI,gBAAgB,GAAG,YAAY,EAAE,CAAC;YAClE,+BAA+B;YAC/B,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,gBAAgB,GAAG,CAAC,CAAC,CAAC;QAClE,CAAC;aAAM,IAAI,UAAU,GAAG,aAAa,GAAG,GAAG,IAAI,gBAAgB,GAAG,YAAY,EAAE,CAAC;YAC/E,iCAAiC;YACjC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,gBAAgB,GAAG,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,6BAA6B;QAC7B,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,CAAa,IAA8B,EAA4B,EAAE;QAC9E,MAAM,kBAAkB,GAAG,wBAAwB,CAAC;YAClD,YAAY,EAAE,gBAAgB;YAC9B,WAAW,EAAE,aAAa;SAC3B,CAAiC,CAAC;QAEnC,OAAO,KAAK,SAAS,CAAC,EAAE,OAA4B;YAClD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAEzB,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBAC7C,KAAK,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;oBAAS,CAAC;gBACT,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;gBACnC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC9B,eAAe,EAAE,CAAC;YACpB,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal Cache Middleware
|
|
3
|
+
*
|
|
4
|
+
* Protocol-agnostic caching with LRU eviction and TTL expiration.
|
|
5
|
+
* Works with any transport!
|
|
6
|
+
*/
|
|
7
|
+
import type { ResponseItem, Metadata, Method, TypedClientMiddleware } from "../types.js";
|
|
8
|
+
import type { CacheContext } from "./contexts.js";
|
|
9
|
+
/**
|
|
10
|
+
* Cache middleware options.
|
|
11
|
+
*/
|
|
12
|
+
export interface CacheOptions {
|
|
13
|
+
/**
|
|
14
|
+
* The methods whose responses the middleware caches: a list of `"service.operation"` names,
|
|
15
|
+
* or a predicate. Caching is opt-in for each method: before, the middleware cached every
|
|
16
|
+
* call, mutations too (deep dive TRN-5).
|
|
17
|
+
*/
|
|
18
|
+
methods: readonly string[] | ((method: Method) => boolean);
|
|
19
|
+
/**
|
|
20
|
+
* Time-to-live for cache entries in milliseconds. A call can give its own: `cache: { ttl }`.
|
|
21
|
+
* @default 60000 (1 minute)
|
|
22
|
+
*/
|
|
23
|
+
ttl?: number;
|
|
24
|
+
/**
|
|
25
|
+
* Maximum number of cache entries (LRU eviction when exceeded).
|
|
26
|
+
* @default 100
|
|
27
|
+
*/
|
|
28
|
+
capacity?: number;
|
|
29
|
+
/**
|
|
30
|
+
* Optional callback for cache statistics.
|
|
31
|
+
* Called periodically with hit/miss/eviction metrics.
|
|
32
|
+
*/
|
|
33
|
+
onStats?: (stats: CacheStats) => void;
|
|
34
|
+
/**
|
|
35
|
+
* Interval in milliseconds for emitting cache statistics.
|
|
36
|
+
* Only used if onStats is provided.
|
|
37
|
+
* @default 60000 (1 minute)
|
|
38
|
+
*/
|
|
39
|
+
statsInterval?: number;
|
|
40
|
+
/**
|
|
41
|
+
* Custom cache key generator.
|
|
42
|
+
* Default: the method, the payload and the request metadata (see `defaultKeyGenerator`).
|
|
43
|
+
*
|
|
44
|
+
* @param method - Method being called
|
|
45
|
+
* @param payload - Request payload
|
|
46
|
+
* @param metadata - Request metadata (auth, pagination, custom fields)
|
|
47
|
+
* @returns Cache key string
|
|
48
|
+
*/
|
|
49
|
+
keyGenerator?: (method: Method, payload: unknown, metadata: Metadata) => string;
|
|
50
|
+
/**
|
|
51
|
+
* Predicate to determine if a response should be cached.
|
|
52
|
+
* Default: Only cache successful responses
|
|
53
|
+
*
|
|
54
|
+
* @param item - Response item
|
|
55
|
+
* @returns true if response should be cached
|
|
56
|
+
*/
|
|
57
|
+
shouldCache?: (item: ResponseItem<unknown>) => boolean;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Cache performance statistics.
|
|
61
|
+
*/
|
|
62
|
+
export interface CacheStats {
|
|
63
|
+
/** Number of cache hits */
|
|
64
|
+
hits: number;
|
|
65
|
+
/** Number of cache misses */
|
|
66
|
+
misses: number;
|
|
67
|
+
/** Current cache size */
|
|
68
|
+
size: number;
|
|
69
|
+
/** Number of entries evicted */
|
|
70
|
+
evictions: number;
|
|
71
|
+
/** Hit rate as a percentage (0-100) */
|
|
72
|
+
hitRate: number;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Deterministic stringify for cache keys: recursively sorts object keys at every depth, so
|
|
76
|
+
* payloads that are structurally equal (regardless of key order) map to the same key, and
|
|
77
|
+
* null / primitive / array payloads are handled without throwing.
|
|
78
|
+
*
|
|
79
|
+
* Replaces a prior `JSON.stringify(payload, Object.keys(payload).sort())` which misused the
|
|
80
|
+
* array-replacer form of JSON.stringify: that filters keys at *every* depth (so `{filter:{a:1}}`
|
|
81
|
+
* and `{filter:{b:2}}` collided to the same key and returned each other's cached response) and
|
|
82
|
+
* threw `TypeError` on null/primitive payloads. See documentation/BUGS-2026-07.md (C1).
|
|
83
|
+
*/
|
|
84
|
+
export declare function stableStringify(value: unknown): string;
|
|
85
|
+
/**
|
|
86
|
+
* Default cache key generator: the method, the payload and the metadata that can change the
|
|
87
|
+
* response. Before, the key ignored the metadata: with `withContext({ auth })`, one user got
|
|
88
|
+
* the cached response of another user, and a pagination cursor in the metadata returned the
|
|
89
|
+
* first page forever (deep dive TRN-5).
|
|
90
|
+
*/
|
|
91
|
+
export declare function defaultKeyGenerator(method: Method, payload: unknown, metadata?: Metadata): string;
|
|
92
|
+
/**
|
|
93
|
+
* Create cache middleware with LRU eviction and TTL expiration.
|
|
94
|
+
*
|
|
95
|
+
* Memory management:
|
|
96
|
+
* - LRU eviction when capacity is reached (bounded memory, a small map of the core)
|
|
97
|
+
* - Each entry has its own expiry time, so a call can give its own TTL
|
|
98
|
+
*
|
|
99
|
+
* Each call can give overrides in its context (`route()` overrides, or `withContext`):
|
|
100
|
+
* `cache: { ttl }` for the entry that it stores, `cache: { bypass: true }` to skip the cache, and
|
|
101
|
+
* `cache: { refresh: true }` to fetch and replace the stored response. After the call, the
|
|
102
|
+
* context has `cache.hit` (CacheContext).
|
|
103
|
+
*
|
|
104
|
+
* Features:
|
|
105
|
+
* - Protocol-agnostic: Works with HTTP, gRPC, WebSocket, local
|
|
106
|
+
* - Automatic eviction: LRU + TTL composition
|
|
107
|
+
* - Observable: Optional stats callback
|
|
108
|
+
* - Customizable: Custom key generation and cache predicates
|
|
109
|
+
*
|
|
110
|
+
* @param options - Cache configuration options
|
|
111
|
+
* @returns Middleware function
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```typescript
|
|
115
|
+
* client.use(createCacheMiddleware({
|
|
116
|
+
* methods: ["users.get", "users.list"], // only these calls are cached
|
|
117
|
+
* capacity: 100,
|
|
118
|
+
* ttl: 60000, // 1 minute
|
|
119
|
+
* onStats: (stats) => console.log(`Hit rate: ${stats.hitRate}%`)
|
|
120
|
+
* }));
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
export declare function createCacheMiddleware(options: CacheOptions): TypedClientMiddleware<CacheContext, {}>;
|
|
124
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/client/middleware/cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAA+B,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACtH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IAE3D;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAEtC;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,KAAK,MAAM,CAAC;IAEhF;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC;CACxD;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAetD;AAkBD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAOjG;AAmCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,GAAG,qBAAqB,CAAC,YAAY,EAAE,EAAE,CAAC,CA6GpG"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal Cache Middleware
|
|
3
|
+
*
|
|
4
|
+
* Protocol-agnostic caching with LRU eviction and TTL expiration.
|
|
5
|
+
* Works with any transport!
|
|
6
|
+
*/
|
|
7
|
+
import { LruMap } from "./lru.js";
|
|
8
|
+
/**
|
|
9
|
+
* Deterministic stringify for cache keys: recursively sorts object keys at every depth, so
|
|
10
|
+
* payloads that are structurally equal (regardless of key order) map to the same key, and
|
|
11
|
+
* null / primitive / array payloads are handled without throwing.
|
|
12
|
+
*
|
|
13
|
+
* Replaces a prior `JSON.stringify(payload, Object.keys(payload).sort())` which misused the
|
|
14
|
+
* array-replacer form of JSON.stringify: that filters keys at *every* depth (so `{filter:{a:1}}`
|
|
15
|
+
* and `{filter:{b:2}}` collided to the same key and returned each other's cached response) and
|
|
16
|
+
* threw `TypeError` on null/primitive payloads. See documentation/BUGS-2026-07.md (C1).
|
|
17
|
+
*/
|
|
18
|
+
export function stableStringify(value) {
|
|
19
|
+
if (typeof value === "bigint")
|
|
20
|
+
return `${value}n`;
|
|
21
|
+
if (value === null || typeof value !== "object") {
|
|
22
|
+
// Primitives — and undefined/function/symbol (JSON.stringify → undefined): never throw.
|
|
23
|
+
return JSON.stringify(value) ?? String(value);
|
|
24
|
+
}
|
|
25
|
+
if (Array.isArray(value)) {
|
|
26
|
+
return `[${value.map(stableStringify).join(",")}]`;
|
|
27
|
+
}
|
|
28
|
+
const obj = value;
|
|
29
|
+
const body = Object.keys(obj)
|
|
30
|
+
.sort()
|
|
31
|
+
.map((key) => `${JSON.stringify(key)}:${stableStringify(obj[key])}`)
|
|
32
|
+
.join(",");
|
|
33
|
+
return `{${body}}`;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The metadata keys that do not change a response: middleware state and tracing. The other
|
|
37
|
+
* keys (auth, pagination, custom fields) are part of the cache key.
|
|
38
|
+
*/
|
|
39
|
+
const VOLATILE_METADATA = new Set(["retry", "timeout", "tracing", "cache", "circuitBreaker", "rateLimit"]);
|
|
40
|
+
/** The part of the metadata that can change a response. */
|
|
41
|
+
function keyMetadata(metadata) {
|
|
42
|
+
const out = {};
|
|
43
|
+
for (const [key, value] of Object.entries(metadata)) {
|
|
44
|
+
if (VOLATILE_METADATA.has(key) || key.startsWith("__") || value === undefined)
|
|
45
|
+
continue;
|
|
46
|
+
out[key] = value;
|
|
47
|
+
}
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Default cache key generator: the method, the payload and the metadata that can change the
|
|
52
|
+
* response. Before, the key ignored the metadata: with `withContext({ auth })`, one user got
|
|
53
|
+
* the cached response of another user, and a pagination cursor in the metadata returned the
|
|
54
|
+
* first page forever (deep dive TRN-5).
|
|
55
|
+
*/
|
|
56
|
+
export function defaultKeyGenerator(method, payload, metadata) {
|
|
57
|
+
const methodKey = method.version
|
|
58
|
+
? `${method.version}:${method.service}.${method.operation}`
|
|
59
|
+
: `${method.service}.${method.operation}`;
|
|
60
|
+
const base = `${methodKey}:${stableStringify(payload)}`;
|
|
61
|
+
return metadata ? `${base}|${stableStringify(keyMetadata(metadata))}` : base;
|
|
62
|
+
}
|
|
63
|
+
/** A deep copy of a cache entry, or undefined when the payload cannot be copied. */
|
|
64
|
+
function copyItem(item) {
|
|
65
|
+
try {
|
|
66
|
+
return structuredClone(item);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** The overrides of one call: `cache: { ttl, bypass, refresh }` in its context. */
|
|
73
|
+
function cacheOverrides(value) {
|
|
74
|
+
if (typeof value !== "object" || value === null)
|
|
75
|
+
return {};
|
|
76
|
+
const { ttl, bypass, refresh } = value;
|
|
77
|
+
return {
|
|
78
|
+
...(typeof ttl === "number" && ttl >= 0 ? { ttl } : {}),
|
|
79
|
+
...(bypass === true ? { bypass: true } : {}),
|
|
80
|
+
...(refresh === true ? { refresh: true } : {}),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Default should cache predicate - only cache successful responses.
|
|
85
|
+
*/
|
|
86
|
+
function defaultShouldCache(item) {
|
|
87
|
+
return item.status.type === "success";
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Create cache middleware with LRU eviction and TTL expiration.
|
|
91
|
+
*
|
|
92
|
+
* Memory management:
|
|
93
|
+
* - LRU eviction when capacity is reached (bounded memory, a small map of the core)
|
|
94
|
+
* - Each entry has its own expiry time, so a call can give its own TTL
|
|
95
|
+
*
|
|
96
|
+
* Each call can give overrides in its context (`route()` overrides, or `withContext`):
|
|
97
|
+
* `cache: { ttl }` for the entry that it stores, `cache: { bypass: true }` to skip the cache, and
|
|
98
|
+
* `cache: { refresh: true }` to fetch and replace the stored response. After the call, the
|
|
99
|
+
* context has `cache.hit` (CacheContext).
|
|
100
|
+
*
|
|
101
|
+
* Features:
|
|
102
|
+
* - Protocol-agnostic: Works with HTTP, gRPC, WebSocket, local
|
|
103
|
+
* - Automatic eviction: LRU + TTL composition
|
|
104
|
+
* - Observable: Optional stats callback
|
|
105
|
+
* - Customizable: Custom key generation and cache predicates
|
|
106
|
+
*
|
|
107
|
+
* @param options - Cache configuration options
|
|
108
|
+
* @returns Middleware function
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```typescript
|
|
112
|
+
* client.use(createCacheMiddleware({
|
|
113
|
+
* methods: ["users.get", "users.list"], // only these calls are cached
|
|
114
|
+
* capacity: 100,
|
|
115
|
+
* ttl: 60000, // 1 minute
|
|
116
|
+
* onStats: (stats) => console.log(`Hit rate: ${stats.hitRate}%`)
|
|
117
|
+
* }));
|
|
118
|
+
* ```
|
|
119
|
+
*/
|
|
120
|
+
export function createCacheMiddleware(options) {
|
|
121
|
+
const { methods, ttl = 60000, capacity = 100, onStats, statsInterval = 60000, keyGenerator = defaultKeyGenerator, shouldCache = defaultShouldCache, } = options;
|
|
122
|
+
// An LRU map bounds the memory. Each entry keeps its own expiry time, so a call can give its
|
|
123
|
+
// own TTL: before, one TTL map expired every entry after the TTL of the middleware.
|
|
124
|
+
const cache = new LruMap(capacity, () => {
|
|
125
|
+
stats.evictions++;
|
|
126
|
+
});
|
|
127
|
+
// Track cache statistics
|
|
128
|
+
const stats = {
|
|
129
|
+
hits: 0,
|
|
130
|
+
misses: 0,
|
|
131
|
+
evictions: 0,
|
|
132
|
+
};
|
|
133
|
+
// Emit stats periodically if callback provided
|
|
134
|
+
if (onStats) {
|
|
135
|
+
const statsTimer = setInterval(() => {
|
|
136
|
+
const total = stats.hits + stats.misses;
|
|
137
|
+
const hitRate = total > 0 ? (stats.hits / total) * 100 : 0;
|
|
138
|
+
onStats({
|
|
139
|
+
hits: stats.hits,
|
|
140
|
+
misses: stats.misses,
|
|
141
|
+
size: cache.size,
|
|
142
|
+
evictions: stats.evictions,
|
|
143
|
+
hitRate: Math.round(hitRate * 100) / 100, // Round to 2 decimal places
|
|
144
|
+
});
|
|
145
|
+
}, statsInterval);
|
|
146
|
+
// Unref so the stats timer never keeps the process alive on its own (its lifecycle is tied
|
|
147
|
+
// to the client, not the event loop). See documentation/BUGS-2026-07.md (M4).
|
|
148
|
+
statsTimer.unref?.();
|
|
149
|
+
}
|
|
150
|
+
const cacheable = typeof methods === "function"
|
|
151
|
+
? methods
|
|
152
|
+
: ((names) => (method) => names.has(`${method.service}.${method.operation}`))(new Set(methods));
|
|
153
|
+
return (next) => {
|
|
154
|
+
return async function* (context) {
|
|
155
|
+
if (!cacheable(context.message.method)) {
|
|
156
|
+
yield* next(context);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const metadata = context.message.metadata;
|
|
160
|
+
const overrides = cacheOverrides(metadata["cache"]);
|
|
161
|
+
// The state for the outer middlewares (CacheContext). The key is not written: it holds the
|
|
162
|
+
// payload, and the metadata of a retry travels in a header.
|
|
163
|
+
const setState = (hit) => {
|
|
164
|
+
metadata["cache"] = { ...overrides, hit };
|
|
165
|
+
};
|
|
166
|
+
if (overrides.bypass) {
|
|
167
|
+
yield* next(context);
|
|
168
|
+
setState(false);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
// Generate cache key
|
|
172
|
+
const cacheKey = keyGenerator(context.message.method, context.message.payload, metadata);
|
|
173
|
+
// Check cache - use has() to avoid throwing "Key not found" error. A refresh skips the read.
|
|
174
|
+
if (!overrides.refresh && cache.has(cacheKey)) {
|
|
175
|
+
const cached = cache.get(cacheKey);
|
|
176
|
+
if (cached && cached.expiresAt > Date.now()) {
|
|
177
|
+
// Cache hit - yield a copy: a caller that changes its result does not change the cache
|
|
178
|
+
stats.hits++;
|
|
179
|
+
setState(true);
|
|
180
|
+
for (const item of cached.items) {
|
|
181
|
+
yield (copyItem(item) ?? item);
|
|
182
|
+
}
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
// Expired
|
|
186
|
+
cache.delete(cacheKey);
|
|
187
|
+
}
|
|
188
|
+
// Cache miss - fetch and store. Only a response of one item is cached: a stream is never
|
|
189
|
+
// collected or cached (before, the middleware kept every item of a stream in memory).
|
|
190
|
+
stats.misses++;
|
|
191
|
+
let first;
|
|
192
|
+
let count = 0;
|
|
193
|
+
for await (const item of next(context)) {
|
|
194
|
+
count++;
|
|
195
|
+
if (count === 1)
|
|
196
|
+
first = item;
|
|
197
|
+
yield item;
|
|
198
|
+
}
|
|
199
|
+
setState(false);
|
|
200
|
+
if (count === 1 && first && shouldCache(first)) {
|
|
201
|
+
const copy = copyItem(first);
|
|
202
|
+
if (copy)
|
|
203
|
+
cache.set(cacheKey, { items: [copy], expiresAt: Date.now() + (overrides.ttl ?? ttl) });
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/client/middleware/cache.ts"],"names":[],"mappings":"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"}
|