@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
package/bin/honey.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
// The honey bin (bit 19 h2), honey-clients's twin. A repository checkout (marked by tsconfig.json, which is not
|
|
3
|
+
// published) runs the TypeScript source, through jiti on Node, so a stale dist/ never runs; an installed package runs
|
|
4
|
+
// the compiled JavaScript on any runtime (the tarball ships dist/, not src/).
|
|
5
|
+
import { spawn } from "node:child_process"
|
|
6
|
+
import { existsSync, readFileSync } from "node:fs"
|
|
7
|
+
import { createRequire } from "node:module"
|
|
8
|
+
import { basename, dirname, join } from "node:path"
|
|
5
9
|
import { fileURLToPath } from "node:url"
|
|
6
10
|
|
|
7
|
-
/* Bun runs the TypeScript source; an installed package on any other runtime runs the compiled
|
|
8
|
-
* JavaScript. A repository checkout (marked by tsconfig.json, which is not published) runs the
|
|
9
|
-
* source on Node too, through jiti, so `honey generate` never runs a stale dist/. */
|
|
10
11
|
const isBun = typeof globalThis.Bun !== "undefined"
|
|
11
12
|
const checkout = existsSync(new URL("../tsconfig.json", import.meta.url))
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
* which `bun run` and `bunx` name in npm_execpath. */
|
|
14
|
+
// `bun run` and `bunx` start this file through its node shebang, while what they run is meant for Bun: hand over to
|
|
15
|
+
// the Bun that started us, which they name in npm_execpath. Once, never again in the child.
|
|
16
16
|
function invokingBun() {
|
|
17
17
|
if (isBun || process.env.HONEY_NO_BUN_HANDOFF === "1") return null
|
|
18
18
|
if (!process.env.npm_config_user_agent?.startsWith("bun/")) return null
|
|
@@ -21,28 +21,88 @@ function invokingBun() {
|
|
|
21
21
|
return bun
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
// The handoff: Bun runs this file with our arguments and `env` over ours; a signal we get is passed on to it, and we
|
|
25
|
+
// end as it ended, its exit code or the same signal.
|
|
26
|
+
function handOff(bun, env = {}) {
|
|
27
|
+
// Forwarders first: a signal landing as spawn returns would otherwise end this process by its default action,
|
|
28
|
+
// orphaning the child. A handler runs from the event loop, after this block, so `child` is set by then.
|
|
29
|
+
let child
|
|
30
|
+
const forward = (signal) => child.kill(signal)
|
|
31
|
+
for (const signal of ["SIGINT", "SIGTERM", "SIGHUP"]) process.on(signal, forward)
|
|
32
|
+
child = spawn(bun, [fileURLToPath(import.meta.url), ...process.argv.slice(2)], {
|
|
33
|
+
env: { ...process.env, ...env, HONEY_NO_BUN_HANDOFF: "1" },
|
|
28
34
|
stdio: "inherit",
|
|
29
35
|
})
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
child.on("error", (error) => {
|
|
37
|
+
console.error(`honey: could not start ${bun}: ${error.message}`)
|
|
38
|
+
process.exit(1)
|
|
39
|
+
})
|
|
40
|
+
child.on("exit", (code, signal) => {
|
|
41
|
+
if (signal) {
|
|
42
|
+
for (const each of ["SIGINT", "SIGTERM", "SIGHUP"]) process.off(each, forward)
|
|
43
|
+
process.kill(process.pid, signal)
|
|
44
|
+
return
|
|
45
|
+
}
|
|
46
|
+
process.exit(code ?? 1)
|
|
47
|
+
})
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// A checkout's specifier for `name` mapped to its source: each export's `honey-source` file. The published exports
|
|
51
|
+
// send `default` to dist/, which a checkout does not build.
|
|
52
|
+
function sourceAliases(name) {
|
|
53
|
+
const root = dirname(createRequire(import.meta.url).resolve(`${name}/package.json`))
|
|
54
|
+
const { exports = {} } = JSON.parse(readFileSync(join(root, "package.json"), "utf8"))
|
|
55
|
+
return Object.fromEntries(
|
|
56
|
+
Object.entries(exports)
|
|
57
|
+
.filter(([, target]) => typeof target === "object" && target["honey-source"])
|
|
58
|
+
.map(([subpath, target]) => [name + subpath.slice(1), join(root, target["honey-source"])]),
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// A checkout on Bun runs its source natively, under the honey-source condition: honey-clients, and an app's honey,
|
|
63
|
+
// resolve to source then, not to the unbuilt dist/. Set through BUN_OPTIONS when the caller did not, so every
|
|
64
|
+
// generation child inherits it.
|
|
65
|
+
const SOURCE_CONDITION = "--conditions=honey-source"
|
|
66
|
+
const unconditioned = isBun && checkout && !process.execArgv.includes(SOURCE_CONDITION)
|
|
67
|
+
// The hand-off's backstop: its child carries HONEY_BUN_HANDOFF, the depth of hand-offs before it. A child that would
|
|
68
|
+
// hand off again (the condition set but not in its execArgv) refuses instead of re-running itself without end.
|
|
69
|
+
const handOffDepth = Number(process.env.HONEY_BUN_HANDOFF ?? 0)
|
|
70
|
+
|
|
71
|
+
async function entry() {
|
|
72
|
+
if (checkout) {
|
|
73
|
+
/* never jiti on Bun: its Babel, loaded on any fs-cache miss, hooks Error.prepareStackTrace, and Bun's own then
|
|
74
|
+
* throws "First argument must be an Error object" at a captureStackTrace on a non-Error (bit 20 k-fix) */
|
|
75
|
+
if (isBun) return import("../src/build/cli.ts")
|
|
76
|
+
const { createJiti } = await import("jiti")
|
|
77
|
+
const alias = sourceAliases("@lovrozagar/honey-clients")
|
|
78
|
+
return createJiti(import.meta.url, { alias, tryNative: false }).import("../src/build/cli.ts")
|
|
79
|
+
}
|
|
39
80
|
try {
|
|
40
|
-
await import("../dist/cli.js")
|
|
41
|
-
} catch (
|
|
42
|
-
if (
|
|
43
|
-
console.error("honey: dist/ is missing from this install. Reinstall
|
|
81
|
+
return await import("../dist/build/cli.js")
|
|
82
|
+
} catch (error) {
|
|
83
|
+
if (error?.code === "ERR_MODULE_NOT_FOUND" && String(error.url).endsWith("/dist/build/cli.js")) {
|
|
84
|
+
console.error("honey: dist/ is missing from this install. Reinstall it, or run it with Bun.")
|
|
44
85
|
process.exit(1)
|
|
45
86
|
}
|
|
46
|
-
throw
|
|
87
|
+
throw error
|
|
47
88
|
}
|
|
48
89
|
}
|
|
90
|
+
|
|
91
|
+
const bun = invokingBun()
|
|
92
|
+
if (bun) handOff(bun)
|
|
93
|
+
else if (unconditioned && handOffDepth >= 1) {
|
|
94
|
+
console.error("honey: Bun hand-off loop: --conditions=honey-source not visible after re-exec")
|
|
95
|
+
process.exit(1)
|
|
96
|
+
} else if (unconditioned)
|
|
97
|
+
handOff(process.execPath, {
|
|
98
|
+
BUN_OPTIONS: `${process.env.BUN_OPTIONS ?? ""} ${SOURCE_CONDITION}`.trim(),
|
|
99
|
+
HONEY_BUN_HANDOFF: String(handOffDepth + 1),
|
|
100
|
+
})
|
|
101
|
+
else {
|
|
102
|
+
const { main } = await entry()
|
|
103
|
+
const io = { err: (text) => process.stderr.write(text), out: (text) => process.stdout.write(text) }
|
|
104
|
+
const code = await main(process.argv.slice(2), io)
|
|
105
|
+
/* the app may leave a timer or a socket open: the run is over once main returns, its output flushed */
|
|
106
|
+
for (const stream of [process.stdout, process.stderr]) await new Promise((done) => stream.write("", done))
|
|
107
|
+
process.exit(code)
|
|
108
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
type FetchApp<TEnv> = {
|
|
2
|
+
fetch(request: Request, env: TEnv): Response | Promise<Response>;
|
|
3
|
+
};
|
|
4
|
+
export type BunServeOptions<TEnv> = {
|
|
5
|
+
env: TEnv;
|
|
6
|
+
hostname: string;
|
|
7
|
+
maxRequestBodySize: number;
|
|
8
|
+
/** Errors the app could not answer; Bun then answers 500. Unset, Bun's own error handling applies. */
|
|
9
|
+
onError?: (error: unknown) => void;
|
|
10
|
+
port: number;
|
|
11
|
+
};
|
|
12
|
+
export type BunListener = {
|
|
13
|
+
/** Let in-flight requests finish for up to `timeout` ms, then cut every connection. */
|
|
14
|
+
close(timeout: number): Promise<void>;
|
|
15
|
+
readonly port: number;
|
|
16
|
+
};
|
|
17
|
+
export declare function serve<TEnv>(app: FetchApp<TEnv>, options: BunServeOptions<TEnv>): BunListener;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Bun adapter: `Bun.serve` with the app's fetch, the server passed in the env so `ctx.ip` and
|
|
3
|
+
* the WebSocket upgrade read it. Bun takes the `websocket` handlers at creation, so a honey app's
|
|
4
|
+
* ws adapter is fixed here: its own `bunWebSocket()`, or one set before `serve()`.
|
|
5
|
+
*
|
|
6
|
+
* A known residual: when a response body stream errors (a proxied upstream cut by its idle
|
|
7
|
+
* timeout, a producer that fails), Bun itself prints the error to stderr, outside both the
|
|
8
|
+
* `error` handler and the app's logger. The stream erroring is correct, since closing it would
|
|
9
|
+
* pass a cut body off as complete; redirecting Bun's own diagnostic would mean wrapping every
|
|
10
|
+
* response body, a per-response cost for a sink change, so it is left as Bun reports it.
|
|
11
|
+
*/
|
|
12
|
+
import { HoneyError } from "../../errors/error.js";
|
|
13
|
+
import { GRAPH } from "../../routing/app.js";
|
|
14
|
+
import { createLogger } from "../../telemetry/logger.js";
|
|
15
|
+
import { bunWebSocket } from "../../ws/bun.js";
|
|
16
|
+
/** Settle when `work` does or after `ms`, whichever is first; the timer never outlives it. */
|
|
17
|
+
async function within(work, ms) {
|
|
18
|
+
let timer;
|
|
19
|
+
const timeout = new Promise((resolve) => {
|
|
20
|
+
timer = setTimeout(() => resolve("timeout"), ms);
|
|
21
|
+
});
|
|
22
|
+
try {
|
|
23
|
+
return await Promise.race([work.then(() => "done"), timeout]);
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
clearTimeout(timer);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const SWAPPED = "honey: app.wsAdapter() changed after serve(app) on Bun, where Bun.serve took the first adapter's handlers: set app.wsAdapter() before serve()";
|
|
30
|
+
/** The honey app's settings, where its ws adapter lives; `null` for a plain fetch handler. */
|
|
31
|
+
function settingsOf(app) {
|
|
32
|
+
return app[GRAPH]?.settings ?? null;
|
|
33
|
+
}
|
|
34
|
+
/** The app's ws adapter for Bun: the one it was given, else `bunWebSocket()`, set on the app. */
|
|
35
|
+
function bunAdapterOf(settings) {
|
|
36
|
+
settings.wsAdapter ??= bunWebSocket();
|
|
37
|
+
if (settings.wsAdapter.runtime !== "bun") {
|
|
38
|
+
throw new Error("serve() on Bun needs a bunWebSocket() adapter, but app.wsAdapter() was given another");
|
|
39
|
+
}
|
|
40
|
+
return settings.wsAdapter;
|
|
41
|
+
}
|
|
42
|
+
function isWebSocketUpgrade(request) {
|
|
43
|
+
return request.headers.get("upgrade")?.toLowerCase() === "websocket";
|
|
44
|
+
}
|
|
45
|
+
/** Bun expects nothing back from a fetch that upgraded the request. */
|
|
46
|
+
/** The default failure reporter: the app's logger, or a default one for a plain fetch handler. */
|
|
47
|
+
function reportTo(logger) {
|
|
48
|
+
return (error) => logger.error({ err: HoneyError.serialize(error) }, "serve failed");
|
|
49
|
+
}
|
|
50
|
+
function unlessUpgraded(response) {
|
|
51
|
+
return response.status === 101 ? undefined : response;
|
|
52
|
+
}
|
|
53
|
+
export function serve(app, options) {
|
|
54
|
+
const settings = settingsOf(app);
|
|
55
|
+
/* no onError: the app's logger, never Bun's own error page (a stack in development, outside the sink) */
|
|
56
|
+
const onError = options.onError ?? reportTo(settings?.logger ?? createLogger());
|
|
57
|
+
const adapter = settings === null ? null : bunAdapterOf(settings);
|
|
58
|
+
/* the server is the same object on every request: the env carrying it is built once */
|
|
59
|
+
let env;
|
|
60
|
+
const server = globalThis.Bun.serve({
|
|
61
|
+
error: (error) => {
|
|
62
|
+
onError(error);
|
|
63
|
+
return new Response("Internal Server Error", { status: 500 });
|
|
64
|
+
},
|
|
65
|
+
fetch: (request, bun) => {
|
|
66
|
+
/* an adapter set after Bun.serve took the first one's handlers can never upgrade: say so */
|
|
67
|
+
if (settings !== null && settings.wsAdapter !== adapter && isWebSocketUpgrade(request))
|
|
68
|
+
throw new Error(SWAPPED);
|
|
69
|
+
const answer = app.fetch(request, (env ??= { ...options.env, server: bun }));
|
|
70
|
+
return answer instanceof Promise ? answer.then(unlessUpgraded) : unlessUpgraded(answer);
|
|
71
|
+
},
|
|
72
|
+
hostname: options.hostname,
|
|
73
|
+
maxRequestBodySize: options.maxRequestBodySize,
|
|
74
|
+
port: options.port,
|
|
75
|
+
...(adapter === null ? {} : { websocket: adapter.websocket }),
|
|
76
|
+
});
|
|
77
|
+
return {
|
|
78
|
+
async close(timeout) {
|
|
79
|
+
/* graceful first; idle keep-alive connections would otherwise keep serving, so close them
|
|
80
|
+
* now and again once the in-flight requests have finished and left theirs idle */
|
|
81
|
+
const graceful = server.stop(false);
|
|
82
|
+
server.closeIdleConnections();
|
|
83
|
+
if ((await within(graceful, timeout)) === "timeout")
|
|
84
|
+
await server.stop(true);
|
|
85
|
+
server.closeIdleConnections();
|
|
86
|
+
},
|
|
87
|
+
port: server.port,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** A request view (the Node adapter's) hands over the Fetch `Request` behind it under this key. */
|
|
2
|
+
export declare const TO_FETCH_REQUEST: unique symbol;
|
|
3
|
+
/**
|
|
4
|
+
* The Fetch `Request` for `req`. On Bun and Workers that is `req` itself. On Node, `ctx.req` is a
|
|
5
|
+
* lighter view of the incoming message, so `new Request(ctx.req)`, `fetch(ctx.req)` and
|
|
6
|
+
* `instanceof Request` need this first. The view builds its Request once, which then owns the body.
|
|
7
|
+
*/
|
|
8
|
+
export declare function toFetchRequest(req: Request): Request;
|
|
9
|
+
/**
|
|
10
|
+
* A request view (the Node adapter's) swaps its body for another stream under this key and stays
|
|
11
|
+
* the view. Not TO_FETCH_REQUEST: that builds the Fetch Request behind the view, which then owns
|
|
12
|
+
* the body; this keeps the view, so no Request is built unless something later asks for one, and
|
|
13
|
+
* then it carries the swapped body.
|
|
14
|
+
*/
|
|
15
|
+
export declare const REPLACE_BODY: unique symbol;
|
|
16
|
+
/**
|
|
17
|
+
* `req` with `body` in place of its own body: a request view swaps it in place and is returned
|
|
18
|
+
* as is; a Fetch Request becomes one new Request with the same method, URL, headers and signal.
|
|
19
|
+
*/
|
|
20
|
+
export declare function withBody(req: Request, body: ReadableStream<Uint8Array>): Request;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** A request view (the Node adapter's) hands over the Fetch `Request` behind it under this key. */
|
|
2
|
+
export const TO_FETCH_REQUEST = /* @__PURE__ */ Symbol.for("honey.toFetchRequest");
|
|
3
|
+
/**
|
|
4
|
+
* The Fetch `Request` for `req`. On Bun and Workers that is `req` itself. On Node, `ctx.req` is a
|
|
5
|
+
* lighter view of the incoming message, so `new Request(ctx.req)`, `fetch(ctx.req)` and
|
|
6
|
+
* `instanceof Request` need this first. The view builds its Request once, which then owns the body.
|
|
7
|
+
*/
|
|
8
|
+
export function toFetchRequest(req) {
|
|
9
|
+
const own = req[TO_FETCH_REQUEST];
|
|
10
|
+
return typeof own === "function" ? own.call(req) : req;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* A request view (the Node adapter's) swaps its body for another stream under this key and stays
|
|
14
|
+
* the view. Not TO_FETCH_REQUEST: that builds the Fetch Request behind the view, which then owns
|
|
15
|
+
* the body; this keeps the view, so no Request is built unless something later asks for one, and
|
|
16
|
+
* then it carries the swapped body.
|
|
17
|
+
*/
|
|
18
|
+
export const REPLACE_BODY = /* @__PURE__ */ Symbol.for("honey.replaceBody");
|
|
19
|
+
/**
|
|
20
|
+
* `req` with `body` in place of its own body: a request view swaps it in place and is returned
|
|
21
|
+
* as is; a Fetch Request becomes one new Request with the same method, URL, headers and signal.
|
|
22
|
+
*/
|
|
23
|
+
export function withBody(req, body) {
|
|
24
|
+
const swap = req[REPLACE_BODY];
|
|
25
|
+
if (typeof swap !== "function")
|
|
26
|
+
return new Request(req, { body, duplex: "half" });
|
|
27
|
+
swap.call(req, body);
|
|
28
|
+
return req;
|
|
29
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { IncomingMessage } from "node:http";
|
|
2
|
+
/**
|
|
3
|
+
* Fetch's `Headers` over Node's parsed headers. `get` and `has` read maps over what Node parsed;
|
|
4
|
+
* a real `Headers` is built only when something iterates or writes, and answers from then on.
|
|
5
|
+
*/
|
|
6
|
+
export declare class NodeHeaders {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(incoming: IncomingMessage);
|
|
9
|
+
/**
|
|
10
|
+
* Every value, joined as Fetch joins them. Node's `headers` map keeps only the first
|
|
11
|
+
* `Authorization`, `Host`, …; the raw pairs keep them all, so the answer does not change once
|
|
12
|
+
* something iterates. Built from `rawHeaders`, never `headersDistinct`: Bun's node:http before
|
|
13
|
+
* 1.4 has no `headersDistinct`.
|
|
14
|
+
*/
|
|
15
|
+
get(name: string): string | null;
|
|
16
|
+
has(name: string): boolean;
|
|
17
|
+
append(name: string, value: string): void;
|
|
18
|
+
delete(name: string): void;
|
|
19
|
+
set(name: string, value: string): void;
|
|
20
|
+
getSetCookie(): string[];
|
|
21
|
+
forEach(callback: (value: string, key: string, parent: Headers) => void, thisArg?: unknown): void;
|
|
22
|
+
keys(): HeadersIterator<string>;
|
|
23
|
+
values(): HeadersIterator<string>;
|
|
24
|
+
entries(): HeadersIterator<[string, string]>;
|
|
25
|
+
[Symbol.iterator](): HeadersIterator<[string, string]>;
|
|
26
|
+
get [Symbol.toStringTag](): string;
|
|
27
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/** Every raw header value under its lowercased name, in order: what `headersDistinct` holds on Node. */
|
|
2
|
+
function distinctOf(raw) {
|
|
3
|
+
const all = new Map();
|
|
4
|
+
for (let i = 0; i < raw.length; i += 2) {
|
|
5
|
+
const key = raw[i].toLowerCase();
|
|
6
|
+
const values = all.get(key);
|
|
7
|
+
if (values === undefined)
|
|
8
|
+
all.set(key, [raw[i + 1]]);
|
|
9
|
+
else
|
|
10
|
+
values.push(raw[i + 1]);
|
|
11
|
+
}
|
|
12
|
+
return all;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Fetch's `Headers` over Node's parsed headers. `get` and `has` read maps over what Node parsed;
|
|
16
|
+
* a real `Headers` is built only when something iterates or writes, and answers from then on.
|
|
17
|
+
*/
|
|
18
|
+
export class NodeHeaders {
|
|
19
|
+
#incoming;
|
|
20
|
+
#distinct = null;
|
|
21
|
+
#native = null;
|
|
22
|
+
constructor(incoming) {
|
|
23
|
+
this.#incoming = incoming;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Every value, joined as Fetch joins them. Node's `headers` map keeps only the first
|
|
27
|
+
* `Authorization`, `Host`, …; the raw pairs keep them all, so the answer does not change once
|
|
28
|
+
* something iterates. Built from `rawHeaders`, never `headersDistinct`: Bun's node:http before
|
|
29
|
+
* 1.4 has no `headersDistinct`.
|
|
30
|
+
*/
|
|
31
|
+
get(name) {
|
|
32
|
+
if (this.#native !== null)
|
|
33
|
+
return this.#native.get(name);
|
|
34
|
+
this.#distinct ??= distinctOf(this.#incoming.rawHeaders);
|
|
35
|
+
const values = this.#distinct.get(name.toLowerCase());
|
|
36
|
+
if (values === undefined)
|
|
37
|
+
return null;
|
|
38
|
+
return values.length === 1 ? values[0] : values.join(", ");
|
|
39
|
+
}
|
|
40
|
+
has(name) {
|
|
41
|
+
if (this.#native !== null)
|
|
42
|
+
return this.#native.has(name);
|
|
43
|
+
return Object.hasOwn(this.#incoming.headers, name.toLowerCase());
|
|
44
|
+
}
|
|
45
|
+
append(name, value) {
|
|
46
|
+
this.#ensureNative().append(name, value);
|
|
47
|
+
}
|
|
48
|
+
delete(name) {
|
|
49
|
+
this.#ensureNative().delete(name);
|
|
50
|
+
}
|
|
51
|
+
set(name, value) {
|
|
52
|
+
this.#ensureNative().set(name, value);
|
|
53
|
+
}
|
|
54
|
+
getSetCookie() {
|
|
55
|
+
return this.#ensureNative().getSetCookie();
|
|
56
|
+
}
|
|
57
|
+
forEach(callback, thisArg) {
|
|
58
|
+
this.#ensureNative().forEach(callback, thisArg);
|
|
59
|
+
}
|
|
60
|
+
keys() {
|
|
61
|
+
return this.#ensureNative().keys();
|
|
62
|
+
}
|
|
63
|
+
values() {
|
|
64
|
+
return this.#ensureNative().values();
|
|
65
|
+
}
|
|
66
|
+
entries() {
|
|
67
|
+
return this.#ensureNative().entries();
|
|
68
|
+
}
|
|
69
|
+
[Symbol.iterator]() {
|
|
70
|
+
return this.#ensureNative()[Symbol.iterator]();
|
|
71
|
+
}
|
|
72
|
+
get [Symbol.toStringTag]() {
|
|
73
|
+
return "Headers";
|
|
74
|
+
}
|
|
75
|
+
/* from the raw pairs, so every repeated value survives */
|
|
76
|
+
#ensureNative() {
|
|
77
|
+
if (this.#native !== null)
|
|
78
|
+
return this.#native;
|
|
79
|
+
const headers = new Headers();
|
|
80
|
+
const raw = this.#incoming.rawHeaders;
|
|
81
|
+
for (let i = 0; i < raw.length; i += 2)
|
|
82
|
+
headers.append(raw[i], raw[i + 1]);
|
|
83
|
+
this.#native = headers;
|
|
84
|
+
return headers;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `node:http` → Fetch side of the Node adapter: a Request-shaped view of the IncomingMessage
|
|
3
|
+
* that builds a real `Request` only when something needs one (formData, blob, clone,
|
|
4
|
+
* `toFetchRequest`).
|
|
5
|
+
*/
|
|
6
|
+
import type { IncomingMessage } from "node:http";
|
|
7
|
+
/** The serve side calls this when the response closed before it finished: client gone, or shutdown. */
|
|
8
|
+
export declare const ABORT_REQUEST: unique symbol;
|
|
9
|
+
/** True once a body read went over the cap: the body is left on the socket, so the connection is not reused. */
|
|
10
|
+
export declare const BODY_OVERFLOW: unique symbol;
|
|
11
|
+
/**
|
|
12
|
+
* The Request the app sees for `incoming`. It is not a Fetch `Request` (`instanceof Request` is
|
|
13
|
+
* false): `toFetchRequest()` gives the real one. A body over `maxBody` bytes fails its read with
|
|
14
|
+
* 413; `0` turns the cap off.
|
|
15
|
+
*/
|
|
16
|
+
export declare function nodeRequest(incoming: IncomingMessage, url: string, maxBody: number): Request;
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { Readable } from "node:stream";
|
|
2
|
+
import { PEER_ADDRESS } from "../../context/peer.js";
|
|
3
|
+
import { EK, HoneyError } from "../../errors/error.js";
|
|
4
|
+
import { NODE_OUTBOUND } from "../../response/builder.js";
|
|
5
|
+
import { REPLACE_BODY, TO_FETCH_REQUEST } from "../fetch-request.js";
|
|
6
|
+
import { NodeHeaders } from "./headers.js";
|
|
7
|
+
/** The serve side calls this when the response closed before it finished: client gone, or shutdown. */
|
|
8
|
+
export const ABORT_REQUEST = /* @__PURE__ */ Symbol("honey.abortRequest");
|
|
9
|
+
/** True once a body read went over the cap: the body is left on the socket, so the connection is not reused. */
|
|
10
|
+
export const BODY_OVERFLOW = /* @__PURE__ */ Symbol("honey.bodyOverflow");
|
|
11
|
+
/** Request-shaped view of an IncomingMessage: no `new Request()` until something needs the real one. */
|
|
12
|
+
class NodeRequest {
|
|
13
|
+
headers;
|
|
14
|
+
method;
|
|
15
|
+
url;
|
|
16
|
+
#incoming;
|
|
17
|
+
#hasBody;
|
|
18
|
+
#maxBody;
|
|
19
|
+
#received = 0;
|
|
20
|
+
#overflow = false;
|
|
21
|
+
#bodyUsed = false;
|
|
22
|
+
#stream;
|
|
23
|
+
#fetch;
|
|
24
|
+
#controller;
|
|
25
|
+
/* the abort that came before anything read `signal` */
|
|
26
|
+
#abortReason;
|
|
27
|
+
constructor(incoming, url, maxBody) {
|
|
28
|
+
this.#incoming = incoming;
|
|
29
|
+
this.#maxBody = maxBody;
|
|
30
|
+
this.url = url;
|
|
31
|
+
this.method = incoming.method;
|
|
32
|
+
this.headers = new NodeHeaders(incoming);
|
|
33
|
+
this.#hasBody = this.method !== "GET" && this.method !== "HEAD";
|
|
34
|
+
}
|
|
35
|
+
get cache() {
|
|
36
|
+
return "default";
|
|
37
|
+
}
|
|
38
|
+
get credentials() {
|
|
39
|
+
return "same-origin";
|
|
40
|
+
}
|
|
41
|
+
get destination() {
|
|
42
|
+
return "";
|
|
43
|
+
}
|
|
44
|
+
get duplex() {
|
|
45
|
+
return "half";
|
|
46
|
+
}
|
|
47
|
+
get integrity() {
|
|
48
|
+
return "";
|
|
49
|
+
}
|
|
50
|
+
get keepalive() {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
get mode() {
|
|
54
|
+
return "cors";
|
|
55
|
+
}
|
|
56
|
+
get redirect() {
|
|
57
|
+
return "follow";
|
|
58
|
+
}
|
|
59
|
+
get referrer() {
|
|
60
|
+
return "about:client";
|
|
61
|
+
}
|
|
62
|
+
get referrerPolicy() {
|
|
63
|
+
return "";
|
|
64
|
+
}
|
|
65
|
+
get [NODE_OUTBOUND]() {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
/** The socket peer, for `ctx.ip`. */
|
|
69
|
+
get [PEER_ADDRESS]() {
|
|
70
|
+
return this.#incoming.socket.remoteAddress ?? null;
|
|
71
|
+
}
|
|
72
|
+
get [BODY_OVERFLOW]() {
|
|
73
|
+
return this.#overflow;
|
|
74
|
+
}
|
|
75
|
+
get body() {
|
|
76
|
+
if (!this.#hasBody)
|
|
77
|
+
return null;
|
|
78
|
+
/* once a Fetch Request owns the stream, it is the body */
|
|
79
|
+
if (this.#fetch !== undefined)
|
|
80
|
+
return this.#fetch.body;
|
|
81
|
+
this.#stream ??= this.#cappedStream();
|
|
82
|
+
return this.#stream;
|
|
83
|
+
}
|
|
84
|
+
get bodyUsed() {
|
|
85
|
+
if (this.#fetch !== undefined)
|
|
86
|
+
return this.#fetch.bodyUsed;
|
|
87
|
+
return this.#bodyUsed || (this.#hasBody && this.#incoming.readableEnded);
|
|
88
|
+
}
|
|
89
|
+
/** Aborts when the response closes before it finished: the client left, or the server shut down. */
|
|
90
|
+
get signal() {
|
|
91
|
+
if (this.#controller === undefined) {
|
|
92
|
+
this.#controller = new AbortController();
|
|
93
|
+
if (this.#abortReason !== undefined)
|
|
94
|
+
this.#controller.abort(this.#abortReason.reason);
|
|
95
|
+
}
|
|
96
|
+
return this.#controller.signal;
|
|
97
|
+
}
|
|
98
|
+
[ABORT_REQUEST](reason = new DOMException("The client disconnected", "AbortError")) {
|
|
99
|
+
if (this.#controller !== undefined)
|
|
100
|
+
this.#controller.abort(reason);
|
|
101
|
+
else
|
|
102
|
+
this.#abortReason ??= { reason };
|
|
103
|
+
}
|
|
104
|
+
/** Swap the body for `body` (bodyLimit's counted stream) and stay the view: nothing has read it yet. */
|
|
105
|
+
[REPLACE_BODY](body) {
|
|
106
|
+
this.#stream = body;
|
|
107
|
+
}
|
|
108
|
+
/** The real Fetch `Request` behind the view: `new Request(x)`, `fetch(x)` and `instanceof` take it. */
|
|
109
|
+
[TO_FETCH_REQUEST]() {
|
|
110
|
+
return this.#asFetch();
|
|
111
|
+
}
|
|
112
|
+
async arrayBuffer() {
|
|
113
|
+
const buf = await this.#read();
|
|
114
|
+
return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
|
|
115
|
+
}
|
|
116
|
+
async bytes() {
|
|
117
|
+
const buf = await this.#read();
|
|
118
|
+
return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
119
|
+
}
|
|
120
|
+
/** As Fetch: an empty body is a `SyntaxError`, not `null`. */
|
|
121
|
+
async json() {
|
|
122
|
+
return JSON.parse(await this.text());
|
|
123
|
+
}
|
|
124
|
+
async text() {
|
|
125
|
+
return (await this.#read()).toString("utf8");
|
|
126
|
+
}
|
|
127
|
+
blob() {
|
|
128
|
+
return this.#asFetch().blob();
|
|
129
|
+
}
|
|
130
|
+
clone() {
|
|
131
|
+
return this.#asFetch().clone();
|
|
132
|
+
}
|
|
133
|
+
formData() {
|
|
134
|
+
return this.#asFetch().formData();
|
|
135
|
+
}
|
|
136
|
+
#asFetch() {
|
|
137
|
+
this.#fetch ??= new Request(this.url, {
|
|
138
|
+
body: this.body,
|
|
139
|
+
duplex: "half",
|
|
140
|
+
/* every value of a repeated header, as the view reports them */
|
|
141
|
+
headers: [...this.headers],
|
|
142
|
+
method: this.method,
|
|
143
|
+
signal: this.signal,
|
|
144
|
+
});
|
|
145
|
+
return this.#fetch;
|
|
146
|
+
}
|
|
147
|
+
/** Count bytes against the cap; over it, the read fails with 413 and the rest stays unread. */
|
|
148
|
+
#count(n) {
|
|
149
|
+
this.#received += n;
|
|
150
|
+
if (this.#maxBody > 0 && this.#received > this.#maxBody)
|
|
151
|
+
this.#tooLarge();
|
|
152
|
+
}
|
|
153
|
+
/** A declared length over the cap fails before anything is read. */
|
|
154
|
+
#checkDeclared() {
|
|
155
|
+
if (this.#maxBody > 0 && Number(this.#incoming.headers["content-length"]) > this.#maxBody)
|
|
156
|
+
this.#tooLarge();
|
|
157
|
+
}
|
|
158
|
+
#tooLarge() {
|
|
159
|
+
this.#overflow = true;
|
|
160
|
+
throw new HoneyError({ errorKey: EK.content_too_large, status: "content_too_large" });
|
|
161
|
+
}
|
|
162
|
+
#cappedStream() {
|
|
163
|
+
/* Node's web stream and the DOM ReadableStream brands do not overlap */
|
|
164
|
+
if (this.#maxBody <= 0)
|
|
165
|
+
return Readable.toWeb(this.#incoming);
|
|
166
|
+
const chunks = this.#incoming[Symbol.asyncIterator]();
|
|
167
|
+
return new ReadableStream({
|
|
168
|
+
cancel: async () => {
|
|
169
|
+
await chunks.return?.();
|
|
170
|
+
},
|
|
171
|
+
pull: async (controller) => {
|
|
172
|
+
try {
|
|
173
|
+
this.#checkDeclared();
|
|
174
|
+
const { done, value } = (await chunks.next());
|
|
175
|
+
if (done === true)
|
|
176
|
+
return controller.close();
|
|
177
|
+
this.#count(value.byteLength);
|
|
178
|
+
controller.enqueue(value);
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
controller.error(error);
|
|
182
|
+
void chunks.return?.();
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
async #read() {
|
|
188
|
+
/* a request without a body reads as empty, any number of times */
|
|
189
|
+
if (!this.#hasBody)
|
|
190
|
+
return Buffer.alloc(0);
|
|
191
|
+
if (this.bodyUsed)
|
|
192
|
+
throw new TypeError("Body has already been used");
|
|
193
|
+
this.#bodyUsed = true;
|
|
194
|
+
if (this.#fetch !== undefined)
|
|
195
|
+
return Buffer.from(await this.#fetch.arrayBuffer());
|
|
196
|
+
if (this.#stream !== undefined)
|
|
197
|
+
return Buffer.from(await new Response(this.#stream).arrayBuffer());
|
|
198
|
+
this.#checkDeclared();
|
|
199
|
+
const chunks = [];
|
|
200
|
+
for await (const chunk of this.#incoming) {
|
|
201
|
+
this.#count(chunk.byteLength);
|
|
202
|
+
chunks.push(chunk);
|
|
203
|
+
}
|
|
204
|
+
return chunks.length === 1 ? chunks[0] : Buffer.concat(chunks);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* The Request the app sees for `incoming`. It is not a Fetch `Request` (`instanceof Request` is
|
|
209
|
+
* false): `toFetchRequest()` gives the real one. A body over `maxBody` bytes fails its read with
|
|
210
|
+
* 413; `0` turns the cap off.
|
|
211
|
+
*/
|
|
212
|
+
export function nodeRequest(incoming, url, maxBody) {
|
|
213
|
+
return new NodeRequest(incoming, url, maxBody);
|
|
214
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetch → `node:http`: a Response written to a ServerResponse. Headers that described another
|
|
3
|
+
* connection are dropped, a stream's declared length is never trusted, a HoneyResponse goes out
|
|
4
|
+
* from its bytes and header map with no Fetch Response built.
|
|
5
|
+
*/
|
|
6
|
+
import type { ServerResponse } from "node:http";
|
|
7
|
+
/**
|
|
8
|
+
* Write `response` to `res`: headers for this connection, the body buffered or piped. For a
|
|
9
|
+
* HEAD (`head`), Node writes no body; a body still unread is never read.
|
|
10
|
+
*/
|
|
11
|
+
export declare function writeResponse(response: Response, res: ServerResponse, head?: boolean): Promise<void>;
|