@lovrozagar/honey 0.6.8 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +514 -192
- package/bin/honey.js +25 -0
- package/dist/accepts.d.ts +7 -1
- package/dist/accepts.d.ts.map +1 -1
- package/dist/accepts.js +126 -0
- package/dist/accepts.js.map +1 -0
- package/dist/body-kind.d.ts +26 -0
- package/dist/body-kind.d.ts.map +1 -0
- package/dist/body-kind.js +70 -0
- package/dist/body-kind.js.map +1 -0
- package/dist/body-limit.d.ts +5 -1
- package/dist/body-limit.d.ts.map +1 -1
- package/dist/body-limit.js +126 -0
- package/dist/body-limit.js.map +1 -0
- package/dist/build/index.d.ts +19 -3
- package/dist/build/index.d.ts.map +1 -1
- package/dist/build/index.js +173 -0
- package/dist/build/index.js.map +1 -0
- package/dist/cli-args.d.ts +33 -0
- package/dist/cli-args.d.ts.map +1 -0
- package/dist/cli-args.js +102 -0
- package/dist/cli-args.js.map +1 -0
- package/dist/cli-go/auth.go +26 -0
- package/dist/cli-go/config.go +192 -0
- package/dist/cli-go/errors.go +75 -0
- package/dist/cli-go/multipart.go +79 -0
- package/dist/cli-go/output.go +163 -0
- package/dist/cli-go/root.go +30 -0
- package/dist/cli-go/stream.go +88 -0
- package/dist/cli-go/version.go +5 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +209 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/defaults.js +48 -0
- package/dist/client/defaults.js.map +1 -0
- package/dist/client/error.d.ts +35 -0
- package/dist/client/error.d.ts.map +1 -1
- package/dist/client/error.js +71 -0
- package/dist/client/error.js.map +1 -0
- package/dist/client/http.d.ts +67 -8
- package/dist/client/http.d.ts.map +1 -1
- package/dist/client/http.js +571 -0
- package/dist/client/http.js.map +1 -0
- package/dist/client/index.d.ts +3 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +95 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/path.d.ts +26 -0
- package/dist/client/path.d.ts.map +1 -0
- package/dist/client/path.js +163 -0
- package/dist/client/path.js.map +1 -0
- package/dist/client/redirect-policy.d.ts +12 -0
- package/dist/client/redirect-policy.d.ts.map +1 -0
- package/dist/client/redirect-policy.js +20 -0
- package/dist/client/redirect-policy.js.map +1 -0
- package/dist/client/sdk.d.ts +36 -0
- package/dist/client/sdk.d.ts.map +1 -1
- package/dist/client/sdk.js +292 -0
- package/dist/client/sdk.js.map +1 -0
- package/dist/client/sse.d.ts +13 -0
- package/dist/client/sse.d.ts.map +1 -1
- package/dist/client/sse.js +129 -0
- package/dist/client/sse.js.map +1 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client/ws.d.ts +9 -2
- package/dist/client/ws.d.ts.map +1 -1
- package/dist/client/ws.js +112 -0
- package/dist/client/ws.js.map +1 -0
- package/dist/client-go/errors.go +236 -0
- package/dist/client-go/export.go +44 -0
- package/dist/client-go/invalidation.go +371 -0
- package/dist/client-go/nullable.go +62 -0
- package/dist/client-go/realtime.go +354 -0
- package/dist/client-go/result.go +20 -0
- package/dist/client-go/runtime.go +975 -0
- package/dist/client-go/sse.go +159 -0
- package/dist/client-go/transport.go +495 -0
- package/dist/client-go/ws.go +128 -0
- package/dist/client-info.d.ts +36 -0
- package/dist/client-info.d.ts.map +1 -0
- package/dist/client-info.js +53 -0
- package/dist/client-info.js.map +1 -0
- package/dist/client-mcp/README.md +10 -0
- package/dist/client-mcp/server.ts +221 -0
- package/dist/client-mcp/types.ts +19 -0
- package/dist/client-python/_errors.py +115 -0
- package/dist/client-python/_invalidation.py +494 -0
- package/dist/client-python/_realtime.py +179 -0
- package/dist/client-python/_runtime.py +860 -0
- package/dist/client-python/_sse.py +155 -0
- package/dist/client-python/_transport.py +366 -0
- package/dist/client-python/_ws.py +159 -0
- package/dist/client-python/py.typed +0 -0
- package/dist/client-rust/errors.rs +220 -0
- package/dist/client-rust/invalidation.rs +412 -0
- package/dist/client-rust/invalidation_sync.rs +93 -0
- package/dist/client-rust/nullable.rs +17 -0
- package/dist/client-rust/realtime.rs +702 -0
- package/dist/client-rust/result.rs +22 -0
- package/dist/client-rust/runtime.rs +980 -0
- package/dist/client-rust/runtime_sync.rs +484 -0
- package/dist/client-rust/sse.rs +188 -0
- package/dist/client-rust/ws.rs +167 -0
- package/dist/codegen-go-cli.d.ts.map +1 -1
- package/dist/codegen-go-cli.js +964 -0
- package/dist/codegen-go-cli.js.map +1 -0
- package/dist/codegen-go.d.ts +15 -3
- package/dist/codegen-go.d.ts.map +1 -1
- package/dist/codegen-go.js +872 -0
- package/dist/codegen-go.js.map +1 -0
- package/dist/codegen-hash.js +9 -0
- package/dist/codegen-hash.js.map +1 -0
- package/dist/codegen-ir.d.ts +69 -2
- package/dist/codegen-ir.d.ts.map +1 -1
- package/dist/codegen-ir.js +661 -0
- package/dist/codegen-ir.js.map +1 -0
- package/dist/codegen-lang.d.ts +65 -0
- package/dist/codegen-lang.d.ts.map +1 -0
- package/dist/codegen-lang.js +526 -0
- package/dist/codegen-lang.js.map +1 -0
- package/dist/codegen-load.d.ts +31 -0
- package/dist/codegen-load.d.ts.map +1 -0
- package/dist/codegen-load.js +138 -0
- package/dist/codegen-load.js.map +1 -0
- package/dist/codegen-loaders.js +55 -0
- package/dist/codegen-loaders.js.map +1 -0
- package/dist/codegen-mcp.d.ts.map +1 -1
- package/dist/codegen-mcp.js +368 -0
- package/dist/codegen-mcp.js.map +1 -0
- package/dist/codegen-python.d.ts +13 -1
- package/dist/codegen-python.d.ts.map +1 -1
- package/dist/codegen-python.js +828 -0
- package/dist/codegen-python.js.map +1 -0
- package/dist/codegen-route-tree-intern.d.ts +15 -5
- package/dist/codegen-route-tree-intern.d.ts.map +1 -1
- package/dist/codegen-route-tree-intern.js +221 -0
- package/dist/codegen-route-tree-intern.js.map +1 -0
- package/dist/codegen-rust.d.ts.map +1 -1
- package/dist/codegen-rust.js +1293 -0
- package/dist/codegen-rust.js.map +1 -0
- package/dist/codegen-sanitize.d.ts.map +1 -1
- package/dist/codegen-sanitize.js +56 -0
- package/dist/codegen-sanitize.js.map +1 -0
- package/dist/codegen-schema-naming.d.ts +5 -0
- package/dist/codegen-schema-naming.d.ts.map +1 -1
- package/dist/codegen-schema-naming.js +150 -0
- package/dist/codegen-schema-naming.js.map +1 -0
- package/dist/codegen-sdk-model.d.ts +71 -0
- package/dist/codegen-sdk-model.d.ts.map +1 -0
- package/dist/codegen-sdk-model.js +179 -0
- package/dist/codegen-sdk-model.js.map +1 -0
- package/dist/codegen.d.ts +41 -23
- package/dist/codegen.d.ts.map +1 -1
- package/dist/codegen.js +4610 -0
- package/dist/codegen.js.map +1 -0
- package/dist/context.d.ts +36 -6
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +242 -0
- package/dist/context.js.map +1 -0
- package/dist/cookie-sign.d.ts +16 -2
- package/dist/cookie-sign.d.ts.map +1 -1
- package/dist/cookie-sign.js +104 -0
- package/dist/cookie-sign.js.map +1 -0
- package/dist/cookie.d.ts +12 -0
- package/dist/cookie.d.ts.map +1 -1
- package/dist/cookie.js +138 -0
- package/dist/cookie.js.map +1 -0
- package/dist/cors.d.ts +1 -0
- package/dist/cors.d.ts.map +1 -1
- package/dist/cors.js +87 -0
- package/dist/cors.js.map +1 -0
- package/dist/crypto.d.ts +6 -1
- package/dist/crypto.d.ts.map +1 -1
- package/dist/crypto.js +38 -0
- package/dist/crypto.js.map +1 -0
- package/dist/csrf.d.ts +19 -0
- package/dist/csrf.d.ts.map +1 -1
- package/dist/csrf.js +79 -0
- package/dist/csrf.js.map +1 -0
- package/dist/curl-logger.d.ts +14 -3
- package/dist/curl-logger.d.ts.map +1 -1
- package/dist/curl-logger.js +199 -0
- package/dist/curl-logger.js.map +1 -0
- package/dist/detect-runtime.js +13 -0
- package/dist/detect-runtime.js.map +1 -0
- package/dist/dict.d.ts +11 -0
- package/dist/dict.d.ts.map +1 -0
- package/dist/dict.js +13 -0
- package/dist/dict.js.map +1 -0
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +44 -0
- package/dist/error.js.map +1 -0
- package/dist/errors.js +39 -0
- package/dist/errors.js.map +1 -0
- package/dist/etag.d.ts +2 -0
- package/dist/etag.d.ts.map +1 -1
- package/dist/etag.js +82 -0
- package/dist/etag.js.map +1 -0
- package/dist/feature-detect.d.ts +25 -0
- package/dist/feature-detect.d.ts.map +1 -0
- package/dist/feature-detect.js +144 -0
- package/dist/feature-detect.js.map +1 -0
- package/dist/feature-load.js +36 -0
- package/dist/feature-load.js.map +1 -0
- package/dist/feature-slots.d.ts +44 -0
- package/dist/feature-slots.d.ts.map +1 -0
- package/dist/feature-slots.js +48 -0
- package/dist/feature-slots.js.map +1 -0
- package/dist/fetch-request.d.ts +10 -0
- package/dist/fetch-request.d.ts.map +1 -0
- package/dist/fetch-request.js +13 -0
- package/dist/fetch-request.js.map +1 -0
- package/dist/gen-process.d.ts +15 -0
- package/dist/gen-process.d.ts.map +1 -0
- package/dist/gen-process.js +43 -0
- package/dist/gen-process.js.map +1 -0
- package/dist/gen-write.d.ts +19 -0
- package/dist/gen-write.d.ts.map +1 -0
- package/dist/gen-write.js +120 -0
- package/dist/gen-write.js.map +1 -0
- package/dist/glob.d.ts +21 -0
- package/dist/glob.d.ts.map +1 -0
- package/dist/glob.js +115 -0
- package/dist/glob.js.map +1 -0
- package/dist/go-type-emitter.d.ts +18 -4
- package/dist/go-type-emitter.d.ts.map +1 -1
- package/dist/go-type-emitter.js +594 -0
- package/dist/go-type-emitter.js.map +1 -0
- package/dist/honey-response.d.ts.map +1 -1
- package/dist/honey-response.js +338 -0
- package/dist/honey-response.js.map +1 -0
- package/dist/i18n-slot.d.ts +8 -0
- package/dist/i18n-slot.d.ts.map +1 -1
- package/dist/i18n-slot.js +14 -0
- package/dist/i18n-slot.js.map +1 -0
- package/dist/i18n.d.ts +3 -0
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +250 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +408 -148
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2324 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +3 -5
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +140 -0
- package/dist/init.js.map +1 -0
- package/dist/input.js +4 -0
- package/dist/input.js.map +1 -0
- package/dist/invalidate-check.d.ts +11 -0
- package/dist/invalidate-check.d.ts.map +1 -1
- package/dist/invalidate-check.js +163 -0
- package/dist/invalidate-check.js.map +1 -0
- package/dist/invoke-user.d.ts +35 -0
- package/dist/invoke-user.d.ts.map +1 -0
- package/dist/invoke-user.js +73 -0
- package/dist/invoke-user.js.map +1 -0
- package/dist/ip-restrict.d.ts +13 -1
- package/dist/ip-restrict.d.ts.map +1 -1
- package/dist/ip-restrict.js +60 -0
- package/dist/ip-restrict.js.map +1 -0
- package/dist/ip.d.ts +39 -0
- package/dist/ip.d.ts.map +1 -0
- package/dist/ip.js +209 -0
- package/dist/ip.js.map +1 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +113 -0
- package/dist/logger.js.map +1 -0
- package/dist/media-type.d.ts +30 -0
- package/dist/media-type.d.ts.map +1 -0
- package/dist/media-type.js +97 -0
- package/dist/media-type.js.map +1 -0
- package/dist/meta-spec-merge.d.ts +32 -0
- package/dist/meta-spec-merge.d.ts.map +1 -0
- package/dist/meta-spec-merge.js +68 -0
- package/dist/meta-spec-merge.js.map +1 -0
- package/dist/meta-spec.d.ts +16 -3
- package/dist/meta-spec.d.ts.map +1 -1
- package/dist/meta-spec.js +535 -0
- package/dist/meta-spec.js.map +1 -0
- package/dist/middleware.d.ts +23 -6
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +253 -0
- package/dist/middleware.js.map +1 -0
- package/dist/node-request.d.ts +57 -12
- package/dist/node-request.d.ts.map +1 -1
- package/dist/node-request.js +407 -0
- package/dist/node-request.js.map +1 -0
- package/dist/node.d.ts +20 -3
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +396 -0
- package/dist/node.js.map +1 -0
- package/dist/openapi/collect.d.ts +6 -3
- package/dist/openapi/collect.d.ts.map +1 -1
- package/dist/openapi/collect.js +30 -0
- package/dist/openapi/collect.js.map +1 -0
- package/dist/openapi/docs-page.d.ts +42 -0
- package/dist/openapi/docs-page.d.ts.map +1 -0
- package/dist/openapi/docs-page.js +80 -0
- package/dist/openapi/docs-page.js.map +1 -0
- package/dist/openapi/document.d.ts +4 -0
- package/dist/openapi/document.d.ts.map +1 -1
- package/dist/openapi/document.js +785 -0
- package/dist/openapi/document.js.map +1 -0
- package/dist/openapi/json-schema-slot.d.ts +7 -0
- package/dist/openapi/json-schema-slot.d.ts.map +1 -1
- package/dist/openapi/json-schema-slot.js +38 -0
- package/dist/openapi/json-schema-slot.js.map +1 -0
- package/dist/openapi/register.d.ts.map +1 -1
- package/dist/openapi/register.js +20 -0
- package/dist/openapi/register.js.map +1 -0
- package/dist/openapi/scalar.d.ts +3 -1
- package/dist/openapi/scalar.d.ts.map +1 -1
- package/dist/openapi/scalar.js +21 -0
- package/dist/openapi/scalar.js.map +1 -0
- package/dist/openapi/serve.d.ts +9 -0
- package/dist/openapi/serve.d.ts.map +1 -0
- package/dist/openapi/serve.js +36 -0
- package/dist/openapi/serve.js.map +1 -0
- package/dist/openapi/spec-factory.d.ts +30 -1
- package/dist/openapi/spec-factory.d.ts.map +1 -1
- package/dist/openapi/spec-factory.js +52 -0
- package/dist/openapi/spec-factory.js.map +1 -0
- package/dist/openapi/spec.d.ts +14 -5
- package/dist/openapi/spec.d.ts.map +1 -1
- package/dist/openapi/spec.js +50 -0
- package/dist/openapi/spec.js.map +1 -0
- package/dist/openapi/swagger.d.ts +3 -1
- package/dist/openapi/swagger.d.ts.map +1 -1
- package/dist/openapi/swagger.js +22 -0
- package/dist/openapi/swagger.js.map +1 -0
- package/dist/pattern.d.ts +71 -0
- package/dist/pattern.d.ts.map +1 -0
- package/dist/pattern.js +239 -0
- package/dist/pattern.js.map +1 -0
- package/dist/peer.d.ts +17 -0
- package/dist/peer.d.ts.map +1 -0
- package/dist/peer.js +50 -0
- package/dist/peer.js.map +1 -0
- package/dist/plugin.d.ts +67 -16
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +649 -0
- package/dist/plugin.js.map +1 -0
- package/dist/powered-by.d.ts.map +1 -1
- package/dist/powered-by.js +11 -0
- package/dist/powered-by.js.map +1 -0
- package/dist/pretty-json.d.ts.map +1 -1
- package/dist/pretty-json.js +47 -0
- package/dist/pretty-json.js.map +1 -0
- package/dist/producer-stream.d.ts +47 -0
- package/dist/producer-stream.d.ts.map +1 -0
- package/dist/producer-stream.js +267 -0
- package/dist/producer-stream.js.map +1 -0
- package/dist/proxy.d.ts +47 -8
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +274 -0
- package/dist/proxy.js.map +1 -0
- package/dist/python-type-emitter.d.ts +14 -1
- package/dist/python-type-emitter.d.ts.map +1 -1
- package/dist/python-type-emitter.js +157 -0
- package/dist/python-type-emitter.js.map +1 -0
- package/dist/realtime/bus.d.ts +17 -1
- package/dist/realtime/bus.d.ts.map +1 -1
- package/dist/realtime/bus.js +112 -0
- package/dist/realtime/bus.js.map +1 -0
- package/dist/realtime/register.d.ts +3 -0
- package/dist/realtime/register.d.ts.map +1 -0
- package/dist/realtime/register.js +10 -0
- package/dist/realtime/register.js.map +1 -0
- package/dist/realtime/route.d.ts +65 -26
- package/dist/realtime/route.d.ts.map +1 -1
- package/dist/realtime/route.js +72 -0
- package/dist/realtime/route.js.map +1 -0
- package/dist/realtime/server.d.ts +43 -0
- package/dist/realtime/server.d.ts.map +1 -0
- package/dist/realtime/server.js +255 -0
- package/dist/realtime/server.js.map +1 -0
- package/dist/request-id.d.ts +7 -0
- package/dist/request-id.d.ts.map +1 -1
- package/dist/request-id.js +16 -0
- package/dist/request-id.js.map +1 -0
- package/dist/request-limits.d.ts +3 -0
- package/dist/request-limits.d.ts.map +1 -0
- package/dist/request-limits.js +3 -0
- package/dist/request-limits.js.map +1 -0
- package/dist/request-path.d.ts +33 -0
- package/dist/request-path.d.ts.map +1 -0
- package/dist/request-path.js +178 -0
- package/dist/request-path.js.map +1 -0
- package/dist/request-to-curl.d.ts +7 -1
- package/dist/request-to-curl.d.ts.map +1 -1
- package/dist/request-to-curl.js +48 -0
- package/dist/request-to-curl.js.map +1 -0
- package/dist/response.d.ts +25 -2
- package/dist/response.d.ts.map +1 -1
- package/dist/response.js +313 -0
- package/dist/response.js.map +1 -0
- package/dist/rust-type-emitter.d.ts +14 -2
- package/dist/rust-type-emitter.d.ts.map +1 -1
- package/dist/rust-type-emitter.js +463 -0
- package/dist/rust-type-emitter.js.map +1 -0
- package/dist/secure-headers.d.ts.map +1 -1
- package/dist/secure-headers.js +53 -0
- package/dist/secure-headers.js.map +1 -0
- package/dist/serve-register.d.ts +4 -0
- package/dist/serve-register.d.ts.map +1 -1
- package/dist/serve-register.js +9 -0
- package/dist/serve-register.js.map +1 -0
- package/dist/serve-slot.d.ts +3 -0
- package/dist/serve-slot.d.ts.map +1 -1
- package/dist/serve-slot.js +52 -0
- package/dist/serve-slot.js.map +1 -0
- package/dist/serve.d.ts +18 -1
- package/dist/serve.d.ts.map +1 -1
- package/dist/serve.js +157 -0
- package/dist/serve.js.map +1 -0
- package/dist/server-timing.d.ts.map +1 -1
- package/dist/server-timing.js +51 -0
- package/dist/server-timing.js.map +1 -0
- package/dist/static.d.ts +9 -0
- package/dist/static.d.ts.map +1 -1
- package/dist/static.js +102 -0
- package/dist/static.js.map +1 -0
- package/dist/telemetry/otel.d.ts +2 -0
- package/dist/telemetry/otel.d.ts.map +1 -1
- package/dist/telemetry/otel.js +135 -0
- package/dist/telemetry/otel.js.map +1 -0
- package/dist/testing.d.ts +12 -0
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +124 -0
- package/dist/testing.js.map +1 -0
- package/dist/timeout.d.ts +6 -0
- package/dist/timeout.d.ts.map +1 -1
- package/dist/timeout.js +36 -0
- package/dist/timeout.js.map +1 -0
- package/dist/tree.d.ts +133 -36
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +437 -0
- package/dist/tree.js.map +1 -0
- package/dist/trust.d.ts +21 -0
- package/dist/trust.d.ts.map +1 -0
- package/dist/trust.js +100 -0
- package/dist/trust.js.map +1 -0
- package/dist/ts-type-emitter.d.ts.map +1 -1
- package/dist/ts-type-emitter.js +150 -0
- package/dist/ts-type-emitter.js.map +1 -0
- package/dist/type-emitter.d.ts +16 -2
- package/dist/type-emitter.d.ts.map +1 -1
- package/dist/type-emitter.js +729 -0
- package/dist/type-emitter.js.map +1 -0
- package/dist/type-extractor.d.ts +8 -4
- package/dist/type-extractor.d.ts.map +1 -1
- package/dist/type-extractor.js +776 -0
- package/dist/type-extractor.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +96 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +14 -2
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +335 -0
- package/dist/validation.js.map +1 -0
- package/dist/with-headers.d.ts +15 -0
- package/dist/with-headers.d.ts.map +1 -0
- package/dist/with-headers.js +45 -0
- package/dist/with-headers.js.map +1 -0
- package/dist/ws/bun.d.ts +11 -5
- package/dist/ws/bun.d.ts.map +1 -1
- package/dist/ws/bun.js +82 -0
- package/dist/ws/bun.js.map +1 -0
- package/dist/ws/cloudflare.d.ts +25 -3
- package/dist/ws/cloudflare.d.ts.map +1 -1
- package/dist/ws/cloudflare.js +117 -0
- package/dist/ws/cloudflare.js.map +1 -0
- package/dist/ws/deno.d.ts +4 -4
- package/dist/ws/deno.d.ts.map +1 -1
- package/dist/ws/deno.js +133 -0
- package/dist/ws/deno.js.map +1 -0
- package/dist/ws/node.d.ts +20 -3
- package/dist/ws/node.d.ts.map +1 -1
- package/dist/ws/node.js +173 -0
- package/dist/ws/node.js.map +1 -0
- package/dist/ws/session.d.ts +11 -0
- package/dist/ws/session.d.ts.map +1 -0
- package/dist/ws/session.js +60 -0
- package/dist/ws/session.js.map +1 -0
- package/dist/ws/shared.d.ts +65 -0
- package/dist/ws/shared.d.ts.map +1 -0
- package/dist/ws/shared.js +103 -0
- package/dist/ws/shared.js.map +1 -0
- package/dist/ws-origin.d.ts +20 -0
- package/dist/ws-origin.d.ts.map +1 -0
- package/dist/ws-origin.js +41 -0
- package/dist/ws-origin.js.map +1 -0
- package/dist/yaml.d.ts +15 -1
- package/dist/yaml.d.ts.map +1 -1
- package/dist/yaml.js +101 -0
- package/dist/yaml.js.map +1 -0
- package/docs/invalidate-spec.md +13 -1
- package/docs/meta-spec.md +36 -12
- package/docs/packaging.md +43 -24
- package/docs/regression-matrix/README.md +32 -0
- package/docs/regression-matrix/review.md +44 -0
- package/docs/regression-matrix/ws1-3.md +97 -0
- package/docs/regression-matrix/ws4-8.md +107 -0
- package/docs/regression-matrix/ws9-12.md +266 -0
- package/docs/sdk.md +102 -52
- package/package.json +183 -52
- package/src/accepts.ts +91 -33
- package/src/body-kind.ts +67 -0
- package/src/body-limit.ts +102 -87
- package/src/build/index.ts +104 -54
- package/src/cli-args.ts +123 -0
- package/src/cli-go/auth.go +12 -1
- package/src/cli-go/config.go +29 -2
- package/src/cli-go/errors.go +28 -10
- package/src/cli-go/multipart.go +51 -27
- package/src/cli-go/output.go +58 -4
- package/src/cli-go/root.go +1 -1
- package/src/cli-go/version.go +2 -2
- package/src/cli.ts +154 -148
- package/src/client/error.ts +56 -1
- package/src/client/http.ts +479 -256
- package/src/client/index.ts +55 -17
- package/src/client/path.ts +169 -0
- package/src/client/redirect-policy.ts +19 -0
- package/src/client/sdk.ts +180 -101
- package/src/client/sse.ts +92 -66
- package/src/client/ws.ts +67 -31
- package/src/client-go/errors.go +41 -12
- package/src/client-go/export.go +44 -0
- package/src/client-go/invalidation.go +52 -54
- package/src/client-go/nullable.go +62 -0
- package/src/client-go/realtime.go +147 -110
- package/src/client-go/runtime.go +646 -88
- package/src/client-go/sse.go +104 -94
- package/src/client-go/transport.go +67 -27
- package/src/client-go/ws.go +49 -25
- package/src/client-info.ts +79 -0
- package/src/client-mcp/server.ts +133 -3
- package/src/client-python/_invalidation.py +207 -291
- package/src/client-python/_realtime.py +63 -40
- package/src/client-python/_runtime.py +501 -119
- package/src/client-python/_sse.py +130 -74
- package/src/client-python/_transport.py +37 -9
- package/src/client-python/_ws.py +50 -22
- package/src/client-rust/errors.rs +21 -1
- package/src/client-rust/invalidation.rs +202 -231
- package/src/client-rust/invalidation_sync.rs +16 -229
- package/src/client-rust/nullable.rs +17 -0
- package/src/client-rust/realtime.rs +217 -217
- package/src/client-rust/runtime.rs +602 -177
- package/src/client-rust/runtime_sync.rs +169 -145
- package/src/client-rust/sse.rs +142 -121
- package/src/client-rust/ws.rs +61 -37
- package/src/codegen-go-cli.ts +607 -728
- package/src/codegen-go.ts +710 -770
- package/src/codegen-ir.ts +381 -75
- package/src/codegen-lang.ts +517 -0
- package/src/codegen-load.ts +150 -0
- package/src/codegen-mcp.ts +207 -108
- package/src/codegen-python.ts +684 -816
- package/src/codegen-route-tree-intern.ts +51 -25
- package/src/codegen-rust.ts +946 -1240
- package/src/codegen-sanitize.ts +0 -4
- package/src/codegen-schema-naming.ts +19 -6
- package/src/codegen-sdk-model.ts +228 -0
- package/src/codegen.ts +1488 -1140
- package/src/context.ts +130 -11
- package/src/cookie-sign.ts +85 -16
- package/src/cookie.ts +66 -11
- package/src/cors.ts +55 -54
- package/src/crypto.ts +27 -5
- package/src/csrf.ts +57 -25
- package/src/curl-logger.ts +155 -114
- package/src/dict.ts +12 -0
- package/src/error.ts +4 -2
- package/src/etag.ts +58 -34
- package/src/feature-detect.ts +147 -0
- package/src/feature-slots.ts +70 -0
- package/src/fetch-request.ts +13 -0
- package/src/gen-process.ts +42 -0
- package/src/gen-write.ts +127 -0
- package/src/glob.ts +109 -0
- package/src/go-type-emitter.ts +406 -155
- package/src/honey-response.ts +36 -9
- package/src/i18n-slot.ts +10 -0
- package/src/i18n.ts +98 -23
- package/src/index.ts +1887 -1756
- package/src/init.ts +40 -28
- package/src/invalidate-check.ts +42 -4
- package/src/invoke-user.ts +95 -0
- package/src/ip-restrict.ts +47 -161
- package/src/ip.ts +194 -0
- package/src/logger.ts +65 -36
- package/src/media-type.ts +104 -0
- package/src/meta-spec-merge.ts +80 -0
- package/src/meta-spec.ts +0 -0
- package/src/middleware.ts +112 -12
- package/src/node-request.ts +242 -52
- package/src/node.ts +318 -75
- package/src/openapi/collect.ts +19 -44
- package/src/openapi/docs-page.ts +89 -0
- package/src/openapi/document.ts +503 -224
- package/src/openapi/json-schema-slot.ts +40 -0
- package/src/openapi/register.ts +7 -2
- package/src/openapi/scalar.ts +11 -10
- package/src/openapi/serve.ts +39 -0
- package/src/openapi/spec-factory.ts +50 -1
- package/src/openapi/spec.ts +53 -30
- package/src/openapi/swagger.ts +12 -11
- package/src/pattern.ts +245 -0
- package/src/peer.ts +53 -0
- package/src/plugin.ts +270 -185
- package/src/powered-by.ts +2 -2
- package/src/pretty-json.ts +25 -9
- package/src/producer-stream.ts +296 -0
- package/src/proxy.ts +253 -55
- package/src/python-type-emitter.ts +68 -56
- package/src/realtime/bus.ts +56 -9
- package/src/realtime/register.ts +13 -0
- package/src/realtime/route.ts +129 -80
- package/src/realtime/server.ts +298 -0
- package/src/request-id.ts +13 -3
- package/src/request-limits.ts +2 -0
- package/src/request-path.ts +165 -0
- package/src/request-to-curl.ts +28 -7
- package/src/response.ts +143 -103
- package/src/rust-type-emitter.ts +265 -170
- package/src/secure-headers.ts +8 -4
- package/src/serve-register.ts +4 -0
- package/src/serve-slot.ts +38 -0
- package/src/serve.ts +113 -25
- package/src/server-timing.ts +11 -7
- package/src/static.ts +85 -32
- package/src/telemetry/otel.ts +29 -7
- package/src/testing.ts +76 -14
- package/src/timeout.ts +15 -7
- package/src/tree.ts +405 -333
- package/src/trust.ts +117 -0
- package/src/ts-type-emitter.ts +18 -12
- package/src/type-emitter.ts +227 -89
- package/src/type-extractor.ts +562 -424
- package/src/types.ts +8 -0
- package/src/validation.ts +221 -96
- package/src/with-headers.ts +45 -0
- package/src/ws/bun.ts +53 -15
- package/src/ws/cloudflare.ts +81 -19
- package/src/ws/deno.ts +124 -36
- package/src/ws/node.ts +173 -79
- package/src/ws/session.ts +73 -0
- package/src/ws/shared.ts +140 -0
- package/src/ws-origin.ts +53 -0
- package/src/yaml.ts +45 -22
- package/dist/client-mcp/server.d.ts +0 -10
- package/dist/client-mcp/server.d.ts.map +0 -1
- package/dist/client-mcp/types.d.ts +0 -16
- package/dist/client-mcp/types.d.ts.map +0 -1
- package/dist/cloudflare/realtime.d.ts +0 -30
- package/dist/cloudflare/realtime.d.ts.map +0 -1
- package/dist/realtime/buffer.d.ts +0 -18
- package/dist/realtime/buffer.d.ts.map +0 -1
- package/dist/realtime/longpoll.d.ts +0 -23
- package/dist/realtime/longpoll.d.ts.map +0 -1
- package/dist/realtime/protocol.d.ts +0 -50
- package/dist/realtime/protocol.d.ts.map +0 -1
- package/dist/realtime/runtime.d.ts +0 -74
- package/dist/realtime/runtime.d.ts.map +0 -1
- package/src/cloudflare/realtime.ts +0 -234
- package/src/realtime/buffer.ts +0 -101
- package/src/realtime/longpoll.ts +0 -148
- package/src/realtime/protocol.ts +0 -128
- package/src/realtime/runtime.ts +0 -427
package/src/node-request.ts
CHANGED
|
@@ -1,10 +1,34 @@
|
|
|
1
1
|
import type { IncomingMessage } from "node:http"
|
|
2
2
|
import { Readable } from "node:stream"
|
|
3
|
+
import { HoneyError } from "./error.ts"
|
|
4
|
+
import { TO_FETCH_REQUEST } from "./fetch-request.ts"
|
|
3
5
|
import { NODE_OUTBOUND } from "./honey-response.ts"
|
|
6
|
+
import { PEER_ADDRESS } from "./peer.ts"
|
|
7
|
+
import { isValidHost } from "./client-info.ts"
|
|
8
|
+
import { EK, SK } from "./types.ts"
|
|
4
9
|
|
|
5
10
|
/** bodyLimit uses this to swap the inbound stream without `new Request(req)`. */
|
|
6
11
|
export const REPLACE_BODY = Symbol.for("honey.replaceBody")
|
|
7
12
|
|
|
13
|
+
/** The Node adapter calls this when the response closes before it finished (client disconnect, shutdown). */
|
|
14
|
+
export const ABORT_REQUEST = Symbol.for("honey.abortRequest")
|
|
15
|
+
|
|
16
|
+
/** True once a body read went over the adapter's `maxRequestBodySize`: the connection must not be reused. */
|
|
17
|
+
export const BODY_OVERFLOW = Symbol.for("honey.bodyOverflow")
|
|
18
|
+
|
|
19
|
+
export { DEFAULT_MAX_REQUEST_BODY } from "./request-limits.ts"
|
|
20
|
+
|
|
21
|
+
export type NodeRequestOptions = {
|
|
22
|
+
/** Where the body bytes come from when not the IncomingMessage itself (an upgrade socket on old Node). */
|
|
23
|
+
bodySource?: AsyncIterable<Buffer | string> | null
|
|
24
|
+
/** Largest body a read accepts, in bytes; over it the read throws a 413 `HoneyError`. `0` disables. */
|
|
25
|
+
maxBodySize?: number
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function tooLarge(): HoneyError {
|
|
29
|
+
return new HoneyError({ errorKey: EK.content_too_large, status: SK.content_too_large })
|
|
30
|
+
}
|
|
31
|
+
|
|
8
32
|
/**
|
|
9
33
|
* Headers view over IncomingMessage. `get`/`has` read Node's already-parsed
|
|
10
34
|
* map. A real `Headers` is built only if something iterates or mutates.
|
|
@@ -25,11 +49,27 @@ export class NodeHeaders {
|
|
|
25
49
|
this.#ensureNative().delete(name)
|
|
26
50
|
}
|
|
27
51
|
|
|
52
|
+
/**
|
|
53
|
+
* Every value of the header, joined the way Fetch joins them. Node's `headers` map keeps only
|
|
54
|
+
* the first `Authorization`, `Host`, … and drops the rest; `headersDistinct` keeps them all,
|
|
55
|
+
* so the answer is the same before and after something iterates the headers.
|
|
56
|
+
*/
|
|
28
57
|
get(name: string): string | null {
|
|
29
58
|
if (this.#native) return this.#native.get(name)
|
|
30
|
-
const
|
|
59
|
+
const key = name.toLowerCase()
|
|
60
|
+
/* `headersDistinct` is a lazy getter on a real IncomingMessage; a plain stand-in has only `headers` */
|
|
61
|
+
const all = this.#incoming.headersDistinct as NodeJS.Dict<string[]> | undefined
|
|
62
|
+
if (all === undefined) {
|
|
63
|
+
const headers = this.#incoming.headers
|
|
64
|
+
if (!Object.hasOwn(headers, key)) return null
|
|
65
|
+
const one = headers[key]
|
|
66
|
+
if (one === undefined) return null
|
|
67
|
+
return Array.isArray(one) ? one.join(", ") : one
|
|
68
|
+
}
|
|
69
|
+
if (!Object.hasOwn(all, key)) return null
|
|
70
|
+
const raw = all[key]
|
|
31
71
|
if (raw === undefined) return null
|
|
32
|
-
return
|
|
72
|
+
return raw.length === 1 ? raw[0] : raw.join(", ")
|
|
33
73
|
}
|
|
34
74
|
|
|
35
75
|
getSetCookie(): string[] {
|
|
@@ -38,7 +78,9 @@ export class NodeHeaders {
|
|
|
38
78
|
|
|
39
79
|
has(name: string): boolean {
|
|
40
80
|
if (this.#native) return this.#native.has(name)
|
|
41
|
-
|
|
81
|
+
const key = name.toLowerCase()
|
|
82
|
+
const headers = this.#incoming.headers
|
|
83
|
+
return Object.hasOwn(headers, key) && headers[key] !== undefined
|
|
42
84
|
}
|
|
43
85
|
|
|
44
86
|
set(name: string, value: string): void {
|
|
@@ -83,60 +125,216 @@ export class NodeHeaders {
|
|
|
83
125
|
}
|
|
84
126
|
}
|
|
85
127
|
|
|
128
|
+
/** Printable ASCII with no `\`, no dot segment, no `%2e`: what a WHATWG URL parse would leave as it is. */
|
|
129
|
+
function isPlainTarget(target: string): boolean {
|
|
130
|
+
if (target.charCodeAt(0) !== 47) return false
|
|
131
|
+
for (let i = 0; i < target.length; i++) {
|
|
132
|
+
const c = target.charCodeAt(i)
|
|
133
|
+
if (c <= 0x20 || c >= 0x7f || c === 92 /* \ */) return false
|
|
134
|
+
if (c === 47 && target.charCodeAt(i + 1) === 46) return false
|
|
135
|
+
if (c === 37 && target.charCodeAt(i + 1) === 50 && (target.charCodeAt(i + 2) | 0x20) === 101) return false
|
|
136
|
+
}
|
|
137
|
+
return true
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* The request URL from what the client actually sent: scheme from the socket (TLS or not),
|
|
142
|
+
* authority from `Host` (or from an absolute-form target, which takes precedence per RFC 9112),
|
|
143
|
+
* path and query from the request target. Anything but an origin-form (`/path`) or http(s)
|
|
144
|
+
* absolute-form target, and any `Host` that is not `host[:port]`, returns `null`: the request
|
|
145
|
+
* gets 400. A target that needs it is parsed the way `new URL()` parses it, so the path matches
|
|
146
|
+
* what Bun, Deno and Workers hand the app for the same bytes.
|
|
147
|
+
*/
|
|
148
|
+
export function nodeRequestUrl(incoming: IncomingMessage): string | null {
|
|
149
|
+
const scheme = (incoming.socket as { encrypted?: boolean } | null)?.encrypted === true ? "https" : "http"
|
|
150
|
+
const target = incoming.url ?? "/"
|
|
151
|
+
const hostHeader = incoming.headers.host
|
|
152
|
+
if (target.charCodeAt(0) !== 47) {
|
|
153
|
+
/* absolute-form: http://host/path */
|
|
154
|
+
const lower = target.slice(0, 8).toLowerCase()
|
|
155
|
+
if (!lower.startsWith("http://") && !lower.startsWith("https://")) return null
|
|
156
|
+
let url: URL
|
|
157
|
+
try {
|
|
158
|
+
url = new URL(target)
|
|
159
|
+
} catch {
|
|
160
|
+
return null
|
|
161
|
+
}
|
|
162
|
+
if (url.username !== "" || url.password !== "" || !isValidHost(url.host)) return null
|
|
163
|
+
return `${scheme}://${url.host}${url.pathname}${url.search}`
|
|
164
|
+
}
|
|
165
|
+
const host =
|
|
166
|
+
hostHeader === undefined || hostHeader === "" ? (incoming.httpVersion === "1.0" ? "localhost" : null) : hostHeader
|
|
167
|
+
if (host === null || !isValidHost(host)) return null
|
|
168
|
+
if (isPlainTarget(target)) return `${scheme}://${host}${target}`
|
|
169
|
+
try {
|
|
170
|
+
/* never `new URL(target, base)`: a `//x/y` target would become a host */
|
|
171
|
+
const url = new URL(`${scheme}://${host}${target}`)
|
|
172
|
+
return `${scheme}://${host}${url.pathname}${url.search}`
|
|
173
|
+
} catch {
|
|
174
|
+
return null
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
86
178
|
/**
|
|
87
179
|
* Request-shaped wrapper around IncomingMessage. Avoids `new Request()`
|
|
88
180
|
* until a body method needs the real Fetch object (formData / blob / clone).
|
|
89
181
|
*/
|
|
90
182
|
export class NodeRequest {
|
|
91
|
-
readonly [NODE_OUTBOUND] = true
|
|
92
|
-
readonly cache = "default" as RequestCache
|
|
93
|
-
readonly credentials = "same-origin" as RequestCredentials
|
|
94
|
-
readonly destination = "" as RequestDestination
|
|
95
183
|
readonly headers: NodeHeaders
|
|
96
|
-
readonly integrity = ""
|
|
97
|
-
readonly keepalive = false
|
|
98
184
|
readonly method: string
|
|
99
|
-
readonly mode = "cors" as RequestMode
|
|
100
|
-
readonly redirect = "follow" as RequestRedirect
|
|
101
|
-
readonly referrer = "about:client"
|
|
102
|
-
readonly referrerPolicy = "" as ReferrerPolicy
|
|
103
185
|
readonly url: string
|
|
104
186
|
|
|
105
187
|
#incoming: IncomingMessage
|
|
188
|
+
#source: AsyncIterable<Buffer | string>
|
|
189
|
+
#maxBody: number
|
|
190
|
+
#received = 0
|
|
191
|
+
#overflow = false
|
|
106
192
|
#hasBody: boolean
|
|
107
193
|
#webBody: ReadableStream<Uint8Array> | null | undefined
|
|
108
194
|
#bodyUsed = false
|
|
109
195
|
#fetch: Request | null = null
|
|
110
|
-
#
|
|
196
|
+
#ac: AbortController | null = null
|
|
197
|
+
/* set when the adapter aborted the request before anything read `signal` */
|
|
198
|
+
#abortReason: { reason: unknown } | null = null
|
|
111
199
|
|
|
112
|
-
|
|
200
|
+
/** @param url the request URL; `nodeRequestUrl(incoming)` when left out (throws if that is invalid) */
|
|
201
|
+
constructor(incoming: IncomingMessage, url?: string, opts?: NodeRequestOptions) {
|
|
113
202
|
this.#incoming = incoming
|
|
114
|
-
const
|
|
115
|
-
|
|
203
|
+
const resolved = url ?? nodeRequestUrl(incoming)
|
|
204
|
+
if (resolved === null) throw new TypeError("Invalid request target or Host header")
|
|
205
|
+
this.url = resolved
|
|
116
206
|
this.method = (incoming.method ?? "GET").toUpperCase()
|
|
117
207
|
this.headers = new NodeHeaders(incoming)
|
|
118
208
|
this.#hasBody = this.method !== "GET" && this.method !== "HEAD"
|
|
209
|
+
this.#source = opts?.bodySource ?? incoming
|
|
210
|
+
this.#maxBody = opts?.maxBodySize ?? 0
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
get [NODE_OUTBOUND](): true {
|
|
214
|
+
return true
|
|
215
|
+
}
|
|
216
|
+
get cache(): RequestCache {
|
|
217
|
+
return "default"
|
|
218
|
+
}
|
|
219
|
+
get credentials(): RequestCredentials {
|
|
220
|
+
return "same-origin"
|
|
221
|
+
}
|
|
222
|
+
get destination(): RequestDestination {
|
|
223
|
+
return ""
|
|
224
|
+
}
|
|
225
|
+
get integrity(): string {
|
|
226
|
+
return ""
|
|
227
|
+
}
|
|
228
|
+
get keepalive(): boolean {
|
|
229
|
+
return false
|
|
230
|
+
}
|
|
231
|
+
get mode(): RequestMode {
|
|
232
|
+
return "cors"
|
|
233
|
+
}
|
|
234
|
+
get redirect(): RequestRedirect {
|
|
235
|
+
return "follow"
|
|
236
|
+
}
|
|
237
|
+
get referrer(): string {
|
|
238
|
+
return "about:client"
|
|
239
|
+
}
|
|
240
|
+
get referrerPolicy(): ReferrerPolicy {
|
|
241
|
+
return ""
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/** Set once a read went over `maxRequestBodySize`; the adapter then closes the connection. */
|
|
245
|
+
get [BODY_OVERFLOW](): boolean {
|
|
246
|
+
return this.#overflow
|
|
119
247
|
}
|
|
120
248
|
|
|
121
249
|
get body(): ReadableStream<Uint8Array> | null {
|
|
122
250
|
if (!this.#hasBody) return null
|
|
251
|
+
/* once a Fetch Request owns the stream (clone, formData, blob), it is the body */
|
|
252
|
+
if (this.#fetch) return this.#fetch.body
|
|
123
253
|
if (this.#webBody === undefined) {
|
|
124
|
-
|
|
125
|
-
this.#webBody = Readable.toWeb(this.#incoming) as unknown as ReadableStream<Uint8Array>
|
|
254
|
+
this.#webBody = this.#countedStream()
|
|
126
255
|
}
|
|
127
256
|
return this.#webBody
|
|
128
257
|
}
|
|
129
258
|
|
|
259
|
+
/** The real Fetch `Request` behind this one: `new Request(x)`, `fetch(x)` and `instanceof` work on it. */
|
|
260
|
+
[TO_FETCH_REQUEST](): Request {
|
|
261
|
+
return this.#asFetch()
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/** Count a chunk against the cap; over it, the read fails with a 413 and the rest is not read. */
|
|
265
|
+
#count(n: number): void {
|
|
266
|
+
this.#received += n
|
|
267
|
+
if (this.#maxBody > 0 && this.#received > this.#maxBody) {
|
|
268
|
+
this.#overflow = true
|
|
269
|
+
throw tooLarge()
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/** A declared length over the cap fails before reading anything. */
|
|
274
|
+
#checkDeclared(): void {
|
|
275
|
+
if (this.#maxBody <= 0) return
|
|
276
|
+
const declared = Number(this.#incoming.headers["content-length"])
|
|
277
|
+
if (Number.isFinite(declared) && declared > this.#maxBody) {
|
|
278
|
+
this.#overflow = true
|
|
279
|
+
throw tooLarge()
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
#countedStream(): ReadableStream<Uint8Array> {
|
|
284
|
+
if (this.#maxBody <= 0 && this.#source === this.#incoming) {
|
|
285
|
+
// Node's web stream and the DOM/Bun ReadableStream brands do not overlap.
|
|
286
|
+
return Readable.toWeb(this.#incoming) as unknown as ReadableStream<Uint8Array>
|
|
287
|
+
}
|
|
288
|
+
const iterator = this.#source[Symbol.asyncIterator]()
|
|
289
|
+
return new ReadableStream<Uint8Array>({
|
|
290
|
+
cancel: async () => {
|
|
291
|
+
await iterator.return?.()
|
|
292
|
+
},
|
|
293
|
+
pull: async (controller) => {
|
|
294
|
+
try {
|
|
295
|
+
this.#checkDeclared()
|
|
296
|
+
const { done, value } = await iterator.next()
|
|
297
|
+
if (done) {
|
|
298
|
+
controller.close()
|
|
299
|
+
return
|
|
300
|
+
}
|
|
301
|
+
const chunk = typeof value === "string" ? Buffer.from(value) : value
|
|
302
|
+
this.#count(chunk.byteLength)
|
|
303
|
+
controller.enqueue(chunk)
|
|
304
|
+
} catch (err) {
|
|
305
|
+
controller.error(err)
|
|
306
|
+
void iterator.return?.()
|
|
307
|
+
}
|
|
308
|
+
},
|
|
309
|
+
})
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/** The socket peer, for `ctx.ip`. */
|
|
313
|
+
get [PEER_ADDRESS](): string | null {
|
|
314
|
+
return this.#incoming.socket?.remoteAddress ?? null
|
|
315
|
+
}
|
|
316
|
+
|
|
130
317
|
get bodyUsed(): boolean {
|
|
131
|
-
|
|
318
|
+
if (this.#fetch) return this.#fetch.bodyUsed
|
|
319
|
+
return this.#bodyUsed || (this.#hasBody && this.#incoming.readableEnded)
|
|
132
320
|
}
|
|
133
321
|
|
|
322
|
+
/**
|
|
323
|
+
* Aborts when the response closes before it finished: the client disconnected, or the
|
|
324
|
+
* server shut down. Reading the body does not end it (Node's `'aborted'` event did).
|
|
325
|
+
*/
|
|
134
326
|
get signal(): AbortSignal {
|
|
135
|
-
if (this.#
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
return this.#signal
|
|
327
|
+
if (this.#ac === null) {
|
|
328
|
+
this.#ac = new AbortController()
|
|
329
|
+
if (this.#abortReason !== null) this.#ac.abort(this.#abortReason.reason)
|
|
330
|
+
}
|
|
331
|
+
return this.#ac.signal
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
[ABORT_REQUEST](reason?: unknown): void {
|
|
335
|
+
const why = reason ?? new DOMException("The client disconnected", "AbortError")
|
|
336
|
+
if (this.#ac !== null) this.#ac.abort(why)
|
|
337
|
+
else if (this.#abortReason === null) this.#abortReason = { reason: why }
|
|
140
338
|
}
|
|
141
339
|
|
|
142
340
|
get duplex(): "half" {
|
|
@@ -171,9 +369,9 @@ export class NodeRequest {
|
|
|
171
369
|
return this.#asFetch().formData()
|
|
172
370
|
}
|
|
173
371
|
|
|
372
|
+
/** As Fetch: an empty body is a `SyntaxError`, not `null`. */
|
|
174
373
|
async json(): Promise<unknown> {
|
|
175
|
-
|
|
176
|
-
return text.length === 0 ? null : JSON.parse(text)
|
|
374
|
+
return JSON.parse(await this.text())
|
|
177
375
|
}
|
|
178
376
|
|
|
179
377
|
async text(): Promise<string> {
|
|
@@ -186,22 +384,27 @@ export class NodeRequest {
|
|
|
186
384
|
this.#fetch = new Request(this.url, {
|
|
187
385
|
body: this.body,
|
|
188
386
|
duplex: this.#hasBody ? "half" : undefined,
|
|
189
|
-
|
|
387
|
+
/* every value of a repeated header, as the view reports them (Node's map keeps only the first of some) */
|
|
388
|
+
headers: [...this.headers] as HeadersInit,
|
|
190
389
|
method: this.method,
|
|
191
390
|
signal: this.signal,
|
|
192
391
|
} as RequestInit)
|
|
193
|
-
this.#bodyUsed = true
|
|
194
392
|
return this.#fetch
|
|
195
393
|
}
|
|
196
394
|
|
|
197
395
|
async #readIncoming(): Promise<Buffer> {
|
|
198
|
-
|
|
396
|
+
/* a null body reads as empty, any number of times */
|
|
199
397
|
if (!this.#hasBody) return Buffer.alloc(0)
|
|
398
|
+
if (this.bodyUsed) throw new TypeError("Body has already been used")
|
|
399
|
+
this.#bodyUsed = true
|
|
200
400
|
if (this.#fetch) return Buffer.from(await this.#fetch.arrayBuffer())
|
|
201
401
|
if (this.#webBody) return streamToBuffer(this.#webBody)
|
|
402
|
+
this.#checkDeclared()
|
|
202
403
|
const chunks: Buffer[] = []
|
|
203
|
-
for await (const chunk of this.#
|
|
204
|
-
|
|
404
|
+
for await (const chunk of this.#source) {
|
|
405
|
+
const buf = typeof chunk === "string" ? Buffer.from(chunk) : chunk
|
|
406
|
+
this.#count(buf.byteLength)
|
|
407
|
+
chunks.push(buf)
|
|
205
408
|
}
|
|
206
409
|
return chunks.length === 1 ? chunks[0] : Buffer.concat(chunks)
|
|
207
410
|
}
|
|
@@ -218,24 +421,11 @@ async function streamToBuffer(stream: ReadableStream<Uint8Array>): Promise<Buffe
|
|
|
218
421
|
return chunks.length === 1 ? chunks[0] : Buffer.concat(chunks)
|
|
219
422
|
}
|
|
220
423
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
configurable: true,
|
|
229
|
-
value(this: Function, value: unknown) {
|
|
230
|
-
if (this === Request && value instanceof NodeRequest) return true
|
|
231
|
-
return original.call(this, value)
|
|
232
|
-
},
|
|
233
|
-
})
|
|
234
|
-
ctor[REQUEST_HAS_INSTANCE] = true
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
installRequestHasInstance()
|
|
238
|
-
|
|
239
|
-
export function incomingToNodeRequest(req: IncomingMessage): Request {
|
|
240
|
-
return new NodeRequest(req) as unknown as Request
|
|
424
|
+
/**
|
|
425
|
+
* A Request-shaped view of `req`. It is not a Fetch `Request` (`instanceof Request` is false, and
|
|
426
|
+
* platform code that reads a Request's internal state cannot take it): pass it through
|
|
427
|
+
* `toFetchRequest()` for `new Request(r)`, `fetch(r)` or a library that needs the real thing.
|
|
428
|
+
*/
|
|
429
|
+
export function incomingToNodeRequest(req: IncomingMessage, url?: string, opts?: NodeRequestOptions): Request {
|
|
430
|
+
return new NodeRequest(req, url, opts) as unknown as Request
|
|
241
431
|
}
|