@lovrozagar/honey 0.6.8 → 0.7.1
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 +819 -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 +603 -423
- 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
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
const PLAIN = 0;
|
|
2
|
+
/** a character the slow path rewrites: a backslash, or one `encodeSegment` percent-encodes */
|
|
3
|
+
const SLOW = 1;
|
|
4
|
+
const PERCENT = 2;
|
|
5
|
+
const SLASH = 3;
|
|
6
|
+
const CHAR_CLASS = new Uint8Array(128);
|
|
7
|
+
for (let c = 0; c < 128; c++) {
|
|
8
|
+
if (c <= 0x20 || c === 0x7f || c === 92 || needsEncoding(c))
|
|
9
|
+
CHAR_CLASS[c] = SLOW;
|
|
10
|
+
}
|
|
11
|
+
CHAR_CLASS[37] = PERCENT;
|
|
12
|
+
CHAR_CLASS[47] = SLASH;
|
|
13
|
+
/**
|
|
14
|
+
* The request path the router, scopes, `ctx.path`, `proxy()` and `staticFiles()` all see.
|
|
15
|
+
*
|
|
16
|
+
* Policy, applied the same way on every runtime:
|
|
17
|
+
* - empty segments collapse: `//admin///users` is `/admin/users`
|
|
18
|
+
* - dot segments resolve: `.` is dropped and `..` removes the segment before it, never past
|
|
19
|
+
* the root; `%2e` counts as a dot, as it does for WHATWG URL parsing
|
|
20
|
+
* - a trailing slash is kept (the router and `trailingSlash()` decide what it means)
|
|
21
|
+
* - a backslash is a `/`, and characters a URL path cannot hold raw (space, controls, `"`, `<`,
|
|
22
|
+
* `>`, `` ` ``, `{`, `}`, non-ASCII) are percent-encoded as UTF-8 — what WHATWG URL parsing
|
|
23
|
+
* does, so a runtime that hands the app the raw target (Deno) and one that parses it first
|
|
24
|
+
* (Bun, Node) route the same bytes the same way
|
|
25
|
+
* - an encoded `/` or `\` (`%2F`, `%5C`) is rejected unless `encodedSlashes` is `"allow"`: a
|
|
26
|
+
* segment that decodes to a path separator means one thing to this router and another to
|
|
27
|
+
* whatever the path is forwarded to (a proxy upstream, a file system). Allowed, it stays
|
|
28
|
+
* encoded in the path and decodes into a param value.
|
|
29
|
+
* - everything else stays percent-encoded; params are decoded when they are extracted
|
|
30
|
+
*
|
|
31
|
+
* Returns `null` for a rejected path; the app answers 400.
|
|
32
|
+
*/
|
|
33
|
+
export function normalizePath(raw, encodedSlashes = "reject") {
|
|
34
|
+
const rejectEncoded = encodedSlashes === "reject";
|
|
35
|
+
let canonical = raw.charCodeAt(0) === 47;
|
|
36
|
+
const len = raw.length;
|
|
37
|
+
for (let i = 0; i < len; i++) {
|
|
38
|
+
const c = raw.charCodeAt(i);
|
|
39
|
+
const k = c < 128 ? CHAR_CLASS[c] : SLOW;
|
|
40
|
+
if (k === PLAIN)
|
|
41
|
+
continue;
|
|
42
|
+
if (k === SLOW) {
|
|
43
|
+
canonical = false;
|
|
44
|
+
}
|
|
45
|
+
else if (k === PERCENT) {
|
|
46
|
+
const hi = raw.charCodeAt(i + 1);
|
|
47
|
+
const lo = raw.charCodeAt(i + 2) | 0x20;
|
|
48
|
+
if (hi === 50 /* 2 */) {
|
|
49
|
+
if (lo === 102 /* f */ && rejectEncoded)
|
|
50
|
+
return null;
|
|
51
|
+
if (lo === 101 /* e */)
|
|
52
|
+
canonical = false;
|
|
53
|
+
}
|
|
54
|
+
else if (hi === 53 /* 5 */ && lo === 99 /* c */ && rejectEncoded) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const n = raw.charCodeAt(i + 1);
|
|
60
|
+
if (n === 47 || n === 46 /* . */)
|
|
61
|
+
canonical = false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (canonical)
|
|
65
|
+
return raw;
|
|
66
|
+
const out = [];
|
|
67
|
+
const segments = raw.replaceAll("\\", "/").split("/");
|
|
68
|
+
let trailing = false;
|
|
69
|
+
for (let i = 0; i < segments.length; i++) {
|
|
70
|
+
const seg = segments[i];
|
|
71
|
+
const last = i === segments.length - 1;
|
|
72
|
+
if (seg === "") {
|
|
73
|
+
if (last && i > 0)
|
|
74
|
+
trailing = true;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const dots = dotSegment(seg);
|
|
78
|
+
if (dots === 0) {
|
|
79
|
+
out.push(encodeSegment(seg));
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (dots === 2)
|
|
83
|
+
out.pop();
|
|
84
|
+
/* `/a/b/..` is `/a/`, like URL resolution */
|
|
85
|
+
if (last)
|
|
86
|
+
trailing = true;
|
|
87
|
+
}
|
|
88
|
+
if (out.length === 0)
|
|
89
|
+
return "/";
|
|
90
|
+
const path = `/${out.join("/")}`;
|
|
91
|
+
return trailing ? `${path}/` : path;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* The WHATWG path percent-encode set, plus every non-ASCII code unit. `^` joined the set in
|
|
95
|
+
* 2023; Node and Bun encode it, Deno's parser does not yet, so it is encoded here to keep
|
|
96
|
+
* `ctx.path` the same on all three.
|
|
97
|
+
*/
|
|
98
|
+
function needsEncoding(c) {
|
|
99
|
+
return (c <= 0x20 ||
|
|
100
|
+
c >= 0x7f ||
|
|
101
|
+
c === 34 /* " */ ||
|
|
102
|
+
c === 60 /* < */ ||
|
|
103
|
+
c === 62 /* > */ ||
|
|
104
|
+
c === 94 /* ^ */ ||
|
|
105
|
+
c === 96 /* ` */ ||
|
|
106
|
+
c === 123 /* { */ ||
|
|
107
|
+
c === 125 /* } */);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* One path segment as a normalized request path holds it: characters a URL path cannot hold
|
|
111
|
+
* raw become UTF-8 percent escapes, everything else (existing escapes included) is kept.
|
|
112
|
+
* Route patterns encode their static segments with this too, so `app.get("/é")` matches the
|
|
113
|
+
* `/%C3%A9` every runtime hands the app.
|
|
114
|
+
*/
|
|
115
|
+
export function encodeSegment(seg) {
|
|
116
|
+
let needs = false;
|
|
117
|
+
for (let i = 0; i < seg.length; i++) {
|
|
118
|
+
if (needsEncoding(seg.charCodeAt(i))) {
|
|
119
|
+
needs = true;
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (!needs)
|
|
124
|
+
return seg;
|
|
125
|
+
let out = "";
|
|
126
|
+
for (const ch of seg) {
|
|
127
|
+
const c = ch.charCodeAt(0);
|
|
128
|
+
if (ch.length === 1 && !needsEncoding(c)) {
|
|
129
|
+
out += ch;
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
out += encodeURIComponent(ch);
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
/* a lone surrogate: U+FFFD, as URL parsing encodes it */
|
|
137
|
+
out += "%EF%BF%BD";
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return out;
|
|
141
|
+
}
|
|
142
|
+
/** 1 for `.`, 2 for `..` (either may be written `%2e`), 0 for anything else. */
|
|
143
|
+
function dotSegment(seg) {
|
|
144
|
+
if (seg.length > 6)
|
|
145
|
+
return 0;
|
|
146
|
+
const s = seg.toLowerCase().replaceAll("%2e", ".");
|
|
147
|
+
if (s === ".")
|
|
148
|
+
return 1;
|
|
149
|
+
if (s === "..")
|
|
150
|
+
return 2;
|
|
151
|
+
return 0;
|
|
152
|
+
}
|
|
153
|
+
/** The path of a request URL without `new URL()`: everything from the first `/` after the authority, up to `?` or `#`. */
|
|
154
|
+
export function pathOfUrl(rawUrl) {
|
|
155
|
+
const protoEnd = rawUrl.indexOf("//");
|
|
156
|
+
const pathStart = protoEnd === -1 ? 0 : rawUrl.indexOf("/", protoEnd + 2);
|
|
157
|
+
if (pathStart === -1)
|
|
158
|
+
return "/";
|
|
159
|
+
for (let i = pathStart; i < rawUrl.length; i++) {
|
|
160
|
+
const c = rawUrl.charCodeAt(i);
|
|
161
|
+
if (c === 63 /* ? */ || c === 35 /* # */)
|
|
162
|
+
return rawUrl.substring(pathStart, i);
|
|
163
|
+
}
|
|
164
|
+
return rawUrl.substring(pathStart);
|
|
165
|
+
}
|
|
166
|
+
/** `?query` of a request URL (with the `?`), or `""`. Never includes a fragment. */
|
|
167
|
+
export function searchOfUrl(rawUrl) {
|
|
168
|
+
const protoEnd = rawUrl.indexOf("//");
|
|
169
|
+
const pathStart = protoEnd === -1 ? 0 : rawUrl.indexOf("/", protoEnd + 2);
|
|
170
|
+
if (pathStart === -1)
|
|
171
|
+
return "";
|
|
172
|
+
const q = rawUrl.indexOf("?", pathStart);
|
|
173
|
+
if (q === -1)
|
|
174
|
+
return "";
|
|
175
|
+
const hash = rawUrl.indexOf("#", q);
|
|
176
|
+
return hash === -1 ? rawUrl.substring(q) : rawUrl.substring(q, hash);
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=request-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-path.js","sourceRoot":"","sources":["../src/request-path.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,13 @@ export type RequestToCurlOptions = {
|
|
|
2
2
|
excludeHeader?: (name: string, value: string) => boolean;
|
|
3
3
|
};
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* Quote one shell word. Plain values use single quotes; values with control
|
|
6
|
+
* characters (CR, LF, ESC, …) use ANSI-C `$'…'` quoting with `\xHH` escapes, so
|
|
7
|
+
* a pasted command cannot carry a raw newline and a log line cannot be split.
|
|
8
|
+
*/
|
|
9
|
+
export declare function shellQuote(value: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Convert a native Request into a curl command string. Every word is quoted.
|
|
6
12
|
* The request is cloned so reading the body does not consume the original stream.
|
|
7
13
|
*/
|
|
8
14
|
export declare function requestToCurl(request: Request, options?: RequestToCurlOptions): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-to-curl.d.ts","sourceRoot":"","sources":["../src/request-to-curl.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG;IAClC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;CACxD,CAAA;
|
|
1
|
+
{"version":3,"file":"request-to-curl.d.ts","sourceRoot":"","sources":["../src/request-to-curl.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG;IAClC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;CACxD,CAAA;AAUD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUhD;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBrG"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
function hasControl(value) {
|
|
2
|
+
for (let i = 0; i < value.length; i++) {
|
|
3
|
+
const code = value.charCodeAt(i);
|
|
4
|
+
if (code < 0x20 || code === 0x7f)
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Quote one shell word. Plain values use single quotes; values with control
|
|
11
|
+
* characters (CR, LF, ESC, …) use ANSI-C `$'…'` quoting with `\xHH` escapes, so
|
|
12
|
+
* a pasted command cannot carry a raw newline and a log line cannot be split.
|
|
13
|
+
*/
|
|
14
|
+
export function shellQuote(value) {
|
|
15
|
+
if (!hasControl(value))
|
|
16
|
+
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
17
|
+
let out = "$'";
|
|
18
|
+
for (const ch of value) {
|
|
19
|
+
const code = ch.codePointAt(0);
|
|
20
|
+
if (ch === "\\" || ch === "'")
|
|
21
|
+
out += `\\${ch}`;
|
|
22
|
+
else if (code < 0x20 || code === 0x7f)
|
|
23
|
+
out += `\\x${code.toString(16).padStart(2, "0")}`;
|
|
24
|
+
else
|
|
25
|
+
out += ch;
|
|
26
|
+
}
|
|
27
|
+
return `${out}'`;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Convert a native Request into a curl command string. Every word is quoted.
|
|
31
|
+
* The request is cloned so reading the body does not consume the original stream.
|
|
32
|
+
*/
|
|
33
|
+
export async function requestToCurl(request, options) {
|
|
34
|
+
const clonedRequest = request.clone();
|
|
35
|
+
const parts = ["curl", "-X", shellQuote(clonedRequest.method)];
|
|
36
|
+
for (const [name, value] of clonedRequest.headers.entries()) {
|
|
37
|
+
if (options?.excludeHeader?.(name, value) === true)
|
|
38
|
+
continue;
|
|
39
|
+
parts.push("-H", shellQuote(`${name}: ${value}`));
|
|
40
|
+
}
|
|
41
|
+
const body = await clonedRequest.text();
|
|
42
|
+
if (body.length > 0) {
|
|
43
|
+
parts.push("--data-raw", shellQuote(body));
|
|
44
|
+
}
|
|
45
|
+
parts.push(shellQuote(clonedRequest.url));
|
|
46
|
+
return parts.join(" ");
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=request-to-curl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-to-curl.js","sourceRoot":"","sources":["../src/request-to-curl.ts"],"names":[],"mappings":"AAIA,SAAS,UAAU,CAAC,KAAa;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QAChC,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAA;IAC9C,CAAC;IACD,OAAO,KAAK,CAAA;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa;IACvC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAA;IAClE,IAAI,GAAG,GAAG,IAAI,CAAA;IACd,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAW,CAAA;QACxC,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,GAAG;YAAE,GAAG,IAAI,KAAK,EAAE,EAAE,CAAA;aAC1C,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI;YAAE,GAAG,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAA;;YACnF,GAAG,IAAI,EAAE,CAAA;IACf,CAAC;IACD,OAAO,GAAG,GAAG,GAAG,CAAA;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAgB,EAAE,OAA8B;IACnF,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,EAAE,CAAA;IACrC,MAAM,KAAK,GAAa,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;IAExE,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC7D,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,IAAI;YAAE,SAAQ;QAC5D,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAA;IAClD,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAA;IAEvC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAA;IAEzC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACvB,CAAC"}
|
package/dist/response.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { CookieOptions } from "./cookie.ts";
|
|
2
2
|
import type { HoneyError } from "./error.ts";
|
|
3
|
+
import { type ProducerOptions } from "./producer-stream.ts";
|
|
3
4
|
import type { StatusKey } from "./types.ts";
|
|
4
5
|
export type { CookieOptions } from "./cookie.ts";
|
|
5
6
|
export { serializeCookie } from "./cookie.ts";
|
|
@@ -20,9 +21,19 @@ export type SSEOptions = ResponseOptions & {
|
|
|
20
21
|
lastEventId?: string;
|
|
21
22
|
};
|
|
22
23
|
export type SSEStream = {
|
|
24
|
+
/** End the stream. Idempotent and synchronous: safe in a `finally`. */
|
|
23
25
|
close(): void;
|
|
26
|
+
/** True once the stream ended: closed, or the client went away. */
|
|
27
|
+
readonly closed: boolean;
|
|
24
28
|
lastEventId: string | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* Queue an event. Resolves when the client is ready for more. After the stream ended it
|
|
31
|
+
* rejects with an `AbortError`, which ends an awaiting loop; Honey does not report that
|
|
32
|
+
* rejection, and an unawaited one never surfaces as an unhandled rejection.
|
|
33
|
+
*/
|
|
25
34
|
send(event: SSEEvent): Promise<void>;
|
|
35
|
+
/** Aborts when the client disconnects, the request times out, or the server shuts down. */
|
|
36
|
+
readonly signal: AbortSignal;
|
|
26
37
|
};
|
|
27
38
|
export type ErrorFormatter = (error: HoneyError, defaultShape: Record<string, unknown>) => Record<string, unknown>;
|
|
28
39
|
declare const CONTENT_TYPE: unique symbol;
|
|
@@ -35,6 +46,8 @@ export type TypedResponse<CT extends string = string, SK extends string = string
|
|
|
35
46
|
export declare class HoneyRes {
|
|
36
47
|
protected readonly _nodeOut: boolean;
|
|
37
48
|
constructor(nodeOut?: boolean);
|
|
49
|
+
/** Signal and error reporting for streams; the per-request res wires `ctx.signal` and the logger. */
|
|
50
|
+
protected _producer(): ProducerOptions;
|
|
38
51
|
private _known;
|
|
39
52
|
binary<SK extends StatusKey>(statusKey: SK, body: ArrayBuffer | Uint8Array<ArrayBuffer>, opts?: ResponseOptions): TypedResponse<"application/octet-stream", SK>;
|
|
40
53
|
csv<SK extends StatusKey>(statusKey: SK, body: string, opts?: ResponseOptions): TypedResponse<"text/csv", SK>;
|
|
@@ -50,11 +63,21 @@ export declare class HoneyRes {
|
|
|
50
63
|
raw(response: Response): TypedResponse;
|
|
51
64
|
redirect(url: string, opts?: ResponseOptions): TypedResponse<"none", "found">;
|
|
52
65
|
sse(callback: (stream: SSEStream) => Promise<void>, opts?: SSEOptions): TypedResponse<"text/event-stream", "ok">;
|
|
53
|
-
|
|
66
|
+
/**
|
|
67
|
+
* Stream a generator's values. A disconnect, `timeout()` or shutdown calls `generator.return()`,
|
|
68
|
+
* so its `finally` runs; a throw mid-stream breaks the body instead of ending it cleanly.
|
|
69
|
+
*/
|
|
70
|
+
generate(generator: AsyncGenerator<string | Uint8Array, void, unknown> | Generator<string | Uint8Array, void, unknown>, opts?: {
|
|
54
71
|
contentType?: string;
|
|
55
72
|
status?: number;
|
|
56
73
|
}): TypedResponse<string, "ok">;
|
|
57
|
-
|
|
74
|
+
/**
|
|
75
|
+
* Write the body through a `WritableStream`. The callback starts when the body is first read
|
|
76
|
+
* (never for HEAD); `signal` aborts when the client disconnects, the request times out, or the
|
|
77
|
+
* server shuts down. Returning ends the body after queued writes flush, whether or not the
|
|
78
|
+
* writable was closed; throwing breaks it, even while the callback holds a writer.
|
|
79
|
+
*/
|
|
80
|
+
stream(callback: (writable: WritableStream, signal: AbortSignal) => Promise<void>, opts?: ResponseOptions): TypedResponse<"application/octet-stream", "ok">;
|
|
58
81
|
text<SK extends StatusKey>(statusKey: SK, body: string, opts?: ResponseOptions): TypedResponse<"text/plain", SK>;
|
|
59
82
|
xml<SK extends StatusKey>(statusKey: SK, body: string, opts?: ResponseOptions): TypedResponse<"application/xml", SK>;
|
|
60
83
|
}
|
package/dist/response.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../src/response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAG3C,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C,MAAM,MAAM,eAAe,GAAG;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,MAAM,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACtB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,eAAe,GAAG;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACvB,KAAK,IAAI,IAAI,CAAA;IACb,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../src/response.ts"],"names":[],"mappings":"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"}
|
package/dist/response.js
ADDED
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { serializeCookie } from "./cookie.js";
|
|
2
|
+
import { createHoneyResponse, isHoneyResponse } from "./honey-response.js";
|
|
3
|
+
import { generatorStream, producerStream, tagStream } from "./producer-stream.js";
|
|
4
|
+
import { statusKeyToCode } from "./types.js";
|
|
5
|
+
export { serializeCookie } from "./cookie.js";
|
|
6
|
+
function applyResponseOptions(headers, opts) {
|
|
7
|
+
if (opts?.headers) {
|
|
8
|
+
for (const [k, v] of Object.entries(opts.headers)) {
|
|
9
|
+
headers.set(k, v);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
if (opts?.cookies) {
|
|
13
|
+
for (const [name, cookieOpts] of Object.entries(opts.cookies)) {
|
|
14
|
+
headers.append("set-cookie", serializeCookie(name, cookieOpts));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function applyPlainOptions(headers, opts) {
|
|
19
|
+
if (opts?.headers) {
|
|
20
|
+
for (const [k, v] of Object.entries(opts.headers)) {
|
|
21
|
+
headers[k.toLowerCase()] = v;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (opts?.cookies) {
|
|
25
|
+
/* append, as `Headers.append` does on the native path: a `set-cookie` in `opts.headers` stays */
|
|
26
|
+
const existing = headers["set-cookie"];
|
|
27
|
+
const cookies = existing === undefined ? [] : Array.isArray(existing) ? [...existing] : [existing];
|
|
28
|
+
for (const [name, cookieOpts] of Object.entries(opts.cookies)) {
|
|
29
|
+
cookies.push(serializeCookie(name, cookieOpts));
|
|
30
|
+
}
|
|
31
|
+
headers["set-cookie"] = cookies;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Statuses whose responses never carry a body (Fetch "null body status"). */
|
|
35
|
+
function isNullBodyStatus(status) {
|
|
36
|
+
return status === 101 || status === 103 || status === 204 || status === 205 || status === 304;
|
|
37
|
+
}
|
|
38
|
+
/** Cast a native Response to TypedResponse — zero runtime cost */
|
|
39
|
+
function typed(response) {
|
|
40
|
+
return response;
|
|
41
|
+
}
|
|
42
|
+
/** Node adapter reads this to `res.end(payload)` without draining the Fetch body. */
|
|
43
|
+
const RAW_BODY = Symbol.for("honey.rawBody");
|
|
44
|
+
function withRawBody(response, body) {
|
|
45
|
+
Object.defineProperty(response, RAW_BODY, { value: body });
|
|
46
|
+
return response;
|
|
47
|
+
}
|
|
48
|
+
/* pre-allocated header objects — Bun optimizes plain objects better than Headers instances */
|
|
49
|
+
const JSON_HEADERS = { "content-type": "application/json" };
|
|
50
|
+
const TEXT_HEADERS = { "content-type": "text/plain; charset=utf-8" };
|
|
51
|
+
const HTML_HEADERS = { "content-type": "text/html; charset=utf-8" };
|
|
52
|
+
const CSV_HEADERS = { "content-type": "text/csv; charset=utf-8" };
|
|
53
|
+
const BINARY_HEADERS = { "content-type": "application/octet-stream" };
|
|
54
|
+
/** Report a stream producer failure where no logger is wired (a bare `HoneyRes`). */
|
|
55
|
+
function reportToConsole(err) {
|
|
56
|
+
console.error("honey: stream producer failed", err);
|
|
57
|
+
}
|
|
58
|
+
export class HoneyRes {
|
|
59
|
+
_nodeOut;
|
|
60
|
+
constructor(nodeOut = false) {
|
|
61
|
+
this._nodeOut = nodeOut;
|
|
62
|
+
}
|
|
63
|
+
/** Signal and error reporting for streams; the per-request res wires `ctx.signal` and the logger. */
|
|
64
|
+
_producer() {
|
|
65
|
+
return { report: reportToConsole };
|
|
66
|
+
}
|
|
67
|
+
_known(statusCode, headers, raw, opts) {
|
|
68
|
+
const status = opts?.status ?? statusCode;
|
|
69
|
+
if (isNullBodyStatus(status)) {
|
|
70
|
+
/* `new Response(body, { status: 204 })` throws on the native path; fail the same way everywhere */
|
|
71
|
+
throw new TypeError(`A ${status} response cannot have a body; use ctx.res.noContent() or another status`);
|
|
72
|
+
}
|
|
73
|
+
if (this._nodeOut) {
|
|
74
|
+
if (!opts?.headers && !opts?.cookies) {
|
|
75
|
+
return typed(createHoneyResponse({ headers, raw, status }));
|
|
76
|
+
}
|
|
77
|
+
const plain = { ...headers };
|
|
78
|
+
applyPlainOptions(plain, opts);
|
|
79
|
+
return typed(createHoneyResponse({ headers: plain, raw, status }));
|
|
80
|
+
}
|
|
81
|
+
if (!opts?.headers && !opts?.cookies) {
|
|
82
|
+
return typed(withRawBody(new Response(raw, { headers, status }), raw));
|
|
83
|
+
}
|
|
84
|
+
const native = new Headers(headers);
|
|
85
|
+
applyResponseOptions(native, opts);
|
|
86
|
+
return typed(withRawBody(new Response(raw, { headers: native, status }), raw));
|
|
87
|
+
}
|
|
88
|
+
binary(statusKey, body, opts) {
|
|
89
|
+
const raw = body instanceof Uint8Array ? body : new Uint8Array(body);
|
|
90
|
+
return this._known(statusKeyToCode[statusKey], BINARY_HEADERS, raw, opts);
|
|
91
|
+
}
|
|
92
|
+
csv(statusKey, body, opts) {
|
|
93
|
+
return this._known(statusKeyToCode[statusKey], CSV_HEADERS, body, opts);
|
|
94
|
+
}
|
|
95
|
+
html(statusKey, body, opts) {
|
|
96
|
+
return this._known(statusKeyToCode[statusKey], HTML_HEADERS, body, opts);
|
|
97
|
+
}
|
|
98
|
+
json(statusKey, data, opts) {
|
|
99
|
+
return this._known(statusKeyToCode[statusKey], JSON_HEADERS, JSON.stringify(data), opts);
|
|
100
|
+
}
|
|
101
|
+
noContent(opts) {
|
|
102
|
+
if (this._nodeOut) {
|
|
103
|
+
const headers = {};
|
|
104
|
+
applyPlainOptions(headers, opts);
|
|
105
|
+
return typed(createHoneyResponse({ headers, raw: null, status: 204 }));
|
|
106
|
+
}
|
|
107
|
+
const headers = new Headers();
|
|
108
|
+
applyResponseOptions(headers, opts);
|
|
109
|
+
return typed(new Response(null, { headers, status: 204 }));
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Return a native Response. `fetch()`, `Fetcher.fetch`, `cache.match`, and `Response.redirect`
|
|
113
|
+
* return guarded headers that throw on `set`, which breaks response middleware (`requestId`,
|
|
114
|
+
* `secureHeaders`, `poweredBy`, `serverTiming`). Copy status and headers into a new Response; the
|
|
115
|
+
* body streams through unread. WebSocket upgrades and responses Honey built pass through as-is.
|
|
116
|
+
*/
|
|
117
|
+
raw(response) {
|
|
118
|
+
if (response.status === 101 || isHoneyResponse(response) || RAW_BODY in response)
|
|
119
|
+
return typed(response);
|
|
120
|
+
return typed(new Response(response.body, response));
|
|
121
|
+
}
|
|
122
|
+
redirect(url, opts) {
|
|
123
|
+
if (this._nodeOut) {
|
|
124
|
+
const headers = { location: url };
|
|
125
|
+
applyPlainOptions(headers, opts);
|
|
126
|
+
return typed(createHoneyResponse({ headers, raw: null, status: opts?.status ?? 302 }));
|
|
127
|
+
}
|
|
128
|
+
const headers = new Headers({ location: url });
|
|
129
|
+
applyResponseOptions(headers, opts);
|
|
130
|
+
return typed(new Response(null, { headers, status: opts?.status ?? 302 }));
|
|
131
|
+
}
|
|
132
|
+
sse(callback, opts) {
|
|
133
|
+
const encoder = new TextEncoder();
|
|
134
|
+
const body = producerStream((sink) => {
|
|
135
|
+
const stream = {
|
|
136
|
+
close: () => sink.close(),
|
|
137
|
+
get closed() {
|
|
138
|
+
return sink.closed;
|
|
139
|
+
},
|
|
140
|
+
lastEventId: opts?.lastEventId,
|
|
141
|
+
send(event) {
|
|
142
|
+
if (/[\r\n]/.test(event.event)) {
|
|
143
|
+
throw new Error("SSE event name must not contain newlines");
|
|
144
|
+
}
|
|
145
|
+
if (event.id && /[\r\n]/.test(event.id)) {
|
|
146
|
+
throw new Error("SSE id must not contain newlines");
|
|
147
|
+
}
|
|
148
|
+
const dataStr = typeof event.data === "string" ? event.data : JSON.stringify(event.data);
|
|
149
|
+
const dataLines = dataStr
|
|
150
|
+
.split(/\r\n|\r|\n/)
|
|
151
|
+
.map((line) => `data: ${line}`)
|
|
152
|
+
.join("\n");
|
|
153
|
+
let msg = `event: ${event.event}\n${dataLines}\n`;
|
|
154
|
+
if (event.id)
|
|
155
|
+
msg += `id: ${event.id}\n`;
|
|
156
|
+
/** SSE retry must be a non-negative integer per spec — skip if invalid */
|
|
157
|
+
if (event.retry !== undefined && Number.isFinite(event.retry) && event.retry >= 0) {
|
|
158
|
+
msg += `retry: ${Math.floor(event.retry)}\n`;
|
|
159
|
+
}
|
|
160
|
+
msg += "\n";
|
|
161
|
+
return sink.write(encoder.encode(msg));
|
|
162
|
+
},
|
|
163
|
+
signal: sink.signal,
|
|
164
|
+
};
|
|
165
|
+
if (opts?.defaultRetry !== undefined) {
|
|
166
|
+
void sink.write(encoder.encode(`retry: ${opts.defaultRetry}\n\n`));
|
|
167
|
+
}
|
|
168
|
+
if (opts?.keepalive !== undefined && opts.keepalive > 0) {
|
|
169
|
+
const heartbeat = encoder.encode(": heartbeat\n\n");
|
|
170
|
+
const timer = setInterval(() => {
|
|
171
|
+
void sink.write(heartbeat);
|
|
172
|
+
}, opts.keepalive);
|
|
173
|
+
sink.onEnd(() => clearInterval(timer));
|
|
174
|
+
}
|
|
175
|
+
return callback(stream);
|
|
176
|
+
}, this._producer());
|
|
177
|
+
/* no `connection: keep-alive`: HTTP/1.1 keeps the connection by default, the header would
|
|
178
|
+
* override a client's `Connection: close`, and HTTP/2 forbids it */
|
|
179
|
+
const headers = new Headers({
|
|
180
|
+
"cache-control": "no-cache",
|
|
181
|
+
"content-type": "text/event-stream",
|
|
182
|
+
});
|
|
183
|
+
applyResponseOptions(headers, opts);
|
|
184
|
+
return typed(tagStream(new Response(body, { headers, status: opts?.status ?? 200 })));
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Stream a generator's values. A disconnect, `timeout()` or shutdown calls `generator.return()`,
|
|
188
|
+
* so its `finally` runs; a throw mid-stream breaks the body instead of ending it cleanly.
|
|
189
|
+
*/
|
|
190
|
+
generate(generator, opts) {
|
|
191
|
+
const headers = new Headers({
|
|
192
|
+
"content-type": opts?.contentType ?? "application/octet-stream",
|
|
193
|
+
});
|
|
194
|
+
const body = generatorStream(generator, this._producer());
|
|
195
|
+
return typed(tagStream(new Response(body, { headers, status: opts?.status ?? 200 })));
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Write the body through a `WritableStream`. The callback starts when the body is first read
|
|
199
|
+
* (never for HEAD); `signal` aborts when the client disconnects, the request times out, or the
|
|
200
|
+
* server shuts down. Returning ends the body after queued writes flush, whether or not the
|
|
201
|
+
* writable was closed; throwing breaks it, even while the callback holds a writer.
|
|
202
|
+
*/
|
|
203
|
+
stream(callback, opts) {
|
|
204
|
+
const encoder = new TextEncoder();
|
|
205
|
+
const body = producerStream(async (sink) => {
|
|
206
|
+
/* `size()` runs as each chunk enters the writable's queue: it counts writes not yet flushed */
|
|
207
|
+
let queued = 0;
|
|
208
|
+
let flushed = 0;
|
|
209
|
+
let onFlushed = null;
|
|
210
|
+
const writable = new WritableStream({
|
|
211
|
+
abort(reason) {
|
|
212
|
+
sink.error(reason);
|
|
213
|
+
},
|
|
214
|
+
close() {
|
|
215
|
+
sink.close();
|
|
216
|
+
},
|
|
217
|
+
async write(chunk) {
|
|
218
|
+
try {
|
|
219
|
+
await sink.write(toBytes(chunk, encoder));
|
|
220
|
+
}
|
|
221
|
+
finally {
|
|
222
|
+
flushed++;
|
|
223
|
+
if (flushed === queued)
|
|
224
|
+
onFlushed?.();
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
}, {
|
|
228
|
+
highWaterMark: 1,
|
|
229
|
+
size() {
|
|
230
|
+
queued++;
|
|
231
|
+
return 1;
|
|
232
|
+
},
|
|
233
|
+
});
|
|
234
|
+
await callback(writable, sink.signal);
|
|
235
|
+
if (sink.closed)
|
|
236
|
+
return;
|
|
237
|
+
if (flushed < queued) {
|
|
238
|
+
await new Promise((resolve) => {
|
|
239
|
+
onFlushed = resolve;
|
|
240
|
+
sink.onEnd(resolve);
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
}, this._producer());
|
|
244
|
+
const headers = new Headers();
|
|
245
|
+
applyResponseOptions(headers, opts);
|
|
246
|
+
return typed(tagStream(new Response(body, { headers, status: opts?.status ?? 200 })));
|
|
247
|
+
}
|
|
248
|
+
text(statusKey, body, opts) {
|
|
249
|
+
return this._known(statusKeyToCode[statusKey], TEXT_HEADERS, body, opts);
|
|
250
|
+
}
|
|
251
|
+
xml(statusKey, body, opts) {
|
|
252
|
+
return this._known(statusKeyToCode[statusKey], { "content-type": "application/xml" }, body, opts);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
function toBytes(chunk, encoder) {
|
|
256
|
+
if (chunk instanceof Uint8Array)
|
|
257
|
+
return chunk;
|
|
258
|
+
if (typeof chunk === "string")
|
|
259
|
+
return encoder.encode(chunk);
|
|
260
|
+
if (chunk instanceof ArrayBuffer)
|
|
261
|
+
return new Uint8Array(chunk);
|
|
262
|
+
if (ArrayBuffer.isView(chunk))
|
|
263
|
+
return new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength);
|
|
264
|
+
throw new TypeError("ctx.res.stream() chunks must be strings, ArrayBuffers or typed arrays");
|
|
265
|
+
}
|
|
266
|
+
export function createErrorResponse(error, defaultFormatter, customFormatter) {
|
|
267
|
+
let body;
|
|
268
|
+
if (error.data !== undefined) {
|
|
269
|
+
/* custom schema error — apply customErrorFormatter if set, else use data as-is */
|
|
270
|
+
const rawData = error.data;
|
|
271
|
+
if (customFormatter) {
|
|
272
|
+
try {
|
|
273
|
+
body = customFormatter(error, rawData);
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
body = rawData;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
body = rawData;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
/* standard error — build default shape, apply defaultErrorFormatter */
|
|
285
|
+
const defaultShape = {
|
|
286
|
+
error_key: error.errorKey,
|
|
287
|
+
fields: error.fields,
|
|
288
|
+
message: error.message,
|
|
289
|
+
status: error.status,
|
|
290
|
+
status_key: error.statusKey,
|
|
291
|
+
success: false,
|
|
292
|
+
};
|
|
293
|
+
try {
|
|
294
|
+
body = defaultFormatter(error, defaultShape);
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
/* formatter crashed — fall back to default shape */
|
|
298
|
+
body = defaultShape;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
const headers = { "content-type": "application/json" };
|
|
302
|
+
if (error.headers) {
|
|
303
|
+
for (const [k, v] of Object.entries(error.headers)) {
|
|
304
|
+
headers[k] = v;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
const payload = JSON.stringify(body);
|
|
308
|
+
return withRawBody(new Response(payload, {
|
|
309
|
+
headers,
|
|
310
|
+
status: error.status,
|
|
311
|
+
}), payload);
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=response.js.map
|