@lovrozagar/honey 0.6.8 → 0.7.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/README.md +514 -192
- package/bin/honey.js +25 -0
- package/dist/accepts.d.ts +7 -1
- package/dist/accepts.d.ts.map +1 -1
- package/dist/accepts.js +126 -0
- package/dist/accepts.js.map +1 -0
- package/dist/body-kind.d.ts +26 -0
- package/dist/body-kind.d.ts.map +1 -0
- package/dist/body-kind.js +70 -0
- package/dist/body-kind.js.map +1 -0
- package/dist/body-limit.d.ts +5 -1
- package/dist/body-limit.d.ts.map +1 -1
- package/dist/body-limit.js +126 -0
- package/dist/body-limit.js.map +1 -0
- package/dist/build/index.d.ts +19 -3
- package/dist/build/index.d.ts.map +1 -1
- package/dist/build/index.js +173 -0
- package/dist/build/index.js.map +1 -0
- package/dist/cli-args.d.ts +33 -0
- package/dist/cli-args.d.ts.map +1 -0
- package/dist/cli-args.js +102 -0
- package/dist/cli-args.js.map +1 -0
- package/dist/cli-go/auth.go +26 -0
- package/dist/cli-go/config.go +192 -0
- package/dist/cli-go/errors.go +75 -0
- package/dist/cli-go/multipart.go +79 -0
- package/dist/cli-go/output.go +163 -0
- package/dist/cli-go/root.go +30 -0
- package/dist/cli-go/stream.go +88 -0
- package/dist/cli-go/version.go +5 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +209 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/defaults.js +48 -0
- package/dist/client/defaults.js.map +1 -0
- package/dist/client/error.d.ts +35 -0
- package/dist/client/error.d.ts.map +1 -1
- package/dist/client/error.js +71 -0
- package/dist/client/error.js.map +1 -0
- package/dist/client/http.d.ts +67 -8
- package/dist/client/http.d.ts.map +1 -1
- package/dist/client/http.js +571 -0
- package/dist/client/http.js.map +1 -0
- package/dist/client/index.d.ts +3 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +95 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/path.d.ts +26 -0
- package/dist/client/path.d.ts.map +1 -0
- package/dist/client/path.js +163 -0
- package/dist/client/path.js.map +1 -0
- package/dist/client/redirect-policy.d.ts +12 -0
- package/dist/client/redirect-policy.d.ts.map +1 -0
- package/dist/client/redirect-policy.js +20 -0
- package/dist/client/redirect-policy.js.map +1 -0
- package/dist/client/sdk.d.ts +36 -0
- package/dist/client/sdk.d.ts.map +1 -1
- package/dist/client/sdk.js +292 -0
- package/dist/client/sdk.js.map +1 -0
- package/dist/client/sse.d.ts +13 -0
- package/dist/client/sse.d.ts.map +1 -1
- package/dist/client/sse.js +129 -0
- package/dist/client/sse.js.map +1 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client/ws.d.ts +9 -2
- package/dist/client/ws.d.ts.map +1 -1
- package/dist/client/ws.js +112 -0
- package/dist/client/ws.js.map +1 -0
- package/dist/client-go/errors.go +236 -0
- package/dist/client-go/export.go +44 -0
- package/dist/client-go/invalidation.go +371 -0
- package/dist/client-go/nullable.go +62 -0
- package/dist/client-go/realtime.go +354 -0
- package/dist/client-go/result.go +20 -0
- package/dist/client-go/runtime.go +975 -0
- package/dist/client-go/sse.go +159 -0
- package/dist/client-go/transport.go +495 -0
- package/dist/client-go/ws.go +128 -0
- package/dist/client-info.d.ts +36 -0
- package/dist/client-info.d.ts.map +1 -0
- package/dist/client-info.js +53 -0
- package/dist/client-info.js.map +1 -0
- package/dist/client-mcp/README.md +10 -0
- package/dist/client-mcp/server.ts +221 -0
- package/dist/client-mcp/types.ts +19 -0
- package/dist/client-python/_errors.py +115 -0
- package/dist/client-python/_invalidation.py +494 -0
- package/dist/client-python/_realtime.py +179 -0
- package/dist/client-python/_runtime.py +860 -0
- package/dist/client-python/_sse.py +155 -0
- package/dist/client-python/_transport.py +366 -0
- package/dist/client-python/_ws.py +159 -0
- package/dist/client-python/py.typed +0 -0
- package/dist/client-rust/errors.rs +220 -0
- package/dist/client-rust/invalidation.rs +412 -0
- package/dist/client-rust/invalidation_sync.rs +93 -0
- package/dist/client-rust/nullable.rs +17 -0
- package/dist/client-rust/realtime.rs +702 -0
- package/dist/client-rust/result.rs +22 -0
- package/dist/client-rust/runtime.rs +980 -0
- package/dist/client-rust/runtime_sync.rs +484 -0
- package/dist/client-rust/sse.rs +188 -0
- package/dist/client-rust/ws.rs +167 -0
- package/dist/codegen-go-cli.d.ts.map +1 -1
- package/dist/codegen-go-cli.js +964 -0
- package/dist/codegen-go-cli.js.map +1 -0
- package/dist/codegen-go.d.ts +15 -3
- package/dist/codegen-go.d.ts.map +1 -1
- package/dist/codegen-go.js +872 -0
- package/dist/codegen-go.js.map +1 -0
- package/dist/codegen-hash.js +9 -0
- package/dist/codegen-hash.js.map +1 -0
- package/dist/codegen-ir.d.ts +69 -2
- package/dist/codegen-ir.d.ts.map +1 -1
- package/dist/codegen-ir.js +661 -0
- package/dist/codegen-ir.js.map +1 -0
- package/dist/codegen-lang.d.ts +65 -0
- package/dist/codegen-lang.d.ts.map +1 -0
- package/dist/codegen-lang.js +526 -0
- package/dist/codegen-lang.js.map +1 -0
- package/dist/codegen-load.d.ts +31 -0
- package/dist/codegen-load.d.ts.map +1 -0
- package/dist/codegen-load.js +138 -0
- package/dist/codegen-load.js.map +1 -0
- package/dist/codegen-loaders.js +55 -0
- package/dist/codegen-loaders.js.map +1 -0
- package/dist/codegen-mcp.d.ts.map +1 -1
- package/dist/codegen-mcp.js +368 -0
- package/dist/codegen-mcp.js.map +1 -0
- package/dist/codegen-python.d.ts +13 -1
- package/dist/codegen-python.d.ts.map +1 -1
- package/dist/codegen-python.js +828 -0
- package/dist/codegen-python.js.map +1 -0
- package/dist/codegen-route-tree-intern.d.ts +15 -5
- package/dist/codegen-route-tree-intern.d.ts.map +1 -1
- package/dist/codegen-route-tree-intern.js +221 -0
- package/dist/codegen-route-tree-intern.js.map +1 -0
- package/dist/codegen-rust.d.ts.map +1 -1
- package/dist/codegen-rust.js +1293 -0
- package/dist/codegen-rust.js.map +1 -0
- package/dist/codegen-sanitize.d.ts.map +1 -1
- package/dist/codegen-sanitize.js +56 -0
- package/dist/codegen-sanitize.js.map +1 -0
- package/dist/codegen-schema-naming.d.ts +5 -0
- package/dist/codegen-schema-naming.d.ts.map +1 -1
- package/dist/codegen-schema-naming.js +150 -0
- package/dist/codegen-schema-naming.js.map +1 -0
- package/dist/codegen-sdk-model.d.ts +71 -0
- package/dist/codegen-sdk-model.d.ts.map +1 -0
- package/dist/codegen-sdk-model.js +179 -0
- package/dist/codegen-sdk-model.js.map +1 -0
- package/dist/codegen.d.ts +41 -23
- package/dist/codegen.d.ts.map +1 -1
- package/dist/codegen.js +4610 -0
- package/dist/codegen.js.map +1 -0
- package/dist/context.d.ts +36 -6
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +242 -0
- package/dist/context.js.map +1 -0
- package/dist/cookie-sign.d.ts +16 -2
- package/dist/cookie-sign.d.ts.map +1 -1
- package/dist/cookie-sign.js +104 -0
- package/dist/cookie-sign.js.map +1 -0
- package/dist/cookie.d.ts +12 -0
- package/dist/cookie.d.ts.map +1 -1
- package/dist/cookie.js +138 -0
- package/dist/cookie.js.map +1 -0
- package/dist/cors.d.ts +1 -0
- package/dist/cors.d.ts.map +1 -1
- package/dist/cors.js +87 -0
- package/dist/cors.js.map +1 -0
- package/dist/crypto.d.ts +6 -1
- package/dist/crypto.d.ts.map +1 -1
- package/dist/crypto.js +38 -0
- package/dist/crypto.js.map +1 -0
- package/dist/csrf.d.ts +19 -0
- package/dist/csrf.d.ts.map +1 -1
- package/dist/csrf.js +79 -0
- package/dist/csrf.js.map +1 -0
- package/dist/curl-logger.d.ts +14 -3
- package/dist/curl-logger.d.ts.map +1 -1
- package/dist/curl-logger.js +199 -0
- package/dist/curl-logger.js.map +1 -0
- package/dist/detect-runtime.js +13 -0
- package/dist/detect-runtime.js.map +1 -0
- package/dist/dict.d.ts +11 -0
- package/dist/dict.d.ts.map +1 -0
- package/dist/dict.js +13 -0
- package/dist/dict.js.map +1 -0
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +44 -0
- package/dist/error.js.map +1 -0
- package/dist/errors.js +39 -0
- package/dist/errors.js.map +1 -0
- package/dist/etag.d.ts +2 -0
- package/dist/etag.d.ts.map +1 -1
- package/dist/etag.js +82 -0
- package/dist/etag.js.map +1 -0
- package/dist/feature-detect.d.ts +25 -0
- package/dist/feature-detect.d.ts.map +1 -0
- package/dist/feature-detect.js +144 -0
- package/dist/feature-detect.js.map +1 -0
- package/dist/feature-load.js +36 -0
- package/dist/feature-load.js.map +1 -0
- package/dist/feature-slots.d.ts +44 -0
- package/dist/feature-slots.d.ts.map +1 -0
- package/dist/feature-slots.js +48 -0
- package/dist/feature-slots.js.map +1 -0
- package/dist/fetch-request.d.ts +10 -0
- package/dist/fetch-request.d.ts.map +1 -0
- package/dist/fetch-request.js +13 -0
- package/dist/fetch-request.js.map +1 -0
- package/dist/gen-process.d.ts +15 -0
- package/dist/gen-process.d.ts.map +1 -0
- package/dist/gen-process.js +43 -0
- package/dist/gen-process.js.map +1 -0
- package/dist/gen-write.d.ts +19 -0
- package/dist/gen-write.d.ts.map +1 -0
- package/dist/gen-write.js +120 -0
- package/dist/gen-write.js.map +1 -0
- package/dist/glob.d.ts +21 -0
- package/dist/glob.d.ts.map +1 -0
- package/dist/glob.js +115 -0
- package/dist/glob.js.map +1 -0
- package/dist/go-type-emitter.d.ts +18 -4
- package/dist/go-type-emitter.d.ts.map +1 -1
- package/dist/go-type-emitter.js +594 -0
- package/dist/go-type-emitter.js.map +1 -0
- package/dist/honey-response.d.ts.map +1 -1
- package/dist/honey-response.js +338 -0
- package/dist/honey-response.js.map +1 -0
- package/dist/i18n-slot.d.ts +8 -0
- package/dist/i18n-slot.d.ts.map +1 -1
- package/dist/i18n-slot.js +14 -0
- package/dist/i18n-slot.js.map +1 -0
- package/dist/i18n.d.ts +3 -0
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +250 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +408 -148
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2324 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +3 -5
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +140 -0
- package/dist/init.js.map +1 -0
- package/dist/input.js +4 -0
- package/dist/input.js.map +1 -0
- package/dist/invalidate-check.d.ts +11 -0
- package/dist/invalidate-check.d.ts.map +1 -1
- package/dist/invalidate-check.js +163 -0
- package/dist/invalidate-check.js.map +1 -0
- package/dist/invoke-user.d.ts +35 -0
- package/dist/invoke-user.d.ts.map +1 -0
- package/dist/invoke-user.js +73 -0
- package/dist/invoke-user.js.map +1 -0
- package/dist/ip-restrict.d.ts +13 -1
- package/dist/ip-restrict.d.ts.map +1 -1
- package/dist/ip-restrict.js +60 -0
- package/dist/ip-restrict.js.map +1 -0
- package/dist/ip.d.ts +39 -0
- package/dist/ip.d.ts.map +1 -0
- package/dist/ip.js +209 -0
- package/dist/ip.js.map +1 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +113 -0
- package/dist/logger.js.map +1 -0
- package/dist/media-type.d.ts +30 -0
- package/dist/media-type.d.ts.map +1 -0
- package/dist/media-type.js +97 -0
- package/dist/media-type.js.map +1 -0
- package/dist/meta-spec-merge.d.ts +32 -0
- package/dist/meta-spec-merge.d.ts.map +1 -0
- package/dist/meta-spec-merge.js +68 -0
- package/dist/meta-spec-merge.js.map +1 -0
- package/dist/meta-spec.d.ts +16 -3
- package/dist/meta-spec.d.ts.map +1 -1
- package/dist/meta-spec.js +535 -0
- package/dist/meta-spec.js.map +1 -0
- package/dist/middleware.d.ts +23 -6
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +253 -0
- package/dist/middleware.js.map +1 -0
- package/dist/node-request.d.ts +57 -12
- package/dist/node-request.d.ts.map +1 -1
- package/dist/node-request.js +407 -0
- package/dist/node-request.js.map +1 -0
- package/dist/node.d.ts +20 -3
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +396 -0
- package/dist/node.js.map +1 -0
- package/dist/openapi/collect.d.ts +6 -3
- package/dist/openapi/collect.d.ts.map +1 -1
- package/dist/openapi/collect.js +30 -0
- package/dist/openapi/collect.js.map +1 -0
- package/dist/openapi/docs-page.d.ts +42 -0
- package/dist/openapi/docs-page.d.ts.map +1 -0
- package/dist/openapi/docs-page.js +80 -0
- package/dist/openapi/docs-page.js.map +1 -0
- package/dist/openapi/document.d.ts +4 -0
- package/dist/openapi/document.d.ts.map +1 -1
- package/dist/openapi/document.js +785 -0
- package/dist/openapi/document.js.map +1 -0
- package/dist/openapi/json-schema-slot.d.ts +7 -0
- package/dist/openapi/json-schema-slot.d.ts.map +1 -1
- package/dist/openapi/json-schema-slot.js +38 -0
- package/dist/openapi/json-schema-slot.js.map +1 -0
- package/dist/openapi/register.d.ts.map +1 -1
- package/dist/openapi/register.js +20 -0
- package/dist/openapi/register.js.map +1 -0
- package/dist/openapi/scalar.d.ts +3 -1
- package/dist/openapi/scalar.d.ts.map +1 -1
- package/dist/openapi/scalar.js +21 -0
- package/dist/openapi/scalar.js.map +1 -0
- package/dist/openapi/serve.d.ts +9 -0
- package/dist/openapi/serve.d.ts.map +1 -0
- package/dist/openapi/serve.js +36 -0
- package/dist/openapi/serve.js.map +1 -0
- package/dist/openapi/spec-factory.d.ts +30 -1
- package/dist/openapi/spec-factory.d.ts.map +1 -1
- package/dist/openapi/spec-factory.js +52 -0
- package/dist/openapi/spec-factory.js.map +1 -0
- package/dist/openapi/spec.d.ts +14 -5
- package/dist/openapi/spec.d.ts.map +1 -1
- package/dist/openapi/spec.js +50 -0
- package/dist/openapi/spec.js.map +1 -0
- package/dist/openapi/swagger.d.ts +3 -1
- package/dist/openapi/swagger.d.ts.map +1 -1
- package/dist/openapi/swagger.js +22 -0
- package/dist/openapi/swagger.js.map +1 -0
- package/dist/pattern.d.ts +71 -0
- package/dist/pattern.d.ts.map +1 -0
- package/dist/pattern.js +239 -0
- package/dist/pattern.js.map +1 -0
- package/dist/peer.d.ts +17 -0
- package/dist/peer.d.ts.map +1 -0
- package/dist/peer.js +50 -0
- package/dist/peer.js.map +1 -0
- package/dist/plugin.d.ts +67 -16
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +649 -0
- package/dist/plugin.js.map +1 -0
- package/dist/powered-by.d.ts.map +1 -1
- package/dist/powered-by.js +11 -0
- package/dist/powered-by.js.map +1 -0
- package/dist/pretty-json.d.ts.map +1 -1
- package/dist/pretty-json.js +47 -0
- package/dist/pretty-json.js.map +1 -0
- package/dist/producer-stream.d.ts +47 -0
- package/dist/producer-stream.d.ts.map +1 -0
- package/dist/producer-stream.js +267 -0
- package/dist/producer-stream.js.map +1 -0
- package/dist/proxy.d.ts +47 -8
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +274 -0
- package/dist/proxy.js.map +1 -0
- package/dist/python-type-emitter.d.ts +14 -1
- package/dist/python-type-emitter.d.ts.map +1 -1
- package/dist/python-type-emitter.js +157 -0
- package/dist/python-type-emitter.js.map +1 -0
- package/dist/realtime/bus.d.ts +17 -1
- package/dist/realtime/bus.d.ts.map +1 -1
- package/dist/realtime/bus.js +112 -0
- package/dist/realtime/bus.js.map +1 -0
- package/dist/realtime/register.d.ts +3 -0
- package/dist/realtime/register.d.ts.map +1 -0
- package/dist/realtime/register.js +10 -0
- package/dist/realtime/register.js.map +1 -0
- package/dist/realtime/route.d.ts +65 -26
- package/dist/realtime/route.d.ts.map +1 -1
- package/dist/realtime/route.js +72 -0
- package/dist/realtime/route.js.map +1 -0
- package/dist/realtime/server.d.ts +43 -0
- package/dist/realtime/server.d.ts.map +1 -0
- package/dist/realtime/server.js +255 -0
- package/dist/realtime/server.js.map +1 -0
- package/dist/request-id.d.ts +7 -0
- package/dist/request-id.d.ts.map +1 -1
- package/dist/request-id.js +16 -0
- package/dist/request-id.js.map +1 -0
- package/dist/request-limits.d.ts +3 -0
- package/dist/request-limits.d.ts.map +1 -0
- package/dist/request-limits.js +3 -0
- package/dist/request-limits.js.map +1 -0
- package/dist/request-path.d.ts +33 -0
- package/dist/request-path.d.ts.map +1 -0
- package/dist/request-path.js +178 -0
- package/dist/request-path.js.map +1 -0
- package/dist/request-to-curl.d.ts +7 -1
- package/dist/request-to-curl.d.ts.map +1 -1
- package/dist/request-to-curl.js +48 -0
- package/dist/request-to-curl.js.map +1 -0
- package/dist/response.d.ts +25 -2
- package/dist/response.d.ts.map +1 -1
- package/dist/response.js +313 -0
- package/dist/response.js.map +1 -0
- package/dist/rust-type-emitter.d.ts +14 -2
- package/dist/rust-type-emitter.d.ts.map +1 -1
- package/dist/rust-type-emitter.js +463 -0
- package/dist/rust-type-emitter.js.map +1 -0
- package/dist/secure-headers.d.ts.map +1 -1
- package/dist/secure-headers.js +53 -0
- package/dist/secure-headers.js.map +1 -0
- package/dist/serve-register.d.ts +4 -0
- package/dist/serve-register.d.ts.map +1 -1
- package/dist/serve-register.js +9 -0
- package/dist/serve-register.js.map +1 -0
- package/dist/serve-slot.d.ts +3 -0
- package/dist/serve-slot.d.ts.map +1 -1
- package/dist/serve-slot.js +52 -0
- package/dist/serve-slot.js.map +1 -0
- package/dist/serve.d.ts +18 -1
- package/dist/serve.d.ts.map +1 -1
- package/dist/serve.js +157 -0
- package/dist/serve.js.map +1 -0
- package/dist/server-timing.d.ts.map +1 -1
- package/dist/server-timing.js +51 -0
- package/dist/server-timing.js.map +1 -0
- package/dist/static.d.ts +9 -0
- package/dist/static.d.ts.map +1 -1
- package/dist/static.js +102 -0
- package/dist/static.js.map +1 -0
- package/dist/telemetry/otel.d.ts +2 -0
- package/dist/telemetry/otel.d.ts.map +1 -1
- package/dist/telemetry/otel.js +135 -0
- package/dist/telemetry/otel.js.map +1 -0
- package/dist/testing.d.ts +12 -0
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +124 -0
- package/dist/testing.js.map +1 -0
- package/dist/timeout.d.ts +6 -0
- package/dist/timeout.d.ts.map +1 -1
- package/dist/timeout.js +36 -0
- package/dist/timeout.js.map +1 -0
- package/dist/tree.d.ts +133 -36
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +437 -0
- package/dist/tree.js.map +1 -0
- package/dist/trust.d.ts +21 -0
- package/dist/trust.d.ts.map +1 -0
- package/dist/trust.js +100 -0
- package/dist/trust.js.map +1 -0
- package/dist/ts-type-emitter.d.ts.map +1 -1
- package/dist/ts-type-emitter.js +150 -0
- package/dist/ts-type-emitter.js.map +1 -0
- package/dist/type-emitter.d.ts +16 -2
- package/dist/type-emitter.d.ts.map +1 -1
- package/dist/type-emitter.js +729 -0
- package/dist/type-emitter.js.map +1 -0
- package/dist/type-extractor.d.ts +8 -4
- package/dist/type-extractor.d.ts.map +1 -1
- package/dist/type-extractor.js +819 -0
- package/dist/type-extractor.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +96 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +14 -2
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +335 -0
- package/dist/validation.js.map +1 -0
- package/dist/with-headers.d.ts +15 -0
- package/dist/with-headers.d.ts.map +1 -0
- package/dist/with-headers.js +45 -0
- package/dist/with-headers.js.map +1 -0
- package/dist/ws/bun.d.ts +11 -5
- package/dist/ws/bun.d.ts.map +1 -1
- package/dist/ws/bun.js +82 -0
- package/dist/ws/bun.js.map +1 -0
- package/dist/ws/cloudflare.d.ts +25 -3
- package/dist/ws/cloudflare.d.ts.map +1 -1
- package/dist/ws/cloudflare.js +117 -0
- package/dist/ws/cloudflare.js.map +1 -0
- package/dist/ws/deno.d.ts +4 -4
- package/dist/ws/deno.d.ts.map +1 -1
- package/dist/ws/deno.js +133 -0
- package/dist/ws/deno.js.map +1 -0
- package/dist/ws/node.d.ts +20 -3
- package/dist/ws/node.d.ts.map +1 -1
- package/dist/ws/node.js +173 -0
- package/dist/ws/node.js.map +1 -0
- package/dist/ws/session.d.ts +11 -0
- package/dist/ws/session.d.ts.map +1 -0
- package/dist/ws/session.js +60 -0
- package/dist/ws/session.js.map +1 -0
- package/dist/ws/shared.d.ts +65 -0
- package/dist/ws/shared.d.ts.map +1 -0
- package/dist/ws/shared.js +103 -0
- package/dist/ws/shared.js.map +1 -0
- package/dist/ws-origin.d.ts +20 -0
- package/dist/ws-origin.d.ts.map +1 -0
- package/dist/ws-origin.js +41 -0
- package/dist/ws-origin.js.map +1 -0
- package/dist/yaml.d.ts +15 -1
- package/dist/yaml.d.ts.map +1 -1
- package/dist/yaml.js +101 -0
- package/dist/yaml.js.map +1 -0
- package/docs/invalidate-spec.md +13 -1
- package/docs/meta-spec.md +36 -12
- package/docs/packaging.md +43 -24
- package/docs/regression-matrix/README.md +32 -0
- package/docs/regression-matrix/review.md +44 -0
- package/docs/regression-matrix/ws1-3.md +97 -0
- package/docs/regression-matrix/ws4-8.md +107 -0
- package/docs/regression-matrix/ws9-12.md +266 -0
- package/docs/sdk.md +102 -52
- package/package.json +183 -52
- package/src/accepts.ts +91 -33
- package/src/body-kind.ts +67 -0
- package/src/body-limit.ts +102 -87
- package/src/build/index.ts +104 -54
- package/src/cli-args.ts +123 -0
- package/src/cli-go/auth.go +12 -1
- package/src/cli-go/config.go +29 -2
- package/src/cli-go/errors.go +28 -10
- package/src/cli-go/multipart.go +51 -27
- package/src/cli-go/output.go +58 -4
- package/src/cli-go/root.go +1 -1
- package/src/cli-go/version.go +2 -2
- package/src/cli.ts +154 -148
- package/src/client/error.ts +56 -1
- package/src/client/http.ts +479 -256
- package/src/client/index.ts +55 -17
- package/src/client/path.ts +169 -0
- package/src/client/redirect-policy.ts +19 -0
- package/src/client/sdk.ts +180 -101
- package/src/client/sse.ts +92 -66
- package/src/client/ws.ts +67 -31
- package/src/client-go/errors.go +41 -12
- package/src/client-go/export.go +44 -0
- package/src/client-go/invalidation.go +52 -54
- package/src/client-go/nullable.go +62 -0
- package/src/client-go/realtime.go +147 -110
- package/src/client-go/runtime.go +646 -88
- package/src/client-go/sse.go +104 -94
- package/src/client-go/transport.go +67 -27
- package/src/client-go/ws.go +49 -25
- package/src/client-info.ts +79 -0
- package/src/client-mcp/server.ts +133 -3
- package/src/client-python/_invalidation.py +207 -291
- package/src/client-python/_realtime.py +63 -40
- package/src/client-python/_runtime.py +501 -119
- package/src/client-python/_sse.py +130 -74
- package/src/client-python/_transport.py +37 -9
- package/src/client-python/_ws.py +50 -22
- package/src/client-rust/errors.rs +21 -1
- package/src/client-rust/invalidation.rs +202 -231
- package/src/client-rust/invalidation_sync.rs +16 -229
- package/src/client-rust/nullable.rs +17 -0
- package/src/client-rust/realtime.rs +217 -217
- package/src/client-rust/runtime.rs +602 -177
- package/src/client-rust/runtime_sync.rs +169 -145
- package/src/client-rust/sse.rs +142 -121
- package/src/client-rust/ws.rs +61 -37
- package/src/codegen-go-cli.ts +607 -728
- package/src/codegen-go.ts +710 -770
- package/src/codegen-ir.ts +381 -75
- package/src/codegen-lang.ts +517 -0
- package/src/codegen-load.ts +150 -0
- package/src/codegen-mcp.ts +207 -108
- package/src/codegen-python.ts +684 -816
- package/src/codegen-route-tree-intern.ts +51 -25
- package/src/codegen-rust.ts +946 -1240
- package/src/codegen-sanitize.ts +0 -4
- package/src/codegen-schema-naming.ts +19 -6
- package/src/codegen-sdk-model.ts +228 -0
- package/src/codegen.ts +1488 -1140
- package/src/context.ts +130 -11
- package/src/cookie-sign.ts +85 -16
- package/src/cookie.ts +66 -11
- package/src/cors.ts +55 -54
- package/src/crypto.ts +27 -5
- package/src/csrf.ts +57 -25
- package/src/curl-logger.ts +155 -114
- package/src/dict.ts +12 -0
- package/src/error.ts +4 -2
- package/src/etag.ts +58 -34
- package/src/feature-detect.ts +147 -0
- package/src/feature-slots.ts +70 -0
- package/src/fetch-request.ts +13 -0
- package/src/gen-process.ts +42 -0
- package/src/gen-write.ts +127 -0
- package/src/glob.ts +109 -0
- package/src/go-type-emitter.ts +406 -155
- package/src/honey-response.ts +36 -9
- package/src/i18n-slot.ts +10 -0
- package/src/i18n.ts +98 -23
- package/src/index.ts +1887 -1756
- package/src/init.ts +40 -28
- package/src/invalidate-check.ts +42 -4
- package/src/invoke-user.ts +95 -0
- package/src/ip-restrict.ts +47 -161
- package/src/ip.ts +194 -0
- package/src/logger.ts +65 -36
- package/src/media-type.ts +104 -0
- package/src/meta-spec-merge.ts +80 -0
- package/src/meta-spec.ts +0 -0
- package/src/middleware.ts +112 -12
- package/src/node-request.ts +242 -52
- package/src/node.ts +318 -75
- package/src/openapi/collect.ts +19 -44
- package/src/openapi/docs-page.ts +89 -0
- package/src/openapi/document.ts +503 -224
- package/src/openapi/json-schema-slot.ts +40 -0
- package/src/openapi/register.ts +7 -2
- package/src/openapi/scalar.ts +11 -10
- package/src/openapi/serve.ts +39 -0
- package/src/openapi/spec-factory.ts +50 -1
- package/src/openapi/spec.ts +53 -30
- package/src/openapi/swagger.ts +12 -11
- package/src/pattern.ts +245 -0
- package/src/peer.ts +53 -0
- package/src/plugin.ts +270 -185
- package/src/powered-by.ts +2 -2
- package/src/pretty-json.ts +25 -9
- package/src/producer-stream.ts +296 -0
- package/src/proxy.ts +253 -55
- package/src/python-type-emitter.ts +68 -56
- package/src/realtime/bus.ts +56 -9
- package/src/realtime/register.ts +13 -0
- package/src/realtime/route.ts +129 -80
- package/src/realtime/server.ts +298 -0
- package/src/request-id.ts +13 -3
- package/src/request-limits.ts +2 -0
- package/src/request-path.ts +165 -0
- package/src/request-to-curl.ts +28 -7
- package/src/response.ts +143 -103
- package/src/rust-type-emitter.ts +265 -170
- package/src/secure-headers.ts +8 -4
- package/src/serve-register.ts +4 -0
- package/src/serve-slot.ts +38 -0
- package/src/serve.ts +113 -25
- package/src/server-timing.ts +11 -7
- package/src/static.ts +85 -32
- package/src/telemetry/otel.ts +29 -7
- package/src/testing.ts +76 -14
- package/src/timeout.ts +15 -7
- package/src/tree.ts +405 -333
- package/src/trust.ts +117 -0
- package/src/ts-type-emitter.ts +18 -12
- package/src/type-emitter.ts +227 -89
- package/src/type-extractor.ts +603 -423
- package/src/types.ts +8 -0
- package/src/validation.ts +221 -96
- package/src/with-headers.ts +45 -0
- package/src/ws/bun.ts +53 -15
- package/src/ws/cloudflare.ts +81 -19
- package/src/ws/deno.ts +124 -36
- package/src/ws/node.ts +173 -79
- package/src/ws/session.ts +73 -0
- package/src/ws/shared.ts +140 -0
- package/src/ws-origin.ts +53 -0
- package/src/yaml.ts +45 -22
- package/dist/client-mcp/server.d.ts +0 -10
- package/dist/client-mcp/server.d.ts.map +0 -1
- package/dist/client-mcp/types.d.ts +0 -16
- package/dist/client-mcp/types.d.ts.map +0 -1
- package/dist/cloudflare/realtime.d.ts +0 -30
- package/dist/cloudflare/realtime.d.ts.map +0 -1
- package/dist/realtime/buffer.d.ts +0 -18
- package/dist/realtime/buffer.d.ts.map +0 -1
- package/dist/realtime/longpoll.d.ts +0 -23
- package/dist/realtime/longpoll.d.ts.map +0 -1
- package/dist/realtime/protocol.d.ts +0 -50
- package/dist/realtime/protocol.d.ts.map +0 -1
- package/dist/realtime/runtime.d.ts +0 -74
- package/dist/realtime/runtime.d.ts.map +0 -1
- package/src/cloudflare/realtime.ts +0 -234
- package/src/realtime/buffer.ts +0 -101
- package/src/realtime/longpoll.ts +0 -148
- package/src/realtime/protocol.ts +0 -128
- package/src/realtime/runtime.ts +0 -427
package/dist/proxy.js
ADDED
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { clientInfo } from "./context.js";
|
|
2
|
+
import { HoneyError } from "./error.js";
|
|
3
|
+
import { registerFeature } from "./feature-slots.js";
|
|
4
|
+
import { searchOfUrl } from "./request-path.js";
|
|
5
|
+
import { EK, SK } from "./types.js";
|
|
6
|
+
/* Bodies up to this size with a declared length are forwarded as bytes; larger or unsized ones
|
|
7
|
+
stream (uploads). */
|
|
8
|
+
const MAX_BUFFERED_BODY_BYTES = 1024 * 1024;
|
|
9
|
+
/** Default time allowed until the upstream's response headers arrive. */
|
|
10
|
+
const DEFAULT_TIMEOUT_MS = 60_000;
|
|
11
|
+
/**
|
|
12
|
+
* Hop-by-hop headers (RFC 9110 §7.6.1) describe one connection and never cross a proxy, in
|
|
13
|
+
* either direction. `proxy-connection` is the pre-standard spelling clients still send.
|
|
14
|
+
* Headers a `Connection` header names are hop-by-hop too, see `stripHopByHop`.
|
|
15
|
+
*/
|
|
16
|
+
const HOP_BY_HOP = [
|
|
17
|
+
"connection",
|
|
18
|
+
"keep-alive",
|
|
19
|
+
"proxy-authenticate",
|
|
20
|
+
"proxy-authorization",
|
|
21
|
+
"proxy-connection",
|
|
22
|
+
"te",
|
|
23
|
+
"trailer",
|
|
24
|
+
"transfer-encoding",
|
|
25
|
+
"upgrade",
|
|
26
|
+
];
|
|
27
|
+
/**
|
|
28
|
+
* Client-sent forwarding headers. The app's `trustProxy()` setting has already decided what is
|
|
29
|
+
* true about the client (`clientInfo`); what the client wrote is replaced, never passed on.
|
|
30
|
+
*/
|
|
31
|
+
const FORWARDING = ["forwarded", "x-forwarded-for", "x-forwarded-host", "x-forwarded-proto", "x-real-ip"];
|
|
32
|
+
/** Statuses whose response can never carry a body: rebuilding one with a body throws. */
|
|
33
|
+
const NULL_BODY = new Set([101, 103, 204, 205, 304]);
|
|
34
|
+
function stripHopByHop(headers, keepUpgrade) {
|
|
35
|
+
const named = headers.get("connection");
|
|
36
|
+
if (named !== null) {
|
|
37
|
+
for (const token of named.split(",")) {
|
|
38
|
+
const name = token.trim().toLowerCase();
|
|
39
|
+
if (name === "" || (keepUpgrade && name === "upgrade"))
|
|
40
|
+
continue;
|
|
41
|
+
headers.delete(name);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
for (const name of HOP_BY_HOP) {
|
|
45
|
+
if (keepUpgrade && name === "upgrade")
|
|
46
|
+
continue;
|
|
47
|
+
headers.delete(name);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* A streamed body that the destination never reads (a route without input that was sent `{}`)
|
|
52
|
+
* can keep the call open until it times out: a service binding does not settle while the
|
|
53
|
+
* request stream is unconsumed, and a stream teed by `request.clone()` (a body-logging
|
|
54
|
+
* middleware) has no known length. Bytes have neither problem.
|
|
55
|
+
*/
|
|
56
|
+
async function forwardBody(request) {
|
|
57
|
+
if (request.body === null)
|
|
58
|
+
return null;
|
|
59
|
+
const declared = request.headers.get("content-length");
|
|
60
|
+
const length = declared === null ? Number.NaN : Number.parseInt(declared, 10);
|
|
61
|
+
if (Number.isFinite(length) && length <= MAX_BUFFERED_BODY_BYTES)
|
|
62
|
+
return request.arrayBuffer();
|
|
63
|
+
return request.body;
|
|
64
|
+
}
|
|
65
|
+
/** Network-level codes runtimes put on errors when the upstream cannot be reached or drops. */
|
|
66
|
+
const NETWORK_CODES = /^(?:E[A-Z0-9_]+|Connection\w*|UND_ERR\w*|UNABLE_\w+|CERT_\w+|DEPTH_ZERO\w*)$/;
|
|
67
|
+
/**
|
|
68
|
+
* Whether `error` means the upstream failed (502), as opposed to a bug in user code (500).
|
|
69
|
+
* Fetch reports network failures as a `TypeError` — so does a typo in `destination` — and the
|
|
70
|
+
* runtimes tell them apart differently: undici and Deno say "fetch failed" (with a `cause`),
|
|
71
|
+
* Bun puts a `code` on the error (`ConnectionRefused`, `ENOTFOUND`), Workers say the network
|
|
72
|
+
* connection was lost. An invalid URL is the destination's bug.
|
|
73
|
+
*/
|
|
74
|
+
function isUpstreamFailure(error) {
|
|
75
|
+
if (!(error instanceof Error))
|
|
76
|
+
return false;
|
|
77
|
+
const code = error.code;
|
|
78
|
+
if (typeof code === "string")
|
|
79
|
+
return !code.startsWith("ERR_INVALID") && NETWORK_CODES.test(code);
|
|
80
|
+
if (!(error instanceof TypeError))
|
|
81
|
+
return false;
|
|
82
|
+
const message = error.message;
|
|
83
|
+
return /^fetch failed/i.test(message) || /network connection (?:was )?lost/i.test(message);
|
|
84
|
+
}
|
|
85
|
+
function resolveMs(opt, ctx, fallback) {
|
|
86
|
+
const ms = typeof opt === "function" ? opt(ctx) : (opt ?? fallback);
|
|
87
|
+
return ms !== undefined && ms > 0 ? ms : undefined;
|
|
88
|
+
}
|
|
89
|
+
function timeoutError() {
|
|
90
|
+
return new DOMException("upstream timed out", "TimeoutError");
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* The body, erroring (and aborting the upstream through `onIdle`) when the upstream sends
|
|
94
|
+
* nothing for `ms`. The clock runs only while a read is outstanding: a client that reads slowly
|
|
95
|
+
* is backpressure, not an idle upstream.
|
|
96
|
+
*/
|
|
97
|
+
function withIdleTimeout(body, ms, onIdle) {
|
|
98
|
+
const reader = body.getReader();
|
|
99
|
+
return new ReadableStream({
|
|
100
|
+
async cancel(reason) {
|
|
101
|
+
await reader.cancel(reason);
|
|
102
|
+
},
|
|
103
|
+
async pull(controller) {
|
|
104
|
+
let timer;
|
|
105
|
+
const idle = new Promise((resolve) => {
|
|
106
|
+
timer = setTimeout(() => resolve("idle"), ms);
|
|
107
|
+
});
|
|
108
|
+
try {
|
|
109
|
+
const result = await Promise.race([reader.read(), idle]);
|
|
110
|
+
if (result === "idle") {
|
|
111
|
+
onIdle();
|
|
112
|
+
const error = timeoutError();
|
|
113
|
+
/* the upstream may not react to the abort (a binding, a stub): drop it either way */
|
|
114
|
+
reader.cancel(error).catch(() => { });
|
|
115
|
+
controller.error(error);
|
|
116
|
+
}
|
|
117
|
+
else if (result.done) {
|
|
118
|
+
controller.close();
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
controller.enqueue(result.value);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
controller.error(error);
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
clearTimeout(timer);
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* The response the client gets: hop-by-hop headers dropped, encoding headers made true for
|
|
135
|
+
* the bytes, in a copy whose headers are mutable (fetch() responses are immutable).
|
|
136
|
+
*/
|
|
137
|
+
function clientResponse(response, decoded, body) {
|
|
138
|
+
const headers = new Headers(response.headers);
|
|
139
|
+
stripHopByHop(headers, false);
|
|
140
|
+
if (decoded) {
|
|
141
|
+
const encoding = headers.get("content-encoding");
|
|
142
|
+
if (encoding !== null && encoding.trim().toLowerCase() !== "identity") {
|
|
143
|
+
headers.delete("content-encoding");
|
|
144
|
+
/* the length of the encoded bytes, not of the decoded body the client receives */
|
|
145
|
+
headers.delete("content-length");
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return new Response(NULL_BODY.has(response.status) ? null : body, {
|
|
149
|
+
headers,
|
|
150
|
+
status: response.status,
|
|
151
|
+
statusText: response.statusText,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Creates a proxy handler function from config.
|
|
156
|
+
* Used internally by RouteBuilder.proxy() — not meant for direct consumption.
|
|
157
|
+
*
|
|
158
|
+
* TCtx is unconstrained because HandlerCtx uses Omit which breaks structural
|
|
159
|
+
* compatibility with { path, req }. At runtime ctx is always HoneyContext
|
|
160
|
+
* which has both fields — we access them via property access on the object.
|
|
161
|
+
*/
|
|
162
|
+
export function createProxyHandler(config) {
|
|
163
|
+
const decoded = config.decoded !== false;
|
|
164
|
+
const forwarded = config.forwardedHeaders !== false;
|
|
165
|
+
return async (ctx) => {
|
|
166
|
+
/* HoneyContext always has path + req + signal — safe at runtime */
|
|
167
|
+
const c = ctx;
|
|
168
|
+
const request = c.req;
|
|
169
|
+
const method = request.method.toUpperCase();
|
|
170
|
+
const isWs = request.headers.get("upgrade")?.trim().toLowerCase() === "websocket";
|
|
171
|
+
const headerMs = isWs ? undefined : resolveMs(config.timeout, ctx, DEFAULT_TIMEOUT_MS);
|
|
172
|
+
const idleMs = isWs ? undefined : resolveMs(config.idleTimeout, ctx);
|
|
173
|
+
/* URL: the normalized path the router matched, plus the raw query — no new URL() */
|
|
174
|
+
const pathQuery = c.path + searchOfUrl(request.url);
|
|
175
|
+
const url = config.rewriteUrl ? config.rewriteUrl(pathQuery, ctx) : pathQuery;
|
|
176
|
+
/* headers — one copy (the original is immutable) */
|
|
177
|
+
const headers = new Headers(request.headers);
|
|
178
|
+
stripHopByHop(headers, isWs);
|
|
179
|
+
if (isWs) {
|
|
180
|
+
headers.set("upgrade", "websocket");
|
|
181
|
+
headers.set("connection", "upgrade");
|
|
182
|
+
}
|
|
183
|
+
headers.delete("host");
|
|
184
|
+
headers.delete("expect");
|
|
185
|
+
for (const name of FORWARDING)
|
|
186
|
+
headers.delete(name);
|
|
187
|
+
if (forwarded) {
|
|
188
|
+
const client = clientInfo(c);
|
|
189
|
+
if (client.ip !== null)
|
|
190
|
+
headers.set("x-forwarded-for", client.ip);
|
|
191
|
+
headers.set("x-forwarded-proto", client.protocol);
|
|
192
|
+
if (client.host !== null)
|
|
193
|
+
headers.set("x-forwarded-host", client.host);
|
|
194
|
+
}
|
|
195
|
+
/* body: every method that can carry one (fetch refuses a GET or HEAD body) */
|
|
196
|
+
const body = method === "GET" || method === "HEAD" ? null : await forwardBody(request);
|
|
197
|
+
if (body === null || body instanceof ArrayBuffer) {
|
|
198
|
+
/* no body, or bytes whose length fetch() computes itself */
|
|
199
|
+
headers.delete("content-length");
|
|
200
|
+
}
|
|
201
|
+
if (config.requestHeaders) {
|
|
202
|
+
if (typeof config.requestHeaders === "function") {
|
|
203
|
+
config.requestHeaders(ctx, headers);
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
for (const [k, v] of Object.entries(config.requestHeaders)) {
|
|
207
|
+
headers.set(k, v);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/* one controller for the proxy's own timeouts, following the request's signal */
|
|
212
|
+
const upstream = new AbortController();
|
|
213
|
+
const clientSignal = c.signal;
|
|
214
|
+
const signal = clientSignal ? AbortSignal.any([clientSignal, upstream.signal]) : upstream.signal;
|
|
215
|
+
const init = {
|
|
216
|
+
body: body ?? undefined,
|
|
217
|
+
headers,
|
|
218
|
+
method,
|
|
219
|
+
redirect: "manual",
|
|
220
|
+
signal,
|
|
221
|
+
};
|
|
222
|
+
/* duplex required for streaming body (Node needs it, CF handles implicitly) */
|
|
223
|
+
if (body instanceof ReadableStream) {
|
|
224
|
+
;
|
|
225
|
+
init["duplex"] = "half";
|
|
226
|
+
}
|
|
227
|
+
/* forward */
|
|
228
|
+
let headerTimedOut = false;
|
|
229
|
+
const headerTimer = headerMs === undefined
|
|
230
|
+
? undefined
|
|
231
|
+
: setTimeout(() => {
|
|
232
|
+
headerTimedOut = true;
|
|
233
|
+
upstream.abort(timeoutError());
|
|
234
|
+
}, headerMs);
|
|
235
|
+
let response;
|
|
236
|
+
try {
|
|
237
|
+
response = await config.destination(ctx, url, init);
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
/* ours, or the destination's own AbortSignal.timeout() */
|
|
241
|
+
if (headerTimedOut || (error instanceof DOMException && error.name === "TimeoutError")) {
|
|
242
|
+
throw new HoneyError({ errorKey: EK.gateway_timeout, status: SK.gateway_timeout });
|
|
243
|
+
}
|
|
244
|
+
if (clientSignal?.aborted)
|
|
245
|
+
throw error;
|
|
246
|
+
if (isUpstreamFailure(error)) {
|
|
247
|
+
throw new HoneyError({ errorKey: EK.bad_gateway, status: SK.bad_gateway });
|
|
248
|
+
}
|
|
249
|
+
throw error;
|
|
250
|
+
}
|
|
251
|
+
finally {
|
|
252
|
+
clearTimeout(headerTimer);
|
|
253
|
+
}
|
|
254
|
+
/* WS 101 — return immediately, opaque */
|
|
255
|
+
if (response.status === 101) {
|
|
256
|
+
return response;
|
|
257
|
+
}
|
|
258
|
+
let responseBody = response.body;
|
|
259
|
+
if (responseBody !== null && idleMs !== undefined) {
|
|
260
|
+
responseBody = withIdleTimeout(responseBody, idleMs, () => upstream.abort(timeoutError()));
|
|
261
|
+
}
|
|
262
|
+
let result = clientResponse(response, decoded, responseBody);
|
|
263
|
+
/* response hook */
|
|
264
|
+
if (config.onResponse) {
|
|
265
|
+
const replaced = await config.onResponse(ctx, result);
|
|
266
|
+
if (replaced)
|
|
267
|
+
result = replaced;
|
|
268
|
+
}
|
|
269
|
+
return result;
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
/* `import "@lovrozagar/honey/proxy"` is what makes `.proxy()` available; the core never imports this module */
|
|
273
|
+
registerFeature("proxy", { createProxyHandler });
|
|
274
|
+
//# sourceMappingURL=proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,24 @@
|
|
|
1
1
|
import type { IRSchema } from "./codegen-ir.ts";
|
|
2
|
-
/**
|
|
2
|
+
/** Attribute-safe name that keeps the original casing (`apiKeys` stays `apiKeys`).
|
|
3
|
+
* Non-identifier characters become `_`; keywords get a `_` suffix per PEP 8. */
|
|
3
4
|
export declare function pyIdent(name: string): string;
|
|
5
|
+
/** Module-level naming for generated types. Without it, nested objects render inline. */
|
|
6
|
+
export type PyTypeNames = {
|
|
7
|
+
ref: (schemaName: string) => string;
|
|
8
|
+
/** Hoists an object schema to a named TypedDict and returns its name. */
|
|
9
|
+
hoist: (key: string, base: string, schema: Extract<IRSchema, {
|
|
10
|
+
kind: "object";
|
|
11
|
+
}>) => string;
|
|
12
|
+
};
|
|
4
13
|
/**
|
|
5
14
|
* Convert an IRSchema to a Python type string.
|
|
6
15
|
* depth > 8 returns `Any` (mirrors TS `unknown` fallback).
|
|
7
16
|
*/
|
|
8
17
|
export declare function irToPython(ir: IRSchema, depth?: number): string;
|
|
18
|
+
/** `irToPython` with module naming: refs map to emitted class names, nested objects are hoisted. */
|
|
19
|
+
export declare function irToPythonNamed(ir: IRSchema, names: PyTypeNames, parent: string, field: string): string;
|
|
9
20
|
/** Thin shim — delegates to irToPython(schemaToIR(schema), depth). */
|
|
10
21
|
export declare function jsonSchemaToPy(schema: Record<string, unknown> | undefined, depth?: number): string;
|
|
22
|
+
/** A key usable as a TypedDict class-syntax attribute (else the functional syntax is used). */
|
|
23
|
+
export declare function isPyAttributeKey(key: string): boolean;
|
|
11
24
|
//# sourceMappingURL=python-type-emitter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"python-type-emitter.d.ts","sourceRoot":"","sources":["../src/python-type-emitter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAW,QAAQ,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"python-type-emitter.d.ts","sourceRoot":"","sources":["../src/python-type-emitter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAW,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAGxD;gFACgF;AAChF,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM5C;AAmCD,yFAAyF;AACzF,MAAM,MAAM,WAAW,GAAG;IACzB,GAAG,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAA;IACnC,yEAAyE;IACzE,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAC,KAAK,MAAM,CAAA;CAC3F,CAAA;AA6BD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,SAAI,GAAG,MAAM,CAE1D;AAED,oGAAoG;AACpG,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvG;AA+ED,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,KAAK,SAAI,GAAG,MAAM,CAG7F;AAED,+FAA+F;AAC/F,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAErD"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { schemaToIR } from "./codegen-ir.js";
|
|
2
|
+
import { cmpCodeUnit, pyClassName, pyString } from "./codegen-lang.js";
|
|
3
|
+
/** Attribute-safe name that keeps the original casing (`apiKeys` stays `apiKeys`).
|
|
4
|
+
* Non-identifier characters become `_`; keywords get a `_` suffix per PEP 8. */
|
|
5
|
+
export function pyIdent(name) {
|
|
6
|
+
let out = name.replace(/[^A-Za-z0-9_]/g, "_");
|
|
7
|
+
if (out === "")
|
|
8
|
+
out = "value";
|
|
9
|
+
if (/^[0-9]/.test(out))
|
|
10
|
+
out = `_${out}`;
|
|
11
|
+
if (PY_HARD_KEYWORDS.has(out) || out === "self")
|
|
12
|
+
return `${out}_`;
|
|
13
|
+
return out;
|
|
14
|
+
}
|
|
15
|
+
const PY_HARD_KEYWORDS = new Set("False None True and as assert async await break class continue def del elif else except finally for from global if import in is lambda nonlocal not or pass raise return try while with yield".split(" "));
|
|
16
|
+
function primitiveToPy(t) {
|
|
17
|
+
if (t === "string")
|
|
18
|
+
return "str";
|
|
19
|
+
if (t === "integer")
|
|
20
|
+
return "int";
|
|
21
|
+
if (t === "number")
|
|
22
|
+
return "float";
|
|
23
|
+
if (t === "boolean")
|
|
24
|
+
return "bool";
|
|
25
|
+
if (t === "null")
|
|
26
|
+
return "None";
|
|
27
|
+
return "Any";
|
|
28
|
+
}
|
|
29
|
+
function formatConstPy(v) {
|
|
30
|
+
if (typeof v === "string")
|
|
31
|
+
return pyString(v);
|
|
32
|
+
if (typeof v === "boolean")
|
|
33
|
+
return v ? "True" : "False";
|
|
34
|
+
return String(v);
|
|
35
|
+
}
|
|
36
|
+
function emitScalarPy(ir) {
|
|
37
|
+
if (ir.enum) {
|
|
38
|
+
const members = ir.enum
|
|
39
|
+
.filter((v) => v !== null)
|
|
40
|
+
.map((v) => (typeof v === "string" ? pyString(v) : typeof v === "boolean" ? (v ? "True" : "False") : String(v)))
|
|
41
|
+
.join(", ");
|
|
42
|
+
if (members === "")
|
|
43
|
+
return primitiveToPy(ir.type);
|
|
44
|
+
return `Literal[${members}]`;
|
|
45
|
+
}
|
|
46
|
+
return primitiveToPy(ir.type);
|
|
47
|
+
}
|
|
48
|
+
function emitObjectPy(ir, depth, ctx) {
|
|
49
|
+
const { fields, additional } = ir;
|
|
50
|
+
if (fields.length === 0) {
|
|
51
|
+
if (additional) {
|
|
52
|
+
return `dict[str, ${irToPythonCtx(additional, depth + 1, { ...ctx, field: `${ctx.field}Value` })}]`;
|
|
53
|
+
}
|
|
54
|
+
return "dict[str, Any]";
|
|
55
|
+
}
|
|
56
|
+
if (ctx.names) {
|
|
57
|
+
const base = ctx.field === "" ? ctx.parent : `${ctx.parent}${pyClassName(ctx.field)}`;
|
|
58
|
+
return ctx.names.hoist(`${ctx.parent}.${ctx.field}`, base, ir);
|
|
59
|
+
}
|
|
60
|
+
const sortedFields = fields.slice().sort((a, b) => cmpCodeUnit(a.name, b.name));
|
|
61
|
+
const entries = sortedFields.map((f) => {
|
|
62
|
+
const pyType = irToPythonCtx(f.schema, depth + 1, ctx);
|
|
63
|
+
const annotation = f.required ? pyType : `NotRequired[${pyType}]`;
|
|
64
|
+
return `${pyString(f.name)}: ${annotation}`;
|
|
65
|
+
});
|
|
66
|
+
return `TypedDict("X", {${entries.join(", ")}})`;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Convert an IRSchema to a Python type string.
|
|
70
|
+
* depth > 8 returns `Any` (mirrors TS `unknown` fallback).
|
|
71
|
+
*/
|
|
72
|
+
export function irToPython(ir, depth = 0) {
|
|
73
|
+
return irToPythonCtx(ir, depth, { field: "Value", parent: "Model" });
|
|
74
|
+
}
|
|
75
|
+
/** `irToPython` with module naming: refs map to emitted class names, nested objects are hoisted. */
|
|
76
|
+
export function irToPythonNamed(ir, names, parent, field) {
|
|
77
|
+
return irToPythonCtx(ir, 0, { field, names, parent });
|
|
78
|
+
}
|
|
79
|
+
function irToPythonCtx(ir, depth, ctx) {
|
|
80
|
+
if (depth > 8)
|
|
81
|
+
return "Any";
|
|
82
|
+
switch (ir.kind) {
|
|
83
|
+
case "scalar":
|
|
84
|
+
return emitScalarPy(ir);
|
|
85
|
+
case "const":
|
|
86
|
+
return `Literal[${formatConstPy(ir.value)}]`;
|
|
87
|
+
case "object":
|
|
88
|
+
return emitObjectPy(ir, depth, ctx);
|
|
89
|
+
case "array":
|
|
90
|
+
return `list[${irToPythonCtx(ir.items, depth + 1, { ...ctx, field: `${ctx.field}Item` })}]`;
|
|
91
|
+
case "tuple":
|
|
92
|
+
return ir.items.length === 0
|
|
93
|
+
? "tuple[()]"
|
|
94
|
+
: `tuple[${ir.items.map((i, n) => irToPythonCtx(i, depth + 1, { ...ctx, field: `${ctx.field}${n}` })).join(", ")}]`;
|
|
95
|
+
case "union": {
|
|
96
|
+
/* union-of-const → single Literal[...] to match mixed enum behavior */
|
|
97
|
+
if (ir.variants.length > 0 && ir.variants.every((v) => v.kind === "const")) {
|
|
98
|
+
const members = ir.variants
|
|
99
|
+
.map((v) => formatConstPy(v.value))
|
|
100
|
+
.join(", ");
|
|
101
|
+
return `Literal[${members}]`;
|
|
102
|
+
}
|
|
103
|
+
return ir.variants
|
|
104
|
+
.map((v, n) => irToPythonCtx(v, depth + 1, { ...ctx, field: `${ctx.field}Variant${n}` }))
|
|
105
|
+
.join(" | ");
|
|
106
|
+
}
|
|
107
|
+
case "allOf": {
|
|
108
|
+
const allObjects = ir.parts.every((p) => p.kind === "object");
|
|
109
|
+
if (!allObjects) {
|
|
110
|
+
if (ctx.names && ir.parts.length === 1)
|
|
111
|
+
return irToPythonCtx(ir.parts[0], depth + 1, ctx);
|
|
112
|
+
return "Any";
|
|
113
|
+
}
|
|
114
|
+
/* later parts overwrite earlier (mirrors Object.assign semantics in old jsonSchemaToPy) */
|
|
115
|
+
const mergedMap = new Map();
|
|
116
|
+
const requiredSet = new Set();
|
|
117
|
+
for (const part of ir.parts) {
|
|
118
|
+
const obj = part;
|
|
119
|
+
for (const f of obj.fields) {
|
|
120
|
+
mergedMap.set(f.name, f);
|
|
121
|
+
if (f.required)
|
|
122
|
+
requiredSet.add(f.name);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const mergedFields = Array.from(mergedMap.values()).map((f) => {
|
|
126
|
+
const mf = Object.assign({}, f);
|
|
127
|
+
mf.required = requiredSet.has(f.name);
|
|
128
|
+
return mf;
|
|
129
|
+
});
|
|
130
|
+
return emitObjectPy({ fields: mergedFields, kind: "object" }, depth, ctx);
|
|
131
|
+
}
|
|
132
|
+
case "ref":
|
|
133
|
+
return ctx.names ? ctx.names.ref(ir.name) : ir.name;
|
|
134
|
+
case "nullable":
|
|
135
|
+
return `${irToPythonCtx(ir.inner, depth + 1, ctx)} | None`;
|
|
136
|
+
/*
|
|
137
|
+
* binary kind arises from {type:"string", format:"binary"}.
|
|
138
|
+
* dominant case matches "str"; bare {format:"binary"} with no type is
|
|
139
|
+
* a deliberate 1-case divergence from old jsonSchemaToPy (see spec §binary).
|
|
140
|
+
*/
|
|
141
|
+
case "binary":
|
|
142
|
+
return "str";
|
|
143
|
+
case "unknown":
|
|
144
|
+
return "Any";
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/** Thin shim — delegates to irToPython(schemaToIR(schema), depth). */
|
|
148
|
+
export function jsonSchemaToPy(schema, depth = 0) {
|
|
149
|
+
if (!schema || depth > 8)
|
|
150
|
+
return "Any";
|
|
151
|
+
return irToPython(schemaToIR(schema), depth);
|
|
152
|
+
}
|
|
153
|
+
/** A key usable as a TypedDict class-syntax attribute (else the functional syntax is used). */
|
|
154
|
+
export function isPyAttributeKey(key) {
|
|
155
|
+
return /^[A-Za-z_][A-Za-z0-9_]*$/.test(key) && !PY_HARD_KEYWORDS.has(key) && !key.startsWith("__");
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=python-type-emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-type-emitter.js","sourceRoot":"","sources":["../src/python-type-emitter.ts"],"names":[],"mappings":"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"}
|
package/dist/realtime/bus.d.ts
CHANGED
|
@@ -1,11 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-process topic bus behind `app.realtime()`. Topics are opaque keys here; the realtime server
|
|
3
|
+
* namespaces them per route before they reach the bus. Each publish serializes its payload once and
|
|
4
|
+
* hands every subscriber the same JSON text frame.
|
|
5
|
+
*/
|
|
1
6
|
export interface RealtimeBus {
|
|
2
7
|
subscribe(connId: string, topic: string): void;
|
|
3
8
|
unsubscribe(connId: string, topic: string): void;
|
|
4
9
|
unsubscribeAll(connId: string): void;
|
|
10
|
+
/** Serialize `data` once and deliver the frame to every subscriber of `topic`. Throws when `data` is not JSON-serializable. */
|
|
5
11
|
publish(topic: string, data: unknown): void;
|
|
6
|
-
|
|
12
|
+
/** Deliver an already-serialized frame to every subscriber of `topic`. */
|
|
13
|
+
publishFrame(topic: string, frame: string): void;
|
|
14
|
+
onMessage(connId: string, handler: (frame: string) => void): void;
|
|
7
15
|
removeHandler(connId: string): void;
|
|
8
16
|
presence(topic: string): string[];
|
|
17
|
+
/** Number of topics `connId` is subscribed to. */
|
|
18
|
+
topicCount(connId: string): number;
|
|
19
|
+
isSubscribed(connId: string, topic: string): boolean;
|
|
9
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* The wire format of the shipped bus: every frame, in both directions, is one JSON text.
|
|
23
|
+
* Throws a `TypeError` for values JSON cannot represent (`undefined`, functions, symbols, BigInt, cycles).
|
|
24
|
+
*/
|
|
25
|
+
export declare function encodeRealtimeFrame(data: unknown): string;
|
|
10
26
|
export declare function createBus(): RealtimeBus;
|
|
11
27
|
//# sourceMappingURL=bus.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../../src/realtime/bus.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC3B,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9C,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAChD,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IAC3C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../../src/realtime/bus.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC3B,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9C,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAChD,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,+HAA+H;IAC/H,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IAC3C,0EAA0E;IAC1E,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAChD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAA;IACjE,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACjC,kDAAkD;IAClD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;IAClC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;CACpD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAMzD;AAED,wBAAgB,SAAS,IAAI,WAAW,CA0GvC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The wire format of the shipped bus: every frame, in both directions, is one JSON text.
|
|
3
|
+
* Throws a `TypeError` for values JSON cannot represent (`undefined`, functions, symbols, BigInt, cycles).
|
|
4
|
+
*/
|
|
5
|
+
export function encodeRealtimeFrame(data) {
|
|
6
|
+
const frame = JSON.stringify(data);
|
|
7
|
+
if (frame === undefined) {
|
|
8
|
+
throw new TypeError(`realtime payload is not JSON-serializable (got ${typeof data})`);
|
|
9
|
+
}
|
|
10
|
+
return frame;
|
|
11
|
+
}
|
|
12
|
+
export function createBus() {
|
|
13
|
+
/* topic -> set of connIds subscribed to it */
|
|
14
|
+
const topicSubs = new Map();
|
|
15
|
+
/* connId -> set of topics it is subscribed to (reverse lookup for unsubscribeAll) */
|
|
16
|
+
const connTopics = new Map();
|
|
17
|
+
/* connId -> frame sink */
|
|
18
|
+
const handlers = new Map();
|
|
19
|
+
function subscribe(connId, topic) {
|
|
20
|
+
let subs = topicSubs.get(topic);
|
|
21
|
+
if (!subs) {
|
|
22
|
+
subs = new Set();
|
|
23
|
+
topicSubs.set(topic, subs);
|
|
24
|
+
}
|
|
25
|
+
subs.add(connId);
|
|
26
|
+
let topics = connTopics.get(connId);
|
|
27
|
+
if (!topics) {
|
|
28
|
+
topics = new Set();
|
|
29
|
+
connTopics.set(connId, topics);
|
|
30
|
+
}
|
|
31
|
+
topics.add(topic);
|
|
32
|
+
}
|
|
33
|
+
function unsubscribe(connId, topic) {
|
|
34
|
+
const subs = topicSubs.get(topic);
|
|
35
|
+
if (subs) {
|
|
36
|
+
subs.delete(connId);
|
|
37
|
+
if (subs.size === 0)
|
|
38
|
+
topicSubs.delete(topic);
|
|
39
|
+
}
|
|
40
|
+
const topics = connTopics.get(connId);
|
|
41
|
+
if (topics) {
|
|
42
|
+
topics.delete(topic);
|
|
43
|
+
if (topics.size === 0)
|
|
44
|
+
connTopics.delete(connId);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function unsubscribeAll(connId) {
|
|
48
|
+
const topics = connTopics.get(connId);
|
|
49
|
+
if (!topics)
|
|
50
|
+
return;
|
|
51
|
+
for (const topic of topics) {
|
|
52
|
+
const subs = topicSubs.get(topic);
|
|
53
|
+
if (subs) {
|
|
54
|
+
subs.delete(connId);
|
|
55
|
+
if (subs.size === 0)
|
|
56
|
+
topicSubs.delete(topic);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
connTopics.delete(connId);
|
|
60
|
+
}
|
|
61
|
+
function publishFrame(topic, frame) {
|
|
62
|
+
const subs = topicSubs.get(topic);
|
|
63
|
+
if (!subs)
|
|
64
|
+
return;
|
|
65
|
+
/* snapshot: a sink that closes its connection unsubscribes while we iterate */
|
|
66
|
+
for (const connId of Array.from(subs)) {
|
|
67
|
+
const handler = handlers.get(connId);
|
|
68
|
+
if (!handler)
|
|
69
|
+
continue;
|
|
70
|
+
try {
|
|
71
|
+
handler(frame);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
/* sinks are internal and contain their own errors; one must never block the others */
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function publish(topic, data) {
|
|
79
|
+
publishFrame(topic, encodeRealtimeFrame(data));
|
|
80
|
+
}
|
|
81
|
+
function onMessage(connId, handler) {
|
|
82
|
+
handlers.set(connId, handler);
|
|
83
|
+
}
|
|
84
|
+
function removeHandler(connId) {
|
|
85
|
+
handlers.delete(connId);
|
|
86
|
+
}
|
|
87
|
+
function presence(topic) {
|
|
88
|
+
const subs = topicSubs.get(topic);
|
|
89
|
+
if (!subs)
|
|
90
|
+
return [];
|
|
91
|
+
return [...subs];
|
|
92
|
+
}
|
|
93
|
+
function topicCount(connId) {
|
|
94
|
+
return connTopics.get(connId)?.size ?? 0;
|
|
95
|
+
}
|
|
96
|
+
function isSubscribed(connId, topic) {
|
|
97
|
+
return connTopics.get(connId)?.has(topic) ?? false;
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
isSubscribed,
|
|
101
|
+
onMessage,
|
|
102
|
+
presence,
|
|
103
|
+
publish,
|
|
104
|
+
publishFrame,
|
|
105
|
+
removeHandler,
|
|
106
|
+
subscribe,
|
|
107
|
+
topicCount,
|
|
108
|
+
unsubscribe,
|
|
109
|
+
unsubscribeAll,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bus.js","sourceRoot":"","sources":["../../src/realtime/bus.ts"],"names":[],"mappings":"AAqBA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAuB,CAAA;IACxD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,SAAS,CAAC,kDAAkD,OAAO,IAAI,GAAG,CAAC,CAAA;IACtF,CAAC;IACD,OAAO,KAAK,CAAA;AACb,CAAC;AAED,MAAM,UAAU,SAAS;IACxB,8CAA8C;IAC9C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAuB,CAAA;IAChD,qFAAqF;IACrF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAuB,CAAA;IACjD,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmC,CAAA;IAE3D,SAAS,SAAS,CAAC,MAAc,EAAE,KAAa;QAC/C,IAAI,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,IAAI,GAAG,IAAI,GAAG,EAAE,CAAA;YAChB,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QAC3B,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAEhB,IAAI,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,GAAG,IAAI,GAAG,EAAE,CAAA;YAClB,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC/B,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAClB,CAAC;IAED,SAAS,WAAW,CAAC,MAAc,EAAE,KAAa;QACjD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACjC,IAAI,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YACnB,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;gBAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC7C,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACrC,IAAI,MAAM,EAAE,CAAC;YACZ,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACpB,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;gBAAE,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACjD,CAAC;IACF,CAAC;IAED,SAAS,cAAc,CAAC,MAAc;QACrC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACrC,IAAI,CAAC,MAAM;YAAE,OAAM;QAEnB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YACjC,IAAI,IAAI,EAAE,CAAC;gBACV,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;gBACnB,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;oBAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAC7C,CAAC;QACF,CAAC;QACD,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC1B,CAAC;IAED,SAAS,YAAY,CAAC,KAAa,EAAE,KAAa;QACjD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACjC,IAAI,CAAC,IAAI;YAAE,OAAM;QAEjB,+EAA+E;QAC/E,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACpC,IAAI,CAAC,OAAO;gBAAE,SAAQ;YACtB,IAAI,CAAC;gBACJ,OAAO,CAAC,KAAK,CAAC,CAAA;YACf,CAAC;YAAC,MAAM,CAAC;gBACR,sFAAsF;YACvF,CAAC;QACF,CAAC;IACF,CAAC;IAED,SAAS,OAAO,CAAC,KAAa,EAAE,IAAa;QAC5C,YAAY,CAAC,KAAK,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAA;IAC/C,CAAC;IAED,SAAS,SAAS,CAAC,MAAc,EAAE,OAAgC;QAClE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,CAAC;IAED,SAAS,aAAa,CAAC,MAAc;QACpC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACxB,CAAC;IAED,SAAS,QAAQ,CAAC,KAAa;QAC9B,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACjC,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAA;QACpB,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;IACjB,CAAC;IAED,SAAS,UAAU,CAAC,MAAc;QACjC,OAAO,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC,CAAA;IACzC,CAAC;IAED,SAAS,YAAY,CAAC,MAAc,EAAE,KAAa;QAClD,OAAO,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,CAAA;IACnD,CAAC;IAED,OAAO;QACN,YAAY;QACZ,SAAS;QACT,QAAQ;QACR,OAAO;QACP,YAAY;QACZ,aAAa;QACb,SAAS;QACT,UAAU;QACV,WAAW;QACX,cAAc;KACd,CAAA;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/realtime/register.ts"],"names":[],"mappings":"AAWA,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAChF,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA"}
|