@lovrozagar/honey 0.7.3 → 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 -746
- package/dist/index.js +12 -2364
- 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 -780
- 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 -197
- 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 -902
- 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 -558
- 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/src/context.ts
DELETED
|
@@ -1,325 +0,0 @@
|
|
|
1
|
-
import { isNodeOutbound } from "./honey-response.ts"
|
|
2
|
-
import type { HoneyError } from "./error.ts"
|
|
3
|
-
import type { ProducerOptions } from "./producer-stream.ts"
|
|
4
|
-
import type { SSEOptions, SSEStream, TypedResponse } from "./response.ts"
|
|
5
|
-
import { HoneyRes } from "./response.ts"
|
|
6
|
-
import { dict } from "./dict.ts"
|
|
7
|
-
import { peerAddressOf } from "./peer.ts"
|
|
8
|
-
import { resolveClient, TRUST_OFF, type ClientInfo, type TrustSetting } from "./client-info.ts"
|
|
9
|
-
import type { PendingTap } from "./types.ts"
|
|
10
|
-
import { EMPTY_OBJ } from "./types.ts"
|
|
11
|
-
import { parseCookies } from "./validation.ts"
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Per-request res with lazy lastEventId — only reads the header when SSE is actually called.
|
|
15
|
-
* All non-SSE methods (json/text/html/etc) are inherited from HoneyRes with zero overhead.
|
|
16
|
-
*/
|
|
17
|
-
class ContextRes extends HoneyRes {
|
|
18
|
-
private _req: Request
|
|
19
|
-
private _ctx: HoneyContext<unknown>
|
|
20
|
-
private _lastEventId: string | undefined | false = false
|
|
21
|
-
|
|
22
|
-
constructor(req: Request, ctx: HoneyContext<unknown>) {
|
|
23
|
-
super(isNodeOutbound(req))
|
|
24
|
-
this._req = req
|
|
25
|
-
this._ctx = ctx
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/** Streams end with the request: `ctx.signal`. Producer failures go to the app logger. */
|
|
29
|
-
protected override _producer(): ProducerOptions {
|
|
30
|
-
const ctx = this._ctx
|
|
31
|
-
return {
|
|
32
|
-
report: (err) => reportStreamError(ctx, err),
|
|
33
|
-
signal: () => ctx.signal,
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
override sse(
|
|
38
|
-
callback: (stream: SSEStream) => Promise<void>,
|
|
39
|
-
opts?: SSEOptions,
|
|
40
|
-
): TypedResponse<"text/event-stream", "ok"> {
|
|
41
|
-
if (this._lastEventId === false) {
|
|
42
|
-
this._lastEventId = this._req.headers.get("last-event-id") ?? undefined
|
|
43
|
-
}
|
|
44
|
-
return super.sse(callback, {
|
|
45
|
-
...opts,
|
|
46
|
-
lastEventId: opts?.lastEventId ?? this._lastEventId,
|
|
47
|
-
})
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
function parseSearch(ctx: HoneyContext): void {
|
|
51
|
-
const url = ctx._lzUrlFn ? ctx._lzUrlFn() : new URL(ctx.req.url)
|
|
52
|
-
/* keys are request data: no prototype, so `?__proto__=` or `?toString=` is just a key */
|
|
53
|
-
const first = dict<string>()
|
|
54
|
-
const all = dict<string[]>()
|
|
55
|
-
for (const [key, value] of url.searchParams) {
|
|
56
|
-
const values = all[key]
|
|
57
|
-
if (values === undefined) {
|
|
58
|
-
first[key] = value
|
|
59
|
-
all[key] = [value]
|
|
60
|
-
} else {
|
|
61
|
-
values.push(value)
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
ctx._lzSearch = first
|
|
65
|
-
ctx._lzSearchAll = all
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/** What `ctx._rq` carries for client-info resolution; the dispatcher's FetchCtx has these fields. */
|
|
69
|
-
type ClientSource = { env?: unknown; request?: Request; trust?: TrustSetting }
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* The client address, scheme and host of the request `ctx` serves, decided by the app's
|
|
73
|
-
* `trustProxy()` setting. `ctx.ip` is its `ip`.
|
|
74
|
-
*/
|
|
75
|
-
export function clientInfo(ctx: HoneyContext<never> | HoneyContext): ClientInfo {
|
|
76
|
-
const c = ctx as HoneyContext
|
|
77
|
-
if (c._lzClient === null) {
|
|
78
|
-
const src = (c._rq ?? {}) as ClientSource
|
|
79
|
-
/* the peer is registered on the request the adapter handed over; headers are read from
|
|
80
|
-
* ctx.req, which survives Deno's upgrade (a header snapshot) */
|
|
81
|
-
const peer = peerAddressOf(src.request ?? c.req, src.env ?? c.env)
|
|
82
|
-
c._lzClient = resolveClient(src.trust ?? TRUST_OFF, c.req, peer)
|
|
83
|
-
}
|
|
84
|
-
return c._lzClient
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function bgSwallow(p: Promise<unknown>) {
|
|
88
|
-
p.catch(noop)
|
|
89
|
-
}
|
|
90
|
-
function noop() {}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* HoneyContext uses `declare` for properties set after construction and
|
|
94
|
-
* class-level getters for lazy-computed properties. No Object.defineProperty
|
|
95
|
-
* on the hot path — V8 optimizes class shapes via hidden classes.
|
|
96
|
-
*
|
|
97
|
-
* `declare` fields have no private brand, so Omit<HoneyContext, "res">
|
|
98
|
-
* works structurally for ApplyOutput type narrowing.
|
|
99
|
-
*/
|
|
100
|
-
type Logger = { error?: (obj: unknown, msg?: string) => void }
|
|
101
|
-
|
|
102
|
-
function reportStreamError(ctx: HoneyContext<unknown>, err: unknown): void {
|
|
103
|
-
const log = (ctx._rq as { log?: Logger } | null)?.log
|
|
104
|
-
if (typeof log?.error === "function") {
|
|
105
|
-
log.error({ err, path: ctx.path }, "stream producer failed")
|
|
106
|
-
return
|
|
107
|
-
}
|
|
108
|
-
console.error("honey: stream producer failed", err)
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Abort `ctx.signal` (with `reason`) for the request `ctx` serves: `timeout()` uses it. Streams
|
|
113
|
-
* still running for the request end, and handlers that pass the signal on stop their work.
|
|
114
|
-
*/
|
|
115
|
-
export function abortRequest(ctx: HoneyContext<never> | HoneyContext, reason?: unknown): void {
|
|
116
|
-
const c = ctx as HoneyContext
|
|
117
|
-
if (c._ac === null) linkSignal(c)
|
|
118
|
-
c._ac?.abort(reason)
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/** Create `ctx.signal`, following the request's own signal (client disconnect, shutdown). */
|
|
122
|
-
function linkSignal(ctx: HoneyContext): AbortSignal {
|
|
123
|
-
const ac = new AbortController()
|
|
124
|
-
ctx._ac = ac
|
|
125
|
-
let request: AbortSignal | undefined
|
|
126
|
-
try {
|
|
127
|
-
request = ctx.req.signal
|
|
128
|
-
} catch {
|
|
129
|
-
/* a request shim without a signal: only timeout() can abort */
|
|
130
|
-
}
|
|
131
|
-
if (request !== undefined && request !== null) {
|
|
132
|
-
if (request.aborted) ac.abort(request.reason)
|
|
133
|
-
else request.addEventListener("abort", () => ac.abort(request.reason), { once: true })
|
|
134
|
-
}
|
|
135
|
-
return ac.signal
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
export class HoneyContext<TEnv = Record<string, unknown>> {
|
|
139
|
-
readonly background: (p: Promise<unknown>) => void
|
|
140
|
-
readonly env: TEnv
|
|
141
|
-
readonly params: Record<string, string>
|
|
142
|
-
readonly req: Request
|
|
143
|
-
readonly res: HoneyRes
|
|
144
|
-
|
|
145
|
-
/* set after construction — declare keeps them off the private brand */
|
|
146
|
-
declare readonly cookies: Record<string, string>
|
|
147
|
-
declare readonly errors: Record<string, (...args: never[]) => unknown>
|
|
148
|
-
declare readonly executionCtx: { waitUntil?: (p: Promise<unknown>) => void } | undefined
|
|
149
|
-
declare readonly headers: Record<string, string>
|
|
150
|
-
/**
|
|
151
|
-
* The client's IP address in canonical form (`::ffff:1.2.3.4` is `1.2.3.4`), or `null` when
|
|
152
|
-
* the runtime does not report one. Behind reverse proxies, set `app.trustProxy()`; until then
|
|
153
|
-
* this is the proxy's address and forwarding headers are ignored.
|
|
154
|
-
*/
|
|
155
|
-
declare readonly ip: string | null
|
|
156
|
-
declare readonly meta: Record<string, unknown>
|
|
157
|
-
declare readonly path: string
|
|
158
|
-
/** Publish into a realtime namespace (see `RealtimePublisher`); spelled out so generated types inline it. */
|
|
159
|
-
declare readonly realtime: {
|
|
160
|
-
publish(topic: string, data: unknown): void
|
|
161
|
-
namespace(name: string): { publish(topic: string, data: unknown): void }
|
|
162
|
-
}
|
|
163
|
-
declare readonly routePattern: string
|
|
164
|
-
declare readonly search: Record<string, string>
|
|
165
|
-
declare readonly searchAll: Record<string, string[]>
|
|
166
|
-
/**
|
|
167
|
-
* Aborts when the client disconnects, when `timeout()` fires, or when the server shuts down.
|
|
168
|
-
* Pass it to `fetch()`, database drivers and timers so abandoned work stops; streams from
|
|
169
|
-
* `ctx.res.sse()`, `stream()` and `generate()` already end with it.
|
|
170
|
-
*/
|
|
171
|
-
declare readonly signal: AbortSignal
|
|
172
|
-
/**
|
|
173
|
-
* The error behind the response, once a handler or a deeper middleware threw and the
|
|
174
|
-
* `next()` boundary turned it into an error response; `undefined` while nothing failed.
|
|
175
|
-
* Read it after `await next()` for metrics, logs or reporting: `errorKey`, `status`, and
|
|
176
|
-
* `cause` (the original throw when it was not a `HoneyError`). Later errors replace it.
|
|
177
|
-
*/
|
|
178
|
-
declare readonly error: HoneyError | undefined
|
|
179
|
-
|
|
180
|
-
/* backing state for lazy getters — stored directly on instance to avoid extra object allocation */
|
|
181
|
-
/** @internal */ _ac: AbortController | null
|
|
182
|
-
/** @internal */ _lzClient: ClientInfo | null
|
|
183
|
-
/** @internal */ _lzCookies: Record<string, string> | null
|
|
184
|
-
/** @internal */ _lzHeaders: Record<string, string> | null
|
|
185
|
-
/** @internal */ _lzSearch: Record<string, string> | null
|
|
186
|
-
/** @internal */ _lzSearchAll: Record<string, string[]> | null
|
|
187
|
-
/** @internal */ _lzUrlFn: (() => URL) | null
|
|
188
|
-
|
|
189
|
-
/* error propagation — lets handler errors flow back through middleware chain */
|
|
190
|
-
/** @internal */ _errorToResponse: ((thrown: unknown) => Promise<Response>) | null
|
|
191
|
-
/** @internal */ _isErrorResponse: boolean
|
|
192
|
-
|
|
193
|
-
/* tap side-effects — queued by c.tap(), drained after handler */
|
|
194
|
-
/** @internal */ _pendingTaps: PendingTap[] | null
|
|
195
|
-
|
|
196
|
-
/* the request this context serves — read by the error boundary and terminal handlers */
|
|
197
|
-
/** @internal */ _rq: unknown
|
|
198
|
-
|
|
199
|
-
constructor(opts: {
|
|
200
|
-
env: TEnv
|
|
201
|
-
executionCtx?: { waitUntil?: (p: Promise<unknown>) => void }
|
|
202
|
-
meta?: Record<string, unknown>
|
|
203
|
-
params: Record<string, string>
|
|
204
|
-
path?: string
|
|
205
|
-
req: Request
|
|
206
|
-
routePattern?: string
|
|
207
|
-
urlFn?: () => URL
|
|
208
|
-
}) {
|
|
209
|
-
this.req = opts.req
|
|
210
|
-
this.env = opts.env
|
|
211
|
-
this.params = opts.params
|
|
212
|
-
this.res = new ContextRes(opts.req, this as HoneyContext<unknown>)
|
|
213
|
-
|
|
214
|
-
/* direct assignment — no defineProperty */
|
|
215
|
-
;(this as Record<string, unknown>)["executionCtx"] = opts.executionCtx
|
|
216
|
-
;(this as Record<string, unknown>)["path"] = opts.path ?? ""
|
|
217
|
-
;(this as Record<string, unknown>)["routePattern"] = opts.routePattern ?? ""
|
|
218
|
-
;(this as Record<string, unknown>)["meta"] = opts.meta ?? EMPTY_OBJ
|
|
219
|
-
|
|
220
|
-
/* invoke through executionCtx so `this` binds to the owning object — workerd's native ExecutionContext.waitUntil throws "Illegal invocation" when called detached */
|
|
221
|
-
const executionCtx = opts.executionCtx
|
|
222
|
-
const waitUntil = executionCtx?.waitUntil
|
|
223
|
-
this.background = waitUntil
|
|
224
|
-
? (p: Promise<unknown>) => {
|
|
225
|
-
waitUntil.call(executionCtx, p)
|
|
226
|
-
}
|
|
227
|
-
: bgSwallow
|
|
228
|
-
|
|
229
|
-
/* lazy getter backing — flat on instance, no extra object */
|
|
230
|
-
this._ac = null
|
|
231
|
-
this._lzClient = null
|
|
232
|
-
this._lzCookies = null
|
|
233
|
-
this._lzHeaders = null
|
|
234
|
-
this._lzSearch = null
|
|
235
|
-
this._lzSearchAll = null
|
|
236
|
-
this._lzUrlFn = opts.urlFn ?? null
|
|
237
|
-
|
|
238
|
-
/* error propagation */
|
|
239
|
-
;(this as Record<string, unknown>)["error"] = undefined
|
|
240
|
-
this._errorToResponse = null
|
|
241
|
-
this._isErrorResponse = false
|
|
242
|
-
|
|
243
|
-
/* taps */
|
|
244
|
-
this._pendingTaps = null
|
|
245
|
-
|
|
246
|
-
this._rq = null
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
/** @internal */
|
|
250
|
-
_setErrors(errors: Record<string, (...args: never[]) => unknown>): void {
|
|
251
|
-
;(this as { errors: typeof errors }).errors = errors
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
/** Queue a side-effect to fire after handler returns successfully */
|
|
255
|
-
tap(key: string, payload: unknown): void {
|
|
256
|
-
if (this._pendingTaps === null) {
|
|
257
|
-
this._pendingTaps = [{ key, payload }]
|
|
258
|
-
} else {
|
|
259
|
-
this._pendingTaps.push({ key, payload })
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/* lazy getters on prototype — V8 hidden class optimized, no per-instance defineProperty */
|
|
264
|
-
|
|
265
|
-
static {
|
|
266
|
-
Object.defineProperty(HoneyContext.prototype, "cookies", {
|
|
267
|
-
configurable: true,
|
|
268
|
-
enumerable: true,
|
|
269
|
-
get(this: HoneyContext): Record<string, string> {
|
|
270
|
-
if (this._lzCookies === null) {
|
|
271
|
-
this._lzCookies = parseCookies(this.req.headers.get("cookie") ?? "")
|
|
272
|
-
}
|
|
273
|
-
return this._lzCookies
|
|
274
|
-
},
|
|
275
|
-
})
|
|
276
|
-
Object.defineProperty(HoneyContext.prototype, "headers", {
|
|
277
|
-
configurable: true,
|
|
278
|
-
enumerable: true,
|
|
279
|
-
get(this: HoneyContext): Record<string, string> {
|
|
280
|
-
if (this._lzHeaders === null) {
|
|
281
|
-
const h = dict<string>()
|
|
282
|
-
this.req.headers.forEach((value, key) => {
|
|
283
|
-
h[key] = value
|
|
284
|
-
})
|
|
285
|
-
this._lzHeaders = h
|
|
286
|
-
}
|
|
287
|
-
return this._lzHeaders
|
|
288
|
-
},
|
|
289
|
-
})
|
|
290
|
-
Object.defineProperty(HoneyContext.prototype, "ip", {
|
|
291
|
-
configurable: true,
|
|
292
|
-
enumerable: true,
|
|
293
|
-
get(this: HoneyContext): string | null {
|
|
294
|
-
return clientInfo(this).ip
|
|
295
|
-
},
|
|
296
|
-
})
|
|
297
|
-
Object.defineProperty(HoneyContext.prototype, "signal", {
|
|
298
|
-
configurable: true,
|
|
299
|
-
enumerable: true,
|
|
300
|
-
get(this: HoneyContext): AbortSignal {
|
|
301
|
-
return this._ac === null ? linkSignal(this) : this._ac.signal
|
|
302
|
-
},
|
|
303
|
-
})
|
|
304
|
-
Object.defineProperty(HoneyContext.prototype, "search", {
|
|
305
|
-
configurable: true,
|
|
306
|
-
enumerable: true,
|
|
307
|
-
get(this: HoneyContext): Record<string, string> {
|
|
308
|
-
if (this._lzSearch === null) {
|
|
309
|
-
parseSearch(this)
|
|
310
|
-
}
|
|
311
|
-
return this._lzSearch as Record<string, string>
|
|
312
|
-
},
|
|
313
|
-
})
|
|
314
|
-
Object.defineProperty(HoneyContext.prototype, "searchAll", {
|
|
315
|
-
configurable: true,
|
|
316
|
-
enumerable: true,
|
|
317
|
-
get(this: HoneyContext): Record<string, string[]> {
|
|
318
|
-
if (this._lzSearchAll === null) {
|
|
319
|
-
parseSearch(this)
|
|
320
|
-
}
|
|
321
|
-
return this._lzSearchAll as Record<string, string[]>
|
|
322
|
-
},
|
|
323
|
-
})
|
|
324
|
-
}
|
|
325
|
-
}
|
package/src/cookie-sign.ts
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
const encoder = new TextEncoder()
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Signed value formats:
|
|
5
|
-
*
|
|
6
|
-
* - v2 (current): `<value>.~<sig>`, where `sig` is the HMAC-SHA256 of
|
|
7
|
-
* `"honey-cookie-v2\0" + name + "\0" + value`. The cookie name is bound into
|
|
8
|
-
* the MAC, so a signature cannot be replayed under another cookie that shares
|
|
9
|
-
* the secret. `~` is outside the base64url alphabet, so the two formats never
|
|
10
|
-
* overlap.
|
|
11
|
-
* - v1 (legacy): `<value>.<sig>`, the HMAC of the value alone. `verify` accepts
|
|
12
|
-
* it while `legacy` is true (the default) so cookies issued before the change
|
|
13
|
-
* keep working during a migration window.
|
|
14
|
-
*/
|
|
15
|
-
const V2_MARKER = "~"
|
|
16
|
-
const V2_DOMAIN = "honey-cookie-v2\0"
|
|
17
|
-
/* An HMAC-SHA256 tag is 32 bytes: 43 base64url characters, no padding. */
|
|
18
|
-
const SIG_RE = /^[A-Za-z0-9_-]{43}$/
|
|
19
|
-
|
|
20
|
-
export type SignOptions = {
|
|
21
|
-
/** The cookie name to bind the signature to. Pass the same name to `verify`. */
|
|
22
|
-
name?: string
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export type VerifyOptions = {
|
|
26
|
-
/** The cookie name the signature must be bound to. */
|
|
27
|
-
name?: string
|
|
28
|
-
/**
|
|
29
|
-
* Also accept legacy (v1) signatures, which are not bound to a name.
|
|
30
|
-
* Default `true`; set `false` once every v1 cookie has expired.
|
|
31
|
-
*/
|
|
32
|
-
legacy?: boolean
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const MAX_CACHED_KEYS = 32
|
|
36
|
-
const keyCache = new Map<string, Promise<CryptoKey>>()
|
|
37
|
-
|
|
38
|
-
function importKey(secret: string): Promise<CryptoKey> {
|
|
39
|
-
let key = keyCache.get(secret)
|
|
40
|
-
if (key === undefined) {
|
|
41
|
-
key = crypto.subtle.importKey("raw", encoder.encode(secret), { hash: "SHA-256", name: "HMAC" }, false, [
|
|
42
|
-
"sign",
|
|
43
|
-
"verify",
|
|
44
|
-
])
|
|
45
|
-
if (keyCache.size >= MAX_CACHED_KEYS) {
|
|
46
|
-
const oldest = keyCache.keys().next().value
|
|
47
|
-
if (oldest !== undefined) keyCache.delete(oldest)
|
|
48
|
-
}
|
|
49
|
-
keyCache.set(secret, key)
|
|
50
|
-
/* A rejected import must not stay cached. */
|
|
51
|
-
key.catch(() => keyCache.delete(secret))
|
|
52
|
-
}
|
|
53
|
-
return key
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function toBase64Url(buffer: ArrayBuffer): string {
|
|
57
|
-
const bytes = new Uint8Array(buffer)
|
|
58
|
-
let binary = ""
|
|
59
|
-
for (let i = 0; i < bytes.length; i++) {
|
|
60
|
-
binary += String.fromCharCode(bytes[i])
|
|
61
|
-
}
|
|
62
|
-
return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "")
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/** Strict decode: the input must be the canonical encoding of a 32-byte tag. */
|
|
66
|
-
function fromBase64Url(str: string): Uint8Array<ArrayBuffer> | null {
|
|
67
|
-
if (!SIG_RE.test(str)) return null
|
|
68
|
-
let binary: string
|
|
69
|
-
try {
|
|
70
|
-
binary = atob(str.replace(/-/g, "+").replace(/_/g, "/"))
|
|
71
|
-
} catch {
|
|
72
|
-
return null
|
|
73
|
-
}
|
|
74
|
-
const bytes = new Uint8Array(binary.length)
|
|
75
|
-
for (let i = 0; i < binary.length; i++) {
|
|
76
|
-
bytes[i] = binary.charCodeAt(i)
|
|
77
|
-
}
|
|
78
|
-
/* Reject non-zero trailing bits, which would make signatures malleable. */
|
|
79
|
-
if (toBase64Url(bytes.buffer) !== str) return null
|
|
80
|
-
return bytes
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
function v2Payload(name: string, value: string): Uint8Array<ArrayBuffer> {
|
|
84
|
-
return encoder.encode(`${V2_DOMAIN}${name}\0${value}`)
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export async function sign(value: string, secret: string, opts: SignOptions = {}): Promise<string> {
|
|
88
|
-
const key = await importKey(secret)
|
|
89
|
-
const signature = await crypto.subtle.sign("HMAC", key, v2Payload(opts.name ?? "", value))
|
|
90
|
-
return `${value}.${V2_MARKER}${toBase64Url(signature)}`
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/** Returns the original value, or `null` when no secret verifies it or the input is malformed. */
|
|
94
|
-
export async function verify(signed: string, secrets: string[], opts: VerifyOptions = {}): Promise<string | null> {
|
|
95
|
-
if (typeof signed !== "string" || signed.length === 0) return null
|
|
96
|
-
const lastDot = signed.lastIndexOf(".")
|
|
97
|
-
if (lastDot === -1) return null
|
|
98
|
-
|
|
99
|
-
const value = signed.slice(0, lastDot)
|
|
100
|
-
let sigText = signed.slice(lastDot + 1)
|
|
101
|
-
const isV2 = sigText.startsWith(V2_MARKER)
|
|
102
|
-
if (isV2) sigText = sigText.slice(V2_MARKER.length)
|
|
103
|
-
else if (opts.legacy === false) return null
|
|
104
|
-
|
|
105
|
-
const sig = fromBase64Url(sigText)
|
|
106
|
-
if (sig === null) return null
|
|
107
|
-
const payload = isV2 ? v2Payload(opts.name ?? "", value) : encoder.encode(value)
|
|
108
|
-
|
|
109
|
-
for (const secret of secrets) {
|
|
110
|
-
try {
|
|
111
|
-
const key = await importKey(secret)
|
|
112
|
-
if (await crypto.subtle.verify("HMAC", key, sig, payload)) return value
|
|
113
|
-
} catch {
|
|
114
|
-
/* An unusable secret never verifies. */
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
return null
|
|
119
|
-
}
|
package/src/cookie.ts
DELETED
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
export type CookieOptions = {
|
|
2
|
-
domain?: string
|
|
3
|
-
expires?: Date
|
|
4
|
-
httpOnly?: boolean
|
|
5
|
-
maxAge?: number
|
|
6
|
-
path?: string
|
|
7
|
-
sameSite?: "lax" | "none" | "strict"
|
|
8
|
-
secure?: boolean
|
|
9
|
-
value: string
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
const UNSAFE_KEYS = new Set(["__proto__", "constructor", "prototype"])
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Percent-encode characters outside the RFC 6265 cookie-octet range, plus `%`
|
|
16
|
-
* itself so the value always decodes back to what was set.
|
|
17
|
-
* Cookie-octets: 0x21, 0x23-0x2B, 0x2D-0x3A, 0x3C-0x5B, 0x5D-0x7E
|
|
18
|
-
*/
|
|
19
|
-
function encodeCookieValue(value: string): string {
|
|
20
|
-
let encoded = ""
|
|
21
|
-
for (const ch of value) {
|
|
22
|
-
const c = ch.codePointAt(0) ?? 0
|
|
23
|
-
if (
|
|
24
|
-
c !== 0x25 &&
|
|
25
|
-
(c === 0x21 ||
|
|
26
|
-
(c >= 0x23 && c <= 0x2b) ||
|
|
27
|
-
(c >= 0x2d && c <= 0x3a) ||
|
|
28
|
-
(c >= 0x3c && c <= 0x5b) ||
|
|
29
|
-
(c >= 0x5d && c <= 0x7e))
|
|
30
|
-
) {
|
|
31
|
-
encoded += ch
|
|
32
|
-
} else if (c >= 0xd800 && c <= 0xdfff) {
|
|
33
|
-
throw new TypeError("Cookie value contains a lone surrogate and cannot be encoded")
|
|
34
|
-
} else {
|
|
35
|
-
encoded += encodeURIComponent(ch)
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return encoded
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Decode `%XX` sequences that form valid UTF-8 and keep every other byte as
|
|
43
|
-
* sent. A stray `%` in a foreign cookie no longer disables decoding for the
|
|
44
|
-
* whole value.
|
|
45
|
-
*/
|
|
46
|
-
export function decodeCookieValue(value: string): string {
|
|
47
|
-
if (value.indexOf("%") === -1) return value
|
|
48
|
-
try {
|
|
49
|
-
return decodeURIComponent(value)
|
|
50
|
-
} catch {
|
|
51
|
-
return value.replace(/(?:%[0-9A-Fa-f]{2})+/g, (run) => {
|
|
52
|
-
try {
|
|
53
|
-
return decodeURIComponent(run)
|
|
54
|
-
} catch {
|
|
55
|
-
return run
|
|
56
|
-
}
|
|
57
|
-
})
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Parse a `Cookie` request header. When a name repeats, the first value wins:
|
|
63
|
-
* browsers send the cookie with the most specific path first (RFC 6265 §5.4).
|
|
64
|
-
* Names are trimmed on both sides; empty names and prototype keys are skipped.
|
|
65
|
-
*/
|
|
66
|
-
export function parseCookieHeader(header: string): Record<string, string> {
|
|
67
|
-
const result: Record<string, string> = {}
|
|
68
|
-
if (header.length === 0) return result
|
|
69
|
-
for (const pair of header.split(";")) {
|
|
70
|
-
const eqIdx = pair.indexOf("=")
|
|
71
|
-
if (eqIdx === -1) continue
|
|
72
|
-
const name = pair.slice(0, eqIdx).trim()
|
|
73
|
-
if (name.length === 0 || UNSAFE_KEYS.has(name) || Object.hasOwn(result, name)) continue
|
|
74
|
-
let value = pair.slice(eqIdx + 1).trim()
|
|
75
|
-
/* RFC 6265: strip surrounding double quotes before decoding, so an encoded quote survives. */
|
|
76
|
-
if (value.length >= 2 && value.charCodeAt(0) === 34 && value.charCodeAt(value.length - 1) === 34) {
|
|
77
|
-
value = value.slice(1, -1)
|
|
78
|
-
}
|
|
79
|
-
result[name] = decodeCookieValue(value)
|
|
80
|
-
}
|
|
81
|
-
return result
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const validCookieNameRe = /^[\w!#$%&'*.^`|~+-]+$/
|
|
85
|
-
/* A host name or IP literal, optionally with a leading dot. */
|
|
86
|
-
const validDomainRe = /^\.?(?:[A-Za-z0-9-]+\.)*[A-Za-z0-9-]+$|^\[[0-9A-Fa-f:.]+\]$/
|
|
87
|
-
|
|
88
|
-
export function serializeCookie(name: string, opts: CookieOptions): string {
|
|
89
|
-
if (!validCookieNameRe.test(name)) {
|
|
90
|
-
throw new Error(`Invalid cookie name: ${JSON.stringify(name)}`)
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
let secure = opts.secure
|
|
94
|
-
let path = opts.path
|
|
95
|
-
|
|
96
|
-
/* Browsers match the prefixes case-insensitively (RFC 6265bis §4.1.3). */
|
|
97
|
-
const lower = name.toLowerCase()
|
|
98
|
-
if (lower.startsWith("__host-")) {
|
|
99
|
-
if (!opts.secure) throw new Error("__Host- cookies require secure: true")
|
|
100
|
-
if (opts.domain) throw new Error("__Host- cookies must not set domain")
|
|
101
|
-
if (opts.path !== "/" && opts.path !== undefined) {
|
|
102
|
-
throw new Error("__Host- cookies must have path: '/'")
|
|
103
|
-
}
|
|
104
|
-
secure = true
|
|
105
|
-
path = path ?? "/"
|
|
106
|
-
} else if (lower.startsWith("__secure-")) {
|
|
107
|
-
if (!opts.secure) throw new Error("__Secure- cookies require secure: true")
|
|
108
|
-
secure = true
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
if (opts.sameSite === "none" && !secure) {
|
|
112
|
-
throw new Error("SameSite=None cookies require secure: true")
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
if (opts.domain && !validDomainRe.test(opts.domain)) {
|
|
116
|
-
throw new Error("Cookie domain contains invalid characters")
|
|
117
|
-
}
|
|
118
|
-
/* av-value: any CHAR except CTLs or ";" (RFC 6265 §4.1.1). */
|
|
119
|
-
if (path && /[^\x20-\x3a\x3c-\x7e]/.test(path)) {
|
|
120
|
-
throw new Error("Cookie path contains invalid characters")
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
let cookie = `${name}=${encodeCookieValue(opts.value)}`
|
|
124
|
-
if (opts.domain) cookie += `; Domain=${opts.domain}`
|
|
125
|
-
if (path) cookie += `; Path=${path}`
|
|
126
|
-
if (opts.maxAge !== undefined) {
|
|
127
|
-
if (!Number.isFinite(opts.maxAge) || opts.maxAge < 0) {
|
|
128
|
-
throw new Error(`Invalid cookie Max-Age: ${opts.maxAge}`)
|
|
129
|
-
}
|
|
130
|
-
/* Clamp so the value prints as digits; browsers cap Max-Age at 400 days anyway. */
|
|
131
|
-
cookie += `; Max-Age=${Math.min(Math.floor(opts.maxAge), Number.MAX_SAFE_INTEGER)}`
|
|
132
|
-
}
|
|
133
|
-
if (opts.expires) {
|
|
134
|
-
if (Number.isNaN(opts.expires.getTime())) {
|
|
135
|
-
throw new Error("Invalid cookie Expires: date is invalid")
|
|
136
|
-
}
|
|
137
|
-
cookie += `; Expires=${opts.expires.toUTCString()}`
|
|
138
|
-
}
|
|
139
|
-
if (opts.httpOnly) cookie += "; HttpOnly"
|
|
140
|
-
if (secure) cookie += "; Secure"
|
|
141
|
-
if (opts.sameSite) cookie += `; SameSite=${opts.sameSite.charAt(0).toUpperCase()}${opts.sameSite.slice(1)}`
|
|
142
|
-
return cookie
|
|
143
|
-
}
|
package/src/cors.ts
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { namedMiddleware } from "./middleware.ts"
|
|
2
|
-
import type { MiddlewareFn } from "./middleware.ts"
|
|
3
|
-
import { withHeaders } from "./with-headers.ts"
|
|
4
|
-
|
|
5
|
-
export type CORSOptions = {
|
|
6
|
-
/** Requires an explicit `origin` list, string or predicate; `"*"` or no origin throws. */
|
|
7
|
-
credentials?: boolean
|
|
8
|
-
exposeHeaders?: string[]
|
|
9
|
-
headers?: string[]
|
|
10
|
-
maxAge?: number
|
|
11
|
-
methods?: string[]
|
|
12
|
-
origin?: "*" | ((origin: string) => boolean) | string | string[]
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const DEFAULT_METHODS = ["GET", "HEAD", "PUT", "PATCH", "POST", "DELETE"]
|
|
16
|
-
const DEFAULT_MAX_AGE = 86400
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Returns the value for `Access-Control-Allow-Origin`, or null when the origin
|
|
20
|
-
* is not allowed. The opaque origin `null` (sandboxed iframes, `file:`, some
|
|
21
|
-
* redirects) is never reflected: any page can produce it.
|
|
22
|
-
*/
|
|
23
|
-
function matchOrigin(origin: string, config: CORSOptions["origin"]): string | null {
|
|
24
|
-
if (config === undefined || config === "*") return "*"
|
|
25
|
-
if (origin === "null") return null
|
|
26
|
-
if (typeof config === "string") return config === origin ? origin : null
|
|
27
|
-
if (Array.isArray(config)) return config.includes(origin) ? origin : null
|
|
28
|
-
return config(origin) ? origin : null
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/** Append `value` to `Vary` unless it is already listed (or `*`). */
|
|
32
|
-
function addVary(headers: Headers, value: string): void {
|
|
33
|
-
const current = headers.get("vary")
|
|
34
|
-
if (current === null || current.trim() === "") {
|
|
35
|
-
headers.set("vary", value)
|
|
36
|
-
return
|
|
37
|
-
}
|
|
38
|
-
const tokens = current.split(",").map((t) => t.trim().toLowerCase())
|
|
39
|
-
if (tokens.includes("*") || tokens.includes(value.toLowerCase())) return
|
|
40
|
-
headers.set("vary", `${current}, ${value}`)
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export function cors(options?: CORSOptions): MiddlewareFn<{ req: Request }, {}> {
|
|
44
|
-
const opts = options ?? {}
|
|
45
|
-
|
|
46
|
-
if (opts.credentials === true && (opts.origin === undefined || opts.origin === "*")) {
|
|
47
|
-
throw new TypeError(
|
|
48
|
-
"cors: `credentials: true` needs an explicit `origin` (string, list or predicate). A wildcard would let every site make credentialed requests and read the response.",
|
|
49
|
-
)
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/* `Vary: Origin` whenever the answer depends on the request's Origin — that is,
|
|
53
|
-
* on every response unless the policy is a plain wildcard. Without it a shared
|
|
54
|
-
* cache can serve one origin's ACAO (or its absence) to another. */
|
|
55
|
-
const varies = !(opts.origin === undefined || opts.origin === "*")
|
|
56
|
-
const methods = (opts.methods ?? DEFAULT_METHODS).join(", ")
|
|
57
|
-
const allowHeaders = opts.headers && opts.headers.length > 0 ? opts.headers.join(", ") : null
|
|
58
|
-
const exposeHeaders = opts.exposeHeaders && opts.exposeHeaders.length > 0 ? opts.exposeHeaders.join(", ") : null
|
|
59
|
-
const maxAge = String(opts.maxAge ?? DEFAULT_MAX_AGE)
|
|
60
|
-
|
|
61
|
-
const mw: MiddlewareFn<{ req: Request }, {}> = async (ctx, next) => {
|
|
62
|
-
const req = ctx.req
|
|
63
|
-
const requestOrigin = req.headers.get("origin")
|
|
64
|
-
const allowedOrigin = requestOrigin === null ? null : matchOrigin(requestOrigin, opts.origin)
|
|
65
|
-
|
|
66
|
-
if (allowedOrigin !== null && req.method === "OPTIONS" && req.headers.has("access-control-request-method")) {
|
|
67
|
-
const headers = new Headers()
|
|
68
|
-
headers.set("access-control-allow-origin", allowedOrigin)
|
|
69
|
-
headers.set("access-control-allow-methods", methods)
|
|
70
|
-
if (allowHeaders !== null) {
|
|
71
|
-
headers.set("access-control-allow-headers", allowHeaders)
|
|
72
|
-
} else {
|
|
73
|
-
const requested = req.headers.get("access-control-request-headers")
|
|
74
|
-
if (requested) headers.set("access-control-allow-headers", requested)
|
|
75
|
-
addVary(headers, "Access-Control-Request-Headers")
|
|
76
|
-
}
|
|
77
|
-
headers.set("access-control-max-age", maxAge)
|
|
78
|
-
if (opts.credentials) headers.set("access-control-allow-credentials", "true")
|
|
79
|
-
if (varies) addVary(headers, "Origin")
|
|
80
|
-
return new Response(null, { headers, status: 204 })
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const response = await next()
|
|
84
|
-
if (allowedOrigin === null && !varies) return response
|
|
85
|
-
return withHeaders(response, (headers) => {
|
|
86
|
-
if (varies) addVary(headers, "Origin")
|
|
87
|
-
if (allowedOrigin === null) return
|
|
88
|
-
headers.set("access-control-allow-origin", allowedOrigin)
|
|
89
|
-
if (opts.credentials) headers.set("access-control-allow-credentials", "true")
|
|
90
|
-
if (exposeHeaders !== null) headers.set("access-control-expose-headers", exposeHeaders)
|
|
91
|
-
})
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
return namedMiddleware("cors", mw)
|
|
95
|
-
}
|