@lovrozagar/honey 0.7.2 → 1.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +36 -1969
- package/bin/honey.js +87 -27
- package/dist/adapters/bun/serve.d.ts +18 -0
- package/dist/adapters/bun/serve.js +89 -0
- package/dist/adapters/fetch-request.d.ts +20 -0
- package/dist/adapters/fetch-request.js +29 -0
- package/dist/adapters/node/headers.d.ts +27 -0
- package/dist/adapters/node/headers.js +86 -0
- package/dist/adapters/node/request.d.ts +16 -0
- package/dist/adapters/node/request.js +214 -0
- package/dist/adapters/node/response.d.ts +11 -0
- package/dist/adapters/node/response.js +126 -0
- package/dist/adapters/node/serve.d.ts +39 -0
- package/dist/adapters/node/serve.js +205 -0
- package/dist/adapters/node/url.d.ts +13 -0
- package/dist/adapters/node/url.js +87 -0
- package/dist/adapters/serve.d.ts +36 -0
- package/dist/adapters/serve.js +52 -0
- package/dist/build/artifacts.d.ts +34 -0
- package/dist/build/artifacts.js +123 -0
- package/dist/build/cli-args.d.ts +30 -0
- package/dist/build/cli-args.js +97 -0
- package/dist/build/cli.d.ts +11 -0
- package/dist/build/cli.js +150 -0
- package/dist/build/config.d.ts +102 -0
- package/dist/build/config.js +89 -0
- package/dist/build/generate.d.ts +19 -0
- package/dist/build/generate.js +80 -0
- package/dist/build/glob.d.ts +8 -0
- package/dist/build/glob.js +97 -0
- package/dist/build/index.d.ts +3 -58
- package/dist/build/index.js +3 -173
- package/dist/build/init.d.ts +3 -0
- package/dist/build/init.js +131 -0
- package/dist/build/loaders.d.ts +33 -0
- package/dist/build/loaders.js +105 -0
- package/dist/build/plugin.d.ts +52 -0
- package/dist/build/plugin.js +146 -0
- package/dist/build/source.d.ts +21 -0
- package/dist/build/source.js +100 -0
- package/dist/build/targets.d.ts +59 -0
- package/dist/build/targets.js +107 -0
- package/dist/context/context.d.ts +111 -0
- package/dist/context/context.js +213 -0
- package/dist/context/cookie-sign.d.ts +38 -0
- package/dist/context/cookie-sign.js +113 -0
- package/dist/context/cookie.d.ts +28 -0
- package/dist/context/cookie.js +142 -0
- package/dist/context/peer.d.ts +34 -0
- package/dist/context/peer.js +190 -0
- package/dist/errors/error.d.ts +60 -0
- package/dist/errors/error.js +84 -0
- package/dist/errors/errors.d.ts +45 -0
- package/dist/errors/errors.js +31 -0
- package/dist/errors/on-error.d.ts +10 -0
- package/dist/errors/on-error.js +204 -0
- package/dist/errors/problem-json.d.ts +14 -0
- package/dist/errors/problem-json.js +58 -0
- package/dist/errors/projector.d.ts +50 -0
- package/dist/errors/projector.js +107 -0
- package/dist/i18n/error-i18n.d.ts +26 -0
- package/dist/i18n/error-i18n.js +77 -0
- package/dist/i18n/i18n.d.ts +21 -0
- package/dist/i18n/i18n.js +40 -0
- package/dist/i18n/icu.d.ts +29 -0
- package/dist/i18n/icu.js +170 -0
- package/dist/i18n/index.d.ts +4 -0
- package/dist/i18n/index.js +3 -0
- package/dist/index.d.ts +30 -744
- package/dist/index.js +12 -2363
- package/dist/input/accepts.d.ts +5 -0
- package/dist/input/accepts.js +105 -0
- package/dist/input/binary.d.ts +20 -0
- package/dist/input/binary.js +40 -0
- package/dist/input/body-kind.d.ts +15 -0
- package/dist/input/body-kind.js +47 -0
- package/dist/input/body-limit.d.ts +21 -0
- package/dist/input/body-limit.js +99 -0
- package/dist/input/cookies.d.ts +7 -0
- package/dist/input/cookies.js +8 -0
- package/dist/input/form.d.ts +10 -0
- package/dist/input/form.js +24 -0
- package/dist/input/headers.d.ts +7 -0
- package/dist/input/headers.js +8 -0
- package/dist/input/input.d.ts +91 -0
- package/dist/input/input.js +88 -0
- package/dist/input/json.d.ts +10 -0
- package/dist/input/json.js +22 -0
- package/dist/input/params.d.ts +7 -0
- package/dist/input/params.js +8 -0
- package/dist/input/query.d.ts +10 -0
- package/dist/input/query.js +17 -0
- package/dist/mcp/mount.d.ts +116 -0
- package/dist/mcp/mount.js +45 -0
- package/dist/mcp/oauth.d.ts +14 -0
- package/dist/mcp/oauth.js +88 -0
- package/dist/mcp/uploads.d.ts +36 -0
- package/dist/mcp/uploads.js +171 -0
- package/dist/mcp/url-files.d.ts +32 -0
- package/dist/mcp/url-files.js +75 -0
- package/dist/meta/meta-spec-apply.d.ts +25 -0
- package/dist/meta/meta-spec-apply.js +83 -0
- package/dist/meta/meta-spec-merge.d.ts +103 -0
- package/dist/meta/meta-spec-merge.js +50 -0
- package/dist/meta/meta-spec-validate.d.ts +61 -0
- package/dist/meta/meta-spec-validate.js +166 -0
- package/dist/meta/meta-spec.d.ts +49 -0
- package/dist/meta/meta-spec.js +197 -0
- package/dist/middleware/compress.d.ts +15 -0
- package/dist/middleware/compress.js +93 -0
- package/dist/middleware/cors.d.ts +18 -0
- package/dist/middleware/cors.js +80 -0
- package/dist/middleware/csrf.d.ts +11 -0
- package/dist/middleware/csrf.js +65 -0
- package/dist/middleware/ip-restrict.d.ts +10 -0
- package/dist/middleware/ip-restrict.js +82 -0
- package/dist/middleware/middleware.d.ts +53 -0
- package/dist/middleware/middleware.js +112 -0
- package/dist/middleware/powered-by.d.ts +6 -0
- package/dist/middleware/powered-by.js +13 -0
- package/dist/middleware/rate-limit.d.ts +40 -0
- package/dist/middleware/rate-limit.js +90 -0
- package/dist/middleware/request-id.d.ts +25 -0
- package/dist/middleware/request-id.js +30 -0
- package/dist/middleware/secure-headers.d.ts +18 -0
- package/dist/middleware/secure-headers.js +36 -0
- package/dist/middleware/server-timing.d.ts +8 -0
- package/dist/middleware/server-timing.js +52 -0
- package/dist/middleware/timeout.d.ts +6 -0
- package/dist/middleware/timeout.js +29 -0
- package/dist/observability/curl-logger.d.ts +46 -0
- package/dist/observability/curl-logger.js +175 -0
- package/dist/observability/request-to-curl.d.ts +17 -0
- package/dist/observability/request-to-curl.js +47 -0
- package/dist/openapi/collect.d.ts +56 -18
- package/dist/openapi/collect.js +109 -23
- package/dist/openapi/components.d.ts +9 -0
- package/dist/openapi/components.js +90 -0
- package/dist/openapi/docs-page.d.ts +20 -18
- package/dist/openapi/docs-page.js +28 -46
- package/dist/openapi/document.d.ts +33 -26
- package/dist/openapi/document.js +21 -776
- package/dist/openapi/extract-schemas.d.ts +11 -0
- package/dist/openapi/extract-schemas.js +31 -0
- package/dist/openapi/generate.d.ts +47 -0
- package/dist/openapi/generate.js +180 -0
- package/dist/openapi/manifest.d.ts +41 -0
- package/dist/openapi/manifest.js +49 -0
- package/dist/openapi/output-keys.d.ts +6 -0
- package/dist/openapi/output-keys.js +24 -0
- package/dist/openapi/paths.d.ts +35 -0
- package/dist/openapi/paths.js +175 -0
- package/dist/openapi/register.d.ts +14 -3
- package/dist/openapi/register.js +13 -20
- package/dist/openapi/responses.d.ts +44 -0
- package/dist/openapi/responses.js +159 -0
- package/dist/openapi/scalar.d.ts +4 -14
- package/dist/openapi/scalar.js +5 -7
- package/dist/openapi/security.d.ts +4 -0
- package/dist/openapi/security.js +25 -0
- package/dist/openapi/serve.d.ts +25 -9
- package/dist/openapi/serve.js +108 -29
- package/dist/openapi/servers.d.ts +19 -0
- package/dist/openapi/servers.js +72 -0
- package/dist/openapi/swagger.d.ts +4 -14
- package/dist/openapi/swagger.js +5 -7
- package/dist/openapi/tags.d.ts +20 -0
- package/dist/openapi/tags.js +20 -0
- package/dist/openapi/webhooks.d.ts +19 -0
- package/dist/openapi/webhooks.js +70 -0
- package/dist/openapi/yaml.d.ts +8 -0
- package/dist/openapi/yaml.js +74 -0
- package/dist/proxy/headers.d.ts +30 -0
- package/dist/proxy/headers.js +86 -0
- package/dist/proxy/proxy.d.ts +39 -0
- package/dist/proxy/proxy.js +103 -0
- package/dist/proxy/upstream.d.ts +30 -0
- package/dist/proxy/upstream.js +116 -0
- package/dist/realtime/bus.d.ts +10 -13
- package/dist/realtime/bus.js +48 -93
- package/dist/realtime/invoke-user.d.ts +36 -0
- package/dist/realtime/invoke-user.js +103 -0
- package/dist/realtime/realtime.d.ts +7 -0
- package/dist/realtime/realtime.js +40 -0
- package/dist/realtime/route.d.ts +33 -27
- package/dist/realtime/route.js +27 -43
- package/dist/realtime/server.d.ts +24 -28
- package/dist/realtime/server.js +202 -225
- package/dist/response/binary.d.ts +18 -0
- package/dist/response/binary.js +10 -0
- package/dist/response/builder.d.ts +73 -0
- package/dist/response/builder.js +214 -0
- package/dist/response/cache-control.d.ts +30 -0
- package/dist/response/cache-control.js +74 -0
- package/dist/response/etag.d.ts +15 -0
- package/dist/response/etag.js +83 -0
- package/dist/response/media-type.d.ts +28 -0
- package/dist/response/media-type.js +97 -0
- package/dist/response/out-headers.d.ts +31 -0
- package/dist/response/out-headers.js +130 -0
- package/dist/response/pretty-json.d.ts +10 -0
- package/dist/response/pretty-json.js +44 -0
- package/dist/response/range.d.ts +19 -0
- package/dist/response/range.js +98 -0
- package/dist/response/response-headers.d.ts +11 -0
- package/dist/response/response-headers.js +21 -0
- package/dist/response/response.d.ts +69 -0
- package/dist/response/response.js +208 -0
- package/dist/response/sse.d.ts +41 -0
- package/dist/response/sse.js +73 -0
- package/dist/response/static.d.ts +20 -0
- package/dist/response/static.js +181 -0
- package/dist/response/status.d.ts +5 -0
- package/dist/response/status.js +68 -0
- package/dist/response/with-headers.d.ts +11 -0
- package/dist/response/with-headers.js +47 -0
- package/dist/routing/app-types.d.ts +181 -0
- package/dist/routing/app-types.js +1 -0
- package/dist/routing/app.d.ts +76 -0
- package/dist/routing/app.js +137 -0
- package/dist/routing/codegen-types.d.ts +17 -0
- package/dist/routing/codegen-types.js +1 -0
- package/dist/routing/delegate.d.ts +9 -0
- package/dist/routing/delegate.js +75 -0
- package/dist/routing/dispatch.d.ts +22 -0
- package/dist/routing/dispatch.js +255 -0
- package/dist/routing/finalize.d.ts +47 -0
- package/dist/routing/finalize.js +169 -0
- package/dist/routing/gateway-tree.d.ts +19 -0
- package/dist/routing/gateway-tree.js +74 -0
- package/dist/routing/invalidate-check.d.ts +58 -0
- package/dist/routing/invalidate-check.js +124 -0
- package/dist/routing/match.d.ts +22 -0
- package/dist/routing/match.js +108 -0
- package/dist/routing/middleware-chain.d.ts +16 -0
- package/dist/routing/middleware-chain.js +41 -0
- package/dist/routing/output-types.d.ts +91 -0
- package/dist/routing/output-types.js +1 -0
- package/dist/routing/pattern.d.ts +55 -0
- package/dist/routing/pattern.js +219 -0
- package/dist/routing/record.d.ts +18 -0
- package/dist/routing/record.js +4 -0
- package/dist/routing/register.d.ts +135 -0
- package/dist/routing/register.js +155 -0
- package/dist/routing/request-path.d.ts +30 -0
- package/dist/routing/request-path.js +173 -0
- package/dist/routing/route-builder.d.ts +160 -0
- package/dist/routing/route-builder.js +86 -0
- package/dist/routing/route-tree.d.ts +18 -0
- package/dist/routing/route-tree.js +91 -0
- package/dist/routing/settings-chain.d.ts +75 -0
- package/dist/routing/settings-chain.js +137 -0
- package/dist/routing/settings.d.ts +90 -0
- package/dist/routing/settings.js +44 -0
- package/dist/routing/tap.d.ts +31 -0
- package/dist/routing/tap.js +77 -0
- package/dist/routing/tree-merge.d.ts +7 -0
- package/dist/routing/tree-merge.js +77 -0
- package/dist/routing/tree.d.ts +85 -0
- package/dist/routing/tree.js +196 -0
- package/dist/routing/types.d.ts +20 -0
- package/dist/routing/types.js +1 -0
- package/dist/routing/ws-builder.d.ts +62 -0
- package/dist/routing/ws-builder.js +109 -0
- package/dist/runtime/detect-runtime.d.ts +16 -0
- package/dist/runtime/detect-runtime.js +11 -0
- package/dist/runtime/optional-peer.d.ts +10 -0
- package/dist/runtime/optional-peer.js +19 -0
- package/dist/schema/arktype.d.ts +7 -0
- package/dist/schema/arktype.js +13 -0
- package/dist/schema/canonicalize.d.ts +8 -0
- package/dist/schema/canonicalize.js +19 -0
- package/dist/schema/effect.d.ts +7 -0
- package/dist/schema/effect.js +4 -0
- package/dist/schema/naming.d.ts +31 -0
- package/dist/schema/naming.js +116 -0
- package/dist/schema/sanitize-spec.d.ts +15 -0
- package/dist/schema/sanitize-spec.js +43 -0
- package/dist/schema/slots.d.ts +15 -0
- package/dist/schema/slots.js +179 -0
- package/dist/schema/to-json-schema.d.ts +34 -0
- package/dist/schema/to-json-schema.js +94 -0
- package/dist/schema/valibot.d.ts +4 -0
- package/dist/schema/valibot.js +153 -0
- package/dist/schema/yup.d.ts +3 -0
- package/dist/schema/yup.js +57 -0
- package/dist/schema/zod.d.ts +6 -0
- package/dist/schema/zod.js +192 -0
- package/dist/security/crypto.d.ts +7 -0
- package/dist/security/crypto.js +30 -0
- package/dist/streaming/producer-stream.d.ts +45 -0
- package/dist/streaming/producer-stream.js +251 -0
- package/dist/telemetry/fields.d.ts +43 -0
- package/dist/telemetry/fields.js +64 -0
- package/dist/telemetry/log-format.d.ts +7 -0
- package/dist/telemetry/log-format.js +43 -0
- package/dist/telemetry/logger.d.ts +44 -0
- package/dist/telemetry/logger.js +122 -0
- package/dist/telemetry/otel-subpath.d.ts +7 -0
- package/dist/telemetry/otel-subpath.js +5 -0
- package/dist/telemetry/otel.d.ts +50 -57
- package/dist/telemetry/otel.js +54 -130
- package/dist/telemetry/request-log.d.ts +22 -0
- package/dist/telemetry/request-log.js +83 -0
- package/dist/telemetry/request-trace.d.ts +123 -0
- package/dist/telemetry/request-trace.js +199 -0
- package/dist/telemetry/span-lifecycle.d.ts +11 -0
- package/dist/telemetry/span-lifecycle.js +114 -0
- package/dist/telemetry/traceparent.d.ts +40 -0
- package/dist/telemetry/traceparent.js +73 -0
- package/dist/testing/testing.d.ts +42 -0
- package/dist/testing/testing.js +101 -0
- package/dist/validation/content-type.d.ts +21 -0
- package/dist/validation/content-type.js +42 -0
- package/dist/validation/standard-schema.d.ts +41 -0
- package/dist/validation/standard-schema.js +5 -0
- package/dist/validation/validate-input.d.ts +45 -0
- package/dist/validation/validate-input.js +174 -0
- package/dist/validation/validate-output.d.ts +34 -0
- package/dist/validation/validate-output.js +107 -0
- package/dist/ws/bun.d.ts +30 -25
- package/dist/ws/bun.js +42 -46
- package/dist/ws/cloudflare.d.ts +6 -75
- package/dist/ws/cloudflare.js +37 -104
- package/dist/ws/contract.d.ts +74 -0
- package/dist/ws/contract.js +83 -0
- package/dist/ws/node.d.ts +12 -21
- package/dist/ws/node.js +103 -151
- package/dist/ws/origin.d.ts +23 -0
- package/dist/ws/origin.js +48 -0
- package/dist/ws/route.d.ts +14 -0
- package/dist/ws/route.js +5 -0
- package/dist/ws/session.d.ts +15 -6
- package/dist/ws/session.js +22 -23
- package/dist/ws/shared.d.ts +23 -33
- package/dist/ws/shared.js +53 -39
- package/package.json +169 -251
- package/dist/accepts.d.ts +0 -12
- package/dist/accepts.d.ts.map +0 -1
- package/dist/accepts.js +0 -126
- package/dist/accepts.js.map +0 -1
- package/dist/body-kind.d.ts +0 -26
- package/dist/body-kind.d.ts.map +0 -1
- package/dist/body-kind.js +0 -70
- package/dist/body-kind.js.map +0 -1
- package/dist/body-limit.d.ts +0 -26
- package/dist/body-limit.d.ts.map +0 -1
- package/dist/body-limit.js +0 -126
- package/dist/body-limit.js.map +0 -1
- package/dist/build/index.d.ts.map +0 -1
- package/dist/build/index.js.map +0 -1
- package/dist/cli-args.d.ts +0 -33
- package/dist/cli-args.d.ts.map +0 -1
- package/dist/cli-args.js +0 -102
- package/dist/cli-args.js.map +0 -1
- package/dist/cli-go/auth.go +0 -26
- package/dist/cli-go/config.go +0 -192
- package/dist/cli-go/errors.go +0 -75
- package/dist/cli-go/multipart.go +0 -79
- package/dist/cli-go/output.go +0 -163
- package/dist/cli-go/root.go +0 -30
- package/dist/cli-go/stream.go +0 -88
- package/dist/cli-go/version.go +0 -5
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -209
- package/dist/cli.js.map +0 -1
- package/dist/client/defaults.d.ts +0 -12
- package/dist/client/defaults.d.ts.map +0 -1
- package/dist/client/defaults.js +0 -48
- package/dist/client/defaults.js.map +0 -1
- package/dist/client/error.d.ts +0 -49
- package/dist/client/error.d.ts.map +0 -1
- package/dist/client/error.js +0 -71
- package/dist/client/error.js.map +0 -1
- package/dist/client/http.d.ts +0 -155
- package/dist/client/http.d.ts.map +0 -1
- package/dist/client/http.js +0 -571
- package/dist/client/http.js.map +0 -1
- package/dist/client/index.d.ts +0 -23
- package/dist/client/index.d.ts.map +0 -1
- package/dist/client/index.js +0 -95
- package/dist/client/index.js.map +0 -1
- package/dist/client/path.d.ts +0 -26
- package/dist/client/path.d.ts.map +0 -1
- package/dist/client/path.js +0 -163
- package/dist/client/path.js.map +0 -1
- package/dist/client/redirect-policy.d.ts +0 -12
- package/dist/client/redirect-policy.d.ts.map +0 -1
- package/dist/client/redirect-policy.js +0 -20
- package/dist/client/redirect-policy.js.map +0 -1
- package/dist/client/sdk.d.ts +0 -70
- package/dist/client/sdk.d.ts.map +0 -1
- package/dist/client/sdk.js +0 -292
- package/dist/client/sdk.js.map +0 -1
- package/dist/client/sse.d.ts +0 -23
- package/dist/client/sse.d.ts.map +0 -1
- package/dist/client/sse.js +0 -129
- package/dist/client/sse.js.map +0 -1
- package/dist/client/types.d.ts +0 -124
- package/dist/client/types.d.ts.map +0 -1
- package/dist/client/types.js +0 -2
- package/dist/client/types.js.map +0 -1
- package/dist/client/ws.d.ts +0 -22
- package/dist/client/ws.d.ts.map +0 -1
- package/dist/client/ws.js +0 -112
- package/dist/client/ws.js.map +0 -1
- package/dist/client-go/errors.go +0 -236
- package/dist/client-go/export.go +0 -44
- package/dist/client-go/invalidation.go +0 -371
- package/dist/client-go/nullable.go +0 -62
- package/dist/client-go/realtime.go +0 -354
- package/dist/client-go/result.go +0 -20
- package/dist/client-go/runtime.go +0 -975
- package/dist/client-go/sse.go +0 -159
- package/dist/client-go/transport.go +0 -495
- package/dist/client-go/ws.go +0 -128
- package/dist/client-info.d.ts +0 -36
- package/dist/client-info.d.ts.map +0 -1
- package/dist/client-info.js +0 -53
- package/dist/client-info.js.map +0 -1
- package/dist/client-mcp/README.md +0 -10
- package/dist/client-mcp/server.ts +0 -221
- package/dist/client-mcp/types.ts +0 -19
- package/dist/client-python/_errors.py +0 -115
- package/dist/client-python/_invalidation.py +0 -494
- package/dist/client-python/_realtime.py +0 -179
- package/dist/client-python/_runtime.py +0 -860
- package/dist/client-python/_sse.py +0 -155
- package/dist/client-python/_transport.py +0 -366
- package/dist/client-python/_ws.py +0 -159
- package/dist/client-python/py.typed +0 -0
- package/dist/client-rust/errors.rs +0 -220
- package/dist/client-rust/invalidation.rs +0 -412
- package/dist/client-rust/invalidation_sync.rs +0 -93
- package/dist/client-rust/nullable.rs +0 -17
- package/dist/client-rust/realtime.rs +0 -702
- package/dist/client-rust/result.rs +0 -22
- package/dist/client-rust/runtime.rs +0 -980
- package/dist/client-rust/runtime_sync.rs +0 -484
- package/dist/client-rust/sse.rs +0 -188
- package/dist/client-rust/ws.rs +0 -167
- package/dist/codegen-go-cli.d.ts +0 -22
- package/dist/codegen-go-cli.d.ts.map +0 -1
- package/dist/codegen-go-cli.js +0 -964
- package/dist/codegen-go-cli.js.map +0 -1
- package/dist/codegen-go.d.ts +0 -41
- package/dist/codegen-go.d.ts.map +0 -1
- package/dist/codegen-go.js +0 -872
- package/dist/codegen-go.js.map +0 -1
- package/dist/codegen-hash.d.ts +0 -3
- package/dist/codegen-hash.d.ts.map +0 -1
- package/dist/codegen-hash.js +0 -9
- package/dist/codegen-hash.js.map +0 -1
- package/dist/codegen-ir.d.ts +0 -190
- package/dist/codegen-ir.d.ts.map +0 -1
- package/dist/codegen-ir.js +0 -661
- package/dist/codegen-ir.js.map +0 -1
- package/dist/codegen-lang.d.ts +0 -65
- package/dist/codegen-lang.d.ts.map +0 -1
- package/dist/codegen-lang.js +0 -526
- package/dist/codegen-lang.js.map +0 -1
- package/dist/codegen-load.d.ts +0 -31
- package/dist/codegen-load.d.ts.map +0 -1
- package/dist/codegen-load.js +0 -138
- package/dist/codegen-load.js.map +0 -1
- package/dist/codegen-loaders.d.ts +0 -12
- package/dist/codegen-loaders.d.ts.map +0 -1
- package/dist/codegen-loaders.js +0 -55
- package/dist/codegen-loaders.js.map +0 -1
- package/dist/codegen-mcp.d.ts +0 -13
- package/dist/codegen-mcp.d.ts.map +0 -1
- package/dist/codegen-mcp.js +0 -368
- package/dist/codegen-mcp.js.map +0 -1
- package/dist/codegen-python.d.ts +0 -33
- package/dist/codegen-python.d.ts.map +0 -1
- package/dist/codegen-python.js +0 -828
- package/dist/codegen-python.js.map +0 -1
- package/dist/codegen-route-tree-intern.d.ts +0 -40
- package/dist/codegen-route-tree-intern.d.ts.map +0 -1
- package/dist/codegen-route-tree-intern.js +0 -221
- package/dist/codegen-route-tree-intern.js.map +0 -1
- package/dist/codegen-rust.d.ts +0 -18
- package/dist/codegen-rust.d.ts.map +0 -1
- package/dist/codegen-rust.js +0 -1293
- package/dist/codegen-rust.js.map +0 -1
- package/dist/codegen-sanitize.d.ts +0 -3
- package/dist/codegen-sanitize.d.ts.map +0 -1
- package/dist/codegen-sanitize.js +0 -56
- package/dist/codegen-sanitize.js.map +0 -1
- package/dist/codegen-schema-naming.d.ts +0 -27
- package/dist/codegen-schema-naming.d.ts.map +0 -1
- package/dist/codegen-schema-naming.js +0 -150
- package/dist/codegen-schema-naming.js.map +0 -1
- package/dist/codegen-sdk-model.d.ts +0 -71
- package/dist/codegen-sdk-model.d.ts.map +0 -1
- package/dist/codegen-sdk-model.js +0 -179
- package/dist/codegen-sdk-model.js.map +0 -1
- package/dist/codegen.d.ts +0 -187
- package/dist/codegen.d.ts.map +0 -1
- package/dist/codegen.js +0 -4619
- package/dist/codegen.js.map +0 -1
- package/dist/context.d.ts +0 -86
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js +0 -242
- package/dist/context.js.map +0 -1
- package/dist/cookie-sign.d.ts +0 -17
- package/dist/cookie-sign.d.ts.map +0 -1
- package/dist/cookie-sign.js +0 -104
- package/dist/cookie-sign.js.map +0 -1
- package/dist/cookie.d.ts +0 -24
- package/dist/cookie.d.ts.map +0 -1
- package/dist/cookie.js +0 -138
- package/dist/cookie.js.map +0 -1
- package/dist/cors.d.ts +0 -14
- package/dist/cors.d.ts.map +0 -1
- package/dist/cors.js +0 -87
- package/dist/cors.js.map +0 -1
- package/dist/crypto.d.ts +0 -7
- package/dist/crypto.d.ts.map +0 -1
- package/dist/crypto.js +0 -38
- package/dist/crypto.js.map +0 -1
- package/dist/csrf.d.ts +0 -28
- package/dist/csrf.d.ts.map +0 -1
- package/dist/csrf.js +0 -79
- package/dist/csrf.js.map +0 -1
- package/dist/curl-logger.d.ts +0 -44
- package/dist/curl-logger.d.ts.map +0 -1
- package/dist/curl-logger.js +0 -199
- package/dist/curl-logger.js.map +0 -1
- package/dist/detect-runtime.d.ts +0 -16
- package/dist/detect-runtime.d.ts.map +0 -1
- package/dist/detect-runtime.js +0 -13
- package/dist/detect-runtime.js.map +0 -1
- package/dist/dict.d.ts +0 -11
- package/dist/dict.d.ts.map +0 -1
- package/dist/dict.js +0 -13
- package/dist/dict.js.map +0 -1
- package/dist/error.d.ts +0 -21
- package/dist/error.d.ts.map +0 -1
- package/dist/error.js +0 -44
- package/dist/error.js.map +0 -1
- package/dist/errors.d.ts +0 -40
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -39
- package/dist/errors.js.map +0 -1
- package/dist/etag.d.ts +0 -11
- package/dist/etag.d.ts.map +0 -1
- package/dist/etag.js +0 -82
- package/dist/etag.js.map +0 -1
- package/dist/feature-detect.d.ts +0 -25
- package/dist/feature-detect.d.ts.map +0 -1
- package/dist/feature-detect.js +0 -144
- package/dist/feature-detect.js.map +0 -1
- package/dist/feature-load.d.ts +0 -3
- package/dist/feature-load.d.ts.map +0 -1
- package/dist/feature-load.js +0 -36
- package/dist/feature-load.js.map +0 -1
- package/dist/feature-slots.d.ts +0 -44
- package/dist/feature-slots.d.ts.map +0 -1
- package/dist/feature-slots.js +0 -48
- package/dist/feature-slots.js.map +0 -1
- package/dist/fetch-request.d.ts +0 -10
- package/dist/fetch-request.d.ts.map +0 -1
- package/dist/fetch-request.js +0 -13
- package/dist/fetch-request.js.map +0 -1
- package/dist/gen-process.d.ts +0 -15
- package/dist/gen-process.d.ts.map +0 -1
- package/dist/gen-process.js +0 -43
- package/dist/gen-process.js.map +0 -1
- package/dist/gen-write.d.ts +0 -19
- package/dist/gen-write.d.ts.map +0 -1
- package/dist/gen-write.js +0 -120
- package/dist/gen-write.js.map +0 -1
- package/dist/glob.d.ts +0 -21
- package/dist/glob.d.ts.map +0 -1
- package/dist/glob.js +0 -115
- package/dist/glob.js.map +0 -1
- package/dist/go-type-emitter.d.ts +0 -47
- package/dist/go-type-emitter.d.ts.map +0 -1
- package/dist/go-type-emitter.js +0 -594
- package/dist/go-type-emitter.js.map +0 -1
- package/dist/honey-response.d.ts +0 -82
- package/dist/honey-response.d.ts.map +0 -1
- package/dist/honey-response.js +0 -338
- package/dist/honey-response.js.map +0 -1
- package/dist/i18n-slot.d.ts +0 -15
- package/dist/i18n-slot.d.ts.map +0 -1
- package/dist/i18n-slot.js +0 -14
- package/dist/i18n-slot.js.map +0 -1
- package/dist/i18n.d.ts +0 -29
- package/dist/i18n.d.ts.map +0 -1
- package/dist/i18n.js +0 -250
- package/dist/i18n.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/init.d.ts +0 -5
- package/dist/init.d.ts.map +0 -1
- package/dist/init.js +0 -140
- package/dist/init.js.map +0 -1
- package/dist/input.d.ts +0 -6
- package/dist/input.d.ts.map +0 -1
- package/dist/input.js +0 -4
- package/dist/input.js.map +0 -1
- package/dist/invalidate-check.d.ts +0 -61
- package/dist/invalidate-check.d.ts.map +0 -1
- package/dist/invalidate-check.js +0 -163
- package/dist/invalidate-check.js.map +0 -1
- package/dist/invoke-user.d.ts +0 -35
- package/dist/invoke-user.d.ts.map +0 -1
- package/dist/invoke-user.js +0 -73
- package/dist/invoke-user.js.map +0 -1
- package/dist/ip-restrict.d.ts +0 -24
- package/dist/ip-restrict.d.ts.map +0 -1
- package/dist/ip-restrict.js +0 -60
- package/dist/ip-restrict.js.map +0 -1
- package/dist/ip.d.ts +0 -39
- package/dist/ip.d.ts.map +0 -1
- package/dist/ip.js +0 -209
- package/dist/ip.js.map +0 -1
- package/dist/logger.d.ts +0 -45
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js +0 -113
- package/dist/logger.js.map +0 -1
- package/dist/media-type.d.ts +0 -30
- package/dist/media-type.d.ts.map +0 -1
- package/dist/media-type.js +0 -97
- package/dist/media-type.js.map +0 -1
- package/dist/meta-spec-merge.d.ts +0 -32
- package/dist/meta-spec-merge.d.ts.map +0 -1
- package/dist/meta-spec-merge.js +0 -68
- package/dist/meta-spec-merge.js.map +0 -1
- package/dist/meta-spec.d.ts +0 -94
- package/dist/meta-spec.d.ts.map +0 -1
- package/dist/meta-spec.js +0 -535
- package/dist/meta-spec.js.map +0 -1
- package/dist/middleware.d.ts +0 -77
- package/dist/middleware.d.ts.map +0 -1
- package/dist/middleware.js +0 -253
- package/dist/middleware.js.map +0 -1
- package/dist/node-request.d.ts +0 -104
- package/dist/node-request.d.ts.map +0 -1
- package/dist/node-request.js +0 -407
- package/dist/node-request.js.map +0 -1
- package/dist/node.d.ts +0 -30
- package/dist/node.d.ts.map +0 -1
- package/dist/node.js +0 -396
- package/dist/node.js.map +0 -1
- package/dist/openapi/collect.d.ts.map +0 -1
- package/dist/openapi/collect.js.map +0 -1
- package/dist/openapi/docs-page.d.ts.map +0 -1
- package/dist/openapi/docs-page.js.map +0 -1
- package/dist/openapi/document.d.ts.map +0 -1
- package/dist/openapi/document.js.map +0 -1
- package/dist/openapi/json-schema-slot.d.ts +0 -12
- package/dist/openapi/json-schema-slot.d.ts.map +0 -1
- package/dist/openapi/json-schema-slot.js +0 -38
- package/dist/openapi/json-schema-slot.js.map +0 -1
- package/dist/openapi/register.d.ts.map +0 -1
- package/dist/openapi/register.js.map +0 -1
- package/dist/openapi/scalar.d.ts.map +0 -1
- package/dist/openapi/scalar.js.map +0 -1
- package/dist/openapi/serve.d.ts.map +0 -1
- package/dist/openapi/serve.js.map +0 -1
- package/dist/openapi/spec-factory.d.ts +0 -65
- package/dist/openapi/spec-factory.d.ts.map +0 -1
- package/dist/openapi/spec-factory.js +0 -52
- package/dist/openapi/spec-factory.js.map +0 -1
- package/dist/openapi/spec.d.ts +0 -29
- package/dist/openapi/spec.d.ts.map +0 -1
- package/dist/openapi/spec.js +0 -50
- package/dist/openapi/spec.js.map +0 -1
- package/dist/openapi/swagger.d.ts.map +0 -1
- package/dist/openapi/swagger.js.map +0 -1
- package/dist/pattern.d.ts +0 -71
- package/dist/pattern.d.ts.map +0 -1
- package/dist/pattern.js +0 -239
- package/dist/pattern.js.map +0 -1
- package/dist/peer.d.ts +0 -17
- package/dist/peer.d.ts.map +0 -1
- package/dist/peer.js +0 -50
- package/dist/peer.js.map +0 -1
- package/dist/plugin.d.ts +0 -228
- package/dist/plugin.d.ts.map +0 -1
- package/dist/plugin.js +0 -666
- package/dist/plugin.js.map +0 -1
- package/dist/powered-by.d.ts +0 -7
- package/dist/powered-by.d.ts.map +0 -1
- package/dist/powered-by.js +0 -11
- package/dist/powered-by.js.map +0 -1
- package/dist/pretty-json.d.ts +0 -10
- package/dist/pretty-json.d.ts.map +0 -1
- package/dist/pretty-json.js +0 -47
- package/dist/pretty-json.js.map +0 -1
- package/dist/producer-stream.d.ts +0 -47
- package/dist/producer-stream.d.ts.map +0 -1
- package/dist/producer-stream.js +0 -267
- package/dist/producer-stream.js.map +0 -1
- package/dist/proxy.d.ts +0 -90
- package/dist/proxy.d.ts.map +0 -1
- package/dist/proxy.js +0 -274
- package/dist/proxy.js.map +0 -1
- package/dist/python-type-emitter.d.ts +0 -24
- package/dist/python-type-emitter.d.ts.map +0 -1
- package/dist/python-type-emitter.js +0 -157
- package/dist/python-type-emitter.js.map +0 -1
- package/dist/realtime/bus.d.ts.map +0 -1
- package/dist/realtime/bus.js.map +0 -1
- package/dist/realtime/register.d.ts +0 -3
- package/dist/realtime/register.d.ts.map +0 -1
- package/dist/realtime/register.js +0 -10
- package/dist/realtime/register.js.map +0 -1
- package/dist/realtime/route.d.ts.map +0 -1
- package/dist/realtime/route.js.map +0 -1
- package/dist/realtime/server.d.ts.map +0 -1
- package/dist/realtime/server.js.map +0 -1
- package/dist/request-id.d.ts +0 -19
- package/dist/request-id.d.ts.map +0 -1
- package/dist/request-id.js +0 -16
- package/dist/request-id.js.map +0 -1
- package/dist/request-limits.d.ts +0 -3
- package/dist/request-limits.d.ts.map +0 -1
- package/dist/request-limits.js +0 -3
- package/dist/request-limits.js.map +0 -1
- package/dist/request-path.d.ts +0 -33
- package/dist/request-path.d.ts.map +0 -1
- package/dist/request-path.js +0 -178
- package/dist/request-path.js.map +0 -1
- package/dist/request-to-curl.d.ts +0 -15
- package/dist/request-to-curl.d.ts.map +0 -1
- package/dist/request-to-curl.js +0 -48
- package/dist/request-to-curl.js.map +0 -1
- package/dist/response.d.ts +0 -86
- package/dist/response.d.ts.map +0 -1
- package/dist/response.js +0 -313
- package/dist/response.js.map +0 -1
- package/dist/rust-type-emitter.d.ts +0 -44
- package/dist/rust-type-emitter.d.ts.map +0 -1
- package/dist/rust-type-emitter.js +0 -463
- package/dist/rust-type-emitter.js.map +0 -1
- package/dist/secure-headers.d.ts +0 -16
- package/dist/secure-headers.d.ts.map +0 -1
- package/dist/secure-headers.js +0 -53
- package/dist/secure-headers.js.map +0 -1
- package/dist/serve-register.d.ts +0 -6
- package/dist/serve-register.d.ts.map +0 -1
- package/dist/serve-register.js +0 -9
- package/dist/serve-register.js.map +0 -1
- package/dist/serve-slot.d.ts +0 -9
- package/dist/serve-slot.d.ts.map +0 -1
- package/dist/serve-slot.js +0 -52
- package/dist/serve-slot.js.map +0 -1
- package/dist/serve.d.ts +0 -38
- package/dist/serve.d.ts.map +0 -1
- package/dist/serve.js +0 -157
- package/dist/serve.js.map +0 -1
- package/dist/server-timing.d.ts +0 -9
- package/dist/server-timing.d.ts.map +0 -1
- package/dist/server-timing.js +0 -51
- package/dist/server-timing.js.map +0 -1
- package/dist/static.d.ts +0 -21
- package/dist/static.d.ts.map +0 -1
- package/dist/static.js +0 -102
- package/dist/static.js.map +0 -1
- package/dist/telemetry/otel.d.ts.map +0 -1
- package/dist/telemetry/otel.js.map +0 -1
- package/dist/testing.d.ts +0 -36
- package/dist/testing.d.ts.map +0 -1
- package/dist/testing.js +0 -124
- package/dist/testing.js.map +0 -1
- package/dist/timeout.d.ts +0 -13
- package/dist/timeout.d.ts.map +0 -1
- package/dist/timeout.js +0 -36
- package/dist/timeout.js.map +0 -1
- package/dist/tree.d.ts +0 -193
- package/dist/tree.d.ts.map +0 -1
- package/dist/tree.js +0 -437
- package/dist/tree.js.map +0 -1
- package/dist/trust.d.ts +0 -21
- package/dist/trust.d.ts.map +0 -1
- package/dist/trust.js +0 -100
- package/dist/trust.js.map +0 -1
- package/dist/ts-type-emitter.d.ts +0 -8
- package/dist/ts-type-emitter.d.ts.map +0 -1
- package/dist/ts-type-emitter.js +0 -150
- package/dist/ts-type-emitter.js.map +0 -1
- package/dist/type-emitter.d.ts +0 -36
- package/dist/type-emitter.d.ts.map +0 -1
- package/dist/type-emitter.js +0 -729
- package/dist/type-emitter.js.map +0 -1
- package/dist/type-extractor.d.ts +0 -43
- package/dist/type-extractor.d.ts.map +0 -1
- package/dist/type-extractor.js +0 -819
- package/dist/type-extractor.js.map +0 -1
- package/dist/types.d.ts +0 -467
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -96
- package/dist/types.js.map +0 -1
- package/dist/validation.d.ts +0 -31
- package/dist/validation.d.ts.map +0 -1
- package/dist/validation.js +0 -335
- package/dist/validation.js.map +0 -1
- package/dist/with-headers.d.ts +0 -15
- package/dist/with-headers.d.ts.map +0 -1
- package/dist/with-headers.js +0 -45
- package/dist/with-headers.js.map +0 -1
- package/dist/ws/bun.d.ts.map +0 -1
- package/dist/ws/bun.js.map +0 -1
- package/dist/ws/cloudflare.d.ts.map +0 -1
- package/dist/ws/cloudflare.js.map +0 -1
- package/dist/ws/deno.d.ts +0 -13
- package/dist/ws/deno.d.ts.map +0 -1
- package/dist/ws/deno.js +0 -133
- package/dist/ws/deno.js.map +0 -1
- package/dist/ws/node.d.ts.map +0 -1
- package/dist/ws/node.js.map +0 -1
- package/dist/ws/session.d.ts.map +0 -1
- package/dist/ws/session.js.map +0 -1
- package/dist/ws/shared.d.ts.map +0 -1
- package/dist/ws/shared.js.map +0 -1
- package/dist/ws-origin.d.ts +0 -20
- package/dist/ws-origin.d.ts.map +0 -1
- package/dist/ws-origin.js +0 -41
- package/dist/ws-origin.js.map +0 -1
- package/dist/yaml.d.ts +0 -18
- package/dist/yaml.d.ts.map +0 -1
- package/dist/yaml.js +0 -101
- package/dist/yaml.js.map +0 -1
- package/docs/api-ref/go.md +0 -399
- package/docs/api-ref/python.md +0 -399
- package/docs/api-ref/rust.md +0 -399
- package/docs/api-ref/typescript.md +0 -399
- package/docs/invalidate-spec.md +0 -333
- package/docs/meta-spec.md +0 -555
- package/docs/packaging.md +0 -104
- package/docs/regression-matrix/README.md +0 -32
- package/docs/regression-matrix/review.md +0 -44
- package/docs/regression-matrix/ws1-3.md +0 -97
- package/docs/regression-matrix/ws4-8.md +0 -107
- package/docs/regression-matrix/ws9-12.md +0 -266
- package/docs/sdk.md +0 -798
- package/src/accepts.ts +0 -136
- package/src/body-kind.ts +0 -67
- package/src/body-limit.ts +0 -152
- package/src/build/index.ts +0 -217
- package/src/cli-args.ts +0 -123
- package/src/cli-go/auth.go +0 -26
- package/src/cli-go/config.go +0 -192
- package/src/cli-go/errors.go +0 -75
- package/src/cli-go/multipart.go +0 -79
- package/src/cli-go/output.go +0 -163
- package/src/cli-go/root.go +0 -30
- package/src/cli-go/stream.go +0 -88
- package/src/cli-go/version.go +0 -5
- package/src/cli.ts +0 -209
- package/src/client/defaults.ts +0 -47
- package/src/client/error.ts +0 -82
- package/src/client/http.ts +0 -737
- package/src/client/index.ts +0 -157
- package/src/client/path.ts +0 -169
- package/src/client/redirect-policy.ts +0 -19
- package/src/client/sdk.ts +0 -351
- package/src/client/sse.ts +0 -128
- package/src/client/types.ts +0 -206
- package/src/client/ws.ts +0 -149
- package/src/client-go/errors.go +0 -236
- package/src/client-go/export.go +0 -44
- package/src/client-go/invalidation.go +0 -371
- package/src/client-go/nullable.go +0 -62
- package/src/client-go/realtime.go +0 -354
- package/src/client-go/result.go +0 -20
- package/src/client-go/runtime.go +0 -975
- package/src/client-go/sse.go +0 -159
- package/src/client-go/transport.go +0 -495
- package/src/client-go/ws.go +0 -128
- package/src/client-info.ts +0 -79
- package/src/client-mcp/README.md +0 -10
- package/src/client-mcp/server.ts +0 -221
- package/src/client-mcp/types.ts +0 -19
- package/src/client-python/_errors.py +0 -115
- package/src/client-python/_invalidation.py +0 -494
- package/src/client-python/_realtime.py +0 -179
- package/src/client-python/_runtime.py +0 -860
- package/src/client-python/_sse.py +0 -155
- package/src/client-python/_transport.py +0 -366
- package/src/client-python/_ws.py +0 -159
- package/src/client-python/py.typed +0 -0
- package/src/client-rust/errors.rs +0 -220
- package/src/client-rust/invalidation.rs +0 -412
- package/src/client-rust/invalidation_sync.rs +0 -93
- package/src/client-rust/nullable.rs +0 -17
- package/src/client-rust/realtime.rs +0 -702
- package/src/client-rust/result.rs +0 -22
- package/src/client-rust/runtime.rs +0 -980
- package/src/client-rust/runtime_sync.rs +0 -484
- package/src/client-rust/sse.rs +0 -188
- package/src/client-rust/ws.rs +0 -167
- package/src/codegen-go-cli.ts +0 -1066
- package/src/codegen-go.ts +0 -970
- package/src/codegen-hash.ts +0 -8
- package/src/codegen-ir.ts +0 -812
- package/src/codegen-lang.ts +0 -517
- package/src/codegen-load.ts +0 -150
- package/src/codegen-loaders.ts +0 -50
- package/src/codegen-mcp.ts +0 -445
- package/src/codegen-python.ts +0 -916
- package/src/codegen-route-tree-intern.ts +0 -198
- package/src/codegen-rust.ts +0 -1402
- package/src/codegen-sanitize.ts +0 -57
- package/src/codegen-schema-naming.ts +0 -165
- package/src/codegen-sdk-model.ts +0 -228
- package/src/codegen.ts +0 -5089
- package/src/context.ts +0 -325
- package/src/cookie-sign.ts +0 -119
- package/src/cookie.ts +0 -143
- package/src/cors.ts +0 -95
- package/src/crypto.ts +0 -38
- package/src/csrf.ts +0 -86
- package/src/curl-logger.ts +0 -258
- package/src/detect-runtime.ts +0 -17
- package/src/dict.ts +0 -12
- package/src/error.ts +0 -55
- package/src/errors.ts +0 -85
- package/src/etag.ts +0 -97
- package/src/feature-detect.ts +0 -147
- package/src/feature-load.ts +0 -23
- package/src/feature-slots.ts +0 -70
- package/src/fetch-request.ts +0 -13
- package/src/gen-process.ts +0 -42
- package/src/gen-write.ts +0 -127
- package/src/glob.ts +0 -109
- package/src/go-type-emitter.ts +0 -660
- package/src/honey-response.ts +0 -379
- package/src/i18n-slot.ts +0 -30
- package/src/i18n.ts +0 -300
- package/src/index.ts +0 -3829
- package/src/init.ts +0 -161
- package/src/input.ts +0 -8
- package/src/invalidate-check.ts +0 -205
- package/src/invoke-user.ts +0 -95
- package/src/ip-restrict.ts +0 -79
- package/src/ip.ts +0 -194
- package/src/logger.ts +0 -178
- package/src/media-type.ts +0 -104
- package/src/meta-spec-merge.ts +0 -80
- package/src/meta-spec.ts +0 -718
- package/src/middleware.ts +0 -331
- package/src/node-request.ts +0 -431
- package/src/node.ts +0 -454
- package/src/openapi/collect.ts +0 -50
- package/src/openapi/docs-page.ts +0 -89
- package/src/openapi/document.ts +0 -893
- package/src/openapi/json-schema-slot.ts +0 -53
- package/src/openapi/register.ts +0 -23
- package/src/openapi/scalar.ts +0 -34
- package/src/openapi/serve.ts +0 -39
- package/src/openapi/spec-factory.ts +0 -100
- package/src/openapi/spec.ts +0 -74
- package/src/openapi/swagger.ts +0 -35
- package/src/pattern.ts +0 -245
- package/src/peer.ts +0 -53
- package/src/plugin.ts +0 -864
- package/src/powered-by.ts +0 -18
- package/src/pretty-json.ts +0 -56
- package/src/producer-stream.ts +0 -296
- package/src/proxy.ts +0 -370
- package/src/python-type-emitter.ts +0 -181
- package/src/realtime/bus.ts +0 -140
- package/src/realtime/register.ts +0 -13
- package/src/realtime/route.ts +0 -153
- package/src/realtime/server.ts +0 -298
- package/src/request-id.ts +0 -32
- package/src/request-limits.ts +0 -2
- package/src/request-path.ts +0 -165
- package/src/request-to-curl.ts +0 -52
- package/src/response.ts +0 -411
- package/src/rust-type-emitter.ts +0 -548
- package/src/secure-headers.ts +0 -74
- package/src/serve-register.ts +0 -12
- package/src/serve-slot.ts +0 -58
- package/src/serve.ts +0 -220
- package/src/server-timing.ts +0 -71
- package/src/static.ts +0 -112
- package/src/telemetry/otel.ts +0 -156
- package/src/testing.ts +0 -167
- package/src/timeout.ts +0 -45
- package/src/tree.ts +0 -554
- package/src/trust.ts +0 -117
- package/src/ts-type-emitter.ts +0 -168
- package/src/type-emitter.ts +0 -760
- package/src/type-extractor.ts +0 -855
- package/src/types.ts +0 -756
- package/src/validation.ts +0 -413
- package/src/with-headers.ts +0 -45
- package/src/ws/bun.ts +0 -120
- package/src/ws/cloudflare.ts +0 -192
- package/src/ws/deno.ts +0 -188
- package/src/ws/node.ts +0 -240
- package/src/ws/session.ts +0 -73
- package/src/ws/shared.ts +0 -140
- package/src/ws-origin.ts +0 -53
- package/src/yaml.ts +0 -103
|
@@ -1,980 +0,0 @@
|
|
|
1
|
-
/* Code generated by honey. DO NOT EDIT. */
|
|
2
|
-
|
|
3
|
-
#![allow(dead_code)]
|
|
4
|
-
|
|
5
|
-
use crate::errors::{raise_for_status, Error};
|
|
6
|
-
use std::collections::HashMap;
|
|
7
|
-
use std::future::Future;
|
|
8
|
-
use std::pin::Pin;
|
|
9
|
-
use std::sync::Arc;
|
|
10
|
-
use std::time::Duration;
|
|
11
|
-
use tokio::sync::Mutex;
|
|
12
|
-
use tokio_util::sync::CancellationToken;
|
|
13
|
-
use uuid::Uuid;
|
|
14
|
-
|
|
15
|
-
/// OnRequestHook is called before each request is sent.
|
|
16
|
-
/// Receives a mutable RequestContext; can mutate headers, url, or body.
|
|
17
|
-
/// Returning Err short-circuits the request.
|
|
18
|
-
pub type OnRequestHook = Arc<
|
|
19
|
-
dyn Fn(
|
|
20
|
-
&mut RequestContext,
|
|
21
|
-
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + '_>>
|
|
22
|
-
+ Send
|
|
23
|
-
+ Sync,
|
|
24
|
-
>;
|
|
25
|
-
|
|
26
|
-
/// OnResponseHook is called after each response is received (before error mapping).
|
|
27
|
-
pub type OnResponseHook = Arc<
|
|
28
|
-
dyn Fn(
|
|
29
|
-
&mut ResponseContext,
|
|
30
|
-
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + '_>>
|
|
31
|
-
+ Send
|
|
32
|
-
+ Sync,
|
|
33
|
-
>;
|
|
34
|
-
|
|
35
|
-
/// RequestContext carries mutable request metadata through OnRequestHook invocations.
|
|
36
|
-
/// `selector` / `is_stale` / `invalidated_by` mirror the TS hook ctx and are
|
|
37
|
-
/// populated from the RequestMeta snapshot taken before the request fires;
|
|
38
|
-
/// zero values when the tracker is disabled. Header names are unique
|
|
39
|
-
/// case-insensitively; use [`set_header`] to replace one.
|
|
40
|
-
pub struct RequestContext {
|
|
41
|
-
pub method: reqwest::Method,
|
|
42
|
-
pub url: String,
|
|
43
|
-
pub path: String,
|
|
44
|
-
pub headers: HashMap<String, String>,
|
|
45
|
-
pub state: Arc<Mutex<HashMap<String, serde_json::Value>>>,
|
|
46
|
-
pub is_retry: bool,
|
|
47
|
-
pub selector: String,
|
|
48
|
-
pub is_stale: bool,
|
|
49
|
-
pub invalidated_by: Vec<String>,
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/// ResponseContext carries response metadata through OnResponseHook invocations.
|
|
53
|
-
/// `selector` / `is_stale` / `invalidated_by` mirror the RequestContext fields.
|
|
54
|
-
pub struct ResponseContext {
|
|
55
|
-
pub status: u16,
|
|
56
|
-
pub response: Vec<u8>,
|
|
57
|
-
pub headers: reqwest::header::HeaderMap,
|
|
58
|
-
pub state: Arc<Mutex<HashMap<String, serde_json::Value>>>,
|
|
59
|
-
pub is_retry: bool,
|
|
60
|
-
pub selector: String,
|
|
61
|
-
pub is_stale: bool,
|
|
62
|
-
pub invalidated_by: Vec<String>,
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/// RequestBody represents the different body types a request can carry.
|
|
66
|
-
/// `Multipart` and `Stream` own single-shot bodies and are not retried on 401;
|
|
67
|
-
/// the others are sent again after an auth refresh.
|
|
68
|
-
pub enum RequestBody<'a> {
|
|
69
|
-
None,
|
|
70
|
-
Json(&'a serde_json::Value),
|
|
71
|
-
/// Ordered key/value pairs, sent as application/x-www-form-urlencoded.
|
|
72
|
-
FormUrl(Vec<(String, String)>),
|
|
73
|
-
/// Bytes with an explicit content type (text/plain, …).
|
|
74
|
-
Raw(&'static str, bytes::Bytes),
|
|
75
|
-
Multipart(reqwest::multipart::Form),
|
|
76
|
-
Stream(reqwest::Body),
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/// OnAuthExpiredHook is the async auth-refresh callback type for ClientConfig.
|
|
80
|
-
/// Returning an empty token means "give up": the 401 is returned as an error.
|
|
81
|
-
pub type OnAuthExpiredHook =
|
|
82
|
-
Arc<dyn Fn() -> Pin<Box<dyn Future<Output = Result<String, Error>> + Send>> + Send + Sync>;
|
|
83
|
-
|
|
84
|
-
/// LogEntry is the payload passed to on_log callbacks. Consumers plug in their
|
|
85
|
-
/// own logger; the SDK never formats, levels, or persists. Status is Option so
|
|
86
|
-
/// None encodes "omitted" (request_start) without colliding with a real 0 status.
|
|
87
|
-
/// error is repr-style String on the "error" event; None otherwise. Field layout
|
|
88
|
-
/// matches the TS/Python/Go LogEntry shape for cross-language consumer parity.
|
|
89
|
-
#[derive(Clone, Debug)]
|
|
90
|
-
pub struct LogEntry {
|
|
91
|
-
pub level: String,
|
|
92
|
-
pub event: String,
|
|
93
|
-
pub operation: String,
|
|
94
|
-
pub duration_ms: i64,
|
|
95
|
-
pub status: Option<i32>,
|
|
96
|
-
pub error: Option<String>,
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/// OnLogHook is the callback type for lifecycle log events. Shared between
|
|
100
|
-
/// ClientConfig (async) and SyncClientConfig (blocking) — both take the same
|
|
101
|
-
/// synchronous Fn signature (emission is fire-and-forget from either runtime).
|
|
102
|
-
pub type OnLogHook = Arc<dyn Fn(LogEntry) + Send + Sync>;
|
|
103
|
-
|
|
104
|
-
/// ClientConfig holds all configuration for the SDK client.
|
|
105
|
-
///
|
|
106
|
-
/// `timeout` bounds a whole regular request including the body read
|
|
107
|
-
/// (`Duration::ZERO` disables it); streams are not bounded by it.
|
|
108
|
-
/// `max_response_bytes` caps a buffered response body (0 disables the cap).
|
|
109
|
-
/// When `http_client` is None the SDK builds one that does not follow
|
|
110
|
-
/// redirects to another host, so auth and custom headers never leave the origin.
|
|
111
|
-
#[derive(Clone)]
|
|
112
|
-
pub struct ClientConfig {
|
|
113
|
-
pub base_url: String,
|
|
114
|
-
pub bearer_token: Option<String>,
|
|
115
|
-
pub headers: HashMap<String, String>,
|
|
116
|
-
pub timeout: Duration,
|
|
117
|
-
/// Ignored at runtime: whether methods return `SdkResult` is fixed when the SDK is generated.
|
|
118
|
-
#[deprecated(note = "has no effect; generate with `throwOnError: false` for SdkResult methods")]
|
|
119
|
-
pub throw_on_error: bool,
|
|
120
|
-
/// Fallback for `InvalidationConfig::stale_max_entries` when that is 0.
|
|
121
|
-
pub stale_max_entries: usize,
|
|
122
|
-
pub invalidation: Option<InvalidationConfig>,
|
|
123
|
-
pub on_auth_expired: Option<OnAuthExpiredHook>,
|
|
124
|
-
pub http_client: Option<reqwest::Client>,
|
|
125
|
-
pub auth_header_name: Option<String>,
|
|
126
|
-
pub auth_header_prefix: Option<String>,
|
|
127
|
-
pub on_request: Vec<OnRequestHook>,
|
|
128
|
-
pub on_response: Vec<OnResponseHook>,
|
|
129
|
-
pub on_log: Option<OnLogHook>,
|
|
130
|
-
pub state: Option<Arc<Mutex<HashMap<String, serde_json::Value>>>>,
|
|
131
|
-
pub max_response_bytes: usize,
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
#[allow(deprecated)]
|
|
135
|
-
impl Default for ClientConfig {
|
|
136
|
-
fn default() -> Self {
|
|
137
|
-
ClientConfig {
|
|
138
|
-
base_url: String::new(),
|
|
139
|
-
bearer_token: None,
|
|
140
|
-
headers: HashMap::new(),
|
|
141
|
-
timeout: Duration::from_secs(30),
|
|
142
|
-
throw_on_error: true,
|
|
143
|
-
stale_max_entries: 500,
|
|
144
|
-
invalidation: None,
|
|
145
|
-
on_auth_expired: None,
|
|
146
|
-
http_client: None,
|
|
147
|
-
auth_header_name: None,
|
|
148
|
-
auth_header_prefix: None,
|
|
149
|
-
on_request: Vec::new(),
|
|
150
|
-
on_response: Vec::new(),
|
|
151
|
-
on_log: None,
|
|
152
|
-
state: None,
|
|
153
|
-
max_response_bytes: DEFAULT_MAX_RESPONSE_BYTES,
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
pub const DEFAULT_MAX_RESPONSE_BYTES: usize = 100 * 1024 * 1024;
|
|
159
|
-
|
|
160
|
-
/// AuthState keeps the current token so a refreshed token is reused by later
|
|
161
|
-
/// calls, and serializes refreshes so concurrent 401s refresh once.
|
|
162
|
-
pub struct AuthState {
|
|
163
|
-
token: Mutex<Option<String>>,
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
impl AuthState {
|
|
167
|
-
pub fn new(token: Option<String>) -> Self {
|
|
168
|
-
AuthState { token: Mutex::new(token) }
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
pub async fn current(&self) -> Option<String> {
|
|
172
|
-
self.token.lock().await.clone()
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/// refresh calls the hook unless another call already replaced `rejected`.
|
|
176
|
-
pub async fn refresh(
|
|
177
|
-
&self,
|
|
178
|
-
hook: &OnAuthExpiredHook,
|
|
179
|
-
rejected: Option<&str>,
|
|
180
|
-
) -> Result<Option<String>, Error> {
|
|
181
|
-
let mut guard = self.token.lock().await;
|
|
182
|
-
if guard.as_deref() != rejected {
|
|
183
|
-
return Ok(guard.clone());
|
|
184
|
-
}
|
|
185
|
-
let token = hook().await.map_err(|e| Error::AuthExpired(e.to_string()))?;
|
|
186
|
-
if token.is_empty() {
|
|
187
|
-
return Ok(None);
|
|
188
|
-
}
|
|
189
|
-
*guard = Some(token.clone());
|
|
190
|
-
Ok(Some(token))
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
/// default_http_client builds a client that follows redirects on the same
|
|
195
|
-
/// scheme and host only.
|
|
196
|
-
pub fn default_http_client() -> reqwest::Client {
|
|
197
|
-
reqwest::Client::builder()
|
|
198
|
-
.redirect(same_host_redirects())
|
|
199
|
-
.build()
|
|
200
|
-
.unwrap_or_default()
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/// same_host_redirects follows at most 10 redirects, never to another origin.
|
|
204
|
-
pub fn same_host_redirects() -> reqwest::redirect::Policy {
|
|
205
|
-
reqwest::redirect::Policy::custom(|attempt| {
|
|
206
|
-
if attempt.previous().len() >= 10 {
|
|
207
|
-
return attempt.stop();
|
|
208
|
-
}
|
|
209
|
-
let same = attempt
|
|
210
|
-
.previous()
|
|
211
|
-
.first()
|
|
212
|
-
.map(|first| {
|
|
213
|
-
first.scheme() == attempt.url().scheme()
|
|
214
|
-
&& first.host_str() == attempt.url().host_str()
|
|
215
|
-
&& first.port_or_known_default() == attempt.url().port_or_known_default()
|
|
216
|
-
})
|
|
217
|
-
.unwrap_or(false);
|
|
218
|
-
if same {
|
|
219
|
-
attempt.follow()
|
|
220
|
-
} else {
|
|
221
|
-
attempt.stop()
|
|
222
|
-
}
|
|
223
|
-
})
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
/* emit_log invokes the on_log callback if configured, swallowing any panic so a
|
|
227
|
-
faulty logger cannot break the request path. Mirrors Python try/except and Go
|
|
228
|
-
defer recover. */
|
|
229
|
-
fn emit_log(cfg: &ClientConfig, entry: LogEntry) {
|
|
230
|
-
if let Some(ref hook) = cfg.on_log {
|
|
231
|
-
let h = Arc::clone(hook);
|
|
232
|
-
let _ = std::panic::catch_unwind(std::panic::AssertUnwindSafe(move || h(entry)));
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
/* err_status extracts an HTTP status from a typed Error::Api, returning None for
|
|
237
|
-
non-Api errors (Transport/Json/UrlParse/Canceled/Timeout/AuthExpired/Other). */
|
|
238
|
-
fn err_status(err: &Error) -> Option<i32> {
|
|
239
|
-
if let Error::Api(api) = err {
|
|
240
|
-
Some(api.status() as i32)
|
|
241
|
-
} else {
|
|
242
|
-
None
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
/// InvalidationConfig controls cache invalidation behaviour. `stale_time` is in
|
|
247
|
-
/// milliseconds; ≤0 disables the tracker. `stale_max_entries` caps the LRU map
|
|
248
|
-
/// (default 1000 when 0). `max_sources_per_target` caps the `by` list per stale
|
|
249
|
-
/// entry (default 16 when 0).
|
|
250
|
-
#[derive(Clone, Default)]
|
|
251
|
-
pub struct InvalidationConfig {
|
|
252
|
-
pub stale_time: i64,
|
|
253
|
-
pub stale_max_entries: usize,
|
|
254
|
-
pub max_sources_per_target: usize,
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/// ResponseMeta is the owned response snapshot embedded in SdkResult.response.
|
|
258
|
-
/// Populated from a completed RequestResult; all fields are Clone-able.
|
|
259
|
-
pub struct ResponseMeta {
|
|
260
|
-
pub status: u16,
|
|
261
|
-
pub headers: reqwest::header::HeaderMap,
|
|
262
|
-
pub url: String,
|
|
263
|
-
pub body: Vec<u8>,
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
impl ResponseMeta {
|
|
267
|
-
pub(crate) fn empty(status: u16) -> Self {
|
|
268
|
-
ResponseMeta {
|
|
269
|
-
status,
|
|
270
|
-
headers: reqwest::header::HeaderMap::new(),
|
|
271
|
-
url: String::new(),
|
|
272
|
-
body: Vec::new(),
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
/// RequestResult carries the raw bytes, status, headers, and final URL from a completed request.
|
|
278
|
-
#[allow(dead_code)]
|
|
279
|
-
pub(crate) struct RequestResult {
|
|
280
|
-
pub body: Vec<u8>,
|
|
281
|
-
pub status: u16,
|
|
282
|
-
pub headers: reqwest::header::HeaderMap,
|
|
283
|
-
pub url: String,
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
/* ── URLs, path params, query encoding — shared with runtime_sync ── */
|
|
287
|
-
|
|
288
|
-
fn percent_encode(s: &str, keep: &[u8], space_as_plus: bool) -> String {
|
|
289
|
-
const HEX: &[u8; 16] = b"0123456789ABCDEF";
|
|
290
|
-
let mut out = String::with_capacity(s.len());
|
|
291
|
-
for &b in s.as_bytes() {
|
|
292
|
-
if b.is_ascii_alphanumeric() || keep.contains(&b) {
|
|
293
|
-
out.push(b as char);
|
|
294
|
-
} else if b == b' ' && space_as_plus {
|
|
295
|
-
out.push('+');
|
|
296
|
-
} else {
|
|
297
|
-
out.push('%');
|
|
298
|
-
out.push(HEX[(b >> 4) as usize] as char);
|
|
299
|
-
out.push(HEX[(b & 0x0f) as usize] as char);
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
out
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
/// escape_segment encodes like JavaScript's encodeURIComponent, so every SDK
|
|
306
|
-
/// language (and the TypeScript client) sends the same path bytes.
|
|
307
|
-
pub fn escape_segment(s: &str) -> String {
|
|
308
|
-
percent_encode(s, b"-_.!~*'()", false)
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
/// escape_query encodes like URLSearchParams (space becomes '+').
|
|
312
|
-
pub fn escape_query(s: &str) -> String {
|
|
313
|
-
percent_encode(s, b"*-._", true)
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
fn missing(name: &str) -> Error {
|
|
317
|
-
Error::Other(format!("Missing path param: {}", name))
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
fn encode_segment_value(name: &str, value: &str) -> Result<String, Error> {
|
|
321
|
-
if value.is_empty() || value == "." || value == ".." {
|
|
322
|
-
return Err(Error::Other(format!(
|
|
323
|
-
"Invalid path param {:?}: {:?} is not a path segment",
|
|
324
|
-
name, value
|
|
325
|
-
)));
|
|
326
|
-
}
|
|
327
|
-
Ok(escape_segment(value))
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
/// expand_path fills a path template with the TypeScript client's grammar:
|
|
331
|
-
/// `:name` / `:name?` take a whole segment, a final `*name` takes the rest,
|
|
332
|
-
/// `{name}` may sit inside a segment. Values are encoded; "", "." and ".."
|
|
333
|
-
/// are rejected.
|
|
334
|
-
pub fn expand_path(template: &str, params: &[(&str, &str)]) -> Result<String, Error> {
|
|
335
|
-
let get = |name: &str| params.iter().find(|(k, _)| *k == name).map(|(_, v)| *v);
|
|
336
|
-
let segments: Vec<&str> = template.split('/').collect();
|
|
337
|
-
let mut out: Vec<String> = Vec::with_capacity(segments.len());
|
|
338
|
-
for (i, seg) in segments.iter().enumerate() {
|
|
339
|
-
if seg.len() > 1 && seg.starts_with(':') {
|
|
340
|
-
let optional = seg.ends_with('?');
|
|
341
|
-
let name = if optional { &seg[1..seg.len() - 1] } else { &seg[1..] };
|
|
342
|
-
match get(name) {
|
|
343
|
-
Some(v) => out.push(encode_segment_value(name, v)?),
|
|
344
|
-
None if optional => continue,
|
|
345
|
-
None => return Err(missing(name)),
|
|
346
|
-
}
|
|
347
|
-
} else if seg.starts_with('*') && i == segments.len() - 1 {
|
|
348
|
-
let name = if seg.len() > 1 { &seg[1..] } else { "*" };
|
|
349
|
-
match get(name) {
|
|
350
|
-
Some("") => out.push(String::new()),
|
|
351
|
-
Some(v) => {
|
|
352
|
-
let parts: Result<Vec<String>, Error> =
|
|
353
|
-
v.split('/').map(|p| encode_segment_value(name, p)).collect();
|
|
354
|
-
out.push(parts?.join("/"));
|
|
355
|
-
}
|
|
356
|
-
None if seg.len() == 1 => out.push(String::new()),
|
|
357
|
-
None => return Err(missing(name)),
|
|
358
|
-
}
|
|
359
|
-
} else {
|
|
360
|
-
let mut piece = String::with_capacity(seg.len());
|
|
361
|
-
let mut rest: &str = seg;
|
|
362
|
-
loop {
|
|
363
|
-
let open = rest.find('{');
|
|
364
|
-
let close = open.and_then(|o| rest[o..].find('}').map(|c| o + c));
|
|
365
|
-
match (open, close) {
|
|
366
|
-
(Some(o), Some(c)) if !rest[o + 1..c].contains('{') => {
|
|
367
|
-
let name = &rest[o + 1..c];
|
|
368
|
-
let v = get(name).ok_or_else(|| missing(name))?;
|
|
369
|
-
piece.push_str(&rest[..o]);
|
|
370
|
-
piece.push_str(&encode_segment_value(name, v)?);
|
|
371
|
-
rest = &rest[c + 1..];
|
|
372
|
-
}
|
|
373
|
-
_ => {
|
|
374
|
-
piece.push_str(rest);
|
|
375
|
-
break;
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
out.push(piece);
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
Ok(out.join("/"))
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
/// format_f64 renders a float like JavaScript's Number#toString, so every SDK
|
|
386
|
-
/// language sends the same query bytes: shortest round-trip digits, fixed
|
|
387
|
-
/// notation for 1e-6 <= |v| < 1e21, otherwise `<mantissa>e±<exp>`.
|
|
388
|
-
pub fn format_f64(v: f64) -> String {
|
|
389
|
-
if v.is_nan() {
|
|
390
|
-
return "NaN".to_string();
|
|
391
|
-
}
|
|
392
|
-
if v.is_infinite() {
|
|
393
|
-
return if v > 0.0 { "Infinity" } else { "-Infinity" }.to_string();
|
|
394
|
-
}
|
|
395
|
-
if v == 0.0 {
|
|
396
|
-
return "0".to_string();
|
|
397
|
-
}
|
|
398
|
-
/* `{:e}` gives the shortest round-trip digits: "-1.2345678901234568e20" */
|
|
399
|
-
let sci = format!("{:e}", v);
|
|
400
|
-
let (mantissa, exp) = sci.split_once('e').unwrap_or((sci.as_str(), "0"));
|
|
401
|
-
let exp: i32 = exp.parse().unwrap_or(0);
|
|
402
|
-
let (sign, mantissa) = match mantissa.strip_prefix('-') {
|
|
403
|
-
Some(m) => ("-", m),
|
|
404
|
-
None => ("", mantissa),
|
|
405
|
-
};
|
|
406
|
-
let digits: String = mantissa.chars().filter(|c| *c != '.').collect();
|
|
407
|
-
let abs = v.abs();
|
|
408
|
-
if !(1e-6..1e21).contains(&abs) {
|
|
409
|
-
return format!("{}{}e{}{}", sign, mantissa, if exp > 0 { "+" } else { "-" }, exp.abs());
|
|
410
|
-
}
|
|
411
|
-
let n = digits.len() as i32;
|
|
412
|
-
let body = if exp >= n - 1 {
|
|
413
|
-
format!("{}{}", digits, "0".repeat((exp - (n - 1)) as usize))
|
|
414
|
-
} else if exp >= 0 {
|
|
415
|
-
let split = (exp + 1) as usize;
|
|
416
|
-
format!("{}.{}", &digits[..split], &digits[split..])
|
|
417
|
-
} else {
|
|
418
|
-
format!("0.{}{}", "0".repeat((-exp - 1) as usize), digits)
|
|
419
|
-
};
|
|
420
|
-
format!("{}{}", sign, body)
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
/// QueryValue renders a value as one or more query strings: scalars once,
|
|
424
|
-
/// sequences once per element, None not at all.
|
|
425
|
-
pub trait QueryValue {
|
|
426
|
-
fn push_query(&self, key: &str, out: &mut Vec<(String, String)>);
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
macro_rules! display_query_value {
|
|
430
|
-
($($t:ty),*) => {$(
|
|
431
|
-
impl QueryValue for $t {
|
|
432
|
-
fn push_query(&self, key: &str, out: &mut Vec<(String, String)>) {
|
|
433
|
-
out.push((key.to_string(), self.to_string()));
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
)*};
|
|
437
|
-
}
|
|
438
|
-
display_query_value!(String, str, bool, i8, i16, i32, i64, u8, u16, u32, u64, usize, isize);
|
|
439
|
-
|
|
440
|
-
impl QueryValue for f64 {
|
|
441
|
-
fn push_query(&self, key: &str, out: &mut Vec<(String, String)>) {
|
|
442
|
-
out.push((key.to_string(), format_f64(*self)));
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
impl QueryValue for f32 {
|
|
447
|
-
fn push_query(&self, key: &str, out: &mut Vec<(String, String)>) {
|
|
448
|
-
out.push((key.to_string(), format_f64(*self as f64)));
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
impl<T: QueryValue + ?Sized> QueryValue for &T {
|
|
453
|
-
fn push_query(&self, key: &str, out: &mut Vec<(String, String)>) {
|
|
454
|
-
(**self).push_query(key, out)
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
impl<T: QueryValue> QueryValue for Option<T> {
|
|
459
|
-
fn push_query(&self, key: &str, out: &mut Vec<(String, String)>) {
|
|
460
|
-
if let Some(v) = self {
|
|
461
|
-
v.push_query(key, out)
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
impl<T: QueryValue> QueryValue for Vec<T> {
|
|
467
|
-
fn push_query(&self, key: &str, out: &mut Vec<(String, String)>) {
|
|
468
|
-
for v in self {
|
|
469
|
-
v.push_query(key, out)
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
impl QueryValue for serde_json::Value {
|
|
475
|
-
fn push_query(&self, key: &str, out: &mut Vec<(String, String)>) {
|
|
476
|
-
match self {
|
|
477
|
-
serde_json::Value::Null => {}
|
|
478
|
-
serde_json::Value::String(s) => out.push((key.to_string(), s.clone())),
|
|
479
|
-
serde_json::Value::Bool(b) => out.push((key.to_string(), b.to_string())),
|
|
480
|
-
serde_json::Value::Number(n) => {
|
|
481
|
-
let s = if n.is_f64() { format_f64(n.as_f64().unwrap_or_default()) } else { n.to_string() };
|
|
482
|
-
out.push((key.to_string(), s))
|
|
483
|
-
}
|
|
484
|
-
serde_json::Value::Array(items) => {
|
|
485
|
-
for item in items {
|
|
486
|
-
item.push_query(key, out)
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
other => out.push((key.to_string(), other.to_string())),
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
/// query_value_of serializes an enum or other Serialize value and pushes it as
|
|
495
|
-
/// a query value (a JSON string becomes its bare text).
|
|
496
|
-
pub fn push_serialized<T: serde::Serialize>(key: &str, value: &T, out: &mut Vec<(String, String)>) {
|
|
497
|
-
if let Ok(v) = serde_json::to_value(value) {
|
|
498
|
-
v.push_query(key, out)
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
/// form_pairs flattens a serialized body object into form fields (arrays repeat the key).
|
|
503
|
-
pub fn form_pairs<T: serde::Serialize>(body: &T) -> Vec<(String, String)> {
|
|
504
|
-
let mut out = Vec::new();
|
|
505
|
-
if let Ok(serde_json::Value::Object(map)) = serde_json::to_value(body) {
|
|
506
|
-
let mut keys: Vec<&String> = map.keys().collect();
|
|
507
|
-
keys.sort();
|
|
508
|
-
for k in keys {
|
|
509
|
-
map[k].push_query(k, &mut out);
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
out
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
/// encode_query joins pairs with every byte outside the unreserved set escaped.
|
|
516
|
-
pub fn encode_query(pairs: &[(String, String)]) -> String {
|
|
517
|
-
pairs
|
|
518
|
-
.iter()
|
|
519
|
-
.map(|(k, v)| format!("{}={}", escape_query(k), escape_query(v)))
|
|
520
|
-
.collect::<Vec<_>>()
|
|
521
|
-
.join("&")
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
/// build_url joins base and an already-escaped path, keeping the base path and
|
|
525
|
-
/// base query, then appends the query pairs.
|
|
526
|
-
pub fn build_url(base_url: &str, path: &str, query: &[(String, String)]) -> Result<url::Url, Error> {
|
|
527
|
-
let mut url = url::Url::parse(base_url)?;
|
|
528
|
-
if url.cannot_be_a_base() || url.host_str().is_none() {
|
|
529
|
-
return Err(Error::Other(format!("base URL {:?} needs a scheme and host", base_url)));
|
|
530
|
-
}
|
|
531
|
-
let path = if path.starts_with('/') { path.to_string() } else { format!("/{}", path) };
|
|
532
|
-
let joined = format!("{}{}", url.path().trim_end_matches('/'), path);
|
|
533
|
-
url.set_path(&joined);
|
|
534
|
-
url.set_fragment(None);
|
|
535
|
-
let extra = encode_query(query);
|
|
536
|
-
let q = match (url.query(), extra.is_empty()) {
|
|
537
|
-
(Some(existing), false) if !existing.is_empty() => Some(format!("{}&{}", existing, extra)),
|
|
538
|
-
(_, false) => Some(extra),
|
|
539
|
-
(existing, true) => existing.map(|s| s.to_string()),
|
|
540
|
-
};
|
|
541
|
-
url.set_query(q.as_deref());
|
|
542
|
-
Ok(url)
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
/// set_header inserts `name` replacing any other casing of it.
|
|
546
|
-
pub fn set_header(headers: &mut HashMap<String, String>, name: &str, value: String) {
|
|
547
|
-
headers.retain(|k, _| !k.eq_ignore_ascii_case(name));
|
|
548
|
-
headers.insert(name.to_string(), value);
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
/// merged_headers merges config headers, then per-call headers, then auth, then
|
|
552
|
-
/// an X-Request-Id when absent — case-insensitively, later wins.
|
|
553
|
-
pub(crate) fn merged_headers(
|
|
554
|
-
cfg_headers: &HashMap<String, String>,
|
|
555
|
-
call_headers: Option<&HashMap<String, String>>,
|
|
556
|
-
auth_header_name: Option<&str>,
|
|
557
|
-
auth_header_prefix: Option<&str>,
|
|
558
|
-
bearer_token: Option<&str>,
|
|
559
|
-
) -> HashMap<String, String> {
|
|
560
|
-
let mut out = HashMap::new();
|
|
561
|
-
let mut cfg: Vec<(&String, &String)> = cfg_headers.iter().collect();
|
|
562
|
-
cfg.sort();
|
|
563
|
-
for (k, v) in cfg {
|
|
564
|
-
set_header(&mut out, k, v.clone());
|
|
565
|
-
}
|
|
566
|
-
if let Some(ch) = call_headers {
|
|
567
|
-
let mut call: Vec<(&String, &String)> = ch.iter().collect();
|
|
568
|
-
call.sort();
|
|
569
|
-
for (k, v) in call {
|
|
570
|
-
set_header(&mut out, k, v.clone());
|
|
571
|
-
}
|
|
572
|
-
}
|
|
573
|
-
if let Some(token) = bearer_token {
|
|
574
|
-
if !token.is_empty() {
|
|
575
|
-
let name = auth_header_name.unwrap_or("Authorization");
|
|
576
|
-
let prefix = auth_header_prefix.unwrap_or("Bearer ");
|
|
577
|
-
set_header(&mut out, name, format!("{}{}", prefix, token));
|
|
578
|
-
}
|
|
579
|
-
}
|
|
580
|
-
if !out.keys().any(|k| k.eq_ignore_ascii_case("x-request-id")) {
|
|
581
|
-
out.insert("x-request-id".to_string(), Uuid::new_v4().to_string());
|
|
582
|
-
}
|
|
583
|
-
out
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
/// map_send_error keeps the cause: a refused connection, DNS or TLS failure is
|
|
587
|
-
/// a Transport error, never "canceled".
|
|
588
|
-
pub(crate) fn map_send_error(e: reqwest::Error) -> Error {
|
|
589
|
-
if e.is_timeout() {
|
|
590
|
-
Error::Timeout
|
|
591
|
-
} else {
|
|
592
|
-
Error::Transport(e)
|
|
593
|
-
}
|
|
594
|
-
}
|
|
595
|
-
|
|
596
|
-
async fn read_capped(mut resp: reqwest::Response, limit: usize) -> Result<Vec<u8>, Error> {
|
|
597
|
-
let mut out = Vec::new();
|
|
598
|
-
while let Some(chunk) = resp.chunk().await.map_err(map_send_error)? {
|
|
599
|
-
if limit > 0 && out.len() + chunk.len() > limit {
|
|
600
|
-
return Err(Error::Other(format!("response body exceeds {} bytes", limit)));
|
|
601
|
-
}
|
|
602
|
-
out.extend_from_slice(&chunk);
|
|
603
|
-
}
|
|
604
|
-
Ok(out)
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
/// do_request executes an HTTP request, injects auth, merges headers, handles
|
|
608
|
-
/// on_auth_expired retry on 401, fires on_request/on_response hooks, and wraps
|
|
609
|
-
/// errors into typed Error variants. Emits on_log lifecycle entries (request_start
|
|
610
|
-
/// once at entry, response_received once for the final response, error on terminal
|
|
611
|
-
/// failure) — matching TS/Python/Go behavior where retry rounds do not double-emit.
|
|
612
|
-
#[allow(clippy::too_many_arguments)]
|
|
613
|
-
pub(crate) async fn do_request(
|
|
614
|
-
client: &reqwest::Client,
|
|
615
|
-
cfg: &ClientConfig,
|
|
616
|
-
auth: &AuthState,
|
|
617
|
-
method: reqwest::Method,
|
|
618
|
-
raw_url: &str,
|
|
619
|
-
query: &[(String, String)],
|
|
620
|
-
body: RequestBody<'_>,
|
|
621
|
-
call_headers: Option<&HashMap<String, String>>,
|
|
622
|
-
timeout: Option<std::time::Duration>,
|
|
623
|
-
cancel_token: Option<CancellationToken>,
|
|
624
|
-
operation: &str,
|
|
625
|
-
request_meta: Option<&crate::invalidation::RequestMeta>,
|
|
626
|
-
) -> Result<RequestResult, Error> {
|
|
627
|
-
let start = std::time::Instant::now();
|
|
628
|
-
let log_error = |e: &Error| {
|
|
629
|
-
emit_log(
|
|
630
|
-
cfg,
|
|
631
|
-
LogEntry {
|
|
632
|
-
level: "error".to_string(),
|
|
633
|
-
event: "error".to_string(),
|
|
634
|
-
operation: operation.to_string(),
|
|
635
|
-
duration_ms: start.elapsed().as_millis() as i64,
|
|
636
|
-
status: err_status(e),
|
|
637
|
-
error: Some(format!("{:?}", e)),
|
|
638
|
-
},
|
|
639
|
-
)
|
|
640
|
-
};
|
|
641
|
-
|
|
642
|
-
/* Pre-flight cancellation check — short-circuit before any work. */
|
|
643
|
-
if let Some(ref tok) = cancel_token {
|
|
644
|
-
if tok.is_cancelled() {
|
|
645
|
-
log_error(&Error::Canceled);
|
|
646
|
-
return Err(Error::Canceled);
|
|
647
|
-
}
|
|
648
|
-
}
|
|
649
|
-
|
|
650
|
-
emit_log(
|
|
651
|
-
cfg,
|
|
652
|
-
LogEntry {
|
|
653
|
-
level: "debug".to_string(),
|
|
654
|
-
event: "request_start".to_string(),
|
|
655
|
-
operation: operation.to_string(),
|
|
656
|
-
duration_ms: 0,
|
|
657
|
-
status: None,
|
|
658
|
-
error: None,
|
|
659
|
-
},
|
|
660
|
-
);
|
|
661
|
-
|
|
662
|
-
/* Json/FormUrl/Raw can be sent again; Multipart + Stream own non-Clone values */
|
|
663
|
-
let retry_body: Option<RequestBody<'_>> = match &body {
|
|
664
|
-
RequestBody::None => Some(RequestBody::None),
|
|
665
|
-
RequestBody::Json(v) => Some(RequestBody::Json(v)),
|
|
666
|
-
RequestBody::FormUrl(m) => Some(RequestBody::FormUrl(m.clone())),
|
|
667
|
-
RequestBody::Raw(ct, b) => Some(RequestBody::Raw(ct, b.clone())),
|
|
668
|
-
RequestBody::Multipart(_) => None,
|
|
669
|
-
RequestBody::Stream(_) => None,
|
|
670
|
-
};
|
|
671
|
-
|
|
672
|
-
let token = auth.current().await;
|
|
673
|
-
let mut result = match execute_request(
|
|
674
|
-
client,
|
|
675
|
-
cfg,
|
|
676
|
-
method.clone(),
|
|
677
|
-
raw_url,
|
|
678
|
-
query,
|
|
679
|
-
body,
|
|
680
|
-
call_headers,
|
|
681
|
-
token.as_deref(),
|
|
682
|
-
false,
|
|
683
|
-
timeout,
|
|
684
|
-
cancel_token.clone(),
|
|
685
|
-
request_meta,
|
|
686
|
-
)
|
|
687
|
-
.await
|
|
688
|
-
{
|
|
689
|
-
Ok(r) => r,
|
|
690
|
-
Err(e) => {
|
|
691
|
-
log_error(&e);
|
|
692
|
-
return Err(e);
|
|
693
|
-
}
|
|
694
|
-
};
|
|
695
|
-
|
|
696
|
-
if result.status == 401 {
|
|
697
|
-
if let (Some(hook), Some(retry)) = (cfg.on_auth_expired.as_ref(), retry_body) {
|
|
698
|
-
let new_token = match auth.refresh(hook, token.as_deref()).await {
|
|
699
|
-
Ok(t) => t,
|
|
700
|
-
Err(e) => {
|
|
701
|
-
log_error(&e);
|
|
702
|
-
return Err(e);
|
|
703
|
-
}
|
|
704
|
-
};
|
|
705
|
-
if let Some(new_token) = new_token {
|
|
706
|
-
result = match execute_request(
|
|
707
|
-
client,
|
|
708
|
-
cfg,
|
|
709
|
-
method,
|
|
710
|
-
raw_url,
|
|
711
|
-
query,
|
|
712
|
-
retry,
|
|
713
|
-
call_headers,
|
|
714
|
-
Some(&new_token),
|
|
715
|
-
true,
|
|
716
|
-
timeout,
|
|
717
|
-
cancel_token,
|
|
718
|
-
request_meta,
|
|
719
|
-
)
|
|
720
|
-
.await
|
|
721
|
-
{
|
|
722
|
-
Ok(r) => r,
|
|
723
|
-
Err(e) => {
|
|
724
|
-
log_error(&e);
|
|
725
|
-
return Err(e);
|
|
726
|
-
}
|
|
727
|
-
};
|
|
728
|
-
}
|
|
729
|
-
}
|
|
730
|
-
}
|
|
731
|
-
|
|
732
|
-
let status_i32 = result.status as i32;
|
|
733
|
-
let level = if result.status >= 400 { "warn" } else { "info" };
|
|
734
|
-
emit_log(
|
|
735
|
-
cfg,
|
|
736
|
-
LogEntry {
|
|
737
|
-
level: level.to_string(),
|
|
738
|
-
event: "response_received".to_string(),
|
|
739
|
-
operation: operation.to_string(),
|
|
740
|
-
duration_ms: start.elapsed().as_millis() as i64,
|
|
741
|
-
status: Some(status_i32),
|
|
742
|
-
error: None,
|
|
743
|
-
},
|
|
744
|
-
);
|
|
745
|
-
|
|
746
|
-
if !(200..300).contains(&result.status) {
|
|
747
|
-
if let Some(err) = raise_for_status(result.status, std::mem::take(&mut result.body)) {
|
|
748
|
-
log_error(&err);
|
|
749
|
-
return Err(err);
|
|
750
|
-
}
|
|
751
|
-
}
|
|
752
|
-
|
|
753
|
-
Ok(result)
|
|
754
|
-
}
|
|
755
|
-
|
|
756
|
-
#[allow(clippy::too_many_arguments)]
|
|
757
|
-
async fn build_request(
|
|
758
|
-
client: &reqwest::Client,
|
|
759
|
-
cfg: &ClientConfig,
|
|
760
|
-
method: reqwest::Method,
|
|
761
|
-
raw_url: &str,
|
|
762
|
-
query: &[(String, String)],
|
|
763
|
-
body: RequestBody<'_>,
|
|
764
|
-
call_headers: Option<&HashMap<String, String>>,
|
|
765
|
-
bearer_token: Option<&str>,
|
|
766
|
-
is_retry: bool,
|
|
767
|
-
request_meta: Option<&crate::invalidation::RequestMeta>,
|
|
768
|
-
) -> Result<(reqwest::RequestBuilder, Arc<Mutex<HashMap<String, serde_json::Value>>>), Error> {
|
|
769
|
-
let url = build_url(&cfg.base_url, raw_url, query)?;
|
|
770
|
-
|
|
771
|
-
let mut hook_headers = merged_headers(
|
|
772
|
-
&cfg.headers,
|
|
773
|
-
call_headers,
|
|
774
|
-
cfg.auth_header_name.as_deref(),
|
|
775
|
-
cfg.auth_header_prefix.as_deref(),
|
|
776
|
-
bearer_token,
|
|
777
|
-
);
|
|
778
|
-
match &body {
|
|
779
|
-
RequestBody::Json(_) => set_header(&mut hook_headers, "Content-Type", "application/json".into()),
|
|
780
|
-
RequestBody::FormUrl(_) => set_header(
|
|
781
|
-
&mut hook_headers,
|
|
782
|
-
"Content-Type",
|
|
783
|
-
"application/x-www-form-urlencoded".into(),
|
|
784
|
-
),
|
|
785
|
-
RequestBody::Raw(ct, _) => set_header(&mut hook_headers, "Content-Type", ct.to_string()),
|
|
786
|
-
RequestBody::Stream(_) => {
|
|
787
|
-
if !hook_headers.keys().any(|k| k.eq_ignore_ascii_case("content-type")) {
|
|
788
|
-
set_header(&mut hook_headers, "Content-Type", "application/octet-stream".into());
|
|
789
|
-
}
|
|
790
|
-
}
|
|
791
|
-
RequestBody::Multipart(_) | RequestBody::None => {}
|
|
792
|
-
}
|
|
793
|
-
|
|
794
|
-
let state = cfg
|
|
795
|
-
.state
|
|
796
|
-
.clone()
|
|
797
|
-
.unwrap_or_else(|| Arc::new(Mutex::new(HashMap::new())));
|
|
798
|
-
|
|
799
|
-
let (meta_selector, meta_is_stale, meta_by) = match request_meta {
|
|
800
|
-
Some(m) => (m.selector.clone(), m.is_stale, m.invalidated_by.clone()),
|
|
801
|
-
None => (String::new(), false, Vec::new()),
|
|
802
|
-
};
|
|
803
|
-
|
|
804
|
-
let mut req_ctx = RequestContext {
|
|
805
|
-
method: method.clone(),
|
|
806
|
-
url: url.to_string(),
|
|
807
|
-
path: raw_url.to_string(),
|
|
808
|
-
headers: hook_headers,
|
|
809
|
-
state: Arc::clone(&state),
|
|
810
|
-
is_retry,
|
|
811
|
-
selector: meta_selector,
|
|
812
|
-
is_stale: meta_is_stale,
|
|
813
|
-
invalidated_by: meta_by,
|
|
814
|
-
};
|
|
815
|
-
|
|
816
|
-
for hook in cfg.on_request.iter() {
|
|
817
|
-
hook(&mut req_ctx).await?;
|
|
818
|
-
}
|
|
819
|
-
|
|
820
|
-
let mut req = client.request(req_ctx.method.clone(), &req_ctx.url);
|
|
821
|
-
for (k, v) in &req_ctx.headers {
|
|
822
|
-
req = req.header(k.as_str(), v.as_str());
|
|
823
|
-
}
|
|
824
|
-
req = match body {
|
|
825
|
-
RequestBody::Json(v) => req.body(serde_json::to_vec(v)?),
|
|
826
|
-
RequestBody::FormUrl(pairs) => req.body(encode_query(&pairs)),
|
|
827
|
-
RequestBody::Raw(_, b) => req.body(b),
|
|
828
|
-
RequestBody::Multipart(f) => req.multipart(f),
|
|
829
|
-
RequestBody::Stream(b) => req.body(b),
|
|
830
|
-
RequestBody::None => req,
|
|
831
|
-
};
|
|
832
|
-
Ok((req, state))
|
|
833
|
-
}
|
|
834
|
-
|
|
835
|
-
#[allow(clippy::too_many_arguments)]
|
|
836
|
-
async fn execute_request(
|
|
837
|
-
client: &reqwest::Client,
|
|
838
|
-
cfg: &ClientConfig,
|
|
839
|
-
method: reqwest::Method,
|
|
840
|
-
raw_url: &str,
|
|
841
|
-
query: &[(String, String)],
|
|
842
|
-
body: RequestBody<'_>,
|
|
843
|
-
call_headers: Option<&HashMap<String, String>>,
|
|
844
|
-
bearer_token: Option<&str>,
|
|
845
|
-
is_retry: bool,
|
|
846
|
-
per_call_timeout: Option<std::time::Duration>,
|
|
847
|
-
cancel_token: Option<CancellationToken>,
|
|
848
|
-
request_meta: Option<&crate::invalidation::RequestMeta>,
|
|
849
|
-
) -> Result<RequestResult, Error> {
|
|
850
|
-
let (mut req, state) = build_request(
|
|
851
|
-
client,
|
|
852
|
-
cfg,
|
|
853
|
-
method,
|
|
854
|
-
raw_url,
|
|
855
|
-
query,
|
|
856
|
-
body,
|
|
857
|
-
call_headers,
|
|
858
|
-
bearer_token,
|
|
859
|
-
is_retry,
|
|
860
|
-
request_meta,
|
|
861
|
-
)
|
|
862
|
-
.await?;
|
|
863
|
-
|
|
864
|
-
/* per-call timeout overrides cfg.timeout; ZERO means no timeout */
|
|
865
|
-
let effective_timeout = per_call_timeout.unwrap_or(cfg.timeout);
|
|
866
|
-
if !effective_timeout.is_zero() {
|
|
867
|
-
req = req.timeout(effective_timeout);
|
|
868
|
-
}
|
|
869
|
-
|
|
870
|
-
/* Race send + body read against cancel_token so external cancellation wins. */
|
|
871
|
-
let work = async {
|
|
872
|
-
let resp = req.send().await.map_err(map_send_error)?;
|
|
873
|
-
let status = resp.status().as_u16();
|
|
874
|
-
let resp_headers = resp.headers().clone();
|
|
875
|
-
let resp_url = resp.url().to_string();
|
|
876
|
-
let body = read_capped(resp, cfg.max_response_bytes).await?;
|
|
877
|
-
Ok::<_, Error>((status, resp_headers, resp_url, body))
|
|
878
|
-
};
|
|
879
|
-
let (status, resp_headers, resp_url, body_bytes) = match cancel_token {
|
|
880
|
-
Some(tok) => {
|
|
881
|
-
tokio::select! {
|
|
882
|
-
biased;
|
|
883
|
-
_ = tok.cancelled() => return Err(Error::Canceled),
|
|
884
|
-
r = work => r?,
|
|
885
|
-
}
|
|
886
|
-
}
|
|
887
|
-
None => work.await?,
|
|
888
|
-
};
|
|
889
|
-
|
|
890
|
-
let (meta_selector, meta_is_stale, meta_by) = match request_meta {
|
|
891
|
-
Some(m) => (m.selector.clone(), m.is_stale, m.invalidated_by.clone()),
|
|
892
|
-
None => (String::new(), false, Vec::new()),
|
|
893
|
-
};
|
|
894
|
-
let mut resp_ctx = ResponseContext {
|
|
895
|
-
status,
|
|
896
|
-
response: body_bytes,
|
|
897
|
-
headers: resp_headers,
|
|
898
|
-
state,
|
|
899
|
-
is_retry,
|
|
900
|
-
selector: meta_selector,
|
|
901
|
-
is_stale: meta_is_stale,
|
|
902
|
-
invalidated_by: meta_by,
|
|
903
|
-
};
|
|
904
|
-
|
|
905
|
-
for hook in cfg.on_response.iter() {
|
|
906
|
-
hook(&mut resp_ctx).await?;
|
|
907
|
-
}
|
|
908
|
-
|
|
909
|
-
Ok(RequestResult {
|
|
910
|
-
body: resp_ctx.response,
|
|
911
|
-
status,
|
|
912
|
-
headers: resp_ctx.headers,
|
|
913
|
-
url: resp_url,
|
|
914
|
-
})
|
|
915
|
-
}
|
|
916
|
-
|
|
917
|
-
/// open_stream sends a streaming request (SSE) through the same URL, header,
|
|
918
|
-
/// auth and hook pipeline as a regular request, without a body-read timeout.
|
|
919
|
-
/// A non-2xx status becomes a typed error.
|
|
920
|
-
#[allow(clippy::too_many_arguments)]
|
|
921
|
-
pub(crate) async fn open_stream(
|
|
922
|
-
client: &reqwest::Client,
|
|
923
|
-
cfg: &ClientConfig,
|
|
924
|
-
auth: &AuthState,
|
|
925
|
-
method: reqwest::Method,
|
|
926
|
-
raw_url: &str,
|
|
927
|
-
query: &[(String, String)],
|
|
928
|
-
body: RequestBody<'_>,
|
|
929
|
-
call_headers: Option<&HashMap<String, String>>,
|
|
930
|
-
) -> Result<reqwest::Response, Error> {
|
|
931
|
-
let token = auth.current().await;
|
|
932
|
-
let (req, _state) = build_request(
|
|
933
|
-
client,
|
|
934
|
-
cfg,
|
|
935
|
-
method,
|
|
936
|
-
raw_url,
|
|
937
|
-
query,
|
|
938
|
-
body,
|
|
939
|
-
call_headers,
|
|
940
|
-
token.as_deref(),
|
|
941
|
-
false,
|
|
942
|
-
None,
|
|
943
|
-
)
|
|
944
|
-
.await?;
|
|
945
|
-
let resp = req.send().await.map_err(map_send_error)?;
|
|
946
|
-
let status = resp.status().as_u16();
|
|
947
|
-
if !(200..300).contains(&status) {
|
|
948
|
-
let body = read_capped(resp, 64 * 1024).await.unwrap_or_default();
|
|
949
|
-
return Err(raise_for_status(status, body).unwrap_or(Error::Other(format!("status {}", status))));
|
|
950
|
-
}
|
|
951
|
-
Ok(resp)
|
|
952
|
-
}
|
|
953
|
-
|
|
954
|
-
/// auth_headers returns config headers, extra headers and the auth header, for
|
|
955
|
-
/// transports that cannot run the request pipeline (WebSocket dials).
|
|
956
|
-
pub(crate) async fn auth_headers(
|
|
957
|
-
cfg: &ClientConfig,
|
|
958
|
-
auth: &AuthState,
|
|
959
|
-
extra: Option<&HashMap<String, String>>,
|
|
960
|
-
) -> HashMap<String, String> {
|
|
961
|
-
let token = auth.current().await;
|
|
962
|
-
merged_headers(
|
|
963
|
-
&cfg.headers,
|
|
964
|
-
extra,
|
|
965
|
-
cfg.auth_header_name.as_deref(),
|
|
966
|
-
cfg.auth_header_prefix.as_deref(),
|
|
967
|
-
token.as_deref(),
|
|
968
|
-
)
|
|
969
|
-
}
|
|
970
|
-
|
|
971
|
-
/// to_ws_url swaps the scheme only; a URL inside the query string is untouched.
|
|
972
|
-
pub fn to_ws_url(url: &str) -> String {
|
|
973
|
-
if let Some(rest) = url.strip_prefix("https://") {
|
|
974
|
-
format!("wss://{}", rest)
|
|
975
|
-
} else if let Some(rest) = url.strip_prefix("http://") {
|
|
976
|
-
format!("ws://{}", rest)
|
|
977
|
-
} else {
|
|
978
|
-
url.to_string()
|
|
979
|
-
}
|
|
980
|
-
}
|