@lovrozagar/honey 0.7.3 → 1.0.0-rc.3
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 +930 -1664
- 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 +175 -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/meta-types.d.ts +34 -0
- package/dist/routing/meta-types.js +5 -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 +136 -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
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The middleware primitive: the typed factories, the meta a middleware contributes, and the chain
|
|
3
|
+
* compiler. A chain compiles once per route; every `next()` boundary is an error boundary, and a
|
|
4
|
+
* layer whose middleware answered synchronously stays synchronous (no Promise per layer).
|
|
5
|
+
*/
|
|
6
|
+
import { isReservedCtxKey } from "../context/context.js";
|
|
7
|
+
import { isHoneyResponse } from "../response/builder.js";
|
|
8
|
+
/**
|
|
9
|
+
* Stamp a stable name on a middleware closure. `Function.prototype.name` is inferred by whatever
|
|
10
|
+
* transpiled the module, and transpilers disagree about a closure returned from a factory; a
|
|
11
|
+
* shipped middleware names itself so generated artifacts are deterministic.
|
|
12
|
+
*/
|
|
13
|
+
export function namedMiddleware(name, fn) {
|
|
14
|
+
Object.defineProperty(fn, "name", { configurable: true, value: name });
|
|
15
|
+
return fn;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* `internal` decides whether a route appears in generated artifacts at all; a middleware that set
|
|
19
|
+
* it would silently remove routes, so it is the one key middleware may not contribute.
|
|
20
|
+
*/
|
|
21
|
+
function attachMiddlewareMeta(fn, meta) {
|
|
22
|
+
if ("internal" in meta) {
|
|
23
|
+
throw new Error('middleware meta cannot set "internal": it controls whether routes appear in generated artifacts; set it on the route with .meta({ internal: true })');
|
|
24
|
+
}
|
|
25
|
+
Object.defineProperty(fn, "meta", { value: Object.freeze({ ...meta }) });
|
|
26
|
+
}
|
|
27
|
+
/** A middleware whose error keys are constrained to a factory; `.use()` accumulates them. */
|
|
28
|
+
export function defineMiddleware(opts) {
|
|
29
|
+
const fn = opts.fn;
|
|
30
|
+
if (opts.errors) {
|
|
31
|
+
Object.defineProperty(fn, "errors", { value: opts.errors.slice(1) });
|
|
32
|
+
/* the factory the keys come from, off the type: a document reads their statuses off it */
|
|
33
|
+
Object.defineProperty(fn, "errorFactory", { value: opts.errors[0] });
|
|
34
|
+
}
|
|
35
|
+
if (opts.meta)
|
|
36
|
+
attachMiddlewareMeta(fn, opts.meta);
|
|
37
|
+
return fn;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* A middleware: annotate `ctx` for what it requires; what it adds is inferred from `next({...})`.
|
|
41
|
+
* createMiddleware((ctx: { env: { DB: D1Database } }, next) => next({ db }))
|
|
42
|
+
*/
|
|
43
|
+
export function createMiddleware(fn, opts) {
|
|
44
|
+
if (opts?.meta)
|
|
45
|
+
attachMiddlewareMeta(fn, opts.meta);
|
|
46
|
+
return fn;
|
|
47
|
+
}
|
|
48
|
+
/** Merge the meta a chain contributes, in run order (later wins). Resolved once at finalize. */
|
|
49
|
+
export function collectMiddlewareMeta(groups) {
|
|
50
|
+
let out = null;
|
|
51
|
+
for (const group of groups) {
|
|
52
|
+
for (const mw of group) {
|
|
53
|
+
const meta = mw.meta;
|
|
54
|
+
if (meta)
|
|
55
|
+
out = Object.assign(out ?? {}, meta);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
const NO_RESPONSE_HANDLER = "handler must return a Response — did you forget 'return ctx.res...()'?";
|
|
61
|
+
const NO_RESPONSE_MIDDLEWARE = "middleware must return a Response — did you forget 'return next(...)'?";
|
|
62
|
+
function mergeAdditions(ctx, additions) {
|
|
63
|
+
for (const key in additions)
|
|
64
|
+
if (!isReservedCtxKey(key))
|
|
65
|
+
ctx[key] = additions[key];
|
|
66
|
+
}
|
|
67
|
+
/** Whether a layer answered: a Response, or honey's own built one. */
|
|
68
|
+
const isAnswer = (value) => isHoneyResponse(value) || value instanceof Response;
|
|
69
|
+
/** Settle one layer's result: anything but a Response (nothing, a string…) and a throw both go to the boundary. */
|
|
70
|
+
function settle(result, ctx, convert, missing) {
|
|
71
|
+
if (result instanceof Promise) {
|
|
72
|
+
return result.then((value) => (isAnswer(value) ? value : convert(new Error(missing), ctx)), (thrown) => convert(thrown, ctx));
|
|
73
|
+
}
|
|
74
|
+
return isAnswer(result) ? result : convert(new Error(missing), ctx);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Compile a middleware chain and a handler into one function, once. Whatever the handler or a
|
|
78
|
+
* middleware throws or rejects with becomes a Response at that layer, so the middleware around it
|
|
79
|
+
* always gets a Response from `next()` and its post-`next()` code runs on errors too.
|
|
80
|
+
*/
|
|
81
|
+
export function compileChain(middlewares, handler, convert) {
|
|
82
|
+
const n = middlewares.length;
|
|
83
|
+
const runHandler = (ctx) => {
|
|
84
|
+
try {
|
|
85
|
+
return settle(handler(ctx), ctx, convert, NO_RESPONSE_HANDLER);
|
|
86
|
+
}
|
|
87
|
+
catch (thrown) {
|
|
88
|
+
return convert(thrown, ctx);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const step = (i, ctx) => {
|
|
92
|
+
if (i === n)
|
|
93
|
+
return runHandler(ctx);
|
|
94
|
+
const mw = middlewares[i];
|
|
95
|
+
let called = false;
|
|
96
|
+
const next = (additions) => {
|
|
97
|
+
if (called)
|
|
98
|
+
throw new Error("next() called multiple times");
|
|
99
|
+
called = true;
|
|
100
|
+
if (additions)
|
|
101
|
+
mergeAdditions(ctx, additions);
|
|
102
|
+
return step(i + 1, ctx);
|
|
103
|
+
};
|
|
104
|
+
try {
|
|
105
|
+
return settle(mw(ctx, next), ctx, convert, NO_RESPONSE_MIDDLEWARE);
|
|
106
|
+
}
|
|
107
|
+
catch (thrown) {
|
|
108
|
+
return convert(thrown, ctx);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
return n === 0 ? runHandler : (ctx) => step(0, ctx);
|
|
112
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `poweredBy({ name })`: `X-Powered-By: Honey`, or `name`, on every answer. A value the handler set
|
|
3
|
+
* itself is kept.
|
|
4
|
+
*/
|
|
5
|
+
import { withHeaders } from "../response/with-headers.js";
|
|
6
|
+
import { namedMiddleware } from "./middleware.js";
|
|
7
|
+
export function poweredBy(options = {}) {
|
|
8
|
+
const name = options.name ?? "Honey";
|
|
9
|
+
return namedMiddleware("poweredBy", async (_ctx, next) => withHeaders(await next(), (headers) => {
|
|
10
|
+
if (!headers.has("x-powered-by"))
|
|
11
|
+
headers.set("x-powered-by", name);
|
|
12
|
+
}));
|
|
13
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type MiddlewareFn } from "./middleware.ts";
|
|
2
|
+
/** A key's window after one more request: requests counted so far, and when it ends (epoch ms). */
|
|
3
|
+
export type RateLimitHit = {
|
|
4
|
+
readonly count: number;
|
|
5
|
+
readonly resetAt: number;
|
|
6
|
+
};
|
|
7
|
+
/** Counts a request against `key`'s current window, starting a new one when it has ended. */
|
|
8
|
+
export type RateLimitStore = {
|
|
9
|
+
hit(key: string): Promise<RateLimitHit> | RateLimitHit;
|
|
10
|
+
};
|
|
11
|
+
export type MemoryStore = {
|
|
12
|
+
hit(key: string): RateLimitHit;
|
|
13
|
+
readonly size: number;
|
|
14
|
+
};
|
|
15
|
+
export type MemoryStoreOptions = {
|
|
16
|
+
/** Windows kept at most; past it the least recently used is evicted. Default 10 000. */
|
|
17
|
+
maxKeys?: number | undefined;
|
|
18
|
+
windowMs: number;
|
|
19
|
+
};
|
|
20
|
+
type KeyContext = {
|
|
21
|
+
readonly ip: string | null;
|
|
22
|
+
readonly req: Request;
|
|
23
|
+
};
|
|
24
|
+
export type RateLimitOptions = {
|
|
25
|
+
/** The window a request counts against. Default `ctx.ip`; no reported peer shares one window. */
|
|
26
|
+
key?: (ctx: KeyContext) => string;
|
|
27
|
+
/** Requests per window. */
|
|
28
|
+
limit: number;
|
|
29
|
+
} & ({
|
|
30
|
+
maxKeys?: number;
|
|
31
|
+
store?: never;
|
|
32
|
+
windowMs: number;
|
|
33
|
+
} | {
|
|
34
|
+
maxKeys?: never;
|
|
35
|
+
store: RateLimitStore;
|
|
36
|
+
windowMs?: never;
|
|
37
|
+
});
|
|
38
|
+
export declare function memoryStore(options: MemoryStoreOptions): MemoryStore;
|
|
39
|
+
export declare function rateLimit(options: RateLimitOptions): MiddlewareFn<KeyContext, {}, "too_many_requests">;
|
|
40
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `rateLimit({ limit, windowMs })`: a fixed-window limiter. Each key (default `ctx.ip`, the platform
|
|
3
|
+
* peer, so a forwarded header cannot rotate it) gets `limit` requests per window; past that the
|
|
4
|
+
* answer is 429 `too_many_requests` with `Retry-After`, and the handler never runs. Every answer
|
|
5
|
+
* carries `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset` (epoch seconds).
|
|
6
|
+
*
|
|
7
|
+
* The default store is in-process and per middleware: bounded to `maxKeys` windows, the least
|
|
8
|
+
* recently used evicted first, so a key spray cannot grow it (H18.8). Behind several instances,
|
|
9
|
+
* pass a shared `store`.
|
|
10
|
+
*/
|
|
11
|
+
import { HoneyError } from "../errors/error.js";
|
|
12
|
+
import { withHeaders } from "../response/with-headers.js";
|
|
13
|
+
import { namedMiddleware } from "./middleware.js";
|
|
14
|
+
class WindowStore {
|
|
15
|
+
#maxKeys;
|
|
16
|
+
#windowMs;
|
|
17
|
+
/* insertion order is recency: a hit re-inserts its key last, so the first key is the LRU */
|
|
18
|
+
#windows = new Map();
|
|
19
|
+
constructor(windowMs, maxKeys) {
|
|
20
|
+
this.#windowMs = windowMs;
|
|
21
|
+
this.#maxKeys = maxKeys;
|
|
22
|
+
}
|
|
23
|
+
get size() {
|
|
24
|
+
return this.#windows.size;
|
|
25
|
+
}
|
|
26
|
+
hit(key) {
|
|
27
|
+
const windows = this.#windows;
|
|
28
|
+
const now = Date.now();
|
|
29
|
+
const current = windows.get(key);
|
|
30
|
+
if (current !== undefined)
|
|
31
|
+
windows.delete(key);
|
|
32
|
+
else if (windows.size >= this.#maxKeys)
|
|
33
|
+
windows.delete(windows.keys().next().value);
|
|
34
|
+
const hit = current !== undefined && current.resetAt > now
|
|
35
|
+
? { count: current.count + 1, resetAt: current.resetAt }
|
|
36
|
+
: { count: 1, resetAt: now + this.#windowMs };
|
|
37
|
+
windows.set(key, hit);
|
|
38
|
+
return hit;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function memoryStore(options) {
|
|
42
|
+
const { maxKeys = 10_000, windowMs } = options;
|
|
43
|
+
if (!(Number.isFinite(windowMs) && windowMs > 0)) {
|
|
44
|
+
throw new TypeError("rateLimit: windowMs must be a positive finite number");
|
|
45
|
+
}
|
|
46
|
+
if (!(Number.isInteger(maxKeys) && maxKeys > 0))
|
|
47
|
+
throw new TypeError("rateLimit: maxKeys must be a positive integer");
|
|
48
|
+
return new WindowStore(windowMs, maxKeys);
|
|
49
|
+
}
|
|
50
|
+
function peerKey(ctx) {
|
|
51
|
+
return ctx.ip ?? "";
|
|
52
|
+
}
|
|
53
|
+
export function rateLimit(options) {
|
|
54
|
+
const { limit } = options;
|
|
55
|
+
if (!(Number.isInteger(limit) && limit > 0))
|
|
56
|
+
throw new TypeError("rateLimit: limit must be a positive integer");
|
|
57
|
+
const store = options.store ?? memoryStore(options);
|
|
58
|
+
const keyOf = options.key ?? peerKey;
|
|
59
|
+
const limitText = String(limit);
|
|
60
|
+
/** The answer for a counted request: 429 past the limit, else the chain's with the headers. */
|
|
61
|
+
const answer = async (hit, next) => {
|
|
62
|
+
const remaining = String(Math.max(0, limit - hit.count));
|
|
63
|
+
const reset = String(Math.ceil(hit.resetAt / 1000));
|
|
64
|
+
if (hit.count > limit) {
|
|
65
|
+
const retryAfter = String(Math.max(0, Math.ceil((hit.resetAt - Date.now()) / 1000)));
|
|
66
|
+
throw new HoneyError({
|
|
67
|
+
errorKey: "too_many_requests",
|
|
68
|
+
headers: {
|
|
69
|
+
"retry-after": retryAfter,
|
|
70
|
+
"x-ratelimit-limit": limitText,
|
|
71
|
+
"x-ratelimit-remaining": remaining,
|
|
72
|
+
"x-ratelimit-reset": reset,
|
|
73
|
+
},
|
|
74
|
+
status: "too_many_requests",
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return withHeaders(await next(), (out) => {
|
|
78
|
+
out.set("x-ratelimit-limit", limitText);
|
|
79
|
+
out.set("x-ratelimit-remaining", remaining);
|
|
80
|
+
out.set("x-ratelimit-reset", reset);
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
/* a sync store (the memory default) is answered without an extra await */
|
|
84
|
+
const mw = (ctx, next) => {
|
|
85
|
+
const hit = store.hit(keyOf(ctx));
|
|
86
|
+
return hit instanceof Promise ? hit.then((counted) => answer(counted, next)) : answer(hit, next);
|
|
87
|
+
};
|
|
88
|
+
mw.errors = ["too_many_requests"];
|
|
89
|
+
return namedMiddleware("rateLimit", mw);
|
|
90
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type MiddlewareFn } from "./middleware.ts";
|
|
2
|
+
/**
|
|
3
|
+
* May the hop that sent this request decide a value it carries (a request id, a trace)? `false`
|
|
4
|
+
* (the default) never; `true` always; a function decides per request.
|
|
5
|
+
*/
|
|
6
|
+
export type InboundTrust = boolean | ((ctx: {
|
|
7
|
+
readonly ip: string | null;
|
|
8
|
+
readonly req: Request;
|
|
9
|
+
}) => boolean);
|
|
10
|
+
export type RequestIdOptions = {
|
|
11
|
+
/** Default `crypto.randomUUID()`. */
|
|
12
|
+
generate?: () => string;
|
|
13
|
+
/** Default `x-request-id`. */
|
|
14
|
+
header?: string;
|
|
15
|
+
/** Reuse a valid inbound id when the hop is trusted. Default `false`: always a fresh id. */
|
|
16
|
+
trustInbound?: InboundTrust;
|
|
17
|
+
/** Which inbound ids are safe to reuse. Default: 1–128 of `A-Z a-z 0-9 . _ : + / = -` (UUIDs, ULIDs, base64, trace ids). */
|
|
18
|
+
validate?: (id: string) => boolean;
|
|
19
|
+
};
|
|
20
|
+
export declare function requestId(options?: RequestIdOptions): MiddlewareFn<{
|
|
21
|
+
readonly ip: string | null;
|
|
22
|
+
readonly req: Request;
|
|
23
|
+
}, {
|
|
24
|
+
requestId: string;
|
|
25
|
+
}>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `requestId(options)`: one id per request, on `ctx.requestId`, echoed on the answer (errors
|
|
3
|
+
* included), and bound into `ctx.log` and the request log. An inbound id is never trusted by
|
|
4
|
+
* default: a client could pick it. `trustInbound` opts in, always or per request (a gateway's peer,
|
|
5
|
+
* a shared secret), and the id must still pass `validate` (H23: trust is plain code, never a
|
|
6
|
+
* proxy count). With telemetry on, the id is the root span's `honey.request_id`.
|
|
7
|
+
*/
|
|
8
|
+
import { TRACE } from "../context/context.js";
|
|
9
|
+
import { withHeaders } from "../response/with-headers.js";
|
|
10
|
+
import { namedMiddleware } from "./middleware.js";
|
|
11
|
+
const SAFE_ID = /^[\w.:+/=-]{1,128}$/;
|
|
12
|
+
function safeId(id) {
|
|
13
|
+
return SAFE_ID.test(id);
|
|
14
|
+
}
|
|
15
|
+
function freshId() {
|
|
16
|
+
return crypto.randomUUID();
|
|
17
|
+
}
|
|
18
|
+
export function requestId(options = {}) {
|
|
19
|
+
const header = options.header ?? "x-request-id";
|
|
20
|
+
const generate = options.generate ?? freshId;
|
|
21
|
+
const validate = options.validate ?? safeId;
|
|
22
|
+
const trust = options.trustInbound ?? false;
|
|
23
|
+
return namedMiddleware("requestId", async (ctx, next) => {
|
|
24
|
+
const inbound = trust === false ? null : ctx.req.headers.get(header);
|
|
25
|
+
const reused = inbound !== null && validate(inbound) && (typeof trust === "function" ? trust(ctx) : trust);
|
|
26
|
+
const id = reused ? inbound : generate();
|
|
27
|
+
ctx[TRACE]?.annotate("honey.request_id", id);
|
|
28
|
+
return withHeaders(await next({ requestId: id }), (headers) => headers.set(header, id));
|
|
29
|
+
});
|
|
30
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type MiddlewareFn } from "./middleware.ts";
|
|
2
|
+
export type SecureHeadersOptions = {
|
|
3
|
+
contentSecurityPolicy?: string;
|
|
4
|
+
crossOriginEmbedderPolicy?: string;
|
|
5
|
+
crossOriginOpenerPolicy?: string;
|
|
6
|
+
crossOriginResourcePolicy?: string;
|
|
7
|
+
permissionsPolicy?: string;
|
|
8
|
+
/** Default `strict-origin-when-cross-origin`; `false` leaves it out. */
|
|
9
|
+
referrerPolicy?: false | string;
|
|
10
|
+
strictTransportSecurity?: string;
|
|
11
|
+
/** Default `nosniff`; `false` leaves it out. */
|
|
12
|
+
xContentTypeOptions?: false | string;
|
|
13
|
+
/** Default `SAMEORIGIN`; `false` leaves it out. */
|
|
14
|
+
xFrameOptions?: false | string;
|
|
15
|
+
/** Default `0` (the legacy auditor off); `false` leaves it out. */
|
|
16
|
+
xXssProtection?: false | string;
|
|
17
|
+
};
|
|
18
|
+
export declare function secureHeaders(options?: SecureHeadersOptions): MiddlewareFn<{}>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `secureHeaders(options)`: the browser security headers every answer should carry. The defaults
|
|
3
|
+
* (nosniff, SAMEORIGIN, a strict referrer policy, the legacy XSS auditor off) are on unless set to
|
|
4
|
+
* `false`; CSP, HSTS, permissions and the cross-origin policies are set only when configured. A
|
|
5
|
+
* header the handler set itself wins: an app-wide default never loosens a stricter route.
|
|
6
|
+
*/
|
|
7
|
+
import { withHeaders } from "../response/with-headers.js";
|
|
8
|
+
import { namedMiddleware } from "./middleware.js";
|
|
9
|
+
/** A default header's value: `false` leaves it out, unset takes the default. */
|
|
10
|
+
function withDefault(value, fallback) {
|
|
11
|
+
return value === false ? null : (value ?? fallback);
|
|
12
|
+
}
|
|
13
|
+
/** The headers `options` asks for, computed once. */
|
|
14
|
+
function headersFor(options) {
|
|
15
|
+
const entries = [
|
|
16
|
+
["x-content-type-options", withDefault(options.xContentTypeOptions, "nosniff")],
|
|
17
|
+
["x-frame-options", withDefault(options.xFrameOptions, "SAMEORIGIN")],
|
|
18
|
+
["referrer-policy", withDefault(options.referrerPolicy, "strict-origin-when-cross-origin")],
|
|
19
|
+
["x-xss-protection", withDefault(options.xXssProtection, "0")],
|
|
20
|
+
["content-security-policy", options.contentSecurityPolicy],
|
|
21
|
+
["strict-transport-security", options.strictTransportSecurity],
|
|
22
|
+
["permissions-policy", options.permissionsPolicy],
|
|
23
|
+
["cross-origin-opener-policy", options.crossOriginOpenerPolicy],
|
|
24
|
+
["cross-origin-resource-policy", options.crossOriginResourcePolicy],
|
|
25
|
+
["cross-origin-embedder-policy", options.crossOriginEmbedderPolicy],
|
|
26
|
+
];
|
|
27
|
+
return entries.filter((entry) => typeof entry[1] === "string" && entry[1] !== "");
|
|
28
|
+
}
|
|
29
|
+
export function secureHeaders(options = {}) {
|
|
30
|
+
const headers = headersFor(options);
|
|
31
|
+
return namedMiddleware("secureHeaders", async (_ctx, next) => withHeaders(await next(), (out) => {
|
|
32
|
+
for (const [name, value] of headers)
|
|
33
|
+
if (!out.has(name))
|
|
34
|
+
out.set(name, value);
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `serverTiming()`: `ctx.timing.start(name, description?)` and `end(name)` time the work a request
|
|
3
|
+
* does, and the answer carries them as `Server-Timing`, a `total` last. A timing left open closes at
|
|
4
|
+
* the answer; an `end` with no `start` is ignored. Names become tokens and descriptions quoted
|
|
5
|
+
* strings, so no value can break the header. A `Server-Timing` set below (a handler, an upstream) is
|
|
6
|
+
* kept, with these added after it.
|
|
7
|
+
*/
|
|
8
|
+
import { withHeaders } from "../response/with-headers.js";
|
|
9
|
+
import { namedMiddleware } from "./middleware.js";
|
|
10
|
+
/* metric names are RFC 9110 tokens; anything else becomes `_` */
|
|
11
|
+
const NON_TOKEN = /[^!#$%&'*+.^`|~\w-]/g;
|
|
12
|
+
/* descriptions are quoted strings: latin1 only, no controls, `\` and `"` escaped */
|
|
13
|
+
const NON_QUOTABLE = /[^\t\x20-\x7e\x80-\xff]/g;
|
|
14
|
+
function tokenOf(name) {
|
|
15
|
+
return name.replace(NON_TOKEN, "_") || "_";
|
|
16
|
+
}
|
|
17
|
+
function quoted(description) {
|
|
18
|
+
return `"${description.replace(NON_QUOTABLE, "?").replace(/[\\"]/g, "\\$&")}"`;
|
|
19
|
+
}
|
|
20
|
+
/** The header value: each timing, then the total since `started`, all closed at `now`. */
|
|
21
|
+
function metrics(entries, started, now) {
|
|
22
|
+
const parts = [];
|
|
23
|
+
for (const [name, entry] of entries) {
|
|
24
|
+
const desc = entry.description ? `;desc=${quoted(entry.description)}` : "";
|
|
25
|
+
parts.push(`${tokenOf(name)}${desc};dur=${((entry.end ?? now) - entry.start).toFixed(2)}`);
|
|
26
|
+
}
|
|
27
|
+
parts.push(`total;dur=${(now - started).toFixed(2)}`);
|
|
28
|
+
return parts.join(", ");
|
|
29
|
+
}
|
|
30
|
+
export function serverTiming() {
|
|
31
|
+
return namedMiddleware("serverTiming", async (_ctx, next) => {
|
|
32
|
+
const started = performance.now();
|
|
33
|
+
const entries = new Map();
|
|
34
|
+
const timing = {
|
|
35
|
+
end(name) {
|
|
36
|
+
const entry = entries.get(name);
|
|
37
|
+
if (entry)
|
|
38
|
+
entry.end = performance.now();
|
|
39
|
+
},
|
|
40
|
+
start(name, description) {
|
|
41
|
+
entries.set(name, { description, end: undefined, start: performance.now() });
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
const response = await next({ timing });
|
|
45
|
+
const value = metrics(entries, started, performance.now());
|
|
46
|
+
/* get-then-set, not append: append would build native Headers on the plain path */
|
|
47
|
+
return withHeaders(response, (headers) => {
|
|
48
|
+
const upstream = headers.get("server-timing");
|
|
49
|
+
headers.set("server-timing", upstream ? `${upstream}, ${value}` : value);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type MiddlewareFn } from "./middleware.ts";
|
|
2
|
+
export type TimeoutOptions = {
|
|
3
|
+
/** Milliseconds the chain below may take; 0 answers anything that waits a turn. */
|
|
4
|
+
duration: number;
|
|
5
|
+
};
|
|
6
|
+
export declare function timeout(options: TimeoutOptions): MiddlewareFn<{}, {}, "request_timeout">;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `timeout({ duration })`: answer 504 `request_timeout` when the rest of the chain has not answered
|
|
3
|
+
* within `duration` ms, and abort `ctx.signal`, so a fetch, query or stream that takes it stops
|
|
4
|
+
* instead of running on after the 504. Work that ignores the signal still runs; its answer is
|
|
5
|
+
* dropped. An answer or an error in time goes through untouched.
|
|
6
|
+
*/
|
|
7
|
+
import { ABORT_CONTEXT } from "../context/context.js";
|
|
8
|
+
import { HoneyError } from "../errors/error.js";
|
|
9
|
+
import { namedMiddleware } from "./middleware.js";
|
|
10
|
+
export function timeout(options) {
|
|
11
|
+
const { duration } = options;
|
|
12
|
+
if (!(Number.isFinite(duration) && duration >= 0)) {
|
|
13
|
+
throw new TypeError("timeout: duration must be a finite number of ms, 0 or more");
|
|
14
|
+
}
|
|
15
|
+
const mw = (ctx, next) => new Promise((resolve, reject) => {
|
|
16
|
+
const timer = setTimeout(() => {
|
|
17
|
+
reject(new HoneyError({ errorKey: "request_timeout", status: "gateway_timeout" }));
|
|
18
|
+
ctx[ABORT_CONTEXT](new DOMException("request timed out", "TimeoutError"));
|
|
19
|
+
}, duration);
|
|
20
|
+
/* next() never rejects: the boundary turns a throw below into its answer. Whichever comes
|
|
21
|
+
* first answers; a late answer is dropped, since the promise has settled */
|
|
22
|
+
void Promise.resolve(next()).then((response) => {
|
|
23
|
+
clearTimeout(timer);
|
|
24
|
+
resolve(response);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
mw.errors = ["request_timeout"];
|
|
28
|
+
return namedMiddleware("timeout", mw);
|
|
29
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type MiddlewareFn } from "../middleware/middleware.ts";
|
|
2
|
+
import type { Logger } from "../telemetry/logger.ts";
|
|
3
|
+
export type BodyOmittedReason = "content-type" | "disabled" | "missing" | "read-error" | "too-large";
|
|
4
|
+
export type CurlLogData = {
|
|
5
|
+
bodyIncluded: boolean;
|
|
6
|
+
bodyOmittedReason: BodyOmittedReason | null;
|
|
7
|
+
curl: string;
|
|
8
|
+
duration: number;
|
|
9
|
+
method: string;
|
|
10
|
+
path: string;
|
|
11
|
+
requestId: string | null;
|
|
12
|
+
status: number;
|
|
13
|
+
};
|
|
14
|
+
/** What `skip` sees: everything known before the command is built. */
|
|
15
|
+
export type CurlSkipData = Pick<CurlLogData, "duration" | "method" | "path" | "requestId" | "status">;
|
|
16
|
+
export type CurlLoggerBodyOptions = {
|
|
17
|
+
/** Content types whose body is logged: an entry ending in `/` takes the whole family. */
|
|
18
|
+
allowContentTypes?: readonly string[];
|
|
19
|
+
/** Default 16 KiB; a longer body is left out, read no further than this. */
|
|
20
|
+
maxBytes?: number;
|
|
21
|
+
};
|
|
22
|
+
type Redact = (name: string, value: string) => string | null;
|
|
23
|
+
export type CurlLoggerOptions = {
|
|
24
|
+
body?: boolean | CurlLoggerBodyOptions;
|
|
25
|
+
/** Take each record instead of the app's logger. */
|
|
26
|
+
log?: ((data: CurlLogData) => void) | undefined;
|
|
27
|
+
/** The value to log for a header, or `null` to leave it out. Default `defaultRedactHeader`. */
|
|
28
|
+
redactHeader?: Redact;
|
|
29
|
+
/** The same for a query parameter. Default `defaultRedactQueryParam`. */
|
|
30
|
+
redactQueryParam?: Redact;
|
|
31
|
+
/** Return true to log nothing for this request; runs before any formatting. */
|
|
32
|
+
skip?: (data: CurlSkipData) => boolean;
|
|
33
|
+
};
|
|
34
|
+
/** The request log's own sensitive headers, masked. */
|
|
35
|
+
export declare function defaultRedactHeader(name: string, value: string): string | null;
|
|
36
|
+
/** Token-, key-, secret- and password-like query parameters, masked. */
|
|
37
|
+
export declare function defaultRedactQueryParam(name: string, value: string): string | null;
|
|
38
|
+
/** The command and the body's fate for one request, outside the middleware. */
|
|
39
|
+
export declare function buildCurlLogData(request: Request, options?: Pick<CurlLoggerOptions, "body" | "redactHeader" | "redactQueryParam">): Promise<Pick<CurlLogData, "bodyIncluded" | "bodyOmittedReason" | "curl">>;
|
|
40
|
+
type CurlCtx = {
|
|
41
|
+
readonly log: Logger;
|
|
42
|
+
readonly path: string;
|
|
43
|
+
readonly req: Request;
|
|
44
|
+
};
|
|
45
|
+
export declare function curlLogger(options?: CurlLoggerOptions): MiddlewareFn<CurlCtx>;
|
|
46
|
+
export {};
|