@procedures/client 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -0
- package/LICENSE +21 -0
- package/README.md +832 -2
- package/dist/.tsbuildinfo +1 -0
- package/dist/adapters/http/client/index.d.ts +11 -0
- package/dist/adapters/http/client/index.d.ts.map +1 -0
- package/dist/adapters/http/client/index.js +18 -0
- package/dist/adapters/http/client/index.js.map +1 -0
- package/dist/adapters/http/client/transport.d.ts +72 -0
- package/dist/adapters/http/client/transport.d.ts.map +1 -0
- package/dist/adapters/http/client/transport.js +282 -0
- package/dist/adapters/http/client/transport.js.map +1 -0
- package/dist/adapters/http/client/types.d.ts +27 -0
- package/dist/adapters/http/client/types.d.ts.map +1 -0
- package/dist/adapters/http/client/types.js +8 -0
- package/dist/adapters/http/client/types.js.map +1 -0
- package/dist/adapters/http/index.d.ts +7 -0
- package/dist/adapters/http/index.d.ts.map +1 -0
- package/dist/adapters/http/index.js +7 -0
- package/dist/adapters/http/index.js.map +1 -0
- package/dist/adapters/http/server/index.d.ts +9 -0
- package/dist/adapters/http/server/index.d.ts.map +1 -0
- package/dist/adapters/http/server/index.js +10 -0
- package/dist/adapters/http/server/index.js.map +1 -0
- package/dist/adapters/http/server/strategies.d.ts +39 -0
- package/dist/adapters/http/server/strategies.d.ts.map +1 -0
- package/dist/adapters/http/server/strategies.js +90 -0
- package/dist/adapters/http/server/strategies.js.map +1 -0
- package/dist/adapters/http/server/transport.d.ts +66 -0
- package/dist/adapters/http/server/transport.d.ts.map +1 -0
- package/dist/adapters/http/server/transport.js +562 -0
- package/dist/adapters/http/server/transport.js.map +1 -0
- package/dist/adapters/http/server/types.d.ts +71 -0
- package/dist/adapters/http/server/types.d.ts.map +1 -0
- package/dist/adapters/http/server/types.js +7 -0
- package/dist/adapters/http/server/types.js.map +1 -0
- package/dist/adapters/http/shared/constants.d.ts +95 -0
- package/dist/adapters/http/shared/constants.d.ts.map +1 -0
- package/dist/adapters/http/shared/constants.js +102 -0
- package/dist/adapters/http/shared/constants.js.map +1 -0
- package/dist/adapters/http/shared/errors.d.ts +78 -0
- package/dist/adapters/http/shared/errors.d.ts.map +1 -0
- package/dist/adapters/http/shared/errors.js +151 -0
- package/dist/adapters/http/shared/errors.js.map +1 -0
- package/dist/adapters/http/shared/headers.d.ts +122 -0
- package/dist/adapters/http/shared/headers.d.ts.map +1 -0
- package/dist/adapters/http/shared/headers.js +216 -0
- package/dist/adapters/http/shared/headers.js.map +1 -0
- package/dist/adapters/http/shared/index.d.ts +12 -0
- package/dist/adapters/http/shared/index.d.ts.map +1 -0
- package/dist/adapters/http/shared/index.js +17 -0
- package/dist/adapters/http/shared/index.js.map +1 -0
- package/dist/adapters/http/shared/status-codes.d.ts +92 -0
- package/dist/adapters/http/shared/status-codes.d.ts.map +1 -0
- package/dist/adapters/http/shared/status-codes.js +189 -0
- package/dist/adapters/http/shared/status-codes.js.map +1 -0
- package/dist/adapters/http/shared/strategies.d.ts +90 -0
- package/dist/adapters/http/shared/strategies.d.ts.map +1 -0
- package/dist/adapters/http/shared/strategies.js +180 -0
- package/dist/adapters/http/shared/strategies.js.map +1 -0
- package/dist/adapters/local/client/index.d.ts +8 -0
- package/dist/adapters/local/client/index.d.ts.map +1 -0
- package/dist/adapters/local/client/index.js +8 -0
- package/dist/adapters/local/client/index.js.map +1 -0
- package/dist/adapters/local/client/transport.d.ts +81 -0
- package/dist/adapters/local/client/transport.d.ts.map +1 -0
- package/dist/adapters/local/client/transport.js +172 -0
- package/dist/adapters/local/client/transport.js.map +1 -0
- package/dist/adapters/local/client/types.d.ts +39 -0
- package/dist/adapters/local/client/types.d.ts.map +1 -0
- package/dist/adapters/local/client/types.js +13 -0
- package/dist/adapters/local/client/types.js.map +1 -0
- package/dist/adapters/metadata.d.ts +10 -0
- package/dist/adapters/metadata.d.ts.map +1 -0
- package/dist/adapters/metadata.js +19 -0
- package/dist/adapters/metadata.js.map +1 -0
- package/dist/adapters/mock/client/builder.d.ts +35 -0
- package/dist/adapters/mock/client/builder.d.ts.map +1 -0
- package/dist/adapters/mock/client/builder.js +58 -0
- package/dist/adapters/mock/client/builder.js.map +1 -0
- package/dist/adapters/mock/client/index.d.ts +9 -0
- package/dist/adapters/mock/client/index.d.ts.map +1 -0
- package/dist/adapters/mock/client/index.js +10 -0
- package/dist/adapters/mock/client/index.js.map +1 -0
- package/dist/adapters/mock/client/transport.d.ts +149 -0
- package/dist/adapters/mock/client/transport.d.ts.map +1 -0
- package/dist/adapters/mock/client/transport.js +289 -0
- package/dist/adapters/mock/client/transport.js.map +1 -0
- package/dist/adapters/mock/client/types.d.ts +86 -0
- package/dist/adapters/mock/client/types.d.ts.map +1 -0
- package/dist/adapters/mock/client/types.js +7 -0
- package/dist/adapters/mock/client/types.js.map +1 -0
- package/dist/adapters/websocket/client/index.d.ts +9 -0
- package/dist/adapters/websocket/client/index.d.ts.map +1 -0
- package/dist/adapters/websocket/client/index.js +9 -0
- package/dist/adapters/websocket/client/index.js.map +1 -0
- package/dist/adapters/websocket/client/transport.d.ts +106 -0
- package/dist/adapters/websocket/client/transport.d.ts.map +1 -0
- package/dist/adapters/websocket/client/transport.js +647 -0
- package/dist/adapters/websocket/client/transport.js.map +1 -0
- package/dist/adapters/websocket/client/types.d.ts +192 -0
- package/dist/adapters/websocket/client/types.d.ts.map +1 -0
- package/dist/adapters/websocket/client/types.js +17 -0
- package/dist/adapters/websocket/client/types.js.map +1 -0
- package/dist/adapters/websocket/index.d.ts +8 -0
- package/dist/adapters/websocket/index.d.ts.map +1 -0
- package/dist/adapters/websocket/index.js +8 -0
- package/dist/adapters/websocket/index.js.map +1 -0
- package/dist/adapters/websocket/server/index.d.ts +8 -0
- package/dist/adapters/websocket/server/index.d.ts.map +1 -0
- package/dist/adapters/websocket/server/index.js +8 -0
- package/dist/adapters/websocket/server/index.js.map +1 -0
- package/dist/adapters/websocket/server/transport.d.ts +112 -0
- package/dist/adapters/websocket/server/transport.d.ts.map +1 -0
- package/dist/adapters/websocket/server/transport.js +619 -0
- package/dist/adapters/websocket/server/transport.js.map +1 -0
- package/dist/adapters/websocket/server/types.d.ts +140 -0
- package/dist/adapters/websocket/server/types.d.ts.map +1 -0
- package/dist/adapters/websocket/server/types.js +7 -0
- package/dist/adapters/websocket/server/types.js.map +1 -0
- package/dist/browser.d.ts +51 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +89 -0
- package/dist/browser.js.map +1 -0
- package/dist/client/batch-executor.d.ts +160 -0
- package/dist/client/batch-executor.d.ts.map +1 -0
- package/dist/client/batch-executor.js +397 -0
- package/dist/client/batch-executor.js.map +1 -0
- package/dist/client/call-types.d.ts +271 -0
- package/dist/client/call-types.d.ts.map +1 -0
- package/dist/client/call-types.js +208 -0
- package/dist/client/call-types.js.map +1 -0
- package/dist/client/client.d.ts +525 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +1011 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/consumption.d.ts +191 -0
- package/dist/client/consumption.d.ts.map +1 -0
- package/dist/client/consumption.js +98 -0
- package/dist/client/consumption.js.map +1 -0
- package/dist/client/context.d.ts +116 -0
- package/dist/client/context.d.ts.map +1 -0
- package/dist/client/context.js +111 -0
- package/dist/client/context.js.map +1 -0
- package/dist/client/errors/codes.d.ts +71 -0
- package/dist/client/errors/codes.d.ts.map +1 -0
- package/dist/client/errors/codes.js +81 -0
- package/dist/client/errors/codes.js.map +1 -0
- package/dist/client/errors/factory.d.ts +102 -0
- package/dist/client/errors/factory.d.ts.map +1 -0
- package/dist/client/errors/factory.js +210 -0
- package/dist/client/errors/factory.js.map +1 -0
- package/dist/client/errors/http-errors.d.ts +47 -0
- package/dist/client/errors/http-errors.d.ts.map +1 -0
- package/dist/client/errors/http-errors.js +548 -0
- package/dist/client/errors/http-errors.js.map +1 -0
- package/dist/client/errors/http-status.d.ts +73 -0
- package/dist/client/errors/http-status.d.ts.map +1 -0
- package/dist/client/errors/http-status.js +79 -0
- package/dist/client/errors/http-status.js.map +1 -0
- package/dist/client/errors/index.d.ts +36 -0
- package/dist/client/errors/index.d.ts.map +1 -0
- package/dist/client/errors/index.js +40 -0
- package/dist/client/errors/index.js.map +1 -0
- package/dist/client/errors/registry.d.ts +38 -0
- package/dist/client/errors/registry.d.ts.map +1 -0
- package/dist/client/errors/registry.js +535 -0
- package/dist/client/errors/registry.js.map +1 -0
- package/dist/client/errors/types.d.ts +112 -0
- package/dist/client/errors/types.d.ts.map +1 -0
- package/dist/client/errors/types.js +45 -0
- package/dist/client/errors/types.js.map +1 -0
- package/dist/client/index.d.ts +44 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +36 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/middleware/auth.d.ts +90 -0
- package/dist/client/middleware/auth.d.ts.map +1 -0
- package/dist/client/middleware/auth.js +98 -0
- package/dist/client/middleware/auth.js.map +1 -0
- package/dist/client/middleware/batching.d.ts +102 -0
- package/dist/client/middleware/batching.d.ts.map +1 -0
- package/dist/client/middleware/batching.js +245 -0
- package/dist/client/middleware/batching.js.map +1 -0
- package/dist/client/middleware/cache.d.ts +124 -0
- package/dist/client/middleware/cache.d.ts.map +1 -0
- package/dist/client/middleware/cache.js +208 -0
- package/dist/client/middleware/cache.js.map +1 -0
- package/dist/client/middleware/circuit-breaker.d.ts +113 -0
- package/dist/client/middleware/circuit-breaker.d.ts.map +1 -0
- package/dist/client/middleware/circuit-breaker.js +236 -0
- package/dist/client/middleware/circuit-breaker.js.map +1 -0
- package/dist/client/middleware/contexts.d.ts +199 -0
- package/dist/client/middleware/contexts.d.ts.map +1 -0
- package/dist/client/middleware/contexts.js +74 -0
- package/dist/client/middleware/contexts.js.map +1 -0
- package/dist/client/middleware/items.d.ts +37 -0
- package/dist/client/middleware/items.d.ts.map +1 -0
- package/dist/client/middleware/items.js +100 -0
- package/dist/client/middleware/items.js.map +1 -0
- package/dist/client/middleware/lru.d.ts +32 -0
- package/dist/client/middleware/lru.d.ts.map +1 -0
- package/dist/client/middleware/lru.js +62 -0
- package/dist/client/middleware/lru.js.map +1 -0
- package/dist/client/middleware/pagination.d.ts +114 -0
- package/dist/client/middleware/pagination.d.ts.map +1 -0
- package/dist/client/middleware/pagination.js +148 -0
- package/dist/client/middleware/pagination.js.map +1 -0
- package/dist/client/middleware/rate-limit.d.ts +105 -0
- package/dist/client/middleware/rate-limit.d.ts.map +1 -0
- package/dist/client/middleware/rate-limit.js +222 -0
- package/dist/client/middleware/rate-limit.js.map +1 -0
- package/dist/client/middleware/retry.d.ts +100 -0
- package/dist/client/middleware/retry.d.ts.map +1 -0
- package/dist/client/middleware/retry.js +150 -0
- package/dist/client/middleware/retry.js.map +1 -0
- package/dist/client/middleware/timeout.d.ts +91 -0
- package/dist/client/middleware/timeout.d.ts.map +1 -0
- package/dist/client/middleware/timeout.js +253 -0
- package/dist/client/middleware/timeout.js.map +1 -0
- package/dist/client/middleware/tracing.d.ts +118 -0
- package/dist/client/middleware/tracing.d.ts.map +1 -0
- package/dist/client/middleware/tracing.js +152 -0
- package/dist/client/middleware/tracing.js.map +1 -0
- package/dist/client/route-resolver.d.ts +181 -0
- package/dist/client/route-resolver.d.ts.map +1 -0
- package/dist/client/route-resolver.js +300 -0
- package/dist/client/route-resolver.js.map +1 -0
- package/dist/client/typed-method.d.ts +29 -0
- package/dist/client/typed-method.d.ts.map +1 -0
- package/dist/client/typed-method.js +36 -0
- package/dist/client/typed-method.js.map +1 -0
- package/dist/client/typed.d.ts +102 -0
- package/dist/client/typed.d.ts.map +1 -0
- package/dist/client/typed.js +52 -0
- package/dist/client/typed.js.map +1 -0
- package/dist/client/types.d.ts +305 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +26 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client/validation/index.d.ts +34 -0
- package/dist/client/validation/index.d.ts.map +1 -0
- package/dist/client/validation/index.js +36 -0
- package/dist/client/validation/index.js.map +1 -0
- package/dist/client/validation/middleware.d.ts +82 -0
- package/dist/client/validation/middleware.d.ts.map +1 -0
- package/dist/client/validation/middleware.js +138 -0
- package/dist/client/validation/middleware.js.map +1 -0
- package/dist/client/validation/types.d.ts +118 -0
- package/dist/client/validation/types.d.ts.map +1 -0
- package/dist/client/validation/types.js +59 -0
- package/dist/client/validation/types.js.map +1 -0
- package/dist/collections/async/async-queue.d.ts +144 -0
- package/dist/collections/async/async-queue.d.ts.map +1 -0
- package/dist/collections/async/async-queue.js +347 -0
- package/dist/collections/async/async-queue.js.map +1 -0
- package/dist/collections/async/channels.d.ts +188 -0
- package/dist/collections/async/channels.d.ts.map +1 -0
- package/dist/collections/async/channels.js +312 -0
- package/dist/collections/async/channels.js.map +1 -0
- package/dist/collections/behaviors/bounded.d.ts +79 -0
- package/dist/collections/behaviors/bounded.d.ts.map +1 -0
- package/dist/collections/behaviors/bounded.js +384 -0
- package/dist/collections/behaviors/bounded.js.map +1 -0
- package/dist/collections/behaviors/evented.d.ts +154 -0
- package/dist/collections/behaviors/evented.d.ts.map +1 -0
- package/dist/collections/behaviors/evented.js +299 -0
- package/dist/collections/behaviors/evented.js.map +1 -0
- package/dist/collections/behaviors/lru.d.ts +84 -0
- package/dist/collections/behaviors/lru.d.ts.map +1 -0
- package/dist/collections/behaviors/lru.js +330 -0
- package/dist/collections/behaviors/lru.js.map +1 -0
- package/dist/collections/behaviors/readonly.d.ts +73 -0
- package/dist/collections/behaviors/readonly.d.ts.map +1 -0
- package/dist/collections/behaviors/readonly.js +158 -0
- package/dist/collections/behaviors/readonly.js.map +1 -0
- package/dist/collections/behaviors/safe.d.ts +163 -0
- package/dist/collections/behaviors/safe.d.ts.map +1 -0
- package/dist/collections/behaviors/safe.js +172 -0
- package/dist/collections/behaviors/safe.js.map +1 -0
- package/dist/collections/behaviors/synchronized.d.ts +88 -0
- package/dist/collections/behaviors/synchronized.d.ts.map +1 -0
- package/dist/collections/behaviors/synchronized.js +294 -0
- package/dist/collections/behaviors/synchronized.js.map +1 -0
- package/dist/collections/behaviors/ttl.d.ts +118 -0
- package/dist/collections/behaviors/ttl.d.ts.map +1 -0
- package/dist/collections/behaviors/ttl.js +338 -0
- package/dist/collections/behaviors/ttl.js.map +1 -0
- package/dist/collections/core/effects.d.ts +176 -0
- package/dist/collections/core/effects.d.ts.map +1 -0
- package/dist/collections/core/effects.js +180 -0
- package/dist/collections/core/effects.js.map +1 -0
- package/dist/collections/core/events.d.ts +192 -0
- package/dist/collections/core/events.d.ts.map +1 -0
- package/dist/collections/core/events.js +291 -0
- package/dist/collections/core/events.js.map +1 -0
- package/dist/collections/core/middleware.d.ts +231 -0
- package/dist/collections/core/middleware.d.ts.map +1 -0
- package/dist/collections/core/middleware.js +161 -0
- package/dist/collections/core/middleware.js.map +1 -0
- package/dist/collections/core/policies.d.ts +220 -0
- package/dist/collections/core/policies.d.ts.map +1 -0
- package/dist/collections/core/policies.js +48 -0
- package/dist/collections/core/policies.js.map +1 -0
- package/dist/collections/core/traits.d.ts +142 -0
- package/dist/collections/core/traits.d.ts.map +1 -0
- package/dist/collections/core/traits.js +8 -0
- package/dist/collections/core/traits.js.map +1 -0
- package/dist/collections/examples.d.ts +13 -0
- package/dist/collections/examples.d.ts.map +1 -0
- package/dist/collections/examples.js +302 -0
- package/dist/collections/examples.js.map +1 -0
- package/dist/collections/fx/collectors.d.ts +190 -0
- package/dist/collections/fx/collectors.d.ts.map +1 -0
- package/dist/collections/fx/collectors.js +369 -0
- package/dist/collections/fx/collectors.js.map +1 -0
- package/dist/collections/fx/iter.d.ts +166 -0
- package/dist/collections/fx/iter.d.ts.map +1 -0
- package/dist/collections/fx/iter.js +421 -0
- package/dist/collections/fx/iter.js.map +1 -0
- package/dist/collections/impl/array-deque.d.ts +107 -0
- package/dist/collections/impl/array-deque.d.ts.map +1 -0
- package/dist/collections/impl/array-deque.js +381 -0
- package/dist/collections/impl/array-deque.js.map +1 -0
- package/dist/collections/impl/array-list.d.ts +101 -0
- package/dist/collections/impl/array-list.d.ts.map +1 -0
- package/dist/collections/impl/array-list.js +387 -0
- package/dist/collections/impl/array-list.js.map +1 -0
- package/dist/collections/impl/hash-map.d.ts +141 -0
- package/dist/collections/impl/hash-map.d.ts.map +1 -0
- package/dist/collections/impl/hash-map.js +450 -0
- package/dist/collections/impl/hash-map.js.map +1 -0
- package/dist/collections/impl/hash-set.d.ts +125 -0
- package/dist/collections/impl/hash-set.d.ts.map +1 -0
- package/dist/collections/impl/hash-set.js +264 -0
- package/dist/collections/impl/hash-set.js.map +1 -0
- package/dist/collections/impl/linked-hash-map.d.ts +141 -0
- package/dist/collections/impl/linked-hash-map.d.ts.map +1 -0
- package/dist/collections/impl/linked-hash-map.js +472 -0
- package/dist/collections/impl/linked-hash-map.js.map +1 -0
- package/dist/collections/impl/linked-list.d.ts +109 -0
- package/dist/collections/impl/linked-list.d.ts.map +1 -0
- package/dist/collections/impl/linked-list.js +491 -0
- package/dist/collections/impl/linked-list.js.map +1 -0
- package/dist/collections/impl/priority-queue.d.ts +134 -0
- package/dist/collections/impl/priority-queue.d.ts.map +1 -0
- package/dist/collections/impl/priority-queue.js +336 -0
- package/dist/collections/impl/priority-queue.js.map +1 -0
- package/dist/collections/impl/tree-map.d.ts +146 -0
- package/dist/collections/impl/tree-map.d.ts.map +1 -0
- package/dist/collections/impl/tree-map.js +781 -0
- package/dist/collections/impl/tree-map.js.map +1 -0
- package/dist/collections/impl/tree-set.d.ts +112 -0
- package/dist/collections/impl/tree-set.d.ts.map +1 -0
- package/dist/collections/impl/tree-set.js +374 -0
- package/dist/collections/impl/tree-set.js.map +1 -0
- package/dist/collections/index.d.ts +105 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/collections/index.js +135 -0
- package/dist/collections/index.js.map +1 -0
- package/dist/collections/interfaces/collection.d.ts +119 -0
- package/dist/collections/interfaces/collection.d.ts.map +1 -0
- package/dist/collections/interfaces/collection.js +8 -0
- package/dist/collections/interfaces/collection.js.map +1 -0
- package/dist/collections/interfaces/list.d.ts +247 -0
- package/dist/collections/interfaces/list.d.ts.map +1 -0
- package/dist/collections/interfaces/list.js +8 -0
- package/dist/collections/interfaces/list.js.map +1 -0
- package/dist/collections/interfaces/map.d.ts +344 -0
- package/dist/collections/interfaces/map.d.ts.map +1 -0
- package/dist/collections/interfaces/map.js +8 -0
- package/dist/collections/interfaces/map.js.map +1 -0
- package/dist/collections/interfaces/queue.d.ts +304 -0
- package/dist/collections/interfaces/queue.d.ts.map +1 -0
- package/dist/collections/interfaces/queue.js +8 -0
- package/dist/collections/interfaces/queue.js.map +1 -0
- package/dist/collections/interfaces/set.d.ts +137 -0
- package/dist/collections/interfaces/set.d.ts.map +1 -0
- package/dist/collections/interfaces/set.js +8 -0
- package/dist/collections/interfaces/set.js.map +1 -0
- package/dist/collections/storage/api.d.ts +109 -0
- package/dist/collections/storage/api.d.ts.map +1 -0
- package/dist/collections/storage/api.js +182 -0
- package/dist/collections/storage/api.js.map +1 -0
- package/dist/collections/storage/hybrid.d.ts +164 -0
- package/dist/collections/storage/hybrid.d.ts.map +1 -0
- package/dist/collections/storage/hybrid.js +416 -0
- package/dist/collections/storage/hybrid.js.map +1 -0
- package/dist/collections/storage/index.d.ts +16 -0
- package/dist/collections/storage/index.d.ts.map +1 -0
- package/dist/collections/storage/index.js +13 -0
- package/dist/collections/storage/index.js.map +1 -0
- package/dist/collections/storage/interface.d.ts +141 -0
- package/dist/collections/storage/interface.d.ts.map +1 -0
- package/dist/collections/storage/interface.js +23 -0
- package/dist/collections/storage/interface.js.map +1 -0
- package/dist/collections/storage/memory.d.ts +68 -0
- package/dist/collections/storage/memory.d.ts.map +1 -0
- package/dist/collections/storage/memory.js +154 -0
- package/dist/collections/storage/memory.js.map +1 -0
- package/dist/collections/utils/defaults.d.ts +135 -0
- package/dist/collections/utils/defaults.d.ts.map +1 -0
- package/dist/collections/utils/defaults.js +322 -0
- package/dist/collections/utils/defaults.js.map +1 -0
- package/dist/collections/utils/factories.d.ts +144 -0
- package/dist/collections/utils/factories.d.ts.map +1 -0
- package/dist/collections/utils/factories.js +293 -0
- package/dist/collections/utils/factories.js.map +1 -0
- package/dist/collections/utils/helpers.d.ts +137 -0
- package/dist/collections/utils/helpers.d.ts.map +1 -0
- package/dist/collections/utils/helpers.js +221 -0
- package/dist/collections/utils/helpers.js.map +1 -0
- package/dist/collections.d.ts +12 -0
- package/dist/collections.d.ts.map +1 -0
- package/dist/collections.js +10 -0
- package/dist/collections.js.map +1 -0
- package/dist/components/define.d.ts +134 -0
- package/dist/components/define.d.ts.map +1 -0
- package/dist/components/define.js +486 -0
- package/dist/components/define.js.map +1 -0
- package/dist/components/index.d.ts +39 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +38 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/types.d.ts +264 -0
- package/dist/components/types.d.ts.map +1 -0
- package/dist/components/types.js +46 -0
- package/dist/components/types.js.map +1 -0
- package/dist/events/bus.d.ts +193 -0
- package/dist/events/bus.d.ts.map +1 -0
- package/dist/events/bus.js +511 -0
- package/dist/events/bus.js.map +1 -0
- package/dist/events/index.d.ts +34 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +36 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/types.d.ts +242 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +8 -0
- package/dist/events/types.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/compose.d.ts +88 -0
- package/dist/middleware/compose.d.ts.map +1 -0
- package/dist/middleware/compose.js +108 -0
- package/dist/middleware/compose.js.map +1 -0
- package/dist/middleware/index.d.ts +12 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +11 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/types.d.ts +112 -0
- package/dist/middleware/types.d.ts.map +1 -0
- package/dist/middleware/types.js +14 -0
- package/dist/middleware/types.js.map +1 -0
- package/dist/procedures/capability.d.ts +111 -0
- package/dist/procedures/capability.d.ts.map +1 -0
- package/dist/procedures/capability.js +269 -0
- package/dist/procedures/capability.js.map +1 -0
- package/dist/procedures/cli/announce.d.ts +67 -0
- package/dist/procedures/cli/announce.d.ts.map +1 -0
- package/dist/procedures/cli/announce.js +392 -0
- package/dist/procedures/cli/announce.js.map +1 -0
- package/dist/procedures/cli/discover.d.ts +66 -0
- package/dist/procedures/cli/discover.d.ts.map +1 -0
- package/dist/procedures/cli/discover.js +310 -0
- package/dist/procedures/cli/discover.js.map +1 -0
- package/dist/procedures/cli/index.d.ts +13 -0
- package/dist/procedures/cli/index.d.ts.map +1 -0
- package/dist/procedures/cli/index.js +203 -0
- package/dist/procedures/cli/index.js.map +1 -0
- package/dist/procedures/cli/init.d.ts +17 -0
- package/dist/procedures/cli/init.d.ts.map +1 -0
- package/dist/procedures/cli/init.js +336 -0
- package/dist/procedures/cli/init.js.map +1 -0
- package/dist/procedures/collection/index.d.ts +10 -0
- package/dist/procedures/collection/index.d.ts.map +1 -0
- package/dist/procedures/collection/index.js +10 -0
- package/dist/procedures/collection/index.js.map +1 -0
- package/dist/procedures/collection/procedures.d.ts +21 -0
- package/dist/procedures/collection/procedures.d.ts.map +1 -0
- package/dist/procedures/collection/procedures.js +210 -0
- package/dist/procedures/collection/procedures.js.map +1 -0
- package/dist/procedures/collection/schemas.d.ts +131 -0
- package/dist/procedures/collection/schemas.d.ts.map +1 -0
- package/dist/procedures/collection/schemas.js +422 -0
- package/dist/procedures/collection/schemas.js.map +1 -0
- package/dist/procedures/collection/storage.d.ts +53 -0
- package/dist/procedures/collection/storage.d.ts.map +1 -0
- package/dist/procedures/collection/storage.js +2 -0
- package/dist/procedures/collection/storage.js.map +1 -0
- package/dist/procedures/core/array.d.ts +276 -0
- package/dist/procedures/core/array.d.ts.map +1 -0
- package/dist/procedures/core/array.js +639 -0
- package/dist/procedures/core/array.js.map +1 -0
- package/dist/procedures/core/comparison.d.ts +85 -0
- package/dist/procedures/core/comparison.d.ts.map +1 -0
- package/dist/procedures/core/comparison.js +158 -0
- package/dist/procedures/core/comparison.js.map +1 -0
- package/dist/procedures/core/index.d.ts +261 -0
- package/dist/procedures/core/index.d.ts.map +1 -0
- package/dist/procedures/core/index.js +588 -0
- package/dist/procedures/core/index.js.map +1 -0
- package/dist/procedures/core/logic.d.ts +144 -0
- package/dist/procedures/core/logic.d.ts.map +1 -0
- package/dist/procedures/core/logic.js +169 -0
- package/dist/procedures/core/logic.js.map +1 -0
- package/dist/procedures/core/math.d.ts +139 -0
- package/dist/procedures/core/math.d.ts.map +1 -0
- package/dist/procedures/core/math.js +275 -0
- package/dist/procedures/core/math.js.map +1 -0
- package/dist/procedures/core/meta.d.ts +111 -0
- package/dist/procedures/core/meta.d.ts.map +1 -0
- package/dist/procedures/core/meta.js +244 -0
- package/dist/procedures/core/meta.js.map +1 -0
- package/dist/procedures/core/object.d.ts +109 -0
- package/dist/procedures/core/object.d.ts.map +1 -0
- package/dist/procedures/core/object.js +272 -0
- package/dist/procedures/core/object.js.map +1 -0
- package/dist/procedures/core/operands.d.ts +51 -0
- package/dist/procedures/core/operands.d.ts.map +1 -0
- package/dist/procedures/core/operands.js +90 -0
- package/dist/procedures/core/operands.js.map +1 -0
- package/dist/procedures/core/outputs.d.ts +28 -0
- package/dist/procedures/core/outputs.d.ts.map +1 -0
- package/dist/procedures/core/outputs.js +42 -0
- package/dist/procedures/core/outputs.js.map +1 -0
- package/dist/procedures/core/results.d.ts +202 -0
- package/dist/procedures/core/results.d.ts.map +1 -0
- package/dist/procedures/core/results.js +106 -0
- package/dist/procedures/core/results.js.map +1 -0
- package/dist/procedures/core/schemas.d.ts +48 -0
- package/dist/procedures/core/schemas.d.ts.map +1 -0
- package/dist/procedures/core/schemas.js +102 -0
- package/dist/procedures/core/schemas.js.map +1 -0
- package/dist/procedures/core/string.d.ts +138 -0
- package/dist/procedures/core/string.d.ts.map +1 -0
- package/dist/procedures/core/string.js +270 -0
- package/dist/procedures/core/string.js.map +1 -0
- package/dist/procedures/core/type.d.ts +101 -0
- package/dist/procedures/core/type.d.ts.map +1 -0
- package/dist/procedures/core/type.js +210 -0
- package/dist/procedures/core/type.js.map +1 -0
- package/dist/procedures/define-procedure.d.ts +187 -0
- package/dist/procedures/define-procedure.d.ts.map +1 -0
- package/dist/procedures/define-procedure.js +357 -0
- package/dist/procedures/define-procedure.js.map +1 -0
- package/dist/procedures/define.d.ts +228 -0
- package/dist/procedures/define.d.ts.map +1 -0
- package/dist/procedures/define.js +300 -0
- package/dist/procedures/define.js.map +1 -0
- package/dist/procedures/discovery.d.ts +57 -0
- package/dist/procedures/discovery.d.ts.map +1 -0
- package/dist/procedures/discovery.js +68 -0
- package/dist/procedures/discovery.js.map +1 -0
- package/dist/procedures/effects.d.ts +15 -0
- package/dist/procedures/effects.d.ts.map +1 -0
- package/dist/procedures/effects.js +18 -0
- package/dist/procedures/effects.js.map +1 -0
- package/dist/procedures/index.d.ts +27 -0
- package/dist/procedures/index.d.ts.map +1 -0
- package/dist/procedures/index.js +54 -0
- package/dist/procedures/index.js.map +1 -0
- package/dist/procedures/interceptors.d.ts +82 -0
- package/dist/procedures/interceptors.d.ts.map +1 -0
- package/dist/procedures/interceptors.js +194 -0
- package/dist/procedures/interceptors.js.map +1 -0
- package/dist/procedures/invoke.d.ts +155 -0
- package/dist/procedures/invoke.d.ts.map +1 -0
- package/dist/procedures/invoke.js +343 -0
- package/dist/procedures/invoke.js.map +1 -0
- package/dist/procedures/module.d.ts +54 -0
- package/dist/procedures/module.d.ts.map +1 -0
- package/dist/procedures/module.js +103 -0
- package/dist/procedures/module.js.map +1 -0
- package/dist/procedures/policy.d.ts +70 -0
- package/dist/procedures/policy.d.ts.map +1 -0
- package/dist/procedures/policy.js +138 -0
- package/dist/procedures/policy.js.map +1 -0
- package/dist/procedures/ref.d.ts +606 -0
- package/dist/procedures/ref.d.ts.map +1 -0
- package/dist/procedures/ref.js +895 -0
- package/dist/procedures/ref.js.map +1 -0
- package/dist/procedures/registry.d.ts +208 -0
- package/dist/procedures/registry.d.ts.map +1 -0
- package/dist/procedures/registry.js +402 -0
- package/dist/procedures/registry.js.map +1 -0
- package/dist/procedures/schema.d.ts +126 -0
- package/dist/procedures/schema.d.ts.map +1 -0
- package/dist/procedures/schema.js +108 -0
- package/dist/procedures/schema.js.map +1 -0
- package/dist/procedures/storage/adapter.d.ts +148 -0
- package/dist/procedures/storage/adapter.d.ts.map +1 -0
- package/dist/procedures/storage/adapter.js +214 -0
- package/dist/procedures/storage/adapter.js.map +1 -0
- package/dist/procedures/storage/api.d.ts +125 -0
- package/dist/procedures/storage/api.d.ts.map +1 -0
- package/dist/procedures/storage/api.js +220 -0
- package/dist/procedures/storage/api.js.map +1 -0
- package/dist/procedures/storage/factory.d.ts +134 -0
- package/dist/procedures/storage/factory.d.ts.map +1 -0
- package/dist/procedures/storage/factory.js +166 -0
- package/dist/procedures/storage/factory.js.map +1 -0
- package/dist/procedures/storage/hybrid.d.ts +193 -0
- package/dist/procedures/storage/hybrid.d.ts.map +1 -0
- package/dist/procedures/storage/hybrid.js +519 -0
- package/dist/procedures/storage/hybrid.js.map +1 -0
- package/dist/procedures/storage/index.d.ts +17 -0
- package/dist/procedures/storage/index.d.ts.map +1 -0
- package/dist/procedures/storage/index.js +17 -0
- package/dist/procedures/storage/index.js.map +1 -0
- package/dist/procedures/storage/procedures.d.ts +39 -0
- package/dist/procedures/storage/procedures.d.ts.map +1 -0
- package/dist/procedures/storage/procedures.js +261 -0
- package/dist/procedures/storage/procedures.js.map +1 -0
- package/dist/procedures/storage/serialization.d.ts +123 -0
- package/dist/procedures/storage/serialization.d.ts.map +1 -0
- package/dist/procedures/storage/serialization.js +216 -0
- package/dist/procedures/storage/serialization.js.map +1 -0
- package/dist/procedures/storage/synced-registry.d.ts +246 -0
- package/dist/procedures/storage/synced-registry.d.ts.map +1 -0
- package/dist/procedures/storage/synced-registry.js +575 -0
- package/dist/procedures/storage/synced-registry.js.map +1 -0
- package/dist/procedures/storage/types.d.ts +130 -0
- package/dist/procedures/storage/types.d.ts.map +1 -0
- package/dist/procedures/storage/types.js +8 -0
- package/dist/procedures/storage/types.js.map +1 -0
- package/dist/procedures/types.d.ts +468 -0
- package/dist/procedures/types.d.ts.map +1 -0
- package/dist/procedures/types.js +23 -0
- package/dist/procedures/types.js.map +1 -0
- package/dist/register.d.ts +8 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +9 -0
- package/dist/register.js.map +1 -0
- package/dist/server/browser-guard.d.ts +69 -0
- package/dist/server/browser-guard.d.ts.map +1 -0
- package/dist/server/browser-guard.js +103 -0
- package/dist/server/browser-guard.js.map +1 -0
- package/dist/server/host-policy.d.ts +81 -0
- package/dist/server/host-policy.d.ts.map +1 -0
- package/dist/server/host-policy.js +104 -0
- package/dist/server/host-policy.js.map +1 -0
- package/dist/server/index.d.ts +46 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +42 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/method.d.ts +24 -0
- package/dist/server/method.d.ts.map +1 -0
- package/dist/server/method.js +29 -0
- package/dist/server/method.js.map +1 -0
- package/dist/server/procedure-server.d.ts +226 -0
- package/dist/server/procedure-server.d.ts.map +1 -0
- package/dist/server/procedure-server.js +348 -0
- package/dist/server/procedure-server.js.map +1 -0
- package/dist/server/server.d.ts +161 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +279 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/types.d.ts +106 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +29 -0
- package/dist/server/types.js.map +1 -0
- package/package.json +117 -3
- package/src/adapters/http/client/index.ts +51 -0
- package/src/adapters/http/client/transport.ts +338 -0
- package/src/adapters/http/client/types.ts +33 -0
- package/src/adapters/http/index.ts +7 -0
- package/src/adapters/http/server/index.ts +14 -0
- package/src/adapters/http/server/strategies.ts +105 -0
- package/src/adapters/http/server/transport.ts +623 -0
- package/src/adapters/http/server/types.ts +81 -0
- package/src/adapters/http/shared/constants.ts +108 -0
- package/src/adapters/http/shared/errors.ts +199 -0
- package/src/adapters/http/shared/headers.ts +291 -0
- package/src/adapters/http/shared/index.ts +21 -0
- package/src/adapters/http/shared/status-codes.ts +212 -0
- package/src/adapters/http/shared/strategies.ts +255 -0
- package/src/adapters/local/client/index.ts +11 -0
- package/src/adapters/local/client/transport.ts +188 -0
- package/src/adapters/local/client/types.ts +50 -0
- package/src/adapters/metadata.ts +17 -0
- package/src/adapters/mock/client/builder.ts +64 -0
- package/src/adapters/mock/client/index.ts +19 -0
- package/src/adapters/mock/client/transport.ts +352 -0
- package/src/adapters/mock/client/types.ts +99 -0
- package/src/adapters/websocket/client/index.ts +18 -0
- package/src/adapters/websocket/client/transport.ts +733 -0
- package/src/adapters/websocket/client/types.ts +235 -0
- package/src/adapters/websocket/index.ts +24 -0
- package/src/adapters/websocket/server/index.ts +18 -0
- package/src/adapters/websocket/server/transport.ts +705 -0
- package/src/adapters/websocket/server/types.ts +169 -0
- package/src/browser.ts +401 -0
- package/src/client/batch-executor.ts +514 -0
- package/src/client/call-types.ts +491 -0
- package/src/client/client.ts +1229 -0
- package/src/client/consumption.ts +288 -0
- package/src/client/context.ts +228 -0
- package/src/client/errors/README.md +279 -0
- package/src/client/errors/codes.ts +88 -0
- package/src/client/errors/factory.ts +263 -0
- package/src/client/errors/http-errors.ts +601 -0
- package/src/client/errors/http-status.ts +82 -0
- package/src/client/errors/index.ts +72 -0
- package/src/client/errors/registry.ts +595 -0
- package/src/client/errors/types.ts +139 -0
- package/src/client/index.ts +124 -0
- package/src/client/middleware/auth.ts +132 -0
- package/src/client/middleware/cache.ts +316 -0
- package/src/client/middleware/circuit-breaker.ts +339 -0
- package/src/client/middleware/contexts.ts +319 -0
- package/src/client/middleware/items.ts +114 -0
- package/src/client/middleware/lru.ts +66 -0
- package/src/client/middleware/pagination.ts +213 -0
- package/src/client/middleware/rate-limit.ts +315 -0
- package/src/client/middleware/retry.ts +236 -0
- package/src/client/middleware/timeout.ts +308 -0
- package/src/client/middleware/tracing.ts +191 -0
- package/src/client/route-resolver.ts +407 -0
- package/src/client/typed-method.ts +65 -0
- package/src/client/typed.ts +140 -0
- package/src/client/types.ts +372 -0
- package/src/client/validation/index.ts +56 -0
- package/src/client/validation/middleware.ts +254 -0
- package/src/client/validation/types.ts +162 -0
- package/src/events/bus.ts +594 -0
- package/src/events/index.ts +67 -0
- package/src/events/types.ts +263 -0
- package/src/index.ts +33 -0
- package/src/middleware/compose.ts +159 -0
- package/src/middleware/index.ts +28 -0
- package/src/middleware/types.ts +166 -0
- package/src/procedures/capability.ts +333 -0
- package/src/procedures/cli/announce.ts +470 -0
- package/src/procedures/cli/discover.ts +390 -0
- package/src/procedures/cli/index.ts +231 -0
- package/src/procedures/cli/init.ts +370 -0
- package/src/procedures/collection/index.ts +51 -0
- package/src/procedures/collection/procedures.ts +257 -0
- package/src/procedures/collection/schemas.ts +550 -0
- package/src/procedures/collection/storage.ts +53 -0
- package/src/procedures/core/array.ts +1026 -0
- package/src/procedures/core/comparison.ts +265 -0
- package/src/procedures/core/index.ts +898 -0
- package/src/procedures/core/logic.ts +225 -0
- package/src/procedures/core/math.ts +471 -0
- package/src/procedures/core/meta.ts +389 -0
- package/src/procedures/core/object.ts +429 -0
- package/src/procedures/core/operands.ts +119 -0
- package/src/procedures/core/outputs.ts +48 -0
- package/src/procedures/core/results.ts +296 -0
- package/src/procedures/core/schemas.ts +123 -0
- package/src/procedures/core/string.ts +460 -0
- package/src/procedures/core/type.ts +346 -0
- package/src/procedures/define-procedure.ts +532 -0
- package/src/procedures/define.ts +387 -0
- package/src/procedures/discovery.ts +76 -0
- package/src/procedures/effects.ts +24 -0
- package/src/procedures/index.ts +239 -0
- package/src/procedures/interceptors.ts +273 -0
- package/src/procedures/invoke.ts +506 -0
- package/src/procedures/module.ts +117 -0
- package/src/procedures/policy.ts +171 -0
- package/src/procedures/ref.ts +1305 -0
- package/src/procedures/registry.ts +473 -0
- package/src/procedures/schema.ts +225 -0
- package/src/procedures/types.ts +596 -0
- package/src/register.ts +10 -0
- package/src/server/browser-guard.ts +147 -0
- package/src/server/host-policy.ts +163 -0
- package/src/server/index.ts +70 -0
- package/src/server/method.ts +33 -0
- package/src/server/procedure-server.ts +459 -0
- package/src/server/server.ts +364 -0
- package/src/server/types.ts +147 -0
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Procedure Registry
|
|
3
|
+
*
|
|
4
|
+
* Central registry for procedure definitions.
|
|
5
|
+
* Supports auto-discovery via module self-registration pattern.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type {
|
|
9
|
+
AnyProcedure,
|
|
10
|
+
ProcedurePath,
|
|
11
|
+
RegistryEventType,
|
|
12
|
+
RegistryListener,
|
|
13
|
+
ProcedureModule,
|
|
14
|
+
RegistrationOptions,
|
|
15
|
+
} from "./types.js";
|
|
16
|
+
import { pathToKey } from "./types.js";
|
|
17
|
+
import { validateCalls } from "./policy.js";
|
|
18
|
+
|
|
19
|
+
// =============================================================================
|
|
20
|
+
// Registry Errors
|
|
21
|
+
// =============================================================================
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Error thrown when procedure registration fails.
|
|
25
|
+
*/
|
|
26
|
+
export class RegistryError extends Error {
|
|
27
|
+
override readonly name = "RegistryError";
|
|
28
|
+
readonly path: ProcedurePath;
|
|
29
|
+
|
|
30
|
+
constructor(
|
|
31
|
+
message: string,
|
|
32
|
+
path: ProcedurePath,
|
|
33
|
+
cause?: Error
|
|
34
|
+
) {
|
|
35
|
+
super(message, { cause });
|
|
36
|
+
this.path = path;
|
|
37
|
+
|
|
38
|
+
if (Error.captureStackTrace) {
|
|
39
|
+
Error.captureStackTrace(this, RegistryError);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// =============================================================================
|
|
45
|
+
// Path Segments
|
|
46
|
+
// =============================================================================
|
|
47
|
+
|
|
48
|
+
/** Segments that name properties of every object. A path must not use them. */
|
|
49
|
+
const RESERVED_SEGMENTS: ReadonlySet<string> = new Set(["__proto__", "constructor", "prototype"]);
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* This function checks a procedure path: at least one segment, each a non-empty string, and
|
|
53
|
+
* none of `__proto__`, `constructor` or `prototype`. A reserved segment reaches
|
|
54
|
+
* `Object.prototype` in a tree walk (deep dive CORE-6). A segment can contain a dot
|
|
55
|
+
* (`["fs", "read.json"]`), but the registry rejects two different paths with the same key.
|
|
56
|
+
*
|
|
57
|
+
* @throws RegistryError when the path is not valid
|
|
58
|
+
*/
|
|
59
|
+
export function assertValidPath(path: ProcedurePath): void {
|
|
60
|
+
if (!Array.isArray(path) || path.length === 0) {
|
|
61
|
+
throw new RegistryError("A procedure path must have at least one segment", path ?? []);
|
|
62
|
+
}
|
|
63
|
+
for (const segment of path) {
|
|
64
|
+
if (typeof segment !== "string" || segment === "") {
|
|
65
|
+
throw new RegistryError(`A path segment must be a non-empty string: ${JSON.stringify(path)}`, path);
|
|
66
|
+
}
|
|
67
|
+
if (RESERVED_SEGMENTS.has(segment)) {
|
|
68
|
+
throw new RegistryError(`A path segment must not be ${JSON.stringify(segment)}: ${JSON.stringify(path)}`, path);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function samePath(a: ProcedurePath, b: ProcedurePath): boolean {
|
|
74
|
+
return a.length === b.length && a.every((segment, index) => segment === b[index]);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// =============================================================================
|
|
78
|
+
// Procedure Registry
|
|
79
|
+
// =============================================================================
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Central registry for procedure definitions.
|
|
83
|
+
*
|
|
84
|
+
* Features:
|
|
85
|
+
* - Path-based procedure storage and lookup
|
|
86
|
+
* - Event emission for registration/unregistration
|
|
87
|
+
* - Module bulk registration with path prefixing
|
|
88
|
+
* - Tree traversal for namespace queries
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```typescript
|
|
92
|
+
* const registry = new ProcedureRegistry();
|
|
93
|
+
*
|
|
94
|
+
* // Register a procedure
|
|
95
|
+
* registry.register(getUserProcedure);
|
|
96
|
+
*
|
|
97
|
+
* // Lookup by path
|
|
98
|
+
* const proc = registry.get(['users', 'get']);
|
|
99
|
+
*
|
|
100
|
+
* // Listen for registrations
|
|
101
|
+
* registry.on('register', (proc) => console.log('Registered:', proc.path));
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
export class ProcedureRegistry {
|
|
105
|
+
/** Procedures stored by path key */
|
|
106
|
+
private readonly procedures = new Map<string, AnyProcedure>();
|
|
107
|
+
|
|
108
|
+
/** Event listeners */
|
|
109
|
+
private readonly listeners: RegistryListener[] = [];
|
|
110
|
+
|
|
111
|
+
/** Registered module names for debugging */
|
|
112
|
+
private readonly registeredModules = new Set<string>();
|
|
113
|
+
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
// Registration
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Register a procedure.
|
|
120
|
+
*
|
|
121
|
+
* @param procedure - Procedure to register
|
|
122
|
+
* @param options - Registration options
|
|
123
|
+
* @throws RegistryError if path already exists and override is false
|
|
124
|
+
*/
|
|
125
|
+
register(procedure: AnyProcedure, options?: RegistrationOptions): void {
|
|
126
|
+
const path = options?.pathPrefix
|
|
127
|
+
? [...options.pathPrefix, ...procedure.path]
|
|
128
|
+
: procedure.path;
|
|
129
|
+
|
|
130
|
+
assertValidPath(path);
|
|
131
|
+
const key = pathToKey(path);
|
|
132
|
+
// A list of nested calls that cannot be checked is an error now, not at the first call
|
|
133
|
+
try {
|
|
134
|
+
validateCalls((procedure.metadata as { calls?: unknown } | undefined)?.calls, path);
|
|
135
|
+
} catch (error) {
|
|
136
|
+
throw new RegistryError((error as Error).message, path);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const replaced = this.procedures.get(key);
|
|
140
|
+
// The key joins the segments with dots: ["a.b", "c"] and ["a", "b.c"] have one key
|
|
141
|
+
if (replaced && !samePath(replaced.path, path)) {
|
|
142
|
+
throw new RegistryError(
|
|
143
|
+
`Procedure path ${JSON.stringify(path)} has the same key as ${JSON.stringify(replaced.path)}: ${key}`,
|
|
144
|
+
path
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
if (replaced && !options?.override) {
|
|
148
|
+
throw new RegistryError(
|
|
149
|
+
`Procedure already registered at path: ${key}`,
|
|
150
|
+
path
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Store with potentially prefixed path
|
|
155
|
+
const storedProcedure: AnyProcedure = {
|
|
156
|
+
...procedure,
|
|
157
|
+
path,
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
this.procedures.set(key, storedProcedure);
|
|
161
|
+
// A listener that keeps state per path sees the old procedure go first
|
|
162
|
+
if (replaced) this.emit("unregister", replaced);
|
|
163
|
+
this.emit("register", storedProcedure);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Unregister a procedure by path.
|
|
168
|
+
*
|
|
169
|
+
* @param path - Procedure path to unregister
|
|
170
|
+
* @returns true if procedure was found and removed
|
|
171
|
+
*/
|
|
172
|
+
unregister(path: ProcedurePath): boolean {
|
|
173
|
+
const key = pathToKey(path);
|
|
174
|
+
const procedure = this.procedures.get(key);
|
|
175
|
+
|
|
176
|
+
if (procedure) {
|
|
177
|
+
this.procedures.delete(key);
|
|
178
|
+
this.emit("unregister", procedure);
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Register all procedures from a module.
|
|
187
|
+
*
|
|
188
|
+
* @param module - Module with procedures array
|
|
189
|
+
* @param options - Registration options
|
|
190
|
+
*/
|
|
191
|
+
registerModule(module: ProcedureModule, options?: RegistrationOptions): void {
|
|
192
|
+
if (module.name) {
|
|
193
|
+
this.registeredModules.add(module.name);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
for (const procedure of module.procedures) {
|
|
197
|
+
this.register(procedure, options);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Register multiple procedures.
|
|
203
|
+
*
|
|
204
|
+
* @param procedures - Array of procedures
|
|
205
|
+
* @param options - Registration options
|
|
206
|
+
*/
|
|
207
|
+
registerAll(procedures: AnyProcedure[], options?: RegistrationOptions): void {
|
|
208
|
+
for (const procedure of procedures) {
|
|
209
|
+
this.register(procedure, options);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// ---------------------------------------------------------------------------
|
|
214
|
+
// Lookup
|
|
215
|
+
// ---------------------------------------------------------------------------
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Get a procedure by path.
|
|
219
|
+
*
|
|
220
|
+
* @param path - Procedure path
|
|
221
|
+
* @returns Procedure or undefined if not found
|
|
222
|
+
*/
|
|
223
|
+
get(path: ProcedurePath): AnyProcedure | undefined {
|
|
224
|
+
return this.procedures.get(pathToKey(path));
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Check if a procedure exists at path.
|
|
229
|
+
*
|
|
230
|
+
* @param path - Procedure path
|
|
231
|
+
*/
|
|
232
|
+
has(path: ProcedurePath): boolean {
|
|
233
|
+
return this.procedures.has(pathToKey(path));
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Get all procedures under a namespace prefix.
|
|
238
|
+
*
|
|
239
|
+
* @param prefix - Path prefix to filter by
|
|
240
|
+
* @returns Array of procedures under the prefix
|
|
241
|
+
*
|
|
242
|
+
* @example
|
|
243
|
+
* ```typescript
|
|
244
|
+
* // Get all collection procedures
|
|
245
|
+
* const collectionProcs = registry.getByPrefix(['collections']);
|
|
246
|
+
* ```
|
|
247
|
+
*/
|
|
248
|
+
getByPrefix(prefix: ProcedurePath): AnyProcedure[] {
|
|
249
|
+
const prefixKey = pathToKey(prefix);
|
|
250
|
+
const results: AnyProcedure[] = [];
|
|
251
|
+
|
|
252
|
+
for (const [key, procedure] of this.procedures) {
|
|
253
|
+
if (key === prefixKey || key.startsWith(prefixKey + ".")) {
|
|
254
|
+
results.push(procedure);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return results;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Get all registered procedures.
|
|
263
|
+
*/
|
|
264
|
+
getAll(): AnyProcedure[] {
|
|
265
|
+
return Array.from(this.procedures.values());
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Get count of registered procedures.
|
|
270
|
+
*/
|
|
271
|
+
get size(): number {
|
|
272
|
+
return this.procedures.size;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Get all registered module names.
|
|
277
|
+
*/
|
|
278
|
+
getModules(): string[] {
|
|
279
|
+
return Array.from(this.registeredModules);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// ---------------------------------------------------------------------------
|
|
283
|
+
// Tree Operations
|
|
284
|
+
// ---------------------------------------------------------------------------
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Get the namespace tree structure.
|
|
288
|
+
* Useful for introspection and documentation generation.
|
|
289
|
+
*
|
|
290
|
+
* @returns Nested object representing the procedure tree
|
|
291
|
+
*
|
|
292
|
+
* @example
|
|
293
|
+
* ```typescript
|
|
294
|
+
* const tree = registry.getTree();
|
|
295
|
+
* // {
|
|
296
|
+
* // collections: {
|
|
297
|
+
* // users: { get: procedure, set: procedure },
|
|
298
|
+
* // orders: { list: procedure }
|
|
299
|
+
* // },
|
|
300
|
+
* // weather: { forecast: procedure }
|
|
301
|
+
* // }
|
|
302
|
+
* ```
|
|
303
|
+
*/
|
|
304
|
+
getTree(): Record<string, unknown> {
|
|
305
|
+
// Null-prototype containers and own-property checks: a segment such as "toString" is a
|
|
306
|
+
// name, not a property of Object.prototype (deep dive CORE-6)
|
|
307
|
+
const tree: Record<string, unknown> = Object.create(null);
|
|
308
|
+
|
|
309
|
+
for (const procedure of this.procedures.values()) {
|
|
310
|
+
let current = tree;
|
|
311
|
+
|
|
312
|
+
for (let i = 0; i < procedure.path.length; i++) {
|
|
313
|
+
const segment = procedure.path[i]!;
|
|
314
|
+
const isLast = i === procedure.path.length - 1;
|
|
315
|
+
|
|
316
|
+
if (isLast) {
|
|
317
|
+
current[segment] = procedure;
|
|
318
|
+
} else {
|
|
319
|
+
if (!Object.hasOwn(current, segment)) {
|
|
320
|
+
current[segment] = Object.create(null);
|
|
321
|
+
}
|
|
322
|
+
current = current[segment] as Record<string, unknown>;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
return tree;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Get all unique namespace prefixes at a given depth.
|
|
332
|
+
*
|
|
333
|
+
* @param depth - Depth to query (0 = root namespaces)
|
|
334
|
+
* @returns Array of unique segments at that depth
|
|
335
|
+
*
|
|
336
|
+
* @example
|
|
337
|
+
* ```typescript
|
|
338
|
+
* registry.getNamespacesAtDepth(0); // ['collections', 'weather', 'auth']
|
|
339
|
+
* registry.getNamespacesAtDepth(1); // ['users', 'orders', 'forecast', ...]
|
|
340
|
+
* ```
|
|
341
|
+
*/
|
|
342
|
+
getNamespacesAtDepth(depth: number): string[] {
|
|
343
|
+
const namespaces = new Set<string>();
|
|
344
|
+
|
|
345
|
+
for (const procedure of this.procedures.values()) {
|
|
346
|
+
if (procedure.path.length > depth) {
|
|
347
|
+
namespaces.add(procedure.path[depth]!);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
return Array.from(namespaces);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// ---------------------------------------------------------------------------
|
|
355
|
+
// Events
|
|
356
|
+
// ---------------------------------------------------------------------------
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* Add event listener for registry events.
|
|
360
|
+
*
|
|
361
|
+
* @param event - Event type
|
|
362
|
+
* @param listener - Callback function
|
|
363
|
+
*/
|
|
364
|
+
on(event: RegistryEventType, listener: (procedure: AnyProcedure) => void): void {
|
|
365
|
+
this.listeners.push({ event, listener });
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Remove event listener.
|
|
370
|
+
*
|
|
371
|
+
* @param event - Event type
|
|
372
|
+
* @param listener - Callback function to remove
|
|
373
|
+
*/
|
|
374
|
+
off(event: RegistryEventType, listener: (procedure: AnyProcedure) => void): void {
|
|
375
|
+
const index = this.listeners.findIndex(
|
|
376
|
+
(l) => l.event === event && l.listener === listener
|
|
377
|
+
);
|
|
378
|
+
if (index !== -1) {
|
|
379
|
+
this.listeners.splice(index, 1);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Emit an event to all listeners.
|
|
385
|
+
*/
|
|
386
|
+
private emit(event: RegistryEventType, procedure: AnyProcedure): void {
|
|
387
|
+
for (const { event: listenerEvent, listener } of this.listeners) {
|
|
388
|
+
if (listenerEvent === event) {
|
|
389
|
+
try {
|
|
390
|
+
listener(procedure);
|
|
391
|
+
} catch (error) {
|
|
392
|
+
console.error(`Registry listener error for ${event}:`, error);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// ---------------------------------------------------------------------------
|
|
399
|
+
// Utilities
|
|
400
|
+
// ---------------------------------------------------------------------------
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* Clear all registered procedures.
|
|
404
|
+
* Primarily useful for testing.
|
|
405
|
+
*/
|
|
406
|
+
clear(): void {
|
|
407
|
+
const procedures = Array.from(this.procedures.values());
|
|
408
|
+
|
|
409
|
+
for (const procedure of procedures) {
|
|
410
|
+
this.procedures.delete(pathToKey(procedure.path));
|
|
411
|
+
this.emit("unregister", procedure);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
this.registeredModules.clear();
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* Create a snapshot of current registrations.
|
|
419
|
+
* Useful for debugging and testing.
|
|
420
|
+
*/
|
|
421
|
+
snapshot(): { paths: string[]; modules: string[] } {
|
|
422
|
+
return {
|
|
423
|
+
paths: Array.from(this.procedures.keys()),
|
|
424
|
+
modules: Array.from(this.registeredModules),
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
// =============================================================================
|
|
430
|
+
// Global Registry Singleton
|
|
431
|
+
// =============================================================================
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* Symbol key for storing registry on globalThis.
|
|
435
|
+
* This ensures there's only ONE registry across all module loads,
|
|
436
|
+
* regardless of ESM/CJS interop issues or multiple import paths.
|
|
437
|
+
*/
|
|
438
|
+
const REGISTRY_KEY = Symbol.for("@procedures/client/PROCEDURE_REGISTRY");
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* Get or create the global registry singleton.
|
|
442
|
+
* Uses Symbol.for to ensure the same symbol is used across all contexts.
|
|
443
|
+
*/
|
|
444
|
+
function getGlobalRegistry(): ProcedureRegistry {
|
|
445
|
+
const g = globalThis as Record<symbol, ProcedureRegistry | undefined>;
|
|
446
|
+
if (!g[REGISTRY_KEY]) {
|
|
447
|
+
g[REGISTRY_KEY] = new ProcedureRegistry();
|
|
448
|
+
}
|
|
449
|
+
return g[REGISTRY_KEY];
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
/**
|
|
453
|
+
* Global procedure registry singleton.
|
|
454
|
+
*
|
|
455
|
+
* Used for module self-registration pattern where modules
|
|
456
|
+
* register their procedures at import time.
|
|
457
|
+
*
|
|
458
|
+
* Note: Uses globalThis with a Symbol key to ensure there's truly
|
|
459
|
+
* only one registry across ESM/CJS boundaries and dynamic imports.
|
|
460
|
+
*
|
|
461
|
+
* @example
|
|
462
|
+
* ```typescript
|
|
463
|
+
* // In a module's register.ts (side-effect import)
|
|
464
|
+
* import { PROCEDURE_REGISTRY } from 'client/procedures';
|
|
465
|
+
* import { myProcedures } from './procedures';
|
|
466
|
+
*
|
|
467
|
+
* PROCEDURE_REGISTRY.registerAll(myProcedures);
|
|
468
|
+
*
|
|
469
|
+
* // Consumer just imports the side-effect
|
|
470
|
+
* import 'my-module/register';
|
|
471
|
+
* ```
|
|
472
|
+
*/
|
|
473
|
+
export const PROCEDURE_REGISTRY: ProcedureRegistry = getGlobalRegistry();
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The schemas of procedures: Standard Schema v1, validation and JSON Schema.
|
|
3
|
+
*
|
|
4
|
+
* A procedure's input and output schema is a Standard Schema (https://standardschema.dev):
|
|
5
|
+
* zod 4, valibot, arktype and other libraries give one. An older schema with only `parse` and
|
|
6
|
+
* `safeParse` (`ZodLike`) also works. Every part of the ecosystem validates and describes a
|
|
7
|
+
* schema through the two functions of this module:
|
|
8
|
+
*
|
|
9
|
+
* - `validateSchema()` validates a value (sync when the schema is sync, so a handler can start
|
|
10
|
+
* before the first `await`).
|
|
11
|
+
* - `jsonSchemaOf()` gives the JSON Schema of the input or the output, for the MCP tools, the
|
|
12
|
+
* help and the flags of `mark`, its manifest and the site's catalog.
|
|
13
|
+
*
|
|
14
|
+
* Before, each tool read the private fields of zod 3 (`_def`), the MCP server converted
|
|
15
|
+
* schemas with a zod 3 library, and most procedures had a schema that validated nothing.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { toJSONSchema } from "zod";
|
|
19
|
+
import type { ZodLike } from "../client/validation/types.js";
|
|
20
|
+
|
|
21
|
+
// =============================================================================
|
|
22
|
+
// Standard Schema v1 (the interface of the specification, copied as it advises)
|
|
23
|
+
// =============================================================================
|
|
24
|
+
|
|
25
|
+
/** A schema of the Standard Schema specification, version 1. */
|
|
26
|
+
export interface StandardSchemaV1<Input = unknown, Output = Input> {
|
|
27
|
+
/** The properties of the specification. */
|
|
28
|
+
readonly "~standard": StandardSchemaV1.Props<Input, Output>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
32
|
+
export declare namespace StandardSchemaV1 {
|
|
33
|
+
/** The properties of a Standard Schema. */
|
|
34
|
+
export interface Props<Input = unknown, Output = Input> {
|
|
35
|
+
/** The version number of the specification. */
|
|
36
|
+
readonly version: 1;
|
|
37
|
+
/** The name of the library that made the schema. */
|
|
38
|
+
readonly vendor: string;
|
|
39
|
+
/** The function that validates a value. */
|
|
40
|
+
readonly validate: (value: unknown) => Result<Output> | Promise<Result<Output>>;
|
|
41
|
+
/** The input and output types of the schema (types only). */
|
|
42
|
+
readonly types?: Types<Input, Output> | undefined;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** The result of a validation. */
|
|
46
|
+
export type Result<Output> = SuccessResult<Output> | FailureResult;
|
|
47
|
+
|
|
48
|
+
/** A valid value. */
|
|
49
|
+
export interface SuccessResult<Output> {
|
|
50
|
+
readonly value: Output;
|
|
51
|
+
readonly issues?: undefined;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** An invalid value. */
|
|
55
|
+
export interface FailureResult {
|
|
56
|
+
readonly issues: ReadonlyArray<Issue>;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** One problem of an invalid value. */
|
|
60
|
+
export interface Issue {
|
|
61
|
+
readonly message: string;
|
|
62
|
+
readonly path?: ReadonlyArray<PropertyKey | PathSegment> | undefined;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** A part of the path of an issue. */
|
|
66
|
+
export interface PathSegment {
|
|
67
|
+
readonly key: PropertyKey;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** The input and output types of a schema. */
|
|
71
|
+
export interface Types<Input = unknown, Output = Input> {
|
|
72
|
+
readonly input: Input;
|
|
73
|
+
readonly output: Output;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** The input type of a Standard Schema. */
|
|
77
|
+
export type InferInput<Schema extends StandardSchemaV1> = NonNullable<Schema["~standard"]["types"]>["input"];
|
|
78
|
+
|
|
79
|
+
/** The output type of a Standard Schema. */
|
|
80
|
+
export type InferOutput<Schema extends StandardSchemaV1> = NonNullable<Schema["~standard"]["types"]>["output"];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* The JSON Schema converter of a schema (the "Standard JSON Schema" property that zod 4 gives in
|
|
85
|
+
* `~standard.jsonSchema`).
|
|
86
|
+
*/
|
|
87
|
+
export interface StandardJSONSchemaConverter {
|
|
88
|
+
input(options: { target: JsonSchemaTarget }): Record<string, unknown>;
|
|
89
|
+
output(options: { target: JsonSchemaTarget }): Record<string, unknown>;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** The JSON Schema dialects that a converter can give. */
|
|
93
|
+
export type JsonSchemaTarget = "draft-2020-12" | "draft-07" | "openapi-3.0";
|
|
94
|
+
|
|
95
|
+
// =============================================================================
|
|
96
|
+
// The schema of a procedure
|
|
97
|
+
// =============================================================================
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* The input or output schema of a procedure: a Standard Schema, or an older schema with
|
|
101
|
+
* `parse`/`safeParse` (`ZodLike`).
|
|
102
|
+
*/
|
|
103
|
+
export type ProcedureSchema<T = unknown> = StandardSchemaV1<unknown, T> | ZodLike<T>;
|
|
104
|
+
|
|
105
|
+
/** The type that a schema gives. */
|
|
106
|
+
export type InferSchema<S> =
|
|
107
|
+
S extends StandardSchemaV1<unknown, infer T> ? T : S extends ZodLike<infer U> ? U : unknown;
|
|
108
|
+
|
|
109
|
+
/** True for a value that has the properties of a Standard Schema v1. */
|
|
110
|
+
export function isStandardSchema(value: unknown): value is StandardSchemaV1 {
|
|
111
|
+
if (value === null || (typeof value !== "object" && typeof value !== "function")) return false;
|
|
112
|
+
const props = (value as { "~standard"?: { version?: unknown; validate?: unknown } })["~standard"];
|
|
113
|
+
return !!props && props.version === 1 && typeof props.validate === "function";
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// =============================================================================
|
|
117
|
+
// Validation
|
|
118
|
+
// =============================================================================
|
|
119
|
+
|
|
120
|
+
/** The result of `validateSchema()`. */
|
|
121
|
+
export type SchemaResult<T> =
|
|
122
|
+
| { readonly ok: true; readonly value: T }
|
|
123
|
+
| { readonly ok: false; readonly message: string; readonly issues: ReadonlyArray<StandardSchemaV1.Issue> };
|
|
124
|
+
|
|
125
|
+
/** The text of an issue path: `filter.status` or `items[2]`. */
|
|
126
|
+
function pathText(path: StandardSchemaV1.Issue["path"]): string {
|
|
127
|
+
let text = "";
|
|
128
|
+
for (const part of path ?? []) {
|
|
129
|
+
const key = typeof part === "object" && part !== null ? (part as StandardSchemaV1.PathSegment).key : part;
|
|
130
|
+
text += typeof key === "number" ? `[${key}]` : text === "" ? String(key) : `.${String(key)}`;
|
|
131
|
+
}
|
|
132
|
+
return text;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** One line for each issue: `filter: Expected object, received string`. */
|
|
136
|
+
export function describeIssues(issues: ReadonlyArray<StandardSchemaV1.Issue>): string {
|
|
137
|
+
return issues.map((issue) => (issue.path?.length ? `${pathText(issue.path)}: ${issue.message}` : issue.message)).join("; ");
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function fromStandard<T>(result: StandardSchemaV1.Result<T>): SchemaResult<T> {
|
|
141
|
+
if (result.issues) {
|
|
142
|
+
return { ok: false, message: describeIssues(result.issues) || "Validation failed", issues: result.issues };
|
|
143
|
+
}
|
|
144
|
+
return { ok: true, value: (result as StandardSchemaV1.SuccessResult<T>).value };
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* This function validates a value against a schema. It returns a result, not a Promise, when
|
|
149
|
+
* the schema validates synchronously, so a caller can start the handler before an `await`.
|
|
150
|
+
*/
|
|
151
|
+
export function validateSchema<T>(schema: ProcedureSchema<T>, value: unknown): SchemaResult<T> | Promise<SchemaResult<T>> {
|
|
152
|
+
if (isStandardSchema(schema)) {
|
|
153
|
+
const result = (schema as StandardSchemaV1<unknown, T>)["~standard"].validate(value);
|
|
154
|
+
return result instanceof Promise ? result.then(fromStandard) : fromStandard(result);
|
|
155
|
+
}
|
|
156
|
+
const legacy = schema as ZodLike<T>;
|
|
157
|
+
const parsed = legacy.safeParse(value);
|
|
158
|
+
if (parsed.success) return { ok: true, value: parsed.data };
|
|
159
|
+
const error = parsed.error as { message?: string; issues?: StandardSchemaV1.Issue[]; errors?: StandardSchemaV1.Issue[] };
|
|
160
|
+
const issues = error.issues ?? error.errors ?? [{ message: error.message ?? "Validation failed" }];
|
|
161
|
+
return { ok: false, message: error.message ?? describeIssues(issues), issues };
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** This function validates a value and waits for an asynchronous schema. */
|
|
165
|
+
export async function validateSchemaAsync<T>(schema: ProcedureSchema<T>, value: unknown): Promise<SchemaResult<T>> {
|
|
166
|
+
return validateSchema(schema, value);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// =============================================================================
|
|
170
|
+
// JSON Schema
|
|
171
|
+
// =============================================================================
|
|
172
|
+
|
|
173
|
+
/** A JSON Schema object. */
|
|
174
|
+
export type JsonSchema = Record<string, unknown>;
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* A schema that describes itself: a pass-through schema can give a JSON Schema this way (for
|
|
178
|
+
* example `{}`, any value). A Standard Schema with a converter does not need it.
|
|
179
|
+
*/
|
|
180
|
+
export interface JsonSchemaSource {
|
|
181
|
+
readonly "~jsonSchema"?: JsonSchema | undefined;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* The JSON Schema of the input (`io: "input"`, the default) or the output of a schema, or
|
|
186
|
+
* `undefined` when the schema cannot describe itself (a custom schema with only `parse`).
|
|
187
|
+
*
|
|
188
|
+
* The default dialect is draft-07, which every MCP client reads. A zod type that JSON cannot
|
|
189
|
+
* show (a date, a transform) becomes `{}`, so a description never fails.
|
|
190
|
+
*/
|
|
191
|
+
export function jsonSchemaOf(
|
|
192
|
+
schema: ProcedureSchema | undefined,
|
|
193
|
+
options: { io?: "input" | "output"; target?: JsonSchemaTarget } = {}
|
|
194
|
+
): JsonSchema | undefined {
|
|
195
|
+
if (!schema) return undefined;
|
|
196
|
+
const io = options.io ?? "input";
|
|
197
|
+
const target = options.target ?? "draft-07";
|
|
198
|
+
const own = (schema as JsonSchemaSource)["~jsonSchema"];
|
|
199
|
+
if (own) return own;
|
|
200
|
+
// A zod 4 schema: z.toJSONSchema can replace the types that JSON cannot show
|
|
201
|
+
if ((schema as { _zod?: unknown })._zod !== undefined) {
|
|
202
|
+
try {
|
|
203
|
+
return withoutDialect(toJSONSchema(schema as never, { io, target, unrepresentable: "any" }) as JsonSchema);
|
|
204
|
+
} catch {
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// Another library: its Standard JSON Schema converter
|
|
209
|
+
const converter = (schema as { "~standard"?: { jsonSchema?: StandardJSONSchemaConverter } })["~standard"]?.jsonSchema;
|
|
210
|
+
if (converter && typeof converter[io] === "function") {
|
|
211
|
+
try {
|
|
212
|
+
return withoutDialect(converter[io]({ target }));
|
|
213
|
+
} catch {
|
|
214
|
+
return undefined;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return undefined;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/** The `$schema` key names the dialect: a tool list and a manifest do not need it on each schema. */
|
|
221
|
+
function withoutDialect(schema: JsonSchema): JsonSchema {
|
|
222
|
+
if (!("$schema" in schema)) return schema;
|
|
223
|
+
const { $schema: _dialect, ...rest } = schema;
|
|
224
|
+
return rest;
|
|
225
|
+
}
|