monorise 0.1.0 → 1.1.0-dev.0
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/dist/base/index.d.ts +90 -5
- package/dist/base/index.js.map +1 -1
- package/dist/cli/cli.js +6 -0
- package/dist/cli/cli.js.map +1 -1
- package/dist/core/chunk-QV4Q5377.js +76 -0
- package/dist/core/chunk-QV4Q5377.js.map +1 -0
- package/dist/core/index.d.ts +187 -19
- package/dist/core/index.js +1583 -85
- package/dist/core/index.js.map +1 -1
- package/dist/core/service.config-ZJEZ6EKA.js +13 -0
- package/dist/core/service.config-ZJEZ6EKA.js.map +1 -0
- package/dist/proxy/index.d.ts +35 -0
- package/dist/proxy/index.js +75 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/react/actions/websocket.action.d.ts +71 -0
- package/dist/react/actions/websocket.action.d.ts.map +1 -0
- package/dist/react/chunk-4D22OCZG.js +65 -0
- package/dist/react/chunk-4D22OCZG.js.map +1 -0
- package/dist/react/chunk-4N3P4ONH.js +588 -0
- package/dist/react/chunk-4N3P4ONH.js.map +1 -0
- package/dist/react/chunk-4Y4KWGJD.js +182 -0
- package/dist/react/chunk-4Y4KWGJD.js.map +1 -0
- package/dist/react/chunk-757E5UYA.js +893 -0
- package/dist/react/chunk-757E5UYA.js.map +1 -0
- package/dist/react/chunk-A5TI2FW3.js +13 -0
- package/dist/react/chunk-A5TI2FW3.js.map +1 -0
- package/dist/react/chunk-B3XDGUFO.js +489 -0
- package/dist/react/chunk-B3XDGUFO.js.map +1 -0
- package/dist/react/chunk-BPBCUO2Z.js +248 -0
- package/dist/react/chunk-BPBCUO2Z.js.map +1 -0
- package/dist/react/chunk-CQBOIXWK.js +142 -0
- package/dist/react/chunk-CQBOIXWK.js.map +1 -0
- package/dist/react/chunk-DRH2BB7I.js +383 -0
- package/dist/react/chunk-DRH2BB7I.js.map +1 -0
- package/dist/react/chunk-EQ3PKQ2S.js +402 -0
- package/dist/react/chunk-EQ3PKQ2S.js.map +1 -0
- package/dist/react/chunk-H64MMAL7.js +245 -0
- package/dist/react/chunk-H64MMAL7.js.map +1 -0
- package/dist/react/chunk-KJX5LOMN.js +43 -0
- package/dist/react/chunk-KJX5LOMN.js.map +1 -0
- package/dist/react/chunk-MO35V2Y7.js +172 -0
- package/dist/react/chunk-MO35V2Y7.js.map +1 -0
- package/dist/react/chunk-UC3E72G7.js +73 -0
- package/dist/react/chunk-UC3E72G7.js.map +1 -0
- package/dist/react/chunk-UHMKB3OR.js +5568 -0
- package/dist/react/chunk-UHMKB3OR.js.map +1 -0
- package/dist/react/chunk-UQPQBWEQ.js +54 -0
- package/dist/react/chunk-UQPQBWEQ.js.map +1 -0
- package/dist/react/chunk-XCDCVRJR.js +43 -0
- package/dist/react/chunk-XCDCVRJR.js.map +1 -0
- package/dist/react/chunk-XOYAZDIH.js +47 -0
- package/dist/react/chunk-XOYAZDIH.js.map +1 -0
- package/dist/react/chunk-YNFQEPO5.js +29 -0
- package/dist/react/chunk-YNFQEPO5.js.map +1 -0
- package/dist/react/dist-es-35AO47NO.js +90 -0
- package/dist/react/dist-es-35AO47NO.js.map +1 -0
- package/dist/react/dist-es-5GDBXNKQ.js +333 -0
- package/dist/react/dist-es-5GDBXNKQ.js.map +1 -0
- package/dist/react/dist-es-B3JDGWY6.js +71 -0
- package/dist/react/dist-es-B3JDGWY6.js.map +1 -0
- package/dist/react/dist-es-IWIE5JLA.js +169 -0
- package/dist/react/dist-es-IWIE5JLA.js.map +1 -0
- package/dist/react/dist-es-NRIS3TYJ.js +494 -0
- package/dist/react/dist-es-NRIS3TYJ.js.map +1 -0
- package/dist/react/dist-es-VCXAEYYN.js +22 -0
- package/dist/react/dist-es-VCXAEYYN.js.map +1 -0
- package/dist/react/dist-es-VU33JFTZ.js +379 -0
- package/dist/react/dist-es-VU33JFTZ.js.map +1 -0
- package/dist/react/event-streams-OSOTOTTP.js +277 -0
- package/dist/react/event-streams-OSOTOTTP.js.map +1 -0
- package/dist/react/index.d.ts +53 -4
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +10948 -190
- package/dist/react/index.js.map +1 -1
- package/dist/react/loadSso-ME7MKAM3.js +556 -0
- package/dist/react/loadSso-ME7MKAM3.js.map +1 -0
- package/dist/react/service.config-ZJEZ6EKA-FC2TR3GH.js +14 -0
- package/dist/react/service.config-ZJEZ6EKA-FC2TR3GH.js.map +1 -0
- package/dist/react/services/core.service.d.ts +11 -1
- package/dist/react/services/core.service.d.ts.map +1 -1
- package/dist/react/signin-LOXYIE5I.js +653 -0
- package/dist/react/signin-LOXYIE5I.js.map +1 -0
- package/dist/react/sso-oidc-X63KRRLO.js +786 -0
- package/dist/react/sso-oidc-X63KRRLO.js.map +1 -0
- package/dist/react/sts-OXBEY7HY.js +3948 -0
- package/dist/react/sts-OXBEY7HY.js.map +1 -0
- package/dist/react/websocket/WebSocketManager.d.ts +68 -0
- package/dist/react/websocket/WebSocketManager.d.ts.map +1 -0
- package/dist/react/websocket/index.d.ts +3 -0
- package/dist/react/websocket/index.d.ts.map +1 -0
- package/dist/react/websocket/optimistic.d.ts +51 -0
- package/dist/react/websocket/optimistic.d.ts.map +1 -0
- package/dist/react/websocket-QHA7SQXG.js +10 -0
- package/dist/react/websocket-QHA7SQXG.js.map +1 -0
- package/dist/sst/.sst/platform/src/components/aws/alb.d.ts +280 -0
- package/dist/sst/.sst/platform/src/components/aws/alb.d.ts.map +1 -0
- package/dist/sst/.sst/platform/src/components/aws/apigateway-websocket-route.d.ts +1 -1
- package/dist/sst/.sst/platform/src/components/aws/apigateway-websocket-route.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/apigateway-websocket.d.ts +13 -2
- package/dist/sst/.sst/platform/src/components/aws/apigateway-websocket.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/apigatewayv1-authorizer.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/apigatewayv1-lambda-route.d.ts +1 -1
- package/dist/sst/.sst/platform/src/components/aws/apigatewayv1-lambda-route.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/apigatewayv1.d.ts +93 -83
- package/dist/sst/.sst/platform/src/components/aws/apigatewayv1.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/apigatewayv2-authorizer.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/apigatewayv2-lambda-route.d.ts +1 -1
- package/dist/sst/.sst/platform/src/components/aws/apigatewayv2-lambda-route.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/apigatewayv2.d.ts +8 -2
- package/dist/sst/.sst/platform/src/components/aws/apigatewayv2.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/app-sync-data-source.d.ts +1 -1
- package/dist/sst/.sst/platform/src/components/aws/app-sync-data-source.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/app-sync.d.ts +1 -1
- package/dist/sst/.sst/platform/src/components/aws/app-sync.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/aurora.d.ts +18 -0
- package/dist/sst/.sst/platform/src/components/aws/aurora.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/auth-v1.d.ts +1 -1
- package/dist/sst/.sst/platform/src/components/aws/auth-v1.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/auth.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/bucket-lambda-subscriber.d.ts +1 -1
- package/dist/sst/.sst/platform/src/components/aws/bucket-lambda-subscriber.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/bucket-notification.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/bucket.d.ts +13 -8
- package/dist/sst/.sst/platform/src/components/aws/bucket.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/bus-lambda-subscriber.d.ts +3 -2
- package/dist/sst/.sst/platform/src/components/aws/bus-lambda-subscriber.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/bus.d.ts +34 -3
- package/dist/sst/.sst/platform/src/components/aws/bus.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/cdn.d.ts +11 -0
- package/dist/sst/.sst/platform/src/components/aws/cdn.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/cluster.d.ts +59 -1
- package/dist/sst/.sst/platform/src/components/aws/cluster.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/cognito-identity-pool.d.ts +5 -0
- package/dist/sst/.sst/platform/src/components/aws/cognito-identity-pool.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/cognito-user-pool.d.ts +100 -0
- package/dist/sst/.sst/platform/src/components/aws/cognito-user-pool.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/cron-v2.d.ts +325 -0
- package/dist/sst/.sst/platform/src/components/aws/cron-v2.d.ts.map +1 -0
- package/dist/sst/.sst/platform/src/components/aws/cron.d.ts +15 -6
- package/dist/sst/.sst/platform/src/components/aws/cron.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/dsql.d.ts +369 -0
- package/dist/sst/.sst/platform/src/components/aws/dsql.d.ts.map +1 -0
- package/dist/sst/.sst/platform/src/components/aws/dynamo-lambda-subscriber.d.ts +1 -1
- package/dist/sst/.sst/platform/src/components/aws/dynamo-lambda-subscriber.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/dynamo.d.ts +63 -3
- package/dist/sst/.sst/platform/src/components/aws/dynamo.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/email.d.ts +5 -0
- package/dist/sst/.sst/platform/src/components/aws/email.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/fargate.d.ts +95 -4
- package/dist/sst/.sst/platform/src/components/aws/fargate.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/function.d.ts +121 -21
- package/dist/sst/.sst/platform/src/components/aws/function.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/helpers/arn.d.ts +11 -0
- package/dist/sst/.sst/platform/src/components/aws/helpers/arn.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/helpers/container-builder.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/helpers/function-builder.d.ts +7 -3
- package/dist/sst/.sst/platform/src/components/aws/helpers/function-builder.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/helpers/load-balancer.d.ts +9 -0
- package/dist/sst/.sst/platform/src/components/aws/helpers/load-balancer.d.ts.map +1 -0
- package/dist/sst/.sst/platform/src/components/aws/helpers/provider.d.ts +2 -2
- package/dist/sst/.sst/platform/src/components/aws/helpers/provider.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/helpers/site-builder.d.ts +1 -1
- package/dist/sst/.sst/platform/src/components/aws/helpers/site-builder.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/helpers/subscriber.d.ts +1 -1
- package/dist/sst/.sst/platform/src/components/aws/helpers/subscriber.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/https-redirect.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/index.d.ts +4 -0
- package/dist/sst/.sst/platform/src/components/aws/index.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/kinesis-stream-lambda-subscriber.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/kinesis-stream.d.ts +8 -3
- package/dist/sst/.sst/platform/src/components/aws/kinesis-stream.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/linkable.d.ts +1 -1
- package/dist/sst/.sst/platform/src/components/aws/linkable.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/mysql.d.ts +34 -5
- package/dist/sst/.sst/platform/src/components/aws/mysql.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/nextjs.d.ts +39 -5
- package/dist/sst/.sst/platform/src/components/aws/nextjs.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/nuxt.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/open-search.d.ts +12 -1
- package/dist/sst/.sst/platform/src/components/aws/open-search.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/opencontrol.d.ts +7 -3
- package/dist/sst/.sst/platform/src/components/aws/opencontrol.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/permission.d.ts +5 -0
- package/dist/sst/.sst/platform/src/components/aws/permission.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/postgres-v1.d.ts +13 -2
- package/dist/sst/.sst/platform/src/components/aws/postgres-v1.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/postgres.d.ts +34 -5
- package/dist/sst/.sst/platform/src/components/aws/postgres.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/queue-lambda-subscriber.d.ts +6 -1
- package/dist/sst/.sst/platform/src/components/aws/queue-lambda-subscriber.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/queue.d.ts +10 -1
- package/dist/sst/.sst/platform/src/components/aws/queue.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/realtime-lambda-subscriber.d.ts +1 -1
- package/dist/sst/.sst/platform/src/components/aws/realtime-lambda-subscriber.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/realtime.d.ts +6 -1
- package/dist/sst/.sst/platform/src/components/aws/realtime.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/redis-v1.d.ts +10 -0
- package/dist/sst/.sst/platform/src/components/aws/redis-v1.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/redis.d.ts +14 -0
- package/dist/sst/.sst/platform/src/components/aws/redis.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/router.d.ts +482 -2
- package/dist/sst/.sst/platform/src/components/aws/router.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/service-v1.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/service.d.ts +125 -0
- package/dist/sst/.sst/platform/src/components/aws/service.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/sns-topic-lambda-subscriber.d.ts +1 -1
- package/dist/sst/.sst/platform/src/components/aws/sns-topic-lambda-subscriber.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/sns-topic.d.ts +6 -1
- package/dist/sst/.sst/platform/src/components/aws/sns-topic.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/ssr-site.d.ts +7 -7
- package/dist/sst/.sst/platform/src/components/aws/ssr-site.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/static-site.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/step-functions/state.d.ts +1 -1
- package/dist/sst/.sst/platform/src/components/aws/step-functions/state.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/step-functions/task.d.ts +10 -2
- package/dist/sst/.sst/platform/src/components/aws/step-functions/task.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/step-functions.d.ts +5 -0
- package/dist/sst/.sst/platform/src/components/aws/step-functions.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/tan-stack-start.d.ts +20 -6
- package/dist/sst/.sst/platform/src/components/aws/tan-stack-start.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/task.d.ts +35 -15
- package/dist/sst/.sst/platform/src/components/aws/task.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/vector.d.ts +5 -0
- package/dist/sst/.sst/platform/src/components/aws/vector.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/vpc.d.ts +51 -4
- package/dist/sst/.sst/platform/src/components/aws/vpc.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/aws/workflow.d.ts +331 -0
- package/dist/sst/.sst/platform/src/components/aws/workflow.d.ts.map +1 -0
- package/dist/sst/.sst/platform/src/components/cloudflare/ai.d.ts +82 -0
- package/dist/sst/.sst/platform/src/components/cloudflare/ai.d.ts.map +1 -0
- package/dist/sst/.sst/platform/src/components/cloudflare/binding.d.ts +15 -1
- package/dist/sst/.sst/platform/src/components/cloudflare/binding.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/cloudflare/bucket.d.ts +4 -2
- package/dist/sst/.sst/platform/src/components/cloudflare/bucket.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/cloudflare/cron.d.ts +29 -5
- package/dist/sst/.sst/platform/src/components/cloudflare/cron.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/cloudflare/d1.d.ts +37 -2
- package/dist/sst/.sst/platform/src/components/cloudflare/d1.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/cloudflare/index.d.ts +1 -0
- package/dist/sst/.sst/platform/src/components/cloudflare/index.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/cloudflare/kv.d.ts +36 -2
- package/dist/sst/.sst/platform/src/components/cloudflare/kv.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/cloudflare/providers/worker-placement.d.ts +27 -0
- package/dist/sst/.sst/platform/src/components/cloudflare/providers/worker-placement.d.ts.map +1 -0
- package/dist/sst/.sst/platform/src/components/cloudflare/providers/zone-lookup.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/cloudflare/queue-worker-subscriber.d.ts +116 -0
- package/dist/sst/.sst/platform/src/components/cloudflare/queue-worker-subscriber.d.ts.map +1 -0
- package/dist/sst/.sst/platform/src/components/cloudflare/queue.d.ts +186 -3
- package/dist/sst/.sst/platform/src/components/cloudflare/queue.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/cloudflare/static-site.d.ts +2 -2
- package/dist/sst/.sst/platform/src/components/cloudflare/static-site.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/cloudflare/worker.d.ts +39 -5
- package/dist/sst/.sst/platform/src/components/cloudflare/worker.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/component.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/duration.d.ts +2 -0
- package/dist/sst/.sst/platform/src/components/duration.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/esbuild.d.ts +3 -0
- package/dist/sst/.sst/platform/src/components/esbuild.d.ts.map +1 -0
- package/dist/sst/.sst/platform/src/components/link.d.ts +2 -2
- package/dist/sst/.sst/platform/src/components/link.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/linkable.d.ts +32 -2
- package/dist/sst/.sst/platform/src/components/linkable.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/rpc/rpc.d.ts.map +1 -1
- package/dist/sst/.sst/platform/src/components/vercel/dns.d.ts +2 -2
- package/dist/sst/.sst/platform/src/util/minify.d.ts +2 -0
- package/dist/sst/.sst/platform/src/util/minify.d.ts.map +1 -0
- package/dist/sst/components/monorise-core.d.ts +10 -0
- package/dist/sst/components/monorise-core.d.ts.map +1 -1
- package/dist/sst/components/q-function.d.ts +2 -3
- package/dist/sst/components/q-function.d.ts.map +1 -1
- package/dist/sst/index.js +75 -12
- package/dist/sst/index.js.map +1 -1
- package/package.json +10 -2
- package/dist/sst/.sst/platform/src/components/aws/helpers/quota.d.ts +0 -7
- package/dist/sst/.sst/platform/src/components/aws/helpers/quota.d.ts.map +0 -1
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__spreadProps,
|
|
3
|
+
__spreadValues
|
|
4
|
+
} from "./chunk-CQBOIXWK.js";
|
|
5
|
+
|
|
6
|
+
// websocket/WebSocketManager.ts
|
|
7
|
+
import { nanoid } from "nanoid";
|
|
8
|
+
var WebSocketManager = class {
|
|
9
|
+
constructor(url, token) {
|
|
10
|
+
this.ws = null;
|
|
11
|
+
this.state = "disconnected";
|
|
12
|
+
this.reconnectAttempts = 0;
|
|
13
|
+
this.maxReconnectAttempts = 10;
|
|
14
|
+
this.reconnectDelay = 1e3;
|
|
15
|
+
this.maxReconnectDelay = 3e4;
|
|
16
|
+
this.heartbeatInterval = null;
|
|
17
|
+
this.heartbeatTimeout = null;
|
|
18
|
+
this.heartbeatIntervalMs = 3e4;
|
|
19
|
+
this.heartbeatTimeoutMs = 1e4;
|
|
20
|
+
this.messageHandlers = /* @__PURE__ */ new Set();
|
|
21
|
+
this.stateHandlers = /* @__PURE__ */ new Set();
|
|
22
|
+
this.entitySubscriptions = /* @__PURE__ */ new Map();
|
|
23
|
+
this.mutualSubscriptions = /* @__PURE__ */ new Map();
|
|
24
|
+
this.ephemeralSubscriptions = /* @__PURE__ */ new Map();
|
|
25
|
+
this.pendingMessages = [];
|
|
26
|
+
this.disableAutoReconnect = false;
|
|
27
|
+
this.url = url;
|
|
28
|
+
this.token = token;
|
|
29
|
+
}
|
|
30
|
+
connect() {
|
|
31
|
+
var _a;
|
|
32
|
+
if (((_a = this.ws) == null ? void 0 : _a.readyState) === WebSocket.OPEN) return;
|
|
33
|
+
this.setState("connecting");
|
|
34
|
+
try {
|
|
35
|
+
const connectUrl = this.token ? `${this.url}?token=${encodeURIComponent(this.token)}` : this.url;
|
|
36
|
+
this.ws = new WebSocket(connectUrl);
|
|
37
|
+
this.ws.onopen = this.handleOpen.bind(this);
|
|
38
|
+
this.ws.onclose = this.handleClose.bind(this);
|
|
39
|
+
this.ws.onerror = this.handleError.bind(this);
|
|
40
|
+
this.ws.onmessage = this.handleMessage.bind(this);
|
|
41
|
+
} catch (error) {
|
|
42
|
+
console.error("WebSocket connection error:", error);
|
|
43
|
+
this.scheduleReconnect();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
disconnect() {
|
|
47
|
+
this.stopHeartbeat();
|
|
48
|
+
this.reconnectAttempts = 0;
|
|
49
|
+
if (this.ws) {
|
|
50
|
+
this.ws.close();
|
|
51
|
+
this.ws = null;
|
|
52
|
+
}
|
|
53
|
+
this.setState("disconnected");
|
|
54
|
+
}
|
|
55
|
+
// Subscribe to ALL changes of an entity type
|
|
56
|
+
subscribeEntityType(entityType) {
|
|
57
|
+
const subKey = `entity:${entityType}`;
|
|
58
|
+
if (!this.entitySubscriptions.has(subKey)) {
|
|
59
|
+
this.entitySubscriptions.set(subKey, { entityType });
|
|
60
|
+
}
|
|
61
|
+
if (this.state === "connected") {
|
|
62
|
+
const message = {
|
|
63
|
+
action: "subscribe",
|
|
64
|
+
id: nanoid(),
|
|
65
|
+
payload: { entityType }
|
|
66
|
+
};
|
|
67
|
+
this.send(message);
|
|
68
|
+
}
|
|
69
|
+
return subKey;
|
|
70
|
+
}
|
|
71
|
+
unsubscribeEntityType(subKey) {
|
|
72
|
+
const subscription = this.entitySubscriptions.get(subKey);
|
|
73
|
+
if (!subscription) return;
|
|
74
|
+
this.entitySubscriptions.delete(subKey);
|
|
75
|
+
if (this.state === "connected") {
|
|
76
|
+
const message = {
|
|
77
|
+
action: "unsubscribe",
|
|
78
|
+
id: nanoid(),
|
|
79
|
+
payload: { entityType: subscription.entityType }
|
|
80
|
+
};
|
|
81
|
+
this.send(message);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Subscribe to ALL mutuals of a type for a specific byEntity
|
|
85
|
+
subscribeMutualType(byEntityType, byEntityId, mutualEntityType) {
|
|
86
|
+
const subKey = `mutual:${byEntityType}:${byEntityId}:${mutualEntityType}`;
|
|
87
|
+
if (!this.mutualSubscriptions.has(subKey)) {
|
|
88
|
+
this.mutualSubscriptions.set(subKey, {
|
|
89
|
+
byEntityType,
|
|
90
|
+
byEntityId,
|
|
91
|
+
mutualEntityType
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
if (this.state === "connected") {
|
|
95
|
+
const message = {
|
|
96
|
+
action: "subscribe",
|
|
97
|
+
id: nanoid(),
|
|
98
|
+
payload: { byEntityType, byEntityId, mutualEntityType }
|
|
99
|
+
};
|
|
100
|
+
this.send(message);
|
|
101
|
+
}
|
|
102
|
+
return subKey;
|
|
103
|
+
}
|
|
104
|
+
unsubscribeMutualType(subKey) {
|
|
105
|
+
const subscription = this.mutualSubscriptions.get(subKey);
|
|
106
|
+
if (!subscription) return;
|
|
107
|
+
this.mutualSubscriptions.delete(subKey);
|
|
108
|
+
if (this.state === "connected") {
|
|
109
|
+
const message = {
|
|
110
|
+
action: "unsubscribe",
|
|
111
|
+
id: nanoid(),
|
|
112
|
+
payload: {
|
|
113
|
+
byEntityType: subscription.byEntityType,
|
|
114
|
+
byEntityId: subscription.byEntityId,
|
|
115
|
+
mutualEntityType: subscription.mutualEntityType
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
this.send(message);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Subscribe to ephemeral messages on a channel
|
|
122
|
+
subscribeEphemeral(channel) {
|
|
123
|
+
const subKey = `ephemeral:${channel}`;
|
|
124
|
+
if (!this.ephemeralSubscriptions.has(subKey)) {
|
|
125
|
+
this.ephemeralSubscriptions.set(subKey, { channel });
|
|
126
|
+
}
|
|
127
|
+
if (this.state === "connected") {
|
|
128
|
+
const message = {
|
|
129
|
+
action: "subscribe",
|
|
130
|
+
id: nanoid(),
|
|
131
|
+
payload: { channel }
|
|
132
|
+
};
|
|
133
|
+
this.send(message);
|
|
134
|
+
}
|
|
135
|
+
return subKey;
|
|
136
|
+
}
|
|
137
|
+
unsubscribeEphemeral(subKey) {
|
|
138
|
+
const subscription = this.ephemeralSubscriptions.get(subKey);
|
|
139
|
+
if (!subscription) return;
|
|
140
|
+
this.ephemeralSubscriptions.delete(subKey);
|
|
141
|
+
if (this.state === "connected") {
|
|
142
|
+
const message = {
|
|
143
|
+
action: "unsubscribe",
|
|
144
|
+
id: nanoid(),
|
|
145
|
+
payload: { channel: subscription.channel }
|
|
146
|
+
};
|
|
147
|
+
this.send(message);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Send an ephemeral message to a channel
|
|
151
|
+
sendEphemeral(channel, data) {
|
|
152
|
+
const message = {
|
|
153
|
+
action: "ephemeral",
|
|
154
|
+
id: nanoid(),
|
|
155
|
+
payload: { channel, data }
|
|
156
|
+
};
|
|
157
|
+
this.send(message);
|
|
158
|
+
}
|
|
159
|
+
send(message) {
|
|
160
|
+
var _a;
|
|
161
|
+
if (((_a = this.ws) == null ? void 0 : _a.readyState) === WebSocket.OPEN) {
|
|
162
|
+
this.ws.send(JSON.stringify(message));
|
|
163
|
+
} else {
|
|
164
|
+
this.pendingMessages.push(message);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
onMessage(handler) {
|
|
168
|
+
this.messageHandlers.add(handler);
|
|
169
|
+
return () => this.messageHandlers.delete(handler);
|
|
170
|
+
}
|
|
171
|
+
onStateChange(handler) {
|
|
172
|
+
this.stateHandlers.add(handler);
|
|
173
|
+
handler(this.state);
|
|
174
|
+
return () => this.stateHandlers.delete(handler);
|
|
175
|
+
}
|
|
176
|
+
getState() {
|
|
177
|
+
return this.state;
|
|
178
|
+
}
|
|
179
|
+
setState(newState) {
|
|
180
|
+
if (this.state !== newState) {
|
|
181
|
+
this.state = newState;
|
|
182
|
+
this.stateHandlers.forEach((handler) => handler(newState));
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
handleOpen() {
|
|
186
|
+
this.setState("connected");
|
|
187
|
+
this.reconnectAttempts = 0;
|
|
188
|
+
this.reconnectDelay = 1e3;
|
|
189
|
+
this.startHeartbeat();
|
|
190
|
+
this.resubscribeAll();
|
|
191
|
+
this.flushPendingMessages();
|
|
192
|
+
}
|
|
193
|
+
handleClose(event) {
|
|
194
|
+
this.stopHeartbeat();
|
|
195
|
+
this.ws = null;
|
|
196
|
+
if (this.disableAutoReconnect) {
|
|
197
|
+
this.setState("disconnected");
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (this.reconnectAttempts < this.maxReconnectAttempts) {
|
|
201
|
+
this.setState("reconnecting");
|
|
202
|
+
this.scheduleReconnect();
|
|
203
|
+
} else {
|
|
204
|
+
this.setState("disconnected");
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
handleError(error) {
|
|
208
|
+
console.error("WebSocket error:", error);
|
|
209
|
+
}
|
|
210
|
+
handleMessage(event) {
|
|
211
|
+
try {
|
|
212
|
+
const message = JSON.parse(event.data);
|
|
213
|
+
if (message.type === "pong") {
|
|
214
|
+
this.handlePong();
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
this.messageHandlers.forEach((handler) => handler(message));
|
|
218
|
+
} catch (error) {
|
|
219
|
+
console.error("Failed to parse WebSocket message:", error);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
scheduleReconnect() {
|
|
223
|
+
setTimeout(() => {
|
|
224
|
+
this.reconnectAttempts++;
|
|
225
|
+
this.reconnectDelay = Math.min(
|
|
226
|
+
this.reconnectDelay * 2,
|
|
227
|
+
this.maxReconnectDelay
|
|
228
|
+
);
|
|
229
|
+
this.connect();
|
|
230
|
+
}, this.reconnectDelay);
|
|
231
|
+
}
|
|
232
|
+
resubscribeAll() {
|
|
233
|
+
for (const { entityType } of this.entitySubscriptions.values()) {
|
|
234
|
+
const message = {
|
|
235
|
+
action: "subscribe",
|
|
236
|
+
id: nanoid(),
|
|
237
|
+
payload: { entityType }
|
|
238
|
+
};
|
|
239
|
+
this.send(message);
|
|
240
|
+
}
|
|
241
|
+
for (const {
|
|
242
|
+
byEntityType,
|
|
243
|
+
byEntityId,
|
|
244
|
+
mutualEntityType
|
|
245
|
+
} of this.mutualSubscriptions.values()) {
|
|
246
|
+
const message = {
|
|
247
|
+
action: "subscribe",
|
|
248
|
+
id: nanoid(),
|
|
249
|
+
payload: { byEntityType, byEntityId, mutualEntityType }
|
|
250
|
+
};
|
|
251
|
+
this.send(message);
|
|
252
|
+
}
|
|
253
|
+
for (const { channel } of this.ephemeralSubscriptions.values()) {
|
|
254
|
+
const message = {
|
|
255
|
+
action: "subscribe",
|
|
256
|
+
id: nanoid(),
|
|
257
|
+
payload: { channel }
|
|
258
|
+
};
|
|
259
|
+
this.send(message);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
flushPendingMessages() {
|
|
263
|
+
while (this.pendingMessages.length > 0) {
|
|
264
|
+
const message = this.pendingMessages.shift();
|
|
265
|
+
if (message) {
|
|
266
|
+
this.send(message);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
startHeartbeat() {
|
|
271
|
+
this.heartbeatInterval = setInterval(() => {
|
|
272
|
+
const pingMessage = {
|
|
273
|
+
action: "ping",
|
|
274
|
+
id: nanoid(),
|
|
275
|
+
payload: {}
|
|
276
|
+
};
|
|
277
|
+
this.send(pingMessage);
|
|
278
|
+
this.heartbeatTimeout = setTimeout(() => {
|
|
279
|
+
var _a;
|
|
280
|
+
(_a = this.ws) == null ? void 0 : _a.close();
|
|
281
|
+
}, this.heartbeatTimeoutMs);
|
|
282
|
+
}, this.heartbeatIntervalMs);
|
|
283
|
+
}
|
|
284
|
+
stopHeartbeat() {
|
|
285
|
+
if (this.heartbeatInterval) {
|
|
286
|
+
clearInterval(this.heartbeatInterval);
|
|
287
|
+
this.heartbeatInterval = null;
|
|
288
|
+
}
|
|
289
|
+
if (this.heartbeatTimeout) {
|
|
290
|
+
clearTimeout(this.heartbeatTimeout);
|
|
291
|
+
this.heartbeatTimeout = null;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
handlePong() {
|
|
295
|
+
if (this.heartbeatTimeout) {
|
|
296
|
+
clearTimeout(this.heartbeatTimeout);
|
|
297
|
+
this.heartbeatTimeout = null;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
// websocket/optimistic.ts
|
|
303
|
+
import { nanoid as nanoid2 } from "nanoid";
|
|
304
|
+
var OptimisticEngine = class {
|
|
305
|
+
constructor(options) {
|
|
306
|
+
this.operations = /* @__PURE__ */ new Map();
|
|
307
|
+
this.onRollback = options == null ? void 0 : options.onRollback;
|
|
308
|
+
this.onConfirm = options == null ? void 0 : options.onConfirm;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Register an optimistic operation
|
|
312
|
+
*/
|
|
313
|
+
register(operation) {
|
|
314
|
+
const id = nanoid2();
|
|
315
|
+
const fullOperation = __spreadProps(__spreadValues({}, operation), {
|
|
316
|
+
id,
|
|
317
|
+
timestamp: Date.now()
|
|
318
|
+
});
|
|
319
|
+
this.operations.set(id, fullOperation);
|
|
320
|
+
return id;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Confirm an operation (server acknowledged)
|
|
324
|
+
*/
|
|
325
|
+
confirm(mutationId) {
|
|
326
|
+
var _a;
|
|
327
|
+
const operation = this.operations.get(mutationId);
|
|
328
|
+
if (operation) {
|
|
329
|
+
this.operations.delete(mutationId);
|
|
330
|
+
(_a = this.onConfirm) == null ? void 0 : _a.call(this, operation);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Rollback an operation (server rejected or failed)
|
|
335
|
+
*/
|
|
336
|
+
rollback(mutationId) {
|
|
337
|
+
var _a;
|
|
338
|
+
const operation = this.operations.get(mutationId);
|
|
339
|
+
if (operation) {
|
|
340
|
+
this.operations.delete(mutationId);
|
|
341
|
+
(_a = this.onRollback) == null ? void 0 : _a.call(this, operation);
|
|
342
|
+
return operation;
|
|
343
|
+
}
|
|
344
|
+
return void 0;
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Check if an entity has pending optimistic operations
|
|
348
|
+
*/
|
|
349
|
+
hasPendingOperation(entityType, entityId) {
|
|
350
|
+
for (const op of this.operations.values()) {
|
|
351
|
+
if (op.entityType === entityType && op.entityId === entityId) {
|
|
352
|
+
return true;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
return false;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Get pending operation for an entity
|
|
359
|
+
*/
|
|
360
|
+
getPendingOperation(entityType, entityId) {
|
|
361
|
+
for (const op of this.operations.values()) {
|
|
362
|
+
if (op.entityType === entityType && op.entityId === entityId) {
|
|
363
|
+
return op;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
return void 0;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Clear all operations (e.g., on disconnect)
|
|
370
|
+
*/
|
|
371
|
+
clear() {
|
|
372
|
+
const allOperations = Array.from(this.operations.values());
|
|
373
|
+
this.operations.clear();
|
|
374
|
+
return allOperations;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Get all pending operations
|
|
378
|
+
*/
|
|
379
|
+
getAllPending() {
|
|
380
|
+
return Array.from(this.operations.values());
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Clean up old operations (older than specified ms)
|
|
384
|
+
*/
|
|
385
|
+
cleanup(maxAgeMs = 5 * 60 * 1e3) {
|
|
386
|
+
const now = Date.now();
|
|
387
|
+
let cleaned = 0;
|
|
388
|
+
for (const [id, operation] of this.operations) {
|
|
389
|
+
if (now - operation.timestamp > maxAgeMs) {
|
|
390
|
+
this.operations.delete(id);
|
|
391
|
+
cleaned++;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
return cleaned;
|
|
395
|
+
}
|
|
396
|
+
};
|
|
397
|
+
|
|
398
|
+
export {
|
|
399
|
+
WebSocketManager,
|
|
400
|
+
OptimisticEngine
|
|
401
|
+
};
|
|
402
|
+
//# sourceMappingURL=chunk-EQ3PKQ2S.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../websocket/WebSocketManager.ts","../websocket/optimistic.ts"],"sourcesContent":["import { nanoid } from 'nanoid';\n\nexport type ConnectionState =\n | 'connecting'\n | 'connected'\n | 'reconnecting'\n | 'disconnected';\n\nexport interface ClientMessage {\n action: 'subscribe' | 'unsubscribe' | 'ephemeral' | 'ping';\n id: string;\n payload: {\n // Entity subscription: subscribe to all changes of this entity type\n entityType?: string;\n // Mutual subscription: subscribe to all mutuals of this type for a byEntity\n byEntityType?: string;\n byEntityId?: string;\n mutualEntityType?: string;\n // Ephemeral channel\n channel?: string;\n // Ephemeral message data\n data?: unknown;\n };\n}\n\nexport interface ServerMessage {\n type:\n | 'entity.created'\n | 'entity.updated'\n | 'entity.deleted'\n | 'mutual.created'\n | 'mutual.updated'\n | 'mutual.deleted'\n | 'ephemeral'\n | 'ack'\n | 'error'\n | 'pong';\n id: string;\n payload: unknown;\n}\n\ntype MessageHandler = (message: ServerMessage) => void;\ntype ConnectionStateHandler = (state: ConnectionState) => void;\n\n// Entity type subscription: listen to ALL changes of this entity type\ninterface EntityTypeSubscription {\n entityType: string;\n}\n\n// Mutual type subscription: listen to ALL mutuals of this type for a byEntity\ninterface MutualTypeSubscription {\n byEntityType: string;\n byEntityId: string;\n mutualEntityType: string;\n}\n\n// Ephemeral channel subscription: listen to ephemeral messages on this channel\ninterface EphemeralSubscription {\n channel: string;\n}\n\nexport class WebSocketManager {\n private ws: WebSocket | null = null;\n private url: string;\n private token: string;\n private state: ConnectionState = 'disconnected';\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 10;\n private reconnectDelay = 1000;\n private maxReconnectDelay = 30000;\n private heartbeatInterval: NodeJS.Timeout | null = null;\n private heartbeatTimeout: NodeJS.Timeout | null = null;\n private readonly heartbeatIntervalMs = 30000;\n private readonly heartbeatTimeoutMs = 10000;\n\n private messageHandlers: Set<MessageHandler> = new Set();\n private stateHandlers: Set<ConnectionStateHandler> = new Set();\n private entitySubscriptions: Map<string, EntityTypeSubscription> = new Map();\n private mutualSubscriptions: Map<string, MutualTypeSubscription> = new Map();\n private ephemeralSubscriptions: Map<string, EphemeralSubscription> = new Map();\n private pendingMessages: ClientMessage[] = [];\n\n public disableAutoReconnect = false;\n\n constructor(url: string, token: string) {\n this.url = url;\n this.token = token;\n }\n\n connect(): void {\n if (this.ws?.readyState === WebSocket.OPEN) return;\n\n this.setState('connecting');\n\n try {\n const connectUrl = this.token\n ? `${this.url}?token=${encodeURIComponent(this.token)}`\n : this.url;\n this.ws = new WebSocket(connectUrl);\n\n this.ws.onopen = this.handleOpen.bind(this);\n this.ws.onclose = this.handleClose.bind(this);\n this.ws.onerror = this.handleError.bind(this);\n this.ws.onmessage = this.handleMessage.bind(this);\n } catch (error) {\n console.error('WebSocket connection error:', error);\n this.scheduleReconnect();\n }\n }\n\n disconnect(): void {\n this.stopHeartbeat();\n this.reconnectAttempts = 0;\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.setState('disconnected');\n }\n\n // Subscribe to ALL changes of an entity type\n subscribeEntityType(entityType: string): string {\n const subKey = `entity:${entityType}`;\n\n if (!this.entitySubscriptions.has(subKey)) {\n this.entitySubscriptions.set(subKey, { entityType });\n }\n\n if (this.state === 'connected') {\n const message: ClientMessage = {\n action: 'subscribe',\n id: nanoid(),\n payload: { entityType },\n };\n this.send(message);\n }\n\n return subKey;\n }\n\n unsubscribeEntityType(subKey: string): void {\n const subscription = this.entitySubscriptions.get(subKey);\n if (!subscription) return;\n\n this.entitySubscriptions.delete(subKey);\n\n if (this.state === 'connected') {\n const message: ClientMessage = {\n action: 'unsubscribe',\n id: nanoid(),\n payload: { entityType: subscription.entityType },\n };\n this.send(message);\n }\n }\n\n // Subscribe to ALL mutuals of a type for a specific byEntity\n subscribeMutualType(\n byEntityType: string,\n byEntityId: string,\n mutualEntityType: string,\n ): string {\n const subKey = `mutual:${byEntityType}:${byEntityId}:${mutualEntityType}`;\n\n if (!this.mutualSubscriptions.has(subKey)) {\n this.mutualSubscriptions.set(subKey, {\n byEntityType,\n byEntityId,\n mutualEntityType,\n });\n }\n\n if (this.state === 'connected') {\n const message: ClientMessage = {\n action: 'subscribe',\n id: nanoid(),\n payload: { byEntityType, byEntityId, mutualEntityType },\n };\n this.send(message);\n }\n\n return subKey;\n }\n\n unsubscribeMutualType(subKey: string): void {\n const subscription = this.mutualSubscriptions.get(subKey);\n if (!subscription) return;\n\n this.mutualSubscriptions.delete(subKey);\n\n if (this.state === 'connected') {\n const message: ClientMessage = {\n action: 'unsubscribe',\n id: nanoid(),\n payload: {\n byEntityType: subscription.byEntityType,\n byEntityId: subscription.byEntityId,\n mutualEntityType: subscription.mutualEntityType,\n },\n };\n this.send(message);\n }\n }\n\n // Subscribe to ephemeral messages on a channel\n subscribeEphemeral(channel: string): string {\n const subKey = `ephemeral:${channel}`;\n\n if (!this.ephemeralSubscriptions.has(subKey)) {\n this.ephemeralSubscriptions.set(subKey, { channel });\n }\n\n if (this.state === 'connected') {\n const message: ClientMessage = {\n action: 'subscribe',\n id: nanoid(),\n payload: { channel },\n };\n this.send(message);\n }\n\n return subKey;\n }\n\n unsubscribeEphemeral(subKey: string): void {\n const subscription = this.ephemeralSubscriptions.get(subKey);\n if (!subscription) return;\n\n this.ephemeralSubscriptions.delete(subKey);\n\n if (this.state === 'connected') {\n const message: ClientMessage = {\n action: 'unsubscribe',\n id: nanoid(),\n payload: { channel: subscription.channel },\n };\n this.send(message);\n }\n }\n\n // Send an ephemeral message to a channel\n sendEphemeral(channel: string, data: unknown): void {\n const message: ClientMessage = {\n action: 'ephemeral',\n id: nanoid(),\n payload: { channel, data },\n };\n this.send(message);\n }\n\n send(message: ClientMessage): void {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(message));\n } else {\n this.pendingMessages.push(message);\n }\n }\n\n onMessage(handler: MessageHandler): () => void {\n this.messageHandlers.add(handler);\n return () => this.messageHandlers.delete(handler);\n }\n\n onStateChange(handler: ConnectionStateHandler): () => void {\n this.stateHandlers.add(handler);\n handler(this.state);\n return () => this.stateHandlers.delete(handler);\n }\n\n getState(): ConnectionState {\n return this.state;\n }\n\n private setState(newState: ConnectionState): void {\n if (this.state !== newState) {\n this.state = newState;\n this.stateHandlers.forEach((handler) => handler(newState));\n }\n }\n\n private handleOpen(): void {\n this.setState('connected');\n this.reconnectAttempts = 0;\n this.reconnectDelay = 1000;\n\n this.startHeartbeat();\n this.resubscribeAll();\n this.flushPendingMessages();\n }\n\n private handleClose(event: CloseEvent): void {\n this.stopHeartbeat();\n this.ws = null;\n\n if (this.disableAutoReconnect) {\n this.setState('disconnected');\n return;\n }\n\n if (this.reconnectAttempts < this.maxReconnectAttempts) {\n this.setState('reconnecting');\n this.scheduleReconnect();\n } else {\n this.setState('disconnected');\n }\n }\n\n private handleError(error: Event): void {\n console.error('WebSocket error:', error);\n }\n\n private handleMessage(event: MessageEvent): void {\n try {\n const message = JSON.parse(event.data) as ServerMessage;\n\n if (message.type === 'pong') {\n this.handlePong();\n return;\n }\n\n this.messageHandlers.forEach((handler) => handler(message));\n } catch (error) {\n console.error('Failed to parse WebSocket message:', error);\n }\n }\n\n private scheduleReconnect(): void {\n setTimeout(() => {\n this.reconnectAttempts++;\n this.reconnectDelay = Math.min(\n this.reconnectDelay * 2,\n this.maxReconnectDelay,\n );\n this.connect();\n }, this.reconnectDelay);\n }\n\n private resubscribeAll(): void {\n // Re-subscribe entity types\n for (const { entityType } of this.entitySubscriptions.values()) {\n const message: ClientMessage = {\n action: 'subscribe',\n id: nanoid(),\n payload: { entityType },\n };\n this.send(message);\n }\n\n // Re-subscribe mutual types\n for (const {\n byEntityType,\n byEntityId,\n mutualEntityType,\n } of this.mutualSubscriptions.values()) {\n const message: ClientMessage = {\n action: 'subscribe',\n id: nanoid(),\n payload: { byEntityType, byEntityId, mutualEntityType },\n };\n this.send(message);\n }\n\n // Re-subscribe ephemeral channels\n for (const { channel } of this.ephemeralSubscriptions.values()) {\n const message: ClientMessage = {\n action: 'subscribe',\n id: nanoid(),\n payload: { channel },\n };\n this.send(message);\n }\n }\n\n private flushPendingMessages(): void {\n while (this.pendingMessages.length > 0) {\n const message = this.pendingMessages.shift();\n if (message) {\n this.send(message);\n }\n }\n }\n\n private startHeartbeat(): void {\n this.heartbeatInterval = setInterval(() => {\n const pingMessage: ClientMessage = {\n action: 'ping',\n id: nanoid(),\n payload: {},\n };\n this.send(pingMessage);\n\n this.heartbeatTimeout = setTimeout(() => {\n this.ws?.close();\n }, this.heartbeatTimeoutMs);\n }, this.heartbeatIntervalMs);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n if (this.heartbeatTimeout) {\n clearTimeout(this.heartbeatTimeout);\n this.heartbeatTimeout = null;\n }\n }\n\n private handlePong(): void {\n if (this.heartbeatTimeout) {\n clearTimeout(this.heartbeatTimeout);\n this.heartbeatTimeout = null;\n }\n }\n}\n","import { nanoid } from 'nanoid';\n\nexport interface OptimisticOperation {\n id: string;\n type: 'create' | 'update' | 'delete';\n entityType: string;\n entityId: string;\n previousData?: unknown;\n optimisticData: unknown;\n timestamp: number;\n}\n\nexport class OptimisticEngine {\n private operations: Map<string, OptimisticOperation> = new Map();\n private onRollback?: (operation: OptimisticOperation) => void;\n private onConfirm?: (operation: OptimisticOperation) => void;\n\n constructor(options?: {\n onRollback?: (operation: OptimisticOperation) => void;\n onConfirm?: (operation: OptimisticOperation) => void;\n }) {\n this.onRollback = options?.onRollback;\n this.onConfirm = options?.onConfirm;\n }\n\n /**\n * Register an optimistic operation\n */\n register(operation: Omit<OptimisticOperation, 'id' | 'timestamp'>): string {\n const id = nanoid();\n const fullOperation: OptimisticOperation = {\n ...operation,\n id,\n timestamp: Date.now(),\n };\n\n this.operations.set(id, fullOperation);\n return id;\n }\n\n /**\n * Confirm an operation (server acknowledged)\n */\n confirm(mutationId: string): void {\n const operation = this.operations.get(mutationId);\n if (operation) {\n this.operations.delete(mutationId);\n this.onConfirm?.(operation);\n }\n }\n\n /**\n * Rollback an operation (server rejected or failed)\n */\n rollback(mutationId: string): OptimisticOperation | undefined {\n const operation = this.operations.get(mutationId);\n if (operation) {\n this.operations.delete(mutationId);\n this.onRollback?.(operation);\n return operation;\n }\n return undefined;\n }\n\n /**\n * Check if an entity has pending optimistic operations\n */\n hasPendingOperation(entityType: string, entityId: string): boolean {\n for (const op of this.operations.values()) {\n if (op.entityType === entityType && op.entityId === entityId) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Get pending operation for an entity\n */\n getPendingOperation(\n entityType: string,\n entityId: string,\n ): OptimisticOperation | undefined {\n for (const op of this.operations.values()) {\n if (op.entityType === entityType && op.entityId === entityId) {\n return op;\n }\n }\n return undefined;\n }\n\n /**\n * Clear all operations (e.g., on disconnect)\n */\n clear(): OptimisticOperation[] {\n const allOperations = Array.from(this.operations.values());\n this.operations.clear();\n return allOperations;\n }\n\n /**\n * Get all pending operations\n */\n getAllPending(): OptimisticOperation[] {\n return Array.from(this.operations.values());\n }\n\n /**\n * Clean up old operations (older than specified ms)\n */\n cleanup(maxAgeMs: number = 5 * 60 * 1000): number {\n const now = Date.now();\n let cleaned = 0;\n\n for (const [id, operation] of this.operations) {\n if (now - operation.timestamp > maxAgeMs) {\n this.operations.delete(id);\n cleaned++;\n }\n }\n\n return cleaned;\n }\n}\n"],"mappings":"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","names":["nanoid","nanoid"]}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import {
|
|
2
|
+
HttpProtocol,
|
|
3
|
+
NormalizedSchema,
|
|
4
|
+
SignatureV4,
|
|
5
|
+
collectBody
|
|
6
|
+
} from "./chunk-UHMKB3OR.js";
|
|
7
|
+
import {
|
|
8
|
+
HttpRequest
|
|
9
|
+
} from "./chunk-4D22OCZG.js";
|
|
10
|
+
import {
|
|
11
|
+
__publicField,
|
|
12
|
+
__spreadProps,
|
|
13
|
+
__spreadValues
|
|
14
|
+
} from "./chunk-CQBOIXWK.js";
|
|
15
|
+
|
|
16
|
+
// ../../node_modules/@smithy/core/dist-es/submodules/protocols/RpcProtocol.js
|
|
17
|
+
var RpcProtocol = class extends HttpProtocol {
|
|
18
|
+
async serializeRequest(operationSchema, _input, context) {
|
|
19
|
+
const serializer = this.serializer;
|
|
20
|
+
const query = {};
|
|
21
|
+
const headers = {};
|
|
22
|
+
const endpoint = await context.endpoint();
|
|
23
|
+
const ns = NormalizedSchema.of(operationSchema == null ? void 0 : operationSchema.input);
|
|
24
|
+
const schema = ns.getSchema();
|
|
25
|
+
let payload;
|
|
26
|
+
const input = _input && typeof _input === "object" ? _input : {};
|
|
27
|
+
const request = new HttpRequest({
|
|
28
|
+
protocol: "",
|
|
29
|
+
hostname: "",
|
|
30
|
+
port: void 0,
|
|
31
|
+
path: "/",
|
|
32
|
+
fragment: void 0,
|
|
33
|
+
query,
|
|
34
|
+
headers,
|
|
35
|
+
body: void 0
|
|
36
|
+
});
|
|
37
|
+
if (endpoint) {
|
|
38
|
+
this.updateServiceEndpoint(request, endpoint);
|
|
39
|
+
this.setHostPrefix(request, operationSchema, input);
|
|
40
|
+
}
|
|
41
|
+
if (input) {
|
|
42
|
+
const eventStreamMember = ns.getEventStreamMember();
|
|
43
|
+
if (eventStreamMember) {
|
|
44
|
+
if (input[eventStreamMember]) {
|
|
45
|
+
const initialRequest = {};
|
|
46
|
+
for (const [memberName, memberSchema] of ns.structIterator()) {
|
|
47
|
+
if (memberName !== eventStreamMember && input[memberName]) {
|
|
48
|
+
serializer.write(memberSchema, input[memberName]);
|
|
49
|
+
initialRequest[memberName] = serializer.flush();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
payload = await this.serializeEventStream({
|
|
53
|
+
eventStream: input[eventStreamMember],
|
|
54
|
+
requestSchema: ns,
|
|
55
|
+
initialRequest
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
} else {
|
|
59
|
+
serializer.write(schema, input);
|
|
60
|
+
payload = serializer.flush();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
request.headers = Object.assign(request.headers, headers);
|
|
64
|
+
request.query = query;
|
|
65
|
+
request.body = payload;
|
|
66
|
+
request.method = "POST";
|
|
67
|
+
return request;
|
|
68
|
+
}
|
|
69
|
+
async deserializeResponse(operationSchema, context, response) {
|
|
70
|
+
const deserializer = this.deserializer;
|
|
71
|
+
const ns = NormalizedSchema.of(operationSchema.output);
|
|
72
|
+
const dataObject = {};
|
|
73
|
+
if (response.statusCode >= 300) {
|
|
74
|
+
const bytes = await collectBody(response.body, context);
|
|
75
|
+
if (bytes.byteLength > 0) {
|
|
76
|
+
Object.assign(dataObject, await deserializer.read(15, bytes));
|
|
77
|
+
}
|
|
78
|
+
await this.handleError(operationSchema, context, response, dataObject, this.deserializeMetadata(response));
|
|
79
|
+
throw new Error("@smithy/core/protocols - RPC Protocol error handler failed to throw.");
|
|
80
|
+
}
|
|
81
|
+
for (const header in response.headers) {
|
|
82
|
+
const value = response.headers[header];
|
|
83
|
+
delete response.headers[header];
|
|
84
|
+
response.headers[header.toLowerCase()] = value;
|
|
85
|
+
}
|
|
86
|
+
const eventStreamMember = ns.getEventStreamMember();
|
|
87
|
+
if (eventStreamMember) {
|
|
88
|
+
dataObject[eventStreamMember] = await this.deserializeEventStream({
|
|
89
|
+
response,
|
|
90
|
+
responseSchema: ns,
|
|
91
|
+
initialResponseContainer: dataObject
|
|
92
|
+
});
|
|
93
|
+
} else {
|
|
94
|
+
const bytes = await collectBody(response.body, context);
|
|
95
|
+
if (bytes.byteLength > 0) {
|
|
96
|
+
Object.assign(dataObject, await deserializer.read(ns, bytes));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
dataObject.$metadata = this.deserializeMetadata(response);
|
|
100
|
+
return dataObject;
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
// ../../node_modules/@smithy/signature-v4/dist-es/signature-v4a-container.js
|
|
105
|
+
var signatureV4aContainer = {
|
|
106
|
+
SignatureV4a: null
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// ../../node_modules/@aws-sdk/middleware-sdk-s3/dist-es/s3-express/constants.js
|
|
110
|
+
var SESSION_TOKEN_QUERY_PARAM = "X-Amz-S3session-Token";
|
|
111
|
+
var SESSION_TOKEN_HEADER = SESSION_TOKEN_QUERY_PARAM.toLowerCase();
|
|
112
|
+
|
|
113
|
+
// ../../node_modules/@aws-sdk/middleware-sdk-s3/dist-es/s3-express/classes/SignatureV4S3Express.js
|
|
114
|
+
var SignatureV4S3Express = class extends SignatureV4 {
|
|
115
|
+
async signWithCredentials(requestToSign, credentials, options) {
|
|
116
|
+
const credentialsWithoutSessionToken = getCredentialsWithoutSessionToken(credentials);
|
|
117
|
+
requestToSign.headers[SESSION_TOKEN_HEADER] = credentials.sessionToken;
|
|
118
|
+
const privateAccess = this;
|
|
119
|
+
setSingleOverride(privateAccess, credentialsWithoutSessionToken);
|
|
120
|
+
return privateAccess.signRequest(requestToSign, options != null ? options : {});
|
|
121
|
+
}
|
|
122
|
+
async presignWithCredentials(requestToSign, credentials, options) {
|
|
123
|
+
var _a;
|
|
124
|
+
const credentialsWithoutSessionToken = getCredentialsWithoutSessionToken(credentials);
|
|
125
|
+
delete requestToSign.headers[SESSION_TOKEN_HEADER];
|
|
126
|
+
requestToSign.headers[SESSION_TOKEN_QUERY_PARAM] = credentials.sessionToken;
|
|
127
|
+
requestToSign.query = (_a = requestToSign.query) != null ? _a : {};
|
|
128
|
+
requestToSign.query[SESSION_TOKEN_QUERY_PARAM] = credentials.sessionToken;
|
|
129
|
+
const privateAccess = this;
|
|
130
|
+
setSingleOverride(privateAccess, credentialsWithoutSessionToken);
|
|
131
|
+
return this.presign(requestToSign, options);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
function getCredentialsWithoutSessionToken(credentials) {
|
|
135
|
+
const credentialsWithoutSessionToken = {
|
|
136
|
+
accessKeyId: credentials.accessKeyId,
|
|
137
|
+
secretAccessKey: credentials.secretAccessKey,
|
|
138
|
+
expiration: credentials.expiration
|
|
139
|
+
};
|
|
140
|
+
return credentialsWithoutSessionToken;
|
|
141
|
+
}
|
|
142
|
+
function setSingleOverride(privateAccess, credentialsWithoutSessionToken) {
|
|
143
|
+
const id = setTimeout(() => {
|
|
144
|
+
throw new Error("SignatureV4S3Express credential override was created but not called.");
|
|
145
|
+
}, 10);
|
|
146
|
+
const currentCredentialProvider = privateAccess.credentialProvider;
|
|
147
|
+
const overrideCredentialsProviderOnce = () => {
|
|
148
|
+
clearTimeout(id);
|
|
149
|
+
privateAccess.credentialProvider = currentCredentialProvider;
|
|
150
|
+
return Promise.resolve(credentialsWithoutSessionToken);
|
|
151
|
+
};
|
|
152
|
+
privateAccess.credentialProvider = overrideCredentialsProviderOnce;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// ../../node_modules/@aws-sdk/signature-v4-multi-region/dist-es/signature-v4-crt-container.js
|
|
156
|
+
var signatureV4CrtContainer = {
|
|
157
|
+
CrtSignerV4: null
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
// ../../node_modules/@aws-sdk/signature-v4-multi-region/dist-es/SignatureV4MultiRegion.js
|
|
161
|
+
var SignatureV4MultiRegion = class {
|
|
162
|
+
constructor(options) {
|
|
163
|
+
__publicField(this, "sigv4aSigner");
|
|
164
|
+
__publicField(this, "sigv4Signer");
|
|
165
|
+
__publicField(this, "signerOptions");
|
|
166
|
+
this.sigv4Signer = new SignatureV4S3Express(options);
|
|
167
|
+
this.signerOptions = options;
|
|
168
|
+
}
|
|
169
|
+
static sigv4aDependency() {
|
|
170
|
+
if (typeof signatureV4CrtContainer.CrtSignerV4 === "function") {
|
|
171
|
+
return "crt";
|
|
172
|
+
} else if (typeof signatureV4aContainer.SignatureV4a === "function") {
|
|
173
|
+
return "js";
|
|
174
|
+
}
|
|
175
|
+
return "none";
|
|
176
|
+
}
|
|
177
|
+
async sign(requestToSign, options = {}) {
|
|
178
|
+
if (options.signingRegion === "*") {
|
|
179
|
+
return this.getSigv4aSigner().sign(requestToSign, options);
|
|
180
|
+
}
|
|
181
|
+
return this.sigv4Signer.sign(requestToSign, options);
|
|
182
|
+
}
|
|
183
|
+
async signWithCredentials(requestToSign, credentials, options = {}) {
|
|
184
|
+
if (options.signingRegion === "*") {
|
|
185
|
+
const signer = this.getSigv4aSigner();
|
|
186
|
+
const CrtSignerV4 = signatureV4CrtContainer.CrtSignerV4;
|
|
187
|
+
if (CrtSignerV4 && signer instanceof CrtSignerV4) {
|
|
188
|
+
return signer.signWithCredentials(requestToSign, credentials, options);
|
|
189
|
+
} else {
|
|
190
|
+
throw new Error(`signWithCredentials with signingRegion '*' is only supported when using the CRT dependency @aws-sdk/signature-v4-crt. Please check whether you have installed the "@aws-sdk/signature-v4-crt" package explicitly. You must also register the package by calling [require("@aws-sdk/signature-v4-crt");] or an ESM equivalent such as [import "@aws-sdk/signature-v4-crt";]. For more information please go to https://github.com/aws/aws-sdk-js-v3#functionality-requiring-aws-common-runtime-crt`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return this.sigv4Signer.signWithCredentials(requestToSign, credentials, options);
|
|
194
|
+
}
|
|
195
|
+
async presign(originalRequest, options = {}) {
|
|
196
|
+
if (options.signingRegion === "*") {
|
|
197
|
+
const signer = this.getSigv4aSigner();
|
|
198
|
+
const CrtSignerV4 = signatureV4CrtContainer.CrtSignerV4;
|
|
199
|
+
if (CrtSignerV4 && signer instanceof CrtSignerV4) {
|
|
200
|
+
return signer.presign(originalRequest, options);
|
|
201
|
+
} else {
|
|
202
|
+
throw new Error(`presign with signingRegion '*' is only supported when using the CRT dependency @aws-sdk/signature-v4-crt. Please check whether you have installed the "@aws-sdk/signature-v4-crt" package explicitly. You must also register the package by calling [require("@aws-sdk/signature-v4-crt");] or an ESM equivalent such as [import "@aws-sdk/signature-v4-crt";]. For more information please go to https://github.com/aws/aws-sdk-js-v3#functionality-requiring-aws-common-runtime-crt`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return this.sigv4Signer.presign(originalRequest, options);
|
|
206
|
+
}
|
|
207
|
+
async presignWithCredentials(originalRequest, credentials, options = {}) {
|
|
208
|
+
if (options.signingRegion === "*") {
|
|
209
|
+
throw new Error("Method presignWithCredentials is not supported for [signingRegion=*].");
|
|
210
|
+
}
|
|
211
|
+
return this.sigv4Signer.presignWithCredentials(originalRequest, credentials, options);
|
|
212
|
+
}
|
|
213
|
+
getSigv4aSigner() {
|
|
214
|
+
if (!this.sigv4aSigner) {
|
|
215
|
+
const CrtSignerV4 = signatureV4CrtContainer.CrtSignerV4;
|
|
216
|
+
const JsSigV4aSigner = signatureV4aContainer.SignatureV4a;
|
|
217
|
+
if (this.signerOptions.runtime === "node") {
|
|
218
|
+
if (!CrtSignerV4 && !JsSigV4aSigner) {
|
|
219
|
+
throw new Error("Neither CRT nor JS SigV4a implementation is available. Please load either @aws-sdk/signature-v4-crt or @aws-sdk/signature-v4a. For more information please go to https://github.com/aws/aws-sdk-js-v3#functionality-requiring-aws-common-runtime-crt");
|
|
220
|
+
}
|
|
221
|
+
if (CrtSignerV4 && typeof CrtSignerV4 === "function") {
|
|
222
|
+
this.sigv4aSigner = new CrtSignerV4(__spreadProps(__spreadValues({}, this.signerOptions), {
|
|
223
|
+
signingAlgorithm: 1
|
|
224
|
+
}));
|
|
225
|
+
} else if (JsSigV4aSigner && typeof JsSigV4aSigner === "function") {
|
|
226
|
+
this.sigv4aSigner = new JsSigV4aSigner(__spreadValues({}, this.signerOptions));
|
|
227
|
+
} else {
|
|
228
|
+
throw new Error("Available SigV4a implementation is not a valid constructor. Please ensure you've properly imported @aws-sdk/signature-v4-crt or @aws-sdk/signature-v4a.For more information please go to https://github.com/aws/aws-sdk-js-v3#functionality-requiring-aws-common-runtime-crt");
|
|
229
|
+
}
|
|
230
|
+
} else {
|
|
231
|
+
if (!JsSigV4aSigner || typeof JsSigV4aSigner !== "function") {
|
|
232
|
+
throw new Error("JS SigV4a implementation is not available or not a valid constructor. Please check whether you have installed the @aws-sdk/signature-v4a package explicitly. The CRT implementation is not available for browsers. You must also register the package by calling [require('@aws-sdk/signature-v4a');] or an ESM equivalent such as [import '@aws-sdk/signature-v4a';]. For more information please go to https://github.com/aws/aws-sdk-js-v3#using-javascript-non-crt-implementation-of-sigv4a");
|
|
233
|
+
}
|
|
234
|
+
this.sigv4aSigner = new JsSigV4aSigner(__spreadValues({}, this.signerOptions));
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return this.sigv4aSigner;
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
export {
|
|
242
|
+
RpcProtocol,
|
|
243
|
+
SignatureV4MultiRegion
|
|
244
|
+
};
|
|
245
|
+
//# sourceMappingURL=chunk-H64MMAL7.js.map
|