@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
package/src/client/http.ts
DELETED
|
@@ -1,737 +0,0 @@
|
|
|
1
|
-
import { bindDefaultFetch, parseClientBaseURL } from "./defaults.ts"
|
|
2
|
-
import type { ClientError } from "./error.ts"
|
|
3
|
-
import { clientErrorFor } from "./error.ts"
|
|
4
|
-
import { isJsonMediaType, isTextMediaType, parseMediaType } from "../media-type.ts"
|
|
5
|
-
import { interpolatePath } from "./path.ts"
|
|
6
|
-
import { crossOriginHeaders } from "./redirect-policy.ts"
|
|
7
|
-
import type { SSEEvent } from "./sse.ts"
|
|
8
|
-
import { parseSSEStream } from "./sse.ts"
|
|
9
|
-
|
|
10
|
-
export { interpolatePath } from "./path.ts"
|
|
11
|
-
|
|
12
|
-
export type HeadersContext = {
|
|
13
|
-
method: string
|
|
14
|
-
path: string
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
type HeadersRecord = Record<string, string | undefined>
|
|
18
|
-
|
|
19
|
-
export type HeadersInit = ((ctx: HeadersContext) => HeadersRecord | Promise<HeadersRecord>) | HeadersRecord
|
|
20
|
-
|
|
21
|
-
export type RequestMeta = {
|
|
22
|
-
invalidatedBy: string[]
|
|
23
|
-
isStale: boolean
|
|
24
|
-
selector: string
|
|
25
|
-
seqSnapshot: number
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export type OnRequestContext = {
|
|
29
|
-
body?: BodyInit
|
|
30
|
-
headers: Headers
|
|
31
|
-
invalidatedBy?: string[]
|
|
32
|
-
isStale?: boolean
|
|
33
|
-
method: string
|
|
34
|
-
path: string
|
|
35
|
-
selector?: string
|
|
36
|
-
state: Record<string, unknown>
|
|
37
|
-
url: string
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export type OnResponseContext = {
|
|
41
|
-
invalidatedBy?: string[]
|
|
42
|
-
isRetry: boolean
|
|
43
|
-
isStale?: boolean
|
|
44
|
-
method: string
|
|
45
|
-
path: string
|
|
46
|
-
readonly request: Request
|
|
47
|
-
response: Response
|
|
48
|
-
/**
|
|
49
|
-
* Send the request once more and resolve with the new response, whatever its status. On
|
|
50
|
-
* a request that is itself a retry, it resolves with the current response (one retry max).
|
|
51
|
-
*/
|
|
52
|
-
retry: () => Promise<Response>
|
|
53
|
-
selector?: string
|
|
54
|
-
state: Record<string, unknown>
|
|
55
|
-
url: string
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* - `same-origin` (default): follow redirects that stay on the base URL's origin; a
|
|
60
|
-
* cross-origin redirect is returned unfollowed (a non-2xx result). In browsers, which hide
|
|
61
|
-
* redirect targets from script, the platform follows and applies CORS to the target.
|
|
62
|
-
* - `follow`: also follow cross-origin redirects. Such a hop carries only `Accept`,
|
|
63
|
-
* `Accept-Language` and `User-Agent` (no credentials, auth header, configured, per-call or
|
|
64
|
-
* `onRequest` header) and never replays a body.
|
|
65
|
-
* - `manual` / `error`: passed to `fetch`.
|
|
66
|
-
*/
|
|
67
|
-
export type RedirectPolicy = "error" | "follow" | "manual" | "same-origin"
|
|
68
|
-
|
|
69
|
-
export type AuthExpiredContext = {
|
|
70
|
-
/** The token the 401 rejected (read from the auth header), so concurrent 401s can share one refresh. */
|
|
71
|
-
rejectedToken: string | null
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
export type ClientConfig = {
|
|
75
|
-
/** Header that carries the token from `onAuthExpired`. Default `Authorization`. */
|
|
76
|
-
authHeaderName?: string
|
|
77
|
-
/** Prefix for that header. Default `"Bearer "`. */
|
|
78
|
-
authHeaderPrefix?: string
|
|
79
|
-
/** Absolute `http(s):` / `ws(s):` URL, or a same-origin path such as `"/api"`. */
|
|
80
|
-
baseURL: string
|
|
81
|
-
buildSearchParams?: (query: Record<string, unknown>) => URLSearchParams
|
|
82
|
-
credentials?: RequestCredentials
|
|
83
|
-
/** Defaults to the environment `fetch`, bound so it is safe to call in browsers. */
|
|
84
|
-
fetch?: typeof fetch
|
|
85
|
-
headers?: HeadersInit
|
|
86
|
-
mode?: RequestMode
|
|
87
|
-
/**
|
|
88
|
-
* Called on a 401. Return a fresh token to retry the request once with it (and use it for
|
|
89
|
-
* later requests); return null or "" to give up. Concurrent 401s share one call. Requests
|
|
90
|
-
* whose body is a stream are not retried.
|
|
91
|
-
*/
|
|
92
|
-
onAuthExpired?: (ctx: AuthExpiredContext) => Promise<string | null | undefined> | string | null | undefined
|
|
93
|
-
onRequest?: Array<(ctx: OnRequestContext) => Promise<void> | void>
|
|
94
|
-
onResponse?: Array<(ctx: OnResponseContext) => Promise<Response | undefined> | Response | undefined>
|
|
95
|
-
/** Redirect handling; see `RedirectPolicy`. Default `"same-origin"`. */
|
|
96
|
-
redirect?: RedirectPolicy
|
|
97
|
-
/** Send an `x-request-id` header on every request. Default `true`; `false` avoids a CORS preflight. */
|
|
98
|
-
requestId?: boolean
|
|
99
|
-
sortSearchParams?: boolean
|
|
100
|
-
state?: Record<string, unknown>
|
|
101
|
-
throwOnError?: boolean
|
|
102
|
-
/** Milliseconds for a whole request, including reading the body. Streams are exempt. */
|
|
103
|
-
timeout?: number
|
|
104
|
-
|
|
105
|
-
/* Realtime hooks — called by the generated runtime module */
|
|
106
|
-
onReconnecting?: (attempt: number, transport: string) => void
|
|
107
|
-
onReconnected?: () => void
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export type RequestOptions = {
|
|
111
|
-
cookies?: Record<string, string>
|
|
112
|
-
form?: Record<string, unknown>
|
|
113
|
-
headers?: Record<string, string | undefined>
|
|
114
|
-
json?: unknown
|
|
115
|
-
lastEventId?: string
|
|
116
|
-
params?: Record<string, string>
|
|
117
|
-
search?: Record<string, unknown>
|
|
118
|
-
signal?: AbortSignal
|
|
119
|
-
/** Per-call timeout in milliseconds; overrides `config.timeout`, `0` disables it. */
|
|
120
|
-
timeout?: number
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
type Kind = "auto" | "rest" | "stream"
|
|
124
|
-
|
|
125
|
-
type Sent = {
|
|
126
|
-
/** Release timers and listeners. Call once the body has been read or abandoned. */
|
|
127
|
-
done: () => void
|
|
128
|
-
/** Stop the timeout but keep user cancellation (the response turned out to be a stream). */
|
|
129
|
-
exemptFromTimeout: () => void
|
|
130
|
-
response: Response
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
function coerceParam(v: unknown): string | null {
|
|
134
|
-
if (v === undefined || v === null) return null
|
|
135
|
-
if (v instanceof Date) return v.toISOString()
|
|
136
|
-
if (typeof v === "symbol") return null
|
|
137
|
-
return String(v)
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
function coerceFormValue(key: string, v: unknown): string | null {
|
|
141
|
-
if (v !== null && typeof v === "object" && !(v instanceof Date)) {
|
|
142
|
-
throw new TypeError(
|
|
143
|
-
`Form field ${JSON.stringify(key)}: nested objects cannot be form-encoded; pass a string (e.g. JSON.stringify) or use json`,
|
|
144
|
-
)
|
|
145
|
-
}
|
|
146
|
-
return coerceParam(v)
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
function defaultSearchParams(query: Record<string, unknown>): URLSearchParams {
|
|
150
|
-
const params = new URLSearchParams()
|
|
151
|
-
for (const [k, v] of Object.entries(query)) {
|
|
152
|
-
if (v === undefined || v === null) continue
|
|
153
|
-
if (Array.isArray(v)) {
|
|
154
|
-
for (const item of v) {
|
|
155
|
-
const s = coerceParam(item)
|
|
156
|
-
if (s !== null) params.append(k, s)
|
|
157
|
-
}
|
|
158
|
-
} else {
|
|
159
|
-
const s = coerceParam(v)
|
|
160
|
-
if (s !== null) params.set(k, s)
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
return params
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* RFC 4122 §4.4 UUID for `x-request-id`. Prefer `crypto.randomUUID` (browser,
|
|
168
|
-
* Node 19+, Bun, Deno, CF Workers). Fall back to `getRandomValues` when
|
|
169
|
-
* `randomUUID` is missing so older runtimes still work without node:crypto.
|
|
170
|
-
*/
|
|
171
|
-
export function newClientRequestId(): string {
|
|
172
|
-
const c = globalThis.crypto as Crypto | undefined
|
|
173
|
-
if (c && typeof c.randomUUID === "function") return c.randomUUID()
|
|
174
|
-
if (c && typeof c.getRandomValues === "function") {
|
|
175
|
-
const bytes = new Uint8Array(16)
|
|
176
|
-
c.getRandomValues(bytes)
|
|
177
|
-
bytes[6] = (bytes[6]! & 0x0f) | 0x40
|
|
178
|
-
bytes[8] = (bytes[8]! & 0x3f) | 0x80
|
|
179
|
-
let out = ""
|
|
180
|
-
for (let i = 0; i < 16; i++) {
|
|
181
|
-
if (i === 4 || i === 6 || i === 8 || i === 10) out += "-"
|
|
182
|
-
out += bytes[i]!.toString(16).padStart(2, "0")
|
|
183
|
-
}
|
|
184
|
-
return out
|
|
185
|
-
}
|
|
186
|
-
throw new Error("honey: no crypto.randomUUID or crypto.getRandomValues in this runtime")
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
function isFileLike(v: unknown): boolean {
|
|
190
|
-
return (typeof File !== "undefined" && v instanceof File) || (typeof Blob !== "undefined" && v instanceof Blob)
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
function encodeBody(opts: RequestOptions, headers: Headers): BodyInit | undefined {
|
|
194
|
-
if (opts.json !== undefined) {
|
|
195
|
-
headers.set("content-type", "application/json")
|
|
196
|
-
return JSON.stringify(opts.json)
|
|
197
|
-
}
|
|
198
|
-
if (opts.form === undefined) return undefined
|
|
199
|
-
|
|
200
|
-
const entries = Object.entries(opts.form)
|
|
201
|
-
const hasFiles = entries.some(
|
|
202
|
-
([, v]) =>
|
|
203
|
-
isFileLike(v) ||
|
|
204
|
-
(typeof FileList !== "undefined" && v instanceof FileList) ||
|
|
205
|
-
(Array.isArray(v) && v.some(isFileLike)),
|
|
206
|
-
)
|
|
207
|
-
|
|
208
|
-
/* Both encodings repeat the key for array items, so a field reads the same either way. */
|
|
209
|
-
if (hasFiles) {
|
|
210
|
-
const fd = new FormData()
|
|
211
|
-
for (const [k, v] of entries) {
|
|
212
|
-
if (v === undefined || v === null) continue
|
|
213
|
-
const items =
|
|
214
|
-
typeof FileList !== "undefined" && v instanceof FileList ? Array.from(v) : Array.isArray(v) ? v : [v]
|
|
215
|
-
for (const item of items) {
|
|
216
|
-
if (isFileLike(item)) fd.append(k, item as Blob)
|
|
217
|
-
else {
|
|
218
|
-
const s = coerceFormValue(k, item)
|
|
219
|
-
if (s !== null) fd.append(k, s)
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
/* don't set content-type — fetch sets the multipart boundary */
|
|
224
|
-
return fd
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
headers.set("content-type", "application/x-www-form-urlencoded")
|
|
228
|
-
const params = new URLSearchParams()
|
|
229
|
-
for (const [k, v] of entries) {
|
|
230
|
-
for (const item of Array.isArray(v) ? v : [v]) {
|
|
231
|
-
const s = coerceFormValue(k, item)
|
|
232
|
-
if (s !== null) params.append(k, s)
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
return params.toString()
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
/** A body that can be sent a second time (retry, redirect). Streams are consumed by the first send. */
|
|
239
|
-
function isReplayable(body: BodyInit | null | undefined): boolean {
|
|
240
|
-
return !(typeof ReadableStream !== "undefined" && body instanceof ReadableStream)
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
export function isEventStream(response: Response): boolean {
|
|
244
|
-
return parseMediaType(response.headers.get("content-type"))?.essence === "text/event-stream"
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
/* oxlint-disable-next-line no-control-regex -- intentional strip of ASCII control characters */
|
|
248
|
-
const CONTROL_RE = /[\x00-\x1f\x7f]/g
|
|
249
|
-
|
|
250
|
-
function sanitizeMessage(message: string): string {
|
|
251
|
-
return message.replace(CONTROL_RE, "").slice(0, 512)
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
/** Read an error body: JSON when it parses, else the text, else null. Never throws on the body. */
|
|
255
|
-
async function readErrorBody(response: Response): Promise<unknown> {
|
|
256
|
-
let text: string
|
|
257
|
-
try {
|
|
258
|
-
text = await response.text()
|
|
259
|
-
} catch {
|
|
260
|
-
return null
|
|
261
|
-
}
|
|
262
|
-
if (text.length === 0) return null
|
|
263
|
-
try {
|
|
264
|
-
return JSON.parse(text)
|
|
265
|
-
} catch {
|
|
266
|
-
return text
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
async function errorFromResponse(response: Response): Promise<ClientError> {
|
|
271
|
-
const preserved = response.clone()
|
|
272
|
-
const body = await readErrorBody(response)
|
|
273
|
-
const msgVal =
|
|
274
|
-
typeof body === "object" && body !== null && "message" in body
|
|
275
|
-
? (body as Record<string, unknown>).message
|
|
276
|
-
: undefined
|
|
277
|
-
const message = typeof msgVal === "string" && msgVal.length > 0 ? sanitizeMessage(msgVal) : `HTTP ${response.status}`
|
|
278
|
-
return clientErrorFor({ body, message, response: preserved, status: response.status })
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
/**
|
|
282
|
-
* Safe-mode error value: the server's error object when the body is a JSON object, else the
|
|
283
|
-
* `ClientError` itself, so `error` is truthy for every non-2xx and always carries `status`.
|
|
284
|
-
*/
|
|
285
|
-
function safeErrorValue(error: ClientError): unknown {
|
|
286
|
-
const body = error.body
|
|
287
|
-
return typeof body === "object" && body !== null && !Array.isArray(body) ? body : error
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
function timeoutError(ms: number): Error {
|
|
291
|
-
return typeof DOMException === "function"
|
|
292
|
-
? new DOMException(`Request timed out after ${ms} ms`, "TimeoutError")
|
|
293
|
-
: Object.assign(new Error(`Request timed out after ${ms} ms`), { name: "TimeoutError" })
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
/** Browsers hide redirect targets from script (`opaqueredirect`), so the platform must follow. */
|
|
297
|
-
function platformFollowsRedirects(): boolean {
|
|
298
|
-
const g = globalThis as { document?: unknown; WorkerGlobalScope?: unknown }
|
|
299
|
-
return typeof g.document !== "undefined" || typeof g.WorkerGlobalScope !== "undefined"
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308])
|
|
303
|
-
const MAX_REDIRECTS = 20
|
|
304
|
-
|
|
305
|
-
export class HTTPClient {
|
|
306
|
-
private _config: ClientConfig
|
|
307
|
-
private _fetch: typeof fetch
|
|
308
|
-
private _base: URL | undefined
|
|
309
|
-
private _token: string | null = null
|
|
310
|
-
private _refreshing: Promise<string | null> | null = null
|
|
311
|
-
|
|
312
|
-
constructor(config: ClientConfig) {
|
|
313
|
-
this._config = config
|
|
314
|
-
this._fetch = bindDefaultFetch(config.fetch)
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
/** The base URL, parsed once. */
|
|
318
|
-
private get base(): URL {
|
|
319
|
-
this._base ??= parseClientBaseURL(this._config.baseURL)
|
|
320
|
-
return this._base
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
private get authName(): string {
|
|
324
|
-
return this._config.authHeaderName ?? "Authorization"
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
private get authPrefix(): string {
|
|
328
|
-
return this._config.authHeaderPrefix ?? "Bearer "
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
/** Resolve `path` against the base URL, keeping the base path and query, and assert it stays there. */
|
|
332
|
-
private _url(path: string, opts: RequestOptions): URL {
|
|
333
|
-
const resolvedPath = opts.params ? interpolatePath(path, opts.params) : interpolatePath(path)
|
|
334
|
-
const base = this.base
|
|
335
|
-
const basePath = base.pathname.endsWith("/") ? base.pathname : `${base.pathname}/`
|
|
336
|
-
const relative = resolvedPath.startsWith("/") ? resolvedPath.slice(1) : resolvedPath
|
|
337
|
-
const url = new URL(base.href)
|
|
338
|
-
url.pathname = `${basePath}${relative}`
|
|
339
|
-
url.hash = ""
|
|
340
|
-
/* Params are validated, so this only fires on a malformed template; never send it anywhere else. */
|
|
341
|
-
if (url.origin !== base.origin || !url.pathname.startsWith(basePath.slice(0, -1))) {
|
|
342
|
-
throw new Error(`Request path ${JSON.stringify(path)} resolves outside the base URL`)
|
|
343
|
-
}
|
|
344
|
-
if (opts.search) {
|
|
345
|
-
const serializer = this._config.buildSearchParams ?? defaultSearchParams
|
|
346
|
-
const params = serializer(opts.search)
|
|
347
|
-
if (this._config.sortSearchParams) params.sort()
|
|
348
|
-
for (const [k, v] of params.entries()) url.searchParams.append(k, v)
|
|
349
|
-
}
|
|
350
|
-
return url
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
private async _headers(opts: RequestOptions, ctx: HeadersContext): Promise<Headers> {
|
|
354
|
-
const headers = new Headers()
|
|
355
|
-
const config = this._config
|
|
356
|
-
|
|
357
|
-
if (config.headers) {
|
|
358
|
-
const resolved = typeof config.headers === "function" ? await config.headers(ctx) : config.headers
|
|
359
|
-
for (const [k, v] of Object.entries(resolved)) {
|
|
360
|
-
if (v !== undefined) headers.set(k, v)
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
/* a refreshed token replaces the configured one; per-call headers still win */
|
|
365
|
-
if (this._token !== null) headers.set(this.authName, `${this.authPrefix}${this._token}`)
|
|
366
|
-
|
|
367
|
-
if (opts.headers) {
|
|
368
|
-
for (const [k, v] of Object.entries(opts.headers)) {
|
|
369
|
-
if (v !== undefined) headers.set(k, v)
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
if (opts.cookies) {
|
|
374
|
-
const existing = headers.get("cookie")
|
|
375
|
-
const pairs = Object.entries(opts.cookies)
|
|
376
|
-
.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
|
|
377
|
-
.join("; ")
|
|
378
|
-
if (pairs) {
|
|
379
|
-
headers.set("cookie", existing ? `${existing}; ${pairs}` : pairs)
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
/* auto correlation id — config/per-call win; onRequest may overwrite later */
|
|
384
|
-
if (config.requestId !== false && !headers.has("x-request-id")) {
|
|
385
|
-
headers.set("x-request-id", newClientRequestId())
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
return headers
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
/** One combined signal for the user's abort and the timeout, alive until `done()`. */
|
|
392
|
-
private _signal(
|
|
393
|
-
opts: RequestOptions,
|
|
394
|
-
kind: Kind,
|
|
395
|
-
): { done: () => void; exemptFromTimeout: () => void; signal: AbortSignal | undefined } {
|
|
396
|
-
const userSignal = opts.signal
|
|
397
|
-
const timeout = kind === "stream" ? undefined : (opts.timeout ?? this._config.timeout)
|
|
398
|
-
if (!timeout || timeout <= 0) {
|
|
399
|
-
return { done: () => {}, exemptFromTimeout: () => {}, signal: userSignal }
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
const ctrl = new AbortController()
|
|
403
|
-
const timer = setTimeout(() => ctrl.abort(timeoutError(timeout)), timeout)
|
|
404
|
-
;(timer as unknown as { unref?: () => void }).unref?.()
|
|
405
|
-
const onUserAbort = () => ctrl.abort(userSignal?.reason)
|
|
406
|
-
if (userSignal?.aborted) ctrl.abort(userSignal.reason)
|
|
407
|
-
else userSignal?.addEventListener("abort", onUserAbort, { once: true })
|
|
408
|
-
return {
|
|
409
|
-
done: () => {
|
|
410
|
-
clearTimeout(timer)
|
|
411
|
-
userSignal?.removeEventListener("abort", onUserAbort)
|
|
412
|
-
},
|
|
413
|
-
exemptFromTimeout: () => clearTimeout(timer),
|
|
414
|
-
signal: ctrl.signal,
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
/** Share one `onAuthExpired` call between concurrent 401s; reuse a token another request already got. */
|
|
419
|
-
private _refresh(rejectedToken: string | null): Promise<string | null> {
|
|
420
|
-
if (this._token !== null && rejectedToken !== this._token) return Promise.resolve(this._token)
|
|
421
|
-
if (this._refreshing) return this._refreshing
|
|
422
|
-
const hook = this._config.onAuthExpired
|
|
423
|
-
if (!hook) return Promise.resolve(null)
|
|
424
|
-
this._refreshing = Promise.resolve()
|
|
425
|
-
.then(() => hook({ rejectedToken }))
|
|
426
|
-
.then((token) => {
|
|
427
|
-
this._token = typeof token === "string" && token.length > 0 ? token : null
|
|
428
|
-
return this._token
|
|
429
|
-
})
|
|
430
|
-
.finally(() => {
|
|
431
|
-
this._refreshing = null
|
|
432
|
-
})
|
|
433
|
-
return this._refreshing
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
private async _fetchWithRedirects(url: URL, init: RequestInit): Promise<Response> {
|
|
437
|
-
const policy = this._config.redirect ?? "same-origin"
|
|
438
|
-
if (policy === "manual" || policy === "error" || platformFollowsRedirects()) {
|
|
439
|
-
return this._fetch(url.toString(), policy === "same-origin" ? init : { ...init, redirect: policy })
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
const origin = this.base.origin
|
|
443
|
-
let current = url
|
|
444
|
-
let currentInit: RequestInit = { ...init, redirect: "manual" }
|
|
445
|
-
for (let hop = 0; ; hop++) {
|
|
446
|
-
const response = await this._fetch(current.toString(), currentInit)
|
|
447
|
-
const location = response.headers.get("location")
|
|
448
|
-
if (!REDIRECT_STATUSES.has(response.status) || location === null || hop >= MAX_REDIRECTS) return response
|
|
449
|
-
|
|
450
|
-
let target: URL
|
|
451
|
-
try {
|
|
452
|
-
target = new URL(location, current)
|
|
453
|
-
} catch {
|
|
454
|
-
return response
|
|
455
|
-
}
|
|
456
|
-
if (target.protocol !== "http:" && target.protocol !== "https:") return response
|
|
457
|
-
const crossOrigin = target.origin !== origin
|
|
458
|
-
if (crossOrigin && policy !== "follow") return response
|
|
459
|
-
|
|
460
|
-
const nextInit: RequestInit = { ...currentInit, headers: new Headers(currentInit.headers) }
|
|
461
|
-
const keepsBody = response.status === 307 || response.status === 308
|
|
462
|
-
if (keepsBody) {
|
|
463
|
-
if (currentInit.body != null && (crossOrigin || !isReplayable(currentInit.body))) return response
|
|
464
|
-
} else {
|
|
465
|
-
/* 303, and 301/302 for POST: the browser behavior is GET without a body */
|
|
466
|
-
const method = (currentInit.method ?? "GET").toUpperCase()
|
|
467
|
-
if (response.status === 303 ? method !== "HEAD" : method === "POST") {
|
|
468
|
-
nextInit.method = "GET"
|
|
469
|
-
nextInit.body = undefined
|
|
470
|
-
;(nextInit.headers as Headers).delete("content-type")
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
if (crossOrigin) nextInit.headers = crossOriginHeaders(nextInit.headers as Headers)
|
|
474
|
-
await response.body?.cancel().catch(() => {})
|
|
475
|
-
current = target
|
|
476
|
-
currentInit = nextInit
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
/** Build, send and post-process one request: hooks, auth refresh, redirects. */
|
|
481
|
-
private async _send(
|
|
482
|
-
method: string,
|
|
483
|
-
path: string,
|
|
484
|
-
opts: RequestOptions,
|
|
485
|
-
kind: Kind,
|
|
486
|
-
meta?: RequestMeta,
|
|
487
|
-
isRetry = false,
|
|
488
|
-
): Promise<Sent> {
|
|
489
|
-
const url = this._url(path, opts)
|
|
490
|
-
const headers = await this._headers(opts, { method, path })
|
|
491
|
-
if (kind === "stream") {
|
|
492
|
-
headers.set("accept", "text/event-stream")
|
|
493
|
-
if (opts.lastEventId) headers.set("last-event-id", opts.lastEventId)
|
|
494
|
-
}
|
|
495
|
-
let body = encodeBody(opts, headers)
|
|
496
|
-
|
|
497
|
-
if (this._config.onRequest) {
|
|
498
|
-
const reqCtx: OnRequestContext = {
|
|
499
|
-
body,
|
|
500
|
-
headers,
|
|
501
|
-
method,
|
|
502
|
-
path,
|
|
503
|
-
state: this._config.state ?? {},
|
|
504
|
-
url: url.toString(),
|
|
505
|
-
}
|
|
506
|
-
if (meta) {
|
|
507
|
-
reqCtx.invalidatedBy = meta.invalidatedBy
|
|
508
|
-
reqCtx.isStale = meta.isStale
|
|
509
|
-
reqCtx.selector = meta.selector
|
|
510
|
-
}
|
|
511
|
-
for (const hook of this._config.onRequest) {
|
|
512
|
-
await hook(reqCtx)
|
|
513
|
-
}
|
|
514
|
-
body = reqCtx.body
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
const { signal, done, exemptFromTimeout } = this._signal(opts, kind)
|
|
518
|
-
const cleanups: Array<() => void> = [done]
|
|
519
|
-
const finish = () => {
|
|
520
|
-
for (const fn of cleanups.splice(0)) fn()
|
|
521
|
-
}
|
|
522
|
-
const init: RequestInit = { body, headers, method, signal }
|
|
523
|
-
if (this._config.credentials) init.credentials = this._config.credentials
|
|
524
|
-
if (this._config.mode) init.mode = this._config.mode
|
|
525
|
-
/* a stream body needs half-duplex on Node's fetch */
|
|
526
|
-
if (body !== undefined && !isReplayable(body)) (init as RequestInit & { duplex?: string }).duplex = "half"
|
|
527
|
-
|
|
528
|
-
try {
|
|
529
|
-
signal?.throwIfAborted()
|
|
530
|
-
let response = await this._fetchWithRedirects(url, init)
|
|
531
|
-
|
|
532
|
-
if (response.status === 401 && this._config.onAuthExpired && !isRetry && isReplayable(body)) {
|
|
533
|
-
const sent = headers.get(this.authName)
|
|
534
|
-
const rejectedToken = sent?.startsWith(this.authPrefix) ? sent.slice(this.authPrefix.length) : (sent ?? null)
|
|
535
|
-
const token = await this._refresh(rejectedToken)
|
|
536
|
-
if (token !== null) {
|
|
537
|
-
const retryHeaders = new Headers(headers)
|
|
538
|
-
retryHeaders.set(this.authName, `${this.authPrefix}${token}`)
|
|
539
|
-
init.headers = retryHeaders
|
|
540
|
-
await response.body?.cancel().catch(() => {})
|
|
541
|
-
response = await this._fetchWithRedirects(url, { ...init })
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
if (this._config.onResponse) {
|
|
546
|
-
let request: Request | undefined
|
|
547
|
-
const resCtx: OnResponseContext = {
|
|
548
|
-
isRetry,
|
|
549
|
-
method,
|
|
550
|
-
path,
|
|
551
|
-
get request() {
|
|
552
|
-
/* built on demand: constructing a Request per response is not free */
|
|
553
|
-
request ??= new Request(url.toString(), { ...init, body: isReplayable(body) ? body : undefined })
|
|
554
|
-
return request
|
|
555
|
-
},
|
|
556
|
-
response,
|
|
557
|
-
retry: async () => {
|
|
558
|
-
if (isRetry) return resCtx.response
|
|
559
|
-
const again = await this._send(method, path, opts, kind, meta, true)
|
|
560
|
-
cleanups.push(again.done)
|
|
561
|
-
return again.response
|
|
562
|
-
},
|
|
563
|
-
state: this._config.state ?? {},
|
|
564
|
-
url: url.toString(),
|
|
565
|
-
}
|
|
566
|
-
if (meta) {
|
|
567
|
-
resCtx.invalidatedBy = meta.invalidatedBy
|
|
568
|
-
resCtx.isStale = meta.isStale
|
|
569
|
-
resCtx.selector = meta.selector
|
|
570
|
-
}
|
|
571
|
-
for (const hook of this._config.onResponse) {
|
|
572
|
-
const result = await hook(resCtx)
|
|
573
|
-
if (result instanceof Response) {
|
|
574
|
-
response = result
|
|
575
|
-
resCtx.response = result
|
|
576
|
-
}
|
|
577
|
-
}
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
return { done: finish, exemptFromTimeout, response }
|
|
581
|
-
} catch (e) {
|
|
582
|
-
finish()
|
|
583
|
-
throw e
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
|
|
587
|
-
private async _parseBody(response: Response, method: string): Promise<unknown> {
|
|
588
|
-
if (
|
|
589
|
-
response.status === 204 ||
|
|
590
|
-
response.status === 205 ||
|
|
591
|
-
response.status === 304 ||
|
|
592
|
-
method.toUpperCase() === "HEAD"
|
|
593
|
-
) {
|
|
594
|
-
await response.body?.cancel().catch(() => {})
|
|
595
|
-
return null
|
|
596
|
-
}
|
|
597
|
-
const ct = parseMediaType(response.headers.get("content-type"))
|
|
598
|
-
if (isJsonMediaType(ct)) {
|
|
599
|
-
const text = await response.text()
|
|
600
|
-
if (text.length === 0) return null
|
|
601
|
-
try {
|
|
602
|
-
return JSON.parse(text)
|
|
603
|
-
} catch {
|
|
604
|
-
throw clientErrorFor({
|
|
605
|
-
body: text,
|
|
606
|
-
message: "Response body is not valid JSON",
|
|
607
|
-
response,
|
|
608
|
-
status: response.status,
|
|
609
|
-
})
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
if (isTextMediaType(ct)) return response.text()
|
|
613
|
-
const buffer = await response.arrayBuffer()
|
|
614
|
-
return buffer.byteLength === 0 ? null : buffer
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
/** Read the response of a REST call into a value (throw mode) or a result tuple (safe mode). */
|
|
618
|
-
private async _finish(sent: Sent, method: string, shouldThrow: boolean): Promise<unknown> {
|
|
619
|
-
const { response } = sent
|
|
620
|
-
try {
|
|
621
|
-
if (!response.ok) {
|
|
622
|
-
const error = await errorFromResponse(response)
|
|
623
|
-
if (shouldThrow) throw error
|
|
624
|
-
return { data: null, error: safeErrorValue(error), response: error.response, status: response.status }
|
|
625
|
-
}
|
|
626
|
-
if (shouldThrow) return await this._parseBody(response, method)
|
|
627
|
-
try {
|
|
628
|
-
const data = await this._parseBody(response, method)
|
|
629
|
-
return { data, error: null, response, status: response.status }
|
|
630
|
-
} catch (e) {
|
|
631
|
-
return { data: null, error: e, response, status: response.status }
|
|
632
|
-
}
|
|
633
|
-
} finally {
|
|
634
|
-
sent.done()
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
|
|
638
|
-
private _iterate(sent: Sent): AsyncIterable<SSEEvent> {
|
|
639
|
-
return {
|
|
640
|
-
async *[Symbol.asyncIterator]() {
|
|
641
|
-
try {
|
|
642
|
-
if (!sent.response.body) return
|
|
643
|
-
yield* parseSSEStream(sent.response.body)
|
|
644
|
-
} finally {
|
|
645
|
-
sent.done()
|
|
646
|
-
}
|
|
647
|
-
},
|
|
648
|
-
}
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
/** Throw mode — throws ClientError (a per-status subclass) on non-2xx */
|
|
652
|
-
async request(method: string, path: string, opts: RequestOptions, _requestMeta?: RequestMeta): Promise<unknown> {
|
|
653
|
-
const sent = await this._send(method, path, opts, "rest", _requestMeta)
|
|
654
|
-
return this._finish(sent, method, true)
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
/** Safe mode — returns { data, error, response, status }; `error` is truthy for every non-2xx */
|
|
658
|
-
async requestSafe(
|
|
659
|
-
method: string,
|
|
660
|
-
path: string,
|
|
661
|
-
opts: RequestOptions,
|
|
662
|
-
_requestMeta?: RequestMeta,
|
|
663
|
-
): Promise<{
|
|
664
|
-
data: unknown
|
|
665
|
-
error: unknown
|
|
666
|
-
response: Response
|
|
667
|
-
status: number
|
|
668
|
-
}> {
|
|
669
|
-
const sent = await this._send(method, path, opts, "rest", _requestMeta)
|
|
670
|
-
return this._finish(sent, method, false) as Promise<{
|
|
671
|
-
data: unknown
|
|
672
|
-
error: unknown
|
|
673
|
-
response: Response
|
|
674
|
-
status: number
|
|
675
|
-
}>
|
|
676
|
-
}
|
|
677
|
-
|
|
678
|
-
/**
|
|
679
|
-
* One request whose shape is decided by the response: an event stream becomes an
|
|
680
|
-
* `AsyncIterable<SSEEvent>` (never buffered, exempt from the timeout once headers arrive);
|
|
681
|
-
* anything else is parsed as in `request` / `requestSafe`.
|
|
682
|
-
*/
|
|
683
|
-
async requestAuto(method: string, path: string, opts: RequestOptions, shouldThrow: boolean): Promise<unknown> {
|
|
684
|
-
const sent = await this._send(method, path, opts, "auto")
|
|
685
|
-
if (sent.response.ok && isEventStream(sent.response)) {
|
|
686
|
-
sent.exemptFromTimeout()
|
|
687
|
-
return this._iterate(sent)
|
|
688
|
-
}
|
|
689
|
-
return this._finish(sent, method, shouldThrow)
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
requestStream(method: string, path: string, opts: RequestOptions): AsyncIterable<SSEEvent> {
|
|
693
|
-
return {
|
|
694
|
-
[Symbol.asyncIterator]: () => this._doStream(method, path, opts),
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
|
|
698
|
-
private async *_doStream(
|
|
699
|
-
method: string,
|
|
700
|
-
path: string,
|
|
701
|
-
opts: RequestOptions,
|
|
702
|
-
): AsyncGenerator<SSEEvent, void, undefined> {
|
|
703
|
-
const sent = await this._send(method, path, opts, "stream")
|
|
704
|
-
if (!sent.response.ok) {
|
|
705
|
-
try {
|
|
706
|
-
throw await errorFromResponse(sent.response)
|
|
707
|
-
} finally {
|
|
708
|
-
sent.done()
|
|
709
|
-
}
|
|
710
|
-
}
|
|
711
|
-
yield* this._iterate(sent)
|
|
712
|
-
}
|
|
713
|
-
|
|
714
|
-
buildUrl(path: string, opts: RequestOptions): string {
|
|
715
|
-
return this._url(path, opts).toString()
|
|
716
|
-
}
|
|
717
|
-
|
|
718
|
-
buildPath(path: string, opts: RequestOptions): string {
|
|
719
|
-
const resolved = opts.params ? interpolatePath(path, opts.params) : interpolatePath(path)
|
|
720
|
-
|
|
721
|
-
if (!opts.search) return resolved
|
|
722
|
-
|
|
723
|
-
const serializer = this._config.buildSearchParams ?? defaultSearchParams
|
|
724
|
-
const params = serializer(opts.search)
|
|
725
|
-
if (this._config.sortSearchParams) params.sort()
|
|
726
|
-
|
|
727
|
-
const qs = params.toString()
|
|
728
|
-
return qs ? `${resolved}?${qs}` : resolved
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
buildWSUrl(path: string, opts: RequestOptions): string {
|
|
732
|
-
const url = this._url(path, opts)
|
|
733
|
-
if (url.protocol === "https:") url.protocol = "wss:"
|
|
734
|
-
else if (url.protocol === "http:") url.protocol = "ws:"
|
|
735
|
-
return url.toString()
|
|
736
|
-
}
|
|
737
|
-
}
|