@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,485 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Procedure Type System
|
|
3
|
+
*
|
|
4
|
+
* Core types for procedure definitions, handlers, and registration.
|
|
5
|
+
* Procedures are the foundation for typed RPC calls with schema validation.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { ZodErrorLike } from "../client/validation/types.js";
|
|
9
|
+
import type { ProcedureSchema } from "./schema.js";
|
|
10
|
+
import type { CollectionStorage } from "./collection/storage.js";
|
|
11
|
+
import type { EventBus } from "../events/types.js";
|
|
12
|
+
import type { HydrationEvent } from "./ref.js";
|
|
13
|
+
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// Procedure Path
|
|
16
|
+
// =============================================================================
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Procedure path as array of segments.
|
|
20
|
+
* Forms a tree structure for nested routing.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* ['collections', 'users', 'get'] // collections.users.get
|
|
25
|
+
* ['weather', 'forecast'] // weather.forecast
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export type ProcedurePath = string[];
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Convert path array to dot-separated key.
|
|
32
|
+
*/
|
|
33
|
+
export function pathToKey(path: ProcedurePath): string {
|
|
34
|
+
return path.join(".");
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Parse dot-separated key to path array.
|
|
39
|
+
*/
|
|
40
|
+
export function keyToPath(key: string): ProcedurePath {
|
|
41
|
+
return key.split(".");
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// =============================================================================
|
|
45
|
+
// Procedure Metadata
|
|
46
|
+
// =============================================================================
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Metadata for procedure documentation and categorization.
|
|
50
|
+
*/
|
|
51
|
+
export interface ProcedureMetadata {
|
|
52
|
+
/** Human-readable description */
|
|
53
|
+
description?: string;
|
|
54
|
+
|
|
55
|
+
/** Tags for categorization and filtering */
|
|
56
|
+
tags?: string[];
|
|
57
|
+
|
|
58
|
+
/** Whether this procedure is deprecated */
|
|
59
|
+
deprecated?: boolean;
|
|
60
|
+
|
|
61
|
+
/** Deprecation message with migration guidance */
|
|
62
|
+
deprecationMessage?: string;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* The procedures that this procedure calls through `ctx.client`: keys (`"shell.run"`) or
|
|
66
|
+
* namespaces (`"fs.*"`). A host with a call policy lets the procedure call only these and the
|
|
67
|
+
* exposed procedures (see `policy.ts`, deep dive MCP-3). `"*"` alone is not allowed: a
|
|
68
|
+
* procedure whose callees come from its input has the `runs-refs` tag.
|
|
69
|
+
*/
|
|
70
|
+
calls?: readonly string[];
|
|
71
|
+
|
|
72
|
+
/** Custom metadata fields */
|
|
73
|
+
[key: string]: unknown;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// =============================================================================
|
|
77
|
+
// Procedure Context
|
|
78
|
+
// =============================================================================
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Repository provider for storage access.
|
|
82
|
+
* Injected into procedure handlers for data access.
|
|
83
|
+
*/
|
|
84
|
+
export interface RepositoryProvider {
|
|
85
|
+
/**
|
|
86
|
+
* Get storage for a collection.
|
|
87
|
+
*
|
|
88
|
+
* @param collection - Collection name
|
|
89
|
+
* @returns Storage instance for the collection
|
|
90
|
+
*/
|
|
91
|
+
getStorage<T>(collection: string): CollectionStorage<T>;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Check if a collection exists.
|
|
95
|
+
*
|
|
96
|
+
* @param collection - Collection name
|
|
97
|
+
*/
|
|
98
|
+
hasCollection(collection: string): boolean;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Context passed to procedure handlers.
|
|
103
|
+
* Contains request metadata and service access.
|
|
104
|
+
*/
|
|
105
|
+
export interface ProcedureContext {
|
|
106
|
+
/** Request metadata (auth, tracing, etc.) */
|
|
107
|
+
metadata: Record<string, unknown>;
|
|
108
|
+
|
|
109
|
+
/** Abort signal for cancellation */
|
|
110
|
+
signal?: AbortSignal;
|
|
111
|
+
|
|
112
|
+
/** Repository provider for storage access */
|
|
113
|
+
repository?: RepositoryProvider;
|
|
114
|
+
|
|
115
|
+
/** The full path that was called */
|
|
116
|
+
path: ProcedurePath;
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Event bus for pub/sub messaging.
|
|
120
|
+
* Use for streaming coordination and inter-procedure communication.
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```typescript
|
|
124
|
+
* // Subscribe to updates in a streaming handler
|
|
125
|
+
* handler: async function* (input, ctx) {
|
|
126
|
+
* yield await getInitial(input.id);
|
|
127
|
+
*
|
|
128
|
+
* for await (const update of ctx.bus.stream(`entity:${input.id}`)) {
|
|
129
|
+
* yield update;
|
|
130
|
+
* }
|
|
131
|
+
* }
|
|
132
|
+
*
|
|
133
|
+
* // Emit events from another procedure
|
|
134
|
+
* handler: async (input, ctx) => {
|
|
135
|
+
* const result = await saveEntity(input);
|
|
136
|
+
* ctx.bus.emit(`entity:${input.id}`, result);
|
|
137
|
+
* return result;
|
|
138
|
+
* }
|
|
139
|
+
* ```
|
|
140
|
+
*/
|
|
141
|
+
bus?: EventBus;
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Client for calling other procedures.
|
|
145
|
+
* Enables inter-procedure communication via the RPC mechanism.
|
|
146
|
+
*
|
|
147
|
+
* @example
|
|
148
|
+
* ```typescript
|
|
149
|
+
* handler: async (input, ctx) => {
|
|
150
|
+
* // Call fs.mkdir procedure
|
|
151
|
+
* await ctx.client.call(["fs", "mkdir"], { path: input.dir });
|
|
152
|
+
*
|
|
153
|
+
* // Call git.init procedure
|
|
154
|
+
* await ctx.client.call(["git", "init"], { cwd: input.dir });
|
|
155
|
+
*
|
|
156
|
+
* return { created: true };
|
|
157
|
+
* }
|
|
158
|
+
* ```
|
|
159
|
+
*/
|
|
160
|
+
client: ProcedureClient;
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* The registry of the caller: `ctx.client` finds the nested procedures here. A procedure that
|
|
164
|
+
* reads or changes the registry (`procedure.define`, `client.lookup`) uses this one. When it is
|
|
165
|
+
* not set, such a procedure uses `PROCEDURE_REGISTRY`.
|
|
166
|
+
*/
|
|
167
|
+
registry?: ProcedureRegistryLike;
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* The hydration observer of the program that runs this procedure (`client.exec(ref, input,
|
|
171
|
+
* { onRef })`). A procedure that hydrates refs itself (control flow, a runner) gives it to
|
|
172
|
+
* `hydrateInput`, so a trace sees the events of its own program only.
|
|
173
|
+
*/
|
|
174
|
+
onRef?: ((event: HydrationEvent) => void) | undefined;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* The part of `ProcedureRegistry` that a procedure can use through `ctx.registry`.
|
|
179
|
+
*/
|
|
180
|
+
export interface ProcedureRegistryLike {
|
|
181
|
+
get(path: ProcedurePath): AnyProcedure | undefined;
|
|
182
|
+
has(path: ProcedurePath): boolean;
|
|
183
|
+
getAll(): AnyProcedure[];
|
|
184
|
+
register(procedure: AnyProcedure, options?: RegistrationOptions): void;
|
|
185
|
+
unregister(path: ProcedurePath): boolean;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Interface for procedure-to-procedure calls.
|
|
190
|
+
* Implemented by both Client and ProcedureServer's internal caller.
|
|
191
|
+
*/
|
|
192
|
+
export interface ProcedureClient {
|
|
193
|
+
/**
|
|
194
|
+
* Call a procedure by path. For a streaming procedure, the result is the last item.
|
|
195
|
+
*/
|
|
196
|
+
call<TInput = unknown, TOutput = unknown>(
|
|
197
|
+
path: ProcedurePath,
|
|
198
|
+
input: TInput
|
|
199
|
+
): Promise<TOutput>;
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Call a procedure by path and read each output: each item of a streaming procedure, or the
|
|
203
|
+
* one value of another procedure. The procedure starts when the caller reads the first item.
|
|
204
|
+
* An older client has no `stream`.
|
|
205
|
+
*/
|
|
206
|
+
stream?<TInput = unknown, TOutput = unknown>(
|
|
207
|
+
path: ProcedurePath,
|
|
208
|
+
input: TInput
|
|
209
|
+
): AsyncIterable<TOutput>;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// =============================================================================
|
|
213
|
+
// Procedure Handler
|
|
214
|
+
// =============================================================================
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Standard procedure handler function (single return).
|
|
218
|
+
* Receives validated input and context, returns output.
|
|
219
|
+
*
|
|
220
|
+
* @example
|
|
221
|
+
* ```typescript
|
|
222
|
+
* const handler: StandardHandler<{ id: string }, User> = async (input, ctx) => {
|
|
223
|
+
* const storage = ctx.repository?.getStorage<User>('users');
|
|
224
|
+
* const user = await storage?.get(input.id);
|
|
225
|
+
* if (!user) throw new Error('User not found');
|
|
226
|
+
* return user;
|
|
227
|
+
* };
|
|
228
|
+
* ```
|
|
229
|
+
*/
|
|
230
|
+
export type StandardHandler<TInput = unknown, TOutput = unknown> = (
|
|
231
|
+
input: TInput,
|
|
232
|
+
context: ProcedureContext
|
|
233
|
+
) => Promise<TOutput> | TOutput;
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Generator procedure handler (streaming/multi-yield).
|
|
237
|
+
* Yields output values one or more times.
|
|
238
|
+
*
|
|
239
|
+
* @example
|
|
240
|
+
* ```typescript
|
|
241
|
+
* // Single yield (same as standard, but generator syntax)
|
|
242
|
+
* const handler: GeneratorHandler<{ id: string }, User> = async function* (input, ctx) {
|
|
243
|
+
* const user = await fetchUser(input.id);
|
|
244
|
+
* yield user; // yields once
|
|
245
|
+
* };
|
|
246
|
+
*
|
|
247
|
+
* // Multi-yield streaming
|
|
248
|
+
* const handler: GeneratorHandler<{ roomId: string }, Message> = async function* (input, ctx) {
|
|
249
|
+
* // Initial data
|
|
250
|
+
* yield await getInitialMessages(input.roomId);
|
|
251
|
+
*
|
|
252
|
+
* // Stream updates
|
|
253
|
+
* for await (const msg of ctx.bus.stream(`room:${input.roomId}`)) {
|
|
254
|
+
* yield msg; // yields many times
|
|
255
|
+
* }
|
|
256
|
+
* };
|
|
257
|
+
* ```
|
|
258
|
+
*/
|
|
259
|
+
export type GeneratorHandler<TInput = unknown, TOutput = unknown> = (
|
|
260
|
+
input: TInput,
|
|
261
|
+
context: ProcedureContext
|
|
262
|
+
) => AsyncGenerator<TOutput, void, unknown>;
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Procedure handler function - supports both standard and generator forms.
|
|
266
|
+
*
|
|
267
|
+
* - **Standard handlers**: Return a single value (sync or async)
|
|
268
|
+
* - **Generator handlers**: Yield one or more values
|
|
269
|
+
*
|
|
270
|
+
* The caller's consumption mode (sponge/stream/handlers) determines
|
|
271
|
+
* how the output is delivered, regardless of handler type.
|
|
272
|
+
*
|
|
273
|
+
* @example
|
|
274
|
+
* ```typescript
|
|
275
|
+
* // Standard handler (single return)
|
|
276
|
+
* const handler: ProcedureHandler<{ id: string }, User> = async (input, ctx) => {
|
|
277
|
+
* return await fetchUser(input.id);
|
|
278
|
+
* };
|
|
279
|
+
*
|
|
280
|
+
* // Generator handler (streaming)
|
|
281
|
+
* const handler: ProcedureHandler<{ query: string }, SearchResult> = async function* (input, ctx) {
|
|
282
|
+
* for await (const result of search(input.query)) {
|
|
283
|
+
* yield result;
|
|
284
|
+
* }
|
|
285
|
+
* };
|
|
286
|
+
* ```
|
|
287
|
+
*/
|
|
288
|
+
export type ProcedureHandler<TInput = unknown, TOutput = unknown> =
|
|
289
|
+
| StandardHandler<TInput, TOutput>
|
|
290
|
+
| GeneratorHandler<TInput, TOutput>;
|
|
291
|
+
|
|
292
|
+
// =============================================================================
|
|
293
|
+
// Procedure Definition
|
|
294
|
+
// =============================================================================
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Full procedure definition with schemas and optional handler.
|
|
298
|
+
*
|
|
299
|
+
* @example
|
|
300
|
+
* ```typescript
|
|
301
|
+
* const getUserProcedure: Procedure<GetUserInput, User> = {
|
|
302
|
+
* path: ['users', 'get'],
|
|
303
|
+
* input: z.object({ id: z.string() }),
|
|
304
|
+
* output: z.object({ id: z.string(), name: z.string() }),
|
|
305
|
+
* metadata: { description: 'Get user by ID', tags: ['users', 'read'] },
|
|
306
|
+
* handler: async ({ id }, ctx) => { ... },
|
|
307
|
+
* };
|
|
308
|
+
* ```
|
|
309
|
+
*/
|
|
310
|
+
export interface Procedure<
|
|
311
|
+
TInput = unknown,
|
|
312
|
+
TOutput = unknown,
|
|
313
|
+
TMeta extends ProcedureMetadata = ProcedureMetadata
|
|
314
|
+
> {
|
|
315
|
+
/** Path in the route tree */
|
|
316
|
+
path: ProcedurePath;
|
|
317
|
+
|
|
318
|
+
/** Input validation schema: a Standard Schema (zod 4, valibot, arktype) or a `ZodLike` */
|
|
319
|
+
input: ProcedureSchema<TInput>;
|
|
320
|
+
|
|
321
|
+
/** Output validation schema: a Standard Schema or a `ZodLike` */
|
|
322
|
+
output: ProcedureSchema<TOutput>;
|
|
323
|
+
|
|
324
|
+
/** Procedure metadata for documentation */
|
|
325
|
+
metadata: TMeta;
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Whether this procedure supports streaming (multi-yield).
|
|
329
|
+
* When true, the handler is expected to be a generator that may yield multiple times.
|
|
330
|
+
* When false or undefined, the procedure yields exactly once.
|
|
331
|
+
*
|
|
332
|
+
* This is a capability declaration - callers can still consume
|
|
333
|
+
* streaming procedures in sponge mode (getting only the final value).
|
|
334
|
+
*/
|
|
335
|
+
streaming?: boolean | undefined;
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* Output mode declaration - how the procedure produces its output.
|
|
339
|
+
*
|
|
340
|
+
* - `single`: Returns a single value (default) - most procedures
|
|
341
|
+
* - `stream`: Returns multiple values over time (generator that yields many times)
|
|
342
|
+
* - `batch`: Returns an array of values all at once
|
|
343
|
+
*
|
|
344
|
+
* The consumer can choose their consumption mode (sponge/stream/handlers)
|
|
345
|
+
* independently. The system translates automatically:
|
|
346
|
+
*
|
|
347
|
+
* | Producer Mode | Consumer Mode | Result Type |
|
|
348
|
+
* |---------------|---------------|--------------------------|
|
|
349
|
+
* | single | sponge | Promise<T> |
|
|
350
|
+
* | single | stream | AsyncIterable<T> (1 item)|
|
|
351
|
+
* | stream | sponge | Promise<T> (last value) |
|
|
352
|
+
* | stream | stream | AsyncIterable<T> |
|
|
353
|
+
* | batch | sponge | Promise<T[]> |
|
|
354
|
+
* | batch | stream | AsyncIterable<T> |
|
|
355
|
+
*/
|
|
356
|
+
outputMode?: 'single' | 'stream' | 'batch' | undefined;
|
|
357
|
+
|
|
358
|
+
/** Server-side handler implementation (optional for stubs and aggregations) */
|
|
359
|
+
handler?: ProcedureHandler<TInput, TOutput> | undefined;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* Procedure without type parameters for generic storage.
|
|
364
|
+
* Uses `any` for handler to allow covariant/contravariant type compatibility.
|
|
365
|
+
*/
|
|
366
|
+
export type AnyProcedure = Procedure<any, any, ProcedureMetadata>;
|
|
367
|
+
|
|
368
|
+
// =============================================================================
|
|
369
|
+
// Output Mode Types
|
|
370
|
+
// =============================================================================
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* How a procedure produces its output.
|
|
374
|
+
*/
|
|
375
|
+
export type OutputMode = 'single' | 'stream' | 'batch';
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Default output mode when not specified.
|
|
379
|
+
*/
|
|
380
|
+
export const DEFAULT_OUTPUT_MODE: OutputMode = 'single';
|
|
381
|
+
|
|
382
|
+
// =============================================================================
|
|
383
|
+
// Procedure Result Types
|
|
384
|
+
// =============================================================================
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Result of a procedure call.
|
|
388
|
+
*/
|
|
389
|
+
export type ProcedureResult<TOutput> =
|
|
390
|
+
| { success: true; data: TOutput }
|
|
391
|
+
| { success: false; error: ProcedureError };
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* Error from procedure execution.
|
|
395
|
+
*/
|
|
396
|
+
export interface ProcedureError {
|
|
397
|
+
/** Error code */
|
|
398
|
+
code: string;
|
|
399
|
+
|
|
400
|
+
/** Error message */
|
|
401
|
+
message: string;
|
|
402
|
+
|
|
403
|
+
/** Whether the error is retryable */
|
|
404
|
+
retryable: boolean;
|
|
405
|
+
|
|
406
|
+
/** Validation errors if applicable */
|
|
407
|
+
validationErrors?: ZodErrorLike;
|
|
408
|
+
|
|
409
|
+
/** The procedure path that failed */
|
|
410
|
+
path: ProcedurePath;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// =============================================================================
|
|
414
|
+
// Infer Types from Procedure
|
|
415
|
+
// =============================================================================
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* Infer input type from a procedure.
|
|
419
|
+
*/
|
|
420
|
+
export type InferProcedureInput<T> = T extends Procedure<infer TInput, any, any>
|
|
421
|
+
? TInput
|
|
422
|
+
: unknown;
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* Infer output type from a procedure.
|
|
426
|
+
*/
|
|
427
|
+
export type InferProcedureOutput<T> = T extends Procedure<any, infer TOutput, any>
|
|
428
|
+
? TOutput
|
|
429
|
+
: unknown;
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* Infer metadata type from a procedure.
|
|
433
|
+
*/
|
|
434
|
+
export type InferProcedureMetadata<T> = T extends Procedure<any, any, infer TMeta>
|
|
435
|
+
? TMeta
|
|
436
|
+
: ProcedureMetadata;
|
|
437
|
+
|
|
438
|
+
// =============================================================================
|
|
439
|
+
// Registry Events
|
|
440
|
+
// =============================================================================
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* Event types emitted by ProcedureRegistry.
|
|
444
|
+
*/
|
|
445
|
+
export type RegistryEventType = "register" | "unregister";
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* Listener for registry events.
|
|
449
|
+
*/
|
|
450
|
+
export interface RegistryListener {
|
|
451
|
+
event: RegistryEventType;
|
|
452
|
+
listener: (procedure: AnyProcedure) => void;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
// =============================================================================
|
|
456
|
+
// Module Registration
|
|
457
|
+
// =============================================================================
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
* Module that exports procedures for registration.
|
|
461
|
+
*/
|
|
462
|
+
export interface ProcedureModule {
|
|
463
|
+
/** Array of procedures exported by this module */
|
|
464
|
+
procedures: AnyProcedure[];
|
|
465
|
+
|
|
466
|
+
/** Optional module name for debugging */
|
|
467
|
+
name?: string;
|
|
468
|
+
|
|
469
|
+
/**
|
|
470
|
+
* The modules whose procedures this module calls (for example `client-lib` calls `fs.*` and
|
|
471
|
+
* `git.*`). `createRegistry()` registers them too.
|
|
472
|
+
*/
|
|
473
|
+
requires?: readonly ProcedureModule[] | undefined;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* Registration options for bulk procedure registration.
|
|
478
|
+
*/
|
|
479
|
+
export interface RegistrationOptions {
|
|
480
|
+
/** Override existing procedures with same path */
|
|
481
|
+
override?: boolean;
|
|
482
|
+
|
|
483
|
+
/** Prefix to prepend to all paths */
|
|
484
|
+
pathPrefix?: ProcedurePath;
|
|
485
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks of requests that a web browser can send to a procedure server.
|
|
3
|
+
*
|
|
4
|
+
* A server serves its whole registry, often with `shell.*` in it, and a web page that the user
|
|
5
|
+
* opens can send requests to `127.0.0.1`. Before, the HTTP server transport read any request
|
|
6
|
+
* body as JSON, so a "simple" cross-site POST (`Content-Type: text/plain`, no CORS preflight)
|
|
7
|
+
* ran any procedure, and the WebSocket server accepted a connection from any page
|
|
8
|
+
* (cross-site WebSocket hijacking). The checks here are on by default in both transports:
|
|
9
|
+
*
|
|
10
|
+
* - A connection that arrives on a loopback address must name a loopback host in its `Host`
|
|
11
|
+
* header. A DNS rebinding attack sends the name of the attacker's site.
|
|
12
|
+
* - A browser request (an `Origin` header) must come from the server's own origin, or from an
|
|
13
|
+
* origin in `allowedOrigins`.
|
|
14
|
+
* - A request that the browser marks `Sec-Fetch-Site: cross-site` or `same-site` and that has
|
|
15
|
+
* no allowed origin is refused (an image tag or a form sends no `Origin` for a GET).
|
|
16
|
+
* - HTTP only: a procedure call by GET or HEAD is refused unless `allowGet` is true, and a
|
|
17
|
+
* request body must be JSON.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import type { IncomingHttpHeaders } from "node:http";
|
|
21
|
+
|
|
22
|
+
const LOOPBACK_NAMES = new Set(["localhost", "127.0.0.1", "::1", "[::1]"]);
|
|
23
|
+
|
|
24
|
+
/** The options of the browser checks of a server transport. */
|
|
25
|
+
export interface BrowserGuardOptions {
|
|
26
|
+
/**
|
|
27
|
+
* The web origins that can call the server, besides its own origin. `"*"` allows every
|
|
28
|
+
* origin. A function decides for each origin.
|
|
29
|
+
* @default [] (only the server's own origin)
|
|
30
|
+
*/
|
|
31
|
+
allowedOrigins?: readonly string[] | "*" | ((origin: string) => boolean) | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* The host names that a request on a loopback address can name in its `Host` header,
|
|
34
|
+
* besides the loopback names. `"*"` turns the check off.
|
|
35
|
+
* @default [] (only `localhost`, `127.0.0.1` and `[::1]`)
|
|
36
|
+
*/
|
|
37
|
+
allowedHosts?: readonly string[] | "*" | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* HTTP only: accept procedure calls by GET or HEAD. A RESTful URL strategy needs this. A GET
|
|
40
|
+
* is a request that any page can send (an image tag), so it is off by default.
|
|
41
|
+
* @default false
|
|
42
|
+
*/
|
|
43
|
+
allowGet?: boolean | undefined;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** The parts of an incoming request that the checks read. */
|
|
47
|
+
export interface GuardedRequest {
|
|
48
|
+
method?: string | undefined;
|
|
49
|
+
headers: IncomingHttpHeaders;
|
|
50
|
+
socket?: { localAddress?: string | undefined } | undefined;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** The result of the checks: the request passes, or the HTTP status and the error to send. */
|
|
54
|
+
export type GuardResult =
|
|
55
|
+
| { readonly ok: true }
|
|
56
|
+
| { readonly ok: false; readonly status: 403 | 405 | 415; readonly code: string; readonly message: string };
|
|
57
|
+
|
|
58
|
+
/** True for a host name or a bind address that only this computer can reach. */
|
|
59
|
+
export function isLoopbackHost(host: string): boolean {
|
|
60
|
+
return LOOPBACK_NAMES.has(host.toLowerCase());
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** True for a local socket address on the loopback interface (IPv4, IPv6, or IPv4 in IPv6). */
|
|
64
|
+
export function isLoopbackAddress(address: string | undefined): boolean {
|
|
65
|
+
if (!address) return false;
|
|
66
|
+
const plain = address.startsWith("::ffff:") ? address.slice("::ffff:".length) : address;
|
|
67
|
+
return plain === "::1" || plain.startsWith("127.");
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** The name of a Host header without its port: "localhost:3000" gives "localhost", "[::1]:80" gives "[::1]". */
|
|
71
|
+
export function hostNameOf(header: string | undefined): string {
|
|
72
|
+
if (!header) return "";
|
|
73
|
+
if (header.startsWith("[")) return header.slice(0, header.indexOf("]") + 1).toLowerCase();
|
|
74
|
+
return (header.split(":")[0] ?? "").toLowerCase();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function originAllowedBy(origin: string, allowed: BrowserGuardOptions["allowedOrigins"]): boolean {
|
|
78
|
+
if (allowed === "*") return true;
|
|
79
|
+
if (typeof allowed === "function") return allowed(origin);
|
|
80
|
+
return (allowed ?? []).includes(origin);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** True when the origin is the origin of the server that the request names in its Host header. */
|
|
84
|
+
function sameOrigin(origin: string, hostHeader: string | undefined): boolean {
|
|
85
|
+
if (!hostHeader) return false;
|
|
86
|
+
try {
|
|
87
|
+
return new URL(origin).host.toLowerCase() === hostHeader.toLowerCase();
|
|
88
|
+
} catch {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** True for a media type of JSON: `application/json` or a `+json` type. */
|
|
94
|
+
function isJsonType(contentType: string | undefined): boolean {
|
|
95
|
+
const type = (contentType ?? "").split(";")[0]!.trim().toLowerCase();
|
|
96
|
+
return type === "application/json" || type.endsWith("+json");
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** True when the request has a body: a `Content-Length` above 0, or a chunked body. */
|
|
100
|
+
function hasBody(headers: IncomingHttpHeaders): boolean {
|
|
101
|
+
const length = Number(headers["content-length"] ?? 0);
|
|
102
|
+
return length > 0 || headers["transfer-encoding"] !== undefined;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* The checks of the host, the origin and the fetch site, for HTTP and WebSocket requests.
|
|
107
|
+
* `http` adds the checks of the method and the body.
|
|
108
|
+
*/
|
|
109
|
+
export function checkBrowserRequest(
|
|
110
|
+
req: GuardedRequest,
|
|
111
|
+
options: BrowserGuardOptions = {},
|
|
112
|
+
http = false
|
|
113
|
+
): GuardResult {
|
|
114
|
+
const { headers } = req;
|
|
115
|
+
|
|
116
|
+
// DNS rebinding: a request on a loopback address must name a loopback host
|
|
117
|
+
if (options.allowedHosts !== "*" && isLoopbackAddress(req.socket?.localAddress)) {
|
|
118
|
+
const name = hostNameOf(headers.host);
|
|
119
|
+
if (!LOOPBACK_NAMES.has(name) && !(options.allowedHosts ?? []).includes(name)) {
|
|
120
|
+
return { ok: false, status: 403, code: "FORBIDDEN_HOST", message: `Forbidden: the host "${name}" is not allowed` };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const origin = typeof headers.origin === "string" ? headers.origin : undefined;
|
|
125
|
+
if (origin !== undefined) {
|
|
126
|
+
if (!sameOrigin(origin, headers.host) && !originAllowedBy(origin, options.allowedOrigins)) {
|
|
127
|
+
return { ok: false, status: 403, code: "FORBIDDEN_ORIGIN", message: `Forbidden: the origin "${origin}" is not allowed` };
|
|
128
|
+
}
|
|
129
|
+
} else {
|
|
130
|
+
const site = headers["sec-fetch-site"];
|
|
131
|
+
if ((site === "cross-site" || site === "same-site") && options.allowedOrigins !== "*") {
|
|
132
|
+
return { ok: false, status: 403, code: "FORBIDDEN_ORIGIN", message: "Forbidden: a request from another site" };
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (http) {
|
|
137
|
+
const method = (req.method ?? "GET").toUpperCase();
|
|
138
|
+
if ((method === "GET" || method === "HEAD") && !options.allowGet) {
|
|
139
|
+
return { ok: false, status: 405, code: "METHOD_NOT_ALLOWED", message: "Call a procedure with POST" };
|
|
140
|
+
}
|
|
141
|
+
if (hasBody(headers) && !isJsonType(headers["content-type"])) {
|
|
142
|
+
return { ok: false, status: 415, code: "UNSUPPORTED_MEDIA_TYPE", message: "The request body must be JSON (Content-Type: application/json)" };
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return { ok: true };
|
|
147
|
+
}
|