raffel 0.2.3 → 1.0.0-next.4f5d2c7
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/dist/adapters/grpc.d.ts.map +1 -1
- package/dist/adapters/grpc.js +1 -15
- package/dist/adapters/grpc.js.map +1 -1
- package/dist/adapters/http.d.ts +6 -0
- package/dist/adapters/http.d.ts.map +1 -1
- package/dist/adapters/http.js +53 -86
- package/dist/adapters/http.js.map +1 -1
- package/dist/adapters/index.d.ts +0 -2
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +0 -2
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/tcp.d.ts +16 -0
- package/dist/adapters/tcp.d.ts.map +1 -1
- package/dist/adapters/tcp.js +85 -34
- package/dist/adapters/tcp.js.map +1 -1
- package/dist/adapters/websocket.d.ts.map +1 -1
- package/dist/adapters/websocket.js +1 -14
- package/dist/adapters/websocket.js.map +1 -1
- package/dist/cache/drivers/index.d.ts +0 -1
- package/dist/cache/drivers/index.d.ts.map +1 -1
- package/dist/cache/drivers/index.js +0 -1
- package/dist/cache/drivers/index.js.map +1 -1
- package/dist/cache/factory.d.ts +2 -9
- package/dist/cache/factory.d.ts.map +1 -1
- package/dist/cache/factory.js +1 -19
- package/dist/cache/factory.js.map +1 -1
- package/dist/cache/index.d.ts +2 -7
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +1 -6
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/types.d.ts +1 -32
- package/dist/cache/types.d.ts.map +1 -1
- package/dist/core/event-delivery.d.ts.map +1 -1
- package/dist/core/event-delivery.js +5 -3
- package/dist/core/event-delivery.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/registry.d.ts +3 -3
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/registry.js +30 -8
- package/dist/core/registry.js.map +1 -1
- package/dist/core/router.d.ts.map +1 -1
- package/dist/core/router.js +5 -4
- package/dist/core/router.js.map +1 -1
- package/dist/docs/generators/code-samples.d.ts +32 -0
- package/dist/docs/generators/code-samples.d.ts.map +1 -0
- package/dist/docs/generators/code-samples.js +322 -0
- package/dist/docs/generators/code-samples.js.map +1 -0
- package/dist/docs/generators/errors-types.d.ts +2 -2
- package/dist/docs/generators/errors-types.js +2 -2
- package/dist/docs/generators/http-generator.d.ts +10 -0
- package/dist/docs/generators/http-generator.d.ts.map +1 -1
- package/dist/docs/generators/http-generator.js +100 -3
- package/dist/docs/generators/http-generator.js.map +1 -1
- package/dist/docs/generators/usd-generator.d.ts +31 -1
- package/dist/docs/generators/usd-generator.d.ts.map +1 -1
- package/dist/docs/generators/usd-generator.js +19 -1
- package/dist/docs/generators/usd-generator.js.map +1 -1
- package/dist/docs/generators/websocket-generator.d.ts.map +1 -1
- package/dist/docs/generators/websocket-generator.js +6 -4
- package/dist/docs/generators/websocket-generator.js.map +1 -1
- package/dist/docs/ui/html-builder.d.ts.map +1 -1
- package/dist/docs/ui/html-builder.js +260 -54
- package/dist/docs/ui/html-builder.js.map +1 -1
- package/dist/docs/ui/styles.d.ts.map +1 -1
- package/dist/docs/ui/styles.js +240 -30
- package/dist/docs/ui/styles.js.map +1 -1
- package/dist/docs/ui/types.d.ts +15 -1
- package/dist/docs/ui/types.d.ts.map +1 -1
- package/dist/docs/usd-middleware.d.ts +32 -7
- package/dist/docs/usd-middleware.d.ts.map +1 -1
- package/dist/docs/usd-middleware.js +5 -1
- package/dist/docs/usd-middleware.js.map +1 -1
- package/dist/dx/index.d.ts +2 -0
- package/dist/dx/index.d.ts.map +1 -1
- package/dist/dx/index.js +1 -0
- package/dist/dx/index.js.map +1 -1
- package/dist/dx/logging/index.d.ts.map +1 -1
- package/dist/dx/logging/index.js +5 -3
- package/dist/dx/logging/index.js.map +1 -1
- package/dist/dx/scenarios.d.ts +26 -0
- package/dist/dx/scenarios.d.ts.map +1 -0
- package/dist/dx/scenarios.js +109 -0
- package/dist/dx/scenarios.js.map +1 -0
- package/dist/errors/codes.d.ts +1 -1
- package/dist/errors/codes.js +1 -1
- package/dist/graphql/adapter.js +1 -1
- package/dist/http/index.d.ts +2 -0
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/index.js +4 -0
- package/dist/http/index.js.map +1 -1
- package/dist/http/openapi-ui.d.ts +174 -0
- package/dist/http/openapi-ui.d.ts.map +1 -0
- package/dist/http/openapi-ui.js +221 -0
- package/dist/http/openapi-ui.js.map +1 -0
- package/dist/http/serve.d.ts +14 -0
- package/dist/http/serve.d.ts.map +1 -1
- package/dist/http/serve.js +8 -1
- package/dist/http/serve.js.map +1 -1
- package/dist/index.d.ts +17 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -6
- package/dist/index.js.map +1 -1
- package/dist/mcp/cli.d.ts +2 -1
- package/dist/mcp/cli.d.ts.map +1 -1
- package/dist/mcp/cli.js +30 -7
- package/dist/mcp/cli.js.map +1 -1
- package/dist/mcp/docs/adapters.d.ts.map +1 -1
- package/dist/mcp/docs/adapters.js +1 -117
- package/dist/mcp/docs/adapters.js.map +1 -1
- package/dist/mcp/docs/index.d.ts +0 -1
- package/dist/mcp/docs/index.d.ts.map +1 -1
- package/dist/mcp/docs/index.js +0 -1
- package/dist/mcp/docs/index.js.map +1 -1
- package/dist/mcp/docs/interceptors.d.ts.map +1 -1
- package/dist/mcp/docs/interceptors.js +272 -1
- package/dist/mcp/docs/interceptors.js.map +1 -1
- package/dist/mcp/docs/patterns.js +1 -1
- package/dist/mcp/prompts/index.d.ts.map +1 -1
- package/dist/mcp/prompts/index.js +147 -22
- package/dist/mcp/prompts/index.js.map +1 -1
- package/dist/mcp/resources/index.d.ts.map +1 -1
- package/dist/mcp/resources/index.js +508 -10
- package/dist/mcp/resources/index.js.map +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/definitions.d.ts +2 -0
- package/dist/mcp/tools/definitions.d.ts.map +1 -1
- package/dist/mcp/tools/definitions.js +149 -1
- package/dist/mcp/tools/definitions.js.map +1 -1
- package/dist/mcp/tools/handlers.d.ts.map +1 -1
- package/dist/mcp/tools/handlers.js +828 -44
- package/dist/mcp/tools/handlers.js.map +1 -1
- package/dist/mcp/types.d.ts +1 -1
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/metrics/interceptor.d.ts.map +1 -1
- package/dist/metrics/interceptor.js +10 -2
- package/dist/metrics/interceptor.js.map +1 -1
- package/dist/middleware/interceptors/cache.d.ts +1 -1
- package/dist/middleware/interceptors/cache.d.ts.map +1 -1
- package/dist/middleware/interceptors/cache.js +4 -2
- package/dist/middleware/interceptors/cache.js.map +1 -1
- package/dist/middleware/interceptors/envelope.d.ts.map +1 -1
- package/dist/middleware/interceptors/envelope.js +12 -14
- package/dist/middleware/interceptors/envelope.js.map +1 -1
- package/dist/middleware/interceptors/logging.d.ts.map +1 -1
- package/dist/middleware/interceptors/logging.js +11 -6
- package/dist/middleware/interceptors/logging.js.map +1 -1
- package/dist/middleware/session/drivers/memory.d.ts +36 -0
- package/dist/middleware/session/drivers/memory.d.ts.map +1 -0
- package/dist/middleware/session/drivers/memory.js +82 -0
- package/dist/middleware/session/drivers/memory.js.map +1 -0
- package/dist/middleware/session/drivers/redis.d.ts +58 -0
- package/dist/middleware/session/drivers/redis.d.ts.map +1 -0
- package/dist/middleware/session/drivers/redis.js +70 -0
- package/dist/middleware/session/drivers/redis.js.map +1 -0
- package/dist/middleware/session/drivers/s3db.d.ts +65 -0
- package/dist/middleware/session/drivers/s3db.d.ts.map +1 -0
- package/dist/middleware/session/drivers/s3db.js +98 -0
- package/dist/middleware/session/drivers/s3db.js.map +1 -0
- package/dist/middleware/session/index.d.ts +47 -0
- package/dist/middleware/session/index.d.ts.map +1 -0
- package/dist/middleware/session/index.js +46 -0
- package/dist/middleware/session/index.js.map +1 -0
- package/dist/middleware/session/interceptor.d.ts +42 -0
- package/dist/middleware/session/interceptor.d.ts.map +1 -0
- package/dist/middleware/session/interceptor.js +264 -0
- package/dist/middleware/session/interceptor.js.map +1 -0
- package/dist/middleware/session/types.d.ts +116 -0
- package/dist/middleware/session/types.d.ts.map +1 -0
- package/dist/middleware/session/types.js +9 -0
- package/dist/middleware/session/types.js.map +1 -0
- package/dist/proxy/connect-tunnel.d.ts +50 -0
- package/dist/proxy/connect-tunnel.d.ts.map +1 -0
- package/dist/proxy/connect-tunnel.js +163 -0
- package/dist/proxy/connect-tunnel.js.map +1 -0
- package/dist/proxy/http-forward.d.ts +48 -0
- package/dist/proxy/http-forward.d.ts.map +1 -0
- package/dist/proxy/http-forward.js +160 -0
- package/dist/proxy/http-forward.js.map +1 -0
- package/dist/proxy/index.d.ts +19 -0
- package/dist/proxy/index.d.ts.map +1 -0
- package/dist/proxy/index.js +14 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/proxy/socks5.d.ts +22 -0
- package/dist/proxy/socks5.d.ts.map +1 -0
- package/dist/proxy/socks5.js +307 -0
- package/dist/proxy/socks5.js.map +1 -0
- package/dist/proxy/transparent.d.ts +40 -0
- package/dist/proxy/transparent.d.ts.map +1 -0
- package/dist/proxy/transparent.js +144 -0
- package/dist/proxy/transparent.js.map +1 -0
- package/dist/proxy/types.d.ts +32 -0
- package/dist/proxy/types.d.ts.map +1 -0
- package/dist/proxy/types.js +5 -0
- package/dist/proxy/types.js.map +1 -0
- package/dist/proxy/utils/auth.d.ts +31 -0
- package/dist/proxy/utils/auth.d.ts.map +1 -0
- package/dist/proxy/utils/auth.js +69 -0
- package/dist/proxy/utils/auth.js.map +1 -0
- package/dist/proxy/utils/hop-headers.d.ts +13 -0
- package/dist/proxy/utils/hop-headers.d.ts.map +1 -0
- package/dist/proxy/utils/hop-headers.js +38 -0
- package/dist/proxy/utils/hop-headers.js.map +1 -0
- package/dist/proxy/utils/pipe.d.ts +22 -0
- package/dist/proxy/utils/pipe.d.ts.map +1 -0
- package/dist/proxy/utils/pipe.js +60 -0
- package/dist/proxy/utils/pipe.js.map +1 -0
- package/dist/rate-limit/factory.d.ts.map +1 -1
- package/dist/rate-limit/factory.js +30 -6
- package/dist/rate-limit/factory.js.map +1 -1
- package/dist/server/builder/config-preview.d.ts +34 -0
- package/dist/server/builder/config-preview.d.ts.map +1 -0
- package/dist/server/builder/config-preview.js +95 -0
- package/dist/server/builder/config-preview.js.map +1 -0
- package/dist/server/builder/lifecycle-utils.d.ts +11 -0
- package/dist/server/builder/lifecycle-utils.d.ts.map +1 -0
- package/dist/server/builder/lifecycle-utils.js +32 -0
- package/dist/server/builder/lifecycle-utils.js.map +1 -0
- package/dist/server/builder/lifecycle.d.ts +86 -0
- package/dist/server/builder/lifecycle.d.ts.map +1 -0
- package/dist/server/builder/lifecycle.js +738 -0
- package/dist/server/builder/lifecycle.js.map +1 -0
- package/dist/server/builder/single-port-utils.d.ts +27 -0
- package/dist/server/builder/single-port-utils.d.ts.map +1 -0
- package/dist/server/builder/single-port-utils.js +170 -0
- package/dist/server/builder/single-port-utils.js.map +1 -0
- package/dist/server/builder.d.ts.map +1 -1
- package/dist/server/builder.js +446 -601
- package/dist/server/builder.js.map +1 -1
- package/dist/server/discovery-bootstrap.d.ts +21 -0
- package/dist/server/discovery-bootstrap.d.ts.map +1 -0
- package/dist/server/discovery-bootstrap.js +39 -0
- package/dist/server/discovery-bootstrap.js.map +1 -0
- package/dist/server/errors.d.ts.map +1 -1
- package/dist/server/errors.js +1 -33
- package/dist/server/errors.js.map +1 -1
- package/dist/server/front-door.d.ts +34 -0
- package/dist/server/front-door.d.ts.map +1 -0
- package/dist/server/front-door.js +238 -0
- package/dist/server/front-door.js.map +1 -0
- package/dist/server/fs-routes/types.d.ts +6 -0
- package/dist/server/fs-routes/types.d.ts.map +1 -1
- package/dist/server/handler-builders.d.ts +22 -4
- package/dist/server/handler-builders.d.ts.map +1 -1
- package/dist/server/handler-builders.js +37 -14
- package/dist/server/handler-builders.js.map +1 -1
- package/dist/server/index.d.ts +4 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/interceptor-utils.d.ts +8 -0
- package/dist/server/interceptor-utils.d.ts.map +1 -0
- package/dist/server/interceptor-utils.js +23 -0
- package/dist/server/interceptor-utils.js.map +1 -0
- package/dist/server/port-binding.d.ts +44 -0
- package/dist/server/port-binding.d.ts.map +1 -0
- package/dist/server/port-binding.js +94 -0
- package/dist/server/port-binding.js.map +1 -0
- package/dist/server/protocol-aliases.d.ts +56 -0
- package/dist/server/protocol-aliases.d.ts.map +1 -0
- package/dist/server/protocol-aliases.js +47 -0
- package/dist/server/protocol-aliases.js.map +1 -0
- package/dist/server/protocol-config.d.ts +17 -1
- package/dist/server/protocol-config.d.ts.map +1 -1
- package/dist/server/protocol-config.js +116 -9
- package/dist/server/protocol-config.js.map +1 -1
- package/dist/server/resource-builder.js +3 -3
- package/dist/server/resource-builder.js.map +1 -1
- package/dist/server/rest-middleware.d.ts.map +1 -1
- package/dist/server/rest-middleware.js +1 -15
- package/dist/server/rest-middleware.js.map +1 -1
- package/dist/server/router-module.d.ts.map +1 -1
- package/dist/server/router-module.js +22 -99
- package/dist/server/router-module.js.map +1 -1
- package/dist/server/shared-context.d.ts.map +1 -1
- package/dist/server/shared-context.js +3 -1
- package/dist/server/shared-context.js.map +1 -1
- package/dist/server/single-port/dispatcher.d.ts +10 -0
- package/dist/server/single-port/dispatcher.d.ts.map +1 -0
- package/dist/server/single-port/dispatcher.js +188 -0
- package/dist/server/single-port/dispatcher.js.map +1 -0
- package/dist/server/single-port/index.d.ts +4 -0
- package/dist/server/single-port/index.d.ts.map +1 -0
- package/dist/server/single-port/index.js +3 -0
- package/dist/server/single-port/index.js.map +1 -0
- package/dist/server/single-port/registry.d.ts +19 -0
- package/dist/server/single-port/registry.d.ts.map +1 -0
- package/dist/server/single-port/registry.js +24 -0
- package/dist/server/single-port/registry.js.map +1 -0
- package/dist/server/single-port/types.d.ts +46 -0
- package/dist/server/single-port/types.d.ts.map +1 -0
- package/dist/server/single-port/types.js +2 -0
- package/dist/server/single-port/types.js.map +1 -0
- package/dist/server/telemetry-bootstrap.d.ts +38 -0
- package/dist/server/telemetry-bootstrap.d.ts.map +1 -0
- package/dist/server/telemetry-bootstrap.js +115 -0
- package/dist/server/telemetry-bootstrap.js.map +1 -0
- package/dist/server/types.d.ts +422 -21
- package/dist/server/types.d.ts.map +1 -1
- package/dist/testing/echo-protection.d.ts +30 -0
- package/dist/testing/echo-protection.d.ts.map +1 -0
- package/dist/testing/echo-protection.js +158 -0
- package/dist/testing/echo-protection.js.map +1 -0
- package/dist/testing/index.d.ts +344 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +1072 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mock-dns-server.d.ts +31 -0
- package/dist/testing/mock-dns-server.d.ts.map +1 -0
- package/dist/testing/mock-dns-server.js +247 -0
- package/dist/testing/mock-dns-server.js.map +1 -0
- package/dist/testing/mock-hls-server.d.ts +85 -0
- package/dist/testing/mock-hls-server.d.ts.map +1 -0
- package/dist/testing/mock-hls-server.js +252 -0
- package/dist/testing/mock-hls-server.js.map +1 -0
- package/dist/testing/mock-proxy-server.d.ts +78 -0
- package/dist/testing/mock-proxy-server.d.ts.map +1 -0
- package/dist/testing/mock-proxy-server.js +277 -0
- package/dist/testing/mock-proxy-server.js.map +1 -0
- package/dist/testing/mock-sse-server.d.ts +56 -0
- package/dist/testing/mock-sse-server.d.ts.map +1 -0
- package/dist/testing/mock-sse-server.js +206 -0
- package/dist/testing/mock-sse-server.js.map +1 -0
- package/dist/testing/proxy-certs.d.ts +9 -0
- package/dist/testing/proxy-certs.d.ts.map +1 -0
- package/dist/testing/proxy-certs.js +2 -0
- package/dist/testing/proxy-certs.js.map +1 -0
- package/dist/testing/service-suite.d.ts +47 -0
- package/dist/testing/service-suite.d.ts.map +1 -0
- package/dist/testing/service-suite.js +82 -0
- package/dist/testing/service-suite.js.map +1 -0
- package/dist/testing/service-types.d.ts +32 -0
- package/dist/testing/service-types.d.ts.map +1 -0
- package/dist/testing/service-types.js +2 -0
- package/dist/testing/service-types.js.map +1 -0
- package/dist/ui/core/event-delivery.d.ts.map +1 -1
- package/dist/ui/core/index.d.ts +1 -1
- package/dist/ui/core/index.d.ts.map +1 -1
- package/dist/ui/core/registry.d.ts +3 -3
- package/dist/ui/core/registry.d.ts.map +1 -1
- package/dist/ui/core/router.d.ts.map +1 -1
- package/dist/ui/docs/generators/code-samples.d.ts +32 -0
- package/dist/ui/docs/generators/code-samples.d.ts.map +1 -0
- package/dist/ui/docs/generators/errors-types.d.ts +2 -2
- package/dist/ui/docs/generators/http-generator.d.ts +10 -0
- package/dist/ui/docs/generators/http-generator.d.ts.map +1 -1
- package/dist/ui/docs/generators/usd-generator.d.ts +31 -1
- package/dist/ui/docs/generators/usd-generator.d.ts.map +1 -1
- package/dist/ui/docs/generators/websocket-generator.d.ts.map +1 -1
- package/dist/ui/docs/ui/html-builder.d.ts.map +1 -1
- package/dist/ui/docs/ui/styles.d.ts.map +1 -1
- package/dist/ui/docs/ui/types.d.ts +15 -1
- package/dist/ui/docs/ui/types.d.ts.map +1 -1
- package/dist/ui/docs/usd-middleware.d.ts +32 -7
- package/dist/ui/docs/usd-middleware.d.ts.map +1 -1
- package/dist/ui/errors/codes.d.ts +1 -1
- package/dist/ui/server/fs-routes/types.d.ts +6 -0
- package/dist/ui/server/fs-routes/types.d.ts.map +1 -1
- package/dist/ui/usd/index.d.ts +1 -1
- package/dist/ui/usd/index.d.ts.map +1 -1
- package/dist/ui/usd/spec/types.d.ts +91 -0
- package/dist/ui/usd/spec/types.d.ts.map +1 -1
- package/dist/usd/index.d.ts +1 -1
- package/dist/usd/index.d.ts.map +1 -1
- package/dist/usd/index.js.map +1 -1
- package/dist/usd/spec/types.d.ts +91 -0
- package/dist/usd/spec/types.d.ts.map +1 -1
- package/dist/usd/spec/types.js.map +1 -1
- package/dist/utils/certs.d.ts +30 -0
- package/dist/utils/certs.d.ts.map +1 -0
- package/dist/utils/certs.js +230 -0
- package/dist/utils/certs.js.map +1 -0
- package/dist/utils/context-utils.d.ts +11 -0
- package/dist/utils/context-utils.d.ts.map +1 -0
- package/dist/utils/context-utils.js +24 -0
- package/dist/utils/context-utils.js.map +1 -0
- package/package.json +11 -2
- package/dist/adapters/grpc.int.test.d.ts +0 -5
- package/dist/adapters/grpc.int.test.d.ts.map +0 -1
- package/dist/adapters/grpc.int.test.js +0 -168
- package/dist/adapters/grpc.int.test.js.map +0 -1
- package/dist/adapters/http.int.test.d.ts +0 -5
- package/dist/adapters/http.int.test.d.ts.map +0 -1
- package/dist/adapters/http.int.test.js +0 -396
- package/dist/adapters/http.int.test.js.map +0 -1
- package/dist/adapters/jsonrpc.int.test.d.ts +0 -5
- package/dist/adapters/jsonrpc.int.test.d.ts.map +0 -1
- package/dist/adapters/jsonrpc.int.test.js +0 -640
- package/dist/adapters/jsonrpc.int.test.js.map +0 -1
- package/dist/adapters/s3db/adapter.d.ts +0 -105
- package/dist/adapters/s3db/adapter.d.ts.map +0 -1
- package/dist/adapters/s3db/adapter.js +0 -536
- package/dist/adapters/s3db/adapter.js.map +0 -1
- package/dist/adapters/s3db/index.d.ts +0 -20
- package/dist/adapters/s3db/index.d.ts.map +0 -1
- package/dist/adapters/s3db/index.js +0 -25
- package/dist/adapters/s3db/index.js.map +0 -1
- package/dist/adapters/s3db/s3db.int.test.d.ts +0 -5
- package/dist/adapters/s3db/s3db.int.test.d.ts.map +0 -1
- package/dist/adapters/s3db/s3db.int.test.js +0 -472
- package/dist/adapters/s3db/s3db.int.test.js.map +0 -1
- package/dist/adapters/s3db/types.d.ts +0 -277
- package/dist/adapters/s3db/types.d.ts.map +0 -1
- package/dist/adapters/s3db/types.js +0 -7
- package/dist/adapters/s3db/types.js.map +0 -1
- package/dist/adapters/s3db/utils/etag.d.ts +0 -65
- package/dist/adapters/s3db/utils/etag.d.ts.map +0 -1
- package/dist/adapters/s3db/utils/etag.js +0 -99
- package/dist/adapters/s3db/utils/etag.js.map +0 -1
- package/dist/adapters/s3db/utils/guards.d.ts +0 -121
- package/dist/adapters/s3db/utils/guards.d.ts.map +0 -1
- package/dist/adapters/s3db/utils/guards.js +0 -169
- package/dist/adapters/s3db/utils/guards.js.map +0 -1
- package/dist/adapters/s3db/utils/index.d.ts +0 -9
- package/dist/adapters/s3db/utils/index.d.ts.map +0 -1
- package/dist/adapters/s3db/utils/index.js +0 -10
- package/dist/adapters/s3db/utils/index.js.map +0 -1
- package/dist/adapters/s3db/utils/populate.d.ts +0 -89
- package/dist/adapters/s3db/utils/populate.d.ts.map +0 -1
- package/dist/adapters/s3db/utils/populate.js +0 -165
- package/dist/adapters/s3db/utils/populate.js.map +0 -1
- package/dist/adapters/tcp.int.test.d.ts +0 -5
- package/dist/adapters/tcp.int.test.d.ts.map +0 -1
- package/dist/adapters/tcp.int.test.js +0 -379
- package/dist/adapters/tcp.int.test.js.map +0 -1
- package/dist/adapters/udp.int.test.d.ts +0 -5
- package/dist/adapters/udp.int.test.d.ts.map +0 -1
- package/dist/adapters/udp.int.test.js +0 -397
- package/dist/adapters/udp.int.test.js.map +0 -1
- package/dist/adapters/websocket.int.test.d.ts +0 -5
- package/dist/adapters/websocket.int.test.d.ts.map +0 -1
- package/dist/adapters/websocket.int.test.js +0 -383
- package/dist/adapters/websocket.int.test.js.map +0 -1
- package/dist/cache/drivers/memory.int.test.d.ts +0 -5
- package/dist/cache/drivers/memory.int.test.d.ts.map +0 -1
- package/dist/cache/drivers/memory.int.test.js +0 -241
- package/dist/cache/drivers/memory.int.test.js.map +0 -1
- package/dist/cache/drivers/s3db.d.ts +0 -78
- package/dist/cache/drivers/s3db.d.ts.map +0 -1
- package/dist/cache/drivers/s3db.js +0 -216
- package/dist/cache/drivers/s3db.js.map +0 -1
- package/dist/channels/channel-manager.int.test.d.ts +0 -5
- package/dist/channels/channel-manager.int.test.d.ts.map +0 -1
- package/dist/channels/channel-manager.int.test.js +0 -378
- package/dist/channels/channel-manager.int.test.js.map +0 -1
- package/dist/core/ctx-call.int.test.d.ts +0 -7
- package/dist/core/ctx-call.int.test.d.ts.map +0 -1
- package/dist/core/ctx-call.int.test.js +0 -263
- package/dist/core/ctx-call.int.test.js.map +0 -1
- package/dist/core/registry.unit.test.d.ts +0 -2
- package/dist/core/registry.unit.test.d.ts.map +0 -1
- package/dist/core/registry.unit.test.js +0 -133
- package/dist/core/registry.unit.test.js.map +0 -1
- package/dist/core/router.int.test.d.ts +0 -2
- package/dist/core/router.int.test.d.ts.map +0 -1
- package/dist/core/router.int.test.js +0 -368
- package/dist/core/router.int.test.js.map +0 -1
- package/dist/docs/generators/generators.int.test.d.ts +0 -2
- package/dist/docs/generators/generators.int.test.d.ts.map +0 -1
- package/dist/docs/generators/generators.int.test.js +0 -105
- package/dist/docs/generators/generators.int.test.js.map +0 -1
- package/dist/docs/openapi/generator.int.test.d.ts +0 -5
- package/dist/docs/openapi/generator.int.test.d.ts.map +0 -1
- package/dist/docs/openapi/generator.int.test.js +0 -260
- package/dist/docs/openapi/generator.int.test.js.map +0 -1
- package/dist/dx/health/health.int.test.d.ts +0 -5
- package/dist/dx/health/health.int.test.d.ts.map +0 -1
- package/dist/dx/health/health.int.test.js +0 -249
- package/dist/dx/health/health.int.test.js.map +0 -1
- package/dist/dx/logging/http-logging.int.test.d.ts +0 -5
- package/dist/dx/logging/http-logging.int.test.d.ts.map +0 -1
- package/dist/dx/logging/http-logging.int.test.js +0 -319
- package/dist/dx/logging/http-logging.int.test.js.map +0 -1
- package/dist/errors/factories.unit.test.d.ts +0 -7
- package/dist/errors/factories.unit.test.d.ts.map +0 -1
- package/dist/errors/factories.unit.test.js +0 -358
- package/dist/errors/factories.unit.test.js.map +0 -1
- package/dist/graphql/graphql.int.test.d.ts +0 -10
- package/dist/graphql/graphql.int.test.d.ts.map +0 -1
- package/dist/graphql/graphql.int.test.js +0 -698
- package/dist/graphql/graphql.int.test.js.map +0 -1
- package/dist/graphql/schema-generator.int.test.d.ts +0 -5
- package/dist/graphql/schema-generator.int.test.d.ts.map +0 -1
- package/dist/graphql/schema-generator.int.test.js +0 -51
- package/dist/graphql/schema-generator.int.test.js.map +0 -1
- package/dist/http/http.int.test.d.ts +0 -7
- package/dist/http/http.int.test.d.ts.map +0 -1
- package/dist/http/http.int.test.js +0 -605
- package/dist/http/http.int.test.js.map +0 -1
- package/dist/http/session-redis.int.test.d.ts +0 -8
- package/dist/http/session-redis.int.test.d.ts.map +0 -1
- package/dist/http/session-redis.int.test.js +0 -492
- package/dist/http/session-redis.int.test.js.map +0 -1
- package/dist/metrics/metrics.int.test.d.ts +0 -5
- package/dist/metrics/metrics.int.test.d.ts.map +0 -1
- package/dist/metrics/metrics.int.test.js +0 -288
- package/dist/metrics/metrics.int.test.js.map +0 -1
- package/dist/middleware/auth/oauth2.int.test.d.ts +0 -2
- package/dist/middleware/auth/oauth2.int.test.d.ts.map +0 -1
- package/dist/middleware/auth/oauth2.int.test.js +0 -714
- package/dist/middleware/auth/oauth2.int.test.js.map +0 -1
- package/dist/middleware/auth.int.test.d.ts +0 -5
- package/dist/middleware/auth.int.test.d.ts.map +0 -1
- package/dist/middleware/auth.int.test.js +0 -366
- package/dist/middleware/auth.int.test.js.map +0 -1
- package/dist/middleware/compose.int.test.d.ts +0 -7
- package/dist/middleware/compose.int.test.d.ts.map +0 -1
- package/dist/middleware/compose.int.test.js +0 -238
- package/dist/middleware/compose.int.test.js.map +0 -1
- package/dist/middleware/interceptors/bulkhead.int.test.d.ts +0 -5
- package/dist/middleware/interceptors/bulkhead.int.test.d.ts.map +0 -1
- package/dist/middleware/interceptors/bulkhead.int.test.js +0 -263
- package/dist/middleware/interceptors/bulkhead.int.test.js.map +0 -1
- package/dist/middleware/interceptors/cache.int.test.d.ts +0 -5
- package/dist/middleware/interceptors/cache.int.test.d.ts.map +0 -1
- package/dist/middleware/interceptors/cache.int.test.js +0 -470
- package/dist/middleware/interceptors/cache.int.test.js.map +0 -1
- package/dist/middleware/interceptors/circuit-breaker.int.test.d.ts +0 -5
- package/dist/middleware/interceptors/circuit-breaker.int.test.d.ts.map +0 -1
- package/dist/middleware/interceptors/circuit-breaker.int.test.js +0 -253
- package/dist/middleware/interceptors/circuit-breaker.int.test.js.map +0 -1
- package/dist/middleware/interceptors/envelope.int.test.d.ts +0 -5
- package/dist/middleware/interceptors/envelope.int.test.d.ts.map +0 -1
- package/dist/middleware/interceptors/envelope.int.test.js +0 -409
- package/dist/middleware/interceptors/envelope.int.test.js.map +0 -1
- package/dist/middleware/interceptors/fallback.int.test.d.ts +0 -5
- package/dist/middleware/interceptors/fallback.int.test.d.ts.map +0 -1
- package/dist/middleware/interceptors/fallback.int.test.js +0 -211
- package/dist/middleware/interceptors/fallback.int.test.js.map +0 -1
- package/dist/middleware/interceptors/logging.int.test.d.ts +0 -5
- package/dist/middleware/interceptors/logging.int.test.d.ts.map +0 -1
- package/dist/middleware/interceptors/logging.int.test.js +0 -144
- package/dist/middleware/interceptors/logging.int.test.js.map +0 -1
- package/dist/middleware/interceptors/rate-limit.int.test.d.ts +0 -5
- package/dist/middleware/interceptors/rate-limit.int.test.d.ts.map +0 -1
- package/dist/middleware/interceptors/rate-limit.int.test.js +0 -221
- package/dist/middleware/interceptors/rate-limit.int.test.js.map +0 -1
- package/dist/middleware/interceptors/request-id.int.test.d.ts +0 -5
- package/dist/middleware/interceptors/request-id.int.test.d.ts.map +0 -1
- package/dist/middleware/interceptors/request-id.int.test.js +0 -136
- package/dist/middleware/interceptors/request-id.int.test.js.map +0 -1
- package/dist/middleware/interceptors/retry.int.test.d.ts +0 -5
- package/dist/middleware/interceptors/retry.int.test.d.ts.map +0 -1
- package/dist/middleware/interceptors/retry.int.test.js +0 -534
- package/dist/middleware/interceptors/retry.int.test.js.map +0 -1
- package/dist/middleware/interceptors/timeout.int.test.d.ts +0 -5
- package/dist/middleware/interceptors/timeout.int.test.d.ts.map +0 -1
- package/dist/middleware/interceptors/timeout.int.test.js +0 -228
- package/dist/middleware/interceptors/timeout.int.test.js.map +0 -1
- package/dist/rate-limit/drivers/drivers.int.test.d.ts +0 -7
- package/dist/rate-limit/drivers/drivers.int.test.d.ts.map +0 -1
- package/dist/rate-limit/drivers/drivers.int.test.js +0 -466
- package/dist/rate-limit/drivers/drivers.int.test.js.map +0 -1
- package/dist/server/builder.int.test.d.ts +0 -7
- package/dist/server/builder.int.test.d.ts.map +0 -1
- package/dist/server/builder.int.test.js +0 -455
- package/dist/server/builder.int.test.js.map +0 -1
- package/dist/server/fs-routes/loader.int.test.d.ts +0 -5
- package/dist/server/fs-routes/loader.int.test.d.ts.map +0 -1
- package/dist/server/fs-routes/loader.int.test.js +0 -48
- package/dist/server/fs-routes/loader.int.test.js.map +0 -1
- package/dist/server/hooks.int.test.d.ts +0 -7
- package/dist/server/hooks.int.test.d.ts.map +0 -1
- package/dist/server/hooks.int.test.js +0 -564
- package/dist/server/hooks.int.test.js.map +0 -1
- package/dist/server/route-discovery.int.test.d.ts +0 -5
- package/dist/server/route-discovery.int.test.d.ts.map +0 -1
- package/dist/server/route-discovery.int.test.js +0 -49
- package/dist/server/route-discovery.int.test.js.map +0 -1
- package/dist/stream/raffel-stream.int.test.d.ts +0 -2
- package/dist/stream/raffel-stream.int.test.d.ts.map +0 -1
- package/dist/stream/raffel-stream.int.test.js +0 -265
- package/dist/stream/raffel-stream.int.test.js.map +0 -1
- package/dist/tracing/tracing.int.test.d.ts +0 -5
- package/dist/tracing/tracing.int.test.d.ts.map +0 -1
- package/dist/tracing/tracing.int.test.js +0 -412
- package/dist/tracing/tracing.int.test.js.map +0 -1
- package/dist/usd/usd.int.test.d.ts +0 -10
- package/dist/usd/usd.int.test.d.ts.map +0 -1
- package/dist/usd/usd.int.test.js +0 -719
- package/dist/usd/usd.int.test.js.map +0 -1
- package/dist/validation/multi-validator.int.test.d.ts +0 -7
- package/dist/validation/multi-validator.int.test.d.ts.map +0 -1
- package/dist/validation/multi-validator.int.test.js +0 -808
- package/dist/validation/multi-validator.int.test.js.map +0 -1
- package/dist/validation/schema.int.test.d.ts +0 -5
- package/dist/validation/schema.int.test.d.ts.map +0 -1
- package/dist/validation/schema.int.test.js +0 -340
- package/dist/validation/schema.int.test.js.map +0 -1
package/dist/server/builder.js
CHANGED
|
@@ -5,25 +5,22 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { createRegistry } from '../core/registry.js';
|
|
7
7
|
import { createRouter } from '../core/router.js';
|
|
8
|
-
import { createHttpAdapter } from '../adapters/http.js';
|
|
9
|
-
import { createWebSocketAdapter } from '../adapters/websocket.js';
|
|
10
|
-
import { createTcpAdapter } from '../adapters/tcp.js';
|
|
11
|
-
import { createJsonRpcAdapter, createJsonRpcMiddleware } from '../adapters/jsonrpc.js';
|
|
12
|
-
import { createGrpcAdapter } from '../adapters/grpc.js';
|
|
13
|
-
import { createGraphQLAdapter, createGraphQLMiddleware } from '../graphql/index.js';
|
|
14
8
|
import { getRouterModuleDefinition } from './router-module.js';
|
|
15
|
-
import { createSchemaRegistry
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import { createUSDHandlers } from '../docs/index.js';
|
|
19
|
-
import { createDiscoveryWatcher, createRouteInterceptors, isDevelopment, generateResourceRoutes, } from './fs-routes/index.js';
|
|
9
|
+
import { createSchemaRegistry } from '../validation/index.js';
|
|
10
|
+
import { createEnvelopeInterceptor, createStandardEnvelopeInterceptor } from '../middleware/interceptors/envelope.js';
|
|
11
|
+
import { createRouteInterceptors, isDevelopment, generateResourceRoutes, } from './fs-routes/index.js';
|
|
20
12
|
import { createLogger } from '../utils/logger.js';
|
|
21
13
|
import { createProcedureBuilder, createStreamBuilder, createEventBuilder, createGroupBuilder, joinHandlerName, } from './handler-builders.js';
|
|
22
14
|
import { createResourceBuilder } from './resource-builder.js';
|
|
23
15
|
import { registerDiscoveredHandlers, resolveHooksForProcedure } from './discovery-utils.js';
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
16
|
+
import { buildProtocolConfig, resolveSinglePortConfig } from './protocol-config.js';
|
|
17
|
+
import { normalizeInterceptors as normalizeInterceptorsShared } from './interceptor-utils.js';
|
|
18
|
+
import { buildServerConfigPreview, emitConfigWarnings, logSinglePortConfig, } from './builder/config-preview.js';
|
|
19
|
+
import { createFrontDoorBootstrap, normalizeFrontDoorProtocol } from './front-door.js';
|
|
20
|
+
import { createDiscoveryBootstrap } from './discovery-bootstrap.js';
|
|
21
|
+
import { createServerLifecycle } from './builder/lifecycle.js';
|
|
22
|
+
import { configureMetrics, configureTracing, createTelemetryState, } from './telemetry-bootstrap.js';
|
|
23
|
+
import { isSinglePortTcpRouteEnabled as detectSinglePortTcpRouteEnabled, isSinglePortUdpRouteEnabled as detectSinglePortUdpRouteEnabled, } from './builder/single-port-utils.js';
|
|
27
24
|
const logger = createLogger('server');
|
|
28
25
|
/**
|
|
29
26
|
* Check if a value is an async iterable
|
|
@@ -35,46 +32,150 @@ function isAsyncIterable(value) {
|
|
|
35
32
|
* Create a unified Raffel server
|
|
36
33
|
*/
|
|
37
34
|
export function createServer(options) {
|
|
38
|
-
const { port, host = '0.0.0.0', basePath = '/', cors = true, eventDelivery, websocket, jsonrpc, tcp, graphql, middleware, http: httpOptions, discovery, hotReload = isDevelopment(), providers: initialProviders, protocolExtensions: initialProtocolExtensions, } = options;
|
|
35
|
+
const { port, host = '0.0.0.0', basePath = '/', cors = true, eventDelivery, websocket, jsonrpc, tcp, grpc, graphql, middleware, http: httpOptions, frontDoor, singlePort, envelope, discovery, hotReload = isDevelopment(), providers: initialProviders, protocolExtensions: initialProtocolExtensions, protocolAliasMode: serverProtocolAliasMode = 'standard', } = options;
|
|
39
36
|
// Core components
|
|
40
37
|
const registry = createRegistry();
|
|
41
38
|
const router = createRouter(registry, { eventDelivery });
|
|
42
39
|
const schemaRegistry = createSchemaRegistry();
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
:
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
},
|
|
69
|
-
onError: (err) => {
|
|
70
|
-
logger.error({ err }, 'Discovery loading error');
|
|
71
|
-
},
|
|
72
|
-
});
|
|
73
|
-
}
|
|
40
|
+
const telemetryState = createTelemetryState();
|
|
41
|
+
const discoveryBootstrap = createDiscoveryBootstrap({
|
|
42
|
+
discovery,
|
|
43
|
+
hotReload,
|
|
44
|
+
onLoad: (stats) => {
|
|
45
|
+
logger.info({
|
|
46
|
+
http: stats.http,
|
|
47
|
+
rpc: stats.rpc,
|
|
48
|
+
streams: stats.streams,
|
|
49
|
+
channels: stats.channels,
|
|
50
|
+
rest: stats.rest,
|
|
51
|
+
resources: stats.resources,
|
|
52
|
+
tcp: stats.tcp,
|
|
53
|
+
udp: stats.udp,
|
|
54
|
+
duration: stats.duration,
|
|
55
|
+
}, `Discovered ${stats.total} handlers`);
|
|
56
|
+
},
|
|
57
|
+
onReload: async (result) => {
|
|
58
|
+
applyDiscoveryResult(result);
|
|
59
|
+
logger.info({ total: result.stats.total }, 'Handlers hot-reloaded');
|
|
60
|
+
},
|
|
61
|
+
onError: (err) => {
|
|
62
|
+
logger.error({ err }, 'Discovery loading error');
|
|
63
|
+
},
|
|
64
|
+
});
|
|
74
65
|
// Protocol configuration (from options)
|
|
75
|
-
const
|
|
66
|
+
const frontDoorEnabled = frontDoor?.enabled === true;
|
|
67
|
+
const frontDoorHost = frontDoor?.host ?? host;
|
|
68
|
+
const frontDoorPort = frontDoor?.port ?? port;
|
|
69
|
+
let singlePortConfigInput = singlePort;
|
|
70
|
+
let singlePortConfig = resolveSinglePortConfig(singlePortConfigInput);
|
|
71
|
+
const frontDoorAliasMode = frontDoor?.protocolAliasMode ?? serverProtocolAliasMode;
|
|
72
|
+
const effectiveHost = frontDoorEnabled ? frontDoorHost : host;
|
|
73
|
+
const effectivePort = frontDoorEnabled ? frontDoorPort : port;
|
|
74
|
+
const frontDoorProtocols = frontDoor?.protocols && frontDoor.protocols.length > 0
|
|
75
|
+
? Array.from(new Set(frontDoor.protocols.map((protocol) => normalizeFrontDoorProtocol(protocol, frontDoorAliasMode)).filter(Boolean)))
|
|
76
|
+
: null;
|
|
77
|
+
const getSinglePortAliasMode = () => {
|
|
78
|
+
return singlePortConfigInput?.protocolAliasMode ?? serverProtocolAliasMode;
|
|
79
|
+
};
|
|
80
|
+
const getSinglePortSource = () => {
|
|
81
|
+
return singlePortConfig.enabled ? 'singlePort' : 'native';
|
|
82
|
+
};
|
|
83
|
+
const updateSinglePortConfig = (next) => {
|
|
84
|
+
if (next === undefined)
|
|
85
|
+
return;
|
|
86
|
+
if (typeof next === 'boolean') {
|
|
87
|
+
singlePortConfigInput = {
|
|
88
|
+
...(singlePortConfigInput ?? {}),
|
|
89
|
+
enabled: next,
|
|
90
|
+
protocolFusion: next ? (singlePortConfigInput?.protocolFusion ?? true) : false,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
singlePortConfigInput = { ...(singlePortConfigInput ?? {}), ...next };
|
|
95
|
+
}
|
|
96
|
+
singlePortConfig = resolveSinglePortConfig(singlePortConfigInput);
|
|
97
|
+
};
|
|
98
|
+
const shouldUseFrontDoor = (name) => {
|
|
99
|
+
if (!frontDoorEnabled)
|
|
100
|
+
return false;
|
|
101
|
+
if (!frontDoorProtocols) {
|
|
102
|
+
return ['websocket', 'jsonrpc', 'graphql'].includes(name);
|
|
103
|
+
}
|
|
104
|
+
return frontDoorProtocols.includes(name);
|
|
105
|
+
};
|
|
106
|
+
const strategyFor = (name, fallback) => {
|
|
107
|
+
const strategy = frontDoor?.strategy?.[name];
|
|
108
|
+
return strategy ?? fallback;
|
|
109
|
+
};
|
|
110
|
+
const protocols = buildProtocolConfig({
|
|
111
|
+
websocket,
|
|
112
|
+
jsonrpc,
|
|
113
|
+
tcp,
|
|
114
|
+
graphql,
|
|
115
|
+
grpc,
|
|
116
|
+
frontDoor,
|
|
117
|
+
singlePort,
|
|
118
|
+
protocolAliasMode: frontDoorAliasMode,
|
|
119
|
+
});
|
|
120
|
+
const frontDoorBootstrap = createFrontDoorBootstrap({
|
|
121
|
+
frontDoorEnabled,
|
|
122
|
+
frontDoorProtocols,
|
|
123
|
+
protocols,
|
|
124
|
+
basePath,
|
|
125
|
+
effectiveHost,
|
|
126
|
+
effectivePort,
|
|
127
|
+
});
|
|
76
128
|
// Global interceptors (from options + added via .use())
|
|
77
129
|
const globalInterceptors = middleware ? [...middleware] : [];
|
|
130
|
+
const envelopeInterceptor = createEnvelopeInterceptorFromOptions(envelope);
|
|
131
|
+
if (envelopeInterceptor) {
|
|
132
|
+
globalInterceptors.push(envelopeInterceptor);
|
|
133
|
+
}
|
|
134
|
+
function createEnvelopeInterceptorFromOptions(config) {
|
|
135
|
+
if (config === undefined || config === false) {
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
if (config === true) {
|
|
139
|
+
return createStandardEnvelopeInterceptor();
|
|
140
|
+
}
|
|
141
|
+
return createEnvelopeInterceptor(config);
|
|
142
|
+
}
|
|
143
|
+
function normalizeInterceptors(interceptors, schema) {
|
|
144
|
+
return normalizeInterceptorsShared(interceptors, {
|
|
145
|
+
envelopeInterceptor,
|
|
146
|
+
schema,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
const serverConfigPreviewContext = {
|
|
150
|
+
effectiveHost,
|
|
151
|
+
effectivePort,
|
|
152
|
+
frontDoorEnabled,
|
|
153
|
+
frontDoorHost,
|
|
154
|
+
frontDoorPort,
|
|
155
|
+
frontDoorProtocols,
|
|
156
|
+
protocolAliasMode: frontDoorAliasMode,
|
|
157
|
+
getSinglePortConfig: () => ({
|
|
158
|
+
enabled: singlePortConfig.enabled,
|
|
159
|
+
protocolFusion: singlePortConfig.protocolFusion,
|
|
160
|
+
sniffTimeoutMs: singlePortConfig.sniffTimeoutMs,
|
|
161
|
+
sniffMaxBytes: singlePortConfig.sniffMaxBytes,
|
|
162
|
+
maxConcurrentDetections: singlePortConfig.maxConcurrentDetections,
|
|
163
|
+
protocols: singlePortConfig.protocols,
|
|
164
|
+
alpn: singlePortConfig.alpn,
|
|
165
|
+
}),
|
|
166
|
+
getSinglePortAliasMode,
|
|
167
|
+
getSinglePortSource,
|
|
168
|
+
protocols,
|
|
169
|
+
};
|
|
170
|
+
function emitConfiguredWarnings() {
|
|
171
|
+
emitConfigWarnings(serverConfigPreviewContext, logger);
|
|
172
|
+
}
|
|
173
|
+
function getPreviewConfig() {
|
|
174
|
+
return buildServerConfigPreview(serverConfigPreviewContext);
|
|
175
|
+
}
|
|
176
|
+
function logSinglePortConfiguration() {
|
|
177
|
+
logSinglePortConfig(serverConfigPreviewContext, logger);
|
|
178
|
+
}
|
|
78
179
|
// Namespace-level interceptors (for shared middleware per protocol)
|
|
79
180
|
// These are persistent across getter calls, enabling shared middleware chains
|
|
80
181
|
const httpInterceptors = [];
|
|
@@ -88,32 +189,29 @@ export function createServer(options) {
|
|
|
88
189
|
let wsUnsubscribeHandler = null;
|
|
89
190
|
// Global hooks configuration (added via .hooks())
|
|
90
191
|
let globalHooks = {};
|
|
91
|
-
//
|
|
92
|
-
const
|
|
93
|
-
//
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
192
|
+
// Hooks resolver that closes over globalHooks (mutable by .hooks())
|
|
193
|
+
const hooksResolver = (name) => resolveHooksForProcedure(name, globalHooks);
|
|
194
|
+
// Runtime state shared with lifecycle module
|
|
195
|
+
const serverState = {
|
|
196
|
+
running: { value: false },
|
|
197
|
+
addresses: { value: null },
|
|
198
|
+
providerMiddlewareInstalled: { value: false },
|
|
199
|
+
portBinding: { value: null },
|
|
200
|
+
singlePortTcpConnectionHandler: { value: null },
|
|
201
|
+
httpServer: { value: null },
|
|
202
|
+
wsAdapter: { value: null },
|
|
203
|
+
jsonRpcAdapter: { value: null },
|
|
204
|
+
tcpAdapter: { value: null },
|
|
205
|
+
grpcAdapter: { value: null },
|
|
206
|
+
graphqlAdapter: { value: null },
|
|
207
|
+
graphqlMiddleware: { value: null },
|
|
208
|
+
graphqlSubscriptionServer: { value: null },
|
|
209
|
+
usdDocsHandlers: { value: null },
|
|
210
|
+
};
|
|
102
211
|
const protocolExtensionConfigs = [];
|
|
103
212
|
const protocolAdapters = new Map();
|
|
104
|
-
// Metrics
|
|
105
|
-
let metricsConfig = null;
|
|
106
|
-
let metricsRegistry = null;
|
|
107
|
-
let processMetricsCleanup = null;
|
|
108
|
-
// Tracing
|
|
109
|
-
let tracingConfig = null;
|
|
110
|
-
let tracerInstance = null;
|
|
111
213
|
// USD Documentation
|
|
112
214
|
let usdDocsConfig = null;
|
|
113
|
-
let usdDocsHandlers = null;
|
|
114
|
-
// State
|
|
115
|
-
let running = false;
|
|
116
|
-
let addresses = null;
|
|
117
215
|
// Provider definitions (added via .provide() or options.providers)
|
|
118
216
|
const providerDefinitions = new Map();
|
|
119
217
|
const resolvedProviders = {};
|
|
@@ -210,6 +308,52 @@ export function createServer(options) {
|
|
|
210
308
|
registerUdpHandler(handler);
|
|
211
309
|
}
|
|
212
310
|
}
|
|
311
|
+
const createFrontDoorDecisionMiddleware = () => frontDoorBootstrap.createDecisionMiddleware({
|
|
312
|
+
info: logger.info.bind(logger),
|
|
313
|
+
debug: logger.debug.bind(logger),
|
|
314
|
+
warn: logger.warn.bind(logger),
|
|
315
|
+
});
|
|
316
|
+
const isSinglePortTcpRouteEnabled = () => detectSinglePortTcpRouteEnabled(singlePortConfig.enabled, protocols.tcp?.enabled ?? false, protocols.tcp?.options.port, protocols.tcp?.options.host, effectiveHost, effectivePort);
|
|
317
|
+
const isSinglePortUdpRouteEnabled = (handler) => detectSinglePortUdpRouteEnabled(singlePortConfig.enabled, handler.config.port, handler.config.host, effectiveHost, effectivePort);
|
|
318
|
+
const serverLifecycle = createServerLifecycle({
|
|
319
|
+
logger,
|
|
320
|
+
state: serverState,
|
|
321
|
+
discoveryBootstrap,
|
|
322
|
+
telemetryState,
|
|
323
|
+
protocolExtensionConfigs,
|
|
324
|
+
protocolAdapters,
|
|
325
|
+
providerDefinitions,
|
|
326
|
+
resolvedProviders,
|
|
327
|
+
frontDoorEnabled,
|
|
328
|
+
frontDoorProtocols,
|
|
329
|
+
protocols,
|
|
330
|
+
registry,
|
|
331
|
+
schemaRegistry,
|
|
332
|
+
router,
|
|
333
|
+
globalInterceptors,
|
|
334
|
+
channelRegistry,
|
|
335
|
+
restResourceRegistry,
|
|
336
|
+
tcpHandlers,
|
|
337
|
+
udpHandlers,
|
|
338
|
+
tcpServers,
|
|
339
|
+
udpServers,
|
|
340
|
+
singlePortConfig,
|
|
341
|
+
isSinglePortTcpRouteEnabled,
|
|
342
|
+
isSinglePortUdpRouteEnabled,
|
|
343
|
+
getSinglePortSource,
|
|
344
|
+
getSinglePortAliasMode,
|
|
345
|
+
createFrontDoorDecisionMiddleware,
|
|
346
|
+
applyDiscoveryResult,
|
|
347
|
+
logSinglePortConfig: logSinglePortConfiguration,
|
|
348
|
+
host,
|
|
349
|
+
effectiveHost,
|
|
350
|
+
effectivePort,
|
|
351
|
+
basePath,
|
|
352
|
+
cors,
|
|
353
|
+
httpOptions,
|
|
354
|
+
wsMessageHandler,
|
|
355
|
+
usdDocsConfig,
|
|
356
|
+
});
|
|
213
357
|
/**
|
|
214
358
|
* Register an HTTP route (Hono-style).
|
|
215
359
|
* Creates a procedure with the method and path as name (e.g., `get:/users/:id`).
|
|
@@ -228,7 +372,7 @@ export function createServer(options) {
|
|
|
228
372
|
// Generate procedure name from method and path (e.g., "get:/users/:id")
|
|
229
373
|
const name = `${method.toLowerCase()}:${path}`;
|
|
230
374
|
// Build interceptors: global → namespace → route-specific
|
|
231
|
-
const interceptors = [...globalInterceptors, ...httpInterceptors, ...(options.use ?? [])];
|
|
375
|
+
const interceptors = normalizeInterceptors([...globalInterceptors, ...httpInterceptors, ...(options.use ?? [])]);
|
|
232
376
|
// Register schema if provided
|
|
233
377
|
if (options.input || options.output) {
|
|
234
378
|
const schema = {};
|
|
@@ -237,7 +381,9 @@ export function createServer(options) {
|
|
|
237
381
|
if (options.output)
|
|
238
382
|
schema.output = options.output;
|
|
239
383
|
schemaRegistry.register(name, schema);
|
|
240
|
-
interceptors
|
|
384
|
+
const normalizedWithSchema = normalizeInterceptors([...interceptors], schema);
|
|
385
|
+
interceptors.length = 0;
|
|
386
|
+
interceptors.push(...normalizedWithSchema);
|
|
241
387
|
}
|
|
242
388
|
// Register as a procedure with HTTP metadata
|
|
243
389
|
registry.procedure(name, handler, {
|
|
@@ -254,107 +400,244 @@ export function createServer(options) {
|
|
|
254
400
|
const server = {
|
|
255
401
|
// === Protocol Configuration ===
|
|
256
402
|
enableWebSocket(path = '/') {
|
|
403
|
+
const useFrontDoor = shouldUseFrontDoor('websocket');
|
|
257
404
|
protocols.websocket = {
|
|
258
405
|
enabled: true,
|
|
259
406
|
options: { path },
|
|
260
407
|
shared: true,
|
|
408
|
+
frontDoor: useFrontDoor,
|
|
409
|
+
strategy: useFrontDoor ? strategyFor('websocket', 'shared') : strategyFor('websocket', 'native'),
|
|
261
410
|
};
|
|
262
411
|
return server;
|
|
263
412
|
},
|
|
264
413
|
websocket(opts) {
|
|
414
|
+
const useFrontDoor = shouldUseFrontDoor('websocket');
|
|
415
|
+
const requestedShared = opts.port === undefined;
|
|
416
|
+
const shared = useFrontDoor || requestedShared;
|
|
265
417
|
protocols.websocket = {
|
|
266
418
|
enabled: true,
|
|
267
419
|
options: opts,
|
|
268
|
-
shared
|
|
420
|
+
shared,
|
|
421
|
+
frontDoor: useFrontDoor,
|
|
422
|
+
strategy: useFrontDoor ? strategyFor('websocket', 'shared') : strategyFor('websocket', 'native'),
|
|
269
423
|
};
|
|
270
424
|
return server;
|
|
271
425
|
},
|
|
272
426
|
enableJsonRpc(path = '/rpc') {
|
|
427
|
+
const useFrontDoor = shouldUseFrontDoor('jsonrpc');
|
|
273
428
|
protocols.jsonrpc = {
|
|
274
429
|
enabled: true,
|
|
275
430
|
options: { path },
|
|
276
431
|
shared: true,
|
|
432
|
+
frontDoor: useFrontDoor,
|
|
433
|
+
strategy: useFrontDoor ? strategyFor('jsonrpc', 'shared') : strategyFor('jsonrpc', 'native'),
|
|
277
434
|
};
|
|
278
435
|
return server;
|
|
279
436
|
},
|
|
280
437
|
jsonrpc(opts) {
|
|
438
|
+
const useFrontDoor = shouldUseFrontDoor('jsonrpc');
|
|
439
|
+
const requestedShared = opts.port === undefined;
|
|
440
|
+
const shared = useFrontDoor || requestedShared;
|
|
281
441
|
protocols.jsonrpc = {
|
|
282
442
|
enabled: true,
|
|
283
443
|
options: opts,
|
|
284
|
-
shared
|
|
444
|
+
shared,
|
|
445
|
+
frontDoor: useFrontDoor,
|
|
446
|
+
strategy: useFrontDoor ? strategyFor('jsonrpc', 'shared') : strategyFor('jsonrpc', 'native'),
|
|
285
447
|
};
|
|
286
448
|
return server;
|
|
287
449
|
},
|
|
288
450
|
tcp(opts) {
|
|
451
|
+
const useFrontDoor = shouldUseFrontDoor('tcp');
|
|
289
452
|
protocols.tcp = {
|
|
290
453
|
enabled: true,
|
|
291
454
|
options: opts,
|
|
455
|
+
frontDoor: useFrontDoor,
|
|
456
|
+
strategy: useFrontDoor ? strategyFor('tcp', 'offload') : strategyFor('tcp', 'native'),
|
|
292
457
|
};
|
|
293
458
|
return server;
|
|
294
459
|
},
|
|
295
460
|
grpc(opts) {
|
|
461
|
+
const useFrontDoor = shouldUseFrontDoor('grpc');
|
|
296
462
|
protocols.grpc = {
|
|
297
463
|
enabled: true,
|
|
298
464
|
options: opts,
|
|
465
|
+
frontDoor: useFrontDoor,
|
|
466
|
+
strategy: useFrontDoor ? strategyFor('grpc', 'offload') : strategyFor('grpc', 'native'),
|
|
299
467
|
};
|
|
300
468
|
return server;
|
|
301
469
|
},
|
|
302
470
|
protocols(config) {
|
|
471
|
+
server.withProtocols({
|
|
472
|
+
websocket: config.websocket,
|
|
473
|
+
jsonrpc: config.jsonrpc,
|
|
474
|
+
streams: config.streams,
|
|
475
|
+
graphql: config.graphql,
|
|
476
|
+
tcp: config.tcp,
|
|
477
|
+
grpc: config.grpc,
|
|
478
|
+
});
|
|
479
|
+
return server;
|
|
480
|
+
},
|
|
481
|
+
withProtocols(config) {
|
|
482
|
+
const hasOwnFields = (value) => {
|
|
483
|
+
for (const key in value) {
|
|
484
|
+
if (Object.prototype.hasOwnProperty.call(value, key)) {
|
|
485
|
+
return true;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
return false;
|
|
489
|
+
};
|
|
490
|
+
// Helper to check if a slot has enabled: false
|
|
491
|
+
function isDisabled(value) {
|
|
492
|
+
if (value === false)
|
|
493
|
+
return true;
|
|
494
|
+
if (typeof value === 'object' && value !== null && 'enabled' in value) {
|
|
495
|
+
return value.enabled === false;
|
|
496
|
+
}
|
|
497
|
+
return false;
|
|
498
|
+
}
|
|
303
499
|
// WebSocket
|
|
304
|
-
if (config.websocket !== undefined && config.websocket
|
|
305
|
-
|
|
500
|
+
if (config.websocket !== undefined && !isDisabled(config.websocket)) {
|
|
501
|
+
const ws = config.websocket;
|
|
502
|
+
if (ws === true) {
|
|
306
503
|
server.enableWebSocket('/ws');
|
|
307
504
|
}
|
|
308
|
-
else if (typeof
|
|
309
|
-
server.enableWebSocket(
|
|
505
|
+
else if (typeof ws === 'string') {
|
|
506
|
+
server.enableWebSocket(ws);
|
|
507
|
+
}
|
|
508
|
+
else if (typeof ws === 'object' && 'enabled' in ws) {
|
|
509
|
+
const { enabled: _enabled, ...rest } = ws;
|
|
510
|
+
if (hasOwnFields(rest)) {
|
|
511
|
+
server.websocket(rest);
|
|
512
|
+
}
|
|
513
|
+
else {
|
|
514
|
+
server.enableWebSocket('/ws');
|
|
515
|
+
}
|
|
310
516
|
}
|
|
311
517
|
else {
|
|
312
|
-
server.websocket(
|
|
518
|
+
server.websocket(ws);
|
|
313
519
|
}
|
|
314
520
|
}
|
|
315
521
|
// JSON-RPC
|
|
316
|
-
if (config.jsonrpc !== undefined && config.jsonrpc
|
|
317
|
-
|
|
522
|
+
if (config.jsonrpc !== undefined && !isDisabled(config.jsonrpc)) {
|
|
523
|
+
const jrpc = config.jsonrpc;
|
|
524
|
+
if (jrpc === true) {
|
|
318
525
|
server.enableJsonRpc('/rpc');
|
|
319
526
|
}
|
|
320
|
-
else if (typeof
|
|
321
|
-
server.enableJsonRpc(
|
|
527
|
+
else if (typeof jrpc === 'string') {
|
|
528
|
+
server.enableJsonRpc(jrpc);
|
|
529
|
+
}
|
|
530
|
+
else if (typeof jrpc === 'object' && 'enabled' in jrpc) {
|
|
531
|
+
const { enabled: _enabled, ...rest } = jrpc;
|
|
532
|
+
server.enableJsonRpc(rest.path ?? '/rpc');
|
|
322
533
|
}
|
|
323
534
|
else {
|
|
324
|
-
server.jsonrpc(
|
|
535
|
+
server.jsonrpc(jrpc);
|
|
325
536
|
}
|
|
326
537
|
}
|
|
327
|
-
// Streams
|
|
538
|
+
// Streams
|
|
328
539
|
if (config.streams !== undefined && config.streams !== false) {
|
|
329
|
-
// Streams are enabled automatically when stream handlers are registered
|
|
330
|
-
// This is a marker for documentation and configuration
|
|
331
540
|
logger.debug({ streams: config.streams }, 'Streams protocol enabled');
|
|
332
541
|
}
|
|
333
542
|
// GraphQL
|
|
334
|
-
if (config.graphql !== undefined && config.graphql
|
|
335
|
-
|
|
543
|
+
if (config.graphql !== undefined && !isDisabled(config.graphql)) {
|
|
544
|
+
const gql = config.graphql;
|
|
545
|
+
if (gql === true) {
|
|
336
546
|
server.enableGraphQL('/graphql');
|
|
337
547
|
}
|
|
338
|
-
else if (typeof
|
|
339
|
-
server.enableGraphQL(
|
|
548
|
+
else if (typeof gql === 'string') {
|
|
549
|
+
server.enableGraphQL(gql);
|
|
550
|
+
}
|
|
551
|
+
else if (typeof gql === 'object' && 'enabled' in gql) {
|
|
552
|
+
const { enabled: _enabled, ...rest } = gql;
|
|
553
|
+
if (hasOwnFields(rest)) {
|
|
554
|
+
server.configureGraphQL(rest);
|
|
555
|
+
}
|
|
556
|
+
else {
|
|
557
|
+
server.enableGraphQL('/graphql');
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
else {
|
|
561
|
+
server.configureGraphQL(gql);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
// TCP
|
|
565
|
+
if (config.tcp !== undefined && !isDisabled(config.tcp)) {
|
|
566
|
+
const tcpCfg = config.tcp;
|
|
567
|
+
if (typeof tcpCfg === 'object' && 'enabled' in tcpCfg) {
|
|
568
|
+
const { enabled: _enabled, ...rest } = tcpCfg;
|
|
569
|
+
if (rest.port !== undefined) {
|
|
570
|
+
server.tcp(rest);
|
|
571
|
+
}
|
|
340
572
|
}
|
|
341
573
|
else {
|
|
342
|
-
server.
|
|
574
|
+
server.tcp(tcpCfg);
|
|
343
575
|
}
|
|
344
576
|
}
|
|
345
|
-
//
|
|
346
|
-
if (config.
|
|
347
|
-
|
|
577
|
+
// UDP (test-scope marker only — no production adapter)
|
|
578
|
+
if (config.udp !== undefined && !isDisabled(config.udp)) {
|
|
579
|
+
logger.debug('UDP protocol noted (test-scope only; no production adapter registered)');
|
|
348
580
|
}
|
|
349
|
-
// gRPC
|
|
350
|
-
if (config.grpc) {
|
|
351
|
-
|
|
581
|
+
// gRPC
|
|
582
|
+
if (config.grpc !== undefined && !isDisabled(config.grpc)) {
|
|
583
|
+
const grpcCfg = config.grpc;
|
|
584
|
+
if (typeof grpcCfg === 'object' && 'enabled' in grpcCfg) {
|
|
585
|
+
const { enabled: _enabled, ...rest } = grpcCfg;
|
|
586
|
+
if (rest.port !== undefined && rest.protoPath !== undefined) {
|
|
587
|
+
server.grpc(rest);
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
else {
|
|
591
|
+
server.grpc(grpcCfg);
|
|
592
|
+
}
|
|
352
593
|
}
|
|
353
|
-
|
|
594
|
+
emitConfiguredWarnings();
|
|
595
|
+
return server;
|
|
596
|
+
},
|
|
597
|
+
withProfile(profile, overrides) {
|
|
598
|
+
if (profile === 'local') {
|
|
599
|
+
updateSinglePortConfig({ protocolAliasMode: 'extended' });
|
|
600
|
+
}
|
|
601
|
+
else if (profile === 'staging') {
|
|
602
|
+
updateSinglePortConfig({ protocolAliasMode: 'standard' });
|
|
603
|
+
}
|
|
604
|
+
else if (profile === 'production') {
|
|
605
|
+
updateSinglePortConfig({ protocolAliasMode: 'standard' });
|
|
606
|
+
if (hotReload) {
|
|
607
|
+
logger.warn('hotReload is enabled but profile is "production". Pass hotReload: false to createServer() for production.');
|
|
608
|
+
}
|
|
609
|
+
if (serverProtocolAliasMode === 'extended') {
|
|
610
|
+
logger.warn('protocolAliasMode "extended" was passed to createServer() but profile is "production". Use "standard" in production.');
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
if (overrides?.protocols) {
|
|
614
|
+
server.withProtocols(overrides.protocols);
|
|
615
|
+
}
|
|
616
|
+
return server;
|
|
617
|
+
},
|
|
618
|
+
withPreset(preset, options = {}) {
|
|
619
|
+
const websocketPath = options.websocketPath ?? '/ws';
|
|
620
|
+
const jsonrpcPath = options.jsonrpcPath ?? '/rpc';
|
|
621
|
+
const graphqlPath = options.graphqlPath ?? '/graphql';
|
|
622
|
+
if (preset === 'realtime') {
|
|
623
|
+
server.enableWebSocket(websocketPath);
|
|
624
|
+
}
|
|
625
|
+
else if (preset === 'rpc') {
|
|
626
|
+
server.enableJsonRpc(jsonrpcPath);
|
|
627
|
+
}
|
|
628
|
+
else if (preset === 'api' || preset === 'dev' || preset === 'full') {
|
|
629
|
+
server.enableWebSocket(websocketPath);
|
|
630
|
+
server.enableJsonRpc(jsonrpcPath);
|
|
631
|
+
server.enableGraphQL(graphqlPath);
|
|
632
|
+
}
|
|
633
|
+
return server;
|
|
634
|
+
},
|
|
635
|
+
enableSinglePort(config = true) {
|
|
636
|
+
updateSinglePortConfig(config);
|
|
354
637
|
return server;
|
|
355
638
|
},
|
|
356
639
|
registerProtocol(name, factory, options) {
|
|
357
|
-
if (running) {
|
|
640
|
+
if (serverState.running.value) {
|
|
358
641
|
throw new Error('Cannot register protocol adapter after the server has started');
|
|
359
642
|
}
|
|
360
643
|
registerProtocolExtension({
|
|
@@ -365,51 +648,37 @@ export function createServer(options) {
|
|
|
365
648
|
return server;
|
|
366
649
|
},
|
|
367
650
|
enableGraphQL(path = '/graphql') {
|
|
651
|
+
const useFrontDoor = shouldUseFrontDoor('graphql');
|
|
368
652
|
protocols.graphql = {
|
|
369
653
|
enabled: true,
|
|
370
654
|
options: { path },
|
|
371
655
|
shared: true,
|
|
656
|
+
frontDoor: useFrontDoor,
|
|
657
|
+
strategy: useFrontDoor ? strategyFor('graphql', 'shared') : strategyFor('graphql', 'native'),
|
|
372
658
|
};
|
|
373
659
|
return server;
|
|
374
660
|
},
|
|
375
661
|
configureGraphQL(opts) {
|
|
662
|
+
const useFrontDoor = shouldUseFrontDoor('graphql');
|
|
663
|
+
const requestedShared = opts.port === undefined;
|
|
664
|
+
const shared = useFrontDoor || requestedShared;
|
|
376
665
|
protocols.graphql = {
|
|
377
666
|
enabled: true,
|
|
378
667
|
options: opts,
|
|
379
|
-
shared
|
|
668
|
+
shared,
|
|
669
|
+
frontDoor: useFrontDoor,
|
|
670
|
+
strategy: useFrontDoor ? strategyFor('graphql', 'shared') : strategyFor('graphql', 'native'),
|
|
380
671
|
};
|
|
381
672
|
return server;
|
|
382
673
|
},
|
|
383
674
|
// === Metrics ===
|
|
384
675
|
enableMetrics(config = {}) {
|
|
385
|
-
|
|
386
|
-
enabled: config.enabled ?? true,
|
|
387
|
-
endpoint: config.endpoint ?? '/metrics',
|
|
388
|
-
defaultLabels: config.defaultLabels,
|
|
389
|
-
collectRequestMetrics: config.collectRequestMetrics ?? true,
|
|
390
|
-
collectProcessMetrics: config.collectProcessMetrics ?? false,
|
|
391
|
-
};
|
|
392
|
-
// Create registry immediately so it's available for custom metrics
|
|
393
|
-
metricsRegistry = createMetricRegistry();
|
|
394
|
-
if (metricsConfig.defaultLabels) {
|
|
395
|
-
metricsRegistry.setDefaultLabels(metricsConfig.defaultLabels);
|
|
396
|
-
}
|
|
676
|
+
configureMetrics(telemetryState, config);
|
|
397
677
|
return server;
|
|
398
678
|
},
|
|
399
679
|
// === Tracing ===
|
|
400
680
|
enableTracing(config = {}) {
|
|
401
|
-
|
|
402
|
-
enabled: config.enabled ?? true,
|
|
403
|
-
serviceName: config.serviceName ?? 'raffel',
|
|
404
|
-
sampleRate: config.sampleRate ?? 1.0,
|
|
405
|
-
rateLimit: config.rateLimit ?? 0,
|
|
406
|
-
exporters: config.exporters ?? [],
|
|
407
|
-
batchSize: config.batchSize ?? 100,
|
|
408
|
-
batchTimeout: config.batchTimeout ?? 5000,
|
|
409
|
-
defaultAttributes: config.defaultAttributes ?? {},
|
|
410
|
-
};
|
|
411
|
-
// Create tracer immediately so it's available
|
|
412
|
-
tracerInstance = createTracer(tracingConfig);
|
|
681
|
+
configureTracing(telemetryState, config);
|
|
413
682
|
return server;
|
|
414
683
|
},
|
|
415
684
|
// === USD Documentation ===
|
|
@@ -422,8 +691,11 @@ export function createServer(options) {
|
|
|
422
691
|
securitySchemes: config.securitySchemes,
|
|
423
692
|
defaultSecurity: config.defaultSecurity,
|
|
424
693
|
tags: config.tags,
|
|
694
|
+
contentTypes: config.contentTypes,
|
|
695
|
+
tagGroups: config.tagGroups,
|
|
425
696
|
externalDocs: config.externalDocs,
|
|
426
697
|
ui: config.ui,
|
|
698
|
+
documentation: config.documentation,
|
|
427
699
|
includeErrorSchemas: config.includeErrorSchemas,
|
|
428
700
|
includeStreamEventSchemas: config.includeStreamEventSchemas,
|
|
429
701
|
jsonrpc: config.jsonrpc,
|
|
@@ -472,7 +744,7 @@ export function createServer(options) {
|
|
|
472
744
|
return;
|
|
473
745
|
}
|
|
474
746
|
// Fluent builder with hooks resolver
|
|
475
|
-
return createProcedureBuilder(registry, schemaRegistry, nameOrHandler, [...globalInterceptors],
|
|
747
|
+
return createProcedureBuilder(registry, schemaRegistry, nameOrHandler, [...globalInterceptors], hooksResolver, envelopeInterceptor);
|
|
476
748
|
},
|
|
477
749
|
stream(name) {
|
|
478
750
|
return createStreamBuilder(registry, schemaRegistry, name, [...globalInterceptors]);
|
|
@@ -534,7 +806,7 @@ export function createServer(options) {
|
|
|
534
806
|
}
|
|
535
807
|
}
|
|
536
808
|
// Build interceptors
|
|
537
|
-
|
|
809
|
+
let interceptors = normalizeInterceptors([...globalInterceptors, ...(def.use ?? [])]);
|
|
538
810
|
// Register schema
|
|
539
811
|
if (def.input || def.output) {
|
|
540
812
|
const schema = {};
|
|
@@ -543,7 +815,7 @@ export function createServer(options) {
|
|
|
543
815
|
if (def.output)
|
|
544
816
|
schema.output = def.output;
|
|
545
817
|
schemaRegistry.register(name, schema);
|
|
546
|
-
interceptors
|
|
818
|
+
interceptors = normalizeInterceptors(interceptors, schema);
|
|
547
819
|
}
|
|
548
820
|
registry.procedure(name, def.handler, {
|
|
549
821
|
summary: def.summary,
|
|
@@ -565,7 +837,7 @@ export function createServer(options) {
|
|
|
565
837
|
// Helper to register an operation
|
|
566
838
|
const registerOp = (opName, handler, method, path, inputSchema) => {
|
|
567
839
|
const procedureName = `${name}.${opName}`;
|
|
568
|
-
|
|
840
|
+
let interceptors = [...baseInterceptors];
|
|
569
841
|
if (inputSchema || def.schema) {
|
|
570
842
|
const schema = {};
|
|
571
843
|
if (inputSchema)
|
|
@@ -574,9 +846,12 @@ export function createServer(options) {
|
|
|
574
846
|
schema.output = def.schema;
|
|
575
847
|
schemaRegistry.register(procedureName, schema);
|
|
576
848
|
if (inputSchema) {
|
|
577
|
-
interceptors
|
|
849
|
+
interceptors = normalizeInterceptors(interceptors, { input: inputSchema });
|
|
578
850
|
}
|
|
579
851
|
}
|
|
852
|
+
else {
|
|
853
|
+
interceptors = normalizeInterceptors(interceptors);
|
|
854
|
+
}
|
|
580
855
|
registry.procedure(procedureName, handler, {
|
|
581
856
|
tags,
|
|
582
857
|
httpPath: path,
|
|
@@ -655,22 +930,15 @@ export function createServer(options) {
|
|
|
655
930
|
},
|
|
656
931
|
// === Grouping ===
|
|
657
932
|
group(prefix) {
|
|
658
|
-
return createGroupBuilder(registry, schemaRegistry, prefix, [...globalInterceptors],
|
|
933
|
+
return createGroupBuilder(registry, schemaRegistry, prefix, [...globalInterceptors], hooksResolver, envelopeInterceptor);
|
|
659
934
|
},
|
|
660
935
|
mount(prefix, module, options = {}) {
|
|
661
936
|
const definition = getRouterModuleDefinition(module);
|
|
662
937
|
const mountInterceptors = options.interceptors ?? [];
|
|
663
938
|
for (const route of definition.routes) {
|
|
664
939
|
const fullName = joinHandlerName(prefix, route.name);
|
|
665
|
-
const
|
|
666
|
-
|
|
667
|
-
? [createValidationInterceptor(route.schema)]
|
|
668
|
-
: []),
|
|
669
|
-
...globalInterceptors,
|
|
670
|
-
...mountInterceptors,
|
|
671
|
-
...route.moduleInterceptors,
|
|
672
|
-
...route.interceptors,
|
|
673
|
-
];
|
|
940
|
+
const routeSchema = route.kind === 'procedure' ? route.schema : undefined;
|
|
941
|
+
const interceptors = normalizeInterceptors([...globalInterceptors, ...mountInterceptors, ...route.moduleInterceptors, ...route.interceptors], routeSchema);
|
|
674
942
|
if (route.schema) {
|
|
675
943
|
schemaRegistry.register(fullName, route.schema);
|
|
676
944
|
}
|
|
@@ -723,7 +991,7 @@ export function createServer(options) {
|
|
|
723
991
|
const grpc = 'meta' in input ? input.meta?.grpc : input.grpc;
|
|
724
992
|
const routeInterceptors = 'middlewares' in input ? createRouteInterceptors(input) : [];
|
|
725
993
|
const inputInterceptors = 'interceptors' in input ? input.interceptors ?? [] : [];
|
|
726
|
-
|
|
994
|
+
let interceptors = normalizeInterceptors([...globalInterceptors, ...routeInterceptors, ...inputInterceptors]);
|
|
727
995
|
// Register schema if defined
|
|
728
996
|
if (inputSchema || outputSchema) {
|
|
729
997
|
const schema = {};
|
|
@@ -732,7 +1000,7 @@ export function createServer(options) {
|
|
|
732
1000
|
if (outputSchema)
|
|
733
1001
|
schema.output = outputSchema;
|
|
734
1002
|
schemaRegistry.register(name, schema);
|
|
735
|
-
interceptors
|
|
1003
|
+
interceptors = normalizeInterceptors(interceptors, schema);
|
|
736
1004
|
}
|
|
737
1005
|
registry.procedure(name, handler, {
|
|
738
1006
|
summary,
|
|
@@ -833,443 +1101,10 @@ export function createServer(options) {
|
|
|
833
1101
|
},
|
|
834
1102
|
// === Lifecycle ===
|
|
835
1103
|
async start() {
|
|
836
|
-
|
|
837
|
-
throw new Error('Server is already running');
|
|
838
|
-
}
|
|
839
|
-
// Initialize providers
|
|
840
|
-
if (providerDefinitions.size > 0) {
|
|
841
|
-
logger.debug({ count: providerDefinitions.size }, 'Initializing providers');
|
|
842
|
-
for (const [name, definition] of providerDefinitions) {
|
|
843
|
-
try {
|
|
844
|
-
const instance = await definition.factory();
|
|
845
|
-
resolvedProviders[name] = instance;
|
|
846
|
-
logger.debug({ name }, 'Provider initialized');
|
|
847
|
-
}
|
|
848
|
-
catch (err) {
|
|
849
|
-
logger.error({ err, name }, 'Failed to initialize provider');
|
|
850
|
-
throw err;
|
|
851
|
-
}
|
|
852
|
-
}
|
|
853
|
-
// Add interceptor to inject providers into context
|
|
854
|
-
globalInterceptors.unshift(async (_env, ctx, next) => {
|
|
855
|
-
// Inject all providers into context
|
|
856
|
-
const ctxAny = ctx;
|
|
857
|
-
for (const [name, instance] of Object.entries(resolvedProviders)) {
|
|
858
|
-
ctxAny[name] = instance;
|
|
859
|
-
}
|
|
860
|
-
return next();
|
|
861
|
-
});
|
|
862
|
-
}
|
|
863
|
-
// Initialize metrics if enabled
|
|
864
|
-
if (metricsConfig?.enabled && metricsRegistry) {
|
|
865
|
-
logger.debug({ endpoint: metricsConfig.endpoint }, 'Initializing metrics');
|
|
866
|
-
// Add request metrics interceptor
|
|
867
|
-
if (metricsConfig.collectRequestMetrics) {
|
|
868
|
-
globalInterceptors.unshift(createMetricsInterceptor(metricsRegistry));
|
|
869
|
-
}
|
|
870
|
-
// Start process metrics collection
|
|
871
|
-
if (metricsConfig.collectProcessMetrics) {
|
|
872
|
-
processMetricsCleanup = startProcessMetricsCollection(metricsRegistry);
|
|
873
|
-
}
|
|
874
|
-
// Register /metrics endpoint as a procedure
|
|
875
|
-
const metricsEndpointName = `__metrics__`;
|
|
876
|
-
registry.procedure(metricsEndpointName, async () => {
|
|
877
|
-
return metricsRegistry.export('prometheus');
|
|
878
|
-
});
|
|
879
|
-
logger.info({ endpoint: metricsConfig.endpoint }, 'Metrics enabled');
|
|
880
|
-
}
|
|
881
|
-
// Initialize tracing if enabled
|
|
882
|
-
if (tracingConfig?.enabled && tracerInstance) {
|
|
883
|
-
logger.debug({
|
|
884
|
-
serviceName: tracingConfig.serviceName,
|
|
885
|
-
sampleRate: tracingConfig.sampleRate,
|
|
886
|
-
}, 'Initializing tracing');
|
|
887
|
-
// Add tracing interceptor (should be first to capture full request duration)
|
|
888
|
-
globalInterceptors.unshift(createTracingInterceptor(tracerInstance));
|
|
889
|
-
logger.info({
|
|
890
|
-
serviceName: tracingConfig.serviceName,
|
|
891
|
-
sampleRate: tracingConfig.sampleRate,
|
|
892
|
-
exporters: tracingConfig.exporters?.length ?? 0,
|
|
893
|
-
}, 'Tracing enabled');
|
|
894
|
-
}
|
|
895
|
-
// Load file-system handlers first (before starting adapters)
|
|
896
|
-
if (discoveryWatcher) {
|
|
897
|
-
const result = await discoveryWatcher.start();
|
|
898
|
-
applyDiscoveryResult(result);
|
|
899
|
-
}
|
|
900
|
-
addresses = {
|
|
901
|
-
http: { host, port },
|
|
902
|
-
};
|
|
903
|
-
// Build HTTP middleware list
|
|
904
|
-
const httpMiddleware = [];
|
|
905
|
-
if (httpOptions?.middleware?.length) {
|
|
906
|
-
httpMiddleware.push(...httpOptions.middleware);
|
|
907
|
-
}
|
|
908
|
-
// Add USD Documentation handlers if enabled
|
|
909
|
-
if (usdDocsConfig) {
|
|
910
|
-
usdDocsHandlers = createUSDHandlers({
|
|
911
|
-
registry,
|
|
912
|
-
schemaRegistry,
|
|
913
|
-
channels: channelRegistry,
|
|
914
|
-
restResources: restResourceRegistry,
|
|
915
|
-
tcpHandlers,
|
|
916
|
-
udpHandlers,
|
|
917
|
-
protocolConfig: protocols,
|
|
918
|
-
}, {
|
|
919
|
-
basePath: usdDocsConfig.basePath ?? '/docs',
|
|
920
|
-
info: usdDocsConfig.info,
|
|
921
|
-
servers: usdDocsConfig.servers,
|
|
922
|
-
protocols: usdDocsConfig.protocols,
|
|
923
|
-
securitySchemes: usdDocsConfig.securitySchemes,
|
|
924
|
-
defaultSecurity: usdDocsConfig.defaultSecurity,
|
|
925
|
-
tags: usdDocsConfig.tags,
|
|
926
|
-
externalDocs: usdDocsConfig.externalDocs,
|
|
927
|
-
ui: usdDocsConfig.ui,
|
|
928
|
-
includeErrorSchemas: usdDocsConfig.includeErrorSchemas,
|
|
929
|
-
includeStreamEventSchemas: usdDocsConfig.includeStreamEventSchemas,
|
|
930
|
-
jsonrpc: usdDocsConfig.jsonrpc,
|
|
931
|
-
grpc: usdDocsConfig.grpc,
|
|
932
|
-
});
|
|
933
|
-
// Create Hono middleware for USD routes
|
|
934
|
-
const usdBasePath = usdDocsConfig.basePath ?? '/docs';
|
|
935
|
-
httpMiddleware.push(createDocsRouteMiddleware([
|
|
936
|
-
{ method: 'GET', path: usdBasePath, handler: usdDocsHandlers.serveUI },
|
|
937
|
-
{ method: 'GET', path: `${usdBasePath}/usd.json`, handler: usdDocsHandlers.serveUSD },
|
|
938
|
-
{ method: 'GET', path: `${usdBasePath}/usd.yaml`, handler: usdDocsHandlers.serveUSDYaml },
|
|
939
|
-
{ method: 'GET', path: `${usdBasePath}/openapi.json`, handler: usdDocsHandlers.serveOpenAPI },
|
|
940
|
-
]));
|
|
941
|
-
logger.info({ basePath: usdBasePath }, 'USD Documentation middleware registered');
|
|
942
|
-
}
|
|
943
|
-
httpMiddleware.push(createHttpOverrideMiddleware({
|
|
944
|
-
router,
|
|
945
|
-
registry,
|
|
946
|
-
basePath,
|
|
947
|
-
maxBodySize: httpOptions?.maxBodySize ?? 1024 * 1024,
|
|
948
|
-
contextFactory: httpOptions?.contextFactory,
|
|
949
|
-
codecs: httpOptions?.codecs,
|
|
950
|
-
}));
|
|
951
|
-
// Add REST middleware for proper HTTP verb routing
|
|
952
|
-
if (restResourceRegistry.length > 0) {
|
|
953
|
-
httpMiddleware.push(createRestMiddleware({
|
|
954
|
-
restResources: restResourceRegistry,
|
|
955
|
-
router,
|
|
956
|
-
basePath,
|
|
957
|
-
maxBodySize: httpOptions?.maxBodySize ?? 1024 * 1024,
|
|
958
|
-
contextFactory: httpOptions?.contextFactory,
|
|
959
|
-
codecs: httpOptions?.codecs,
|
|
960
|
-
}));
|
|
961
|
-
logRestMiddlewareRegistered(restResourceRegistry.length);
|
|
962
|
-
}
|
|
963
|
-
// Add JSON-RPC middleware when sharing the HTTP port
|
|
964
|
-
if (protocols.jsonrpc?.enabled && protocols.jsonrpc.shared) {
|
|
965
|
-
const rpcOpts = protocols.jsonrpc.options;
|
|
966
|
-
const rpcPath = rpcOpts.path || '/rpc';
|
|
967
|
-
const sharedRpcPath = joinBasePath(basePath, rpcPath);
|
|
968
|
-
httpMiddleware.push(createJsonRpcMiddleware(router, {
|
|
969
|
-
path: sharedRpcPath,
|
|
970
|
-
timeout: rpcOpts.timeout,
|
|
971
|
-
maxBodySize: rpcOpts.maxBodySize,
|
|
972
|
-
cors: false,
|
|
973
|
-
codecs: rpcOpts.codecs,
|
|
974
|
-
}));
|
|
975
|
-
}
|
|
976
|
-
// Add GraphQL middleware when sharing the HTTP port
|
|
977
|
-
if (protocols.graphql?.enabled && protocols.graphql.shared) {
|
|
978
|
-
const gqlOpts = protocols.graphql.options;
|
|
979
|
-
const gqlPath = gqlOpts.path || '/graphql';
|
|
980
|
-
const sharedGqlPath = joinBasePath(basePath, gqlPath);
|
|
981
|
-
const isDev = isDevelopment();
|
|
982
|
-
graphqlMiddleware = createGraphQLMiddleware({
|
|
983
|
-
router,
|
|
984
|
-
registry,
|
|
985
|
-
schemaRegistry,
|
|
986
|
-
config: {
|
|
987
|
-
...gqlOpts,
|
|
988
|
-
path: sharedGqlPath,
|
|
989
|
-
playground: gqlOpts.playground ?? isDev,
|
|
990
|
-
introspection: gqlOpts.introspection ?? isDev,
|
|
991
|
-
timeout: gqlOpts.timeout ?? 30000,
|
|
992
|
-
maxBodySize: gqlOpts.maxBodySize ?? 1024 * 1024,
|
|
993
|
-
},
|
|
994
|
-
});
|
|
995
|
-
httpMiddleware.push(graphqlMiddleware.middleware);
|
|
996
|
-
graphqlAdapter = {
|
|
997
|
-
async start() {
|
|
998
|
-
if (!httpServer?.server)
|
|
999
|
-
return;
|
|
1000
|
-
graphqlSubscriptionServer = graphqlMiddleware?.createSubscriptionServer(httpServer.server) ?? null;
|
|
1001
|
-
},
|
|
1002
|
-
async stop() {
|
|
1003
|
-
if (graphqlSubscriptionServer) {
|
|
1004
|
-
graphqlSubscriptionServer.close();
|
|
1005
|
-
graphqlSubscriptionServer = null;
|
|
1006
|
-
}
|
|
1007
|
-
},
|
|
1008
|
-
get schema() {
|
|
1009
|
-
return graphqlMiddleware.schema;
|
|
1010
|
-
},
|
|
1011
|
-
get schemaInfo() {
|
|
1012
|
-
return graphqlMiddleware.schemaInfo;
|
|
1013
|
-
},
|
|
1014
|
-
get address() {
|
|
1015
|
-
return { host, port, path: sharedGqlPath };
|
|
1016
|
-
},
|
|
1017
|
-
};
|
|
1018
|
-
}
|
|
1019
|
-
// Start HTTP adapter (always)
|
|
1020
|
-
httpServer = createHttpAdapter(router, {
|
|
1021
|
-
port,
|
|
1022
|
-
host,
|
|
1023
|
-
basePath,
|
|
1024
|
-
maxBodySize: httpOptions?.maxBodySize,
|
|
1025
|
-
contextFactory: httpOptions?.contextFactory,
|
|
1026
|
-
codecs: httpOptions?.codecs,
|
|
1027
|
-
cors: cors === true
|
|
1028
|
-
? {
|
|
1029
|
-
origin: '*',
|
|
1030
|
-
methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
|
|
1031
|
-
headers: ['Content-Type', 'Authorization', 'Accept', 'X-Request-Id', 'Traceparent', 'Tracestate'],
|
|
1032
|
-
}
|
|
1033
|
-
: cors,
|
|
1034
|
-
middleware: httpMiddleware.length > 0 ? httpMiddleware : undefined,
|
|
1035
|
-
});
|
|
1036
|
-
await httpServer.start();
|
|
1037
|
-
// Start WebSocket adapter
|
|
1038
|
-
if (protocols.websocket?.enabled) {
|
|
1039
|
-
const wsOpts = protocols.websocket.options;
|
|
1040
|
-
const channels = buildChannelOptions(channelRegistry, wsOpts.channels, wsMessageHandler ?? undefined);
|
|
1041
|
-
if (protocols.websocket.shared) {
|
|
1042
|
-
// Share HTTP port - attach to HTTP server
|
|
1043
|
-
wsAdapter = createWebSocketAdapter(router, {
|
|
1044
|
-
host,
|
|
1045
|
-
port,
|
|
1046
|
-
server: httpServer.server ?? undefined,
|
|
1047
|
-
path: wsOpts.path || '/',
|
|
1048
|
-
maxPayloadSize: wsOpts.maxPayloadSize,
|
|
1049
|
-
heartbeatInterval: wsOpts.heartbeatInterval,
|
|
1050
|
-
channels,
|
|
1051
|
-
contextFactory: wsOpts.contextFactory,
|
|
1052
|
-
});
|
|
1053
|
-
addresses.websocket = { host, port, path: wsOpts.path || '/', shared: true };
|
|
1054
|
-
}
|
|
1055
|
-
else {
|
|
1056
|
-
wsAdapter = createWebSocketAdapter(router, {
|
|
1057
|
-
port: wsOpts.port,
|
|
1058
|
-
host,
|
|
1059
|
-
path: wsOpts.path || '/',
|
|
1060
|
-
maxPayloadSize: wsOpts.maxPayloadSize,
|
|
1061
|
-
heartbeatInterval: wsOpts.heartbeatInterval,
|
|
1062
|
-
channels,
|
|
1063
|
-
contextFactory: wsOpts.contextFactory,
|
|
1064
|
-
});
|
|
1065
|
-
addresses.websocket = { host, port: wsOpts.port, path: wsOpts.path || '/', shared: false };
|
|
1066
|
-
}
|
|
1067
|
-
await wsAdapter.start();
|
|
1068
|
-
}
|
|
1069
|
-
// Start JSON-RPC adapter
|
|
1070
|
-
if (protocols.jsonrpc?.enabled) {
|
|
1071
|
-
const rpcOpts = protocols.jsonrpc.options;
|
|
1072
|
-
if (protocols.jsonrpc.shared) {
|
|
1073
|
-
const rpcPath = rpcOpts.path || '/rpc';
|
|
1074
|
-
addresses.jsonrpc = { host, port, path: joinBasePath(basePath, rpcPath), shared: true };
|
|
1075
|
-
}
|
|
1076
|
-
else {
|
|
1077
|
-
jsonRpcAdapter = createJsonRpcAdapter(router, {
|
|
1078
|
-
port: rpcOpts.port,
|
|
1079
|
-
host,
|
|
1080
|
-
path: rpcOpts.path || '/rpc',
|
|
1081
|
-
timeout: rpcOpts.timeout,
|
|
1082
|
-
maxBodySize: rpcOpts.maxBodySize,
|
|
1083
|
-
});
|
|
1084
|
-
addresses.jsonrpc = { host, port: rpcOpts.port, path: rpcOpts.path || '/rpc', shared: false };
|
|
1085
|
-
await jsonRpcAdapter.start();
|
|
1086
|
-
}
|
|
1087
|
-
}
|
|
1088
|
-
// Start TCP adapter
|
|
1089
|
-
if (protocols.tcp?.enabled) {
|
|
1090
|
-
const tcpOpts = protocols.tcp.options;
|
|
1091
|
-
tcpAdapter = createTcpAdapter(router, {
|
|
1092
|
-
port: tcpOpts.port,
|
|
1093
|
-
host: tcpOpts.host || host,
|
|
1094
|
-
maxMessageSize: tcpOpts.maxMessageSize,
|
|
1095
|
-
keepAliveInterval: tcpOpts.keepAliveInterval,
|
|
1096
|
-
});
|
|
1097
|
-
await tcpAdapter.start();
|
|
1098
|
-
addresses.tcp = { host: tcpOpts.host || host, port: tcpOpts.port };
|
|
1099
|
-
}
|
|
1100
|
-
// Start gRPC adapter
|
|
1101
|
-
if (protocols.grpc?.enabled) {
|
|
1102
|
-
const grpcOpts = protocols.grpc.options;
|
|
1103
|
-
grpcAdapter = createGrpcAdapter(router, {
|
|
1104
|
-
host: grpcOpts.host || host,
|
|
1105
|
-
port: grpcOpts.port,
|
|
1106
|
-
protoPath: grpcOpts.protoPath,
|
|
1107
|
-
packageName: grpcOpts.packageName,
|
|
1108
|
-
serviceNames: grpcOpts.serviceNames,
|
|
1109
|
-
loaderOptions: grpcOpts.loaderOptions,
|
|
1110
|
-
tls: grpcOpts.tls,
|
|
1111
|
-
maxReceiveMessageLength: grpcOpts.maxReceiveMessageLength,
|
|
1112
|
-
maxSendMessageLength: grpcOpts.maxSendMessageLength,
|
|
1113
|
-
});
|
|
1114
|
-
await grpcAdapter.start();
|
|
1115
|
-
if (grpcAdapter.address) {
|
|
1116
|
-
addresses.grpc = grpcAdapter.address;
|
|
1117
|
-
}
|
|
1118
|
-
else {
|
|
1119
|
-
addresses.grpc = { host: grpcOpts.host || host, port: grpcOpts.port };
|
|
1120
|
-
}
|
|
1121
|
-
}
|
|
1122
|
-
// Start GraphQL adapter
|
|
1123
|
-
if (protocols.graphql?.enabled) {
|
|
1124
|
-
const gqlOpts = protocols.graphql.options;
|
|
1125
|
-
const gqlPath = gqlOpts.path || '/graphql';
|
|
1126
|
-
if (protocols.graphql.shared) {
|
|
1127
|
-
if (graphqlAdapter) {
|
|
1128
|
-
await graphqlAdapter.start();
|
|
1129
|
-
}
|
|
1130
|
-
addresses.graphql = { host, port, path: joinBasePath(basePath, gqlPath), shared: true };
|
|
1131
|
-
}
|
|
1132
|
-
else {
|
|
1133
|
-
const isDev = isDevelopment();
|
|
1134
|
-
graphqlAdapter = createGraphQLAdapter({
|
|
1135
|
-
router,
|
|
1136
|
-
registry,
|
|
1137
|
-
schemaRegistry,
|
|
1138
|
-
host,
|
|
1139
|
-
port: gqlOpts.port,
|
|
1140
|
-
config: {
|
|
1141
|
-
...gqlOpts,
|
|
1142
|
-
path: gqlPath,
|
|
1143
|
-
playground: gqlOpts.playground ?? isDev,
|
|
1144
|
-
introspection: gqlOpts.introspection ?? isDev,
|
|
1145
|
-
timeout: gqlOpts.timeout ?? 30000,
|
|
1146
|
-
maxBodySize: gqlOpts.maxBodySize ?? 1024 * 1024,
|
|
1147
|
-
},
|
|
1148
|
-
});
|
|
1149
|
-
await graphqlAdapter.start();
|
|
1150
|
-
addresses.graphql = { host, port: gqlOpts.port, path: gqlPath, shared: false };
|
|
1151
|
-
}
|
|
1152
|
-
}
|
|
1153
|
-
if (protocolExtensionConfigs.length > 0) {
|
|
1154
|
-
const protocolContext = {
|
|
1155
|
-
router,
|
|
1156
|
-
registry,
|
|
1157
|
-
schemaRegistry,
|
|
1158
|
-
httpServer,
|
|
1159
|
-
basePath,
|
|
1160
|
-
host,
|
|
1161
|
-
port,
|
|
1162
|
-
providers: resolvedProviders,
|
|
1163
|
-
};
|
|
1164
|
-
for (const extension of protocolExtensionConfigs) {
|
|
1165
|
-
const adapter = await extension.factory(protocolContext, extension.options);
|
|
1166
|
-
protocolAdapters.set(extension.name, adapter);
|
|
1167
|
-
await adapter.start();
|
|
1168
|
-
if (adapter.address) {
|
|
1169
|
-
if (!addresses.protocols) {
|
|
1170
|
-
addresses.protocols = {};
|
|
1171
|
-
}
|
|
1172
|
-
addresses.protocols[extension.name] = adapter.address;
|
|
1173
|
-
}
|
|
1174
|
-
logger.info({ name: extension.name }, 'Protocol adapter started');
|
|
1175
|
-
}
|
|
1176
|
-
}
|
|
1177
|
-
// Start custom TCP handlers (added via .addTcpHandler())
|
|
1178
|
-
for (const handler of tcpHandlers) {
|
|
1179
|
-
const { createTcpServer } = await import('./fs-routes/tcp/index.js');
|
|
1180
|
-
const tcpServer = createTcpServer(handler);
|
|
1181
|
-
await tcpServer.start();
|
|
1182
|
-
tcpServers.push(tcpServer);
|
|
1183
|
-
logger.info({ name: handler.name, port: handler.config.port }, 'TCP handler started');
|
|
1184
|
-
}
|
|
1185
|
-
// Start custom UDP handlers (added via .addUdpHandler())
|
|
1186
|
-
for (const handler of udpHandlers) {
|
|
1187
|
-
const { createUdpServer } = await import('./fs-routes/udp/index.js');
|
|
1188
|
-
const udpServer = createUdpServer(handler);
|
|
1189
|
-
await udpServer.start();
|
|
1190
|
-
udpServers.push(udpServer);
|
|
1191
|
-
if (!addresses.udp) {
|
|
1192
|
-
addresses.udp = { host: udpServer.host, port: udpServer.port };
|
|
1193
|
-
}
|
|
1194
|
-
logger.info({ name: handler.name, port: handler.config.port }, 'UDP handler started');
|
|
1195
|
-
}
|
|
1196
|
-
running = true;
|
|
1104
|
+
await serverLifecycle.start();
|
|
1197
1105
|
},
|
|
1198
1106
|
async stop() {
|
|
1199
|
-
|
|
1200
|
-
return;
|
|
1201
|
-
const stops = [];
|
|
1202
|
-
if (protocolAdapters.size > 0) {
|
|
1203
|
-
for (const [name, adapter] of protocolAdapters) {
|
|
1204
|
-
logger.info({ name }, 'Protocol adapter stopping');
|
|
1205
|
-
stops.push(adapter.stop());
|
|
1206
|
-
}
|
|
1207
|
-
protocolAdapters.clear();
|
|
1208
|
-
}
|
|
1209
|
-
if (tcpAdapter) {
|
|
1210
|
-
stops.push(tcpAdapter.stop());
|
|
1211
|
-
tcpAdapter = null;
|
|
1212
|
-
}
|
|
1213
|
-
if (jsonRpcAdapter) {
|
|
1214
|
-
stops.push(jsonRpcAdapter.stop());
|
|
1215
|
-
jsonRpcAdapter = null;
|
|
1216
|
-
}
|
|
1217
|
-
if (wsAdapter) {
|
|
1218
|
-
stops.push(wsAdapter.stop());
|
|
1219
|
-
wsAdapter = null;
|
|
1220
|
-
}
|
|
1221
|
-
if (httpServer) {
|
|
1222
|
-
stops.push(httpServer.stop());
|
|
1223
|
-
httpServer = null;
|
|
1224
|
-
}
|
|
1225
|
-
if (grpcAdapter) {
|
|
1226
|
-
stops.push(grpcAdapter.stop());
|
|
1227
|
-
grpcAdapter = null;
|
|
1228
|
-
}
|
|
1229
|
-
if (graphqlAdapter) {
|
|
1230
|
-
stops.push(graphqlAdapter.stop());
|
|
1231
|
-
graphqlAdapter = null;
|
|
1232
|
-
}
|
|
1233
|
-
await Promise.all(stops);
|
|
1234
|
-
// Stop custom TCP servers
|
|
1235
|
-
for (const tcpServer of tcpServers) {
|
|
1236
|
-
await tcpServer.stop();
|
|
1237
|
-
}
|
|
1238
|
-
tcpServers.length = 0;
|
|
1239
|
-
// Stop custom UDP servers
|
|
1240
|
-
for (const udpServer of udpServers) {
|
|
1241
|
-
await udpServer.stop();
|
|
1242
|
-
}
|
|
1243
|
-
udpServers.length = 0;
|
|
1244
|
-
// Stop discovery watcher
|
|
1245
|
-
if (discoveryWatcher) {
|
|
1246
|
-
discoveryWatcher.stop();
|
|
1247
|
-
}
|
|
1248
|
-
// Stop process metrics collection
|
|
1249
|
-
if (processMetricsCleanup) {
|
|
1250
|
-
processMetricsCleanup();
|
|
1251
|
-
processMetricsCleanup = null;
|
|
1252
|
-
}
|
|
1253
|
-
// Shutdown tracer (flush pending spans)
|
|
1254
|
-
if (tracerInstance) {
|
|
1255
|
-
await tracerInstance.shutdown();
|
|
1256
|
-
tracerInstance = null;
|
|
1257
|
-
}
|
|
1258
|
-
// Shutdown providers
|
|
1259
|
-
for (const [name, definition] of providerDefinitions) {
|
|
1260
|
-
if (definition.onShutdown && resolvedProviders[name]) {
|
|
1261
|
-
try {
|
|
1262
|
-
await definition.onShutdown(resolvedProviders[name]);
|
|
1263
|
-
logger.debug({ name }, 'Provider shut down');
|
|
1264
|
-
}
|
|
1265
|
-
catch (err) {
|
|
1266
|
-
logger.error({ err, name }, 'Error shutting down provider');
|
|
1267
|
-
}
|
|
1268
|
-
}
|
|
1269
|
-
}
|
|
1270
|
-
router.stop();
|
|
1271
|
-
running = false;
|
|
1272
|
-
addresses = null;
|
|
1107
|
+
await serverLifecycle.stop();
|
|
1273
1108
|
},
|
|
1274
1109
|
async restart() {
|
|
1275
1110
|
await server.stop();
|
|
@@ -1336,6 +1171,10 @@ export function createServer(options) {
|
|
|
1336
1171
|
onJoin: wrappedOnJoin,
|
|
1337
1172
|
onLeave: wrappedOnLeave,
|
|
1338
1173
|
},
|
|
1174
|
+
// Include documentation metadata
|
|
1175
|
+
type: options?.type ?? 'public',
|
|
1176
|
+
description: options?.description,
|
|
1177
|
+
tags: options?.tags,
|
|
1339
1178
|
};
|
|
1340
1179
|
channelRegistry.set(channelName, channelDef);
|
|
1341
1180
|
logger.debug({ name: channelName, type: options?.type ?? 'public', auth: authRequirement }, 'Added WebSocket channel');
|
|
@@ -1362,18 +1201,21 @@ export function createServer(options) {
|
|
|
1362
1201
|
},
|
|
1363
1202
|
get streams() {
|
|
1364
1203
|
// Uses persistent streamInterceptors from outer scope for shared middleware chain
|
|
1204
|
+
const isStreamOptions = (optionsOrHandler) => typeof optionsOrHandler === 'object'
|
|
1205
|
+
&& optionsOrHandler !== null
|
|
1206
|
+
&& !isAsyncIterable(optionsOrHandler);
|
|
1365
1207
|
const streamsNamespace = {
|
|
1366
1208
|
source(name, optionsOrHandler, maybeHandler) {
|
|
1367
|
-
const isOptionsObject =
|
|
1209
|
+
const isOptionsObject = isStreamOptions(optionsOrHandler);
|
|
1368
1210
|
const options = isOptionsObject ? optionsOrHandler : {};
|
|
1369
1211
|
const handler = isOptionsObject ? maybeHandler : optionsOrHandler;
|
|
1370
1212
|
// Register as a stream handler using the registry
|
|
1371
1213
|
const streamName = `stream:${name}`;
|
|
1372
|
-
|
|
1214
|
+
let interceptors = normalizeInterceptors([...globalInterceptors, ...streamInterceptors]);
|
|
1373
1215
|
if (options.input) {
|
|
1374
1216
|
const schema = { input: options.input };
|
|
1375
1217
|
schemaRegistry.register(streamName, schema);
|
|
1376
|
-
interceptors
|
|
1218
|
+
interceptors = normalizeInterceptors(interceptors, schema);
|
|
1377
1219
|
}
|
|
1378
1220
|
registry.stream(streamName, handler, {
|
|
1379
1221
|
description: options.description,
|
|
@@ -1384,15 +1226,15 @@ export function createServer(options) {
|
|
|
1384
1226
|
return streamsNamespace;
|
|
1385
1227
|
},
|
|
1386
1228
|
sink(name, optionsOrHandler, maybeHandler) {
|
|
1387
|
-
const isOptionsObject =
|
|
1229
|
+
const isOptionsObject = isStreamOptions(optionsOrHandler);
|
|
1388
1230
|
const options = isOptionsObject ? optionsOrHandler : {};
|
|
1389
1231
|
const handler = isOptionsObject ? maybeHandler : optionsOrHandler;
|
|
1390
1232
|
const streamName = `stream:${name}`;
|
|
1391
|
-
|
|
1233
|
+
let interceptors = normalizeInterceptors([...globalInterceptors, ...streamInterceptors]);
|
|
1392
1234
|
if (options.input) {
|
|
1393
1235
|
const schema = { input: options.input };
|
|
1394
1236
|
schemaRegistry.register(streamName, schema);
|
|
1395
|
-
interceptors
|
|
1237
|
+
interceptors = normalizeInterceptors(interceptors, schema);
|
|
1396
1238
|
}
|
|
1397
1239
|
registry.stream(streamName, handler, {
|
|
1398
1240
|
description: options.description,
|
|
@@ -1403,15 +1245,15 @@ export function createServer(options) {
|
|
|
1403
1245
|
return streamsNamespace;
|
|
1404
1246
|
},
|
|
1405
1247
|
duplex(name, optionsOrHandler, maybeHandler) {
|
|
1406
|
-
const isOptionsObject =
|
|
1248
|
+
const isOptionsObject = isStreamOptions(optionsOrHandler);
|
|
1407
1249
|
const options = isOptionsObject ? optionsOrHandler : {};
|
|
1408
1250
|
const handler = isOptionsObject ? maybeHandler : optionsOrHandler;
|
|
1409
1251
|
const streamName = `stream:${name}`;
|
|
1410
|
-
|
|
1252
|
+
let interceptors = normalizeInterceptors([...globalInterceptors, ...streamInterceptors]);
|
|
1411
1253
|
if (options.input) {
|
|
1412
1254
|
const schema = { input: options.input };
|
|
1413
1255
|
schemaRegistry.register(streamName, schema);
|
|
1414
|
-
interceptors
|
|
1256
|
+
interceptors = normalizeInterceptors(interceptors, schema);
|
|
1415
1257
|
}
|
|
1416
1258
|
registry.stream(streamName, handler, {
|
|
1417
1259
|
description: options.description,
|
|
@@ -1434,11 +1276,11 @@ export function createServer(options) {
|
|
|
1434
1276
|
const isOptionsObject = typeof optionsOrHandler === 'object' && optionsOrHandler !== null && typeof maybeHandler === 'function';
|
|
1435
1277
|
const options = isOptionsObject ? optionsOrHandler : {};
|
|
1436
1278
|
const handler = isOptionsObject ? maybeHandler : optionsOrHandler;
|
|
1437
|
-
|
|
1279
|
+
let interceptors = normalizeInterceptors([...globalInterceptors, ...rpcInterceptors]);
|
|
1438
1280
|
if (options.input) {
|
|
1439
1281
|
const schema = { input: options.input, output: options.output };
|
|
1440
1282
|
schemaRegistry.register(name, schema);
|
|
1441
|
-
interceptors
|
|
1283
|
+
interceptors = normalizeInterceptors(interceptors, schema);
|
|
1442
1284
|
}
|
|
1443
1285
|
registry.procedure(name, handler, {
|
|
1444
1286
|
description: options.description,
|
|
@@ -1601,7 +1443,7 @@ export function createServer(options) {
|
|
|
1601
1443
|
const options = isOptionsObject ? optionsOrHandler : {};
|
|
1602
1444
|
const handler = isOptionsObject ? maybeHandler : optionsOrHandler;
|
|
1603
1445
|
const procedureName = packageName ? `${packageName}.${serviceName}.${name}` : `${serviceName}.${name}`;
|
|
1604
|
-
|
|
1446
|
+
let interceptors = normalizeInterceptors([...globalInterceptors, ...grpcInterceptors]);
|
|
1605
1447
|
if (options.input || options.output) {
|
|
1606
1448
|
const schema = {};
|
|
1607
1449
|
if (options.input)
|
|
@@ -1609,7 +1451,7 @@ export function createServer(options) {
|
|
|
1609
1451
|
if (options.output)
|
|
1610
1452
|
schema.output = options.output;
|
|
1611
1453
|
schemaRegistry.register(procedureName, schema);
|
|
1612
|
-
interceptors
|
|
1454
|
+
interceptors = normalizeInterceptors(interceptors, schema);
|
|
1613
1455
|
}
|
|
1614
1456
|
registry.procedure(procedureName, handler, {
|
|
1615
1457
|
description: options.description,
|
|
@@ -1706,32 +1548,35 @@ export function createServer(options) {
|
|
|
1706
1548
|
return router;
|
|
1707
1549
|
},
|
|
1708
1550
|
get isRunning() {
|
|
1709
|
-
return running;
|
|
1551
|
+
return serverState.running.value;
|
|
1710
1552
|
},
|
|
1711
1553
|
get addresses() {
|
|
1712
|
-
return addresses;
|
|
1554
|
+
return serverState.addresses.value;
|
|
1713
1555
|
},
|
|
1714
1556
|
get channels() {
|
|
1715
|
-
return wsAdapter?.channels ?? null;
|
|
1557
|
+
return serverState.wsAdapter.value?.channels ?? null;
|
|
1716
1558
|
},
|
|
1717
|
-
get discoveryWatcher() { return
|
|
1559
|
+
get discoveryWatcher() { return discoveryBootstrap.watcher; },
|
|
1718
1560
|
get providers() { return resolvedProviders; },
|
|
1719
|
-
get graphql() { return graphqlAdapter; },
|
|
1720
|
-
get metrics() { return metricsRegistry; },
|
|
1721
|
-
get tracer() { return tracerInstance; },
|
|
1722
|
-
|
|
1561
|
+
get graphql() { return serverState.graphqlAdapter.value; },
|
|
1562
|
+
get metrics() { return telemetryState.metricsRegistry; },
|
|
1563
|
+
get tracer() { return telemetryState.tracerInstance; },
|
|
1564
|
+
previewConfig() {
|
|
1565
|
+
return getPreviewConfig();
|
|
1566
|
+
},
|
|
1567
|
+
get usd() { return serverState.usdDocsHandlers.value; },
|
|
1723
1568
|
// === USD Document Access ===
|
|
1724
1569
|
getUSDDocument() {
|
|
1725
|
-
if (!usdDocsHandlers) {
|
|
1570
|
+
if (!serverState.usdDocsHandlers.value) {
|
|
1726
1571
|
return null;
|
|
1727
1572
|
}
|
|
1728
|
-
return usdDocsHandlers.getUSDDocument();
|
|
1573
|
+
return serverState.usdDocsHandlers.value.getUSDDocument();
|
|
1729
1574
|
},
|
|
1730
1575
|
getOpenAPIDocument() {
|
|
1731
|
-
if (!usdDocsHandlers) {
|
|
1576
|
+
if (!serverState.usdDocsHandlers.value) {
|
|
1732
1577
|
return null;
|
|
1733
1578
|
}
|
|
1734
|
-
return usdDocsHandlers.getOpenAPIDocument();
|
|
1579
|
+
return serverState.usdDocsHandlers.value.getOpenAPIDocument();
|
|
1735
1580
|
},
|
|
1736
1581
|
};
|
|
1737
1582
|
return server;
|