rivetkit 2.0.2 → 2.0.4-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -5
- package/dist/browser/client.d.ts +2485 -0
- package/dist/browser/client.js +5182 -0
- package/dist/browser/client.js.map +1 -0
- package/dist/browser/inspector/client.d.ts +130 -0
- package/dist/browser/inspector/client.js +2854 -0
- package/dist/browser/inspector/client.js.map +1 -0
- package/dist/browser/v3-DnYObHH3.d.ts +279 -0
- package/dist/inspector.tar.gz +0 -0
- package/dist/schemas/actor-inspector/v1.ts +784 -0
- package/dist/schemas/actor-inspector/v2.ts +796 -0
- package/dist/schemas/actor-inspector/v3.ts +899 -0
- package/dist/schemas/actor-persist/v1.ts +225 -0
- package/dist/schemas/actor-persist/v2.ts +268 -0
- package/dist/schemas/actor-persist/v3.ts +280 -0
- package/dist/schemas/actor-persist/v4.ts +406 -0
- package/dist/schemas/client-protocol/v1.ts +441 -0
- package/dist/schemas/client-protocol/v2.ts +438 -0
- package/dist/schemas/client-protocol/v3.ts +554 -0
- package/dist/schemas/file-system-driver/v1.ts +108 -0
- package/dist/schemas/file-system-driver/v2.ts +142 -0
- package/dist/schemas/file-system-driver/v3.ts +167 -0
- package/dist/schemas/persist/v1.ts +781 -0
- package/dist/schemas/transport/v1.ts +697 -0
- package/dist/tsup/actor/errors.cjs +106 -0
- package/dist/tsup/actor/errors.cjs.map +1 -0
- package/dist/tsup/actor/errors.d.cts +188 -0
- package/dist/tsup/actor/errors.d.ts +188 -0
- package/dist/tsup/actor/errors.js +106 -0
- package/dist/tsup/actor/errors.js.map +1 -0
- package/dist/tsup/actor-router-consts-D29T1Z-K.d.cts +24 -0
- package/dist/tsup/actor-router-consts-D29T1Z-K.d.ts +24 -0
- package/dist/tsup/chunk-325TLXJT.js +1060 -0
- package/dist/tsup/chunk-325TLXJT.js.map +1 -0
- package/dist/tsup/chunk-424PT5DM.js +23 -0
- package/dist/tsup/chunk-424PT5DM.js.map +1 -0
- package/dist/tsup/chunk-4JVIG3SS.cjs +6289 -0
- package/dist/tsup/chunk-4JVIG3SS.cjs.map +1 -0
- package/dist/tsup/chunk-6LJAZ5R4.cjs +96 -0
- package/dist/tsup/chunk-6LJAZ5R4.cjs.map +1 -0
- package/dist/tsup/chunk-6XU3FMCB.cjs +534 -0
- package/dist/tsup/chunk-6XU3FMCB.cjs.map +1 -0
- package/dist/tsup/chunk-7HTNH26M.js +509 -0
- package/dist/tsup/chunk-7HTNH26M.js.map +1 -0
- package/dist/tsup/chunk-AUVH72RE.cjs +5977 -0
- package/dist/tsup/chunk-AUVH72RE.cjs.map +1 -0
- package/dist/tsup/chunk-D4BYUPNQ.js +645 -0
- package/dist/tsup/chunk-D4BYUPNQ.js.map +1 -0
- package/dist/tsup/chunk-HDQ2JUQT.cjs +23 -0
- package/dist/tsup/chunk-HDQ2JUQT.cjs.map +1 -0
- package/dist/tsup/chunk-HHXX2VRM.js +6289 -0
- package/dist/tsup/chunk-HHXX2VRM.js.map +1 -0
- package/dist/tsup/chunk-JEAEA2PB.js +49 -0
- package/dist/tsup/chunk-JEAEA2PB.js.map +1 -0
- package/dist/tsup/chunk-JYSEG3VF.cjs +642 -0
- package/dist/tsup/chunk-JYSEG3VF.cjs.map +1 -0
- package/dist/tsup/chunk-K6DGYILQ.js +2657 -0
- package/dist/tsup/chunk-K6DGYILQ.js.map +1 -0
- package/dist/tsup/chunk-KJSYAUOM.js +96 -0
- package/dist/tsup/chunk-KJSYAUOM.js.map +1 -0
- package/dist/tsup/chunk-L47L3ZWJ.cjs +509 -0
- package/dist/tsup/chunk-L47L3ZWJ.cjs.map +1 -0
- package/dist/tsup/chunk-LXUQ667X.js +2006 -0
- package/dist/tsup/chunk-LXUQ667X.js.map +1 -0
- package/dist/tsup/chunk-MXNPAB5W.js +5977 -0
- package/dist/tsup/chunk-MXNPAB5W.js.map +1 -0
- package/dist/tsup/chunk-N4KRDJ56.js +72 -0
- package/dist/tsup/chunk-N4KRDJ56.js.map +1 -0
- package/dist/tsup/chunk-NIYZDWMW.cjs +2006 -0
- package/dist/tsup/chunk-NIYZDWMW.cjs.map +1 -0
- package/dist/tsup/chunk-PQZHDKRW.cjs +1060 -0
- package/dist/tsup/chunk-PQZHDKRW.cjs.map +1 -0
- package/dist/tsup/chunk-PVOE6BU7.cjs +1050 -0
- package/dist/tsup/chunk-PVOE6BU7.cjs.map +1 -0
- package/dist/tsup/chunk-Q4UD2GA4.cjs +1810 -0
- package/dist/tsup/chunk-Q4UD2GA4.cjs.map +1 -0
- package/dist/tsup/chunk-QUD664YZ.js +1810 -0
- package/dist/tsup/chunk-QUD664YZ.js.map +1 -0
- package/dist/tsup/chunk-RTOCTWME.js +1050 -0
- package/dist/tsup/chunk-RTOCTWME.js.map +1 -0
- package/dist/tsup/chunk-SAZZ4SB2.cjs +2657 -0
- package/dist/tsup/chunk-SAZZ4SB2.cjs.map +1 -0
- package/dist/tsup/chunk-SR3KQE7Q.cjs +72 -0
- package/dist/tsup/chunk-SR3KQE7Q.cjs.map +1 -0
- package/dist/tsup/chunk-V2GHLYC6.cjs +49 -0
- package/dist/tsup/chunk-V2GHLYC6.cjs.map +1 -0
- package/dist/tsup/chunk-V3WG7XTW.cjs +645 -0
- package/dist/tsup/chunk-V3WG7XTW.cjs.map +1 -0
- package/dist/tsup/chunk-VKVNIQRQ.js +257 -0
- package/dist/tsup/chunk-VKVNIQRQ.js.map +1 -0
- package/dist/tsup/chunk-WMPW7JYC.js +642 -0
- package/dist/tsup/chunk-WMPW7JYC.js.map +1 -0
- package/dist/tsup/chunk-Z7HNQ2WF.js +534 -0
- package/dist/tsup/chunk-Z7HNQ2WF.js.map +1 -0
- package/dist/tsup/chunk-ZFY5J2EP.cjs +257 -0
- package/dist/tsup/chunk-ZFY5J2EP.cjs.map +1 -0
- package/dist/tsup/client/mod.cjs +33 -0
- package/dist/tsup/client/mod.cjs.map +1 -0
- package/dist/tsup/client/mod.d.cts +64 -0
- package/dist/tsup/client/mod.d.ts +64 -0
- package/dist/tsup/client/mod.js +33 -0
- package/dist/tsup/client/mod.js.map +1 -0
- package/dist/tsup/common/log.cjs +21 -0
- package/dist/tsup/common/log.cjs.map +1 -0
- package/dist/tsup/common/log.d.cts +34 -0
- package/dist/tsup/common/log.d.ts +34 -0
- package/dist/tsup/common/log.js +21 -0
- package/dist/tsup/common/log.js.map +1 -0
- package/dist/tsup/common/websocket.cjs +10 -0
- package/dist/tsup/common/websocket.cjs.map +1 -0
- package/dist/tsup/common/websocket.d.cts +3 -0
- package/dist/tsup/common/websocket.d.ts +3 -0
- package/dist/tsup/common/websocket.js +10 -0
- package/dist/tsup/common/websocket.js.map +1 -0
- package/dist/tsup/config-BiNoIHRs.d.cts +80 -0
- package/dist/tsup/config-BiNoIHRs.d.ts +80 -0
- package/dist/tsup/config-P3XujgRr.d.ts +2594 -0
- package/dist/tsup/config-_gfywqqI.d.cts +2594 -0
- package/dist/tsup/context-Bxd8Cx4H.d.cts +75 -0
- package/dist/tsup/context-uNA4TRn3.d.ts +75 -0
- package/dist/tsup/db/drizzle/mod.cjs +49 -0
- package/dist/tsup/db/drizzle/mod.cjs.map +1 -0
- package/dist/tsup/db/drizzle/mod.d.cts +17 -0
- package/dist/tsup/db/drizzle/mod.d.ts +17 -0
- package/dist/tsup/db/drizzle/mod.js +49 -0
- package/dist/tsup/db/drizzle/mod.js.map +1 -0
- package/dist/tsup/db/mod.cjs +9 -0
- package/dist/tsup/db/mod.cjs.map +1 -0
- package/dist/tsup/db/mod.d.cts +9 -0
- package/dist/tsup/db/mod.d.ts +9 -0
- package/dist/tsup/db/mod.js +9 -0
- package/dist/tsup/db/mod.js.map +1 -0
- package/dist/tsup/driver-BcLvZcKl.d.cts +13 -0
- package/dist/tsup/driver-CPGHKXyh.d.ts +13 -0
- package/dist/tsup/driver-helpers/mod.cjs +53 -0
- package/dist/tsup/driver-helpers/mod.cjs.map +1 -0
- package/dist/tsup/driver-helpers/mod.d.cts +47 -0
- package/dist/tsup/driver-helpers/mod.d.ts +47 -0
- package/dist/tsup/driver-helpers/mod.js +53 -0
- package/dist/tsup/driver-helpers/mod.js.map +1 -0
- package/dist/tsup/driver-test-suite/mod.cjs +4974 -0
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -0
- package/dist/tsup/driver-test-suite/mod.d.cts +73 -0
- package/dist/tsup/driver-test-suite/mod.d.ts +73 -0
- package/dist/tsup/driver-test-suite/mod.js +4974 -0
- package/dist/tsup/driver-test-suite/mod.js.map +1 -0
- package/dist/tsup/inspector/mod.cjs +164 -0
- package/dist/tsup/inspector/mod.cjs.map +1 -0
- package/dist/tsup/inspector/mod.d.cts +130 -0
- package/dist/tsup/inspector/mod.d.ts +130 -0
- package/dist/tsup/inspector/mod.js +164 -0
- package/dist/tsup/inspector/mod.js.map +1 -0
- package/dist/tsup/keys-CydblqMh.d.cts +13 -0
- package/dist/tsup/keys-CydblqMh.d.ts +13 -0
- package/dist/tsup/mod.cjs +82 -0
- package/dist/tsup/mod.cjs.map +1 -0
- package/dist/tsup/mod.d.cts +126 -0
- package/dist/tsup/mod.d.ts +126 -0
- package/dist/tsup/mod.js +82 -0
- package/dist/tsup/mod.js.map +1 -0
- package/dist/tsup/serve-test-suite/mod.cjs +2601 -0
- package/dist/tsup/serve-test-suite/mod.cjs.map +1 -0
- package/dist/tsup/serve-test-suite/mod.d.cts +9 -0
- package/dist/tsup/serve-test-suite/mod.d.ts +9 -0
- package/dist/tsup/serve-test-suite/mod.js +2601 -0
- package/dist/tsup/serve-test-suite/mod.js.map +1 -0
- package/dist/tsup/test/mod.cjs +90 -0
- package/dist/tsup/test/mod.cjs.map +1 -0
- package/dist/tsup/test/mod.d.cts +26 -0
- package/dist/tsup/test/mod.d.ts +26 -0
- package/dist/tsup/test/mod.js +90 -0
- package/dist/tsup/test/mod.js.map +1 -0
- package/dist/tsup/utils-fwx3o3K9.d.cts +18 -0
- package/dist/tsup/utils-fwx3o3K9.d.ts +18 -0
- package/dist/tsup/utils.cjs +43 -0
- package/dist/tsup/utils.cjs.map +1 -0
- package/dist/tsup/utils.d.cts +148 -0
- package/dist/tsup/utils.d.ts +148 -0
- package/dist/tsup/utils.js +43 -0
- package/dist/tsup/utils.js.map +1 -0
- package/dist/tsup/v3-DnYObHH3.d.cts +279 -0
- package/dist/tsup/v3-DnYObHH3.d.ts +279 -0
- package/dist/tsup/workflow/mod.cjs +16 -0
- package/dist/tsup/workflow/mod.cjs.map +1 -0
- package/dist/tsup/workflow/mod.d.cts +25 -0
- package/dist/tsup/workflow/mod.d.ts +25 -0
- package/dist/tsup/workflow/mod.js +16 -0
- package/dist/tsup/workflow/mod.js.map +1 -0
- package/package.json +293 -5
- package/src/actor/config.ts +1221 -0
- package/src/actor/conn/driver.ts +61 -0
- package/src/actor/conn/drivers/http.ts +17 -0
- package/src/actor/conn/drivers/raw-request.ts +24 -0
- package/src/actor/conn/drivers/raw-websocket.ts +65 -0
- package/src/actor/conn/drivers/websocket.ts +144 -0
- package/src/actor/conn/mod.ts +288 -0
- package/src/actor/conn/persisted.ts +81 -0
- package/src/actor/conn/state-manager.ts +196 -0
- package/src/actor/contexts/action.ts +47 -0
- package/src/actor/contexts/base/actor.ts +347 -0
- package/src/actor/contexts/base/conn-init.ts +68 -0
- package/src/actor/contexts/base/conn.ts +73 -0
- package/src/actor/contexts/before-action-response.ts +42 -0
- package/src/actor/contexts/before-connect.ts +31 -0
- package/src/actor/contexts/connect.ts +42 -0
- package/src/actor/contexts/create-conn-state.ts +32 -0
- package/src/actor/contexts/create-vars.ts +39 -0
- package/src/actor/contexts/create.ts +39 -0
- package/src/actor/contexts/destroy.ts +42 -0
- package/src/actor/contexts/disconnect.ts +43 -0
- package/src/actor/contexts/index.ts +33 -0
- package/src/actor/contexts/request.ts +80 -0
- package/src/actor/contexts/run.ts +47 -0
- package/src/actor/contexts/sleep.ts +42 -0
- package/src/actor/contexts/state-change.ts +42 -0
- package/src/actor/contexts/wake.ts +42 -0
- package/src/actor/contexts/websocket.ts +80 -0
- package/src/actor/database.ts +13 -0
- package/src/actor/definition.ts +64 -0
- package/src/actor/driver.ts +114 -0
- package/src/actor/errors.ts +556 -0
- package/src/actor/instance/connection-manager.ts +574 -0
- package/src/actor/instance/event-manager.ts +314 -0
- package/src/actor/instance/keys.ts +146 -0
- package/src/actor/instance/kv.ts +241 -0
- package/src/actor/instance/mod.ts +1658 -0
- package/src/actor/instance/persisted.ts +67 -0
- package/src/actor/instance/queue-manager.ts +603 -0
- package/src/actor/instance/queue.ts +345 -0
- package/src/actor/instance/schedule-manager.ts +392 -0
- package/src/actor/instance/state-manager.ts +542 -0
- package/src/actor/instance/traces-driver.ts +128 -0
- package/src/actor/keys.test.ts +275 -0
- package/src/actor/keys.ts +89 -0
- package/src/actor/log.ts +6 -0
- package/src/actor/mod.ts +110 -0
- package/src/actor/protocol/old.ts +416 -0
- package/src/actor/protocol/serde.ts +222 -0
- package/src/actor/router-endpoints.ts +400 -0
- package/src/actor/router-websocket-endpoints.test.ts +54 -0
- package/src/actor/router-websocket-endpoints.ts +405 -0
- package/src/actor/router.ts +380 -0
- package/src/actor/schedule.ts +17 -0
- package/src/actor/schema.ts +291 -0
- package/src/actor/utils.test.ts +48 -0
- package/src/actor/utils.ts +158 -0
- package/src/client/actor-common.ts +32 -0
- package/src/client/actor-conn.ts +1262 -0
- package/src/client/actor-handle.ts +344 -0
- package/src/client/actor-query.ts +112 -0
- package/src/client/client.ts +558 -0
- package/src/client/config.ts +151 -0
- package/src/client/errors.ts +76 -0
- package/src/client/log.ts +5 -0
- package/src/client/mod.browser.ts +2 -0
- package/src/client/mod.ts +70 -0
- package/src/client/queue.ts +146 -0
- package/src/client/raw-utils.ts +149 -0
- package/src/client/test.ts +44 -0
- package/src/client/utils.ts +252 -0
- package/src/common/actor-router-consts.ts +59 -0
- package/src/common/cors.ts +57 -0
- package/src/common/eventsource-interface.ts +47 -0
- package/src/common/eventsource.ts +44 -0
- package/src/common/inline-websocket-adapter.ts +154 -0
- package/src/common/log-levels.ts +27 -0
- package/src/common/log.ts +229 -0
- package/src/common/logfmt.ts +221 -0
- package/src/common/network.ts +2 -0
- package/src/common/router.ts +174 -0
- package/src/common/utils.ts +339 -0
- package/src/common/websocket-interface.ts +7 -0
- package/src/common/websocket.ts +43 -0
- package/src/db/config.ts +100 -0
- package/src/db/drizzle/mod.ts +226 -0
- package/src/db/drizzle/sqlite-core.ts +22 -0
- package/src/db/mod.ts +125 -0
- package/src/db/shared.ts +92 -0
- package/src/db/sqlite-vfs.ts +12 -0
- package/src/devtools-loader/index.ts +33 -0
- package/src/devtools-loader/log.ts +5 -0
- package/src/driver-helpers/mod.ts +33 -0
- package/src/driver-helpers/utils.ts +54 -0
- package/src/driver-test-suite/log.ts +5 -0
- package/src/driver-test-suite/mod.ts +293 -0
- package/src/driver-test-suite/test-inline-client-driver.ts +307 -0
- package/src/driver-test-suite/tests/access-control.ts +218 -0
- package/src/driver-test-suite/tests/action-features.ts +203 -0
- package/src/driver-test-suite/tests/actor-conn-hibernation.ts +152 -0
- package/src/driver-test-suite/tests/actor-conn-state.ts +300 -0
- package/src/driver-test-suite/tests/actor-conn.ts +596 -0
- package/src/driver-test-suite/tests/actor-db-raw.ts +73 -0
- package/src/driver-test-suite/tests/actor-db.ts +477 -0
- package/src/driver-test-suite/tests/actor-destroy.ts +294 -0
- package/src/driver-test-suite/tests/actor-driver.ts +18 -0
- package/src/driver-test-suite/tests/actor-error-handling.ts +150 -0
- package/src/driver-test-suite/tests/actor-handle.ts +312 -0
- package/src/driver-test-suite/tests/actor-inline-client.ts +163 -0
- package/src/driver-test-suite/tests/actor-inspector.ts +264 -0
- package/src/driver-test-suite/tests/actor-kv.ts +65 -0
- package/src/driver-test-suite/tests/actor-metadata.ts +116 -0
- package/src/driver-test-suite/tests/actor-onstatechange.ts +95 -0
- package/src/driver-test-suite/tests/actor-queue.ts +325 -0
- package/src/driver-test-suite/tests/actor-run.ts +181 -0
- package/src/driver-test-suite/tests/actor-schedule.ts +97 -0
- package/src/driver-test-suite/tests/actor-sleep.ts +415 -0
- package/src/driver-test-suite/tests/actor-state.ts +54 -0
- package/src/driver-test-suite/tests/actor-stateless.ts +70 -0
- package/src/driver-test-suite/tests/actor-vars.ts +97 -0
- package/src/driver-test-suite/tests/actor-workflow.ts +118 -0
- package/src/driver-test-suite/tests/manager-driver.ts +388 -0
- package/src/driver-test-suite/tests/raw-http-direct-registry.ts +227 -0
- package/src/driver-test-suite/tests/raw-http-request-properties.ts +454 -0
- package/src/driver-test-suite/tests/raw-http.ts +359 -0
- package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +393 -0
- package/src/driver-test-suite/tests/raw-websocket.ts +513 -0
- package/src/driver-test-suite/tests/request-access.ts +240 -0
- package/src/driver-test-suite/utils.ts +80 -0
- package/src/drivers/default.ts +38 -0
- package/src/drivers/engine/actor-driver.ts +1027 -0
- package/src/drivers/engine/config.ts +43 -0
- package/src/drivers/engine/log.ts +5 -0
- package/src/drivers/engine/mod.ts +36 -0
- package/src/drivers/file-system/actor.ts +102 -0
- package/src/drivers/file-system/global-state.ts +1445 -0
- package/src/drivers/file-system/kv-limits.ts +70 -0
- package/src/drivers/file-system/log.ts +5 -0
- package/src/drivers/file-system/manager.ts +300 -0
- package/src/drivers/file-system/mod.ts +78 -0
- package/src/drivers/file-system/sqlite-runtime.ts +210 -0
- package/src/drivers/file-system/utils.ts +125 -0
- package/src/engine-process/constants.ts +2 -0
- package/src/engine-process/log.ts +5 -0
- package/src/engine-process/mod.ts +464 -0
- package/src/globals.d.ts +35 -0
- package/src/inspector/actor-inspector.ts +352 -0
- package/src/inspector/config.ts +49 -0
- package/src/inspector/handler.ts +273 -0
- package/src/inspector/log.ts +5 -0
- package/src/inspector/mod.browser.ts +8 -0
- package/src/inspector/mod.ts +4 -0
- package/src/inspector/serve-ui.ts +40 -0
- package/src/inspector/transport.ts +18 -0
- package/src/inspector/utils.ts +32 -0
- package/src/manager/driver.ts +106 -0
- package/src/manager/gateway.ts +668 -0
- package/src/manager/log.ts +5 -0
- package/src/manager/mod.ts +2 -0
- package/src/manager/protocol/mod.ts +22 -0
- package/src/manager/protocol/query.ts +85 -0
- package/src/manager/router-schema.ts +22 -0
- package/src/manager/router.ts +660 -0
- package/src/manager-api/actors.ts +83 -0
- package/src/manager-api/common.ts +4 -0
- package/src/mod.ts +24 -0
- package/src/registry/config/driver.ts +21 -0
- package/src/registry/config/index.ts +510 -0
- package/src/registry/config/legacy-runner.ts +157 -0
- package/src/registry/config/runner.ts +21 -0
- package/src/registry/config/serverless.ts +94 -0
- package/src/registry/index.ts +194 -0
- package/src/registry/log.ts +5 -0
- package/src/remote-manager-driver/actor-http-client.ts +84 -0
- package/src/remote-manager-driver/actor-websocket-client.ts +81 -0
- package/src/remote-manager-driver/api-endpoints.ts +159 -0
- package/src/remote-manager-driver/api-utils.ts +69 -0
- package/src/remote-manager-driver/log.ts +5 -0
- package/src/remote-manager-driver/metadata.ts +64 -0
- package/src/remote-manager-driver/mod.ts +414 -0
- package/src/remote-manager-driver/ws-proxy.ts +189 -0
- package/src/schemas/actor-inspector/mod.ts +1 -0
- package/src/schemas/actor-inspector/versioned.ts +233 -0
- package/src/schemas/actor-persist/mod.ts +1 -0
- package/src/schemas/actor-persist/versioned.ts +217 -0
- package/src/schemas/client-protocol/mod.ts +1 -0
- package/src/schemas/client-protocol/versioned.ts +330 -0
- package/src/schemas/client-protocol-zod/mod.ts +118 -0
- package/src/schemas/file-system-driver/mod.ts +1 -0
- package/src/schemas/file-system-driver/versioned.ts +135 -0
- package/src/schemas/persist/mod.ts +1 -0
- package/src/schemas/transport/mod.ts +1 -0
- package/src/serde.ts +138 -0
- package/src/serve-test-suite/mod.ts +148 -0
- package/src/serverless/configure.ts +82 -0
- package/src/serverless/log.ts +5 -0
- package/src/serverless/router.test.ts +299 -0
- package/src/serverless/router.ts +215 -0
- package/src/test/log.ts +5 -0
- package/src/test/mod.ts +99 -0
- package/src/utils/crypto.ts +24 -0
- package/src/utils/endpoint-parser.test.ts +202 -0
- package/src/utils/endpoint-parser.ts +124 -0
- package/src/utils/env-vars.ts +78 -0
- package/src/utils/node.ts +178 -0
- package/src/utils/router.ts +83 -0
- package/src/utils/serve.ts +212 -0
- package/src/utils.test.ts +34 -0
- package/src/utils.ts +437 -0
- package/src/workflow/constants.ts +2 -0
- package/src/workflow/context.ts +597 -0
- package/src/workflow/driver.ts +194 -0
- package/src/workflow/inspector.ts +268 -0
- package/src/workflow/mod.ts +128 -0
|
@@ -0,0 +1,668 @@
|
|
|
1
|
+
import type { Context as HonoContext, Next } from "hono";
|
|
2
|
+
import type { WSContext } from "hono/ws";
|
|
3
|
+
import invariant from "invariant";
|
|
4
|
+
import { MissingActorHeader, WebSocketsNotEnabled } from "@/actor/errors";
|
|
5
|
+
import {
|
|
6
|
+
parseWebSocketProtocols,
|
|
7
|
+
type UpgradeWebSocketArgs,
|
|
8
|
+
} from "@/actor/router-websocket-endpoints";
|
|
9
|
+
import {
|
|
10
|
+
HEADER_RIVET_ACTOR,
|
|
11
|
+
HEADER_RIVET_TARGET,
|
|
12
|
+
WS_PROTOCOL_ACTOR,
|
|
13
|
+
WS_PROTOCOL_CONN_PARAMS,
|
|
14
|
+
WS_PROTOCOL_ENCODING,
|
|
15
|
+
WS_PROTOCOL_TARGET,
|
|
16
|
+
} from "@/common/actor-router-consts";
|
|
17
|
+
import type { UniversalWebSocket } from "@/mod";
|
|
18
|
+
import type { RegistryConfig } from "@/registry/config";
|
|
19
|
+
import { type GetUpgradeWebSocket, promiseWithResolvers } from "@/utils";
|
|
20
|
+
import type { ManagerDriver } from "./driver";
|
|
21
|
+
import { logger } from "./log";
|
|
22
|
+
|
|
23
|
+
interface ActorPathInfo {
|
|
24
|
+
actorId: string;
|
|
25
|
+
token?: string;
|
|
26
|
+
remainingPath: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Handle path-based WebSocket routing
|
|
31
|
+
*/
|
|
32
|
+
async function handleWebSocketGatewayPathBased(
|
|
33
|
+
config: RegistryConfig,
|
|
34
|
+
managerDriver: ManagerDriver,
|
|
35
|
+
c: HonoContext,
|
|
36
|
+
actorPathInfo: ActorPathInfo,
|
|
37
|
+
getUpgradeWebSocket: GetUpgradeWebSocket | undefined,
|
|
38
|
+
): Promise<Response> {
|
|
39
|
+
const upgradeWebSocket = getUpgradeWebSocket?.();
|
|
40
|
+
if (!upgradeWebSocket) {
|
|
41
|
+
throw new WebSocketsNotEnabled();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// NOTE: Token validation implemented in EE
|
|
45
|
+
|
|
46
|
+
// Parse additional configuration from Sec-WebSocket-Protocol header
|
|
47
|
+
const { encoding, connParams } = parseWebSocketProtocols(
|
|
48
|
+
c.req.header("sec-websocket-protocol"),
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
logger().debug({
|
|
52
|
+
msg: "proxying websocket to actor via path-based routing",
|
|
53
|
+
actorId: actorPathInfo.actorId,
|
|
54
|
+
path: actorPathInfo.remainingPath,
|
|
55
|
+
encoding,
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
return await managerDriver.proxyWebSocket(
|
|
59
|
+
c,
|
|
60
|
+
actorPathInfo.remainingPath,
|
|
61
|
+
actorPathInfo.actorId,
|
|
62
|
+
encoding as any, // Will be validated by driver
|
|
63
|
+
connParams,
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Handle path-based HTTP routing
|
|
69
|
+
*/
|
|
70
|
+
async function handleHttpGatewayPathBased(
|
|
71
|
+
managerDriver: ManagerDriver,
|
|
72
|
+
c: HonoContext,
|
|
73
|
+
actorPathInfo: ActorPathInfo,
|
|
74
|
+
): Promise<Response> {
|
|
75
|
+
// NOTE: Token validation implemented in EE
|
|
76
|
+
|
|
77
|
+
logger().debug({
|
|
78
|
+
msg: "proxying request to actor via path-based routing",
|
|
79
|
+
actorId: actorPathInfo.actorId,
|
|
80
|
+
path: actorPathInfo.remainingPath,
|
|
81
|
+
method: c.req.method,
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
// Preserve all headers
|
|
85
|
+
const proxyHeaders = new Headers(c.req.raw.headers);
|
|
86
|
+
|
|
87
|
+
// Build the proxy request with the actor URL format
|
|
88
|
+
const proxyUrl = new URL(`http://actor${actorPathInfo.remainingPath}`);
|
|
89
|
+
|
|
90
|
+
const proxyRequest = new Request(proxyUrl, {
|
|
91
|
+
method: c.req.raw.method,
|
|
92
|
+
headers: proxyHeaders,
|
|
93
|
+
body: c.req.raw.body,
|
|
94
|
+
signal: c.req.raw.signal,
|
|
95
|
+
duplex: "half",
|
|
96
|
+
} as RequestInit);
|
|
97
|
+
|
|
98
|
+
return await managerDriver.proxyRequest(
|
|
99
|
+
c,
|
|
100
|
+
proxyRequest,
|
|
101
|
+
actorPathInfo.actorId,
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Provides an endpoint to connect to individual actors.
|
|
107
|
+
*
|
|
108
|
+
* Routes requests using either path-based routing or header-based routing:
|
|
109
|
+
*
|
|
110
|
+
* Path-based routing (checked first):
|
|
111
|
+
* - /gateway/{actor_id}/{...path}
|
|
112
|
+
* - /gateway/{actor_id}@{token}/{...path}
|
|
113
|
+
*
|
|
114
|
+
* Header-based routing (fallback):
|
|
115
|
+
* - WebSocket requests: Uses sec-websocket-protocol for routing (target.actor, actor.{id})
|
|
116
|
+
* - HTTP requests: Uses x-rivet-target and x-rivet-actor headers for routing
|
|
117
|
+
*/
|
|
118
|
+
export async function actorGateway(
|
|
119
|
+
config: RegistryConfig,
|
|
120
|
+
managerDriver: ManagerDriver,
|
|
121
|
+
getUpgradeWebSocket: GetUpgradeWebSocket | undefined,
|
|
122
|
+
c: HonoContext,
|
|
123
|
+
next: Next,
|
|
124
|
+
) {
|
|
125
|
+
|
|
126
|
+
// Skip test routes - let them be handled by their specific handlers
|
|
127
|
+
if (c.req.path.startsWith("/.test/")) {
|
|
128
|
+
return next();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Strip basePath from the request path
|
|
132
|
+
let strippedPath = c.req.path;
|
|
133
|
+
if (
|
|
134
|
+
config.managerBasePath &&
|
|
135
|
+
strippedPath.startsWith(config.managerBasePath)
|
|
136
|
+
) {
|
|
137
|
+
strippedPath = strippedPath.slice(config.managerBasePath.length);
|
|
138
|
+
// Ensure the path starts with /
|
|
139
|
+
if (!strippedPath.startsWith("/")) {
|
|
140
|
+
strippedPath = "/" + strippedPath;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Include query string if present (needed for parseActorPath to preserve query params)
|
|
145
|
+
const pathWithQuery = c.req.url.includes("?")
|
|
146
|
+
? strippedPath + c.req.url.substring(c.req.url.indexOf("?"))
|
|
147
|
+
: strippedPath;
|
|
148
|
+
|
|
149
|
+
// First, check if this is an actor path-based route
|
|
150
|
+
const actorPathInfo = parseActorPath(pathWithQuery);
|
|
151
|
+
if (actorPathInfo) {
|
|
152
|
+
logger().debug({
|
|
153
|
+
msg: "routing using path-based actor routing",
|
|
154
|
+
actorPathInfo,
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
// Check if this is a WebSocket upgrade request
|
|
158
|
+
const isWebSocket = c.req.header("upgrade") === "websocket";
|
|
159
|
+
|
|
160
|
+
if (isWebSocket) {
|
|
161
|
+
return await handleWebSocketGatewayPathBased(
|
|
162
|
+
config,
|
|
163
|
+
managerDriver,
|
|
164
|
+
c,
|
|
165
|
+
actorPathInfo,
|
|
166
|
+
getUpgradeWebSocket,
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Handle regular HTTP requests
|
|
171
|
+
return await handleHttpGatewayPathBased(
|
|
172
|
+
managerDriver,
|
|
173
|
+
c,
|
|
174
|
+
actorPathInfo,
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Fallback to header-based routing
|
|
179
|
+
// Check if this is a WebSocket upgrade request
|
|
180
|
+
if (c.req.header("upgrade") === "websocket") {
|
|
181
|
+
return await handleWebSocketGateway(
|
|
182
|
+
config,
|
|
183
|
+
managerDriver,
|
|
184
|
+
getUpgradeWebSocket,
|
|
185
|
+
c,
|
|
186
|
+
strippedPath,
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Handle regular HTTP requests
|
|
191
|
+
return await handleHttpGateway(managerDriver, c, next, strippedPath);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Handle WebSocket requests using sec-websocket-protocol for routing
|
|
196
|
+
*/
|
|
197
|
+
async function handleWebSocketGateway(
|
|
198
|
+
config: RegistryConfig,
|
|
199
|
+
managerDriver: ManagerDriver,
|
|
200
|
+
getUpgradeWebSocket: GetUpgradeWebSocket | undefined,
|
|
201
|
+
c: HonoContext,
|
|
202
|
+
strippedPath: string,
|
|
203
|
+
) {
|
|
204
|
+
const upgradeWebSocket = getUpgradeWebSocket?.();
|
|
205
|
+
if (!upgradeWebSocket) {
|
|
206
|
+
throw new WebSocketsNotEnabled();
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
let target: string | undefined;
|
|
210
|
+
let actorId: string | undefined;
|
|
211
|
+
|
|
212
|
+
// Parse configuration from Sec-WebSocket-Protocol header
|
|
213
|
+
const { encoding, connParams } = parseWebSocketProtocols(
|
|
214
|
+
c.req.header("sec-websocket-protocol"),
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
if (target !== "actor") {
|
|
218
|
+
return c.text("WebSocket upgrade requires target.actor protocol", 400);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (!actorId) {
|
|
222
|
+
throw new MissingActorHeader();
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
logger().debug({
|
|
226
|
+
msg: "proxying websocket to actor",
|
|
227
|
+
actorId,
|
|
228
|
+
path: strippedPath,
|
|
229
|
+
encoding,
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
// Include query string if present
|
|
233
|
+
const pathWithQuery = c.req.url.includes("?")
|
|
234
|
+
? strippedPath + c.req.url.substring(c.req.url.indexOf("?"))
|
|
235
|
+
: strippedPath;
|
|
236
|
+
|
|
237
|
+
return await managerDriver.proxyWebSocket(
|
|
238
|
+
c,
|
|
239
|
+
pathWithQuery,
|
|
240
|
+
actorId,
|
|
241
|
+
encoding,
|
|
242
|
+
connParams,
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Handle HTTP requests using x-rivet headers for routing
|
|
248
|
+
*/
|
|
249
|
+
async function handleHttpGateway(
|
|
250
|
+
managerDriver: ManagerDriver,
|
|
251
|
+
c: HonoContext,
|
|
252
|
+
next: Next,
|
|
253
|
+
strippedPath: string,
|
|
254
|
+
) {
|
|
255
|
+
const target = c.req.header(HEADER_RIVET_TARGET);
|
|
256
|
+
const actorId = c.req.header(HEADER_RIVET_ACTOR);
|
|
257
|
+
|
|
258
|
+
if (target !== "actor") {
|
|
259
|
+
return next();
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
if (!actorId) {
|
|
263
|
+
throw new MissingActorHeader();
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
logger().debug({
|
|
267
|
+
msg: "proxying request to actor",
|
|
268
|
+
actorId,
|
|
269
|
+
path: strippedPath,
|
|
270
|
+
method: c.req.method,
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
// Preserve all headers except the routing headers
|
|
274
|
+
const proxyHeaders = new Headers(c.req.raw.headers);
|
|
275
|
+
proxyHeaders.delete(HEADER_RIVET_TARGET);
|
|
276
|
+
proxyHeaders.delete(HEADER_RIVET_ACTOR);
|
|
277
|
+
|
|
278
|
+
// Build the proxy request with the actor URL format
|
|
279
|
+
const url = new URL(c.req.url);
|
|
280
|
+
const proxyUrl = new URL(`http://actor${strippedPath}${url.search}`);
|
|
281
|
+
|
|
282
|
+
const proxyRequest = new Request(proxyUrl, {
|
|
283
|
+
method: c.req.raw.method,
|
|
284
|
+
headers: proxyHeaders,
|
|
285
|
+
body: c.req.raw.body,
|
|
286
|
+
signal: c.req.raw.signal,
|
|
287
|
+
duplex: "half",
|
|
288
|
+
} as RequestInit);
|
|
289
|
+
|
|
290
|
+
return await managerDriver.proxyRequest(c, proxyRequest, actorId);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Parse actor routing information from path
|
|
295
|
+
* Matches patterns:
|
|
296
|
+
* - /gateway/{actor_id}/{...path}
|
|
297
|
+
* - /gateway/{actor_id}@{token}/{...path}
|
|
298
|
+
*/
|
|
299
|
+
export function parseActorPath(path: string): ActorPathInfo | null {
|
|
300
|
+
// Find query string position (everything from ? onwards, but before fragment)
|
|
301
|
+
const queryPos = path.indexOf("?");
|
|
302
|
+
const fragmentPos = path.indexOf("#");
|
|
303
|
+
|
|
304
|
+
// Extract query string (excluding fragment)
|
|
305
|
+
let queryString = "";
|
|
306
|
+
if (queryPos !== -1) {
|
|
307
|
+
if (fragmentPos !== -1 && queryPos < fragmentPos) {
|
|
308
|
+
queryString = path.slice(queryPos, fragmentPos);
|
|
309
|
+
} else {
|
|
310
|
+
queryString = path.slice(queryPos);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Extract base path (before query and fragment)
|
|
315
|
+
let basePath = path;
|
|
316
|
+
if (queryPos !== -1) {
|
|
317
|
+
basePath = path.slice(0, queryPos);
|
|
318
|
+
} else if (fragmentPos !== -1) {
|
|
319
|
+
basePath = path.slice(0, fragmentPos);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// Check for double slashes (invalid path)
|
|
323
|
+
if (basePath.includes("//")) {
|
|
324
|
+
return null;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// Split the path into segments
|
|
328
|
+
const segments = basePath.split("/").filter((s) => s.length > 0);
|
|
329
|
+
|
|
330
|
+
// Check minimum required segments: gateway, {actor_id}
|
|
331
|
+
if (segments.length < 2) {
|
|
332
|
+
return null;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// Verify the first segment is "gateway"
|
|
336
|
+
if (segments[0] !== "gateway") {
|
|
337
|
+
return null;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// Extract actor_id segment (may contain @token)
|
|
341
|
+
const actorSegment = segments[1];
|
|
342
|
+
|
|
343
|
+
// Check for empty actor segment
|
|
344
|
+
if (actorSegment.length === 0) {
|
|
345
|
+
return null;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// Parse actor_id and optional token from the segment
|
|
349
|
+
let actorId: string;
|
|
350
|
+
let token: string | undefined;
|
|
351
|
+
|
|
352
|
+
const atPos = actorSegment.indexOf("@");
|
|
353
|
+
if (atPos !== -1) {
|
|
354
|
+
// Pattern: /gateway/{actor_id}@{token}/{...path}
|
|
355
|
+
const rawActorId = actorSegment.slice(0, atPos);
|
|
356
|
+
const rawToken = actorSegment.slice(atPos + 1);
|
|
357
|
+
|
|
358
|
+
// Check for empty actor_id or token
|
|
359
|
+
if (rawActorId.length === 0 || rawToken.length === 0) {
|
|
360
|
+
return null;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// URL-decode both actor_id and token
|
|
364
|
+
try {
|
|
365
|
+
actorId = decodeURIComponent(rawActorId);
|
|
366
|
+
token = decodeURIComponent(rawToken);
|
|
367
|
+
} catch (e) {
|
|
368
|
+
// Invalid URL encoding
|
|
369
|
+
return null;
|
|
370
|
+
}
|
|
371
|
+
} else {
|
|
372
|
+
// Pattern: /gateway/{actor_id}/{...path}
|
|
373
|
+
// URL-decode actor_id
|
|
374
|
+
try {
|
|
375
|
+
actorId = decodeURIComponent(actorSegment);
|
|
376
|
+
} catch (e) {
|
|
377
|
+
// Invalid URL encoding
|
|
378
|
+
return null;
|
|
379
|
+
}
|
|
380
|
+
token = undefined;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// Calculate remaining path
|
|
384
|
+
// The remaining path starts after /gateway/{actor_id[@token]}/
|
|
385
|
+
let prefixLen = 0;
|
|
386
|
+
for (let i = 0; i < 2; i++) {
|
|
387
|
+
prefixLen += 1 + segments[i].length; // +1 for the slash
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// Extract the remaining path preserving trailing slashes
|
|
391
|
+
let remainingBase: string;
|
|
392
|
+
if (prefixLen < basePath.length) {
|
|
393
|
+
remainingBase = basePath.slice(prefixLen);
|
|
394
|
+
} else {
|
|
395
|
+
remainingBase = "/";
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// Ensure remaining path starts with /
|
|
399
|
+
let remainingPath: string;
|
|
400
|
+
if (remainingBase.length === 0 || !remainingBase.startsWith("/")) {
|
|
401
|
+
remainingPath = `/${remainingBase}${queryString}`;
|
|
402
|
+
} else {
|
|
403
|
+
remainingPath = `${remainingBase}${queryString}`;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
return {
|
|
407
|
+
actorId,
|
|
408
|
+
token,
|
|
409
|
+
remainingPath,
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* Creates a WebSocket proxy for test endpoints that forwards messages between server and client WebSockets
|
|
415
|
+
*
|
|
416
|
+
* clientToProxyWs = the websocket from the client -> the proxy
|
|
417
|
+
* proxyToActorWs = the websocket from the proxy -> the actor
|
|
418
|
+
*/
|
|
419
|
+
export async function createTestWebSocketProxy(
|
|
420
|
+
proxyToActorWsPromise: Promise<UniversalWebSocket>,
|
|
421
|
+
): Promise<UpgradeWebSocketArgs> {
|
|
422
|
+
// Store a reference to the resolved WebSocket
|
|
423
|
+
let proxyToActorWs: UniversalWebSocket | null = null;
|
|
424
|
+
const {
|
|
425
|
+
promise: clientToProxyWsPromise,
|
|
426
|
+
resolve: clientToProxyWsResolve,
|
|
427
|
+
reject: clientToProxyWsReject,
|
|
428
|
+
} = promiseWithResolvers<WSContext>((reason) => logger().warn({ msg: "unhandled client websocket promise rejection", reason }));
|
|
429
|
+
try {
|
|
430
|
+
// Resolve the client WebSocket promise
|
|
431
|
+
logger().debug({ msg: "awaiting client websocket promise" });
|
|
432
|
+
proxyToActorWs = await proxyToActorWsPromise;
|
|
433
|
+
logger().debug({
|
|
434
|
+
msg: "client websocket promise resolved",
|
|
435
|
+
constructor: proxyToActorWs?.constructor.name,
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
// Wait for ws to open
|
|
439
|
+
await new Promise<void>((resolve, reject) => {
|
|
440
|
+
invariant(proxyToActorWs, "missing proxyToActorWs");
|
|
441
|
+
|
|
442
|
+
const onOpen = () => {
|
|
443
|
+
logger().debug({
|
|
444
|
+
msg: "test websocket connection to actor opened",
|
|
445
|
+
});
|
|
446
|
+
resolve();
|
|
447
|
+
};
|
|
448
|
+
const onError = (error: any) => {
|
|
449
|
+
logger().error({
|
|
450
|
+
msg: "test websocket connection failed",
|
|
451
|
+
error,
|
|
452
|
+
});
|
|
453
|
+
reject(
|
|
454
|
+
new Error(
|
|
455
|
+
`Failed to open WebSocket: ${error.message || error}`,
|
|
456
|
+
),
|
|
457
|
+
);
|
|
458
|
+
clientToProxyWsReject();
|
|
459
|
+
};
|
|
460
|
+
|
|
461
|
+
proxyToActorWs.addEventListener("open", onOpen);
|
|
462
|
+
|
|
463
|
+
proxyToActorWs.addEventListener("error", onError);
|
|
464
|
+
|
|
465
|
+
proxyToActorWs.addEventListener(
|
|
466
|
+
"message",
|
|
467
|
+
async (clientEvt: MessageEvent) => {
|
|
468
|
+
const clientToProxyWs = await clientToProxyWsPromise;
|
|
469
|
+
|
|
470
|
+
logger().debug({
|
|
471
|
+
msg: `test websocket connection message from client`,
|
|
472
|
+
dataType: typeof clientEvt.data,
|
|
473
|
+
isBlob: clientEvt.data instanceof Blob,
|
|
474
|
+
isArrayBuffer: clientEvt.data instanceof ArrayBuffer,
|
|
475
|
+
dataConstructor: clientEvt.data?.constructor?.name,
|
|
476
|
+
dataStr:
|
|
477
|
+
typeof clientEvt.data === "string"
|
|
478
|
+
? clientEvt.data.substring(0, 100)
|
|
479
|
+
: undefined,
|
|
480
|
+
});
|
|
481
|
+
|
|
482
|
+
if (clientToProxyWs.readyState === 1) {
|
|
483
|
+
// OPEN
|
|
484
|
+
// Handle Blob data
|
|
485
|
+
if (clientEvt.data instanceof Blob) {
|
|
486
|
+
clientEvt.data
|
|
487
|
+
.arrayBuffer()
|
|
488
|
+
.then((buffer) => {
|
|
489
|
+
logger().debug({
|
|
490
|
+
msg: "converted client blob to arraybuffer, sending to server",
|
|
491
|
+
bufferSize: buffer.byteLength,
|
|
492
|
+
});
|
|
493
|
+
clientToProxyWs.send(buffer as any);
|
|
494
|
+
})
|
|
495
|
+
.catch((error) => {
|
|
496
|
+
logger().error({
|
|
497
|
+
msg: "failed to convert blob to arraybuffer",
|
|
498
|
+
error,
|
|
499
|
+
});
|
|
500
|
+
});
|
|
501
|
+
} else {
|
|
502
|
+
logger().debug({
|
|
503
|
+
msg: "sending client data directly to server",
|
|
504
|
+
dataType: typeof clientEvt.data,
|
|
505
|
+
dataLength:
|
|
506
|
+
typeof clientEvt.data === "string"
|
|
507
|
+
? clientEvt.data.length
|
|
508
|
+
: undefined,
|
|
509
|
+
});
|
|
510
|
+
clientToProxyWs.send(clientEvt.data as any);
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
},
|
|
514
|
+
);
|
|
515
|
+
|
|
516
|
+
proxyToActorWs.addEventListener("close", async (clientEvt: any) => {
|
|
517
|
+
const clientToProxyWs = await clientToProxyWsPromise;
|
|
518
|
+
|
|
519
|
+
logger().debug({
|
|
520
|
+
msg: `test websocket connection closed`,
|
|
521
|
+
});
|
|
522
|
+
|
|
523
|
+
if (clientToProxyWs.readyState !== 3) {
|
|
524
|
+
// Not CLOSED
|
|
525
|
+
clientToProxyWs.close(clientEvt.code, clientEvt.reason);
|
|
526
|
+
}
|
|
527
|
+
});
|
|
528
|
+
|
|
529
|
+
proxyToActorWs.addEventListener("error", async () => {
|
|
530
|
+
const clientToProxyWs = await clientToProxyWsPromise;
|
|
531
|
+
|
|
532
|
+
logger().debug({
|
|
533
|
+
msg: `test websocket connection error`,
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
if (clientToProxyWs.readyState !== 3) {
|
|
537
|
+
// Not CLOSED
|
|
538
|
+
clientToProxyWs.close(1011, "Error in client websocket");
|
|
539
|
+
}
|
|
540
|
+
});
|
|
541
|
+
});
|
|
542
|
+
} catch (error) {
|
|
543
|
+
logger().error({
|
|
544
|
+
msg: `failed to establish client websocket connection`,
|
|
545
|
+
error,
|
|
546
|
+
});
|
|
547
|
+
return {
|
|
548
|
+
onOpen: (_evt, clientToProxyWs) => {
|
|
549
|
+
clientToProxyWs.close(1011, "Failed to establish connection");
|
|
550
|
+
},
|
|
551
|
+
onMessage: () => {},
|
|
552
|
+
onError: () => {},
|
|
553
|
+
onClose: () => {},
|
|
554
|
+
};
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
// Create WebSocket proxy handlers to relay messages between client and server
|
|
558
|
+
return {
|
|
559
|
+
onOpen: (_evt: any, clientToProxyWs: WSContext) => {
|
|
560
|
+
logger().debug({
|
|
561
|
+
msg: `test websocket connection from client opened`,
|
|
562
|
+
});
|
|
563
|
+
|
|
564
|
+
// Check WebSocket type
|
|
565
|
+
logger().debug({
|
|
566
|
+
msg: "proxyToActorWs info",
|
|
567
|
+
constructor: proxyToActorWs.constructor.name,
|
|
568
|
+
hasAddEventListener:
|
|
569
|
+
typeof proxyToActorWs.addEventListener === "function",
|
|
570
|
+
readyState: proxyToActorWs.readyState,
|
|
571
|
+
});
|
|
572
|
+
|
|
573
|
+
clientToProxyWsResolve(clientToProxyWs);
|
|
574
|
+
},
|
|
575
|
+
onMessage: (evt: { data: any }) => {
|
|
576
|
+
logger().debug({
|
|
577
|
+
msg: "received message from server",
|
|
578
|
+
dataType: typeof evt.data,
|
|
579
|
+
isBlob: evt.data instanceof Blob,
|
|
580
|
+
isArrayBuffer: evt.data instanceof ArrayBuffer,
|
|
581
|
+
dataConstructor: evt.data?.constructor?.name,
|
|
582
|
+
dataStr:
|
|
583
|
+
typeof evt.data === "string"
|
|
584
|
+
? evt.data.substring(0, 100)
|
|
585
|
+
: undefined,
|
|
586
|
+
});
|
|
587
|
+
|
|
588
|
+
// Forward messages from server websocket to client websocket
|
|
589
|
+
if (proxyToActorWs.readyState === 1) {
|
|
590
|
+
// OPEN
|
|
591
|
+
// Handle Blob data
|
|
592
|
+
if (evt.data instanceof Blob) {
|
|
593
|
+
evt.data
|
|
594
|
+
.arrayBuffer()
|
|
595
|
+
.then((buffer) => {
|
|
596
|
+
logger().debug({
|
|
597
|
+
msg: "converted blob to arraybuffer, sending",
|
|
598
|
+
bufferSize: buffer.byteLength,
|
|
599
|
+
});
|
|
600
|
+
proxyToActorWs.send(buffer);
|
|
601
|
+
})
|
|
602
|
+
.catch((error) => {
|
|
603
|
+
logger().error({
|
|
604
|
+
msg: "failed to convert blob to arraybuffer",
|
|
605
|
+
error,
|
|
606
|
+
});
|
|
607
|
+
});
|
|
608
|
+
} else {
|
|
609
|
+
logger().debug({
|
|
610
|
+
msg: "sending data directly",
|
|
611
|
+
dataType: typeof evt.data,
|
|
612
|
+
dataLength:
|
|
613
|
+
typeof evt.data === "string"
|
|
614
|
+
? evt.data.length
|
|
615
|
+
: undefined,
|
|
616
|
+
});
|
|
617
|
+
proxyToActorWs.send(evt.data);
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
},
|
|
621
|
+
onClose: (
|
|
622
|
+
event: {
|
|
623
|
+
wasClean: boolean;
|
|
624
|
+
code: number;
|
|
625
|
+
reason: string;
|
|
626
|
+
},
|
|
627
|
+
clientToProxyWs: WSContext,
|
|
628
|
+
) => {
|
|
629
|
+
logger().debug({
|
|
630
|
+
msg: `server websocket closed`,
|
|
631
|
+
wasClean: event.wasClean,
|
|
632
|
+
code: event.code,
|
|
633
|
+
reason: event.reason,
|
|
634
|
+
});
|
|
635
|
+
|
|
636
|
+
// HACK: Close socket in order to fix bug with Cloudflare leaving WS in closing state
|
|
637
|
+
// https://github.com/cloudflare/workerd/issues/2569
|
|
638
|
+
clientToProxyWs.close(1000, "hack_force_close");
|
|
639
|
+
|
|
640
|
+
// Close the client websocket when the server websocket closes
|
|
641
|
+
if (
|
|
642
|
+
proxyToActorWs &&
|
|
643
|
+
proxyToActorWs.readyState !== proxyToActorWs.CLOSED &&
|
|
644
|
+
proxyToActorWs.readyState !== proxyToActorWs.CLOSING
|
|
645
|
+
) {
|
|
646
|
+
// Don't pass code/message since this may affect how close events are triggered
|
|
647
|
+
proxyToActorWs.close(1000, event.reason);
|
|
648
|
+
}
|
|
649
|
+
},
|
|
650
|
+
onError: (error: unknown) => {
|
|
651
|
+
logger().error({
|
|
652
|
+
msg: `error in server websocket`,
|
|
653
|
+
error,
|
|
654
|
+
});
|
|
655
|
+
|
|
656
|
+
// Close the client websocket on error
|
|
657
|
+
if (
|
|
658
|
+
proxyToActorWs &&
|
|
659
|
+
proxyToActorWs.readyState !== proxyToActorWs.CLOSED &&
|
|
660
|
+
proxyToActorWs.readyState !== proxyToActorWs.CLOSING
|
|
661
|
+
) {
|
|
662
|
+
proxyToActorWs.close(1011, "Error in server websocket");
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
clientToProxyWsReject();
|
|
666
|
+
},
|
|
667
|
+
};
|
|
668
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from "zod/v4";
|
|
2
|
+
import { ActorQuerySchema } from "./query";
|
|
3
|
+
|
|
4
|
+
export * from "./query";
|
|
5
|
+
|
|
6
|
+
export const ActorsRequestSchema = z.object({
|
|
7
|
+
query: ActorQuerySchema,
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
export const ActorsResponseSchema = z.object({
|
|
11
|
+
actorId: z.string(),
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
//export const RivetConfigResponseSchema = z.object({
|
|
15
|
+
// endpoint: z.string(),
|
|
16
|
+
// project: z.string().optional(),
|
|
17
|
+
// environment: z.string().optional(),
|
|
18
|
+
//});
|
|
19
|
+
|
|
20
|
+
export type ActorsRequest = z.infer<typeof ActorsRequestSchema>;
|
|
21
|
+
export type ActorsResponse = z.infer<typeof ActorsResponseSchema>;
|
|
22
|
+
//export type RivetConfigResponse = z.infer<typeof RivetConfigResponseSchema>;
|