@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,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracing Middleware
|
|
3
|
+
*
|
|
4
|
+
* Adds distributed tracing metadata to requests.
|
|
5
|
+
* Works with ALL transports (HTTP, WebSocket, Local, Mock).
|
|
6
|
+
*
|
|
7
|
+
* Each transport converts metadata.tracing to its protocol format:
|
|
8
|
+
* - HTTP: X-Trace-Id, X-Span-Id, X-Parent-Span-Id headers
|
|
9
|
+
* - WebSocket: Frame metadata
|
|
10
|
+
* - Local: Passed directly to handler
|
|
11
|
+
*
|
|
12
|
+
* Compatible with OpenTelemetry, Jaeger, and custom tracing systems.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import type { TypedClientMiddleware } from "../types.js";
|
|
16
|
+
import type { TracingContext } from "./contexts.js";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Tracing Configuration
|
|
20
|
+
*/
|
|
21
|
+
export interface TracingOptions {
|
|
22
|
+
/** Generate trace ID (default: auto-generate UUID) */
|
|
23
|
+
generateTraceId?: () => string;
|
|
24
|
+
|
|
25
|
+
/** Generate span ID (default: auto-generate UUID) */
|
|
26
|
+
generateSpanId?: () => string;
|
|
27
|
+
|
|
28
|
+
/** Get current trace context (for continuing existing traces) */
|
|
29
|
+
getCurrentTrace?: () => { traceId: string; spanId: string } | null;
|
|
30
|
+
|
|
31
|
+
/** Service name for tracing */
|
|
32
|
+
serviceName?: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Generate a simple unique ID (UUID v4 subset)
|
|
37
|
+
*/
|
|
38
|
+
function generateId(): string {
|
|
39
|
+
return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Create tracing middleware
|
|
44
|
+
*
|
|
45
|
+
* Automatically adds tracing metadata to all requests.
|
|
46
|
+
* Supports both new traces and continuing existing traces.
|
|
47
|
+
*
|
|
48
|
+
* @example Basic Usage
|
|
49
|
+
* ```typescript
|
|
50
|
+
* const client = new Client({
|
|
51
|
+
* transport: new HttpTransport({ baseUrl: "https://api.example.com" }),
|
|
52
|
+
* middleware: [
|
|
53
|
+
* createTracingMiddleware(), // Auto-generates trace/span IDs
|
|
54
|
+
* createRetryMiddleware({ maxAttempts: 3 }),
|
|
55
|
+
* ]
|
|
56
|
+
* });
|
|
57
|
+
* ```
|
|
58
|
+
*
|
|
59
|
+
* @example Custom ID Generation
|
|
60
|
+
* ```typescript
|
|
61
|
+
* createTracingMiddleware({
|
|
62
|
+
* generateTraceId: () => uuid.v4(),
|
|
63
|
+
* generateSpanId: () => uuid.v4(),
|
|
64
|
+
* })
|
|
65
|
+
* ```
|
|
66
|
+
*
|
|
67
|
+
* @example Continuing Existing Trace
|
|
68
|
+
* ```typescript
|
|
69
|
+
* createTracingMiddleware({
|
|
70
|
+
* getCurrentTrace: () => {
|
|
71
|
+
* const trace = getActiveTrace(); // From your tracing library
|
|
72
|
+
* return trace ? {
|
|
73
|
+
* traceId: trace.traceId,
|
|
74
|
+
* spanId: trace.spanId,
|
|
75
|
+
* } : null;
|
|
76
|
+
* }
|
|
77
|
+
* })
|
|
78
|
+
* ```
|
|
79
|
+
*
|
|
80
|
+
* @example OpenTelemetry Integration
|
|
81
|
+
* ```typescript
|
|
82
|
+
* import { trace } from "@opentelemetry/api";
|
|
83
|
+
*
|
|
84
|
+
* createTracingMiddleware({
|
|
85
|
+
* getCurrentTrace: () => {
|
|
86
|
+
* const span = trace.getActiveSpan();
|
|
87
|
+
* if (!span) return null;
|
|
88
|
+
*
|
|
89
|
+
* const spanContext = span.spanContext();
|
|
90
|
+
* return {
|
|
91
|
+
* traceId: spanContext.traceId,
|
|
92
|
+
* spanId: spanContext.spanId,
|
|
93
|
+
* };
|
|
94
|
+
* }
|
|
95
|
+
* })
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
export function createTracingMiddleware(
|
|
99
|
+
options: TracingOptions = {}
|
|
100
|
+
): TypedClientMiddleware<TracingContext, {}> {
|
|
101
|
+
const {
|
|
102
|
+
generateTraceId = generateId,
|
|
103
|
+
generateSpanId = generateId,
|
|
104
|
+
getCurrentTrace,
|
|
105
|
+
serviceName,
|
|
106
|
+
} = options;
|
|
107
|
+
|
|
108
|
+
return (next) => async function* (context) {
|
|
109
|
+
// Check if there's already tracing metadata
|
|
110
|
+
if (!context.message.metadata.tracing) {
|
|
111
|
+
// Try to get current trace context
|
|
112
|
+
const currentTrace = getCurrentTrace?.();
|
|
113
|
+
|
|
114
|
+
if (currentTrace) {
|
|
115
|
+
// Continue existing trace (create child span)
|
|
116
|
+
context.message.metadata.tracing = {
|
|
117
|
+
traceId: currentTrace.traceId,
|
|
118
|
+
spanId: generateSpanId(),
|
|
119
|
+
parentSpanId: currentTrace.spanId,
|
|
120
|
+
};
|
|
121
|
+
} else {
|
|
122
|
+
// Start new trace
|
|
123
|
+
context.message.metadata.tracing = {
|
|
124
|
+
traceId: generateTraceId(),
|
|
125
|
+
spanId: generateSpanId(),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Add service name if provided
|
|
130
|
+
if (serviceName) {
|
|
131
|
+
context.message.metadata["serviceName"] = serviceName;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Continue middleware chain
|
|
136
|
+
yield* next(context);
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Create simple tracing middleware with UUID generation
|
|
142
|
+
*
|
|
143
|
+
* Convenience wrapper that uses crypto.randomUUID() if available.
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* ```typescript
|
|
147
|
+
* createSimpleTracingMiddleware()
|
|
148
|
+
* // Generates: traceId and spanId using crypto.randomUUID() or fallback
|
|
149
|
+
* ```
|
|
150
|
+
*/
|
|
151
|
+
export function createSimpleTracingMiddleware(): TypedClientMiddleware<TracingContext, {}> {
|
|
152
|
+
const hasRandomUUID = typeof crypto !== "undefined" && "randomUUID" in crypto;
|
|
153
|
+
|
|
154
|
+
return createTracingMiddleware({
|
|
155
|
+
generateTraceId: hasRandomUUID
|
|
156
|
+
? () => crypto.randomUUID()
|
|
157
|
+
: generateId,
|
|
158
|
+
generateSpanId: hasRandomUUID
|
|
159
|
+
? () => crypto.randomUUID()
|
|
160
|
+
: generateId,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Extract tracing info from response metadata
|
|
166
|
+
*
|
|
167
|
+
* Useful for logging or passing to other systems.
|
|
168
|
+
*
|
|
169
|
+
* @example
|
|
170
|
+
* ```typescript
|
|
171
|
+
* const response = await client.call(...);
|
|
172
|
+
* const tracing = extractTracingInfo(response.metadata);
|
|
173
|
+
* console.log(`Request completed: ${tracing.traceId}`);
|
|
174
|
+
* ```
|
|
175
|
+
*/
|
|
176
|
+
export function extractTracingInfo(metadata: Record<string, unknown>): {
|
|
177
|
+
traceId?: string;
|
|
178
|
+
spanId?: string;
|
|
179
|
+
parentSpanId?: string;
|
|
180
|
+
} | null {
|
|
181
|
+
if (!metadata["tracing"] || typeof metadata["tracing"] !== "object") {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const tracing = metadata["tracing"] as Record<string, unknown>;
|
|
186
|
+
return {
|
|
187
|
+
...(typeof tracing["traceId"] === "string" && { traceId: tracing["traceId"] }),
|
|
188
|
+
...(typeof tracing["spanId"] === "string" && { spanId: tracing["spanId"] }),
|
|
189
|
+
...(typeof tracing["parentSpanId"] === "string" && { parentSpanId: tracing["parentSpanId"] }),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route Resolver
|
|
3
|
+
*
|
|
4
|
+
* Resolves nested route structures to procedure definitions.
|
|
5
|
+
* Validates routes against the procedure registry.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { AnyProcedure, ProcedurePath } from "../procedures/types.js";
|
|
9
|
+
import type { ProcedureRegistry } from "../procedures/registry.js";
|
|
10
|
+
import type { Route, RouteNode } from "./call-types.js";
|
|
11
|
+
import type { OutputConfig } from "./consumption.js";
|
|
12
|
+
import { flattenRoute } from "./call-types.js";
|
|
13
|
+
import { validateSchema } from "../procedures/schema.js";
|
|
14
|
+
|
|
15
|
+
// =============================================================================
|
|
16
|
+
// Resolution Types
|
|
17
|
+
// =============================================================================
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Resolved route entry with procedure and input.
|
|
21
|
+
*/
|
|
22
|
+
export interface ResolvedRoute {
|
|
23
|
+
/** Path to the procedure */
|
|
24
|
+
path: ProcedurePath;
|
|
25
|
+
/** The procedure definition */
|
|
26
|
+
procedure: AnyProcedure;
|
|
27
|
+
/** Input payload for the procedure handler (validated, with schema defaults) */
|
|
28
|
+
input: unknown;
|
|
29
|
+
|
|
30
|
+
/** How the caller reads the output: sponge (the default), stream or handlers (the `out` of the leaf) */
|
|
31
|
+
outputConfig: OutputConfig;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* True when the resolver validated the input. A schema that validates asynchronously cannot
|
|
35
|
+
* be checked by the synchronous resolver: the invocation validates that input.
|
|
36
|
+
*/
|
|
37
|
+
inputValidated?: boolean;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Resolution error for a specific path.
|
|
42
|
+
*/
|
|
43
|
+
export interface RouteResolutionError {
|
|
44
|
+
/** Path that failed to resolve */
|
|
45
|
+
path: ProcedurePath;
|
|
46
|
+
/** Error type */
|
|
47
|
+
type: "not_found" | "invalid_input" | "validation_error";
|
|
48
|
+
/** Error message */
|
|
49
|
+
message: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Result of route resolution.
|
|
54
|
+
*/
|
|
55
|
+
export interface RouteResolutionResult {
|
|
56
|
+
/** Successfully resolved routes */
|
|
57
|
+
resolved: ResolvedRoute[];
|
|
58
|
+
/** Errors encountered during resolution */
|
|
59
|
+
errors: RouteResolutionError[];
|
|
60
|
+
/**
|
|
61
|
+
* The routes that the resolver did not examine: it stopped at the first error. A caller
|
|
62
|
+
* reports each of them, so no leaf of the route is missing from the response (deep dive CORE-14).
|
|
63
|
+
*/
|
|
64
|
+
skipped: ProcedurePath[];
|
|
65
|
+
/** Whether all routes resolved successfully */
|
|
66
|
+
success: boolean;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// =============================================================================
|
|
70
|
+
// Route Resolver Class
|
|
71
|
+
// =============================================================================
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Resolves nested route structures to procedures.
|
|
75
|
+
*
|
|
76
|
+
* Features:
|
|
77
|
+
* - Path-based procedure lookup
|
|
78
|
+
* - Input validation against schemas
|
|
79
|
+
* - Batch resolution for multi-route calls
|
|
80
|
+
* - Detailed error reporting
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* const resolver = new RouteResolver(registry);
|
|
85
|
+
*
|
|
86
|
+
* const result = resolver.resolve({
|
|
87
|
+
* collections: {
|
|
88
|
+
* users: {
|
|
89
|
+
* get: { id: '123' }
|
|
90
|
+
* }
|
|
91
|
+
* }
|
|
92
|
+
* });
|
|
93
|
+
*
|
|
94
|
+
* if (result.success) {
|
|
95
|
+
* for (const { path, procedure, input } of result.resolved) {
|
|
96
|
+
* // Execute procedure with input
|
|
97
|
+
* }
|
|
98
|
+
* }
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
export class RouteResolver {
|
|
102
|
+
constructor(private readonly registry: ProcedureRegistry) {}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Resolve a route structure to procedures.
|
|
106
|
+
*
|
|
107
|
+
* @param route - Nested route object
|
|
108
|
+
* @param options - Resolution options
|
|
109
|
+
* @returns Resolution result with procedures or errors
|
|
110
|
+
*/
|
|
111
|
+
resolve(
|
|
112
|
+
route: Route,
|
|
113
|
+
options: RouteResolverOptions = {}
|
|
114
|
+
): RouteResolutionResult {
|
|
115
|
+
const flattened = flattenRoute(route);
|
|
116
|
+
const resolved: ResolvedRoute[] = [];
|
|
117
|
+
const errors: RouteResolutionError[] = [];
|
|
118
|
+
const skipped: ProcedurePath[] = [];
|
|
119
|
+
|
|
120
|
+
for (const [index, entry] of flattened.entries()) {
|
|
121
|
+
const { path, input, outputConfig } = entry;
|
|
122
|
+
const procedure = this.registry.get(path);
|
|
123
|
+
|
|
124
|
+
if (!procedure) {
|
|
125
|
+
errors.push({
|
|
126
|
+
path,
|
|
127
|
+
type: "not_found",
|
|
128
|
+
message: `No procedure registered at path: ${path.join(".")}`,
|
|
129
|
+
});
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Validate input if schema validation is enabled. The handler gets the validated data
|
|
134
|
+
// (with schema defaults), as in exec() and on the server - not the raw leaf, which for
|
|
135
|
+
// an { in, out } leaf is the whole wrapper (BUGS-2026-07 H31).
|
|
136
|
+
let handlerInput: unknown = input;
|
|
137
|
+
let inputValidated = false;
|
|
138
|
+
const validationResult = options.validateInput !== false ? validateSchema(procedure.input, input) : undefined;
|
|
139
|
+
if (validationResult && !(validationResult instanceof Promise)) {
|
|
140
|
+
if (!validationResult.ok) {
|
|
141
|
+
errors.push({
|
|
142
|
+
path,
|
|
143
|
+
type: "validation_error",
|
|
144
|
+
message: `Input validation failed: ${validationResult.message}`,
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
if (!options.continueOnError) {
|
|
148
|
+
skipped.push(...flattened.slice(index + 1).map((rest) => rest.path));
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
handlerInput = validationResult.value;
|
|
154
|
+
inputValidated = true;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
resolved.push({
|
|
158
|
+
path,
|
|
159
|
+
procedure,
|
|
160
|
+
input: handlerInput,
|
|
161
|
+
outputConfig,
|
|
162
|
+
inputValidated,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return {
|
|
167
|
+
resolved,
|
|
168
|
+
errors,
|
|
169
|
+
skipped,
|
|
170
|
+
success: errors.length === 0,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Resolve a single path to a procedure.
|
|
176
|
+
*
|
|
177
|
+
* @param path - Procedure path
|
|
178
|
+
* @returns Procedure or undefined if not found
|
|
179
|
+
*/
|
|
180
|
+
getProcedure(path: ProcedurePath): AnyProcedure | undefined {
|
|
181
|
+
return this.registry.get(path);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Check if a path resolves to a valid procedure.
|
|
186
|
+
*
|
|
187
|
+
* @param path - Procedure path
|
|
188
|
+
* @returns true if procedure exists at path
|
|
189
|
+
*/
|
|
190
|
+
hasProcedure(path: ProcedurePath): boolean {
|
|
191
|
+
return this.registry.has(path);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Validate route structure without resolving.
|
|
196
|
+
* Useful for compile-time or early validation.
|
|
197
|
+
*
|
|
198
|
+
* @param route - Route to validate
|
|
199
|
+
* @returns Validation errors or empty array if valid
|
|
200
|
+
*/
|
|
201
|
+
validate(route: Route): RouteResolutionError[] {
|
|
202
|
+
const flattened = flattenRoute(route);
|
|
203
|
+
const errors: RouteResolutionError[] = [];
|
|
204
|
+
|
|
205
|
+
for (const entry of flattened) {
|
|
206
|
+
const { path, input } = entry;
|
|
207
|
+
const procedure = this.registry.get(path);
|
|
208
|
+
|
|
209
|
+
if (!procedure) {
|
|
210
|
+
errors.push({
|
|
211
|
+
path,
|
|
212
|
+
type: "not_found",
|
|
213
|
+
message: `No procedure registered at path: ${path.join(".")}`,
|
|
214
|
+
});
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const validationResult = validateSchema(procedure.input, input);
|
|
219
|
+
// An asynchronous schema is checked when the procedure runs
|
|
220
|
+
if (!(validationResult instanceof Promise) && !validationResult.ok) {
|
|
221
|
+
errors.push({
|
|
222
|
+
path,
|
|
223
|
+
type: "validation_error",
|
|
224
|
+
message: `Input validation failed: ${validationResult.message}`,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return errors;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Get all procedures that would be invoked by a route.
|
|
234
|
+
* Does not validate inputs.
|
|
235
|
+
*
|
|
236
|
+
* @param route - Route structure
|
|
237
|
+
* @returns Array of [path, procedure] tuples for found procedures
|
|
238
|
+
*/
|
|
239
|
+
getProceduresForRoute(route: Route): Array<[ProcedurePath, AnyProcedure]> {
|
|
240
|
+
const flattened = flattenRoute(route);
|
|
241
|
+
const results: Array<[ProcedurePath, AnyProcedure]> = [];
|
|
242
|
+
|
|
243
|
+
for (const entry of flattened) {
|
|
244
|
+
const procedure = this.registry.get(entry.path);
|
|
245
|
+
if (procedure) {
|
|
246
|
+
results.push([entry.path, procedure]);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return results;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Options for route resolution.
|
|
256
|
+
*/
|
|
257
|
+
export interface RouteResolverOptions {
|
|
258
|
+
/** Whether to validate input against schemas (default: true) */
|
|
259
|
+
validateInput?: boolean;
|
|
260
|
+
/** Continue resolving even if some routes fail (default: false) */
|
|
261
|
+
continueOnError?: boolean;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// =============================================================================
|
|
265
|
+
// Helper Functions
|
|
266
|
+
// =============================================================================
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Create a route resolver for a registry.
|
|
270
|
+
*
|
|
271
|
+
* @param registry - Procedure registry
|
|
272
|
+
* @returns Route resolver instance
|
|
273
|
+
*/
|
|
274
|
+
export function createRouteResolver(registry: ProcedureRegistry): RouteResolver {
|
|
275
|
+
return new RouteResolver(registry);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Quickly validate a route against a registry.
|
|
280
|
+
*
|
|
281
|
+
* @param route - Route to validate
|
|
282
|
+
* @param registry - Procedure registry
|
|
283
|
+
* @returns true if all paths in route are valid procedures
|
|
284
|
+
*/
|
|
285
|
+
export function isValidRoute(route: Route, registry: ProcedureRegistry): boolean {
|
|
286
|
+
const flattened = flattenRoute(route);
|
|
287
|
+
|
|
288
|
+
for (const entry of flattened) {
|
|
289
|
+
if (!registry.has(entry.path)) {
|
|
290
|
+
return false;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
return true;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Get missing paths from a route.
|
|
299
|
+
*
|
|
300
|
+
* @param route - Route to check
|
|
301
|
+
* @param registry - Procedure registry
|
|
302
|
+
* @returns Array of paths not found in registry
|
|
303
|
+
*/
|
|
304
|
+
export function getMissingPaths(
|
|
305
|
+
route: Route,
|
|
306
|
+
registry: ProcedureRegistry
|
|
307
|
+
): ProcedurePath[] {
|
|
308
|
+
const flattened = flattenRoute(route);
|
|
309
|
+
const missing: ProcedurePath[] = [];
|
|
310
|
+
|
|
311
|
+
for (const entry of flattened) {
|
|
312
|
+
if (!registry.has(entry.path)) {
|
|
313
|
+
missing.push(entry.path);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
return missing;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// =============================================================================
|
|
321
|
+
// Path Matching Utilities
|
|
322
|
+
// =============================================================================
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Check if a path matches a pattern with wildcards.
|
|
326
|
+
* Supports '*' for single segment and '**' for multiple segments.
|
|
327
|
+
*
|
|
328
|
+
* @param path - Path to check
|
|
329
|
+
* @param pattern - Pattern to match against
|
|
330
|
+
* @returns true if path matches pattern
|
|
331
|
+
*
|
|
332
|
+
* @example
|
|
333
|
+
* ```typescript
|
|
334
|
+
* matchPath(['users', 'get'], ['users', '*']); // true
|
|
335
|
+
* matchPath(['users', 'orders', 'list'], ['users', '**']); // true
|
|
336
|
+
* ```
|
|
337
|
+
*/
|
|
338
|
+
export function matchPath(path: ProcedurePath, pattern: ProcedurePath): boolean {
|
|
339
|
+
let pathIndex = 0;
|
|
340
|
+
let patternIndex = 0;
|
|
341
|
+
|
|
342
|
+
while (patternIndex < pattern.length) {
|
|
343
|
+
const segment = pattern[patternIndex];
|
|
344
|
+
|
|
345
|
+
if (segment === "**") {
|
|
346
|
+
// Match rest of path
|
|
347
|
+
if (patternIndex === pattern.length - 1) {
|
|
348
|
+
return true;
|
|
349
|
+
}
|
|
350
|
+
// Try to match remaining pattern at each position
|
|
351
|
+
for (let i = pathIndex; i <= path.length; i++) {
|
|
352
|
+
if (matchPath(path.slice(i), pattern.slice(patternIndex + 1))) {
|
|
353
|
+
return true;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return false;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
if (pathIndex >= path.length) {
|
|
360
|
+
return false;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
if (segment === "*" || segment === path[pathIndex]) {
|
|
364
|
+
pathIndex++;
|
|
365
|
+
patternIndex++;
|
|
366
|
+
} else {
|
|
367
|
+
return false;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
return pathIndex === path.length;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Filter routes by path pattern.
|
|
376
|
+
*
|
|
377
|
+
* @param route - Route to filter
|
|
378
|
+
* @param pattern - Pattern to match
|
|
379
|
+
* @returns Route with only matching paths
|
|
380
|
+
*/
|
|
381
|
+
export function filterRouteByPattern(route: Route, pattern: ProcedurePath): Route {
|
|
382
|
+
const flattened = flattenRoute(route);
|
|
383
|
+
const filtered: Route = {};
|
|
384
|
+
|
|
385
|
+
for (const entry of flattened) {
|
|
386
|
+
if (matchPath(entry.path, pattern)) {
|
|
387
|
+
// Rebuild nested structure for this path
|
|
388
|
+
let current: RouteNode = filtered;
|
|
389
|
+
for (let i = 0; i < entry.path.length; i++) {
|
|
390
|
+
const segment = entry.path[i]!;
|
|
391
|
+
const isLast = i === entry.path.length - 1;
|
|
392
|
+
|
|
393
|
+
if (isLast) {
|
|
394
|
+
current[segment] = entry.leaf;
|
|
395
|
+
} else {
|
|
396
|
+
// An own key only (deep dive CORE-6). flattenRoute rejected the prototype keys.
|
|
397
|
+
if (!Object.hasOwn(current, segment)) {
|
|
398
|
+
current[segment] = {};
|
|
399
|
+
}
|
|
400
|
+
current = current[segment] as RouteNode;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
return filtered;
|
|
407
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-safe Method construction from procedure registry
|
|
3
|
+
*
|
|
4
|
+
* This ensures that Method objects can only be created with valid
|
|
5
|
+
* service/operation combinations that exist in the registry.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { Method } from './types.js';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Generic typed method that constrains service and operation
|
|
12
|
+
* to values that exist in a procedure registry
|
|
13
|
+
*/
|
|
14
|
+
export interface TypedMethod<
|
|
15
|
+
TRegistry extends Record<string, Record<string, any>>,
|
|
16
|
+
TService extends keyof TRegistry & string = keyof TRegistry & string,
|
|
17
|
+
TOperation extends keyof TRegistry[TService] & string = keyof TRegistry[TService] & string
|
|
18
|
+
> extends Method {
|
|
19
|
+
service: TService;
|
|
20
|
+
operation: TOperation;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Create a type-safe method object
|
|
25
|
+
*
|
|
26
|
+
* Usage:
|
|
27
|
+
* const method = createMethod<ProcedureRegistry>('collections', 'getDocuments');
|
|
28
|
+
* // Autocomplete for both service and operation!
|
|
29
|
+
* // Compile error if service or operation doesn't exist
|
|
30
|
+
*/
|
|
31
|
+
export function createMethod<
|
|
32
|
+
TRegistry extends Record<string, Record<string, any>>,
|
|
33
|
+
TService extends keyof TRegistry & string,
|
|
34
|
+
TOperation extends keyof TRegistry[TService] & string
|
|
35
|
+
>(
|
|
36
|
+
service: TService,
|
|
37
|
+
operation: TOperation,
|
|
38
|
+
version?: string
|
|
39
|
+
): TypedMethod<TRegistry, TService, TOperation> {
|
|
40
|
+
const method: TypedMethod<TRegistry, TService, TOperation> = {
|
|
41
|
+
service,
|
|
42
|
+
operation,
|
|
43
|
+
};
|
|
44
|
+
if (version !== undefined) {
|
|
45
|
+
method.version = version;
|
|
46
|
+
}
|
|
47
|
+
return method;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Type guard to check if a Method matches the registry
|
|
52
|
+
*/
|
|
53
|
+
export function isValidMethod<TRegistry extends Record<string, Record<string, any>>>(
|
|
54
|
+
method: Method,
|
|
55
|
+
registry: TRegistry
|
|
56
|
+
): method is TypedMethod<TRegistry> {
|
|
57
|
+
const service = registry[method.service];
|
|
58
|
+
return (
|
|
59
|
+
typeof method.service === 'string' &&
|
|
60
|
+
method.service in registry &&
|
|
61
|
+
typeof method.operation === 'string' &&
|
|
62
|
+
service !== undefined &&
|
|
63
|
+
method.operation in service
|
|
64
|
+
);
|
|
65
|
+
}
|