raffel 0.2.3 → 1.0.0-next.f81d4db
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
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Interceptor
|
|
3
|
+
*
|
|
4
|
+
* Injects a live Session handle into `ctx.session` for every request.
|
|
5
|
+
* The session is loaded from the store at the start of the request and
|
|
6
|
+
* persisted (if dirty) after the handler returns.
|
|
7
|
+
*
|
|
8
|
+
* Session IDs are read from / written to cookies by default.
|
|
9
|
+
*/
|
|
10
|
+
import { createMemorySessionDriver } from './drivers/memory.js';
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Session ID generation
|
|
13
|
+
// ============================================================================
|
|
14
|
+
function generateSessionId() {
|
|
15
|
+
// Use crypto.randomUUID() if available (Node 15+), fall back to randomBytes
|
|
16
|
+
if (typeof crypto !== 'undefined' && crypto.randomUUID) {
|
|
17
|
+
return crypto.randomUUID().replace(/-/g, '');
|
|
18
|
+
}
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
20
|
+
const nodeCrypto = require('crypto');
|
|
21
|
+
return nodeCrypto.randomBytes(16).toString('hex');
|
|
22
|
+
}
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// Cookie helpers
|
|
25
|
+
// ============================================================================
|
|
26
|
+
function parseCookies(cookieHeader) {
|
|
27
|
+
const cookies = {};
|
|
28
|
+
for (const part of cookieHeader.split(';')) {
|
|
29
|
+
const eqIdx = part.indexOf('=');
|
|
30
|
+
if (eqIdx === -1)
|
|
31
|
+
continue;
|
|
32
|
+
const name = part.slice(0, eqIdx).trim();
|
|
33
|
+
const value = part.slice(eqIdx + 1).trim();
|
|
34
|
+
cookies[name] = decodeURIComponent(value);
|
|
35
|
+
}
|
|
36
|
+
return cookies;
|
|
37
|
+
}
|
|
38
|
+
function buildSetCookieHeader(name, value, options = {}) {
|
|
39
|
+
let cookie = `${name}=${encodeURIComponent(value)}`;
|
|
40
|
+
if (options.maxAge != null)
|
|
41
|
+
cookie += `; Max-Age=${options.maxAge}`;
|
|
42
|
+
if (options.httpOnly !== false)
|
|
43
|
+
cookie += '; HttpOnly';
|
|
44
|
+
if (options.secure !== false)
|
|
45
|
+
cookie += '; Secure';
|
|
46
|
+
cookie += `; SameSite=${options.sameSite ?? 'Lax'}`;
|
|
47
|
+
cookie += `; Path=${options.path ?? '/'}`;
|
|
48
|
+
if (options.domain)
|
|
49
|
+
cookie += `; Domain=${options.domain}`;
|
|
50
|
+
return cookie;
|
|
51
|
+
}
|
|
52
|
+
function buildDeleteCookieHeader(name, path = '/') {
|
|
53
|
+
return `${name}=; Max-Age=0; Path=${path}; HttpOnly`;
|
|
54
|
+
}
|
|
55
|
+
// ============================================================================
|
|
56
|
+
// HMAC signing (optional)
|
|
57
|
+
// ============================================================================
|
|
58
|
+
function signId(id, secret) {
|
|
59
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
60
|
+
const crypto = require('crypto');
|
|
61
|
+
const sig = crypto.createHmac('sha256', secret).update(id).digest('base64url');
|
|
62
|
+
return `${id}.${sig}`;
|
|
63
|
+
}
|
|
64
|
+
function unsignId(signed, secret) {
|
|
65
|
+
const lastDot = signed.lastIndexOf('.');
|
|
66
|
+
if (lastDot === -1)
|
|
67
|
+
return null;
|
|
68
|
+
const id = signed.slice(0, lastDot);
|
|
69
|
+
const expected = signId(id, secret);
|
|
70
|
+
// Constant-time comparison
|
|
71
|
+
if (signed.length !== expected.length)
|
|
72
|
+
return null;
|
|
73
|
+
let ok = true;
|
|
74
|
+
for (let i = 0; i < signed.length; i++) {
|
|
75
|
+
if (signed.charCodeAt(i) !== expected.charCodeAt(i))
|
|
76
|
+
ok = false;
|
|
77
|
+
}
|
|
78
|
+
return ok ? id : null;
|
|
79
|
+
}
|
|
80
|
+
// ============================================================================
|
|
81
|
+
// Session handle factory
|
|
82
|
+
// ============================================================================
|
|
83
|
+
function createSession(id, data) {
|
|
84
|
+
let dirty = false;
|
|
85
|
+
let destroyed = false;
|
|
86
|
+
let pendingAction = null;
|
|
87
|
+
let sessionId = id;
|
|
88
|
+
return {
|
|
89
|
+
get id() { return sessionId; },
|
|
90
|
+
data,
|
|
91
|
+
touch() {
|
|
92
|
+
dirty = true;
|
|
93
|
+
if (pendingAction !== 'destroy')
|
|
94
|
+
pendingAction = 'save';
|
|
95
|
+
},
|
|
96
|
+
get isDirty() { return dirty; },
|
|
97
|
+
destroy() {
|
|
98
|
+
destroyed = true;
|
|
99
|
+
pendingAction = 'destroy';
|
|
100
|
+
},
|
|
101
|
+
get isDestroyed() { return destroyed; },
|
|
102
|
+
async regenerate() {
|
|
103
|
+
sessionId = generateSessionId();
|
|
104
|
+
dirty = true;
|
|
105
|
+
pendingAction = 'save';
|
|
106
|
+
},
|
|
107
|
+
get _pending() { return pendingAction; },
|
|
108
|
+
get _id() { return sessionId; },
|
|
109
|
+
setId(newId) { sessionId = newId; },
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
// ============================================================================
|
|
113
|
+
// Store factory
|
|
114
|
+
// ============================================================================
|
|
115
|
+
function resolveStore(config) {
|
|
116
|
+
const { driver } = config;
|
|
117
|
+
if (driver === 'memory') {
|
|
118
|
+
return createMemorySessionDriver();
|
|
119
|
+
}
|
|
120
|
+
if (driver === 'custom') {
|
|
121
|
+
throw new Error('Session driver "custom" requires a store instance. Pass it via driver: myStore (a SessionStore object).');
|
|
122
|
+
}
|
|
123
|
+
if (typeof driver === 'object' && driver !== null) {
|
|
124
|
+
return driver;
|
|
125
|
+
}
|
|
126
|
+
throw new Error('Invalid session driver. Use "memory" or pass a custom SessionStore instance to session.driver.');
|
|
127
|
+
}
|
|
128
|
+
// ============================================================================
|
|
129
|
+
// createSessionInterceptor
|
|
130
|
+
// ============================================================================
|
|
131
|
+
/**
|
|
132
|
+
* Create a session interceptor that injects `ctx.session` into every request.
|
|
133
|
+
*
|
|
134
|
+
* The session is loaded lazily from the store when first accessed,
|
|
135
|
+
* and persisted automatically after the handler completes (if dirty).
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```typescript
|
|
139
|
+
* import { createSessionInterceptor } from 'raffel/session'
|
|
140
|
+
*
|
|
141
|
+
* const server = createServer({ port: 3000 })
|
|
142
|
+
*
|
|
143
|
+
* server.use(createSessionInterceptor({
|
|
144
|
+
* driver: 'memory',
|
|
145
|
+
* ttl: 3600,
|
|
146
|
+
* cookie: { name: 'sid', secure: true },
|
|
147
|
+
* }))
|
|
148
|
+
*
|
|
149
|
+
* server.procedure('auth.login').handler(async (input, ctx) => {
|
|
150
|
+
* ctx.session.data.userId = input.userId
|
|
151
|
+
* ctx.session.touch()
|
|
152
|
+
* return { ok: true }
|
|
153
|
+
* })
|
|
154
|
+
*
|
|
155
|
+
* server.procedure('auth.me').handler(async (_input, ctx) => {
|
|
156
|
+
* return { userId: ctx.session.data.userId }
|
|
157
|
+
* })
|
|
158
|
+
* ```
|
|
159
|
+
*/
|
|
160
|
+
export function createSessionInterceptor(config) {
|
|
161
|
+
const store = resolveStore(config);
|
|
162
|
+
const ttl = config.ttl ?? 3600;
|
|
163
|
+
const rolling = config.rolling ?? false;
|
|
164
|
+
const cookieName = config.cookie?.name ?? 'sid';
|
|
165
|
+
const cookieOptions = config.cookie ?? {};
|
|
166
|
+
return async (envelope, ctx, next) => {
|
|
167
|
+
// --- Read session ID from cookie ---
|
|
168
|
+
const cookieHeader = envelope.metadata?.['cookie'] ??
|
|
169
|
+
envelope.metadata?.['Cookie'] ??
|
|
170
|
+
'';
|
|
171
|
+
const cookies = parseCookies(cookieHeader);
|
|
172
|
+
const cookieValue = cookies[cookieName] ?? null;
|
|
173
|
+
let sessionId;
|
|
174
|
+
// Unsign if secret configured — may return null if tampered
|
|
175
|
+
const rawSid = (cookieValue && config.secret)
|
|
176
|
+
? unsignId(cookieValue, config.secret)
|
|
177
|
+
: cookieValue;
|
|
178
|
+
// Load or create session
|
|
179
|
+
let sessionData;
|
|
180
|
+
let isNew = false;
|
|
181
|
+
if (rawSid) {
|
|
182
|
+
const stored = await store.get(rawSid);
|
|
183
|
+
if (stored) {
|
|
184
|
+
sessionId = rawSid;
|
|
185
|
+
sessionData = stored;
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
// Expired or not found → new session
|
|
189
|
+
sessionId = generateSessionId();
|
|
190
|
+
sessionData = {};
|
|
191
|
+
isNew = true;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
sessionId = generateSessionId();
|
|
196
|
+
sessionData = {};
|
|
197
|
+
isNew = true;
|
|
198
|
+
}
|
|
199
|
+
const session = createSession(sessionId, sessionData);
|
|
200
|
+
ctx['session'] = session;
|
|
201
|
+
// --- Run handler ---
|
|
202
|
+
let result;
|
|
203
|
+
try {
|
|
204
|
+
result = await next();
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
// --- Persist session after handler ---
|
|
208
|
+
const pending = session._pending;
|
|
209
|
+
const currentId = session._id;
|
|
210
|
+
if (pending === 'destroy') {
|
|
211
|
+
await store.delete(sessionId);
|
|
212
|
+
// Set delete cookie header
|
|
213
|
+
const delCookie = buildDeleteCookieHeader(cookieName, cookieOptions.path);
|
|
214
|
+
appendSetCookieHeader(envelope, delCookie);
|
|
215
|
+
}
|
|
216
|
+
else if (pending === 'save' || (rolling && !isNew && !session.isDestroyed)) {
|
|
217
|
+
if (pending === 'save' || session.isDirty || config.saveUninitialized) {
|
|
218
|
+
await store.set(currentId, session.data, ttl);
|
|
219
|
+
}
|
|
220
|
+
if (rolling && !isNew) {
|
|
221
|
+
await store.touch(currentId, ttl);
|
|
222
|
+
}
|
|
223
|
+
const maxAge = cookieOptions.maxAge ?? ttl;
|
|
224
|
+
const finalId = config.secret ? signId(currentId, config.secret) : currentId;
|
|
225
|
+
const setCookie = buildSetCookieHeader(cookieName, finalId, { ...cookieOptions, maxAge });
|
|
226
|
+
appendSetCookieHeader(envelope, setCookie);
|
|
227
|
+
}
|
|
228
|
+
else if (isNew && (session.isDirty || config.saveUninitialized)) {
|
|
229
|
+
await store.set(currentId, session.data, ttl);
|
|
230
|
+
const maxAge = cookieOptions.maxAge ?? ttl;
|
|
231
|
+
const finalId = config.secret ? signId(currentId, config.secret) : currentId;
|
|
232
|
+
const setCookie = buildSetCookieHeader(cookieName, finalId, { ...cookieOptions, maxAge });
|
|
233
|
+
appendSetCookieHeader(envelope, setCookie);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return result;
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Append a Set-Cookie header to the response.
|
|
241
|
+
* Tries to use the envelope's response metadata (httpResponseHeaders) if available.
|
|
242
|
+
*/
|
|
243
|
+
function appendSetCookieHeader(envelope, value) {
|
|
244
|
+
const meta = envelope.metadata;
|
|
245
|
+
if (!meta)
|
|
246
|
+
return;
|
|
247
|
+
const existing = meta['httpResponseHeaders'];
|
|
248
|
+
if (existing) {
|
|
249
|
+
const current = existing['set-cookie'];
|
|
250
|
+
if (Array.isArray(current)) {
|
|
251
|
+
current.push(value);
|
|
252
|
+
}
|
|
253
|
+
else if (typeof current === 'string') {
|
|
254
|
+
existing['set-cookie'] = [current, value];
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
existing['set-cookie'] = value;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
meta['httpResponseHeaders'] = { 'set-cookie': value };
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../../../src/middleware/session/interceptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Store Types
|
|
3
|
+
*
|
|
4
|
+
* Interfaces for the dedicated Session Store abstraction.
|
|
5
|
+
* The session store manages user sessions across requests,
|
|
6
|
+
* providing a uniform API regardless of backing storage.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Session data bag — arbitrary key/value pairs persisted per session.
|
|
10
|
+
*/
|
|
11
|
+
export type SessionData = Record<string, unknown>;
|
|
12
|
+
/**
|
|
13
|
+
* Session store interface.
|
|
14
|
+
* Implement this to provide a custom backing store.
|
|
15
|
+
*/
|
|
16
|
+
export interface SessionStore {
|
|
17
|
+
/** Retrieve session data by session ID. Returns null if not found or expired. */
|
|
18
|
+
get(id: string): Promise<SessionData | null>;
|
|
19
|
+
/** Persist session data. `ttl` is in seconds; store must honour it. */
|
|
20
|
+
set(id: string, data: SessionData, ttl?: number): Promise<void>;
|
|
21
|
+
/** Delete a session. No-op if not found. */
|
|
22
|
+
delete(id: string): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Touch a session — reset its expiry without changing data.
|
|
25
|
+
* Used for sliding-window TTL.
|
|
26
|
+
*/
|
|
27
|
+
touch(id: string, ttl?: number): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Cookie options for the session cookie.
|
|
31
|
+
*/
|
|
32
|
+
export interface SessionCookieOptions {
|
|
33
|
+
/** Cookie name (default: 'sid') */
|
|
34
|
+
name?: string;
|
|
35
|
+
/** Max age in seconds (takes precedence over `ttl` for cookie expiry). Defaults to `ttl`. */
|
|
36
|
+
maxAge?: number;
|
|
37
|
+
/** HttpOnly flag (default: true) */
|
|
38
|
+
httpOnly?: boolean;
|
|
39
|
+
/** Secure flag — set cookies only over HTTPS (default: true in production) */
|
|
40
|
+
secure?: boolean;
|
|
41
|
+
/** SameSite policy (default: 'lax') */
|
|
42
|
+
sameSite?: 'strict' | 'lax' | 'none';
|
|
43
|
+
/** Cookie path (default: '/') */
|
|
44
|
+
path?: string;
|
|
45
|
+
/** Cookie domain */
|
|
46
|
+
domain?: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Session store driver type (built-in drivers).
|
|
50
|
+
*
|
|
51
|
+
* - `'memory'` — in-memory Map + TTL (dev, single-instance)
|
|
52
|
+
* - `'custom'` — explicit alias for passing any `SessionStore` instance
|
|
53
|
+
*/
|
|
54
|
+
export type SessionDriverType = 'memory' | 'custom';
|
|
55
|
+
/**
|
|
56
|
+
* Session configuration passed to `createServer()`.
|
|
57
|
+
*/
|
|
58
|
+
export interface SessionConfig {
|
|
59
|
+
/**
|
|
60
|
+
* Built-in driver type, OR a custom store instance.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* // Built-in memory driver (dev)
|
|
64
|
+
* driver: 'memory'
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* // Custom store
|
|
68
|
+
* driver: myCustomStore
|
|
69
|
+
*/
|
|
70
|
+
driver: SessionDriverType | SessionStore;
|
|
71
|
+
/**
|
|
72
|
+
* Session TTL in seconds (default: 3600 — 1 hour).
|
|
73
|
+
* Applies to both store expiry and cookie maxAge (unless overridden in `cookie.maxAge`).
|
|
74
|
+
*/
|
|
75
|
+
ttl?: number;
|
|
76
|
+
/**
|
|
77
|
+
* Whether to use a sliding-window TTL: each access resets the TTL.
|
|
78
|
+
* (default: false — fixed TTL)
|
|
79
|
+
*/
|
|
80
|
+
rolling?: boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Whether to save sessions that have never been modified.
|
|
83
|
+
* (default: false — lazy save)
|
|
84
|
+
*/
|
|
85
|
+
saveUninitialized?: boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Secret for signing session IDs (HMAC-SHA256).
|
|
88
|
+
* If not set, session IDs are unsigned.
|
|
89
|
+
*/
|
|
90
|
+
secret?: string;
|
|
91
|
+
/** Cookie configuration */
|
|
92
|
+
cookie?: SessionCookieOptions;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Live session handle injected into `ctx.session` by the session interceptor.
|
|
96
|
+
*/
|
|
97
|
+
export interface Session {
|
|
98
|
+
/** Session ID */
|
|
99
|
+
readonly id: string;
|
|
100
|
+
/** Session data (mutable) */
|
|
101
|
+
data: SessionData;
|
|
102
|
+
/**
|
|
103
|
+
* Mark session as modified so it will be persisted at response time.
|
|
104
|
+
* Called automatically when `data` is mutated via `set()`.
|
|
105
|
+
*/
|
|
106
|
+
touch(): void;
|
|
107
|
+
/** Whether the session has been modified this request */
|
|
108
|
+
readonly isDirty: boolean;
|
|
109
|
+
/** Destroy the session (delete from store, clear cookie on response) */
|
|
110
|
+
destroy(): void;
|
|
111
|
+
/** Whether the session has been destroyed */
|
|
112
|
+
readonly isDestroyed: boolean;
|
|
113
|
+
/** Regenerate session ID (for security after privilege escalation) */
|
|
114
|
+
regenerate(): Promise<void>;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/middleware/session/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEjD;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,iFAAiF;IACjF,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IAE5C,uEAAuE;IACvE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE/D,4CAA4C;IAC5C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEjC;;;OAGG;IACH,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC/C;AAMD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,6FAA6F;IAC7F,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAA;IACpC,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,oBAAoB;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEnD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;;;;;OAUG;IACH,MAAM,EAAE,iBAAiB,GAAG,YAAY,CAAA;IAExC;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IAEZ;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAE3B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,2BAA2B;IAC3B,MAAM,CAAC,EAAE,oBAAoB,CAAA;CAE9B;AAMD;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,iBAAiB;IACjB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IAEnB,6BAA6B;IAC7B,IAAI,EAAE,WAAW,CAAA;IAEjB;;;OAGG;IACH,KAAK,IAAI,IAAI,CAAA;IAEb,yDAAyD;IACzD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IAEzB,wEAAwE;IACxE,OAAO,IAAI,IAAI,CAAA;IAEf,6CAA6C;IAC7C,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;IAE7B,sEAAsE;IACtE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Store Types
|
|
3
|
+
*
|
|
4
|
+
* Interfaces for the dedicated Session Store abstraction.
|
|
5
|
+
* The session store manages user sessions across requests,
|
|
6
|
+
* providing a uniform API regardless of backing storage.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/middleware/session/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTPS CONNECT Tunnel
|
|
3
|
+
*
|
|
4
|
+
* Attaches to an existing http.Server via the 'connect' event.
|
|
5
|
+
* Supports two modes:
|
|
6
|
+
* - forward: transparent TCP tunnel (HTTP CONNECT proxy)
|
|
7
|
+
* - mitm: TLS termination for inspection (MITM proxy)
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const tunnel = createConnectTunnel({ mode: 'forward' })
|
|
11
|
+
* tunnel.attachTo(httpServer)
|
|
12
|
+
*/
|
|
13
|
+
import { type Socket } from 'node:net';
|
|
14
|
+
import type { IncomingMessage, Server as HttpServer } from 'node:http';
|
|
15
|
+
import type { ProxyAuth, ProxyStats } from './types.js';
|
|
16
|
+
export type ConnectMode = 'forward' | 'mitm';
|
|
17
|
+
export interface TunnelInfo {
|
|
18
|
+
host: string;
|
|
19
|
+
port: number;
|
|
20
|
+
clientAddress: string;
|
|
21
|
+
}
|
|
22
|
+
export interface ConnectTunnelOptions {
|
|
23
|
+
/** 'forward' = transparent tunnel, 'mitm' = TLS termination. Default: 'forward' */
|
|
24
|
+
mode?: ConnectMode;
|
|
25
|
+
auth?: ProxyAuth;
|
|
26
|
+
/** Upstream connection timeout in ms. Default: 10_000 */
|
|
27
|
+
connectTimeout?: number;
|
|
28
|
+
/** Custom CA for MITM mode (defaults to built-in CA) */
|
|
29
|
+
ca?: {
|
|
30
|
+
key: string;
|
|
31
|
+
cert: string;
|
|
32
|
+
};
|
|
33
|
+
onConnect?: (info: TunnelInfo) => void;
|
|
34
|
+
onDisconnect?: (info: TunnelInfo & {
|
|
35
|
+
reason: string;
|
|
36
|
+
}) => void;
|
|
37
|
+
}
|
|
38
|
+
export interface ConnectTunnel {
|
|
39
|
+
/** Raw connect handler — attach manually or use attachTo(). */
|
|
40
|
+
connectHandler(req: IncomingMessage, socket: Socket, head: Buffer): void;
|
|
41
|
+
/** Attach this tunnel's connect handler to an http.Server. */
|
|
42
|
+
attachTo(server: HttpServer): void;
|
|
43
|
+
/** Detach this tunnel's connect handler from an http.Server. */
|
|
44
|
+
detachFrom(server: HttpServer): void;
|
|
45
|
+
/** The CA certificate PEM for MITM mode (null in forward mode). */
|
|
46
|
+
readonly caCert: string | null;
|
|
47
|
+
readonly stats: ProxyStats;
|
|
48
|
+
}
|
|
49
|
+
export declare function createConnectTunnel(options?: ConnectTunnelOptions): ConnectTunnel;
|
|
50
|
+
//# sourceMappingURL=connect-tunnel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect-tunnel.d.ts","sourceRoot":"","sources":["../../src/proxy/connect-tunnel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAyB,KAAK,MAAM,EAAE,MAAM,UAAU,CAAA;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAA;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAKvD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,CAAA;AAE5C,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,mFAAmF;IACnF,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,yDAAyD;IACzD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,wDAAwD;IACxD,EAAE,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IAClC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAA;IACtC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;CAC/D;AAED,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,cAAc,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACxE,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAA;IAClC,gEAAgE;IAChE,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAA;IACpC,mEAAmE;IACnE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAC3B;AAED,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,aAAa,CAgMrF"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTPS CONNECT Tunnel
|
|
3
|
+
*
|
|
4
|
+
* Attaches to an existing http.Server via the 'connect' event.
|
|
5
|
+
* Supports two modes:
|
|
6
|
+
* - forward: transparent TCP tunnel (HTTP CONNECT proxy)
|
|
7
|
+
* - mitm: TLS termination for inspection (MITM proxy)
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const tunnel = createConnectTunnel({ mode: 'forward' })
|
|
11
|
+
* tunnel.attachTo(httpServer)
|
|
12
|
+
*/
|
|
13
|
+
import { connect as netConnect } from 'node:net';
|
|
14
|
+
import { TLSSocket, connect as tlsConnect } from 'node:tls';
|
|
15
|
+
import { parseBasicProxyAuth, verifyProxyAuth, createProxyStats } from './utils/auth.js';
|
|
16
|
+
import { pipeBidirectional } from './utils/pipe.js';
|
|
17
|
+
import { generateCertificate, getDefaultCA } from '../utils/certs.js';
|
|
18
|
+
export function createConnectTunnel(options = {}) {
|
|
19
|
+
const { mode = 'forward', auth, connectTimeout = 10_000, ca: customCa, onConnect, onDisconnect, } = options;
|
|
20
|
+
const { mutable, snapshot } = createProxyStats();
|
|
21
|
+
const certCache = new Map();
|
|
22
|
+
// Pre-compute caCert for MITM mode
|
|
23
|
+
let caCertPem = null;
|
|
24
|
+
if (mode === 'mitm') {
|
|
25
|
+
const ca = customCa ?? getDefaultCA();
|
|
26
|
+
caCertPem = ca.cert;
|
|
27
|
+
}
|
|
28
|
+
async function handleConnect(req, clientSocket, head) {
|
|
29
|
+
const hostPort = req.url ?? ':443';
|
|
30
|
+
const colonIdx = hostPort.lastIndexOf(':');
|
|
31
|
+
const host = hostPort.slice(0, colonIdx);
|
|
32
|
+
const port = parseInt(hostPort.slice(colonIdx + 1) || '443', 10);
|
|
33
|
+
const clientAddress = clientSocket.remoteAddress ?? 'unknown';
|
|
34
|
+
// Auth check
|
|
35
|
+
const creds = parseBasicProxyAuth(req.headers['proxy-authorization']);
|
|
36
|
+
const authed = await verifyProxyAuth(auth, creds);
|
|
37
|
+
if (!authed) {
|
|
38
|
+
mutable.authFailures++;
|
|
39
|
+
clientSocket.write('HTTP/1.1 407 Proxy Authentication Required\r\nProxy-Authenticate: Basic realm="proxy"\r\n\r\n');
|
|
40
|
+
clientSocket.destroy();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
mutable.connectionsTotal++;
|
|
44
|
+
mutable.connectionsActive++;
|
|
45
|
+
const info = { host, port, clientAddress };
|
|
46
|
+
onConnect?.(info);
|
|
47
|
+
function onEnd(reason) {
|
|
48
|
+
mutable.connectionsActive--;
|
|
49
|
+
onDisconnect?.({ ...info, reason });
|
|
50
|
+
}
|
|
51
|
+
if (mode === 'forward') {
|
|
52
|
+
handleForward(host, port, clientSocket, head, onEnd);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
await handleMitm(host, port, clientSocket, head, onEnd);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function handleForward(host, port, clientSocket, head, onEnd) {
|
|
59
|
+
const upstream = netConnect({ host, port });
|
|
60
|
+
upstream.setTimeout(connectTimeout);
|
|
61
|
+
upstream.on('connect', () => {
|
|
62
|
+
upstream.setTimeout(0);
|
|
63
|
+
clientSocket.write('HTTP/1.1 200 Connection Established\r\n\r\n');
|
|
64
|
+
if (head.length > 0)
|
|
65
|
+
upstream.write(head);
|
|
66
|
+
pipeBidirectional(clientSocket, upstream, {
|
|
67
|
+
onStats: (s) => {
|
|
68
|
+
mutable.bytesFromClient += s.bytesFromA;
|
|
69
|
+
mutable.bytesToClient += s.bytesToA;
|
|
70
|
+
},
|
|
71
|
+
onEnd: () => onEnd('closed'),
|
|
72
|
+
onError: (err) => {
|
|
73
|
+
mutable.connectionsErrored++;
|
|
74
|
+
onEnd(err.message);
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
upstream.on('timeout', () => {
|
|
79
|
+
upstream.destroy(new Error('connect timeout'));
|
|
80
|
+
});
|
|
81
|
+
upstream.on('error', () => {
|
|
82
|
+
mutable.connectionsErrored++;
|
|
83
|
+
onEnd('upstream error');
|
|
84
|
+
if (!clientSocket.destroyed)
|
|
85
|
+
clientSocket.destroy();
|
|
86
|
+
});
|
|
87
|
+
clientSocket.on('error', () => {
|
|
88
|
+
upstream.destroy();
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
async function handleMitm(host, port, clientSocket, _head, onEnd) {
|
|
92
|
+
// Get or generate cert for this host
|
|
93
|
+
let certInfo = certCache.get(host);
|
|
94
|
+
if (!certInfo) {
|
|
95
|
+
const ca = customCa ?? getDefaultCA();
|
|
96
|
+
const generated = await generateCertificate(host, {
|
|
97
|
+
caKey: ca.key,
|
|
98
|
+
caCert: ca.cert,
|
|
99
|
+
});
|
|
100
|
+
certInfo = { key: generated.key, cert: generated.cert };
|
|
101
|
+
certCache.set(host, certInfo);
|
|
102
|
+
}
|
|
103
|
+
// Tell client tunnel is ready
|
|
104
|
+
clientSocket.write('HTTP/1.1 200 Connection Established\r\n\r\n');
|
|
105
|
+
// Wrap client socket in TLS (server side)
|
|
106
|
+
const tlsClient = new TLSSocket(clientSocket, {
|
|
107
|
+
isServer: true,
|
|
108
|
+
key: certInfo.key,
|
|
109
|
+
cert: certInfo.cert,
|
|
110
|
+
});
|
|
111
|
+
tlsClient.on('error', () => {
|
|
112
|
+
mutable.connectionsErrored++;
|
|
113
|
+
onEnd('tls client error');
|
|
114
|
+
});
|
|
115
|
+
// Connect to real upstream via TLS
|
|
116
|
+
const tlsUpstream = tlsConnect({
|
|
117
|
+
host,
|
|
118
|
+
port,
|
|
119
|
+
rejectUnauthorized: false,
|
|
120
|
+
timeout: connectTimeout,
|
|
121
|
+
});
|
|
122
|
+
tlsUpstream.on('secureConnect', () => {
|
|
123
|
+
pipeBidirectional(tlsClient, tlsUpstream, {
|
|
124
|
+
onStats: (s) => {
|
|
125
|
+
mutable.bytesFromClient += s.bytesFromA;
|
|
126
|
+
mutable.bytesToClient += s.bytesToA;
|
|
127
|
+
},
|
|
128
|
+
onEnd: () => onEnd('closed'),
|
|
129
|
+
onError: (err) => {
|
|
130
|
+
mutable.connectionsErrored++;
|
|
131
|
+
onEnd(err.message);
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
tlsUpstream.on('error', () => {
|
|
136
|
+
mutable.connectionsErrored++;
|
|
137
|
+
onEnd('upstream tls error');
|
|
138
|
+
tlsClient.destroy();
|
|
139
|
+
});
|
|
140
|
+
clientSocket.on('error', () => {
|
|
141
|
+
tlsUpstream.destroy();
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
const handler = (req, socket, head) => {
|
|
145
|
+
void handleConnect(req, socket, head);
|
|
146
|
+
};
|
|
147
|
+
return {
|
|
148
|
+
connectHandler: handler,
|
|
149
|
+
attachTo(server) {
|
|
150
|
+
server.on('connect', handler);
|
|
151
|
+
},
|
|
152
|
+
detachFrom(server) {
|
|
153
|
+
server.off('connect', handler);
|
|
154
|
+
},
|
|
155
|
+
get caCert() {
|
|
156
|
+
return caCertPem;
|
|
157
|
+
},
|
|
158
|
+
get stats() {
|
|
159
|
+
return snapshot();
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=connect-tunnel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect-tunnel.js","sourceRoot":"","sources":["../../src/proxy/connect-tunnel.ts"],"names":[],"mappings":"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"}
|