@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,622 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Server Transport Implementation
|
|
3
|
+
*
|
|
4
|
+
* Adapts Express HTTP server to unified RPC format.
|
|
5
|
+
* Converts HTTP requests to ServerRequest and ServerResponse back to HTTP.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { Request, Response, Express } from "express";
|
|
9
|
+
import { createServer } from "http";
|
|
10
|
+
import type { Server as HttpServer } from "http";
|
|
11
|
+
import type { ServerTransport, ServerRequest, ServerResponse } from "../../../server/types.js";
|
|
12
|
+
import type { Metadata } from "../../../client/types.js";
|
|
13
|
+
import type { Server } from "../../../server/index.js";
|
|
14
|
+
import { HTTPMethod, HTTPHeaders, decodeMetadataHeader, METADATA_HEADER_LIMIT } from "../shared/index.js";
|
|
15
|
+
import { ERROR_REGISTRY } from "../../../client/errors/index.js";
|
|
16
|
+
import type { HttpServerTransportOptions } from "./types.js";
|
|
17
|
+
import { createPatternServerUrlStrategy } from "./strategies.js";
|
|
18
|
+
import { checkBrowserRequest, type BrowserGuardOptions } from "../../../server/browser-guard.js";
|
|
19
|
+
|
|
20
|
+
/** The media type of a stream response: one JSON value on each line. */
|
|
21
|
+
const NDJSON = "application/x-ndjson";
|
|
22
|
+
|
|
23
|
+
/** The metadata keys that the transport sets: a query parameter or a header cannot replace them. */
|
|
24
|
+
const RESERVED_METADATA = new Set(["headers", "query", "params"]);
|
|
25
|
+
|
|
26
|
+
/** The error of a request body that the transport cannot read. */
|
|
27
|
+
class BodyError extends Error {
|
|
28
|
+
constructor(
|
|
29
|
+
message: string,
|
|
30
|
+
readonly httpStatus: number
|
|
31
|
+
) {
|
|
32
|
+
super(message);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** The code and message of a thrown error, with its retryable flag (deep dive TRN-7). */
|
|
37
|
+
function errorOf(error: unknown): { code: string; message: string; retryable: boolean } {
|
|
38
|
+
const code = (error as { code?: unknown } | undefined)?.code;
|
|
39
|
+
const retryable = (error as { retryable?: unknown } | undefined)?.retryable;
|
|
40
|
+
return {
|
|
41
|
+
code: typeof code === "string" ? code : "HANDLER_ERROR",
|
|
42
|
+
message: error instanceof Error ? error.message : String(error),
|
|
43
|
+
retryable: typeof retryable === "boolean" ? retryable : false,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Write one chunk. When the response's buffer is full, wait for "drain", or for the end of the
|
|
49
|
+
* request (deep dive TRN-3: before, the server ignored the result of write() and ran a stream
|
|
50
|
+
* to its end whatever the reader did).
|
|
51
|
+
*/
|
|
52
|
+
function write(res: Response, chunk: string, signal: AbortSignal): Promise<void> {
|
|
53
|
+
if (res.write(chunk) || signal.aborted) return Promise.resolve();
|
|
54
|
+
return new Promise<void>((resolve) => {
|
|
55
|
+
const done = (): void => {
|
|
56
|
+
res.off("drain", done);
|
|
57
|
+
res.off("close", done);
|
|
58
|
+
signal.removeEventListener("abort", done);
|
|
59
|
+
resolve();
|
|
60
|
+
};
|
|
61
|
+
res.on("drain", done);
|
|
62
|
+
res.on("close", done);
|
|
63
|
+
signal.addEventListener("abort", done, { once: true });
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* The HTTP status of the error codes of a procedure invocation (they are not in the error
|
|
69
|
+
* registry, so before, a validation error was a 500).
|
|
70
|
+
*/
|
|
71
|
+
const INVOCATION_HTTP_STATUS: Record<string, number> = {
|
|
72
|
+
VALIDATION_ERROR: 400,
|
|
73
|
+
NOT_EXPOSED: 403,
|
|
74
|
+
NOT_DECLARED: 403,
|
|
75
|
+
NOT_FOUND: 404,
|
|
76
|
+
NO_HANDLER: 404,
|
|
77
|
+
ABORTED: 499,
|
|
78
|
+
TIMEOUT: 504,
|
|
79
|
+
OUTPUT_VALIDATION_ERROR: 500,
|
|
80
|
+
NO_OUTPUT: 500,
|
|
81
|
+
HANDLER_ERROR: 500,
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* HTTP server transport adapter for Express.
|
|
86
|
+
*
|
|
87
|
+
* Converts HTTP requests to unified RPC format and responses back to HTTP.
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```typescript
|
|
91
|
+
* const server = new Server();
|
|
92
|
+
* const app = express();
|
|
93
|
+
* app.use(express.json({ strict: false })); // optional: the transport can read the body itself
|
|
94
|
+
* const httpTransport = new HttpServerTransport(server, {
|
|
95
|
+
* app,
|
|
96
|
+
* port: 3000,
|
|
97
|
+
* // The default URL strategy parses the HTTP client's format: /api/{service}/{operation}
|
|
98
|
+
* });
|
|
99
|
+
*
|
|
100
|
+
* await httpTransport.start();
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
/**
|
|
104
|
+
* The origins that the CORS options allow: a page that CORS lets read the response can also
|
|
105
|
+
* call. With CORS off, no other origin can call.
|
|
106
|
+
*/
|
|
107
|
+
function corsOrigins(options: HttpServerTransportOptions): BrowserGuardOptions["allowedOrigins"] {
|
|
108
|
+
if (!options.cors) return [];
|
|
109
|
+
const origin = options.corsOptions?.origin ?? "*";
|
|
110
|
+
if (origin === "*") return "*";
|
|
111
|
+
return Array.isArray(origin) ? origin : [origin];
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export class HttpServerTransport implements ServerTransport {
|
|
115
|
+
readonly name = "http";
|
|
116
|
+
|
|
117
|
+
private app: Express;
|
|
118
|
+
private httpServer: HttpServer | null = null;
|
|
119
|
+
private options: Required<
|
|
120
|
+
Omit<
|
|
121
|
+
HttpServerTransportOptions,
|
|
122
|
+
"app" | "corsOptions" | "httpServer" | "bodyLimit" | "allowedOrigins" | "allowedHosts" | "allowGet"
|
|
123
|
+
>
|
|
124
|
+
> & {
|
|
125
|
+
corsOptions: HttpServerTransportOptions["corsOptions"] | undefined;
|
|
126
|
+
httpServer: HttpServer | undefined;
|
|
127
|
+
};
|
|
128
|
+
private server: Server;
|
|
129
|
+
/** The controllers of the requests in progress: stop() aborts them (deep dive TRN-15) */
|
|
130
|
+
private openRequests = new Set<AbortController>();
|
|
131
|
+
private stopped = false;
|
|
132
|
+
private readonly bodyLimit: number;
|
|
133
|
+
/** The browser checks of each procedure call (see `server/browser-guard.ts`) */
|
|
134
|
+
private readonly guard: BrowserGuardOptions;
|
|
135
|
+
|
|
136
|
+
constructor(server: Server, options: HttpServerTransportOptions = {}) {
|
|
137
|
+
this.server = server;
|
|
138
|
+
const basePath = options.basePath ?? "/api";
|
|
139
|
+
this.options = {
|
|
140
|
+
port: options.port ?? 3000,
|
|
141
|
+
// Loopback by default (see BUGS-2026-07 H19), and route by URL path so the raw server matches
|
|
142
|
+
// the HTTP client's default URL format instead of inferring the operation from the verb
|
|
143
|
+
// (which lost the payload for get/list/find/watch). See BUGS-2026-07 (C3, bug 16).
|
|
144
|
+
host: options.host ?? "127.0.0.1",
|
|
145
|
+
urlStrategy: options.urlStrategy ?? createPatternServerUrlStrategy(basePath),
|
|
146
|
+
basePath,
|
|
147
|
+
cors: options.cors ?? false,
|
|
148
|
+
corsOptions: options.corsOptions,
|
|
149
|
+
httpServer: options.httpServer,
|
|
150
|
+
};
|
|
151
|
+
this.bodyLimit = options.bodyLimit ?? 1024 * 1024;
|
|
152
|
+
this.guard = {
|
|
153
|
+
allowedOrigins: options.allowedOrigins ?? corsOrigins(options),
|
|
154
|
+
allowedHosts: options.allowedHosts,
|
|
155
|
+
allowGet: options.allowGet,
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
// Use provided app or create new one
|
|
159
|
+
if (options.app) {
|
|
160
|
+
this.app = options.app;
|
|
161
|
+
} else {
|
|
162
|
+
throw new Error(
|
|
163
|
+
"Express app is required. Please provide an app instance via options.app"
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Setup routes
|
|
168
|
+
this.setupRoutes();
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Setup Express routes.
|
|
173
|
+
*/
|
|
174
|
+
private setupRoutes(): void {
|
|
175
|
+
// CORS
|
|
176
|
+
if (this.options.cors) {
|
|
177
|
+
// The given options go over the defaults. Before, options with only `origin` replaced
|
|
178
|
+
// them all, and the server sent "Access-Control-Allow-Headers: undefined".
|
|
179
|
+
const corsOptions = {
|
|
180
|
+
origin: "*" as string | string[],
|
|
181
|
+
methods: [
|
|
182
|
+
HTTPMethod.GET,
|
|
183
|
+
HTTPMethod.POST,
|
|
184
|
+
HTTPMethod.PUT,
|
|
185
|
+
HTTPMethod.DELETE,
|
|
186
|
+
HTTPMethod.PATCH,
|
|
187
|
+
HTTPMethod.OPTIONS,
|
|
188
|
+
],
|
|
189
|
+
// The headers that HttpTransport sends from the metadata. Without X-Metadata, a page of
|
|
190
|
+
// another origin failed its preflight for every call with custom metadata (pagination).
|
|
191
|
+
allowedHeaders: [
|
|
192
|
+
"Content-Type",
|
|
193
|
+
"Accept",
|
|
194
|
+
HTTPHeaders.AUTHORIZATION,
|
|
195
|
+
HTTPHeaders.API_KEY,
|
|
196
|
+
HTTPHeaders.REQUEST_ID,
|
|
197
|
+
HTTPHeaders.TRACE_ID,
|
|
198
|
+
HTTPHeaders.SPAN_ID,
|
|
199
|
+
HTTPHeaders.PARENT_SPAN_ID,
|
|
200
|
+
HTTPHeaders.TIMEOUT,
|
|
201
|
+
HTTPHeaders.METADATA,
|
|
202
|
+
"collection",
|
|
203
|
+
"collectionName",
|
|
204
|
+
"database",
|
|
205
|
+
],
|
|
206
|
+
credentials: true,
|
|
207
|
+
...this.options.corsOptions,
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
// One allowed origin goes back: the request's origin when it is in the list (a header
|
|
211
|
+
// with several origins is invalid), with Vary: Origin so that caches keep them apart
|
|
212
|
+
const origins = corsOptions.origin ?? "*";
|
|
213
|
+
const allowOrigin = (requestOrigin: string | undefined): string | undefined => {
|
|
214
|
+
if (origins === "*") return "*";
|
|
215
|
+
const list = Array.isArray(origins) ? origins : [origins];
|
|
216
|
+
return requestOrigin !== undefined && list.includes(requestOrigin) ? requestOrigin : undefined;
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
this.app.use((req, res, next) => {
|
|
220
|
+
const allowed = allowOrigin(req.headers.origin);
|
|
221
|
+
if (origins !== "*") res.vary("Origin");
|
|
222
|
+
if (allowed !== undefined) res.header("Access-Control-Allow-Origin", allowed);
|
|
223
|
+
res.header(
|
|
224
|
+
"Access-Control-Allow-Methods",
|
|
225
|
+
corsOptions.methods?.join(", ")
|
|
226
|
+
);
|
|
227
|
+
res.header(
|
|
228
|
+
"Access-Control-Allow-Headers",
|
|
229
|
+
corsOptions.allowedHeaders?.join(", ")
|
|
230
|
+
);
|
|
231
|
+
if (corsOptions.credentials) {
|
|
232
|
+
res.header("Access-Control-Allow-Credentials", "true");
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (req.method === "OPTIONS") {
|
|
236
|
+
res.sendStatus(204);
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
next();
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Catch-all route for RPC - use regex to match any path under basePath
|
|
245
|
+
this.app.all(
|
|
246
|
+
new RegExp(`^${this.options.basePath.replace(/\//g, "\\/")}\\/.*`),
|
|
247
|
+
async (req, res) => {
|
|
248
|
+
await this.handleHttpRequest(req, res);
|
|
249
|
+
}
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Handle HTTP request.
|
|
255
|
+
* Converts to unified RPC format, processes, and sends response.
|
|
256
|
+
*/
|
|
257
|
+
private async handleHttpRequest(req: Request, res: Response): Promise<void> {
|
|
258
|
+
if (this.stopped) {
|
|
259
|
+
res.status(503).json({ error: "Server stopped", code: "SERVER_STOPPED", retryable: true });
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
// A web page must not reach the procedures: host, origin, method and body type
|
|
263
|
+
const guard = checkBrowserRequest(req, this.guard, true);
|
|
264
|
+
if (!guard.ok) {
|
|
265
|
+
res.status(guard.status).json({ error: guard.message, code: guard.code, retryable: false });
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
// A closed connection or stop() aborts the request: a stream stops, and its handler gets return()
|
|
269
|
+
const controller = new AbortController();
|
|
270
|
+
this.openRequests.add(controller);
|
|
271
|
+
res.on("close", () => {
|
|
272
|
+
this.openRequests.delete(controller);
|
|
273
|
+
if (!res.writableFinished) controller.abort();
|
|
274
|
+
});
|
|
275
|
+
try {
|
|
276
|
+
// Convert HTTP request to ServerRequest
|
|
277
|
+
let serverRequest: ServerRequest | null;
|
|
278
|
+
try {
|
|
279
|
+
serverRequest = this.httpToServerRequest(req, await this.readBody(req));
|
|
280
|
+
} catch (error) {
|
|
281
|
+
const status = error instanceof BodyError ? error.httpStatus : 400;
|
|
282
|
+
res.status(status).json({ error: (error as Error).message, code: "INVALID_REQUEST", retryable: false });
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
if (!serverRequest) {
|
|
287
|
+
res.status(400).json({
|
|
288
|
+
error: "Invalid request: could not parse RPC method from URL",
|
|
289
|
+
});
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
serverRequest.signal = controller.signal;
|
|
294
|
+
|
|
295
|
+
// Process request through universal server
|
|
296
|
+
const serverResponse = await this.server.handle(serverRequest);
|
|
297
|
+
|
|
298
|
+
if (serverResponse.stream) {
|
|
299
|
+
await this.streamToHttp(serverResponse, serverResponse.stream, req, res, controller.signal);
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// Convert ServerResponse to HTTP response
|
|
304
|
+
this.serverResponseToHttp(serverResponse, res);
|
|
305
|
+
} catch (error) {
|
|
306
|
+
if (!res.headersSent) {
|
|
307
|
+
res.status(500).json({
|
|
308
|
+
error: (error as Error).message || "Internal server error",
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
} finally {
|
|
312
|
+
this.openRequests.delete(controller);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* The request body. A body parser of the app (`express.json({ strict: false })`) gives
|
|
318
|
+
* `req.body`. Without one, the transport reads the JSON body itself: before, every payload
|
|
319
|
+
* was {} when the app had no parser, and a parser with `strict: true` rejected a number or
|
|
320
|
+
* a string (deep dive TRN-10).
|
|
321
|
+
*/
|
|
322
|
+
private async readBody(req: Request): Promise<unknown> {
|
|
323
|
+
if (req.body !== undefined) return req.body;
|
|
324
|
+
if (req.method === "GET" || req.method === "HEAD" || req.readableEnded) return undefined;
|
|
325
|
+
const chunks: Buffer[] = [];
|
|
326
|
+
let size = 0;
|
|
327
|
+
for await (const chunk of req as AsyncIterable<Buffer | string>) {
|
|
328
|
+
const buffer = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
|
|
329
|
+
size += buffer.length;
|
|
330
|
+
if (size > this.bodyLimit) throw new BodyError(`The request body is larger than ${this.bodyLimit} bytes`, 413);
|
|
331
|
+
chunks.push(buffer);
|
|
332
|
+
}
|
|
333
|
+
const text = Buffer.concat(chunks).toString("utf8");
|
|
334
|
+
if (text.trim() === "") return undefined;
|
|
335
|
+
try {
|
|
336
|
+
return JSON.parse(text) as unknown;
|
|
337
|
+
} catch {
|
|
338
|
+
throw new BodyError("The request body is not valid JSON", 400);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Convert HTTP request to ServerRequest.
|
|
344
|
+
*/
|
|
345
|
+
/**
|
|
346
|
+
* Send a stream response.
|
|
347
|
+
*
|
|
348
|
+
* A client that accepts `application/x-ndjson` gets one JSON line for each item
|
|
349
|
+
* (`{"type":"item","payload":...}`), then `{"type":"done"}`, or `{"type":"error","error":...}`.
|
|
350
|
+
* Another client (curl, a browser fetch without the header) gets the last item as plain JSON,
|
|
351
|
+
* the "sponge" mode, so a streaming procedure does not change its response format.
|
|
352
|
+
*/
|
|
353
|
+
private async streamToHttp(
|
|
354
|
+
response: ServerResponse,
|
|
355
|
+
stream: AsyncIterable<unknown>,
|
|
356
|
+
req: Request,
|
|
357
|
+
res: Response,
|
|
358
|
+
signal: AbortSignal
|
|
359
|
+
): Promise<void> {
|
|
360
|
+
const ndjson = String(req.headers.accept ?? "").includes(NDJSON);
|
|
361
|
+
|
|
362
|
+
if (!ndjson) {
|
|
363
|
+
let last: { value: unknown } | undefined;
|
|
364
|
+
try {
|
|
365
|
+
for await (const item of stream) last = { value: item };
|
|
366
|
+
} catch (error) {
|
|
367
|
+
this.serverResponseToHttp({ id: response.id, status: { type: "error", ...errorOf(error) }, metadata: {} }, res);
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
if (!last) {
|
|
371
|
+
this.serverResponseToHttp(
|
|
372
|
+
{
|
|
373
|
+
id: response.id,
|
|
374
|
+
status: { type: "error", code: "NO_OUTPUT", message: "The procedure gave no output", retryable: false },
|
|
375
|
+
metadata: {},
|
|
376
|
+
},
|
|
377
|
+
res
|
|
378
|
+
);
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
this.serverResponseToHttp({ id: response.id, status: response.status, metadata: response.metadata, payload: last.value }, res);
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
res.status(200);
|
|
386
|
+
res.setHeader("Content-Type", NDJSON);
|
|
387
|
+
res.setHeader("Cache-Control", "no-cache");
|
|
388
|
+
res.flushHeaders();
|
|
389
|
+
// stop() aborted the request while the reader still listens: end the stream with an error
|
|
390
|
+
const endAborted = (): void => {
|
|
391
|
+
if (!res.writableEnded && !res.destroyed) {
|
|
392
|
+
res.end(JSON.stringify({ type: "error", error: { code: "ABORTED", message: "The server stopped the request", retryable: true } }) + "\n");
|
|
393
|
+
}
|
|
394
|
+
};
|
|
395
|
+
try {
|
|
396
|
+
for await (const item of stream) {
|
|
397
|
+
if (signal.aborted) break;
|
|
398
|
+
await write(res, JSON.stringify({ type: "item", payload: item }) + "\n", signal);
|
|
399
|
+
if (signal.aborted) break;
|
|
400
|
+
}
|
|
401
|
+
if (signal.aborted) {
|
|
402
|
+
endAborted();
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
res.end(JSON.stringify({ type: "done" }) + "\n");
|
|
406
|
+
} catch (error) {
|
|
407
|
+
if (signal.aborted) {
|
|
408
|
+
endAborted();
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
res.end(JSON.stringify({ type: "error", error: errorOf(error) }) + "\n");
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
private httpToServerRequest(req: Request, body: unknown): ServerRequest | null {
|
|
416
|
+
// Parse method from URL using strategy
|
|
417
|
+
const method = this.options.urlStrategy(req);
|
|
418
|
+
if (!method) {
|
|
419
|
+
return null;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// Generate request ID
|
|
423
|
+
const id =
|
|
424
|
+
(req.headers["x-request-id"] as string) ??
|
|
425
|
+
`req-${Date.now()}-${Math.random()}`;
|
|
426
|
+
|
|
427
|
+
// Build metadata from headers and query params. The flattened query parameters cannot
|
|
428
|
+
// replace headers, query or params (before, "?headers=x" replaced metadata.headers).
|
|
429
|
+
const metadata: Metadata = {
|
|
430
|
+
headers: req.headers as Record<string, string>,
|
|
431
|
+
query: req.query,
|
|
432
|
+
params: req.params,
|
|
433
|
+
};
|
|
434
|
+
for (const [key, value] of Object.entries(req.query)) {
|
|
435
|
+
if (!RESERVED_METADATA.has(key) && !key.startsWith("__")) metadata[key] = value;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// Extract custom headers to root-level metadata
|
|
439
|
+
// This mirrors the client's metadataToHeaders() behavior
|
|
440
|
+
const standardHeaders = new Set([
|
|
441
|
+
"host",
|
|
442
|
+
"connection",
|
|
443
|
+
"content-length",
|
|
444
|
+
"content-type",
|
|
445
|
+
"user-agent",
|
|
446
|
+
"accept",
|
|
447
|
+
"accept-encoding",
|
|
448
|
+
"accept-language",
|
|
449
|
+
"cache-control",
|
|
450
|
+
"origin",
|
|
451
|
+
"referer",
|
|
452
|
+
"x-request-id",
|
|
453
|
+
"x-trace-id",
|
|
454
|
+
"x-span-id",
|
|
455
|
+
"x-parent-span-id",
|
|
456
|
+
"x-timeout",
|
|
457
|
+
"x-api-key",
|
|
458
|
+
"authorization",
|
|
459
|
+
"x-metadata",
|
|
460
|
+
]);
|
|
461
|
+
|
|
462
|
+
// Known custom header mappings (lowercase → camelCase)
|
|
463
|
+
const headerMappings: Record<string, string> = {
|
|
464
|
+
'collectionname': 'collectionName',
|
|
465
|
+
};
|
|
466
|
+
|
|
467
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
468
|
+
if (!standardHeaders.has(key.toLowerCase()) && typeof value === "string") {
|
|
469
|
+
// Use mapped name if available, otherwise use original key
|
|
470
|
+
const normalizedKey = headerMappings[key.toLowerCase()] || key;
|
|
471
|
+
if (!RESERVED_METADATA.has(normalizedKey) && !normalizedKey.startsWith("__")) {
|
|
472
|
+
metadata[normalizedKey] = value;
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
// The custom metadata of the HTTP client: any JSON value, any key (deep dive TRN-11)
|
|
478
|
+
const encoded = req.headers["x-metadata"];
|
|
479
|
+
if (typeof encoded === "string") {
|
|
480
|
+
if (encoded.length > METADATA_HEADER_LIMIT) {
|
|
481
|
+
throw new BodyError(`The X-Metadata header is longer than ${METADATA_HEADER_LIMIT} characters`, 431);
|
|
482
|
+
}
|
|
483
|
+
const custom = decodeMetadataHeader(encoded);
|
|
484
|
+
if (!custom) throw new BodyError("The X-Metadata header is not URI-encoded JSON of an object", 400);
|
|
485
|
+
for (const [key, value] of Object.entries(custom)) {
|
|
486
|
+
if (!RESERVED_METADATA.has(key) && key !== "auth" && !key.startsWith("__")) metadata[key] = value;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
// Payload from body (for POST/PUT) or params (for GET)
|
|
491
|
+
let payload: unknown = body;
|
|
492
|
+
if (req.method === "GET" && req.params["id"]) {
|
|
493
|
+
payload = { id: req.params["id"] };
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
// Default to empty object only if there is no payload (common for GET requests): 0, false,
|
|
497
|
+
// "" and null stay (deep dive TRN-10)
|
|
498
|
+
if (payload === undefined) {
|
|
499
|
+
payload = {};
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
return {
|
|
503
|
+
id,
|
|
504
|
+
method,
|
|
505
|
+
payload,
|
|
506
|
+
metadata,
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
/**
|
|
511
|
+
* Convert ServerResponse to HTTP response.
|
|
512
|
+
*/
|
|
513
|
+
private serverResponseToHttp(
|
|
514
|
+
serverResponse: ServerResponse,
|
|
515
|
+
res: Response
|
|
516
|
+
): void {
|
|
517
|
+
const { status, payload, metadata } = serverResponse;
|
|
518
|
+
|
|
519
|
+
// Set status code (convert string to number if needed)
|
|
520
|
+
let httpStatusCode: number;
|
|
521
|
+
if (typeof status.code === "string") {
|
|
522
|
+
// status.code is a symbolic error code (e.g. "VALIDATION_ERROR", "NOT_FOUND"). Map it to an
|
|
523
|
+
// HTTP status via the error registry rather than parseInt (which yields NaN -> 500, so every
|
|
524
|
+
// error became a 500). See documentation/BUGS-2026-07.md (M7).
|
|
525
|
+
const mapped =
|
|
526
|
+
INVOCATION_HTTP_STATUS[status.code] ??
|
|
527
|
+
(ERROR_REGISTRY as Record<string, { httpStatus?: number }>)[status.code]?.httpStatus;
|
|
528
|
+
httpStatusCode = mapped ?? (status.type === "success" ? 200 : 500);
|
|
529
|
+
} else if (typeof status.code === "number") {
|
|
530
|
+
httpStatusCode = status.code;
|
|
531
|
+
} else {
|
|
532
|
+
// Default to 200 for success, 500 for error if code is null/undefined
|
|
533
|
+
httpStatusCode = status.type === "success" ? 200 : 500;
|
|
534
|
+
}
|
|
535
|
+
res.status(httpStatusCode);
|
|
536
|
+
|
|
537
|
+
// Set headers from metadata
|
|
538
|
+
if (metadata["headers"]) {
|
|
539
|
+
for (const [key, value] of Object.entries(metadata["headers"])) {
|
|
540
|
+
res.setHeader(key, value as string);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
// Send response. A procedure that gave no result answers 204 with no body: before, the
|
|
545
|
+
// body was empty with a JSON content type, and the client got "" (deep dive TRN-10).
|
|
546
|
+
if (status.type === "success") {
|
|
547
|
+
if (payload === undefined) {
|
|
548
|
+
res.status(204).end();
|
|
549
|
+
return;
|
|
550
|
+
}
|
|
551
|
+
res.json(payload);
|
|
552
|
+
} else {
|
|
553
|
+
res.json({
|
|
554
|
+
error: status.message,
|
|
555
|
+
code: status.code,
|
|
556
|
+
retryable: status.retryable,
|
|
557
|
+
});
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
async start(): Promise<void> {
|
|
562
|
+
this.stopped = false;
|
|
563
|
+
// If an HTTP server was provided, use it (don't create or listen)
|
|
564
|
+
if (this.options.httpServer) {
|
|
565
|
+
this.httpServer = this.options.httpServer;
|
|
566
|
+
console.log(`[${this.name}] Using existing HTTP server`);
|
|
567
|
+
return Promise.resolve();
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
// Otherwise, create and listen on a new HTTP server
|
|
571
|
+
return new Promise((resolve, reject) => {
|
|
572
|
+
try {
|
|
573
|
+
const server = createServer(this.app);
|
|
574
|
+
this.httpServer = server;
|
|
575
|
+
|
|
576
|
+
server.listen(this.options.port, this.options.host, () => {
|
|
577
|
+
console.log(
|
|
578
|
+
`[${this.name}] Server listening on http://${this.options.host}:${this.options.port}`
|
|
579
|
+
);
|
|
580
|
+
resolve();
|
|
581
|
+
});
|
|
582
|
+
|
|
583
|
+
server.on("error", reject);
|
|
584
|
+
} catch (error) {
|
|
585
|
+
reject(error);
|
|
586
|
+
}
|
|
587
|
+
});
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
/**
|
|
591
|
+
* Stop the transport. The requests in progress are aborted: an open stream ends, and its
|
|
592
|
+
* handler gets return(). A server that the caller gave in `httpServer` stays open: the
|
|
593
|
+
* caller owns it. Before, stop() waited for open streams forever and closed the caller's
|
|
594
|
+
* server (deep dive TRN-15).
|
|
595
|
+
*/
|
|
596
|
+
async stop(): Promise<void> {
|
|
597
|
+
this.stopped = true;
|
|
598
|
+
for (const controller of this.openRequests) controller.abort();
|
|
599
|
+
this.openRequests.clear();
|
|
600
|
+
|
|
601
|
+
if (this.options.httpServer || !this.httpServer) {
|
|
602
|
+
return;
|
|
603
|
+
}
|
|
604
|
+
const server = this.httpServer;
|
|
605
|
+
await new Promise<void>((resolve, reject) => {
|
|
606
|
+
server.close((err) => {
|
|
607
|
+
if (err) {
|
|
608
|
+
reject(err);
|
|
609
|
+
} else {
|
|
610
|
+
console.log(`[${this.name}] Server stopped`);
|
|
611
|
+
resolve();
|
|
612
|
+
}
|
|
613
|
+
});
|
|
614
|
+
// Idle keep-alive connections and finished streams do not keep close() waiting
|
|
615
|
+
server.closeAllConnections();
|
|
616
|
+
});
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
isRunning(): boolean {
|
|
620
|
+
return !this.stopped && this.httpServer !== null && this.httpServer.listening;
|
|
621
|
+
}
|
|
622
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Server Transport Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for HTTP server adapter.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { Request, Express } from "express";
|
|
8
|
+
import type { Server as HttpServer } from "http";
|
|
9
|
+
import type { Method } from "../../../client/types.js";
|
|
10
|
+
import type { BrowserGuardOptions } from "../../../server/browser-guard.js";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* URL strategy for converting HTTP requests to RPC methods.
|
|
14
|
+
*/
|
|
15
|
+
export type HttpUrlStrategy = (req: Request) => Method | null;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* HTTP server transport options.
|
|
19
|
+
*/
|
|
20
|
+
export interface HttpServerTransportOptions extends BrowserGuardOptions {
|
|
21
|
+
/**
|
|
22
|
+
* Express app instance.
|
|
23
|
+
* If not provided, a new app will be created.
|
|
24
|
+
*/
|
|
25
|
+
app?: Express;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Existing HTTP server to use (optional).
|
|
29
|
+
* If provided, the transport will not create a new server or call listen().
|
|
30
|
+
* Useful for sharing the same HTTP server with WebSocket.
|
|
31
|
+
*/
|
|
32
|
+
httpServer?: HttpServer;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Port to listen on.
|
|
36
|
+
* @default 3000
|
|
37
|
+
*/
|
|
38
|
+
port?: number;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Host to bind to.
|
|
42
|
+
* @default "127.0.0.1"
|
|
43
|
+
*/
|
|
44
|
+
host?: string;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* URL strategy for converting HTTP requests to RPC methods.
|
|
48
|
+
* @default createPatternServerUrlStrategy(basePath): the format of the HTTP client
|
|
49
|
+
*/
|
|
50
|
+
urlStrategy?: HttpUrlStrategy;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Base path for RPC endpoints.
|
|
54
|
+
* @default "/api"
|
|
55
|
+
*/
|
|
56
|
+
basePath?: string;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Enable CORS.
|
|
60
|
+
* @default false
|
|
61
|
+
*/
|
|
62
|
+
cors?: boolean;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* The largest request body, in bytes, when the transport reads the body itself (the app has
|
|
66
|
+
* no body parser).
|
|
67
|
+
* @default 1 MiB
|
|
68
|
+
*/
|
|
69
|
+
bodyLimit?: number;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Custom CORS options. `origin` is "*", one origin or a list: the response names the
|
|
73
|
+
* request's origin when it is in the list.
|
|
74
|
+
*/
|
|
75
|
+
corsOptions?: {
|
|
76
|
+
origin?: string | string[];
|
|
77
|
+
methods?: string[];
|
|
78
|
+
allowedHeaders?: string[];
|
|
79
|
+
credentials?: boolean;
|
|
80
|
+
};
|
|
81
|
+
}
|