@lovrozagar/honey 0.7.3 → 1.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +36 -1969
- package/bin/honey.js +87 -27
- package/dist/adapters/bun/serve.d.ts +18 -0
- package/dist/adapters/bun/serve.js +89 -0
- package/dist/adapters/fetch-request.d.ts +20 -0
- package/dist/adapters/fetch-request.js +29 -0
- package/dist/adapters/node/headers.d.ts +27 -0
- package/dist/adapters/node/headers.js +86 -0
- package/dist/adapters/node/request.d.ts +16 -0
- package/dist/adapters/node/request.js +214 -0
- package/dist/adapters/node/response.d.ts +11 -0
- package/dist/adapters/node/response.js +126 -0
- package/dist/adapters/node/serve.d.ts +39 -0
- package/dist/adapters/node/serve.js +205 -0
- package/dist/adapters/node/url.d.ts +13 -0
- package/dist/adapters/node/url.js +87 -0
- package/dist/adapters/serve.d.ts +36 -0
- package/dist/adapters/serve.js +52 -0
- package/dist/build/artifacts.d.ts +34 -0
- package/dist/build/artifacts.js +123 -0
- package/dist/build/cli-args.d.ts +30 -0
- package/dist/build/cli-args.js +97 -0
- package/dist/build/cli.d.ts +11 -0
- package/dist/build/cli.js +150 -0
- package/dist/build/config.d.ts +102 -0
- package/dist/build/config.js +89 -0
- package/dist/build/generate.d.ts +19 -0
- package/dist/build/generate.js +80 -0
- package/dist/build/glob.d.ts +8 -0
- package/dist/build/glob.js +97 -0
- package/dist/build/index.d.ts +3 -58
- package/dist/build/index.js +3 -173
- package/dist/build/init.d.ts +3 -0
- package/dist/build/init.js +131 -0
- package/dist/build/loaders.d.ts +33 -0
- package/dist/build/loaders.js +105 -0
- package/dist/build/plugin.d.ts +52 -0
- package/dist/build/plugin.js +146 -0
- package/dist/build/source.d.ts +21 -0
- package/dist/build/source.js +100 -0
- package/dist/build/targets.d.ts +59 -0
- package/dist/build/targets.js +107 -0
- package/dist/context/context.d.ts +111 -0
- package/dist/context/context.js +213 -0
- package/dist/context/cookie-sign.d.ts +38 -0
- package/dist/context/cookie-sign.js +113 -0
- package/dist/context/cookie.d.ts +28 -0
- package/dist/context/cookie.js +142 -0
- package/dist/context/peer.d.ts +34 -0
- package/dist/context/peer.js +190 -0
- package/dist/errors/error.d.ts +60 -0
- package/dist/errors/error.js +84 -0
- package/dist/errors/errors.d.ts +45 -0
- package/dist/errors/errors.js +31 -0
- package/dist/errors/on-error.d.ts +10 -0
- package/dist/errors/on-error.js +204 -0
- package/dist/errors/problem-json.d.ts +14 -0
- package/dist/errors/problem-json.js +58 -0
- package/dist/errors/projector.d.ts +50 -0
- package/dist/errors/projector.js +107 -0
- package/dist/i18n/error-i18n.d.ts +26 -0
- package/dist/i18n/error-i18n.js +77 -0
- package/dist/i18n/i18n.d.ts +21 -0
- package/dist/i18n/i18n.js +40 -0
- package/dist/i18n/icu.d.ts +29 -0
- package/dist/i18n/icu.js +170 -0
- package/dist/i18n/index.d.ts +4 -0
- package/dist/i18n/index.js +3 -0
- package/dist/index.d.ts +30 -746
- package/dist/index.js +12 -2364
- package/dist/input/accepts.d.ts +5 -0
- package/dist/input/accepts.js +105 -0
- package/dist/input/binary.d.ts +20 -0
- package/dist/input/binary.js +40 -0
- package/dist/input/body-kind.d.ts +15 -0
- package/dist/input/body-kind.js +47 -0
- package/dist/input/body-limit.d.ts +21 -0
- package/dist/input/body-limit.js +99 -0
- package/dist/input/cookies.d.ts +7 -0
- package/dist/input/cookies.js +8 -0
- package/dist/input/form.d.ts +10 -0
- package/dist/input/form.js +24 -0
- package/dist/input/headers.d.ts +7 -0
- package/dist/input/headers.js +8 -0
- package/dist/input/input.d.ts +91 -0
- package/dist/input/input.js +88 -0
- package/dist/input/json.d.ts +10 -0
- package/dist/input/json.js +22 -0
- package/dist/input/params.d.ts +7 -0
- package/dist/input/params.js +8 -0
- package/dist/input/query.d.ts +10 -0
- package/dist/input/query.js +17 -0
- package/dist/mcp/mount.d.ts +116 -0
- package/dist/mcp/mount.js +45 -0
- package/dist/mcp/oauth.d.ts +14 -0
- package/dist/mcp/oauth.js +88 -0
- package/dist/mcp/uploads.d.ts +36 -0
- package/dist/mcp/uploads.js +171 -0
- package/dist/mcp/url-files.d.ts +32 -0
- package/dist/mcp/url-files.js +75 -0
- package/dist/meta/meta-spec-apply.d.ts +25 -0
- package/dist/meta/meta-spec-apply.js +83 -0
- package/dist/meta/meta-spec-merge.d.ts +103 -0
- package/dist/meta/meta-spec-merge.js +50 -0
- package/dist/meta/meta-spec-validate.d.ts +61 -0
- package/dist/meta/meta-spec-validate.js +166 -0
- package/dist/meta/meta-spec.d.ts +49 -0
- package/dist/meta/meta-spec.js +197 -0
- package/dist/middleware/compress.d.ts +15 -0
- package/dist/middleware/compress.js +93 -0
- package/dist/middleware/cors.d.ts +18 -0
- package/dist/middleware/cors.js +80 -0
- package/dist/middleware/csrf.d.ts +11 -0
- package/dist/middleware/csrf.js +65 -0
- package/dist/middleware/ip-restrict.d.ts +10 -0
- package/dist/middleware/ip-restrict.js +82 -0
- package/dist/middleware/middleware.d.ts +53 -0
- package/dist/middleware/middleware.js +112 -0
- package/dist/middleware/powered-by.d.ts +6 -0
- package/dist/middleware/powered-by.js +13 -0
- package/dist/middleware/rate-limit.d.ts +40 -0
- package/dist/middleware/rate-limit.js +90 -0
- package/dist/middleware/request-id.d.ts +25 -0
- package/dist/middleware/request-id.js +30 -0
- package/dist/middleware/secure-headers.d.ts +18 -0
- package/dist/middleware/secure-headers.js +36 -0
- package/dist/middleware/server-timing.d.ts +8 -0
- package/dist/middleware/server-timing.js +52 -0
- package/dist/middleware/timeout.d.ts +6 -0
- package/dist/middleware/timeout.js +29 -0
- package/dist/observability/curl-logger.d.ts +46 -0
- package/dist/observability/curl-logger.js +175 -0
- package/dist/observability/request-to-curl.d.ts +17 -0
- package/dist/observability/request-to-curl.js +47 -0
- package/dist/openapi/collect.d.ts +56 -18
- package/dist/openapi/collect.js +109 -23
- package/dist/openapi/components.d.ts +9 -0
- package/dist/openapi/components.js +90 -0
- package/dist/openapi/docs-page.d.ts +20 -18
- package/dist/openapi/docs-page.js +28 -46
- package/dist/openapi/document.d.ts +33 -26
- package/dist/openapi/document.js +21 -780
- package/dist/openapi/extract-schemas.d.ts +11 -0
- package/dist/openapi/extract-schemas.js +31 -0
- package/dist/openapi/generate.d.ts +47 -0
- package/dist/openapi/generate.js +180 -0
- package/dist/openapi/manifest.d.ts +41 -0
- package/dist/openapi/manifest.js +49 -0
- package/dist/openapi/output-keys.d.ts +6 -0
- package/dist/openapi/output-keys.js +24 -0
- package/dist/openapi/paths.d.ts +35 -0
- package/dist/openapi/paths.js +175 -0
- package/dist/openapi/register.d.ts +14 -3
- package/dist/openapi/register.js +13 -20
- package/dist/openapi/responses.d.ts +44 -0
- package/dist/openapi/responses.js +159 -0
- package/dist/openapi/scalar.d.ts +4 -14
- package/dist/openapi/scalar.js +5 -7
- package/dist/openapi/security.d.ts +4 -0
- package/dist/openapi/security.js +25 -0
- package/dist/openapi/serve.d.ts +25 -9
- package/dist/openapi/serve.js +108 -29
- package/dist/openapi/servers.d.ts +19 -0
- package/dist/openapi/servers.js +72 -0
- package/dist/openapi/swagger.d.ts +4 -14
- package/dist/openapi/swagger.js +5 -7
- package/dist/openapi/tags.d.ts +20 -0
- package/dist/openapi/tags.js +20 -0
- package/dist/openapi/webhooks.d.ts +19 -0
- package/dist/openapi/webhooks.js +70 -0
- package/dist/openapi/yaml.d.ts +8 -0
- package/dist/openapi/yaml.js +74 -0
- package/dist/proxy/headers.d.ts +30 -0
- package/dist/proxy/headers.js +86 -0
- package/dist/proxy/proxy.d.ts +39 -0
- package/dist/proxy/proxy.js +103 -0
- package/dist/proxy/upstream.d.ts +30 -0
- package/dist/proxy/upstream.js +116 -0
- package/dist/realtime/bus.d.ts +10 -13
- package/dist/realtime/bus.js +48 -93
- package/dist/realtime/invoke-user.d.ts +36 -0
- package/dist/realtime/invoke-user.js +103 -0
- package/dist/realtime/realtime.d.ts +7 -0
- package/dist/realtime/realtime.js +40 -0
- package/dist/realtime/route.d.ts +33 -27
- package/dist/realtime/route.js +27 -43
- package/dist/realtime/server.d.ts +24 -28
- package/dist/realtime/server.js +202 -225
- package/dist/response/binary.d.ts +18 -0
- package/dist/response/binary.js +10 -0
- package/dist/response/builder.d.ts +73 -0
- package/dist/response/builder.js +214 -0
- package/dist/response/cache-control.d.ts +30 -0
- package/dist/response/cache-control.js +74 -0
- package/dist/response/etag.d.ts +15 -0
- package/dist/response/etag.js +83 -0
- package/dist/response/media-type.d.ts +28 -0
- package/dist/response/media-type.js +97 -0
- package/dist/response/out-headers.d.ts +31 -0
- package/dist/response/out-headers.js +130 -0
- package/dist/response/pretty-json.d.ts +10 -0
- package/dist/response/pretty-json.js +44 -0
- package/dist/response/range.d.ts +19 -0
- package/dist/response/range.js +98 -0
- package/dist/response/response-headers.d.ts +11 -0
- package/dist/response/response-headers.js +21 -0
- package/dist/response/response.d.ts +69 -0
- package/dist/response/response.js +208 -0
- package/dist/response/sse.d.ts +41 -0
- package/dist/response/sse.js +73 -0
- package/dist/response/static.d.ts +20 -0
- package/dist/response/static.js +181 -0
- package/dist/response/status.d.ts +5 -0
- package/dist/response/status.js +68 -0
- package/dist/response/with-headers.d.ts +11 -0
- package/dist/response/with-headers.js +47 -0
- package/dist/routing/app-types.d.ts +181 -0
- package/dist/routing/app-types.js +1 -0
- package/dist/routing/app.d.ts +76 -0
- package/dist/routing/app.js +137 -0
- package/dist/routing/codegen-types.d.ts +17 -0
- package/dist/routing/codegen-types.js +1 -0
- package/dist/routing/delegate.d.ts +9 -0
- package/dist/routing/delegate.js +75 -0
- package/dist/routing/dispatch.d.ts +22 -0
- package/dist/routing/dispatch.js +255 -0
- package/dist/routing/finalize.d.ts +47 -0
- package/dist/routing/finalize.js +169 -0
- package/dist/routing/gateway-tree.d.ts +19 -0
- package/dist/routing/gateway-tree.js +74 -0
- package/dist/routing/invalidate-check.d.ts +58 -0
- package/dist/routing/invalidate-check.js +124 -0
- package/dist/routing/match.d.ts +22 -0
- package/dist/routing/match.js +108 -0
- package/dist/routing/middleware-chain.d.ts +16 -0
- package/dist/routing/middleware-chain.js +41 -0
- package/dist/routing/output-types.d.ts +91 -0
- package/dist/routing/output-types.js +1 -0
- package/dist/routing/pattern.d.ts +55 -0
- package/dist/routing/pattern.js +219 -0
- package/dist/routing/record.d.ts +18 -0
- package/dist/routing/record.js +4 -0
- package/dist/routing/register.d.ts +135 -0
- package/dist/routing/register.js +155 -0
- package/dist/routing/request-path.d.ts +30 -0
- package/dist/routing/request-path.js +173 -0
- package/dist/routing/route-builder.d.ts +160 -0
- package/dist/routing/route-builder.js +86 -0
- package/dist/routing/route-tree.d.ts +18 -0
- package/dist/routing/route-tree.js +91 -0
- package/dist/routing/settings-chain.d.ts +75 -0
- package/dist/routing/settings-chain.js +137 -0
- package/dist/routing/settings.d.ts +90 -0
- package/dist/routing/settings.js +44 -0
- package/dist/routing/tap.d.ts +31 -0
- package/dist/routing/tap.js +77 -0
- package/dist/routing/tree-merge.d.ts +7 -0
- package/dist/routing/tree-merge.js +77 -0
- package/dist/routing/tree.d.ts +85 -0
- package/dist/routing/tree.js +196 -0
- package/dist/routing/types.d.ts +20 -0
- package/dist/routing/types.js +1 -0
- package/dist/routing/ws-builder.d.ts +62 -0
- package/dist/routing/ws-builder.js +109 -0
- package/dist/runtime/detect-runtime.d.ts +16 -0
- package/dist/runtime/detect-runtime.js +11 -0
- package/dist/runtime/optional-peer.d.ts +10 -0
- package/dist/runtime/optional-peer.js +19 -0
- package/dist/schema/arktype.d.ts +7 -0
- package/dist/schema/arktype.js +13 -0
- package/dist/schema/canonicalize.d.ts +8 -0
- package/dist/schema/canonicalize.js +19 -0
- package/dist/schema/effect.d.ts +7 -0
- package/dist/schema/effect.js +4 -0
- package/dist/schema/naming.d.ts +31 -0
- package/dist/schema/naming.js +116 -0
- package/dist/schema/sanitize-spec.d.ts +15 -0
- package/dist/schema/sanitize-spec.js +43 -0
- package/dist/schema/slots.d.ts +15 -0
- package/dist/schema/slots.js +179 -0
- package/dist/schema/to-json-schema.d.ts +34 -0
- package/dist/schema/to-json-schema.js +94 -0
- package/dist/schema/valibot.d.ts +4 -0
- package/dist/schema/valibot.js +153 -0
- package/dist/schema/yup.d.ts +3 -0
- package/dist/schema/yup.js +57 -0
- package/dist/schema/zod.d.ts +6 -0
- package/dist/schema/zod.js +192 -0
- package/dist/security/crypto.d.ts +7 -0
- package/dist/security/crypto.js +30 -0
- package/dist/streaming/producer-stream.d.ts +45 -0
- package/dist/streaming/producer-stream.js +251 -0
- package/dist/telemetry/fields.d.ts +43 -0
- package/dist/telemetry/fields.js +64 -0
- package/dist/telemetry/log-format.d.ts +7 -0
- package/dist/telemetry/log-format.js +43 -0
- package/dist/telemetry/logger.d.ts +44 -0
- package/dist/telemetry/logger.js +122 -0
- package/dist/telemetry/otel-subpath.d.ts +7 -0
- package/dist/telemetry/otel-subpath.js +5 -0
- package/dist/telemetry/otel.d.ts +50 -57
- package/dist/telemetry/otel.js +54 -130
- package/dist/telemetry/request-log.d.ts +22 -0
- package/dist/telemetry/request-log.js +83 -0
- package/dist/telemetry/request-trace.d.ts +123 -0
- package/dist/telemetry/request-trace.js +199 -0
- package/dist/telemetry/span-lifecycle.d.ts +11 -0
- package/dist/telemetry/span-lifecycle.js +114 -0
- package/dist/telemetry/traceparent.d.ts +40 -0
- package/dist/telemetry/traceparent.js +73 -0
- package/dist/testing/testing.d.ts +42 -0
- package/dist/testing/testing.js +101 -0
- package/dist/validation/content-type.d.ts +21 -0
- package/dist/validation/content-type.js +42 -0
- package/dist/validation/standard-schema.d.ts +41 -0
- package/dist/validation/standard-schema.js +5 -0
- package/dist/validation/validate-input.d.ts +45 -0
- package/dist/validation/validate-input.js +174 -0
- package/dist/validation/validate-output.d.ts +34 -0
- package/dist/validation/validate-output.js +107 -0
- package/dist/ws/bun.d.ts +30 -25
- package/dist/ws/bun.js +42 -46
- package/dist/ws/cloudflare.d.ts +6 -75
- package/dist/ws/cloudflare.js +37 -104
- package/dist/ws/contract.d.ts +74 -0
- package/dist/ws/contract.js +83 -0
- package/dist/ws/node.d.ts +12 -21
- package/dist/ws/node.js +103 -151
- package/dist/ws/origin.d.ts +23 -0
- package/dist/ws/origin.js +48 -0
- package/dist/ws/route.d.ts +14 -0
- package/dist/ws/route.js +5 -0
- package/dist/ws/session.d.ts +15 -6
- package/dist/ws/session.js +22 -23
- package/dist/ws/shared.d.ts +23 -33
- package/dist/ws/shared.js +53 -39
- package/package.json +169 -251
- package/dist/accepts.d.ts +0 -12
- package/dist/accepts.d.ts.map +0 -1
- package/dist/accepts.js +0 -126
- package/dist/accepts.js.map +0 -1
- package/dist/body-kind.d.ts +0 -26
- package/dist/body-kind.d.ts.map +0 -1
- package/dist/body-kind.js +0 -70
- package/dist/body-kind.js.map +0 -1
- package/dist/body-limit.d.ts +0 -26
- package/dist/body-limit.d.ts.map +0 -1
- package/dist/body-limit.js +0 -126
- package/dist/body-limit.js.map +0 -1
- package/dist/build/index.d.ts.map +0 -1
- package/dist/build/index.js.map +0 -1
- package/dist/cli-args.d.ts +0 -33
- package/dist/cli-args.d.ts.map +0 -1
- package/dist/cli-args.js +0 -102
- package/dist/cli-args.js.map +0 -1
- package/dist/cli-go/auth.go +0 -26
- package/dist/cli-go/config.go +0 -192
- package/dist/cli-go/errors.go +0 -75
- package/dist/cli-go/multipart.go +0 -79
- package/dist/cli-go/output.go +0 -163
- package/dist/cli-go/root.go +0 -30
- package/dist/cli-go/stream.go +0 -88
- package/dist/cli-go/version.go +0 -5
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -209
- package/dist/cli.js.map +0 -1
- package/dist/client/defaults.d.ts +0 -12
- package/dist/client/defaults.d.ts.map +0 -1
- package/dist/client/defaults.js +0 -48
- package/dist/client/defaults.js.map +0 -1
- package/dist/client/error.d.ts +0 -49
- package/dist/client/error.d.ts.map +0 -1
- package/dist/client/error.js +0 -71
- package/dist/client/error.js.map +0 -1
- package/dist/client/http.d.ts +0 -155
- package/dist/client/http.d.ts.map +0 -1
- package/dist/client/http.js +0 -571
- package/dist/client/http.js.map +0 -1
- package/dist/client/index.d.ts +0 -23
- package/dist/client/index.d.ts.map +0 -1
- package/dist/client/index.js +0 -95
- package/dist/client/index.js.map +0 -1
- package/dist/client/path.d.ts +0 -26
- package/dist/client/path.d.ts.map +0 -1
- package/dist/client/path.js +0 -163
- package/dist/client/path.js.map +0 -1
- package/dist/client/redirect-policy.d.ts +0 -12
- package/dist/client/redirect-policy.d.ts.map +0 -1
- package/dist/client/redirect-policy.js +0 -20
- package/dist/client/redirect-policy.js.map +0 -1
- package/dist/client/sdk.d.ts +0 -70
- package/dist/client/sdk.d.ts.map +0 -1
- package/dist/client/sdk.js +0 -292
- package/dist/client/sdk.js.map +0 -1
- package/dist/client/sse.d.ts +0 -23
- package/dist/client/sse.d.ts.map +0 -1
- package/dist/client/sse.js +0 -129
- package/dist/client/sse.js.map +0 -1
- package/dist/client/types.d.ts +0 -124
- package/dist/client/types.d.ts.map +0 -1
- package/dist/client/types.js +0 -2
- package/dist/client/types.js.map +0 -1
- package/dist/client/ws.d.ts +0 -22
- package/dist/client/ws.d.ts.map +0 -1
- package/dist/client/ws.js +0 -112
- package/dist/client/ws.js.map +0 -1
- package/dist/client-go/errors.go +0 -236
- package/dist/client-go/export.go +0 -44
- package/dist/client-go/invalidation.go +0 -371
- package/dist/client-go/nullable.go +0 -62
- package/dist/client-go/realtime.go +0 -354
- package/dist/client-go/result.go +0 -20
- package/dist/client-go/runtime.go +0 -975
- package/dist/client-go/sse.go +0 -159
- package/dist/client-go/transport.go +0 -495
- package/dist/client-go/ws.go +0 -128
- package/dist/client-info.d.ts +0 -36
- package/dist/client-info.d.ts.map +0 -1
- package/dist/client-info.js +0 -53
- package/dist/client-info.js.map +0 -1
- package/dist/client-mcp/README.md +0 -10
- package/dist/client-mcp/server.ts +0 -221
- package/dist/client-mcp/types.ts +0 -19
- package/dist/client-python/_errors.py +0 -115
- package/dist/client-python/_invalidation.py +0 -494
- package/dist/client-python/_realtime.py +0 -179
- package/dist/client-python/_runtime.py +0 -860
- package/dist/client-python/_sse.py +0 -155
- package/dist/client-python/_transport.py +0 -366
- package/dist/client-python/_ws.py +0 -159
- package/dist/client-python/py.typed +0 -0
- package/dist/client-rust/errors.rs +0 -220
- package/dist/client-rust/invalidation.rs +0 -412
- package/dist/client-rust/invalidation_sync.rs +0 -93
- package/dist/client-rust/nullable.rs +0 -17
- package/dist/client-rust/realtime.rs +0 -702
- package/dist/client-rust/result.rs +0 -22
- package/dist/client-rust/runtime.rs +0 -980
- package/dist/client-rust/runtime_sync.rs +0 -484
- package/dist/client-rust/sse.rs +0 -188
- package/dist/client-rust/ws.rs +0 -167
- package/dist/codegen-go-cli.d.ts +0 -22
- package/dist/codegen-go-cli.d.ts.map +0 -1
- package/dist/codegen-go-cli.js +0 -964
- package/dist/codegen-go-cli.js.map +0 -1
- package/dist/codegen-go.d.ts +0 -41
- package/dist/codegen-go.d.ts.map +0 -1
- package/dist/codegen-go.js +0 -872
- package/dist/codegen-go.js.map +0 -1
- package/dist/codegen-hash.d.ts +0 -3
- package/dist/codegen-hash.d.ts.map +0 -1
- package/dist/codegen-hash.js +0 -9
- package/dist/codegen-hash.js.map +0 -1
- package/dist/codegen-ir.d.ts +0 -190
- package/dist/codegen-ir.d.ts.map +0 -1
- package/dist/codegen-ir.js +0 -661
- package/dist/codegen-ir.js.map +0 -1
- package/dist/codegen-lang.d.ts +0 -65
- package/dist/codegen-lang.d.ts.map +0 -1
- package/dist/codegen-lang.js +0 -526
- package/dist/codegen-lang.js.map +0 -1
- package/dist/codegen-load.d.ts +0 -31
- package/dist/codegen-load.d.ts.map +0 -1
- package/dist/codegen-load.js +0 -138
- package/dist/codegen-load.js.map +0 -1
- package/dist/codegen-loaders.d.ts +0 -12
- package/dist/codegen-loaders.d.ts.map +0 -1
- package/dist/codegen-loaders.js +0 -55
- package/dist/codegen-loaders.js.map +0 -1
- package/dist/codegen-mcp.d.ts +0 -13
- package/dist/codegen-mcp.d.ts.map +0 -1
- package/dist/codegen-mcp.js +0 -368
- package/dist/codegen-mcp.js.map +0 -1
- package/dist/codegen-python.d.ts +0 -33
- package/dist/codegen-python.d.ts.map +0 -1
- package/dist/codegen-python.js +0 -828
- package/dist/codegen-python.js.map +0 -1
- package/dist/codegen-route-tree-intern.d.ts +0 -40
- package/dist/codegen-route-tree-intern.d.ts.map +0 -1
- package/dist/codegen-route-tree-intern.js +0 -221
- package/dist/codegen-route-tree-intern.js.map +0 -1
- package/dist/codegen-rust.d.ts +0 -18
- package/dist/codegen-rust.d.ts.map +0 -1
- package/dist/codegen-rust.js +0 -1293
- package/dist/codegen-rust.js.map +0 -1
- package/dist/codegen-sanitize.d.ts +0 -3
- package/dist/codegen-sanitize.d.ts.map +0 -1
- package/dist/codegen-sanitize.js +0 -56
- package/dist/codegen-sanitize.js.map +0 -1
- package/dist/codegen-schema-naming.d.ts +0 -27
- package/dist/codegen-schema-naming.d.ts.map +0 -1
- package/dist/codegen-schema-naming.js +0 -150
- package/dist/codegen-schema-naming.js.map +0 -1
- package/dist/codegen-sdk-model.d.ts +0 -71
- package/dist/codegen-sdk-model.d.ts.map +0 -1
- package/dist/codegen-sdk-model.js +0 -179
- package/dist/codegen-sdk-model.js.map +0 -1
- package/dist/codegen.d.ts +0 -187
- package/dist/codegen.d.ts.map +0 -1
- package/dist/codegen.js +0 -4619
- package/dist/codegen.js.map +0 -1
- package/dist/context.d.ts +0 -86
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js +0 -242
- package/dist/context.js.map +0 -1
- package/dist/cookie-sign.d.ts +0 -17
- package/dist/cookie-sign.d.ts.map +0 -1
- package/dist/cookie-sign.js +0 -104
- package/dist/cookie-sign.js.map +0 -1
- package/dist/cookie.d.ts +0 -24
- package/dist/cookie.d.ts.map +0 -1
- package/dist/cookie.js +0 -138
- package/dist/cookie.js.map +0 -1
- package/dist/cors.d.ts +0 -14
- package/dist/cors.d.ts.map +0 -1
- package/dist/cors.js +0 -87
- package/dist/cors.js.map +0 -1
- package/dist/crypto.d.ts +0 -7
- package/dist/crypto.d.ts.map +0 -1
- package/dist/crypto.js +0 -38
- package/dist/crypto.js.map +0 -1
- package/dist/csrf.d.ts +0 -28
- package/dist/csrf.d.ts.map +0 -1
- package/dist/csrf.js +0 -79
- package/dist/csrf.js.map +0 -1
- package/dist/curl-logger.d.ts +0 -44
- package/dist/curl-logger.d.ts.map +0 -1
- package/dist/curl-logger.js +0 -199
- package/dist/curl-logger.js.map +0 -1
- package/dist/detect-runtime.d.ts +0 -16
- package/dist/detect-runtime.d.ts.map +0 -1
- package/dist/detect-runtime.js +0 -13
- package/dist/detect-runtime.js.map +0 -1
- package/dist/dict.d.ts +0 -11
- package/dist/dict.d.ts.map +0 -1
- package/dist/dict.js +0 -13
- package/dist/dict.js.map +0 -1
- package/dist/error.d.ts +0 -21
- package/dist/error.d.ts.map +0 -1
- package/dist/error.js +0 -44
- package/dist/error.js.map +0 -1
- package/dist/errors.d.ts +0 -40
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -39
- package/dist/errors.js.map +0 -1
- package/dist/etag.d.ts +0 -11
- package/dist/etag.d.ts.map +0 -1
- package/dist/etag.js +0 -82
- package/dist/etag.js.map +0 -1
- package/dist/feature-detect.d.ts +0 -25
- package/dist/feature-detect.d.ts.map +0 -1
- package/dist/feature-detect.js +0 -144
- package/dist/feature-detect.js.map +0 -1
- package/dist/feature-load.d.ts +0 -3
- package/dist/feature-load.d.ts.map +0 -1
- package/dist/feature-load.js +0 -36
- package/dist/feature-load.js.map +0 -1
- package/dist/feature-slots.d.ts +0 -44
- package/dist/feature-slots.d.ts.map +0 -1
- package/dist/feature-slots.js +0 -48
- package/dist/feature-slots.js.map +0 -1
- package/dist/fetch-request.d.ts +0 -10
- package/dist/fetch-request.d.ts.map +0 -1
- package/dist/fetch-request.js +0 -13
- package/dist/fetch-request.js.map +0 -1
- package/dist/gen-process.d.ts +0 -15
- package/dist/gen-process.d.ts.map +0 -1
- package/dist/gen-process.js +0 -43
- package/dist/gen-process.js.map +0 -1
- package/dist/gen-write.d.ts +0 -19
- package/dist/gen-write.d.ts.map +0 -1
- package/dist/gen-write.js +0 -120
- package/dist/gen-write.js.map +0 -1
- package/dist/glob.d.ts +0 -21
- package/dist/glob.d.ts.map +0 -1
- package/dist/glob.js +0 -115
- package/dist/glob.js.map +0 -1
- package/dist/go-type-emitter.d.ts +0 -47
- package/dist/go-type-emitter.d.ts.map +0 -1
- package/dist/go-type-emitter.js +0 -594
- package/dist/go-type-emitter.js.map +0 -1
- package/dist/honey-response.d.ts +0 -82
- package/dist/honey-response.d.ts.map +0 -1
- package/dist/honey-response.js +0 -338
- package/dist/honey-response.js.map +0 -1
- package/dist/i18n-slot.d.ts +0 -15
- package/dist/i18n-slot.d.ts.map +0 -1
- package/dist/i18n-slot.js +0 -14
- package/dist/i18n-slot.js.map +0 -1
- package/dist/i18n.d.ts +0 -29
- package/dist/i18n.d.ts.map +0 -1
- package/dist/i18n.js +0 -250
- package/dist/i18n.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/init.d.ts +0 -5
- package/dist/init.d.ts.map +0 -1
- package/dist/init.js +0 -140
- package/dist/init.js.map +0 -1
- package/dist/input.d.ts +0 -6
- package/dist/input.d.ts.map +0 -1
- package/dist/input.js +0 -4
- package/dist/input.js.map +0 -1
- package/dist/invalidate-check.d.ts +0 -61
- package/dist/invalidate-check.d.ts.map +0 -1
- package/dist/invalidate-check.js +0 -163
- package/dist/invalidate-check.js.map +0 -1
- package/dist/invoke-user.d.ts +0 -35
- package/dist/invoke-user.d.ts.map +0 -1
- package/dist/invoke-user.js +0 -73
- package/dist/invoke-user.js.map +0 -1
- package/dist/ip-restrict.d.ts +0 -24
- package/dist/ip-restrict.d.ts.map +0 -1
- package/dist/ip-restrict.js +0 -60
- package/dist/ip-restrict.js.map +0 -1
- package/dist/ip.d.ts +0 -39
- package/dist/ip.d.ts.map +0 -1
- package/dist/ip.js +0 -209
- package/dist/ip.js.map +0 -1
- package/dist/logger.d.ts +0 -45
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js +0 -113
- package/dist/logger.js.map +0 -1
- package/dist/media-type.d.ts +0 -30
- package/dist/media-type.d.ts.map +0 -1
- package/dist/media-type.js +0 -97
- package/dist/media-type.js.map +0 -1
- package/dist/meta-spec-merge.d.ts +0 -32
- package/dist/meta-spec-merge.d.ts.map +0 -1
- package/dist/meta-spec-merge.js +0 -68
- package/dist/meta-spec-merge.js.map +0 -1
- package/dist/meta-spec.d.ts +0 -94
- package/dist/meta-spec.d.ts.map +0 -1
- package/dist/meta-spec.js +0 -535
- package/dist/meta-spec.js.map +0 -1
- package/dist/middleware.d.ts +0 -77
- package/dist/middleware.d.ts.map +0 -1
- package/dist/middleware.js +0 -253
- package/dist/middleware.js.map +0 -1
- package/dist/node-request.d.ts +0 -104
- package/dist/node-request.d.ts.map +0 -1
- package/dist/node-request.js +0 -407
- package/dist/node-request.js.map +0 -1
- package/dist/node.d.ts +0 -30
- package/dist/node.d.ts.map +0 -1
- package/dist/node.js +0 -396
- package/dist/node.js.map +0 -1
- package/dist/openapi/collect.d.ts.map +0 -1
- package/dist/openapi/collect.js.map +0 -1
- package/dist/openapi/docs-page.d.ts.map +0 -1
- package/dist/openapi/docs-page.js.map +0 -1
- package/dist/openapi/document.d.ts.map +0 -1
- package/dist/openapi/document.js.map +0 -1
- package/dist/openapi/json-schema-slot.d.ts +0 -12
- package/dist/openapi/json-schema-slot.d.ts.map +0 -1
- package/dist/openapi/json-schema-slot.js +0 -38
- package/dist/openapi/json-schema-slot.js.map +0 -1
- package/dist/openapi/register.d.ts.map +0 -1
- package/dist/openapi/register.js.map +0 -1
- package/dist/openapi/scalar.d.ts.map +0 -1
- package/dist/openapi/scalar.js.map +0 -1
- package/dist/openapi/serve.d.ts.map +0 -1
- package/dist/openapi/serve.js.map +0 -1
- package/dist/openapi/spec-factory.d.ts +0 -65
- package/dist/openapi/spec-factory.d.ts.map +0 -1
- package/dist/openapi/spec-factory.js +0 -52
- package/dist/openapi/spec-factory.js.map +0 -1
- package/dist/openapi/spec.d.ts +0 -29
- package/dist/openapi/spec.d.ts.map +0 -1
- package/dist/openapi/spec.js +0 -50
- package/dist/openapi/spec.js.map +0 -1
- package/dist/openapi/swagger.d.ts.map +0 -1
- package/dist/openapi/swagger.js.map +0 -1
- package/dist/pattern.d.ts +0 -71
- package/dist/pattern.d.ts.map +0 -1
- package/dist/pattern.js +0 -239
- package/dist/pattern.js.map +0 -1
- package/dist/peer.d.ts +0 -17
- package/dist/peer.d.ts.map +0 -1
- package/dist/peer.js +0 -50
- package/dist/peer.js.map +0 -1
- package/dist/plugin.d.ts +0 -228
- package/dist/plugin.d.ts.map +0 -1
- package/dist/plugin.js +0 -666
- package/dist/plugin.js.map +0 -1
- package/dist/powered-by.d.ts +0 -7
- package/dist/powered-by.d.ts.map +0 -1
- package/dist/powered-by.js +0 -11
- package/dist/powered-by.js.map +0 -1
- package/dist/pretty-json.d.ts +0 -10
- package/dist/pretty-json.d.ts.map +0 -1
- package/dist/pretty-json.js +0 -47
- package/dist/pretty-json.js.map +0 -1
- package/dist/producer-stream.d.ts +0 -47
- package/dist/producer-stream.d.ts.map +0 -1
- package/dist/producer-stream.js +0 -267
- package/dist/producer-stream.js.map +0 -1
- package/dist/proxy.d.ts +0 -90
- package/dist/proxy.d.ts.map +0 -1
- package/dist/proxy.js +0 -274
- package/dist/proxy.js.map +0 -1
- package/dist/python-type-emitter.d.ts +0 -24
- package/dist/python-type-emitter.d.ts.map +0 -1
- package/dist/python-type-emitter.js +0 -157
- package/dist/python-type-emitter.js.map +0 -1
- package/dist/realtime/bus.d.ts.map +0 -1
- package/dist/realtime/bus.js.map +0 -1
- package/dist/realtime/register.d.ts +0 -3
- package/dist/realtime/register.d.ts.map +0 -1
- package/dist/realtime/register.js +0 -10
- package/dist/realtime/register.js.map +0 -1
- package/dist/realtime/route.d.ts.map +0 -1
- package/dist/realtime/route.js.map +0 -1
- package/dist/realtime/server.d.ts.map +0 -1
- package/dist/realtime/server.js.map +0 -1
- package/dist/request-id.d.ts +0 -19
- package/dist/request-id.d.ts.map +0 -1
- package/dist/request-id.js +0 -16
- package/dist/request-id.js.map +0 -1
- package/dist/request-limits.d.ts +0 -3
- package/dist/request-limits.d.ts.map +0 -1
- package/dist/request-limits.js +0 -3
- package/dist/request-limits.js.map +0 -1
- package/dist/request-path.d.ts +0 -33
- package/dist/request-path.d.ts.map +0 -1
- package/dist/request-path.js +0 -178
- package/dist/request-path.js.map +0 -1
- package/dist/request-to-curl.d.ts +0 -15
- package/dist/request-to-curl.d.ts.map +0 -1
- package/dist/request-to-curl.js +0 -48
- package/dist/request-to-curl.js.map +0 -1
- package/dist/response.d.ts +0 -86
- package/dist/response.d.ts.map +0 -1
- package/dist/response.js +0 -313
- package/dist/response.js.map +0 -1
- package/dist/rust-type-emitter.d.ts +0 -44
- package/dist/rust-type-emitter.d.ts.map +0 -1
- package/dist/rust-type-emitter.js +0 -463
- package/dist/rust-type-emitter.js.map +0 -1
- package/dist/secure-headers.d.ts +0 -16
- package/dist/secure-headers.d.ts.map +0 -1
- package/dist/secure-headers.js +0 -53
- package/dist/secure-headers.js.map +0 -1
- package/dist/serve-register.d.ts +0 -6
- package/dist/serve-register.d.ts.map +0 -1
- package/dist/serve-register.js +0 -9
- package/dist/serve-register.js.map +0 -1
- package/dist/serve-slot.d.ts +0 -9
- package/dist/serve-slot.d.ts.map +0 -1
- package/dist/serve-slot.js +0 -52
- package/dist/serve-slot.js.map +0 -1
- package/dist/serve.d.ts +0 -38
- package/dist/serve.d.ts.map +0 -1
- package/dist/serve.js +0 -157
- package/dist/serve.js.map +0 -1
- package/dist/server-timing.d.ts +0 -9
- package/dist/server-timing.d.ts.map +0 -1
- package/dist/server-timing.js +0 -51
- package/dist/server-timing.js.map +0 -1
- package/dist/static.d.ts +0 -21
- package/dist/static.d.ts.map +0 -1
- package/dist/static.js +0 -102
- package/dist/static.js.map +0 -1
- package/dist/telemetry/otel.d.ts.map +0 -1
- package/dist/telemetry/otel.js.map +0 -1
- package/dist/testing.d.ts +0 -36
- package/dist/testing.d.ts.map +0 -1
- package/dist/testing.js +0 -124
- package/dist/testing.js.map +0 -1
- package/dist/timeout.d.ts +0 -13
- package/dist/timeout.d.ts.map +0 -1
- package/dist/timeout.js +0 -36
- package/dist/timeout.js.map +0 -1
- package/dist/tree.d.ts +0 -197
- package/dist/tree.d.ts.map +0 -1
- package/dist/tree.js +0 -437
- package/dist/tree.js.map +0 -1
- package/dist/trust.d.ts +0 -21
- package/dist/trust.d.ts.map +0 -1
- package/dist/trust.js +0 -100
- package/dist/trust.js.map +0 -1
- package/dist/ts-type-emitter.d.ts +0 -8
- package/dist/ts-type-emitter.d.ts.map +0 -1
- package/dist/ts-type-emitter.js +0 -150
- package/dist/ts-type-emitter.js.map +0 -1
- package/dist/type-emitter.d.ts +0 -36
- package/dist/type-emitter.d.ts.map +0 -1
- package/dist/type-emitter.js +0 -729
- package/dist/type-emitter.js.map +0 -1
- package/dist/type-extractor.d.ts +0 -43
- package/dist/type-extractor.d.ts.map +0 -1
- package/dist/type-extractor.js +0 -819
- package/dist/type-extractor.js.map +0 -1
- package/dist/types.d.ts +0 -467
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -96
- package/dist/types.js.map +0 -1
- package/dist/validation.d.ts +0 -31
- package/dist/validation.d.ts.map +0 -1
- package/dist/validation.js +0 -335
- package/dist/validation.js.map +0 -1
- package/dist/with-headers.d.ts +0 -15
- package/dist/with-headers.d.ts.map +0 -1
- package/dist/with-headers.js +0 -45
- package/dist/with-headers.js.map +0 -1
- package/dist/ws/bun.d.ts.map +0 -1
- package/dist/ws/bun.js.map +0 -1
- package/dist/ws/cloudflare.d.ts.map +0 -1
- package/dist/ws/cloudflare.js.map +0 -1
- package/dist/ws/deno.d.ts +0 -13
- package/dist/ws/deno.d.ts.map +0 -1
- package/dist/ws/deno.js +0 -133
- package/dist/ws/deno.js.map +0 -1
- package/dist/ws/node.d.ts.map +0 -1
- package/dist/ws/node.js.map +0 -1
- package/dist/ws/session.d.ts.map +0 -1
- package/dist/ws/session.js.map +0 -1
- package/dist/ws/shared.d.ts.map +0 -1
- package/dist/ws/shared.js.map +0 -1
- package/dist/ws-origin.d.ts +0 -20
- package/dist/ws-origin.d.ts.map +0 -1
- package/dist/ws-origin.js +0 -41
- package/dist/ws-origin.js.map +0 -1
- package/dist/yaml.d.ts +0 -18
- package/dist/yaml.d.ts.map +0 -1
- package/dist/yaml.js +0 -101
- package/dist/yaml.js.map +0 -1
- package/docs/api-ref/go.md +0 -399
- package/docs/api-ref/python.md +0 -399
- package/docs/api-ref/rust.md +0 -399
- package/docs/api-ref/typescript.md +0 -399
- package/docs/invalidate-spec.md +0 -333
- package/docs/meta-spec.md +0 -555
- package/docs/packaging.md +0 -104
- package/docs/regression-matrix/README.md +0 -32
- package/docs/regression-matrix/review.md +0 -44
- package/docs/regression-matrix/ws1-3.md +0 -97
- package/docs/regression-matrix/ws4-8.md +0 -107
- package/docs/regression-matrix/ws9-12.md +0 -266
- package/docs/sdk.md +0 -798
- package/src/accepts.ts +0 -136
- package/src/body-kind.ts +0 -67
- package/src/body-limit.ts +0 -152
- package/src/build/index.ts +0 -217
- package/src/cli-args.ts +0 -123
- package/src/cli-go/auth.go +0 -26
- package/src/cli-go/config.go +0 -192
- package/src/cli-go/errors.go +0 -75
- package/src/cli-go/multipart.go +0 -79
- package/src/cli-go/output.go +0 -163
- package/src/cli-go/root.go +0 -30
- package/src/cli-go/stream.go +0 -88
- package/src/cli-go/version.go +0 -5
- package/src/cli.ts +0 -209
- package/src/client/defaults.ts +0 -47
- package/src/client/error.ts +0 -82
- package/src/client/http.ts +0 -737
- package/src/client/index.ts +0 -157
- package/src/client/path.ts +0 -169
- package/src/client/redirect-policy.ts +0 -19
- package/src/client/sdk.ts +0 -351
- package/src/client/sse.ts +0 -128
- package/src/client/types.ts +0 -206
- package/src/client/ws.ts +0 -149
- package/src/client-go/errors.go +0 -236
- package/src/client-go/export.go +0 -44
- package/src/client-go/invalidation.go +0 -371
- package/src/client-go/nullable.go +0 -62
- package/src/client-go/realtime.go +0 -354
- package/src/client-go/result.go +0 -20
- package/src/client-go/runtime.go +0 -975
- package/src/client-go/sse.go +0 -159
- package/src/client-go/transport.go +0 -495
- package/src/client-go/ws.go +0 -128
- package/src/client-info.ts +0 -79
- package/src/client-mcp/README.md +0 -10
- package/src/client-mcp/server.ts +0 -221
- package/src/client-mcp/types.ts +0 -19
- package/src/client-python/_errors.py +0 -115
- package/src/client-python/_invalidation.py +0 -494
- package/src/client-python/_realtime.py +0 -179
- package/src/client-python/_runtime.py +0 -860
- package/src/client-python/_sse.py +0 -155
- package/src/client-python/_transport.py +0 -366
- package/src/client-python/_ws.py +0 -159
- package/src/client-python/py.typed +0 -0
- package/src/client-rust/errors.rs +0 -220
- package/src/client-rust/invalidation.rs +0 -412
- package/src/client-rust/invalidation_sync.rs +0 -93
- package/src/client-rust/nullable.rs +0 -17
- package/src/client-rust/realtime.rs +0 -702
- package/src/client-rust/result.rs +0 -22
- package/src/client-rust/runtime.rs +0 -980
- package/src/client-rust/runtime_sync.rs +0 -484
- package/src/client-rust/sse.rs +0 -188
- package/src/client-rust/ws.rs +0 -167
- package/src/codegen-go-cli.ts +0 -1066
- package/src/codegen-go.ts +0 -970
- package/src/codegen-hash.ts +0 -8
- package/src/codegen-ir.ts +0 -812
- package/src/codegen-lang.ts +0 -517
- package/src/codegen-load.ts +0 -150
- package/src/codegen-loaders.ts +0 -50
- package/src/codegen-mcp.ts +0 -445
- package/src/codegen-python.ts +0 -916
- package/src/codegen-route-tree-intern.ts +0 -198
- package/src/codegen-rust.ts +0 -1402
- package/src/codegen-sanitize.ts +0 -57
- package/src/codegen-schema-naming.ts +0 -165
- package/src/codegen-sdk-model.ts +0 -228
- package/src/codegen.ts +0 -5089
- package/src/context.ts +0 -325
- package/src/cookie-sign.ts +0 -119
- package/src/cookie.ts +0 -143
- package/src/cors.ts +0 -95
- package/src/crypto.ts +0 -38
- package/src/csrf.ts +0 -86
- package/src/curl-logger.ts +0 -258
- package/src/detect-runtime.ts +0 -17
- package/src/dict.ts +0 -12
- package/src/error.ts +0 -55
- package/src/errors.ts +0 -85
- package/src/etag.ts +0 -97
- package/src/feature-detect.ts +0 -147
- package/src/feature-load.ts +0 -23
- package/src/feature-slots.ts +0 -70
- package/src/fetch-request.ts +0 -13
- package/src/gen-process.ts +0 -42
- package/src/gen-write.ts +0 -127
- package/src/glob.ts +0 -109
- package/src/go-type-emitter.ts +0 -660
- package/src/honey-response.ts +0 -379
- package/src/i18n-slot.ts +0 -30
- package/src/i18n.ts +0 -300
- package/src/index.ts +0 -3829
- package/src/init.ts +0 -161
- package/src/input.ts +0 -8
- package/src/invalidate-check.ts +0 -205
- package/src/invoke-user.ts +0 -95
- package/src/ip-restrict.ts +0 -79
- package/src/ip.ts +0 -194
- package/src/logger.ts +0 -178
- package/src/media-type.ts +0 -104
- package/src/meta-spec-merge.ts +0 -80
- package/src/meta-spec.ts +0 -718
- package/src/middleware.ts +0 -331
- package/src/node-request.ts +0 -431
- package/src/node.ts +0 -454
- package/src/openapi/collect.ts +0 -50
- package/src/openapi/docs-page.ts +0 -89
- package/src/openapi/document.ts +0 -902
- package/src/openapi/json-schema-slot.ts +0 -53
- package/src/openapi/register.ts +0 -23
- package/src/openapi/scalar.ts +0 -34
- package/src/openapi/serve.ts +0 -39
- package/src/openapi/spec-factory.ts +0 -100
- package/src/openapi/spec.ts +0 -74
- package/src/openapi/swagger.ts +0 -35
- package/src/pattern.ts +0 -245
- package/src/peer.ts +0 -53
- package/src/plugin.ts +0 -864
- package/src/powered-by.ts +0 -18
- package/src/pretty-json.ts +0 -56
- package/src/producer-stream.ts +0 -296
- package/src/proxy.ts +0 -370
- package/src/python-type-emitter.ts +0 -181
- package/src/realtime/bus.ts +0 -140
- package/src/realtime/register.ts +0 -13
- package/src/realtime/route.ts +0 -153
- package/src/realtime/server.ts +0 -298
- package/src/request-id.ts +0 -32
- package/src/request-limits.ts +0 -2
- package/src/request-path.ts +0 -165
- package/src/request-to-curl.ts +0 -52
- package/src/response.ts +0 -411
- package/src/rust-type-emitter.ts +0 -548
- package/src/secure-headers.ts +0 -74
- package/src/serve-register.ts +0 -12
- package/src/serve-slot.ts +0 -58
- package/src/serve.ts +0 -220
- package/src/server-timing.ts +0 -71
- package/src/static.ts +0 -112
- package/src/telemetry/otel.ts +0 -156
- package/src/testing.ts +0 -167
- package/src/timeout.ts +0 -45
- package/src/tree.ts +0 -558
- package/src/trust.ts +0 -117
- package/src/ts-type-emitter.ts +0 -168
- package/src/type-emitter.ts +0 -760
- package/src/type-extractor.ts +0 -855
- package/src/types.ts +0 -756
- package/src/validation.ts +0 -413
- package/src/with-headers.ts +0 -45
- package/src/ws/bun.ts +0 -120
- package/src/ws/cloudflare.ts +0 -192
- package/src/ws/deno.ts +0 -188
- package/src/ws/node.ts +0 -240
- package/src/ws/session.ts +0 -73
- package/src/ws/shared.ts +0 -140
- package/src/ws-origin.ts +0 -53
- package/src/yaml.ts +0 -103
package/docs/sdk.md
DELETED
|
@@ -1,798 +0,0 @@
|
|
|
1
|
-
# Honey SDKs
|
|
2
|
-
|
|
3
|
-
OpenAPI-in, tier-1 SDKs out. One spec is parsed once into a shared IR, then four language printers emit idiomatic, feature-equivalent clients for **TypeScript, Python, Go, and Rust**.
|
|
4
|
-
|
|
5
|
-
Framework start: [README](../README.md).
|
|
6
|
-
|
|
7
|
-
## Four-language parity pledge
|
|
8
|
-
|
|
9
|
-
Every SDK exposes the same capability surface with native bindings. `context.Context` in Go, `AbortSignal` in TS, `asyncio.Task.cancel()` in Python, `tokio_util::sync::CancellationToken` in Rust — all four satisfy "cancellation" without translating each other's syntax. This page is the scannable index of the four-language SDK surface.
|
|
10
|
-
|
|
11
|
-
Entry points:
|
|
12
|
-
|
|
13
|
-
- `generateTypeScriptSDK(spec, { name, stem })` — emits `sdk.client.gen.ts`, `sdk.types.gen.ts`, `sdk.index.gen.ts`, `sdk.map.gen.ts`, and (when `x-realtime` is present) `sdk.runtime.gen.ts`.
|
|
14
|
-
- `generatePythonSDK(spec)` — emits a `sdk/` package with `client.py`, `_runtime.py`, `_errors.py`, `_realtime.py`, `_transport.py`, `_ws.py`.
|
|
15
|
-
- `generateGoSDK(spec, { modulePath })` — emits a Go module importable via a `replace` directive.
|
|
16
|
-
- `generateRustSDK(spec, { crateName })` — emits a Cargo crate referenced via `path = "..."`.
|
|
17
|
-
|
|
18
|
-
The rest of this page is the capability matrix and "how to do X" snippets. All snippets come from `../examples/`.
|
|
19
|
-
|
|
20
|
-
## Capability matrix
|
|
21
|
-
|
|
22
|
-
| § | Capability | TS | Python | Go | Rust |
|
|
23
|
-
| --- | ----------------------------------------------------- | --- | ------ | --- | ---- |
|
|
24
|
-
| 1 | Typed operations (request, response, params, bodies) | ✓ | ✓ | ✓ | ✓ |
|
|
25
|
-
| 2 | Typed error hierarchy + `.data` typed payload | ✓ | ✓ | ✓ | ✓ |
|
|
26
|
-
| 3 | `onAuthExpired` callback + 1x 401 retry | ✓ | ✓ | ✓ | ✓ |
|
|
27
|
-
| 4 | Cancellation (idiomatic per lang) | ✓ | ✓ | ✓ | ✓ |
|
|
28
|
-
| 5 | Per-call timeout override | ✓ | ✓ | ✓ | ✓ |
|
|
29
|
-
| 6 | Per-call headers merge | ✓ | ✓ | ✓ | ✓ |
|
|
30
|
-
| 7 | `onRequest` / `onResponse` hook chain | ✓ | ✓ | ✓ | ✓ |
|
|
31
|
-
| 8 | Invalidation + `isStale` | ✓ | ✓ | ✓ | ✓ |
|
|
32
|
-
| 9 | SSE iteration | ✓ | ✓ | ✓ | ✓ |
|
|
33
|
-
| 10 | Realtime (`x-realtime`) + `TransportAdapter` fallback | ✓ | ✓ | ✓ | ✓ |
|
|
34
|
-
| 11 | WebSocket (`x-websocket`) bidi | ✓ | ✓ | ✓ | ✓ |
|
|
35
|
-
| 12 | Streaming request body | ✓ | ✓ | ✓ | ✓ |
|
|
36
|
-
| 13 | Sync runtime | — | ✓ | — | ✓ |
|
|
37
|
-
| 14 | `onLog` lifecycle hook | ✓ | ✓ | ✓ | ✓ |
|
|
38
|
-
| 15 | `x-deprecated` | ✓ | ✓ | ✓ | ✓ |
|
|
39
|
-
| 16 | `x-idempotency-key` | ✓ | ✓ | ✓ | ✓ |
|
|
40
|
-
|
|
41
|
-
Sync runtime is not idiomatic in TS (no sync HTTP in browsers or workerd) or Go (goroutines + `context.Context` are the async model). Python and Rust ship dual async + sync generation.
|
|
42
|
-
|
|
43
|
-
## How to do X
|
|
44
|
-
|
|
45
|
-
Each subsection below shows the same capability realized in all four languages. Snippets are trimmed from `../examples/{lang}/example.*` — those files are the source of truth and contain the full frame plus imports.
|
|
46
|
-
|
|
47
|
-
### §1 — Client init + config
|
|
48
|
-
|
|
49
|
-
Config is mechanism, not policy. You pick retry, logging, auth refresh, and invalidation strategies; the SDK supplies the hook slots.
|
|
50
|
-
|
|
51
|
-
```ts
|
|
52
|
-
const sdk = new MockSDK({
|
|
53
|
-
baseURL: BASE_URL,
|
|
54
|
-
headers: { Authorization: "Bearer expired-token" },
|
|
55
|
-
onAuthExpired: () => Promise.resolve("valid-token"),
|
|
56
|
-
onLog: (entry) => console.debug(entry.event, entry.operation, entry.duration_ms, entry.status),
|
|
57
|
-
onRequest: [addTrace, addApp],
|
|
58
|
-
onResponse: [inspect5xx],
|
|
59
|
-
throwOnError: true,
|
|
60
|
-
timeout: 10_000,
|
|
61
|
-
})
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
In a browser, `baseURL` may be a same-origin path. It resolves against `location.origin`. Omit `fetch` — the default is the environment `fetch`, bound so it is safe to call on `window`. In Node and Workers without an origin, pass an absolute `http(s):` or `ws(s):` URL.
|
|
65
|
-
|
|
66
|
-
```ts
|
|
67
|
-
const browserSdk = new MockSDK({
|
|
68
|
-
baseURL: "/api",
|
|
69
|
-
credentials: "include",
|
|
70
|
-
throwOnError: true,
|
|
71
|
-
})
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
```py
|
|
75
|
-
sdk = AsyncSDK(ClientConfig(
|
|
76
|
-
base_url=BASE_URL,
|
|
77
|
-
headers={"Authorization": "Bearer expired-token"},
|
|
78
|
-
on_auth_expired=refresh_token,
|
|
79
|
-
on_log=on_log,
|
|
80
|
-
on_request=[add_trace_hook, add_app_hook],
|
|
81
|
-
on_response=[inspect_response_hook],
|
|
82
|
-
invalidation=InvalidationConfig(stale_time=5.0),
|
|
83
|
-
timeout=10.0,
|
|
84
|
-
))
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
```go
|
|
88
|
-
client := sdk.NewClient(sdk.Config{
|
|
89
|
-
BaseURL: baseURL,
|
|
90
|
-
Headers: map[string]string{"Authorization": "Bearer expired-token"},
|
|
91
|
-
OnAuthExpired: func(ctx context.Context) (string, error) { return "valid-token", nil },
|
|
92
|
-
OnRequest: []func(*sdk.RequestContext) error{addTrace, addApp},
|
|
93
|
-
OnResponse: []func(*sdk.ResponseContext) error{inspect5xx},
|
|
94
|
-
OnLog: func(e sdk.LogEntry) { fmt.Println(e.Event, e.Operation, e.DurationMs, e.Status) },
|
|
95
|
-
Invalidation: &sdk.InvalidationConfig{StaleTime: 5000}, // milliseconds
|
|
96
|
-
Timeout: 10 * time.Second,
|
|
97
|
-
})
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
```rust
|
|
101
|
-
let client = Client::new(ClientConfig {
|
|
102
|
-
base_url,
|
|
103
|
-
bearer_token: Some("expired-token".into()),
|
|
104
|
-
on_auth_expired: Some(Arc::new(|| Box::pin(async { Ok("valid-token".to_string()) }))),
|
|
105
|
-
on_log: Some(Arc::new(|e: LogEntry| println!("{} {} {}", e.event, e.operation, e.duration_ms))),
|
|
106
|
-
on_request: vec![trace_hook, app_hook],
|
|
107
|
-
on_response: vec![inspect_hook],
|
|
108
|
-
invalidation: Some(InvalidationConfig { stale_time: 5_000, ..Default::default() }),
|
|
109
|
-
timeout: Some(Duration::from_secs(10)),
|
|
110
|
-
..Default::default()
|
|
111
|
-
});
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
### §2 — Typed operation call
|
|
115
|
-
|
|
116
|
-
Every OpenAPI operation becomes a typed method. Path / query / header params are typed per operation; request and response bodies are typed from the declared schemas.
|
|
117
|
-
|
|
118
|
-
```ts
|
|
119
|
-
const user = await sdk.createUser({ json: { email: "a@b.com", name: "Alice" } })
|
|
120
|
-
console.log(user.id, user.name)
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
```py
|
|
124
|
-
user = await sdk.create_user(body={"name": "Alice", "email": "a@b.com"})
|
|
125
|
-
print(user["id"], user["name"])
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
```go
|
|
129
|
-
user, err := client.CreateUser(ctx, sdk.UserCreate{Name: "Alice", Email: "a@b.com"}, nil)
|
|
130
|
-
if err == nil {
|
|
131
|
-
fmt.Println(user.Id, user.Name)
|
|
132
|
-
}
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
```rust
|
|
136
|
-
let user = client
|
|
137
|
-
.create_user(
|
|
138
|
-
&UserCreate { name: "Alice".into(), email: "a@b.com".into() },
|
|
139
|
-
&CreateUserOpts::default(),
|
|
140
|
-
)
|
|
141
|
-
.await?;
|
|
142
|
-
println!("{} {}", user.id, user.name);
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
### §3 — Typed error catch
|
|
146
|
-
|
|
147
|
-
Every SDK emits the unified taxonomy: `BadRequestError`, `UnauthorizedError`, `NotFoundError`, `RateLimitError`, `InternalServerError`, and a `ClientError` / `Error` base. Each carries `status`, `body`, and (§4) a typed `data` payload.
|
|
148
|
-
|
|
149
|
-
```ts
|
|
150
|
-
try {
|
|
151
|
-
await sdk.createUser({ json: input })
|
|
152
|
-
} catch (e) {
|
|
153
|
-
if (e instanceof BadRequestError) console.error("400", e.status)
|
|
154
|
-
else if (e instanceof UnauthorizedError) console.error("401")
|
|
155
|
-
else if (e instanceof NotFoundError) console.error("404")
|
|
156
|
-
else if (e instanceof RateLimitError) console.error("429")
|
|
157
|
-
else if (e instanceof InternalServerError) console.error("500")
|
|
158
|
-
else if (isClientError(e)) console.error("unknown:", e.status)
|
|
159
|
-
else throw e
|
|
160
|
-
}
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
```py
|
|
164
|
-
try:
|
|
165
|
-
await sdk.create_user(body=input)
|
|
166
|
-
except BadRequestError as e:
|
|
167
|
-
print("400", e.status)
|
|
168
|
-
except UnauthorizedError:
|
|
169
|
-
print("401")
|
|
170
|
-
except NotFoundError:
|
|
171
|
-
print("404")
|
|
172
|
-
except RateLimitError:
|
|
173
|
-
print("429")
|
|
174
|
-
except InternalServerError:
|
|
175
|
-
print("500")
|
|
176
|
-
except ClientError as e:
|
|
177
|
-
print("unknown:", e.status)
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
```go
|
|
181
|
-
user, err := client.CreateUser(ctx, input, nil)
|
|
182
|
-
if err != nil {
|
|
183
|
-
var bre *sdk.BadRequestError
|
|
184
|
-
var ue *sdk.UnauthorizedError
|
|
185
|
-
var nfe *sdk.NotFoundError
|
|
186
|
-
switch {
|
|
187
|
-
case errors.As(err, &bre): fmt.Println("400", bre.Status())
|
|
188
|
-
case errors.As(err, &ue): fmt.Println("401")
|
|
189
|
-
case errors.As(err, &nfe): fmt.Println("404")
|
|
190
|
-
default: fmt.Println("unknown:", err)
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
```rust
|
|
196
|
-
match client.create_user(&input, &CreateUserOpts::default()).await {
|
|
197
|
-
Ok(user) => println!("{}", user.id),
|
|
198
|
-
Err(Error::Api(api_err)) => {
|
|
199
|
-
let dyn_err: &(dyn std::error::Error + 'static) = api_err.as_ref();
|
|
200
|
-
if let Some(bre) = dyn_err.downcast_ref::<BadRequestError>() {
|
|
201
|
-
println!("400 {}", bre.status_code);
|
|
202
|
-
} else if dyn_err.downcast_ref::<UnauthorizedError>().is_some() {
|
|
203
|
-
println!("401");
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
Err(e) => eprintln!("{}", e),
|
|
207
|
-
}
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
### §4 — Declared error payload (`err.data`)
|
|
211
|
-
|
|
212
|
-
When an operation declares a `4xx` response schema in OpenAPI, the parsed payload is eagerly populated on the error object at response time. `err.body` remains the raw bytes; `err.data` is typed.
|
|
213
|
-
|
|
214
|
-
```ts
|
|
215
|
-
try {
|
|
216
|
-
await sdk.createUser({ json: bad })
|
|
217
|
-
} catch (e) {
|
|
218
|
-
if (e instanceof BadRequestError) {
|
|
219
|
-
console.error("400 data:", e.data, "body:", e.body)
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
```py
|
|
225
|
-
try:
|
|
226
|
-
await sdk.create_user(body=bad)
|
|
227
|
-
except BadRequestError as e:
|
|
228
|
-
print("400 data:", e.data, "body:", e.body)
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
```go
|
|
232
|
-
var bre *sdk.BadRequestError
|
|
233
|
-
if errors.As(err, &bre) {
|
|
234
|
-
fmt.Println("400 data:", bre.Data, "body:", string(bre.Body))
|
|
235
|
-
}
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
```rust
|
|
239
|
-
if let Some(bre) = dyn_err.downcast_ref::<BadRequestError>() {
|
|
240
|
-
println!("400 data: {:?} body_len: {}", bre.data, bre.body.len());
|
|
241
|
-
}
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
### §5 — `onAuthExpired` callback
|
|
245
|
-
|
|
246
|
-
Exactly **one** retry on 401 with a freshly-fetched token. The callback owns storage; the SDK never writes to disk or env. Retry beyond 401 is a non-goal — wire 5xx / 429 retry via `onResponse`.
|
|
247
|
-
|
|
248
|
-
```ts
|
|
249
|
-
onAuthExpired: () => Promise.resolve("valid-token"),
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
```py
|
|
253
|
-
async def refresh_token() -> str:
|
|
254
|
-
return "valid-token"
|
|
255
|
-
|
|
256
|
-
ClientConfig(on_auth_expired=refresh_token, ...)
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
```go
|
|
260
|
-
OnAuthExpired: func(ctx context.Context) (string, error) {
|
|
261
|
-
return "valid-token", nil
|
|
262
|
-
},
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
```rust
|
|
266
|
-
on_auth_expired: Some(Arc::new(|| Box::pin(async {
|
|
267
|
-
Ok("valid-token".to_string()) // an empty string gives up and returns the 401
|
|
268
|
-
}))),
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
### §6 — Cancellation
|
|
272
|
-
|
|
273
|
-
Each SDK uses the language's native cancellation primitive. Cancellation propagates into HTTP, SSE, WS, and `ResumableConnection` — never silently dropped.
|
|
274
|
-
|
|
275
|
-
```ts
|
|
276
|
-
const ctrl = new AbortController()
|
|
277
|
-
setTimeout(() => ctrl.abort(), 25)
|
|
278
|
-
try {
|
|
279
|
-
await sdk.slow({ search: { ms: 500 }, signal: ctrl.signal })
|
|
280
|
-
} catch (e) {
|
|
281
|
-
console.error("cancelled:", (e as Error).name)
|
|
282
|
-
}
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
```py
|
|
286
|
-
task = asyncio.create_task(sdk.slow(ms=500))
|
|
287
|
-
await asyncio.sleep(0.01)
|
|
288
|
-
task.cancel()
|
|
289
|
-
try:
|
|
290
|
-
await task
|
|
291
|
-
except asyncio.CancelledError:
|
|
292
|
-
print("cancelled async")
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
```go
|
|
296
|
-
cancelCtx, cancel := context.WithTimeout(ctx, 25*time.Millisecond)
|
|
297
|
-
defer cancel()
|
|
298
|
-
_, err := client.Slow(cancelCtx, &sdk.SlowOpts{Ms: ptr(int64(500))})
|
|
299
|
-
if err != nil {
|
|
300
|
-
fmt.Println("cancelled:", err)
|
|
301
|
-
}
|
|
302
|
-
```
|
|
303
|
-
|
|
304
|
-
```rust
|
|
305
|
-
let token = CancellationToken::new();
|
|
306
|
-
let token_clone = token.clone();
|
|
307
|
-
tokio::spawn(async move {
|
|
308
|
-
tokio::time::sleep(Duration::from_millis(25)).await;
|
|
309
|
-
token_clone.cancel();
|
|
310
|
-
});
|
|
311
|
-
let _ = client
|
|
312
|
-
.slow(&SlowOpts { ms: Some(500), cancel_token: Some(token), ..Default::default() })
|
|
313
|
-
.await;
|
|
314
|
-
```
|
|
315
|
-
|
|
316
|
-
### §7 — Per-call timeout
|
|
317
|
-
|
|
318
|
-
Config timeout is the default. Per-call `timeout` on any op is a hard override. Distinct from cancellation — timeout is a deadline, cancellation is an external signal.
|
|
319
|
-
|
|
320
|
-
```ts
|
|
321
|
-
await sdk.slow({ search: { ms: 200 }, timeout: 50 })
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
```py
|
|
325
|
-
await sdk.slow(ms=200, timeout=0.05)
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
```go
|
|
329
|
-
// Go's per-call timeout is a context deadline; Config.Timeout (default 30s) applies to every call
|
|
330
|
-
slowCtx, cancel := context.WithTimeout(ctx, 50*time.Millisecond)
|
|
331
|
-
defer cancel()
|
|
332
|
-
_, err := client.Slow(slowCtx, &sdk.SlowOpts{Ms: ptr(int64(200))})
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
```rust
|
|
336
|
-
client
|
|
337
|
-
.slow(&SlowOpts {
|
|
338
|
-
ms: Some(200),
|
|
339
|
-
timeout: Some(Duration::from_millis(50)),
|
|
340
|
-
..Default::default()
|
|
341
|
-
})
|
|
342
|
-
.await?;
|
|
343
|
-
```
|
|
344
|
-
|
|
345
|
-
### §8 — Per-call headers
|
|
346
|
-
|
|
347
|
-
Per-call headers merge over config headers; per-call wins per key. Useful for request-scoped tracing IDs, idempotency keys, or one-off auth overrides.
|
|
348
|
-
|
|
349
|
-
Every outbound REST/SSE request also gets an auto `x-request-id` (UUID v4) when none is already set. Precedence: config / per-call headers keep their value; `onRequest` / `OnRequest` / `on_request` hooks run after and **win** if they set the header.
|
|
350
|
-
|
|
351
|
-
```ts
|
|
352
|
-
await sdk.getUser({
|
|
353
|
-
headers: { "X-Both": "call-wins" },
|
|
354
|
-
params: { id: "u1" },
|
|
355
|
-
})
|
|
356
|
-
```
|
|
357
|
-
|
|
358
|
-
```py
|
|
359
|
-
await sdk.get_user("u1", headers={"X-Both": "call-wins"})
|
|
360
|
-
```
|
|
361
|
-
|
|
362
|
-
```go
|
|
363
|
-
_, _ = client.GetUser(ctx, "u1", &sdk.GetUserOpts{
|
|
364
|
-
Headers: map[string]string{"X-Both": "call-wins"},
|
|
365
|
-
})
|
|
366
|
-
```
|
|
367
|
-
|
|
368
|
-
```rust
|
|
369
|
-
let _ = client
|
|
370
|
-
.get_user(
|
|
371
|
-
"u1",
|
|
372
|
-
&GetUserOpts {
|
|
373
|
-
headers: Some([("X-Both".into(), "call-wins".into())].into_iter().collect()),
|
|
374
|
-
..Default::default()
|
|
375
|
-
},
|
|
376
|
-
)
|
|
377
|
-
.await;
|
|
378
|
-
```
|
|
379
|
-
|
|
380
|
-
### §9 — `onRequest` / `onResponse` hooks
|
|
381
|
-
|
|
382
|
-
Hook chains run in declaration order, awaited in order, and may mutate the context (headers pre-send, status inspection post-receive). They are the only built-in retry primitive beyond the 401 path — 5xx backoff, circuit breakers, tracing all live here.
|
|
383
|
-
|
|
384
|
-
```ts
|
|
385
|
-
onRequest: [
|
|
386
|
-
(ctx) => { ctx.headers["X-Trace-Id"] = crypto.randomUUID(); return Promise.resolve() },
|
|
387
|
-
(ctx) => { ctx.headers["X-App"] = "example"; return Promise.resolve() },
|
|
388
|
-
],
|
|
389
|
-
onResponse: [
|
|
390
|
-
(ctx) => { if (ctx.status >= 500) console.warn("5xx:", ctx.status); return Promise.resolve() },
|
|
391
|
-
],
|
|
392
|
-
```
|
|
393
|
-
|
|
394
|
-
```py
|
|
395
|
-
async def add_trace_hook(ctx):
|
|
396
|
-
ctx.headers["X-Trace-Id"] = "trace-123"
|
|
397
|
-
|
|
398
|
-
async def inspect_response_hook(rctx):
|
|
399
|
-
if rctx.response.status_code >= 500:
|
|
400
|
-
print("5xx:", rctx.response.status_code)
|
|
401
|
-
|
|
402
|
-
ClientConfig(on_request=[add_trace_hook], on_response=[inspect_response_hook], ...)
|
|
403
|
-
```
|
|
404
|
-
|
|
405
|
-
```go
|
|
406
|
-
OnRequest: []func(*sdk.RequestContext) error{
|
|
407
|
-
func(c *sdk.RequestContext) error { c.Headers.Set("X-Trace-Id", "trace-123"); return nil },
|
|
408
|
-
func(c *sdk.RequestContext) error { c.Headers.Set("X-App", "example"); return nil },
|
|
409
|
-
},
|
|
410
|
-
OnResponse: []func(*sdk.ResponseContext) error{
|
|
411
|
-
func(c *sdk.ResponseContext) error {
|
|
412
|
-
if c.Status >= 500 { fmt.Println("5xx:", c.Status) }
|
|
413
|
-
return nil
|
|
414
|
-
},
|
|
415
|
-
},
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
```rust
|
|
419
|
-
let trace_hook: OnRequestHook = Arc::new(|ctx| {
|
|
420
|
-
Box::pin(async move {
|
|
421
|
-
ctx.headers.insert("X-Trace-Id".into(), "trace-123".into());
|
|
422
|
-
Ok(())
|
|
423
|
-
})
|
|
424
|
-
});
|
|
425
|
-
let inspect_hook: OnResponseHook = Arc::new(|ctx| {
|
|
426
|
-
let status = ctx.status;
|
|
427
|
-
Box::pin(async move {
|
|
428
|
-
if status >= 500 { eprintln!("5xx: {}", status); }
|
|
429
|
-
Ok(())
|
|
430
|
-
})
|
|
431
|
-
});
|
|
432
|
-
```
|
|
433
|
-
|
|
434
|
-
### §10 — `onLog`
|
|
435
|
-
|
|
436
|
-
A single pluggable sink. `LogEntry` carries `{ level, event, operation, duration_ms, status?, error? }`. This is not a logger framework — wire it into whatever leveled logger the consumer already has.
|
|
437
|
-
|
|
438
|
-
```ts
|
|
439
|
-
onLog: (entry) => console.debug(entry.event, entry.operation, entry.duration_ms, entry.status),
|
|
440
|
-
```
|
|
441
|
-
|
|
442
|
-
```py
|
|
443
|
-
def on_log(entry: LogEntry) -> None:
|
|
444
|
-
print(entry.event, entry.operation, entry.duration_ms, entry.status)
|
|
445
|
-
```
|
|
446
|
-
|
|
447
|
-
```go
|
|
448
|
-
OnLog: func(e sdk.LogEntry) {
|
|
449
|
-
fmt.Println(e.Event, e.Operation, e.DurationMs, e.Status)
|
|
450
|
-
},
|
|
451
|
-
```
|
|
452
|
-
|
|
453
|
-
```rust
|
|
454
|
-
on_log: Some(Arc::new(|e: LogEntry| {
|
|
455
|
-
println!("{} {} {} {:?}", e.event, e.operation, e.duration_ms, e.status);
|
|
456
|
-
})),
|
|
457
|
-
```
|
|
458
|
-
|
|
459
|
-
### §11 — Invalidation + `isStale`
|
|
460
|
-
|
|
461
|
-
An `x-invalidate: ["GET /resource/:id"]` extension on a mutating op marks matching GET paths stale. Two-tier lookup (exact → pattern regex, cached). TTL config governs the stale window. The SDK stores staleness only — never cached bodies — so consumer code picks the refetch moment.
|
|
462
|
-
|
|
463
|
-
```ts
|
|
464
|
-
await sdk.updateUser({ json: { name: "Alice2" }, params: { id: "u1" } })
|
|
465
|
-
const stale = sdk.isStale("GET", "/users/u1")
|
|
466
|
-
console.log("users/u1 stale?", stale)
|
|
467
|
-
```
|
|
468
|
-
|
|
469
|
-
```py
|
|
470
|
-
await sdk.update_user("u1", body={"name": "Alice2"})
|
|
471
|
-
print("users/u1 stale?", await sdk.is_stale("GET", "/users/u1"))
|
|
472
|
-
```
|
|
473
|
-
|
|
474
|
-
```go
|
|
475
|
-
_, _ = client.UpdateUser(ctx, "u1", sdk.UserUpdate{Name: "Alice2"}, nil)
|
|
476
|
-
fmt.Println("users/u1 stale?", client.IsStale("GET", "/users/u1"))
|
|
477
|
-
```
|
|
478
|
-
|
|
479
|
-
```rust
|
|
480
|
-
let _ = client
|
|
481
|
-
.update_user(
|
|
482
|
-
"u1",
|
|
483
|
-
&UserUpdate { name: Some("Alice2".into()), ..Default::default() },
|
|
484
|
-
&UpdateUserOpts::default(),
|
|
485
|
-
)
|
|
486
|
-
.await;
|
|
487
|
-
println!("users/u1 stale? {}", client.is_stale("GET", "/users/u1"));
|
|
488
|
-
```
|
|
489
|
-
|
|
490
|
-
### §12 — SSE iteration
|
|
491
|
-
|
|
492
|
-
Operations with `produces: text/event-stream` return a typed async iterable of events. Reconnect on drop is consumer-driven for basic SSE (use `x-realtime` in §13 for auto-reconnect).
|
|
493
|
-
|
|
494
|
-
```ts
|
|
495
|
-
for await (const ev of sdk.streamEvents()) {
|
|
496
|
-
console.log("sse event:", ev)
|
|
497
|
-
break
|
|
498
|
-
}
|
|
499
|
-
```
|
|
500
|
-
|
|
501
|
-
```py
|
|
502
|
-
async for ev in sdk.stream_events():
|
|
503
|
-
print("sse event:", ev)
|
|
504
|
-
break
|
|
505
|
-
```
|
|
506
|
-
|
|
507
|
-
```go
|
|
508
|
-
// an iter.Seq2; breaking out of the loop closes the stream
|
|
509
|
-
for ev, err := range client.StreamEvents(ctx, nil) {
|
|
510
|
-
if err != nil {
|
|
511
|
-
fmt.Println("sse error:", err)
|
|
512
|
-
break
|
|
513
|
-
}
|
|
514
|
-
fmt.Println("sse event:", ev.Data)
|
|
515
|
-
break
|
|
516
|
-
}
|
|
517
|
-
```
|
|
518
|
-
|
|
519
|
-
```rust
|
|
520
|
-
// a Stream: the call itself is not awaited
|
|
521
|
-
let mut sse = std::pin::pin!(client.stream_events(&StreamEventsOpts::default()));
|
|
522
|
-
if let Some(Ok(ev)) = sse.next().await {
|
|
523
|
-
println!("sse event: {}", ev.data);
|
|
524
|
-
}
|
|
525
|
-
```
|
|
526
|
-
|
|
527
|
-
### §13 — WebSocket bidi
|
|
528
|
-
|
|
529
|
-
Operations with `x-websocket: true` yield a typed bidirectional channel: `Send` / `Recv` types come from the schema. Client close returns code 1000; server-initiated close surfaces a reason.
|
|
530
|
-
|
|
531
|
-
```ts
|
|
532
|
-
const ws = sdk.connectWs()
|
|
533
|
-
await new Promise<void>((resolve) => {
|
|
534
|
-
ws.on("open", () => resolve())
|
|
535
|
-
})
|
|
536
|
-
ws.on("message", (data: string) => {
|
|
537
|
-
console.log("ws recv:", data)
|
|
538
|
-
ws.close(1000, "done")
|
|
539
|
-
})
|
|
540
|
-
ws.send("hello")
|
|
541
|
-
```
|
|
542
|
-
|
|
543
|
-
```py
|
|
544
|
-
async with sdk.connect_ws() as ws:
|
|
545
|
-
await ws.send("hello")
|
|
546
|
-
async for msg in ws:
|
|
547
|
-
print("ws recv:", msg)
|
|
548
|
-
break
|
|
549
|
-
await ws.close(1000, "done")
|
|
550
|
-
```
|
|
551
|
-
|
|
552
|
-
```go
|
|
553
|
-
ws, err := client.ConnectWs(ctx, nil)
|
|
554
|
-
if err == nil {
|
|
555
|
-
_ = ws.Send(ctx, "hello")
|
|
556
|
-
msg, _ := ws.Read(ctx)
|
|
557
|
-
fmt.Println("ws recv:", string(msg))
|
|
558
|
-
_ = ws.Close(sdk.WSStatusNormalClosure, "done")
|
|
559
|
-
}
|
|
560
|
-
```
|
|
561
|
-
|
|
562
|
-
```rust
|
|
563
|
-
let mut ws = client.connect_ws(&ConnectWsOpts::default()).await?;
|
|
564
|
-
ws.send_text("hello").await?;
|
|
565
|
-
let msg = ws.read().await?;
|
|
566
|
-
println!("ws recv: {}", String::from_utf8_lossy(&msg));
|
|
567
|
-
ws.close(1000, "done").await?;
|
|
568
|
-
```
|
|
569
|
-
|
|
570
|
-
### §14 — Realtime with custom adapter
|
|
571
|
-
|
|
572
|
-
`x-realtime: true` opens a `ResumableConnection` with a pluggable `TransportAdapter`, a fallback chain (`[ws, sse, longpoll]` by default), and proven-transport memoization. The generated method always uses the default chain; to reorder, drop, or inject custom transports, construct the connection directly with your own list (as below). The config's headers and auth reach every transport. A dropped connection reconnects with exponential backoff and jitter (capped at 30 s; default 5 consecutive attempts, 1 s first delay), and a message resets the count.
|
|
573
|
-
|
|
574
|
-
Not implemented yet: the resume protocol (`ready` frames, resume tokens, ping/liveness, replay). Honey's shipped realtime server is a topic bus over WebSocket; the SSE and long-poll transports only work against servers that speak them.
|
|
575
|
-
|
|
576
|
-
```ts
|
|
577
|
-
function makeCustomAdapter(): TransportAdapter {
|
|
578
|
-
return {
|
|
579
|
-
connect(_url, _opts): TransportConnection {
|
|
580
|
-
let onFrame: (f: ServerFrame) => void = () => {}
|
|
581
|
-
const conn: TransportConnection = {
|
|
582
|
-
close() {},
|
|
583
|
-
onClose: () => {},
|
|
584
|
-
onError: () => {},
|
|
585
|
-
get onFrame() {
|
|
586
|
-
return onFrame
|
|
587
|
-
},
|
|
588
|
-
set onFrame(cb) {
|
|
589
|
-
onFrame = cb
|
|
590
|
-
},
|
|
591
|
-
send(_data) {},
|
|
592
|
-
}
|
|
593
|
-
queueMicrotask(() => onFrame({ data: { kind: "tick" }, id: 1, t: "msg" }))
|
|
594
|
-
return conn
|
|
595
|
-
},
|
|
596
|
-
}
|
|
597
|
-
}
|
|
598
|
-
const rc = createResumableConnection({
|
|
599
|
-
maxReconnectAttempts: 5,
|
|
600
|
-
reconnectDelayMs: 100,
|
|
601
|
-
transports: [makeCustomAdapter()],
|
|
602
|
-
url: `${BASE_URL}/rt`,
|
|
603
|
-
})
|
|
604
|
-
for await (const ev of rc) {
|
|
605
|
-
console.log("rt:", ev)
|
|
606
|
-
break
|
|
607
|
-
}
|
|
608
|
-
rc.close()
|
|
609
|
-
```
|
|
610
|
-
|
|
611
|
-
```py
|
|
612
|
-
class TickAdapter:
|
|
613
|
-
def name(self): return "tick"
|
|
614
|
-
def kind(self): return TransportKind.WS
|
|
615
|
-
|
|
616
|
-
async def connect(self, _url, _opts):
|
|
617
|
-
return TickConn()
|
|
618
|
-
|
|
619
|
-
rc = ResumableConnection(f"{BASE_URL}/rt", [TickAdapter()], TransportOpts())
|
|
620
|
-
await rc.connect()
|
|
621
|
-
async for ev in rc:
|
|
622
|
-
print("rt event:", ev)
|
|
623
|
-
break
|
|
624
|
-
await rc.close()
|
|
625
|
-
```
|
|
626
|
-
|
|
627
|
-
```go
|
|
628
|
-
// the generated method (client.ConnectRealtime) uses the default chain;
|
|
629
|
-
// NewResumableConnection takes a custom one
|
|
630
|
-
rc := sdk.NewResumableConnection(baseURL+"/rt", []sdk.Transport{&tickTransport{}}, &sdk.TransportOpts{
|
|
631
|
-
MaxReconnectAttempts: 5,
|
|
632
|
-
ReconnectDelayMs: 100,
|
|
633
|
-
})
|
|
634
|
-
if err := rc.Connect(ctx); err == nil {
|
|
635
|
-
for ev := range rc.Events() {
|
|
636
|
-
fmt.Println("rt event:", ev)
|
|
637
|
-
break
|
|
638
|
-
}
|
|
639
|
-
_ = rc.Close()
|
|
640
|
-
}
|
|
641
|
-
```
|
|
642
|
-
|
|
643
|
-
```rust
|
|
644
|
-
// the generated method uses the default chain; ResumableConnection::connect takes a custom one
|
|
645
|
-
let mut rc = ResumableConnection::<serde_json::Value, serde_json::Value>::connect(
|
|
646
|
-
format!("{}/rt", base_url),
|
|
647
|
-
ResumableConnectionOpts { max_reconnect_attempts: Some(5), reconnect_delay_ms: Some(100), ..Default::default() },
|
|
648
|
-
vec![Box::new(TickAdapter)],
|
|
649
|
-
)
|
|
650
|
-
.await?;
|
|
651
|
-
let ev = rc.recv().await?;
|
|
652
|
-
println!("rt event: {:?}", ev);
|
|
653
|
-
rc.close().await?;
|
|
654
|
-
```
|
|
655
|
-
|
|
656
|
-
### §15 — Streaming upload
|
|
657
|
-
|
|
658
|
-
`application/octet-stream` bodies flow as a stream: the SDK pipes the source into the HTTP client without buffering (critical on memory-bounded runtimes like CF Workers), and does not retry them after an auth refresh. Multipart and urlencoded bodies are supported in all four languages: TS takes a `FormData`/object, Python a dict whose file parts are bytes, a file object or `(filename, content[, content_type])`, Go a generated `<Op>Body` struct with `sdk.FilePart` fields (read into memory so the request can be retried), Rust a `reqwest::multipart::Form`.
|
|
659
|
-
|
|
660
|
-
```ts
|
|
661
|
-
const stream = new ReadableStream<Uint8Array>({
|
|
662
|
-
pull(controller) {
|
|
663
|
-
if (sent >= TOTAL) {
|
|
664
|
-
controller.close()
|
|
665
|
-
return
|
|
666
|
-
}
|
|
667
|
-
const chunk = new Uint8Array(Math.min(CHUNK, TOTAL - sent))
|
|
668
|
-
sent += chunk.length
|
|
669
|
-
controller.enqueue(chunk)
|
|
670
|
-
},
|
|
671
|
-
})
|
|
672
|
-
const uploaded = await sdk.uploadBlob({ body: stream })
|
|
673
|
-
console.log("uploaded:", uploaded.size, uploaded.hash)
|
|
674
|
-
```
|
|
675
|
-
|
|
676
|
-
```py
|
|
677
|
-
async def gen() -> AsyncIterator[bytes]:
|
|
678
|
-
for off in range(0, TOTAL, CHUNK):
|
|
679
|
-
yield buf[off:off + CHUNK]
|
|
680
|
-
|
|
681
|
-
uploaded = await sdk.upload_blob(gen())
|
|
682
|
-
print("uploaded:", uploaded["size"], uploaded["hash"])
|
|
683
|
-
```
|
|
684
|
-
|
|
685
|
-
```go
|
|
686
|
-
uploaded, err := client.UploadBlob(ctx, bytes.NewReader(buf), nil)
|
|
687
|
-
if err == nil {
|
|
688
|
-
fmt.Println("uploaded:", uploaded.Size, uploaded.Hash)
|
|
689
|
-
}
|
|
690
|
-
```
|
|
691
|
-
|
|
692
|
-
```rust
|
|
693
|
-
let chunks: Vec<Bytes> = buf.chunks(CHUNK).map(|c| Bytes::copy_from_slice(c)).collect();
|
|
694
|
-
let body_stream = stream::iter(chunks.into_iter().map(Ok::<_, std::io::Error>));
|
|
695
|
-
let uploaded = client.upload_blob(body_stream, &UploadBlobOpts::default()).await?;
|
|
696
|
-
println!("uploaded: {} {}", uploaded.size, uploaded.hash);
|
|
697
|
-
```
|
|
698
|
-
|
|
699
|
-
### §16 — `x-idempotency-key`
|
|
700
|
-
|
|
701
|
-
Operations marked `x-idempotency-key: true` auto-send an `Idempotency-Key` header with a UUID when the caller doesn't supply one. Precedence: `headers["Idempotency-Key"]` wins over the explicit opts field, which wins over the auto UUID.
|
|
702
|
-
|
|
703
|
-
```ts
|
|
704
|
-
const auto = await sdk.idempotentCreate()
|
|
705
|
-
const explicit = await sdk.idempotentCreate({ idempotencyKey: "user-supplied-123" })
|
|
706
|
-
const viaHeader = await sdk.idempotentCreate({ headers: { "Idempotency-Key": "header-wins-456" } })
|
|
707
|
-
```
|
|
708
|
-
|
|
709
|
-
```py
|
|
710
|
-
auto = await sdk.idempotent_create()
|
|
711
|
-
explicit = await sdk.idempotent_create(idempotency_key="user-supplied-123")
|
|
712
|
-
via_header = await sdk.idempotent_create(headers={"Idempotency-Key": "header-wins-456"})
|
|
713
|
-
```
|
|
714
|
-
|
|
715
|
-
```go
|
|
716
|
-
auto, _ := client.IdempotentCreate(ctx, nil)
|
|
717
|
-
explicit, _ := client.IdempotentCreate(ctx, &sdk.IdempotentCreateOpts{IdempotencyKey: "user-supplied-123"})
|
|
718
|
-
viaHeader, _ := client.IdempotentCreate(ctx, &sdk.IdempotentCreateOpts{
|
|
719
|
-
Headers: map[string]string{"Idempotency-Key": "header-wins-456"},
|
|
720
|
-
})
|
|
721
|
-
```
|
|
722
|
-
|
|
723
|
-
```rust
|
|
724
|
-
let auto = client.idempotent_create(&IdempotentCreateOpts::default()).await?;
|
|
725
|
-
let explicit = client
|
|
726
|
-
.idempotent_create(&IdempotentCreateOpts {
|
|
727
|
-
idempotency_key: Some("user-supplied-123".into()),
|
|
728
|
-
..Default::default()
|
|
729
|
-
})
|
|
730
|
-
.await?;
|
|
731
|
-
let via_header = client
|
|
732
|
-
.idempotent_create(&IdempotentCreateOpts {
|
|
733
|
-
headers: Some([("Idempotency-Key".into(), "header-wins-456".into())].into_iter().collect()),
|
|
734
|
-
..Default::default()
|
|
735
|
-
})
|
|
736
|
-
.await?;
|
|
737
|
-
```
|
|
738
|
-
|
|
739
|
-
## Runtime behavior
|
|
740
|
-
|
|
741
|
-
The Go, Python and Rust runtimes follow one behavior spec. The shared vectors in
|
|
742
|
-
`tests/conformance/vectors/` (URL building, SSE) are run by every runtime, and one operation
|
|
743
|
-
is sent by each generated SDK to the same capture server and compared byte for byte
|
|
744
|
-
(`tests/integration/sdk-harness/polyglot-conformance.test.ts`).
|
|
745
|
-
|
|
746
|
-
- **Path params.** Templates accept `{name}` anywhere in a segment, `:name` / `:name?` for a
|
|
747
|
-
whole segment and a trailing `*name`. Values are encoded like `encodeURIComponent`. `""`,
|
|
748
|
-
`.` and `..` are rejected before sending (`PathParamError` in Go and Python, `Error::Other`
|
|
749
|
-
in Rust), so a value can never retarget a request to a parent resource or another host.
|
|
750
|
-
- **Base URL.** The base path and base query are kept: `https://host/v1` + `/users` is
|
|
751
|
-
`https://host/v1/users`.
|
|
752
|
-
- **Query.** Encoded like `URLSearchParams` (space is `+`). Arrays repeat the key, `null`
|
|
753
|
-
and unset optionals are omitted, booleans are `true`/`false`, numbers use JavaScript's
|
|
754
|
-
formatting (`100`, `1e+21`).
|
|
755
|
-
- **Headers.** Config headers, then per-call headers, then auth; merged case-insensitively,
|
|
756
|
-
so exactly one of each is sent.
|
|
757
|
-
- **Timeouts.** The config timeout (default 30 s) bounds a whole regular request including
|
|
758
|
-
the body. SSE, WebSocket and realtime streams are not bounded by it.
|
|
759
|
-
- **Redirects.** The default HTTP client follows redirects only to the same origin; any other
|
|
760
|
-
redirect is returned as an error, so custom auth headers never leave the origin.
|
|
761
|
-
- **Auth refresh.** A 401 calls `onAuthExpired` once; concurrent 401s share one refresh; the
|
|
762
|
-
new token is kept for later calls; an empty token (or `None`) gives up. Streamed bodies
|
|
763
|
-
are not retried.
|
|
764
|
-
- **Errors.** Every non-2xx (3xx included) is a typed error carrying status, raw body and
|
|
765
|
-
parsed data. Messages prefer the body's `message` field, drop control characters and are
|
|
766
|
-
capped at 512 characters.
|
|
767
|
-
- **SSE.** WHATWG parsing: CR, LF and CRLF line endings (U+2028 is data), one leading space
|
|
768
|
-
stripped, the id is sticky, `retry` needs digits, a final event without its blank line is
|
|
769
|
-
discarded, lines are capped at 1 MiB.
|
|
770
|
-
- **Operations without `operationId`** get a derived name (`GET /users/{id}` → `getUsersById`)
|
|
771
|
-
in every SDK, the TypeScript one and MCP tools included, instead of being dropped.
|
|
772
|
-
- **Optional nullable fields** are tri-state, so "leave it", "clear it" and "set it" are three
|
|
773
|
-
different requests:
|
|
774
|
-
|
|
775
|
-
| | absent | `null` | value |
|
|
776
|
-
| ------------------------------ | ------------ | ----------------- | --------------- |
|
|
777
|
-
| TypeScript | omit the key | `null` | `v` |
|
|
778
|
-
| Python (`TypedDict`) | omit the key | `None` | `v` |
|
|
779
|
-
| Go (`Nullable[T]`, `omitzero`) | zero value | `sdk.NullOf[T]()` | `sdk.Some(v)` |
|
|
780
|
-
| Rust (`Option<Option<T>>`) | `None` | `Some(None)` | `Some(Some(v))` |
|
|
781
|
-
|
|
782
|
-
Decoding keeps the distinction (`IsNull()` / `Get()` in Go). A required array or map left
|
|
783
|
-
empty is sent as `[]` / `{}`, never `null`.
|
|
784
|
-
|
|
785
|
-
## Links
|
|
786
|
-
|
|
787
|
-
- **End-to-end examples** — full per-lang files with every capability §1–16 in context:
|
|
788
|
-
- `../examples/typescript/example.ts`
|
|
789
|
-
- `../examples/python/example.py`
|
|
790
|
-
- `../examples/go/example.go`
|
|
791
|
-
- `../examples/rust/example.rs`
|
|
792
|
-
- `../examples/README.md` — examples index + parity surface map.
|
|
793
|
-
- **Master spec** — full capability surface lived in the iterating monorepo workerc specs; this page plus `./api-ref/` are the in-repo index.
|
|
794
|
-
- **Behavioral harnesses** — the tier-4 tests that verify what this page documents:
|
|
795
|
-
- `../tests/integration/sdk-harness/ts-harness.test.ts`
|
|
796
|
-
- `../tests/integration/sdk-harness/python-harness.test.ts`
|
|
797
|
-
- `../tests/integration/sdk-harness/go-harness.test.ts`
|
|
798
|
-
- `../tests/integration/sdk-harness/rust-harness.test.ts`
|