@lovrozagar/honey 0.7.2 → 1.0.0-rc.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/LICENSE +21 -0
- package/README.md +36 -1969
- package/bin/honey.js +87 -27
- package/dist/adapters/bun/serve.d.ts +18 -0
- package/dist/adapters/bun/serve.js +89 -0
- package/dist/adapters/fetch-request.d.ts +20 -0
- package/dist/adapters/fetch-request.js +29 -0
- package/dist/adapters/node/headers.d.ts +27 -0
- package/dist/adapters/node/headers.js +86 -0
- package/dist/adapters/node/request.d.ts +16 -0
- package/dist/adapters/node/request.js +214 -0
- package/dist/adapters/node/response.d.ts +11 -0
- package/dist/adapters/node/response.js +126 -0
- package/dist/adapters/node/serve.d.ts +39 -0
- package/dist/adapters/node/serve.js +205 -0
- package/dist/adapters/node/url.d.ts +13 -0
- package/dist/adapters/node/url.js +87 -0
- package/dist/adapters/serve.d.ts +36 -0
- package/dist/adapters/serve.js +52 -0
- package/dist/build/artifacts.d.ts +34 -0
- package/dist/build/artifacts.js +123 -0
- package/dist/build/cli-args.d.ts +30 -0
- package/dist/build/cli-args.js +97 -0
- package/dist/build/cli.d.ts +11 -0
- package/dist/build/cli.js +150 -0
- package/dist/build/config.d.ts +102 -0
- package/dist/build/config.js +89 -0
- package/dist/build/generate.d.ts +19 -0
- package/dist/build/generate.js +80 -0
- package/dist/build/glob.d.ts +8 -0
- package/dist/build/glob.js +97 -0
- package/dist/build/index.d.ts +3 -58
- package/dist/build/index.js +3 -173
- package/dist/build/init.d.ts +3 -0
- package/dist/build/init.js +131 -0
- package/dist/build/loaders.d.ts +33 -0
- package/dist/build/loaders.js +105 -0
- package/dist/build/plugin.d.ts +52 -0
- package/dist/build/plugin.js +146 -0
- package/dist/build/source.d.ts +21 -0
- package/dist/build/source.js +100 -0
- package/dist/build/targets.d.ts +59 -0
- package/dist/build/targets.js +107 -0
- package/dist/context/context.d.ts +111 -0
- package/dist/context/context.js +213 -0
- package/dist/context/cookie-sign.d.ts +38 -0
- package/dist/context/cookie-sign.js +113 -0
- package/dist/context/cookie.d.ts +28 -0
- package/dist/context/cookie.js +142 -0
- package/dist/context/peer.d.ts +34 -0
- package/dist/context/peer.js +190 -0
- package/dist/errors/error.d.ts +60 -0
- package/dist/errors/error.js +84 -0
- package/dist/errors/errors.d.ts +45 -0
- package/dist/errors/errors.js +31 -0
- package/dist/errors/on-error.d.ts +10 -0
- package/dist/errors/on-error.js +204 -0
- package/dist/errors/problem-json.d.ts +14 -0
- package/dist/errors/problem-json.js +58 -0
- package/dist/errors/projector.d.ts +50 -0
- package/dist/errors/projector.js +107 -0
- package/dist/i18n/error-i18n.d.ts +26 -0
- package/dist/i18n/error-i18n.js +77 -0
- package/dist/i18n/i18n.d.ts +21 -0
- package/dist/i18n/i18n.js +40 -0
- package/dist/i18n/icu.d.ts +29 -0
- package/dist/i18n/icu.js +170 -0
- package/dist/i18n/index.d.ts +4 -0
- package/dist/i18n/index.js +3 -0
- package/dist/index.d.ts +30 -744
- package/dist/index.js +12 -2363
- package/dist/input/accepts.d.ts +5 -0
- package/dist/input/accepts.js +105 -0
- package/dist/input/binary.d.ts +20 -0
- package/dist/input/binary.js +40 -0
- package/dist/input/body-kind.d.ts +15 -0
- package/dist/input/body-kind.js +47 -0
- package/dist/input/body-limit.d.ts +21 -0
- package/dist/input/body-limit.js +99 -0
- package/dist/input/cookies.d.ts +7 -0
- package/dist/input/cookies.js +8 -0
- package/dist/input/form.d.ts +10 -0
- package/dist/input/form.js +24 -0
- package/dist/input/headers.d.ts +7 -0
- package/dist/input/headers.js +8 -0
- package/dist/input/input.d.ts +91 -0
- package/dist/input/input.js +88 -0
- package/dist/input/json.d.ts +10 -0
- package/dist/input/json.js +22 -0
- package/dist/input/params.d.ts +7 -0
- package/dist/input/params.js +8 -0
- package/dist/input/query.d.ts +10 -0
- package/dist/input/query.js +17 -0
- package/dist/mcp/mount.d.ts +116 -0
- package/dist/mcp/mount.js +45 -0
- package/dist/mcp/oauth.d.ts +14 -0
- package/dist/mcp/oauth.js +88 -0
- package/dist/mcp/uploads.d.ts +36 -0
- package/dist/mcp/uploads.js +171 -0
- package/dist/mcp/url-files.d.ts +32 -0
- package/dist/mcp/url-files.js +75 -0
- package/dist/meta/meta-spec-apply.d.ts +25 -0
- package/dist/meta/meta-spec-apply.js +83 -0
- package/dist/meta/meta-spec-merge.d.ts +103 -0
- package/dist/meta/meta-spec-merge.js +50 -0
- package/dist/meta/meta-spec-validate.d.ts +61 -0
- package/dist/meta/meta-spec-validate.js +166 -0
- package/dist/meta/meta-spec.d.ts +49 -0
- package/dist/meta/meta-spec.js +197 -0
- package/dist/middleware/compress.d.ts +15 -0
- package/dist/middleware/compress.js +93 -0
- package/dist/middleware/cors.d.ts +18 -0
- package/dist/middleware/cors.js +80 -0
- package/dist/middleware/csrf.d.ts +11 -0
- package/dist/middleware/csrf.js +65 -0
- package/dist/middleware/ip-restrict.d.ts +10 -0
- package/dist/middleware/ip-restrict.js +82 -0
- package/dist/middleware/middleware.d.ts +53 -0
- package/dist/middleware/middleware.js +112 -0
- package/dist/middleware/powered-by.d.ts +6 -0
- package/dist/middleware/powered-by.js +13 -0
- package/dist/middleware/rate-limit.d.ts +40 -0
- package/dist/middleware/rate-limit.js +90 -0
- package/dist/middleware/request-id.d.ts +25 -0
- package/dist/middleware/request-id.js +30 -0
- package/dist/middleware/secure-headers.d.ts +18 -0
- package/dist/middleware/secure-headers.js +36 -0
- package/dist/middleware/server-timing.d.ts +8 -0
- package/dist/middleware/server-timing.js +52 -0
- package/dist/middleware/timeout.d.ts +6 -0
- package/dist/middleware/timeout.js +29 -0
- package/dist/observability/curl-logger.d.ts +46 -0
- package/dist/observability/curl-logger.js +175 -0
- package/dist/observability/request-to-curl.d.ts +17 -0
- package/dist/observability/request-to-curl.js +47 -0
- package/dist/openapi/collect.d.ts +56 -18
- package/dist/openapi/collect.js +109 -23
- package/dist/openapi/components.d.ts +9 -0
- package/dist/openapi/components.js +90 -0
- package/dist/openapi/docs-page.d.ts +20 -18
- package/dist/openapi/docs-page.js +28 -46
- package/dist/openapi/document.d.ts +33 -26
- package/dist/openapi/document.js +21 -776
- package/dist/openapi/extract-schemas.d.ts +11 -0
- package/dist/openapi/extract-schemas.js +31 -0
- package/dist/openapi/generate.d.ts +47 -0
- package/dist/openapi/generate.js +180 -0
- package/dist/openapi/manifest.d.ts +41 -0
- package/dist/openapi/manifest.js +49 -0
- package/dist/openapi/output-keys.d.ts +6 -0
- package/dist/openapi/output-keys.js +24 -0
- package/dist/openapi/paths.d.ts +35 -0
- package/dist/openapi/paths.js +175 -0
- package/dist/openapi/register.d.ts +14 -3
- package/dist/openapi/register.js +13 -20
- package/dist/openapi/responses.d.ts +44 -0
- package/dist/openapi/responses.js +159 -0
- package/dist/openapi/scalar.d.ts +4 -14
- package/dist/openapi/scalar.js +5 -7
- package/dist/openapi/security.d.ts +4 -0
- package/dist/openapi/security.js +25 -0
- package/dist/openapi/serve.d.ts +25 -9
- package/dist/openapi/serve.js +108 -29
- package/dist/openapi/servers.d.ts +19 -0
- package/dist/openapi/servers.js +72 -0
- package/dist/openapi/swagger.d.ts +4 -14
- package/dist/openapi/swagger.js +5 -7
- package/dist/openapi/tags.d.ts +20 -0
- package/dist/openapi/tags.js +20 -0
- package/dist/openapi/webhooks.d.ts +19 -0
- package/dist/openapi/webhooks.js +70 -0
- package/dist/openapi/yaml.d.ts +8 -0
- package/dist/openapi/yaml.js +74 -0
- package/dist/proxy/headers.d.ts +30 -0
- package/dist/proxy/headers.js +86 -0
- package/dist/proxy/proxy.d.ts +39 -0
- package/dist/proxy/proxy.js +103 -0
- package/dist/proxy/upstream.d.ts +30 -0
- package/dist/proxy/upstream.js +116 -0
- package/dist/realtime/bus.d.ts +10 -13
- package/dist/realtime/bus.js +48 -93
- package/dist/realtime/invoke-user.d.ts +36 -0
- package/dist/realtime/invoke-user.js +103 -0
- package/dist/realtime/realtime.d.ts +7 -0
- package/dist/realtime/realtime.js +40 -0
- package/dist/realtime/route.d.ts +33 -27
- package/dist/realtime/route.js +27 -43
- package/dist/realtime/server.d.ts +24 -28
- package/dist/realtime/server.js +202 -225
- package/dist/response/binary.d.ts +18 -0
- package/dist/response/binary.js +10 -0
- package/dist/response/builder.d.ts +73 -0
- package/dist/response/builder.js +214 -0
- package/dist/response/cache-control.d.ts +30 -0
- package/dist/response/cache-control.js +74 -0
- package/dist/response/etag.d.ts +15 -0
- package/dist/response/etag.js +83 -0
- package/dist/response/media-type.d.ts +28 -0
- package/dist/response/media-type.js +97 -0
- package/dist/response/out-headers.d.ts +31 -0
- package/dist/response/out-headers.js +130 -0
- package/dist/response/pretty-json.d.ts +10 -0
- package/dist/response/pretty-json.js +44 -0
- package/dist/response/range.d.ts +19 -0
- package/dist/response/range.js +98 -0
- package/dist/response/response-headers.d.ts +11 -0
- package/dist/response/response-headers.js +21 -0
- package/dist/response/response.d.ts +69 -0
- package/dist/response/response.js +208 -0
- package/dist/response/sse.d.ts +41 -0
- package/dist/response/sse.js +73 -0
- package/dist/response/static.d.ts +20 -0
- package/dist/response/static.js +181 -0
- package/dist/response/status.d.ts +5 -0
- package/dist/response/status.js +68 -0
- package/dist/response/with-headers.d.ts +11 -0
- package/dist/response/with-headers.js +47 -0
- package/dist/routing/app-types.d.ts +181 -0
- package/dist/routing/app-types.js +1 -0
- package/dist/routing/app.d.ts +76 -0
- package/dist/routing/app.js +137 -0
- package/dist/routing/codegen-types.d.ts +17 -0
- package/dist/routing/codegen-types.js +1 -0
- package/dist/routing/delegate.d.ts +9 -0
- package/dist/routing/delegate.js +75 -0
- package/dist/routing/dispatch.d.ts +22 -0
- package/dist/routing/dispatch.js +255 -0
- package/dist/routing/finalize.d.ts +47 -0
- package/dist/routing/finalize.js +169 -0
- package/dist/routing/gateway-tree.d.ts +19 -0
- package/dist/routing/gateway-tree.js +74 -0
- package/dist/routing/invalidate-check.d.ts +58 -0
- package/dist/routing/invalidate-check.js +124 -0
- package/dist/routing/match.d.ts +22 -0
- package/dist/routing/match.js +108 -0
- package/dist/routing/middleware-chain.d.ts +16 -0
- package/dist/routing/middleware-chain.js +41 -0
- package/dist/routing/output-types.d.ts +91 -0
- package/dist/routing/output-types.js +1 -0
- package/dist/routing/pattern.d.ts +55 -0
- package/dist/routing/pattern.js +219 -0
- package/dist/routing/record.d.ts +18 -0
- package/dist/routing/record.js +4 -0
- package/dist/routing/register.d.ts +135 -0
- package/dist/routing/register.js +155 -0
- package/dist/routing/request-path.d.ts +30 -0
- package/dist/routing/request-path.js +173 -0
- package/dist/routing/route-builder.d.ts +160 -0
- package/dist/routing/route-builder.js +86 -0
- package/dist/routing/route-tree.d.ts +18 -0
- package/dist/routing/route-tree.js +91 -0
- package/dist/routing/settings-chain.d.ts +75 -0
- package/dist/routing/settings-chain.js +137 -0
- package/dist/routing/settings.d.ts +90 -0
- package/dist/routing/settings.js +44 -0
- package/dist/routing/tap.d.ts +31 -0
- package/dist/routing/tap.js +77 -0
- package/dist/routing/tree-merge.d.ts +7 -0
- package/dist/routing/tree-merge.js +77 -0
- package/dist/routing/tree.d.ts +85 -0
- package/dist/routing/tree.js +196 -0
- package/dist/routing/types.d.ts +20 -0
- package/dist/routing/types.js +1 -0
- package/dist/routing/ws-builder.d.ts +62 -0
- package/dist/routing/ws-builder.js +109 -0
- package/dist/runtime/detect-runtime.d.ts +16 -0
- package/dist/runtime/detect-runtime.js +11 -0
- package/dist/runtime/optional-peer.d.ts +10 -0
- package/dist/runtime/optional-peer.js +19 -0
- package/dist/schema/arktype.d.ts +7 -0
- package/dist/schema/arktype.js +13 -0
- package/dist/schema/canonicalize.d.ts +8 -0
- package/dist/schema/canonicalize.js +19 -0
- package/dist/schema/effect.d.ts +7 -0
- package/dist/schema/effect.js +4 -0
- package/dist/schema/naming.d.ts +31 -0
- package/dist/schema/naming.js +116 -0
- package/dist/schema/sanitize-spec.d.ts +15 -0
- package/dist/schema/sanitize-spec.js +43 -0
- package/dist/schema/slots.d.ts +15 -0
- package/dist/schema/slots.js +179 -0
- package/dist/schema/to-json-schema.d.ts +34 -0
- package/dist/schema/to-json-schema.js +94 -0
- package/dist/schema/valibot.d.ts +4 -0
- package/dist/schema/valibot.js +153 -0
- package/dist/schema/yup.d.ts +3 -0
- package/dist/schema/yup.js +57 -0
- package/dist/schema/zod.d.ts +6 -0
- package/dist/schema/zod.js +192 -0
- package/dist/security/crypto.d.ts +7 -0
- package/dist/security/crypto.js +30 -0
- package/dist/streaming/producer-stream.d.ts +45 -0
- package/dist/streaming/producer-stream.js +251 -0
- package/dist/telemetry/fields.d.ts +43 -0
- package/dist/telemetry/fields.js +64 -0
- package/dist/telemetry/log-format.d.ts +7 -0
- package/dist/telemetry/log-format.js +43 -0
- package/dist/telemetry/logger.d.ts +44 -0
- package/dist/telemetry/logger.js +122 -0
- package/dist/telemetry/otel-subpath.d.ts +7 -0
- package/dist/telemetry/otel-subpath.js +5 -0
- package/dist/telemetry/otel.d.ts +50 -57
- package/dist/telemetry/otel.js +54 -130
- package/dist/telemetry/request-log.d.ts +22 -0
- package/dist/telemetry/request-log.js +83 -0
- package/dist/telemetry/request-trace.d.ts +123 -0
- package/dist/telemetry/request-trace.js +199 -0
- package/dist/telemetry/span-lifecycle.d.ts +11 -0
- package/dist/telemetry/span-lifecycle.js +114 -0
- package/dist/telemetry/traceparent.d.ts +40 -0
- package/dist/telemetry/traceparent.js +73 -0
- package/dist/testing/testing.d.ts +42 -0
- package/dist/testing/testing.js +101 -0
- package/dist/validation/content-type.d.ts +21 -0
- package/dist/validation/content-type.js +42 -0
- package/dist/validation/standard-schema.d.ts +41 -0
- package/dist/validation/standard-schema.js +5 -0
- package/dist/validation/validate-input.d.ts +45 -0
- package/dist/validation/validate-input.js +174 -0
- package/dist/validation/validate-output.d.ts +34 -0
- package/dist/validation/validate-output.js +107 -0
- package/dist/ws/bun.d.ts +30 -25
- package/dist/ws/bun.js +42 -46
- package/dist/ws/cloudflare.d.ts +6 -75
- package/dist/ws/cloudflare.js +37 -104
- package/dist/ws/contract.d.ts +74 -0
- package/dist/ws/contract.js +83 -0
- package/dist/ws/node.d.ts +12 -21
- package/dist/ws/node.js +103 -151
- package/dist/ws/origin.d.ts +23 -0
- package/dist/ws/origin.js +48 -0
- package/dist/ws/route.d.ts +14 -0
- package/dist/ws/route.js +5 -0
- package/dist/ws/session.d.ts +15 -6
- package/dist/ws/session.js +22 -23
- package/dist/ws/shared.d.ts +23 -33
- package/dist/ws/shared.js +53 -39
- package/package.json +169 -251
- package/dist/accepts.d.ts +0 -12
- package/dist/accepts.d.ts.map +0 -1
- package/dist/accepts.js +0 -126
- package/dist/accepts.js.map +0 -1
- package/dist/body-kind.d.ts +0 -26
- package/dist/body-kind.d.ts.map +0 -1
- package/dist/body-kind.js +0 -70
- package/dist/body-kind.js.map +0 -1
- package/dist/body-limit.d.ts +0 -26
- package/dist/body-limit.d.ts.map +0 -1
- package/dist/body-limit.js +0 -126
- package/dist/body-limit.js.map +0 -1
- package/dist/build/index.d.ts.map +0 -1
- package/dist/build/index.js.map +0 -1
- package/dist/cli-args.d.ts +0 -33
- package/dist/cli-args.d.ts.map +0 -1
- package/dist/cli-args.js +0 -102
- package/dist/cli-args.js.map +0 -1
- package/dist/cli-go/auth.go +0 -26
- package/dist/cli-go/config.go +0 -192
- package/dist/cli-go/errors.go +0 -75
- package/dist/cli-go/multipart.go +0 -79
- package/dist/cli-go/output.go +0 -163
- package/dist/cli-go/root.go +0 -30
- package/dist/cli-go/stream.go +0 -88
- package/dist/cli-go/version.go +0 -5
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -209
- package/dist/cli.js.map +0 -1
- package/dist/client/defaults.d.ts +0 -12
- package/dist/client/defaults.d.ts.map +0 -1
- package/dist/client/defaults.js +0 -48
- package/dist/client/defaults.js.map +0 -1
- package/dist/client/error.d.ts +0 -49
- package/dist/client/error.d.ts.map +0 -1
- package/dist/client/error.js +0 -71
- package/dist/client/error.js.map +0 -1
- package/dist/client/http.d.ts +0 -155
- package/dist/client/http.d.ts.map +0 -1
- package/dist/client/http.js +0 -571
- package/dist/client/http.js.map +0 -1
- package/dist/client/index.d.ts +0 -23
- package/dist/client/index.d.ts.map +0 -1
- package/dist/client/index.js +0 -95
- package/dist/client/index.js.map +0 -1
- package/dist/client/path.d.ts +0 -26
- package/dist/client/path.d.ts.map +0 -1
- package/dist/client/path.js +0 -163
- package/dist/client/path.js.map +0 -1
- package/dist/client/redirect-policy.d.ts +0 -12
- package/dist/client/redirect-policy.d.ts.map +0 -1
- package/dist/client/redirect-policy.js +0 -20
- package/dist/client/redirect-policy.js.map +0 -1
- package/dist/client/sdk.d.ts +0 -70
- package/dist/client/sdk.d.ts.map +0 -1
- package/dist/client/sdk.js +0 -292
- package/dist/client/sdk.js.map +0 -1
- package/dist/client/sse.d.ts +0 -23
- package/dist/client/sse.d.ts.map +0 -1
- package/dist/client/sse.js +0 -129
- package/dist/client/sse.js.map +0 -1
- package/dist/client/types.d.ts +0 -124
- package/dist/client/types.d.ts.map +0 -1
- package/dist/client/types.js +0 -2
- package/dist/client/types.js.map +0 -1
- package/dist/client/ws.d.ts +0 -22
- package/dist/client/ws.d.ts.map +0 -1
- package/dist/client/ws.js +0 -112
- package/dist/client/ws.js.map +0 -1
- package/dist/client-go/errors.go +0 -236
- package/dist/client-go/export.go +0 -44
- package/dist/client-go/invalidation.go +0 -371
- package/dist/client-go/nullable.go +0 -62
- package/dist/client-go/realtime.go +0 -354
- package/dist/client-go/result.go +0 -20
- package/dist/client-go/runtime.go +0 -975
- package/dist/client-go/sse.go +0 -159
- package/dist/client-go/transport.go +0 -495
- package/dist/client-go/ws.go +0 -128
- package/dist/client-info.d.ts +0 -36
- package/dist/client-info.d.ts.map +0 -1
- package/dist/client-info.js +0 -53
- package/dist/client-info.js.map +0 -1
- package/dist/client-mcp/README.md +0 -10
- package/dist/client-mcp/server.ts +0 -221
- package/dist/client-mcp/types.ts +0 -19
- package/dist/client-python/_errors.py +0 -115
- package/dist/client-python/_invalidation.py +0 -494
- package/dist/client-python/_realtime.py +0 -179
- package/dist/client-python/_runtime.py +0 -860
- package/dist/client-python/_sse.py +0 -155
- package/dist/client-python/_transport.py +0 -366
- package/dist/client-python/_ws.py +0 -159
- package/dist/client-python/py.typed +0 -0
- package/dist/client-rust/errors.rs +0 -220
- package/dist/client-rust/invalidation.rs +0 -412
- package/dist/client-rust/invalidation_sync.rs +0 -93
- package/dist/client-rust/nullable.rs +0 -17
- package/dist/client-rust/realtime.rs +0 -702
- package/dist/client-rust/result.rs +0 -22
- package/dist/client-rust/runtime.rs +0 -980
- package/dist/client-rust/runtime_sync.rs +0 -484
- package/dist/client-rust/sse.rs +0 -188
- package/dist/client-rust/ws.rs +0 -167
- package/dist/codegen-go-cli.d.ts +0 -22
- package/dist/codegen-go-cli.d.ts.map +0 -1
- package/dist/codegen-go-cli.js +0 -964
- package/dist/codegen-go-cli.js.map +0 -1
- package/dist/codegen-go.d.ts +0 -41
- package/dist/codegen-go.d.ts.map +0 -1
- package/dist/codegen-go.js +0 -872
- package/dist/codegen-go.js.map +0 -1
- package/dist/codegen-hash.d.ts +0 -3
- package/dist/codegen-hash.d.ts.map +0 -1
- package/dist/codegen-hash.js +0 -9
- package/dist/codegen-hash.js.map +0 -1
- package/dist/codegen-ir.d.ts +0 -190
- package/dist/codegen-ir.d.ts.map +0 -1
- package/dist/codegen-ir.js +0 -661
- package/dist/codegen-ir.js.map +0 -1
- package/dist/codegen-lang.d.ts +0 -65
- package/dist/codegen-lang.d.ts.map +0 -1
- package/dist/codegen-lang.js +0 -526
- package/dist/codegen-lang.js.map +0 -1
- package/dist/codegen-load.d.ts +0 -31
- package/dist/codegen-load.d.ts.map +0 -1
- package/dist/codegen-load.js +0 -138
- package/dist/codegen-load.js.map +0 -1
- package/dist/codegen-loaders.d.ts +0 -12
- package/dist/codegen-loaders.d.ts.map +0 -1
- package/dist/codegen-loaders.js +0 -55
- package/dist/codegen-loaders.js.map +0 -1
- package/dist/codegen-mcp.d.ts +0 -13
- package/dist/codegen-mcp.d.ts.map +0 -1
- package/dist/codegen-mcp.js +0 -368
- package/dist/codegen-mcp.js.map +0 -1
- package/dist/codegen-python.d.ts +0 -33
- package/dist/codegen-python.d.ts.map +0 -1
- package/dist/codegen-python.js +0 -828
- package/dist/codegen-python.js.map +0 -1
- package/dist/codegen-route-tree-intern.d.ts +0 -40
- package/dist/codegen-route-tree-intern.d.ts.map +0 -1
- package/dist/codegen-route-tree-intern.js +0 -221
- package/dist/codegen-route-tree-intern.js.map +0 -1
- package/dist/codegen-rust.d.ts +0 -18
- package/dist/codegen-rust.d.ts.map +0 -1
- package/dist/codegen-rust.js +0 -1293
- package/dist/codegen-rust.js.map +0 -1
- package/dist/codegen-sanitize.d.ts +0 -3
- package/dist/codegen-sanitize.d.ts.map +0 -1
- package/dist/codegen-sanitize.js +0 -56
- package/dist/codegen-sanitize.js.map +0 -1
- package/dist/codegen-schema-naming.d.ts +0 -27
- package/dist/codegen-schema-naming.d.ts.map +0 -1
- package/dist/codegen-schema-naming.js +0 -150
- package/dist/codegen-schema-naming.js.map +0 -1
- package/dist/codegen-sdk-model.d.ts +0 -71
- package/dist/codegen-sdk-model.d.ts.map +0 -1
- package/dist/codegen-sdk-model.js +0 -179
- package/dist/codegen-sdk-model.js.map +0 -1
- package/dist/codegen.d.ts +0 -187
- package/dist/codegen.d.ts.map +0 -1
- package/dist/codegen.js +0 -4619
- package/dist/codegen.js.map +0 -1
- package/dist/context.d.ts +0 -86
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js +0 -242
- package/dist/context.js.map +0 -1
- package/dist/cookie-sign.d.ts +0 -17
- package/dist/cookie-sign.d.ts.map +0 -1
- package/dist/cookie-sign.js +0 -104
- package/dist/cookie-sign.js.map +0 -1
- package/dist/cookie.d.ts +0 -24
- package/dist/cookie.d.ts.map +0 -1
- package/dist/cookie.js +0 -138
- package/dist/cookie.js.map +0 -1
- package/dist/cors.d.ts +0 -14
- package/dist/cors.d.ts.map +0 -1
- package/dist/cors.js +0 -87
- package/dist/cors.js.map +0 -1
- package/dist/crypto.d.ts +0 -7
- package/dist/crypto.d.ts.map +0 -1
- package/dist/crypto.js +0 -38
- package/dist/crypto.js.map +0 -1
- package/dist/csrf.d.ts +0 -28
- package/dist/csrf.d.ts.map +0 -1
- package/dist/csrf.js +0 -79
- package/dist/csrf.js.map +0 -1
- package/dist/curl-logger.d.ts +0 -44
- package/dist/curl-logger.d.ts.map +0 -1
- package/dist/curl-logger.js +0 -199
- package/dist/curl-logger.js.map +0 -1
- package/dist/detect-runtime.d.ts +0 -16
- package/dist/detect-runtime.d.ts.map +0 -1
- package/dist/detect-runtime.js +0 -13
- package/dist/detect-runtime.js.map +0 -1
- package/dist/dict.d.ts +0 -11
- package/dist/dict.d.ts.map +0 -1
- package/dist/dict.js +0 -13
- package/dist/dict.js.map +0 -1
- package/dist/error.d.ts +0 -21
- package/dist/error.d.ts.map +0 -1
- package/dist/error.js +0 -44
- package/dist/error.js.map +0 -1
- package/dist/errors.d.ts +0 -40
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -39
- package/dist/errors.js.map +0 -1
- package/dist/etag.d.ts +0 -11
- package/dist/etag.d.ts.map +0 -1
- package/dist/etag.js +0 -82
- package/dist/etag.js.map +0 -1
- package/dist/feature-detect.d.ts +0 -25
- package/dist/feature-detect.d.ts.map +0 -1
- package/dist/feature-detect.js +0 -144
- package/dist/feature-detect.js.map +0 -1
- package/dist/feature-load.d.ts +0 -3
- package/dist/feature-load.d.ts.map +0 -1
- package/dist/feature-load.js +0 -36
- package/dist/feature-load.js.map +0 -1
- package/dist/feature-slots.d.ts +0 -44
- package/dist/feature-slots.d.ts.map +0 -1
- package/dist/feature-slots.js +0 -48
- package/dist/feature-slots.js.map +0 -1
- package/dist/fetch-request.d.ts +0 -10
- package/dist/fetch-request.d.ts.map +0 -1
- package/dist/fetch-request.js +0 -13
- package/dist/fetch-request.js.map +0 -1
- package/dist/gen-process.d.ts +0 -15
- package/dist/gen-process.d.ts.map +0 -1
- package/dist/gen-process.js +0 -43
- package/dist/gen-process.js.map +0 -1
- package/dist/gen-write.d.ts +0 -19
- package/dist/gen-write.d.ts.map +0 -1
- package/dist/gen-write.js +0 -120
- package/dist/gen-write.js.map +0 -1
- package/dist/glob.d.ts +0 -21
- package/dist/glob.d.ts.map +0 -1
- package/dist/glob.js +0 -115
- package/dist/glob.js.map +0 -1
- package/dist/go-type-emitter.d.ts +0 -47
- package/dist/go-type-emitter.d.ts.map +0 -1
- package/dist/go-type-emitter.js +0 -594
- package/dist/go-type-emitter.js.map +0 -1
- package/dist/honey-response.d.ts +0 -82
- package/dist/honey-response.d.ts.map +0 -1
- package/dist/honey-response.js +0 -338
- package/dist/honey-response.js.map +0 -1
- package/dist/i18n-slot.d.ts +0 -15
- package/dist/i18n-slot.d.ts.map +0 -1
- package/dist/i18n-slot.js +0 -14
- package/dist/i18n-slot.js.map +0 -1
- package/dist/i18n.d.ts +0 -29
- package/dist/i18n.d.ts.map +0 -1
- package/dist/i18n.js +0 -250
- package/dist/i18n.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/init.d.ts +0 -5
- package/dist/init.d.ts.map +0 -1
- package/dist/init.js +0 -140
- package/dist/init.js.map +0 -1
- package/dist/input.d.ts +0 -6
- package/dist/input.d.ts.map +0 -1
- package/dist/input.js +0 -4
- package/dist/input.js.map +0 -1
- package/dist/invalidate-check.d.ts +0 -61
- package/dist/invalidate-check.d.ts.map +0 -1
- package/dist/invalidate-check.js +0 -163
- package/dist/invalidate-check.js.map +0 -1
- package/dist/invoke-user.d.ts +0 -35
- package/dist/invoke-user.d.ts.map +0 -1
- package/dist/invoke-user.js +0 -73
- package/dist/invoke-user.js.map +0 -1
- package/dist/ip-restrict.d.ts +0 -24
- package/dist/ip-restrict.d.ts.map +0 -1
- package/dist/ip-restrict.js +0 -60
- package/dist/ip-restrict.js.map +0 -1
- package/dist/ip.d.ts +0 -39
- package/dist/ip.d.ts.map +0 -1
- package/dist/ip.js +0 -209
- package/dist/ip.js.map +0 -1
- package/dist/logger.d.ts +0 -45
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js +0 -113
- package/dist/logger.js.map +0 -1
- package/dist/media-type.d.ts +0 -30
- package/dist/media-type.d.ts.map +0 -1
- package/dist/media-type.js +0 -97
- package/dist/media-type.js.map +0 -1
- package/dist/meta-spec-merge.d.ts +0 -32
- package/dist/meta-spec-merge.d.ts.map +0 -1
- package/dist/meta-spec-merge.js +0 -68
- package/dist/meta-spec-merge.js.map +0 -1
- package/dist/meta-spec.d.ts +0 -94
- package/dist/meta-spec.d.ts.map +0 -1
- package/dist/meta-spec.js +0 -535
- package/dist/meta-spec.js.map +0 -1
- package/dist/middleware.d.ts +0 -77
- package/dist/middleware.d.ts.map +0 -1
- package/dist/middleware.js +0 -253
- package/dist/middleware.js.map +0 -1
- package/dist/node-request.d.ts +0 -104
- package/dist/node-request.d.ts.map +0 -1
- package/dist/node-request.js +0 -407
- package/dist/node-request.js.map +0 -1
- package/dist/node.d.ts +0 -30
- package/dist/node.d.ts.map +0 -1
- package/dist/node.js +0 -396
- package/dist/node.js.map +0 -1
- package/dist/openapi/collect.d.ts.map +0 -1
- package/dist/openapi/collect.js.map +0 -1
- package/dist/openapi/docs-page.d.ts.map +0 -1
- package/dist/openapi/docs-page.js.map +0 -1
- package/dist/openapi/document.d.ts.map +0 -1
- package/dist/openapi/document.js.map +0 -1
- package/dist/openapi/json-schema-slot.d.ts +0 -12
- package/dist/openapi/json-schema-slot.d.ts.map +0 -1
- package/dist/openapi/json-schema-slot.js +0 -38
- package/dist/openapi/json-schema-slot.js.map +0 -1
- package/dist/openapi/register.d.ts.map +0 -1
- package/dist/openapi/register.js.map +0 -1
- package/dist/openapi/scalar.d.ts.map +0 -1
- package/dist/openapi/scalar.js.map +0 -1
- package/dist/openapi/serve.d.ts.map +0 -1
- package/dist/openapi/serve.js.map +0 -1
- package/dist/openapi/spec-factory.d.ts +0 -65
- package/dist/openapi/spec-factory.d.ts.map +0 -1
- package/dist/openapi/spec-factory.js +0 -52
- package/dist/openapi/spec-factory.js.map +0 -1
- package/dist/openapi/spec.d.ts +0 -29
- package/dist/openapi/spec.d.ts.map +0 -1
- package/dist/openapi/spec.js +0 -50
- package/dist/openapi/spec.js.map +0 -1
- package/dist/openapi/swagger.d.ts.map +0 -1
- package/dist/openapi/swagger.js.map +0 -1
- package/dist/pattern.d.ts +0 -71
- package/dist/pattern.d.ts.map +0 -1
- package/dist/pattern.js +0 -239
- package/dist/pattern.js.map +0 -1
- package/dist/peer.d.ts +0 -17
- package/dist/peer.d.ts.map +0 -1
- package/dist/peer.js +0 -50
- package/dist/peer.js.map +0 -1
- package/dist/plugin.d.ts +0 -228
- package/dist/plugin.d.ts.map +0 -1
- package/dist/plugin.js +0 -666
- package/dist/plugin.js.map +0 -1
- package/dist/powered-by.d.ts +0 -7
- package/dist/powered-by.d.ts.map +0 -1
- package/dist/powered-by.js +0 -11
- package/dist/powered-by.js.map +0 -1
- package/dist/pretty-json.d.ts +0 -10
- package/dist/pretty-json.d.ts.map +0 -1
- package/dist/pretty-json.js +0 -47
- package/dist/pretty-json.js.map +0 -1
- package/dist/producer-stream.d.ts +0 -47
- package/dist/producer-stream.d.ts.map +0 -1
- package/dist/producer-stream.js +0 -267
- package/dist/producer-stream.js.map +0 -1
- package/dist/proxy.d.ts +0 -90
- package/dist/proxy.d.ts.map +0 -1
- package/dist/proxy.js +0 -274
- package/dist/proxy.js.map +0 -1
- package/dist/python-type-emitter.d.ts +0 -24
- package/dist/python-type-emitter.d.ts.map +0 -1
- package/dist/python-type-emitter.js +0 -157
- package/dist/python-type-emitter.js.map +0 -1
- package/dist/realtime/bus.d.ts.map +0 -1
- package/dist/realtime/bus.js.map +0 -1
- package/dist/realtime/register.d.ts +0 -3
- package/dist/realtime/register.d.ts.map +0 -1
- package/dist/realtime/register.js +0 -10
- package/dist/realtime/register.js.map +0 -1
- package/dist/realtime/route.d.ts.map +0 -1
- package/dist/realtime/route.js.map +0 -1
- package/dist/realtime/server.d.ts.map +0 -1
- package/dist/realtime/server.js.map +0 -1
- package/dist/request-id.d.ts +0 -19
- package/dist/request-id.d.ts.map +0 -1
- package/dist/request-id.js +0 -16
- package/dist/request-id.js.map +0 -1
- package/dist/request-limits.d.ts +0 -3
- package/dist/request-limits.d.ts.map +0 -1
- package/dist/request-limits.js +0 -3
- package/dist/request-limits.js.map +0 -1
- package/dist/request-path.d.ts +0 -33
- package/dist/request-path.d.ts.map +0 -1
- package/dist/request-path.js +0 -178
- package/dist/request-path.js.map +0 -1
- package/dist/request-to-curl.d.ts +0 -15
- package/dist/request-to-curl.d.ts.map +0 -1
- package/dist/request-to-curl.js +0 -48
- package/dist/request-to-curl.js.map +0 -1
- package/dist/response.d.ts +0 -86
- package/dist/response.d.ts.map +0 -1
- package/dist/response.js +0 -313
- package/dist/response.js.map +0 -1
- package/dist/rust-type-emitter.d.ts +0 -44
- package/dist/rust-type-emitter.d.ts.map +0 -1
- package/dist/rust-type-emitter.js +0 -463
- package/dist/rust-type-emitter.js.map +0 -1
- package/dist/secure-headers.d.ts +0 -16
- package/dist/secure-headers.d.ts.map +0 -1
- package/dist/secure-headers.js +0 -53
- package/dist/secure-headers.js.map +0 -1
- package/dist/serve-register.d.ts +0 -6
- package/dist/serve-register.d.ts.map +0 -1
- package/dist/serve-register.js +0 -9
- package/dist/serve-register.js.map +0 -1
- package/dist/serve-slot.d.ts +0 -9
- package/dist/serve-slot.d.ts.map +0 -1
- package/dist/serve-slot.js +0 -52
- package/dist/serve-slot.js.map +0 -1
- package/dist/serve.d.ts +0 -38
- package/dist/serve.d.ts.map +0 -1
- package/dist/serve.js +0 -157
- package/dist/serve.js.map +0 -1
- package/dist/server-timing.d.ts +0 -9
- package/dist/server-timing.d.ts.map +0 -1
- package/dist/server-timing.js +0 -51
- package/dist/server-timing.js.map +0 -1
- package/dist/static.d.ts +0 -21
- package/dist/static.d.ts.map +0 -1
- package/dist/static.js +0 -102
- package/dist/static.js.map +0 -1
- package/dist/telemetry/otel.d.ts.map +0 -1
- package/dist/telemetry/otel.js.map +0 -1
- package/dist/testing.d.ts +0 -36
- package/dist/testing.d.ts.map +0 -1
- package/dist/testing.js +0 -124
- package/dist/testing.js.map +0 -1
- package/dist/timeout.d.ts +0 -13
- package/dist/timeout.d.ts.map +0 -1
- package/dist/timeout.js +0 -36
- package/dist/timeout.js.map +0 -1
- package/dist/tree.d.ts +0 -193
- package/dist/tree.d.ts.map +0 -1
- package/dist/tree.js +0 -437
- package/dist/tree.js.map +0 -1
- package/dist/trust.d.ts +0 -21
- package/dist/trust.d.ts.map +0 -1
- package/dist/trust.js +0 -100
- package/dist/trust.js.map +0 -1
- package/dist/ts-type-emitter.d.ts +0 -8
- package/dist/ts-type-emitter.d.ts.map +0 -1
- package/dist/ts-type-emitter.js +0 -150
- package/dist/ts-type-emitter.js.map +0 -1
- package/dist/type-emitter.d.ts +0 -36
- package/dist/type-emitter.d.ts.map +0 -1
- package/dist/type-emitter.js +0 -729
- package/dist/type-emitter.js.map +0 -1
- package/dist/type-extractor.d.ts +0 -43
- package/dist/type-extractor.d.ts.map +0 -1
- package/dist/type-extractor.js +0 -819
- package/dist/type-extractor.js.map +0 -1
- package/dist/types.d.ts +0 -467
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -96
- package/dist/types.js.map +0 -1
- package/dist/validation.d.ts +0 -31
- package/dist/validation.d.ts.map +0 -1
- package/dist/validation.js +0 -335
- package/dist/validation.js.map +0 -1
- package/dist/with-headers.d.ts +0 -15
- package/dist/with-headers.d.ts.map +0 -1
- package/dist/with-headers.js +0 -45
- package/dist/with-headers.js.map +0 -1
- package/dist/ws/bun.d.ts.map +0 -1
- package/dist/ws/bun.js.map +0 -1
- package/dist/ws/cloudflare.d.ts.map +0 -1
- package/dist/ws/cloudflare.js.map +0 -1
- package/dist/ws/deno.d.ts +0 -13
- package/dist/ws/deno.d.ts.map +0 -1
- package/dist/ws/deno.js +0 -133
- package/dist/ws/deno.js.map +0 -1
- package/dist/ws/node.d.ts.map +0 -1
- package/dist/ws/node.js.map +0 -1
- package/dist/ws/session.d.ts.map +0 -1
- package/dist/ws/session.js.map +0 -1
- package/dist/ws/shared.d.ts.map +0 -1
- package/dist/ws/shared.js.map +0 -1
- package/dist/ws-origin.d.ts +0 -20
- package/dist/ws-origin.d.ts.map +0 -1
- package/dist/ws-origin.js +0 -41
- package/dist/ws-origin.js.map +0 -1
- package/dist/yaml.d.ts +0 -18
- package/dist/yaml.d.ts.map +0 -1
- package/dist/yaml.js +0 -101
- package/dist/yaml.js.map +0 -1
- package/docs/api-ref/go.md +0 -399
- package/docs/api-ref/python.md +0 -399
- package/docs/api-ref/rust.md +0 -399
- package/docs/api-ref/typescript.md +0 -399
- package/docs/invalidate-spec.md +0 -333
- package/docs/meta-spec.md +0 -555
- package/docs/packaging.md +0 -104
- package/docs/regression-matrix/README.md +0 -32
- package/docs/regression-matrix/review.md +0 -44
- package/docs/regression-matrix/ws1-3.md +0 -97
- package/docs/regression-matrix/ws4-8.md +0 -107
- package/docs/regression-matrix/ws9-12.md +0 -266
- package/docs/sdk.md +0 -798
- package/src/accepts.ts +0 -136
- package/src/body-kind.ts +0 -67
- package/src/body-limit.ts +0 -152
- package/src/build/index.ts +0 -217
- package/src/cli-args.ts +0 -123
- package/src/cli-go/auth.go +0 -26
- package/src/cli-go/config.go +0 -192
- package/src/cli-go/errors.go +0 -75
- package/src/cli-go/multipart.go +0 -79
- package/src/cli-go/output.go +0 -163
- package/src/cli-go/root.go +0 -30
- package/src/cli-go/stream.go +0 -88
- package/src/cli-go/version.go +0 -5
- package/src/cli.ts +0 -209
- package/src/client/defaults.ts +0 -47
- package/src/client/error.ts +0 -82
- package/src/client/http.ts +0 -737
- package/src/client/index.ts +0 -157
- package/src/client/path.ts +0 -169
- package/src/client/redirect-policy.ts +0 -19
- package/src/client/sdk.ts +0 -351
- package/src/client/sse.ts +0 -128
- package/src/client/types.ts +0 -206
- package/src/client/ws.ts +0 -149
- package/src/client-go/errors.go +0 -236
- package/src/client-go/export.go +0 -44
- package/src/client-go/invalidation.go +0 -371
- package/src/client-go/nullable.go +0 -62
- package/src/client-go/realtime.go +0 -354
- package/src/client-go/result.go +0 -20
- package/src/client-go/runtime.go +0 -975
- package/src/client-go/sse.go +0 -159
- package/src/client-go/transport.go +0 -495
- package/src/client-go/ws.go +0 -128
- package/src/client-info.ts +0 -79
- package/src/client-mcp/README.md +0 -10
- package/src/client-mcp/server.ts +0 -221
- package/src/client-mcp/types.ts +0 -19
- package/src/client-python/_errors.py +0 -115
- package/src/client-python/_invalidation.py +0 -494
- package/src/client-python/_realtime.py +0 -179
- package/src/client-python/_runtime.py +0 -860
- package/src/client-python/_sse.py +0 -155
- package/src/client-python/_transport.py +0 -366
- package/src/client-python/_ws.py +0 -159
- package/src/client-python/py.typed +0 -0
- package/src/client-rust/errors.rs +0 -220
- package/src/client-rust/invalidation.rs +0 -412
- package/src/client-rust/invalidation_sync.rs +0 -93
- package/src/client-rust/nullable.rs +0 -17
- package/src/client-rust/realtime.rs +0 -702
- package/src/client-rust/result.rs +0 -22
- package/src/client-rust/runtime.rs +0 -980
- package/src/client-rust/runtime_sync.rs +0 -484
- package/src/client-rust/sse.rs +0 -188
- package/src/client-rust/ws.rs +0 -167
- package/src/codegen-go-cli.ts +0 -1066
- package/src/codegen-go.ts +0 -970
- package/src/codegen-hash.ts +0 -8
- package/src/codegen-ir.ts +0 -812
- package/src/codegen-lang.ts +0 -517
- package/src/codegen-load.ts +0 -150
- package/src/codegen-loaders.ts +0 -50
- package/src/codegen-mcp.ts +0 -445
- package/src/codegen-python.ts +0 -916
- package/src/codegen-route-tree-intern.ts +0 -198
- package/src/codegen-rust.ts +0 -1402
- package/src/codegen-sanitize.ts +0 -57
- package/src/codegen-schema-naming.ts +0 -165
- package/src/codegen-sdk-model.ts +0 -228
- package/src/codegen.ts +0 -5089
- package/src/context.ts +0 -325
- package/src/cookie-sign.ts +0 -119
- package/src/cookie.ts +0 -143
- package/src/cors.ts +0 -95
- package/src/crypto.ts +0 -38
- package/src/csrf.ts +0 -86
- package/src/curl-logger.ts +0 -258
- package/src/detect-runtime.ts +0 -17
- package/src/dict.ts +0 -12
- package/src/error.ts +0 -55
- package/src/errors.ts +0 -85
- package/src/etag.ts +0 -97
- package/src/feature-detect.ts +0 -147
- package/src/feature-load.ts +0 -23
- package/src/feature-slots.ts +0 -70
- package/src/fetch-request.ts +0 -13
- package/src/gen-process.ts +0 -42
- package/src/gen-write.ts +0 -127
- package/src/glob.ts +0 -109
- package/src/go-type-emitter.ts +0 -660
- package/src/honey-response.ts +0 -379
- package/src/i18n-slot.ts +0 -30
- package/src/i18n.ts +0 -300
- package/src/index.ts +0 -3829
- package/src/init.ts +0 -161
- package/src/input.ts +0 -8
- package/src/invalidate-check.ts +0 -205
- package/src/invoke-user.ts +0 -95
- package/src/ip-restrict.ts +0 -79
- package/src/ip.ts +0 -194
- package/src/logger.ts +0 -178
- package/src/media-type.ts +0 -104
- package/src/meta-spec-merge.ts +0 -80
- package/src/meta-spec.ts +0 -718
- package/src/middleware.ts +0 -331
- package/src/node-request.ts +0 -431
- package/src/node.ts +0 -454
- package/src/openapi/collect.ts +0 -50
- package/src/openapi/docs-page.ts +0 -89
- package/src/openapi/document.ts +0 -893
- package/src/openapi/json-schema-slot.ts +0 -53
- package/src/openapi/register.ts +0 -23
- package/src/openapi/scalar.ts +0 -34
- package/src/openapi/serve.ts +0 -39
- package/src/openapi/spec-factory.ts +0 -100
- package/src/openapi/spec.ts +0 -74
- package/src/openapi/swagger.ts +0 -35
- package/src/pattern.ts +0 -245
- package/src/peer.ts +0 -53
- package/src/plugin.ts +0 -864
- package/src/powered-by.ts +0 -18
- package/src/pretty-json.ts +0 -56
- package/src/producer-stream.ts +0 -296
- package/src/proxy.ts +0 -370
- package/src/python-type-emitter.ts +0 -181
- package/src/realtime/bus.ts +0 -140
- package/src/realtime/register.ts +0 -13
- package/src/realtime/route.ts +0 -153
- package/src/realtime/server.ts +0 -298
- package/src/request-id.ts +0 -32
- package/src/request-limits.ts +0 -2
- package/src/request-path.ts +0 -165
- package/src/request-to-curl.ts +0 -52
- package/src/response.ts +0 -411
- package/src/rust-type-emitter.ts +0 -548
- package/src/secure-headers.ts +0 -74
- package/src/serve-register.ts +0 -12
- package/src/serve-slot.ts +0 -58
- package/src/serve.ts +0 -220
- package/src/server-timing.ts +0 -71
- package/src/static.ts +0 -112
- package/src/telemetry/otel.ts +0 -156
- package/src/testing.ts +0 -167
- package/src/timeout.ts +0 -45
- package/src/tree.ts +0 -554
- package/src/trust.ts +0 -117
- package/src/ts-type-emitter.ts +0 -168
- package/src/type-emitter.ts +0 -760
- package/src/type-extractor.ts +0 -855
- package/src/types.ts +0 -756
- package/src/validation.ts +0 -413
- package/src/with-headers.ts +0 -45
- package/src/ws/bun.ts +0 -120
- package/src/ws/cloudflare.ts +0 -192
- package/src/ws/deno.ts +0 -188
- package/src/ws/node.ts +0 -240
- package/src/ws/session.ts +0 -73
- package/src/ws/shared.ts +0 -140
- package/src/ws-origin.ts +0 -53
- package/src/yaml.ts +0 -103
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The document's tags: every tag an operation names, once, in the order operations first name
|
|
3
|
+
* them, each merged with what the caller declares for it (description, externalDocs,
|
|
4
|
+
* x-displayName). Tags are explicit: nothing is derived from paths. A declared tag no operation
|
|
5
|
+
* names is not listed, and said; a tag declared twice is refused.
|
|
6
|
+
*/
|
|
7
|
+
import type { EmittedOperation } from "./paths.ts";
|
|
8
|
+
export type OpenApiExternalDocs = {
|
|
9
|
+
readonly description?: string;
|
|
10
|
+
readonly url: string;
|
|
11
|
+
};
|
|
12
|
+
export type OpenApiTag = {
|
|
13
|
+
readonly description?: string;
|
|
14
|
+
readonly externalDocs?: OpenApiExternalDocs;
|
|
15
|
+
readonly name: string;
|
|
16
|
+
readonly "x-displayName"?: string;
|
|
17
|
+
};
|
|
18
|
+
export type TagReport = (code: "INVALID_TAG" | "UNUSED_TAG", level: "error" | "warn", message: string) => void;
|
|
19
|
+
/** The tags `operations` name, first-seen, with the declared metadata of each. */
|
|
20
|
+
export declare function tagsOf(operations: readonly EmittedOperation[], declared: readonly OpenApiTag[] | undefined, report: TagReport): OpenApiTag[];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** The tags `operations` name, first-seen, with the declared metadata of each. */
|
|
2
|
+
export function tagsOf(operations, declared, report) {
|
|
3
|
+
const byName = new Map();
|
|
4
|
+
for (const tag of declared ?? []) {
|
|
5
|
+
if (byName.has(tag.name))
|
|
6
|
+
report("INVALID_TAG", "error", `tag "${tag.name}" is declared twice`);
|
|
7
|
+
else
|
|
8
|
+
byName.set(tag.name, tag);
|
|
9
|
+
}
|
|
10
|
+
const named = new Set();
|
|
11
|
+
for (const { operation } of operations) {
|
|
12
|
+
for (const name of Array.isArray(operation.tags) ? operation.tags : [])
|
|
13
|
+
named.add(name);
|
|
14
|
+
}
|
|
15
|
+
for (const name of byName.keys()) {
|
|
16
|
+
if (!named.has(name))
|
|
17
|
+
report("UNUSED_TAG", "warn", `tag "${name}" is declared but no operation names it`);
|
|
18
|
+
}
|
|
19
|
+
return [...named].map((name) => structuredClone(byName.get(name) ?? { name }));
|
|
20
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Operation } from "./paths.ts";
|
|
2
|
+
import type { Convert } from "./responses.ts";
|
|
3
|
+
export type WebhookSignature = {
|
|
4
|
+
readonly algorithm: "hmac-sha256";
|
|
5
|
+
readonly encoding: "base64" | "hex";
|
|
6
|
+
readonly header: string;
|
|
7
|
+
/** what precedes the digest in the header, as `sha256=` */
|
|
8
|
+
readonly prefix?: string;
|
|
9
|
+
};
|
|
10
|
+
export type OpenApiWebhook = {
|
|
11
|
+
readonly body: unknown;
|
|
12
|
+
readonly description?: string;
|
|
13
|
+
/** `"post"` by default */
|
|
14
|
+
readonly method?: string;
|
|
15
|
+
readonly signature?: WebhookSignature;
|
|
16
|
+
readonly summary?: string;
|
|
17
|
+
};
|
|
18
|
+
/** The 3.1 `webhooks` of `webhooks`, by name in code-unit order; each refusal reported through `error`. */
|
|
19
|
+
export declare function webhooksOf(webhooks: Readonly<Record<string, OpenApiWebhook>> | undefined, convert: Convert, error: (message: string) => void): Record<string, Record<string, Operation>>;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The document's webhooks (OpenAPI 3.1): each request the API sends a subscriber, by name, as the
|
|
3
|
+
* operation the subscriber serves. Its body converts on the output side, as the API writes it. A
|
|
4
|
+
* signed webhook states how as `x-honey-signature`, which the SDKs' verify helpers read; a
|
|
5
|
+
* declaration that cannot be signed or sent as written is refused.
|
|
6
|
+
*/
|
|
7
|
+
import { compareCodeUnits } from "../schema/canonicalize.js";
|
|
8
|
+
const METHODS = ["delete", "get", "patch", "post", "put"];
|
|
9
|
+
/* C0, DEL and C1 */
|
|
10
|
+
const CONTROL = /\p{Cc}/u;
|
|
11
|
+
/* a summary or description is CommonMark text: tabs and line breaks are its own */
|
|
12
|
+
const STRAY = /(?![\t\n\r])\p{Cc}/u;
|
|
13
|
+
/* RFC 9110 token: a header name */
|
|
14
|
+
const TOKEN = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;
|
|
15
|
+
/** Each reason `signature` cannot be checked as written. */
|
|
16
|
+
function signatureErrors(signature) {
|
|
17
|
+
const errors = [];
|
|
18
|
+
if (signature.algorithm !== "hmac-sha256")
|
|
19
|
+
errors.push(`signature algorithm "${signature.algorithm}" is not hmac-sha256`);
|
|
20
|
+
if (signature.encoding !== "hex" && signature.encoding !== "base64")
|
|
21
|
+
errors.push(`signature encoding "${signature.encoding}" is not hex or base64`);
|
|
22
|
+
if (!TOKEN.test(signature.header))
|
|
23
|
+
errors.push(`signature header ${JSON.stringify(signature.header)} is not a header name`);
|
|
24
|
+
if (signature.prefix !== undefined && CONTROL.test(signature.prefix))
|
|
25
|
+
errors.push("the signature prefix holds a control character");
|
|
26
|
+
return errors;
|
|
27
|
+
}
|
|
28
|
+
/** Each reason `webhook` cannot be sent as written. */
|
|
29
|
+
function webhookErrors(webhook, method) {
|
|
30
|
+
const errors = METHODS.includes(method) ? [] : [`method "${webhook.method}" is not one of ${METHODS.join(", ")}`];
|
|
31
|
+
for (const [field, text] of [
|
|
32
|
+
["summary", webhook.summary],
|
|
33
|
+
["description", webhook.description],
|
|
34
|
+
]) {
|
|
35
|
+
if (text !== undefined && STRAY.test(text))
|
|
36
|
+
errors.push(`the ${field} holds a control character`);
|
|
37
|
+
}
|
|
38
|
+
return webhook.signature === undefined ? errors : [...errors, ...signatureErrors(webhook.signature)];
|
|
39
|
+
}
|
|
40
|
+
/** The 3.1 `webhooks` of `webhooks`, by name in code-unit order; each refusal reported through `error`. */
|
|
41
|
+
export function webhooksOf(webhooks, convert, error) {
|
|
42
|
+
const out = {};
|
|
43
|
+
for (const name of Object.keys(webhooks ?? {}).sort(compareCodeUnits)) {
|
|
44
|
+
const webhook = webhooks[name];
|
|
45
|
+
const method = (webhook.method ?? "post").toLowerCase();
|
|
46
|
+
if (name === "")
|
|
47
|
+
error("a webhook needs a name");
|
|
48
|
+
else if (CONTROL.test(name))
|
|
49
|
+
error(`webhook ${JSON.stringify(name)}: the name holds a control character`);
|
|
50
|
+
for (const reason of webhookErrors(webhook, method))
|
|
51
|
+
error(`webhook ${JSON.stringify(name)}: ${reason}`);
|
|
52
|
+
const operation = {};
|
|
53
|
+
if (webhook.summary !== undefined)
|
|
54
|
+
operation.summary = webhook.summary;
|
|
55
|
+
if (webhook.description !== undefined)
|
|
56
|
+
operation.description = webhook.description;
|
|
57
|
+
const schema = convert(webhook.body, "output", `${name}Webhook`);
|
|
58
|
+
operation.requestBody = { content: { "application/json": { schema } }, required: true };
|
|
59
|
+
operation.responses = { "200": { description: "Received" } };
|
|
60
|
+
if (webhook.signature !== undefined)
|
|
61
|
+
operation["x-honey-signature"] = signatureOf(webhook.signature);
|
|
62
|
+
out[name] = { [method]: operation };
|
|
63
|
+
}
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
/** The signature as the SDKs read it: its own fields only, in one order. */
|
|
67
|
+
function signatureOf(signature) {
|
|
68
|
+
const { algorithm, encoding, header, prefix } = signature;
|
|
69
|
+
return prefix === undefined ? { algorithm, encoding, header } : { algorithm, encoding, header, prefix };
|
|
70
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A JSON-compatible YAML 1.2 emitter: the same document as `JSON.stringify`, in another encoding.
|
|
3
|
+
* The value is first normalized through JSON (an undefined key is skipped, a Date is its ISO
|
|
4
|
+
* string, NaN is null); then every string that is not plainly safe is written double-quoted, which
|
|
5
|
+
* also reads the same under YAML 1.1 readers. Vendor-free: what a served `.yaml` is written with.
|
|
6
|
+
*/
|
|
7
|
+
/** `value` as YAML, ending in a newline; `undefined` is `null`, as JSON has no nothing. */
|
|
8
|
+
export declare function toYaml(value: unknown): string;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A JSON-compatible YAML 1.2 emitter: the same document as `JSON.stringify`, in another encoding.
|
|
3
|
+
* The value is first normalized through JSON (an undefined key is skipped, a Date is its ISO
|
|
4
|
+
* string, NaN is null); then every string that is not plainly safe is written double-quoted, which
|
|
5
|
+
* also reads the same under YAML 1.1 readers. Vendor-free: what a served `.yaml` is written with.
|
|
6
|
+
*/
|
|
7
|
+
const INDENT = " ";
|
|
8
|
+
/*
|
|
9
|
+
* A plain scalar is used only for a conservative shape: it starts with a letter, `_`, `/` or `$`
|
|
10
|
+
* and holds only word characters, `.`, `/`, `$`, `-`, `+`, `{}`, `()` and single inner spaces.
|
|
11
|
+
* That excludes every indicator, `: `, ` #`, a leading digit (numbers, 1.1 octal and sexagesimal)
|
|
12
|
+
* and `.inf`/`.nan`.
|
|
13
|
+
*/
|
|
14
|
+
const PLAIN = /^[A-Za-z_/$](?:[\w./${}()+-]| (?! ))*$/;
|
|
15
|
+
/* words YAML 1.1 or 1.2 reads as null or a boolean */
|
|
16
|
+
const RESERVED = /^(?:y|n|yes|no|on|off|true|false|null|~)$/i;
|
|
17
|
+
/* JSON string syntax is a YAML double-quoted scalar, but YAML forbids raw DEL, C1 bar NEL, the BOM and non-characters */
|
|
18
|
+
const UNPRINTABLE = /[\u007f-\u0084\u0086-\u009f]/g;
|
|
19
|
+
/** `value` as YAML, ending in a newline; `undefined` is `null`, as JSON has no nothing. */
|
|
20
|
+
export function toYaml(value) {
|
|
21
|
+
const json = JSON.stringify(value);
|
|
22
|
+
return `${emit(json === undefined ? null : JSON.parse(json), 0)}\n`;
|
|
23
|
+
}
|
|
24
|
+
function emit(value, indent) {
|
|
25
|
+
if (value === null || typeof value !== "object")
|
|
26
|
+
return scalar(value);
|
|
27
|
+
if (Array.isArray(value))
|
|
28
|
+
return emitArray(value, indent);
|
|
29
|
+
return emitObject(value, indent);
|
|
30
|
+
}
|
|
31
|
+
/** A JSON scalar: null, a boolean, a number or a string. */
|
|
32
|
+
function scalar(value) {
|
|
33
|
+
return typeof value === "string" ? emitString(value) : String(value);
|
|
34
|
+
}
|
|
35
|
+
function emitString(value) {
|
|
36
|
+
return PLAIN.test(value) && !value.endsWith(" ") && !RESERVED.test(value) ? value : quote(value);
|
|
37
|
+
}
|
|
38
|
+
function quote(value) {
|
|
39
|
+
return JSON.stringify(value).replace(UNPRINTABLE, (ch) => `\\u${ch.charCodeAt(0).toString(16).padStart(4, "0")}`);
|
|
40
|
+
}
|
|
41
|
+
function isNonEmptyCollection(value) {
|
|
42
|
+
return value !== null && typeof value === "object" && Object.keys(value).length > 0;
|
|
43
|
+
}
|
|
44
|
+
function emitArray(value, indent) {
|
|
45
|
+
if (value.length === 0)
|
|
46
|
+
return "[]";
|
|
47
|
+
const pad = INDENT.repeat(indent);
|
|
48
|
+
const childPad = INDENT.repeat(indent + 1);
|
|
49
|
+
return value
|
|
50
|
+
.map((item) => {
|
|
51
|
+
if (!isNonEmptyCollection(item))
|
|
52
|
+
return `${pad}- ${emit(item, 0)}`;
|
|
53
|
+
/* the item's first line, indented one level, moves up onto the dash */
|
|
54
|
+
const lines = emit(item, indent + 1).split("\n");
|
|
55
|
+
lines[0] = `${pad}- ${lines[0].slice(childPad.length)}`;
|
|
56
|
+
return lines.join("\n");
|
|
57
|
+
})
|
|
58
|
+
.join("\n");
|
|
59
|
+
}
|
|
60
|
+
function emitObject(value, indent) {
|
|
61
|
+
const keys = Object.keys(value);
|
|
62
|
+
if (keys.length === 0)
|
|
63
|
+
return "{}";
|
|
64
|
+
const pad = INDENT.repeat(indent);
|
|
65
|
+
return keys
|
|
66
|
+
.map((key) => {
|
|
67
|
+
const child = value[key];
|
|
68
|
+
const name = emitString(key);
|
|
69
|
+
return isNonEmptyCollection(child)
|
|
70
|
+
? `${pad}${name}:\n${emit(child, indent + 1)}`
|
|
71
|
+
: `${pad}${name}: ${emit(child, 0)}`;
|
|
72
|
+
})
|
|
73
|
+
.join("\n");
|
|
74
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The headers a proxy sends upstream and answers with. Hop-by-hop headers (RFC 9110 §7.6.1)
|
|
3
|
+
* describe one connection and never cross a proxy, in either direction, and neither does any
|
|
4
|
+
* header `Connection` names. Upstream, the client's `Host` and `Expect` stay behind, and the
|
|
5
|
+
* forwarding headers describe the client as the platform reported it (H23): `X-Forwarded-For` is
|
|
6
|
+
* `ctx.ip`, `-Proto` and `-Host` the request URL's; whatever forwarding headers the client wrote
|
|
7
|
+
* are dropped, never passed on. `CF-Connecting-IP` passes untouched: on Workers the edge set it,
|
|
8
|
+
* so a service-bound Worker downstream sees the same client.
|
|
9
|
+
*/
|
|
10
|
+
/** The headers an edit needs: native `Headers` and the plain map's `HoneyOutHeaders` both are. */
|
|
11
|
+
type Editable = {
|
|
12
|
+
delete(name: string): void;
|
|
13
|
+
get(name: string): string | null;
|
|
14
|
+
};
|
|
15
|
+
/** Drop every hop-by-hop header and every header `Connection` names; an upgrade may keep `Upgrade`. */
|
|
16
|
+
export declare function dropHopByHop(headers: Editable, keepUpgrade: boolean): void;
|
|
17
|
+
export type Upstream = {
|
|
18
|
+
/** `ctx.ip`; `undefined` when no forwarding headers are added. */
|
|
19
|
+
readonly client: string | null | undefined;
|
|
20
|
+
readonly websocket: boolean;
|
|
21
|
+
};
|
|
22
|
+
/** The request headers destination is handed: a copy, cleaned, with the forwarding headers set. */
|
|
23
|
+
export declare function upstreamHeaders(request: Request, upstream: Upstream): Headers;
|
|
24
|
+
/**
|
|
25
|
+
* The response headers the client gets, edited in place. `fetch()` hands back a decoded body with
|
|
26
|
+
* the `Content-Encoding` that described the encoded one; when `decoded`, that header and the
|
|
27
|
+
* encoded length go, so the headers describe the bytes the client receives.
|
|
28
|
+
*/
|
|
29
|
+
export declare function clientHeaders(headers: Editable, decoded: boolean): void;
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The headers a proxy sends upstream and answers with. Hop-by-hop headers (RFC 9110 §7.6.1)
|
|
3
|
+
* describe one connection and never cross a proxy, in either direction, and neither does any
|
|
4
|
+
* header `Connection` names. Upstream, the client's `Host` and `Expect` stay behind, and the
|
|
5
|
+
* forwarding headers describe the client as the platform reported it (H23): `X-Forwarded-For` is
|
|
6
|
+
* `ctx.ip`, `-Proto` and `-Host` the request URL's; whatever forwarding headers the client wrote
|
|
7
|
+
* are dropped, never passed on. `CF-Connecting-IP` passes untouched: on Workers the edge set it,
|
|
8
|
+
* so a service-bound Worker downstream sees the same client.
|
|
9
|
+
*/
|
|
10
|
+
/** `proxy-connection` is the pre-standard spelling clients still send. */
|
|
11
|
+
const HOP_BY_HOP = [
|
|
12
|
+
"connection",
|
|
13
|
+
"keep-alive",
|
|
14
|
+
"proxy-authenticate",
|
|
15
|
+
"proxy-authorization",
|
|
16
|
+
"proxy-connection",
|
|
17
|
+
"te",
|
|
18
|
+
"trailer",
|
|
19
|
+
"transfer-encoding",
|
|
20
|
+
"upgrade",
|
|
21
|
+
];
|
|
22
|
+
/** What a client may write about itself, and a proxy must never pass on as fact. */
|
|
23
|
+
const FORWARDING = [
|
|
24
|
+
"forwarded",
|
|
25
|
+
"x-forwarded-for",
|
|
26
|
+
"x-forwarded-host",
|
|
27
|
+
"x-forwarded-port",
|
|
28
|
+
"x-forwarded-proto",
|
|
29
|
+
"x-real-ip",
|
|
30
|
+
];
|
|
31
|
+
/** Drop every hop-by-hop header and every header `Connection` names; an upgrade may keep `Upgrade`. */
|
|
32
|
+
export function dropHopByHop(headers, keepUpgrade) {
|
|
33
|
+
const named = headers.get("connection");
|
|
34
|
+
if (named !== null) {
|
|
35
|
+
for (const token of named.split(",")) {
|
|
36
|
+
const name = token.trim().toLowerCase();
|
|
37
|
+
if (name !== "" && !(keepUpgrade && name === "upgrade"))
|
|
38
|
+
headers.delete(name);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
for (const name of HOP_BY_HOP)
|
|
42
|
+
if (!(keepUpgrade && name === "upgrade"))
|
|
43
|
+
headers.delete(name);
|
|
44
|
+
}
|
|
45
|
+
/** The scheme and host of a request URL, read without parsing it: a Request's URL always has a path. */
|
|
46
|
+
function originParts(url) {
|
|
47
|
+
const scheme = url.indexOf("://");
|
|
48
|
+
return { host: url.slice(scheme + 3, url.indexOf("/", scheme + 3)), proto: url.slice(0, scheme) };
|
|
49
|
+
}
|
|
50
|
+
/** The request headers destination is handed: a copy, cleaned, with the forwarding headers set. */
|
|
51
|
+
export function upstreamHeaders(request, upstream) {
|
|
52
|
+
const headers = new Headers(request.headers);
|
|
53
|
+
dropHopByHop(headers, upstream.websocket);
|
|
54
|
+
if (upstream.websocket) {
|
|
55
|
+
headers.set("upgrade", "websocket");
|
|
56
|
+
headers.set("connection", "upgrade");
|
|
57
|
+
}
|
|
58
|
+
headers.delete("host");
|
|
59
|
+
/* the proxy reads the body itself */
|
|
60
|
+
headers.delete("expect");
|
|
61
|
+
for (const name of FORWARDING)
|
|
62
|
+
headers.delete(name);
|
|
63
|
+
if (upstream.client !== undefined) {
|
|
64
|
+
const { host, proto } = originParts(request.url);
|
|
65
|
+
if (upstream.client !== null)
|
|
66
|
+
headers.set("x-forwarded-for", upstream.client);
|
|
67
|
+
headers.set("x-forwarded-proto", proto);
|
|
68
|
+
headers.set("x-forwarded-host", host);
|
|
69
|
+
}
|
|
70
|
+
return headers;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* The response headers the client gets, edited in place. `fetch()` hands back a decoded body with
|
|
74
|
+
* the `Content-Encoding` that described the encoded one; when `decoded`, that header and the
|
|
75
|
+
* encoded length go, so the headers describe the bytes the client receives.
|
|
76
|
+
*/
|
|
77
|
+
export function clientHeaders(headers, decoded) {
|
|
78
|
+
dropHopByHop(headers, false);
|
|
79
|
+
if (!decoded)
|
|
80
|
+
return;
|
|
81
|
+
const encoding = headers.get("content-encoding");
|
|
82
|
+
if (encoding !== null && encoding.trim().toLowerCase() !== "identity") {
|
|
83
|
+
headers.delete("content-encoding");
|
|
84
|
+
headers.delete("content-length");
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { TypedResponse } from "../response/response.ts";
|
|
2
|
+
export type ProxyConfig<TCtx> = {
|
|
3
|
+
/**
|
|
4
|
+
* Where the request goes: `fetch`, a Workers service binding, a Durable Object stub, anything
|
|
5
|
+
* that answers a Response. `url` is the normalized path and query (after `rewriteUrl`), `init`
|
|
6
|
+
* the method, headers, body, signal and `redirect: "manual"` the framework prepared. A network
|
|
7
|
+
* failure the runtime reports is a 502; any other throw, a bug here included, a 500.
|
|
8
|
+
*/
|
|
9
|
+
destination: (ctx: TCtx, url: string, init: RequestInit) => Promise<Response> | Response;
|
|
10
|
+
/**
|
|
11
|
+
* Whether the answer's body is already decoded, as `fetch()` always returns it. When true (the
|
|
12
|
+
* default) an encoded answer loses `Content-Encoding` and `Content-Length`, so the headers
|
|
13
|
+
* describe the bytes the client gets. False when destination returns bytes still encoded.
|
|
14
|
+
*/
|
|
15
|
+
decoded?: boolean;
|
|
16
|
+
/** Add `X-Forwarded-For`, `-Proto` and `-Host`. Default true; the client's own are dropped either way. */
|
|
17
|
+
forwardedHeaders?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Most milliseconds the upstream may stay silent while the body streams. Omitted or not
|
|
20
|
+
* positive: no limit (an SSE stream may idle). A stall aborts the upstream and errors the body.
|
|
21
|
+
* Off for a WebSocket upgrade.
|
|
22
|
+
*/
|
|
23
|
+
idleTimeout?: number | ((ctx: TCtx) => number);
|
|
24
|
+
/**
|
|
25
|
+
* Runs on the answer before the client gets it, its headers mutable. Return a Response to
|
|
26
|
+
* replace it. Not called for a 101 upgrade, which is the runtime's.
|
|
27
|
+
*/
|
|
28
|
+
onResponse?: (ctx: TCtx, response: Response) => Promise<Response | void> | Response | void;
|
|
29
|
+
/** Run last on the forwarded headers, so it may set any of them: a record of entries, or an edit. */
|
|
30
|
+
requestHeaders?: Record<string, string> | ((ctx: TCtx, headers: Headers) => void);
|
|
31
|
+
/** Rewrite the normalized path and query before destination sees it. */
|
|
32
|
+
rewriteUrl?: (url: string, ctx: TCtx) => string;
|
|
33
|
+
/**
|
|
34
|
+
* Most milliseconds to wait for the answer's headers; later is a 504. Default 60 000; not
|
|
35
|
+
* positive is no limit. The body is `idleTimeout`'s. Off for a WebSocket upgrade.
|
|
36
|
+
*/
|
|
37
|
+
timeout?: number | ((ctx: TCtx) => number);
|
|
38
|
+
};
|
|
39
|
+
export declare function proxy<TCtx>(config: ProxyConfig<TCtx>): (ctx: TCtx) => Promise<TypedResponse>;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `proxy(config)`: a route handler that forwards the request to an upstream and streams its answer
|
|
3
|
+
* back, mounted like any other: `app.all("/api/*rest").handler(proxy({ destination }))`. Plain code
|
|
4
|
+
* reached through `@lovrozagar/honey/proxy`, no slot and no builder method (H23): core never imports
|
|
5
|
+
* it. The answer is the passthrough brand, since the upstream decides its status and type.
|
|
6
|
+
*
|
|
7
|
+
* Both ways, hop-by-hop headers are dropped and the forwarding headers describe the client as the
|
|
8
|
+
* platform reported it (headers.ts); the URL is the normalized path, the deadlines and failure
|
|
9
|
+
* mapping are upstream.ts's. Every method but GET and HEAD forwards its body. The call follows
|
|
10
|
+
* `ctx.signal`: a disconnect, `timeout()` or shutdown cancels it and its body. Redirects go back to
|
|
11
|
+
* the client, never followed. On the Node bridge the answer is a HoneyResponse, so the header
|
|
12
|
+
* middleware in front of the route stay on the plain map.
|
|
13
|
+
*/
|
|
14
|
+
import { TRACE } from "../context/context.js";
|
|
15
|
+
import { createHoneyResponse, isNodeOutbound } from "../response/builder.js";
|
|
16
|
+
import { headersToRecord, HoneyOutHeaders } from "../response/out-headers.js";
|
|
17
|
+
import { searchOfUrl } from "../routing/request-path.js";
|
|
18
|
+
import { clientHeaders, upstreamHeaders } from "./headers.js";
|
|
19
|
+
import { forwardBody, msOf, timeoutError, withIdleTimeout, within } from "./upstream.js";
|
|
20
|
+
/** Default time allowed until the upstream's response headers arrive. */
|
|
21
|
+
const DEFAULT_TIMEOUT_MS = 60_000;
|
|
22
|
+
function isNullBody(status) {
|
|
23
|
+
return status === 101 || status === 103 || status === 204 || status === 205 || status === 304;
|
|
24
|
+
}
|
|
25
|
+
/** The client's copy of the upstream answer, its headers cleaned and mutable for onResponse. */
|
|
26
|
+
function answerFor(response, body, decoded, nodeOut) {
|
|
27
|
+
const init = { status: response.status, statusText: response.statusText };
|
|
28
|
+
const stream = isNullBody(response.status) ? null : body;
|
|
29
|
+
if (nodeOut) {
|
|
30
|
+
const headers = new HoneyOutHeaders(headersToRecord(response.headers));
|
|
31
|
+
clientHeaders(headers, decoded);
|
|
32
|
+
return createHoneyResponse({ ...init, headers: headers.toRecord(), stream });
|
|
33
|
+
}
|
|
34
|
+
const headers = new Headers(response.headers);
|
|
35
|
+
clientHeaders(headers, decoded);
|
|
36
|
+
return new Response(stream, { ...init, headers });
|
|
37
|
+
}
|
|
38
|
+
function applyRequestHeaders(edit, ctx, headers) {
|
|
39
|
+
if (typeof edit === "function")
|
|
40
|
+
return edit(ctx, headers);
|
|
41
|
+
for (const [name, value] of Object.entries(edit ?? {}))
|
|
42
|
+
headers.set(name, value);
|
|
43
|
+
}
|
|
44
|
+
/** An untraced request's call: made as it is, its headers as they came. */
|
|
45
|
+
const untraced = (call) => call();
|
|
46
|
+
/**
|
|
47
|
+
* How the call is made: on a traced request inside its `http.proxy` span, the upstream getting the
|
|
48
|
+
* request's trace, never the caller's (a trusted caller's tracestate goes on with it).
|
|
49
|
+
*/
|
|
50
|
+
function traced(ctx, method, headers) {
|
|
51
|
+
const outbound = ctx[TRACE]?.outbound("http.proxy", method);
|
|
52
|
+
if (outbound === undefined)
|
|
53
|
+
return untraced;
|
|
54
|
+
if (outbound.traceparent === null)
|
|
55
|
+
headers.delete("traceparent");
|
|
56
|
+
else
|
|
57
|
+
headers.set("traceparent", outbound.traceparent);
|
|
58
|
+
if (outbound.tracestate === undefined)
|
|
59
|
+
headers.delete("tracestate");
|
|
60
|
+
else
|
|
61
|
+
headers.set("tracestate", outbound.tracestate);
|
|
62
|
+
return (call) => outbound.send(call);
|
|
63
|
+
}
|
|
64
|
+
export function proxy(config) {
|
|
65
|
+
const decoded = config.decoded !== false;
|
|
66
|
+
const forwarded = config.forwardedHeaders !== false;
|
|
67
|
+
return async (ctx) => {
|
|
68
|
+
const { ip, path, req, signal } = ctx;
|
|
69
|
+
const websocket = req.headers.get("upgrade")?.trim().toLowerCase() === "websocket";
|
|
70
|
+
const pathQuery = path + searchOfUrl(req.url);
|
|
71
|
+
const url = config.rewriteUrl ? config.rewriteUrl(pathQuery, ctx) : pathQuery;
|
|
72
|
+
const headers = upstreamHeaders(req, { client: forwarded ? ip : undefined, websocket });
|
|
73
|
+
/* requestHeaders below still has the last word */
|
|
74
|
+
const send = traced(ctx, req.method, headers);
|
|
75
|
+
const body = await forwardBody(req);
|
|
76
|
+
/* no body, or bytes whose length fetch() computes itself */
|
|
77
|
+
if (!(body instanceof ReadableStream))
|
|
78
|
+
headers.delete("content-length");
|
|
79
|
+
applyRequestHeaders(config.requestHeaders, ctx, headers);
|
|
80
|
+
const upstream = new AbortController();
|
|
81
|
+
const init = {
|
|
82
|
+
body: body ?? undefined,
|
|
83
|
+
headers,
|
|
84
|
+
method: req.method,
|
|
85
|
+
redirect: "manual",
|
|
86
|
+
signal: AbortSignal.any([signal, upstream.signal]),
|
|
87
|
+
};
|
|
88
|
+
/* a streamed request body needs it on Node; Workers imply it */
|
|
89
|
+
if (body instanceof ReadableStream)
|
|
90
|
+
init.duplex = "half";
|
|
91
|
+
const headerMs = websocket ? undefined : msOf(config.timeout, ctx, DEFAULT_TIMEOUT_MS);
|
|
92
|
+
const response = await within({ client: signal, headerMs, upstream }, () => send(() => config.destination(ctx, url, init)));
|
|
93
|
+
if (response.status === 101)
|
|
94
|
+
return response;
|
|
95
|
+
const idleMs = websocket ? undefined : msOf(config.idleTimeout, ctx);
|
|
96
|
+
const stream = response.body !== null && idleMs !== undefined
|
|
97
|
+
? withIdleTimeout(response.body, idleMs, () => upstream.abort(timeoutError()))
|
|
98
|
+
: response.body;
|
|
99
|
+
const answer = answerFor(response, stream, decoded, isNodeOutbound(req));
|
|
100
|
+
const replaced = config.onResponse ? await config.onResponse(ctx, answer) : undefined;
|
|
101
|
+
return (replaced ?? answer);
|
|
102
|
+
};
|
|
103
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The body destination is handed. Bytes when small and sized: a streamed body the destination
|
|
3
|
+
* never reads can hold a service binding open until it times out, and a body teed by `clone()`
|
|
4
|
+
* has no known length. Bytes have neither problem.
|
|
5
|
+
*/
|
|
6
|
+
export declare function forwardBody(request: Request): Promise<ArrayBuffer | ReadableStream<Uint8Array> | null>;
|
|
7
|
+
/**
|
|
8
|
+
* Whether `error` means the upstream failed (502), as opposed to a bug in user code (500). Fetch
|
|
9
|
+
* reports a network failure as a `TypeError`, as it does a typo, and runtimes tell them apart
|
|
10
|
+
* differently: undici says "fetch failed", Bun puts a `code` on the error (`ConnectionRefused`,
|
|
11
|
+
* `ENOTFOUND`), Workers say the network connection was lost. An invalid URL is the caller's bug.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isUpstreamFailure(error: unknown): boolean;
|
|
14
|
+
export declare function timeoutError(): DOMException;
|
|
15
|
+
/** A deadline option as milliseconds, or `undefined` for none (omitted or not positive). */
|
|
16
|
+
export declare function msOf<TCtx>(option: number | ((ctx: TCtx) => number) | undefined, ctx: TCtx, fallback?: number): number | undefined;
|
|
17
|
+
/** One call and its deadline: the upstream controller to abort, the client's signal to tell a disconnect apart. */
|
|
18
|
+
export type Call = {
|
|
19
|
+
readonly client: AbortSignal;
|
|
20
|
+
readonly headerMs: number | undefined;
|
|
21
|
+
readonly upstream: AbortController;
|
|
22
|
+
};
|
|
23
|
+
/** Await `answer` within the header deadline; map what it throws to what the client is told. */
|
|
24
|
+
export declare function within(call: Call, answer: () => Promise<Response> | Response): Promise<Response>;
|
|
25
|
+
/**
|
|
26
|
+
* `body`, erroring and calling `onIdle` (which aborts the upstream) when the upstream sends nothing
|
|
27
|
+
* for `ms`. The clock runs only while a read waits: a client reading slowly is backpressure, not an
|
|
28
|
+
* idle upstream.
|
|
29
|
+
*/
|
|
30
|
+
export declare function withIdleTimeout(body: ReadableStream<Uint8Array>, ms: number, onIdle: () => void): ReadableStream<Uint8Array>;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The call to the upstream: the body it is sent, the deadlines it is held to, and what its failures
|
|
3
|
+
* mean to the client. A network failure the runtime reports is a 502 `bad_gateway`, a missed
|
|
4
|
+
* deadline a 504 `gateway_timeout`; any other throw, a bug in `destination` included, stays what
|
|
5
|
+
* it is (a 500). The URL is the router's normalized `ctx.path` plus the raw query: one leading
|
|
6
|
+
* slash, `//` and `\` collapsed, encoded separators refused with a 400 before any handler runs, so
|
|
7
|
+
* neither `base + url` nor `new URL(url, base)` can leave the upstream's origin (SSRF).
|
|
8
|
+
*/
|
|
9
|
+
import { HoneyError } from "../errors/error.js";
|
|
10
|
+
/* bodies up to this size with a declared length are forwarded as bytes; larger or unsized ones stream */
|
|
11
|
+
const MAX_BUFFERED_BODY_BYTES = 1024 * 1024;
|
|
12
|
+
/** Network-level codes runtimes put on errors when the upstream cannot be reached or drops. */
|
|
13
|
+
const NETWORK_CODES = /^(?:E[A-Z0-9_]+|Connection\w*|UND_ERR\w*|UNABLE_\w+|CERT_\w+|DEPTH_ZERO\w*)$/;
|
|
14
|
+
const FETCH_FAILED = /^fetch failed/i;
|
|
15
|
+
const CONNECTION_LOST = /network connection (?:was )?lost/i;
|
|
16
|
+
/**
|
|
17
|
+
* The body destination is handed. Bytes when small and sized: a streamed body the destination
|
|
18
|
+
* never reads can hold a service binding open until it times out, and a body teed by `clone()`
|
|
19
|
+
* has no known length. Bytes have neither problem.
|
|
20
|
+
*/
|
|
21
|
+
export async function forwardBody(request) {
|
|
22
|
+
const method = request.method;
|
|
23
|
+
/* fetch refuses a GET or HEAD body */
|
|
24
|
+
if (request.body === null || method === "GET" || method === "HEAD")
|
|
25
|
+
return null;
|
|
26
|
+
const declared = Number.parseInt(request.headers.get("content-length") ?? "", 10);
|
|
27
|
+
if (Number.isFinite(declared) && declared <= MAX_BUFFERED_BODY_BYTES)
|
|
28
|
+
return request.arrayBuffer();
|
|
29
|
+
return request.body;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Whether `error` means the upstream failed (502), as opposed to a bug in user code (500). Fetch
|
|
33
|
+
* reports a network failure as a `TypeError`, as it does a typo, and runtimes tell them apart
|
|
34
|
+
* differently: undici says "fetch failed", Bun puts a `code` on the error (`ConnectionRefused`,
|
|
35
|
+
* `ENOTFOUND`), Workers say the network connection was lost. An invalid URL is the caller's bug.
|
|
36
|
+
*/
|
|
37
|
+
export function isUpstreamFailure(error) {
|
|
38
|
+
if (!(error instanceof Error))
|
|
39
|
+
return false;
|
|
40
|
+
const code = error.code;
|
|
41
|
+
if (typeof code === "string")
|
|
42
|
+
return !code.startsWith("ERR_INVALID") && NETWORK_CODES.test(code);
|
|
43
|
+
return error instanceof TypeError && (FETCH_FAILED.test(error.message) || CONNECTION_LOST.test(error.message));
|
|
44
|
+
}
|
|
45
|
+
export function timeoutError() {
|
|
46
|
+
return new DOMException("upstream timed out", "TimeoutError");
|
|
47
|
+
}
|
|
48
|
+
/** A deadline option as milliseconds, or `undefined` for none (omitted or not positive). */
|
|
49
|
+
export function msOf(option, ctx, fallback) {
|
|
50
|
+
const ms = typeof option === "function" ? option(ctx) : (option ?? fallback);
|
|
51
|
+
return ms !== undefined && ms > 0 ? ms : undefined;
|
|
52
|
+
}
|
|
53
|
+
/** Await `answer` within the header deadline; map what it throws to what the client is told. */
|
|
54
|
+
export async function within(call, answer) {
|
|
55
|
+
let timedOut = false;
|
|
56
|
+
const timer = call.headerMs === undefined
|
|
57
|
+
? undefined
|
|
58
|
+
: setTimeout(() => {
|
|
59
|
+
timedOut = true;
|
|
60
|
+
call.upstream.abort(timeoutError());
|
|
61
|
+
}, call.headerMs);
|
|
62
|
+
try {
|
|
63
|
+
return await answer();
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
/* ours, or the destination's own AbortSignal.timeout() */
|
|
67
|
+
if (timedOut || (error instanceof DOMException && error.name === "TimeoutError")) {
|
|
68
|
+
throw new HoneyError({ cause: error, errorKey: "gateway_timeout", status: "gateway_timeout" });
|
|
69
|
+
}
|
|
70
|
+
if (!call.client.aborted && isUpstreamFailure(error)) {
|
|
71
|
+
throw new HoneyError({ cause: error, errorKey: "bad_gateway", status: "bad_gateway" });
|
|
72
|
+
}
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
clearTimeout(timer);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* `body`, erroring and calling `onIdle` (which aborts the upstream) when the upstream sends nothing
|
|
81
|
+
* for `ms`. The clock runs only while a read waits: a client reading slowly is backpressure, not an
|
|
82
|
+
* idle upstream.
|
|
83
|
+
*/
|
|
84
|
+
export function withIdleTimeout(body, ms, onIdle) {
|
|
85
|
+
const reader = body.getReader();
|
|
86
|
+
return new ReadableStream({
|
|
87
|
+
cancel: (reason) => reader.cancel(reason),
|
|
88
|
+
async pull(controller) {
|
|
89
|
+
let timer;
|
|
90
|
+
const idle = new Promise((resolve) => {
|
|
91
|
+
timer = setTimeout(() => resolve("idle"), ms);
|
|
92
|
+
});
|
|
93
|
+
try {
|
|
94
|
+
const result = await Promise.race([reader.read(), idle]);
|
|
95
|
+
if (result === "idle") {
|
|
96
|
+
onIdle();
|
|
97
|
+
const error = timeoutError();
|
|
98
|
+
reader.cancel(error).catch(() => {
|
|
99
|
+
/* the upstream may not react to the abort (a binding, a stub): the body errors below either way */
|
|
100
|
+
});
|
|
101
|
+
controller.error(error);
|
|
102
|
+
}
|
|
103
|
+
else if (result.done)
|
|
104
|
+
controller.close();
|
|
105
|
+
else
|
|
106
|
+
controller.enqueue(result.value);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
controller.error(error);
|
|
110
|
+
}
|
|
111
|
+
finally {
|
|
112
|
+
clearTimeout(timer);
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
}
|