@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
package/src/realtime/register.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `import "@lovrozagar/honey/realtime"` makes `app.realtime()` available. The core never
|
|
3
|
-
* imports the realtime server, so an app without realtime routes does not bundle it.
|
|
4
|
-
*/
|
|
5
|
-
import { registerFeature } from "../feature-slots.ts"
|
|
6
|
-
import { createBus } from "./bus.ts"
|
|
7
|
-
import { resolveRealtimeConfig } from "./route.ts"
|
|
8
|
-
import { createRealtimePublisher, createRealtimeSession } from "./server.ts"
|
|
9
|
-
|
|
10
|
-
registerFeature("realtime", { createBus, createRealtimePublisher, createRealtimeSession, resolveRealtimeConfig })
|
|
11
|
-
|
|
12
|
-
export type { ConnContext, RealtimeLimits, RealtimeRouteOpts } from "./route.ts"
|
|
13
|
-
export type { RealtimePublisher } from "./server.ts"
|
package/src/realtime/route.ts
DELETED
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
import { validateOriginPolicy, type WSOriginPolicy } from "../ws-origin.ts"
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* One realtime connection as the route handler sees it. Only the WebSocket transport ships.
|
|
5
|
-
* Every frame, in both directions, is one JSON text (see the README's realtime wire format).
|
|
6
|
-
*/
|
|
7
|
-
export type ConnContext = {
|
|
8
|
-
readonly id: string
|
|
9
|
-
/** What the route's `identify(ctx)` returned, else `null`. */
|
|
10
|
-
readonly userId: string | null
|
|
11
|
-
readonly transport: "ws"
|
|
12
|
-
/** `true` once the connection closed (or `close()` was called). `join` and `send` are then no-ops. */
|
|
13
|
-
readonly closed: boolean
|
|
14
|
-
readonly state: Record<string, unknown>
|
|
15
|
-
/** Subscribe to `topic` in this route's namespace. Throws past `limits.maxTopics`. */
|
|
16
|
-
join(topic: string): void
|
|
17
|
-
leave(topic: string): void
|
|
18
|
-
/** Send one JSON frame to this connection. Throws when `payload` is not JSON-serializable. */
|
|
19
|
-
send(payload: unknown): void
|
|
20
|
-
/** Send one JSON frame to every connection on `topic` in this route's namespace (this one included). */
|
|
21
|
-
publish(topic: string, payload: unknown): void
|
|
22
|
-
/** Close with code 1000. A reason longer than 123 UTF-8 bytes is truncated. */
|
|
23
|
-
close(reason?: string): void
|
|
24
|
-
on(event: "message", handler: (payload: unknown) => void | Promise<void>): void
|
|
25
|
-
on(event: "close", handler: (reason: string) => void | Promise<void>): void
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export type RealtimeLimits = {
|
|
29
|
-
/** Topics one connection may join. Default 128. */
|
|
30
|
-
maxTopics?: number
|
|
31
|
-
/** Largest inbound text frame in UTF-8 bytes; larger frames close the connection with 1009. Default 1 MiB. */
|
|
32
|
-
maxFrameBytes?: number
|
|
33
|
-
/**
|
|
34
|
-
* Inbound frames waiting for a handler (a slow async `message` handler, or none attached yet).
|
|
35
|
-
* Past this the connection closes with 1008. Default 64.
|
|
36
|
-
*/
|
|
37
|
-
maxPendingFrames?: number
|
|
38
|
-
/**
|
|
39
|
-
* Outbound bytes the runtime may hold for a client that is not reading, where the runtime reports
|
|
40
|
-
* it (`bufferedAmount`). Past this `slowConsumer` applies. Default 4 MiB.
|
|
41
|
-
*/
|
|
42
|
-
maxBufferedBytes?: number
|
|
43
|
-
/** `"close"` (default) closes a slow consumer with 1013; `"drop"` drops frames until it catches up. */
|
|
44
|
-
slowConsumer?: "close" | "drop"
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/** `C` is the request context of the handle `realtime()` is called on. */
|
|
48
|
-
export type RealtimeRouteOpts<C = unknown> = {
|
|
49
|
-
use?: Array<(ctx: unknown, next: () => Promise<Response>) => Promise<Response>>
|
|
50
|
-
/**
|
|
51
|
-
* Topic namespace. Connections only see topics of their own namespace. Defaults to the route's
|
|
52
|
-
* full path pattern, so two realtime routes never share topics unless they name the same namespace.
|
|
53
|
-
*/
|
|
54
|
-
namespace?: string
|
|
55
|
-
/** Runs after the route's middleware, before the upgrade. Its result becomes `conn.userId`; a throw rejects the upgrade. */
|
|
56
|
-
identify?: (ctx: C) => string | null | undefined | Promise<string | null | undefined>
|
|
57
|
-
/** Receives every error thrown by `handler` and the `message`/`close` handlers. Defaults to the app logger. */
|
|
58
|
-
onError?: (error: unknown, conn: ConnContext) => void | Promise<void>
|
|
59
|
-
limits?: RealtimeLimits
|
|
60
|
-
/**
|
|
61
|
-
* Browser origins allowed to connect: `"*"`, a list (`https://app.example.com`), or a
|
|
62
|
-
* predicate. Same-origin always passes. Unset, a cross-origin upgrade that carries `Cookie`
|
|
63
|
-
* or `Authorization` gets 403.
|
|
64
|
-
*/
|
|
65
|
-
allowedOrigins?: WSOriginPolicy
|
|
66
|
-
handler: (c: C, conn: ConnContext) => void | Promise<void>
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/** A realtime route after validation, with every default applied. */
|
|
70
|
-
export type RealtimeConfig = {
|
|
71
|
-
allowedOrigins: WSOriginPolicy | null
|
|
72
|
-
handler: RealtimeRouteOpts["handler"]
|
|
73
|
-
identify: NonNullable<RealtimeRouteOpts["identify"]> | null
|
|
74
|
-
limits: Required<RealtimeLimits>
|
|
75
|
-
namespace: string
|
|
76
|
-
/** false when `namespace` is the default (the route's path), which follows the route when mounted */
|
|
77
|
-
namespaceExplicit: boolean
|
|
78
|
-
onError: NonNullable<RealtimeRouteOpts["onError"]> | null
|
|
79
|
-
path: string
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const DEFAULT_LIMITS: Required<RealtimeLimits> = {
|
|
83
|
-
maxBufferedBytes: 4 * 1024 * 1024,
|
|
84
|
-
maxFrameBytes: 1024 * 1024,
|
|
85
|
-
maxPendingFrames: 64,
|
|
86
|
-
maxTopics: 128,
|
|
87
|
-
slowConsumer: "close",
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
function positiveInt(name: string, value: unknown, fallback: number): number {
|
|
91
|
-
if (value === undefined) return fallback
|
|
92
|
-
if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 1) {
|
|
93
|
-
throw new TypeError(`realtime limits.${name} must be a positive integer, got ${String(value)}`)
|
|
94
|
-
}
|
|
95
|
-
return value
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/** Validate `app.realtime()` options. Options the shipped bus does not implement are rejected, not ignored. */
|
|
99
|
-
export function resolveRealtimeConfig<C>(path: string, routeOpts: RealtimeRouteOpts<C>): RealtimeConfig {
|
|
100
|
-
const opts = routeOpts as unknown as RealtimeRouteOpts
|
|
101
|
-
if (typeof opts?.handler !== "function") {
|
|
102
|
-
throw new TypeError(`app.realtime("${path}"): handler must be a function`)
|
|
103
|
-
}
|
|
104
|
-
const legacy = opts as { reconnectBuffer?: unknown; transports?: unknown }
|
|
105
|
-
if (legacy.reconnectBuffer !== undefined) {
|
|
106
|
-
throw new TypeError(
|
|
107
|
-
`app.realtime("${path}"): reconnectBuffer is not supported. Realtime ships the WebSocket transport without resume; remove the option.`,
|
|
108
|
-
)
|
|
109
|
-
}
|
|
110
|
-
if (legacy.transports !== undefined) {
|
|
111
|
-
throw new TypeError(`app.realtime("${path}"): only the WebSocket transport ships; remove transports.`)
|
|
112
|
-
}
|
|
113
|
-
if (opts.namespace !== undefined && (typeof opts.namespace !== "string" || opts.namespace === "")) {
|
|
114
|
-
throw new TypeError(`app.realtime("${path}"): namespace must be a non-empty string`)
|
|
115
|
-
}
|
|
116
|
-
const l = opts.limits ?? {}
|
|
117
|
-
if (l.slowConsumer !== undefined && l.slowConsumer !== "close" && l.slowConsumer !== "drop") {
|
|
118
|
-
throw new TypeError(`realtime limits.slowConsumer must be "close" or "drop"`)
|
|
119
|
-
}
|
|
120
|
-
return {
|
|
121
|
-
allowedOrigins: opts.allowedOrigins === undefined ? null : validateOriginPolicy(opts.allowedOrigins),
|
|
122
|
-
handler: opts.handler,
|
|
123
|
-
identify: opts.identify ?? null,
|
|
124
|
-
limits: {
|
|
125
|
-
maxBufferedBytes: positiveInt("maxBufferedBytes", l.maxBufferedBytes, DEFAULT_LIMITS.maxBufferedBytes),
|
|
126
|
-
maxFrameBytes: positiveInt("maxFrameBytes", l.maxFrameBytes, DEFAULT_LIMITS.maxFrameBytes),
|
|
127
|
-
maxPendingFrames: positiveInt("maxPendingFrames", l.maxPendingFrames, DEFAULT_LIMITS.maxPendingFrames),
|
|
128
|
-
maxTopics: positiveInt("maxTopics", l.maxTopics, DEFAULT_LIMITS.maxTopics),
|
|
129
|
-
slowConsumer: l.slowConsumer ?? DEFAULT_LIMITS.slowConsumer,
|
|
130
|
-
},
|
|
131
|
-
namespace: opts.namespace ?? path,
|
|
132
|
-
namespaceExplicit: opts.namespace !== undefined,
|
|
133
|
-
onError: opts.onError ?? null,
|
|
134
|
-
path,
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
const encoder = new TextEncoder()
|
|
139
|
-
|
|
140
|
-
/** Cut `reason` to at most `max` UTF-8 bytes without splitting a code point. */
|
|
141
|
-
export function truncateUtf8(reason: string, max: number): string {
|
|
142
|
-
if (reason.length * 3 <= max) return reason
|
|
143
|
-
if (encoder.encode(reason).byteLength <= max) return reason
|
|
144
|
-
let bytes = 0
|
|
145
|
-
let out = ""
|
|
146
|
-
for (const ch of reason) {
|
|
147
|
-
const n = encoder.encode(ch).byteLength
|
|
148
|
-
if (bytes + n > max) break
|
|
149
|
-
bytes += n
|
|
150
|
-
out += ch
|
|
151
|
-
}
|
|
152
|
-
return out
|
|
153
|
-
}
|
package/src/realtime/server.ts
DELETED
|
@@ -1,298 +0,0 @@
|
|
|
1
|
-
import { invokeUser } from "../invoke-user.ts"
|
|
2
|
-
import type { WSContext, WSHandler } from "../ws/cloudflare.ts"
|
|
3
|
-
import { encodeRealtimeFrame } from "./bus.ts"
|
|
4
|
-
import type { RealtimeBus } from "./bus.ts"
|
|
5
|
-
import {
|
|
6
|
-
bufferedAmountOf,
|
|
7
|
-
CLOSE_INTERNAL,
|
|
8
|
-
CLOSE_NORMAL,
|
|
9
|
-
CLOSE_POLICY,
|
|
10
|
-
CLOSE_TOO_BIG,
|
|
11
|
-
CLOSE_TRY_AGAIN,
|
|
12
|
-
exceedsPayload,
|
|
13
|
-
MAX_CLOSE_REASON,
|
|
14
|
-
} from "../ws/shared.ts"
|
|
15
|
-
import { truncateUtf8 } from "./route.ts"
|
|
16
|
-
import type { ConnContext, RealtimeConfig } from "./route.ts"
|
|
17
|
-
|
|
18
|
-
type Logger = {
|
|
19
|
-
error?: (obj: Record<string, unknown>, msg?: string) => void
|
|
20
|
-
warn?: (obj: Record<string, unknown>, msg?: string) => void
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/** `ctx.realtime` — publish into a realtime namespace from any request. */
|
|
24
|
-
export type RealtimePublisher = {
|
|
25
|
-
/**
|
|
26
|
-
* Publish to `topic` in the app's only realtime namespace. Throws when the app has several
|
|
27
|
-
* namespaces; use `namespace(name).publish()` then.
|
|
28
|
-
*/
|
|
29
|
-
publish(topic: string, data: unknown): void
|
|
30
|
-
/** The publisher for one namespace (a route's `namespace` option, or its full path pattern). */
|
|
31
|
-
namespace(name: string): { publish(topic: string, data: unknown): void }
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const SEP = "\u0000"
|
|
35
|
-
|
|
36
|
-
/** The bus key of `topic` in namespace `ns`. Namespaces never see each other's topics. */
|
|
37
|
-
export function topicKey(ns: string, topic: string): string {
|
|
38
|
-
return ns + SEP + topic
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export function createRealtimePublisher(bus: RealtimeBus, namespaces: () => Iterable<string>): RealtimePublisher {
|
|
42
|
-
const forNs = (ns: string) => ({
|
|
43
|
-
publish(topic: string, data: unknown) {
|
|
44
|
-
bus.publish(topicKey(ns, String(topic)), data)
|
|
45
|
-
},
|
|
46
|
-
})
|
|
47
|
-
return {
|
|
48
|
-
namespace(name: string) {
|
|
49
|
-
return forNs(String(name))
|
|
50
|
-
},
|
|
51
|
-
publish(topic: string, data: unknown) {
|
|
52
|
-
const all = new Set(namespaces())
|
|
53
|
-
if (all.size !== 1) {
|
|
54
|
-
throw new Error(
|
|
55
|
-
all.size === 0
|
|
56
|
-
? "ctx.realtime.publish: the app has no realtime routes"
|
|
57
|
-
: `ctx.realtime.publish: the app has ${all.size} realtime namespaces (${[...all].join(", ")}); use ctx.realtime.namespace(name).publish(topic, data)`,
|
|
58
|
-
)
|
|
59
|
-
}
|
|
60
|
-
forNs(all.values().next().value as string).publish(topic, data)
|
|
61
|
-
},
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export type RealtimeSession = {
|
|
66
|
-
/** The handler to pass to the runtime's WebSocket adapter. */
|
|
67
|
-
handler: WSHandler<unknown>
|
|
68
|
-
/** Attach the socket and start the connection (idempotent). Adapters that return an open socket from `upgrade()` call this right away; others get it from `onOpen`. */
|
|
69
|
-
attach(ws: WSContext<unknown>): void
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* One realtime connection: binds the socket to the bus and runs the route's callbacks on one ordered
|
|
74
|
-
* queue — `handler`, then each inbound frame, then `close` — each awaited. Every callback is
|
|
75
|
-
* contained: a throw or rejection goes to the route's `onError` (or the app logger) and never escapes
|
|
76
|
-
* into the runtime, so it can neither crash the process nor poison the queue.
|
|
77
|
-
*/
|
|
78
|
-
export function createRealtimeSession(opts: {
|
|
79
|
-
bus: RealtimeBus
|
|
80
|
-
config: RealtimeConfig
|
|
81
|
-
ctx: unknown
|
|
82
|
-
log: Logger | undefined
|
|
83
|
-
userId: string | null
|
|
84
|
-
}): RealtimeSession {
|
|
85
|
-
const { bus, config, ctx, log, userId } = opts
|
|
86
|
-
const { limits, namespace } = config
|
|
87
|
-
const connId = crypto.randomUUID()
|
|
88
|
-
const state: Record<string, unknown> = {}
|
|
89
|
-
|
|
90
|
-
let socket: WSContext<unknown> | null = null
|
|
91
|
-
let closed = false
|
|
92
|
-
let tornDown = false
|
|
93
|
-
let closeRan = false
|
|
94
|
-
let onMessageFn: ((payload: unknown) => void | Promise<void>) | null = null
|
|
95
|
-
let onCloseFn: ((reason: string) => void | Promise<void>) | null = null
|
|
96
|
-
|
|
97
|
-
/* ordered queue: open → messages → close. Every inbound frame waits in `inbox` in arrival
|
|
98
|
-
* order, including frames that beat the open or the `message` handler; a drain task delivers
|
|
99
|
-
* them, so a frame never overtakes one that arrived before it. */
|
|
100
|
-
let queue: Promise<void> = Promise.resolve()
|
|
101
|
-
const inbox: unknown[] = []
|
|
102
|
-
|
|
103
|
-
/* the same containment as WebSocket callbacks: onError gets the error, an onError that
|
|
104
|
-
* throws is logged and never invoked again for its own error, nothing reaches the runtime */
|
|
105
|
-
const invoke = (phase: string, fn: () => void | Promise<void>): Promise<boolean> =>
|
|
106
|
-
invokeUser(fn, {
|
|
107
|
-
fields: { connId, namespace, route: config.path },
|
|
108
|
-
log,
|
|
109
|
-
onError: config.onError ? (err) => config.onError?.(err, conn) : null,
|
|
110
|
-
phase,
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
const enqueue = (task: () => Promise<unknown>) => {
|
|
114
|
-
queue = queue.then(task).then(
|
|
115
|
-
() => undefined,
|
|
116
|
-
() => undefined,
|
|
117
|
-
)
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/** Drop the connection from the bus. Runs exactly once, before any user close handler. */
|
|
121
|
-
const teardown = () => {
|
|
122
|
-
if (tornDown) return
|
|
123
|
-
tornDown = true
|
|
124
|
-
closed = true
|
|
125
|
-
bus.unsubscribeAll(connId)
|
|
126
|
-
bus.removeHandler(connId)
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
const closeSocket = (code: number, reason: string) => {
|
|
130
|
-
const ws = socket
|
|
131
|
-
teardown()
|
|
132
|
-
if (ws === null) return
|
|
133
|
-
try {
|
|
134
|
-
ws.close(code, truncateUtf8(reason, MAX_CLOSE_REASON))
|
|
135
|
-
} catch (e) {
|
|
136
|
-
log?.warn?.({ connId, err: e }, "realtime close failed")
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
const sendFrame = (frame: string) => {
|
|
141
|
-
const ws = socket
|
|
142
|
-
if (closed || ws === null) return
|
|
143
|
-
if (bufferedAmountOf(ws.raw) > limits.maxBufferedBytes) {
|
|
144
|
-
if (limits.slowConsumer === "drop") return
|
|
145
|
-
closeSocket(CLOSE_TRY_AGAIN, "slow consumer")
|
|
146
|
-
return
|
|
147
|
-
}
|
|
148
|
-
try {
|
|
149
|
-
ws.send(frame)
|
|
150
|
-
} catch (e) {
|
|
151
|
-
/* the socket went away between the readyState check and the write */
|
|
152
|
-
log?.warn?.({ connId, err: e }, "realtime send failed")
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/* frames that arrived before the close still run; the close handler is queued after them.
|
|
157
|
-
* Without a handler the frames stay in the inbox until one is attached, or are dropped on close. */
|
|
158
|
-
const drain = async (): Promise<void> => {
|
|
159
|
-
while (inbox.length > 0) {
|
|
160
|
-
const fn = onMessageFn
|
|
161
|
-
if (fn === null) {
|
|
162
|
-
if (closed) inbox.length = 0
|
|
163
|
-
return
|
|
164
|
-
}
|
|
165
|
-
const payload = inbox.shift()
|
|
166
|
-
await invoke("message", () => fn(payload))
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
const accept = (payload: unknown) => {
|
|
171
|
-
if (inbox.length >= limits.maxPendingFrames) {
|
|
172
|
-
closeSocket(CLOSE_POLICY, "too many pending frames")
|
|
173
|
-
return
|
|
174
|
-
}
|
|
175
|
-
inbox.push(payload)
|
|
176
|
-
enqueue(drain)
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
const conn = Object.create(null) as ConnContext
|
|
180
|
-
Object.defineProperties(conn, {
|
|
181
|
-
close: {
|
|
182
|
-
enumerable: true,
|
|
183
|
-
value(reason?: string) {
|
|
184
|
-
if (closed) return
|
|
185
|
-
closeSocket(CLOSE_NORMAL, reason === undefined ? "" : String(reason))
|
|
186
|
-
},
|
|
187
|
-
},
|
|
188
|
-
closed: { enumerable: true, get: () => closed },
|
|
189
|
-
id: { enumerable: true, value: connId },
|
|
190
|
-
join: {
|
|
191
|
-
enumerable: true,
|
|
192
|
-
value(topic: string) {
|
|
193
|
-
if (closed) return
|
|
194
|
-
const key = topicKey(namespace, String(topic))
|
|
195
|
-
if (bus.topicCount(connId) >= limits.maxTopics && !bus.isSubscribed(connId, key)) {
|
|
196
|
-
throw new RangeError(`realtime: a connection may join at most ${limits.maxTopics} topics`)
|
|
197
|
-
}
|
|
198
|
-
bus.subscribe(connId, key)
|
|
199
|
-
},
|
|
200
|
-
},
|
|
201
|
-
leave: {
|
|
202
|
-
enumerable: true,
|
|
203
|
-
value(topic: string) {
|
|
204
|
-
if (closed) return
|
|
205
|
-
bus.unsubscribe(connId, topicKey(namespace, String(topic)))
|
|
206
|
-
},
|
|
207
|
-
},
|
|
208
|
-
on: {
|
|
209
|
-
enumerable: true,
|
|
210
|
-
value(event: "message" | "close", fn: (arg: never) => void | Promise<void>) {
|
|
211
|
-
if (typeof fn !== "function") throw new TypeError("conn.on: handler must be a function")
|
|
212
|
-
if (event === "message") {
|
|
213
|
-
onMessageFn = fn as (payload: unknown) => void | Promise<void>
|
|
214
|
-
/* frames that waited for a handler run next, in arrival order */
|
|
215
|
-
if (inbox.length > 0) enqueue(drain)
|
|
216
|
-
} else if (event === "close") {
|
|
217
|
-
onCloseFn = fn as (reason: string) => void | Promise<void>
|
|
218
|
-
} else {
|
|
219
|
-
throw new TypeError(`conn.on: unknown event "${String(event)}"`)
|
|
220
|
-
}
|
|
221
|
-
},
|
|
222
|
-
},
|
|
223
|
-
/* publishing after close is allowed: a close handler announcing a departure is the common case */
|
|
224
|
-
publish: {
|
|
225
|
-
enumerable: true,
|
|
226
|
-
value(topic: string, payload: unknown) {
|
|
227
|
-
bus.publish(topicKey(namespace, String(topic)), payload)
|
|
228
|
-
},
|
|
229
|
-
},
|
|
230
|
-
send: {
|
|
231
|
-
enumerable: true,
|
|
232
|
-
value(payload: unknown) {
|
|
233
|
-
const frame = encodeRealtimeFrame(payload)
|
|
234
|
-
sendFrame(frame)
|
|
235
|
-
},
|
|
236
|
-
},
|
|
237
|
-
state: { enumerable: true, get: () => state },
|
|
238
|
-
transport: { enumerable: true, value: "ws" },
|
|
239
|
-
userId: { enumerable: true, value: userId },
|
|
240
|
-
})
|
|
241
|
-
|
|
242
|
-
const attach = (ws: WSContext<unknown>) => {
|
|
243
|
-
if (socket !== null || tornDown) return
|
|
244
|
-
socket = ws
|
|
245
|
-
bus.onMessage(connId, sendFrame)
|
|
246
|
-
enqueue(async () => {
|
|
247
|
-
const ok = await invoke("handler", () => config.handler(ctx, conn))
|
|
248
|
-
if (!ok) closeSocket(CLOSE_INTERNAL, "internal error")
|
|
249
|
-
})
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
const onSocketClose = (reason: string) => {
|
|
253
|
-
teardown()
|
|
254
|
-
if (closeRan) return
|
|
255
|
-
closeRan = true
|
|
256
|
-
enqueue(() => {
|
|
257
|
-
const fn = onCloseFn
|
|
258
|
-
return fn === null ? Promise.resolve() : invoke("close", () => fn(reason))
|
|
259
|
-
})
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
const handler: WSHandler<unknown> = {
|
|
263
|
-
onClose: (_ctx, _ws, _code, reason) => {
|
|
264
|
-
onSocketClose(reason || "normal")
|
|
265
|
-
},
|
|
266
|
-
onError: (_ctx, _ws, error) => {
|
|
267
|
-
log?.warn?.({ connId, err: error }, "realtime socket error")
|
|
268
|
-
},
|
|
269
|
-
onMessage: (_ctx, _ws, data) => {
|
|
270
|
-
if (closed) return
|
|
271
|
-
/* the wire format is JSON text; binary frames are not part of it */
|
|
272
|
-
if (typeof data !== "string") return
|
|
273
|
-
if (exceedsPayload(data, limits.maxFrameBytes)) {
|
|
274
|
-
closeSocket(CLOSE_TOO_BIG, "frame too large")
|
|
275
|
-
return
|
|
276
|
-
}
|
|
277
|
-
let payload: unknown
|
|
278
|
-
try {
|
|
279
|
-
payload = JSON.parse(data)
|
|
280
|
-
} catch {
|
|
281
|
-
/* not JSON: not a frame of this protocol */
|
|
282
|
-
return
|
|
283
|
-
}
|
|
284
|
-
if (socket === null) {
|
|
285
|
-
/* a frame before open (runtime quirk): it waits in the inbox, ahead of later frames */
|
|
286
|
-
if (inbox.length >= limits.maxPendingFrames) return
|
|
287
|
-
inbox.push(payload)
|
|
288
|
-
return
|
|
289
|
-
}
|
|
290
|
-
accept(payload)
|
|
291
|
-
},
|
|
292
|
-
onOpen: (_ctx, ws) => {
|
|
293
|
-
attach(ws)
|
|
294
|
-
},
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
return { attach, handler }
|
|
298
|
-
}
|
package/src/request-id.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { namedMiddleware } from "./middleware.ts"
|
|
2
|
-
import type { MiddlewareFn } from "./middleware.ts"
|
|
3
|
-
import { withHeaders } from "./with-headers.ts"
|
|
4
|
-
|
|
5
|
-
type RequestIdOptions = {
|
|
6
|
-
generator?: () => string
|
|
7
|
-
header?: string
|
|
8
|
-
/**
|
|
9
|
-
* Decides whether an inbound id is reused. Default: 1–128 characters of
|
|
10
|
-
* `A-Z a-z 0-9 . _ : + / = -` (UUIDs, ULIDs, base64, W3C trace ids).
|
|
11
|
-
* Anything else is replaced with a generated id, so a client cannot put
|
|
12
|
-
* arbitrary text into logs or response headers.
|
|
13
|
-
*/
|
|
14
|
-
validate?: (id: string) => boolean
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const SAFE_ID_RE = /^[\w.:+/=-]{1,128}$/
|
|
18
|
-
|
|
19
|
-
export function requestId(options?: RequestIdOptions): MiddlewareFn<{ req: Request }, { requestId: string }> {
|
|
20
|
-
const headerName = options?.header ?? "x-request-id"
|
|
21
|
-
const generate = options?.generator ?? (() => crypto.randomUUID())
|
|
22
|
-
const validate = options?.validate ?? ((id: string) => SAFE_ID_RE.test(id))
|
|
23
|
-
|
|
24
|
-
const mw: MiddlewareFn<{ req: Request }, { requestId: string }> = async (ctx, next) => {
|
|
25
|
-
const existing = ctx.req.headers.get(headerName)
|
|
26
|
-
const id = existing !== null && validate(existing) ? existing : generate()
|
|
27
|
-
const response = await next({ requestId: id })
|
|
28
|
-
return withHeaders(response, (headers) => headers.set(headerName, id))
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return namedMiddleware("requestId", mw)
|
|
32
|
-
}
|
package/src/request-limits.ts
DELETED
package/src/request-path.ts
DELETED
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
const PLAIN = 0
|
|
2
|
-
/** a character the slow path rewrites: a backslash, or one `encodeSegment` percent-encodes */
|
|
3
|
-
const SLOW = 1
|
|
4
|
-
const PERCENT = 2
|
|
5
|
-
const SLASH = 3
|
|
6
|
-
|
|
7
|
-
const CHAR_CLASS = new Uint8Array(128)
|
|
8
|
-
for (let c = 0; c < 128; c++) {
|
|
9
|
-
if (c <= 0x20 || c === 0x7f || c === 92 || needsEncoding(c)) CHAR_CLASS[c] = SLOW
|
|
10
|
-
}
|
|
11
|
-
CHAR_CLASS[37] = PERCENT
|
|
12
|
-
CHAR_CLASS[47] = SLASH
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* The request path the router, scopes, `ctx.path`, `proxy()` and `staticFiles()` all see.
|
|
16
|
-
*
|
|
17
|
-
* Policy, applied the same way on every runtime:
|
|
18
|
-
* - empty segments collapse: `//admin///users` is `/admin/users`
|
|
19
|
-
* - dot segments resolve: `.` is dropped and `..` removes the segment before it, never past
|
|
20
|
-
* the root; `%2e` counts as a dot, as it does for WHATWG URL parsing
|
|
21
|
-
* - a trailing slash is kept (the router and `trailingSlash()` decide what it means)
|
|
22
|
-
* - a backslash is a `/`, and characters a URL path cannot hold raw (space, controls, `"`, `<`,
|
|
23
|
-
* `>`, `` ` ``, `{`, `}`, non-ASCII) are percent-encoded as UTF-8 — what WHATWG URL parsing
|
|
24
|
-
* does, so a runtime that hands the app the raw target (Deno) and one that parses it first
|
|
25
|
-
* (Bun, Node) route the same bytes the same way
|
|
26
|
-
* - an encoded `/` or `\` (`%2F`, `%5C`) is rejected unless `encodedSlashes` is `"allow"`: a
|
|
27
|
-
* segment that decodes to a path separator means one thing to this router and another to
|
|
28
|
-
* whatever the path is forwarded to (a proxy upstream, a file system). Allowed, it stays
|
|
29
|
-
* encoded in the path and decodes into a param value.
|
|
30
|
-
* - everything else stays percent-encoded; params are decoded when they are extracted
|
|
31
|
-
*
|
|
32
|
-
* Returns `null` for a rejected path; the app answers 400.
|
|
33
|
-
*/
|
|
34
|
-
export function normalizePath(raw: string, encodedSlashes: "allow" | "reject" = "reject"): string | null {
|
|
35
|
-
const rejectEncoded = encodedSlashes === "reject"
|
|
36
|
-
let canonical = raw.charCodeAt(0) === 47
|
|
37
|
-
const len = raw.length
|
|
38
|
-
for (let i = 0; i < len; i++) {
|
|
39
|
-
const c = raw.charCodeAt(i)
|
|
40
|
-
const k = c < 128 ? CHAR_CLASS[c] : SLOW
|
|
41
|
-
if (k === PLAIN) continue
|
|
42
|
-
if (k === SLOW) {
|
|
43
|
-
canonical = false
|
|
44
|
-
} else if (k === PERCENT) {
|
|
45
|
-
const hi = raw.charCodeAt(i + 1)
|
|
46
|
-
const lo = raw.charCodeAt(i + 2) | 0x20
|
|
47
|
-
if (hi === 50 /* 2 */) {
|
|
48
|
-
if (lo === 102 /* f */ && rejectEncoded) return null
|
|
49
|
-
if (lo === 101 /* e */) canonical = false
|
|
50
|
-
} else if (hi === 53 /* 5 */ && lo === 99 /* c */ && rejectEncoded) {
|
|
51
|
-
return null
|
|
52
|
-
}
|
|
53
|
-
} else {
|
|
54
|
-
const n = raw.charCodeAt(i + 1)
|
|
55
|
-
if (n === 47 || n === 46 /* . */) canonical = false
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
if (canonical) return raw
|
|
59
|
-
|
|
60
|
-
const out: string[] = []
|
|
61
|
-
const segments = raw.replaceAll("\\", "/").split("/")
|
|
62
|
-
let trailing = false
|
|
63
|
-
for (let i = 0; i < segments.length; i++) {
|
|
64
|
-
const seg = segments[i]
|
|
65
|
-
const last = i === segments.length - 1
|
|
66
|
-
if (seg === "") {
|
|
67
|
-
if (last && i > 0) trailing = true
|
|
68
|
-
continue
|
|
69
|
-
}
|
|
70
|
-
const dots = dotSegment(seg)
|
|
71
|
-
if (dots === 0) {
|
|
72
|
-
out.push(encodeSegment(seg))
|
|
73
|
-
continue
|
|
74
|
-
}
|
|
75
|
-
if (dots === 2) out.pop()
|
|
76
|
-
/* `/a/b/..` is `/a/`, like URL resolution */
|
|
77
|
-
if (last) trailing = true
|
|
78
|
-
}
|
|
79
|
-
if (out.length === 0) return "/"
|
|
80
|
-
const path = `/${out.join("/")}`
|
|
81
|
-
return trailing ? `${path}/` : path
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* The WHATWG path percent-encode set, plus every non-ASCII code unit. `^` joined the set in
|
|
86
|
-
* 2023; Node and Bun encode it, Deno's parser does not yet, so it is encoded here to keep
|
|
87
|
-
* `ctx.path` the same on all three.
|
|
88
|
-
*/
|
|
89
|
-
function needsEncoding(c: number): boolean {
|
|
90
|
-
return (
|
|
91
|
-
c <= 0x20 ||
|
|
92
|
-
c >= 0x7f ||
|
|
93
|
-
c === 34 /* " */ ||
|
|
94
|
-
c === 60 /* < */ ||
|
|
95
|
-
c === 62 /* > */ ||
|
|
96
|
-
c === 94 /* ^ */ ||
|
|
97
|
-
c === 96 /* ` */ ||
|
|
98
|
-
c === 123 /* { */ ||
|
|
99
|
-
c === 125 /* } */
|
|
100
|
-
)
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* One path segment as a normalized request path holds it: characters a URL path cannot hold
|
|
105
|
-
* raw become UTF-8 percent escapes, everything else (existing escapes included) is kept.
|
|
106
|
-
* Route patterns encode their static segments with this too, so `app.get("/é")` matches the
|
|
107
|
-
* `/%C3%A9` every runtime hands the app.
|
|
108
|
-
*/
|
|
109
|
-
export function encodeSegment(seg: string): string {
|
|
110
|
-
let needs = false
|
|
111
|
-
for (let i = 0; i < seg.length; i++) {
|
|
112
|
-
if (needsEncoding(seg.charCodeAt(i))) {
|
|
113
|
-
needs = true
|
|
114
|
-
break
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
if (!needs) return seg
|
|
118
|
-
let out = ""
|
|
119
|
-
for (const ch of seg) {
|
|
120
|
-
const c = ch.charCodeAt(0)
|
|
121
|
-
if (ch.length === 1 && !needsEncoding(c)) {
|
|
122
|
-
out += ch
|
|
123
|
-
continue
|
|
124
|
-
}
|
|
125
|
-
try {
|
|
126
|
-
out += encodeURIComponent(ch)
|
|
127
|
-
} catch {
|
|
128
|
-
/* a lone surrogate: U+FFFD, as URL parsing encodes it */
|
|
129
|
-
out += "%EF%BF%BD"
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
return out
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/** 1 for `.`, 2 for `..` (either may be written `%2e`), 0 for anything else. */
|
|
136
|
-
function dotSegment(seg: string): 0 | 1 | 2 {
|
|
137
|
-
if (seg.length > 6) return 0
|
|
138
|
-
const s = seg.toLowerCase().replaceAll("%2e", ".")
|
|
139
|
-
if (s === ".") return 1
|
|
140
|
-
if (s === "..") return 2
|
|
141
|
-
return 0
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/** The path of a request URL without `new URL()`: everything from the first `/` after the authority, up to `?` or `#`. */
|
|
145
|
-
export function pathOfUrl(rawUrl: string): string {
|
|
146
|
-
const protoEnd = rawUrl.indexOf("//")
|
|
147
|
-
const pathStart = protoEnd === -1 ? 0 : rawUrl.indexOf("/", protoEnd + 2)
|
|
148
|
-
if (pathStart === -1) return "/"
|
|
149
|
-
for (let i = pathStart; i < rawUrl.length; i++) {
|
|
150
|
-
const c = rawUrl.charCodeAt(i)
|
|
151
|
-
if (c === 63 /* ? */ || c === 35 /* # */) return rawUrl.substring(pathStart, i)
|
|
152
|
-
}
|
|
153
|
-
return rawUrl.substring(pathStart)
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/** `?query` of a request URL (with the `?`), or `""`. Never includes a fragment. */
|
|
157
|
-
export function searchOfUrl(rawUrl: string): string {
|
|
158
|
-
const protoEnd = rawUrl.indexOf("//")
|
|
159
|
-
const pathStart = protoEnd === -1 ? 0 : rawUrl.indexOf("/", protoEnd + 2)
|
|
160
|
-
if (pathStart === -1) return ""
|
|
161
|
-
const q = rawUrl.indexOf("?", pathStart)
|
|
162
|
-
if (q === -1) return ""
|
|
163
|
-
const hash = rawUrl.indexOf("#", q)
|
|
164
|
-
return hash === -1 ? rawUrl.substring(q) : rawUrl.substring(q, hash)
|
|
165
|
-
}
|