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,252 @@
|
|
|
1
|
+
import * as cbor from "cbor-x";
|
|
2
|
+
import invariant from "invariant";
|
|
3
|
+
import type { VersionedDataHandler } from "vbare";
|
|
4
|
+
import type { z } from "zod/v4";
|
|
5
|
+
import type { Encoding } from "@/actor/protocol/serde";
|
|
6
|
+
import { assertUnreachable } from "@/common/utils";
|
|
7
|
+
import type { HttpResponseError } from "@/schemas/client-protocol/mod";
|
|
8
|
+
import { HTTP_RESPONSE_ERROR_VERSIONED } from "@/schemas/client-protocol/versioned";
|
|
9
|
+
import {
|
|
10
|
+
type HttpResponseError as HttpResponseErrorJson,
|
|
11
|
+
HttpResponseErrorSchema,
|
|
12
|
+
} from "@/schemas/client-protocol-zod/mod";
|
|
13
|
+
import {
|
|
14
|
+
contentTypeForEncoding,
|
|
15
|
+
deserializeWithEncoding,
|
|
16
|
+
encodingIsBinary,
|
|
17
|
+
serializeWithEncoding,
|
|
18
|
+
} from "@/serde";
|
|
19
|
+
import { httpUserAgent } from "@/utils";
|
|
20
|
+
import { ActorError, HttpRequestError } from "./errors";
|
|
21
|
+
import { logger } from "./log";
|
|
22
|
+
|
|
23
|
+
export interface ParsedCloseReason {
|
|
24
|
+
group: string;
|
|
25
|
+
code: string;
|
|
26
|
+
rayId?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Parses WebSocket close reason string into structured data.
|
|
31
|
+
*
|
|
32
|
+
* Expected format examples:
|
|
33
|
+
* - "guard.actor_runner_failed#t1s80so6h3irenp8ymzltfoittcl00"
|
|
34
|
+
* - "ws.client_closed"
|
|
35
|
+
*
|
|
36
|
+
* Returns undefined if the format is invalid
|
|
37
|
+
*/
|
|
38
|
+
export function parseWebSocketCloseReason(
|
|
39
|
+
reason: string,
|
|
40
|
+
): ParsedCloseReason | undefined {
|
|
41
|
+
const [mainPart, rayId] = reason.split("#");
|
|
42
|
+
const [group, code] = mainPart.split(".");
|
|
43
|
+
|
|
44
|
+
if (!group || !code) {
|
|
45
|
+
logger().warn({ msg: "failed to parse close reason", reason });
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return {
|
|
50
|
+
group,
|
|
51
|
+
code,
|
|
52
|
+
rayId,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export type WebSocketMessage = string | Blob | ArrayBuffer | Uint8Array;
|
|
57
|
+
|
|
58
|
+
export function messageLength(message: WebSocketMessage): number {
|
|
59
|
+
if (message instanceof Blob) {
|
|
60
|
+
return message.size;
|
|
61
|
+
}
|
|
62
|
+
if (message instanceof ArrayBuffer) {
|
|
63
|
+
return message.byteLength;
|
|
64
|
+
}
|
|
65
|
+
if (message instanceof Uint8Array) {
|
|
66
|
+
return message.byteLength;
|
|
67
|
+
}
|
|
68
|
+
if (typeof message === "string") {
|
|
69
|
+
return message.length;
|
|
70
|
+
}
|
|
71
|
+
assertUnreachable(message);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export interface HttpRequestOpts<
|
|
75
|
+
RequestBare,
|
|
76
|
+
ResponseBare,
|
|
77
|
+
RequestJson = RequestBare,
|
|
78
|
+
ResponseJson = ResponseBare,
|
|
79
|
+
Request = RequestBare,
|
|
80
|
+
Response = ResponseBare,
|
|
81
|
+
> {
|
|
82
|
+
method: string;
|
|
83
|
+
url: string;
|
|
84
|
+
headers: Record<string, string>;
|
|
85
|
+
body?: Request;
|
|
86
|
+
encoding: Encoding;
|
|
87
|
+
skipParseResponse?: boolean;
|
|
88
|
+
signal?: AbortSignal;
|
|
89
|
+
customFetch?: (req: globalThis.Request) => Promise<globalThis.Response>;
|
|
90
|
+
requestVersionedDataHandler: VersionedDataHandler<RequestBare> | undefined;
|
|
91
|
+
requestVersion: number | undefined;
|
|
92
|
+
responseVersionedDataHandler:
|
|
93
|
+
| VersionedDataHandler<ResponseBare>
|
|
94
|
+
| undefined;
|
|
95
|
+
responseVersion: number | undefined;
|
|
96
|
+
requestZodSchema: z.ZodType<RequestJson>;
|
|
97
|
+
responseZodSchema: z.ZodType<ResponseJson>;
|
|
98
|
+
requestToJson: (value: Request) => RequestJson;
|
|
99
|
+
requestToBare: (value: Request) => RequestBare;
|
|
100
|
+
responseFromJson: (value: ResponseJson) => Response;
|
|
101
|
+
responseFromBare: (value: ResponseBare) => Response;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export async function sendHttpRequest<
|
|
105
|
+
RequestBare = unknown,
|
|
106
|
+
ResponseBare = unknown,
|
|
107
|
+
RequestJson = RequestBare,
|
|
108
|
+
ResponseJson = ResponseBare,
|
|
109
|
+
Request = RequestBare,
|
|
110
|
+
Response = ResponseBare,
|
|
111
|
+
>(
|
|
112
|
+
opts: HttpRequestOpts<
|
|
113
|
+
RequestBare,
|
|
114
|
+
ResponseBare,
|
|
115
|
+
RequestJson,
|
|
116
|
+
ResponseJson,
|
|
117
|
+
Request,
|
|
118
|
+
Response
|
|
119
|
+
>,
|
|
120
|
+
): Promise<Response> {
|
|
121
|
+
logger().debug({
|
|
122
|
+
msg: "sending http request",
|
|
123
|
+
url: opts.url,
|
|
124
|
+
encoding: opts.encoding,
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
// Serialize body
|
|
128
|
+
let contentType: string | undefined;
|
|
129
|
+
let bodyData: string | Uint8Array | undefined;
|
|
130
|
+
if (opts.method === "POST" || opts.method === "PUT") {
|
|
131
|
+
invariant(opts.body !== undefined, "missing body");
|
|
132
|
+
contentType = contentTypeForEncoding(opts.encoding);
|
|
133
|
+
bodyData = serializeWithEncoding<RequestBare, RequestJson, Request>(
|
|
134
|
+
opts.encoding,
|
|
135
|
+
opts.body,
|
|
136
|
+
opts.requestVersionedDataHandler,
|
|
137
|
+
opts.requestVersion,
|
|
138
|
+
opts.requestZodSchema,
|
|
139
|
+
opts.requestToJson,
|
|
140
|
+
opts.requestToBare,
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Send request
|
|
145
|
+
let response: globalThis.Response;
|
|
146
|
+
try {
|
|
147
|
+
// Make the HTTP request
|
|
148
|
+
response = await (opts.customFetch ?? fetch)(
|
|
149
|
+
new globalThis.Request(opts.url, {
|
|
150
|
+
method: opts.method,
|
|
151
|
+
headers: {
|
|
152
|
+
...opts.headers,
|
|
153
|
+
...(contentType
|
|
154
|
+
? {
|
|
155
|
+
"Content-Type": contentType,
|
|
156
|
+
}
|
|
157
|
+
: {}),
|
|
158
|
+
"User-Agent": httpUserAgent(),
|
|
159
|
+
},
|
|
160
|
+
body: bodyData,
|
|
161
|
+
credentials: "include",
|
|
162
|
+
signal: opts.signal,
|
|
163
|
+
}),
|
|
164
|
+
);
|
|
165
|
+
} catch (error) {
|
|
166
|
+
throw new HttpRequestError(`Request failed: ${error}`, {
|
|
167
|
+
cause: error,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Parse response error
|
|
172
|
+
if (!response.ok) {
|
|
173
|
+
const bufferResponse = await response.arrayBuffer();
|
|
174
|
+
const contentType = response.headers.get("content-type");
|
|
175
|
+
const rayId = response.headers.get("x-rivet-ray-id");
|
|
176
|
+
|
|
177
|
+
// Determine encoding from Content-Type header, defaulting to provided encoding
|
|
178
|
+
const encoding: Encoding = contentType?.includes("application/json")
|
|
179
|
+
? "json"
|
|
180
|
+
: opts.encoding;
|
|
181
|
+
|
|
182
|
+
// Attempt to parse structured error data
|
|
183
|
+
try {
|
|
184
|
+
const responseData = deserializeWithEncoding(
|
|
185
|
+
encoding,
|
|
186
|
+
new Uint8Array(bufferResponse),
|
|
187
|
+
HTTP_RESPONSE_ERROR_VERSIONED,
|
|
188
|
+
HttpResponseErrorSchema,
|
|
189
|
+
// JSON: metadata is already unknown
|
|
190
|
+
(json): HttpResponseErrorJson => json as HttpResponseErrorJson,
|
|
191
|
+
// BARE: decode ArrayBuffer metadata to unknown
|
|
192
|
+
(bare): any => ({
|
|
193
|
+
group: bare.group,
|
|
194
|
+
code: bare.code,
|
|
195
|
+
message: bare.message,
|
|
196
|
+
metadata: bare.metadata
|
|
197
|
+
? cbor.decode(new Uint8Array(bare.metadata))
|
|
198
|
+
: undefined,
|
|
199
|
+
}),
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
throw new ActorError(
|
|
203
|
+
responseData.group,
|
|
204
|
+
responseData.code,
|
|
205
|
+
responseData.message,
|
|
206
|
+
responseData.metadata,
|
|
207
|
+
);
|
|
208
|
+
} catch (error) {
|
|
209
|
+
// If it's already an ActorError, re-throw it
|
|
210
|
+
if (error instanceof ActorError) {
|
|
211
|
+
throw error;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Otherwise, fall back to generic error with text response
|
|
215
|
+
const textResponse = new TextDecoder("utf-8", {
|
|
216
|
+
fatal: false,
|
|
217
|
+
}).decode(bufferResponse);
|
|
218
|
+
|
|
219
|
+
if (rayId) {
|
|
220
|
+
throw new HttpRequestError(
|
|
221
|
+
`${response.statusText} (${response.status}) (Ray ID: ${rayId}):\n${textResponse}`,
|
|
222
|
+
);
|
|
223
|
+
} else {
|
|
224
|
+
throw new HttpRequestError(
|
|
225
|
+
`${response.statusText} (${response.status}):\n${textResponse}`,
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Some requests don't need the success response to be parsed, so this can speed things up
|
|
232
|
+
if (opts.skipParseResponse) {
|
|
233
|
+
return undefined as Response;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Parse the response based on encoding
|
|
237
|
+
try {
|
|
238
|
+
const buffer = new Uint8Array(await response.arrayBuffer());
|
|
239
|
+
return deserializeWithEncoding<ResponseBare, ResponseJson, Response>(
|
|
240
|
+
opts.encoding,
|
|
241
|
+
buffer,
|
|
242
|
+
opts.responseVersionedDataHandler,
|
|
243
|
+
opts.responseZodSchema,
|
|
244
|
+
opts.responseFromJson,
|
|
245
|
+
opts.responseFromBare,
|
|
246
|
+
);
|
|
247
|
+
} catch (error) {
|
|
248
|
+
throw new HttpRequestError(`Failed to parse response: ${error}`, {
|
|
249
|
+
cause: error,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// NOTE: This is in a separate file from the router since it needs to be shared between the client & the server. If this was in the router file, the client would end up importing the *entire* actor router and tree shaking would not work.
|
|
2
|
+
|
|
3
|
+
// MARK: Paths
|
|
4
|
+
export const PATH_CONNECT = "/connect";
|
|
5
|
+
export const PATH_WEBSOCKET_BASE = "/websocket";
|
|
6
|
+
export const PATH_WEBSOCKET_PREFIX = "/websocket/";
|
|
7
|
+
export const PATH_INSPECTOR_CONNECT = "/inspector/connect";
|
|
8
|
+
|
|
9
|
+
// MARK: Headers
|
|
10
|
+
export const HEADER_ACTOR_QUERY = "x-rivet-query";
|
|
11
|
+
|
|
12
|
+
export const HEADER_ENCODING = "x-rivet-encoding";
|
|
13
|
+
|
|
14
|
+
// IMPORTANT: Params must be in headers or in an E2EE part of the request (i.e. NOT the URL or query string) in order to ensure that tokens can be securely passed in params.
|
|
15
|
+
export const HEADER_CONN_PARAMS = "x-rivet-conn-params";
|
|
16
|
+
|
|
17
|
+
export const HEADER_ACTOR_ID = "x-rivet-actor";
|
|
18
|
+
|
|
19
|
+
export const HEADER_RIVET_TOKEN = "x-rivet-token";
|
|
20
|
+
|
|
21
|
+
// MARK: Manager Gateway Headers
|
|
22
|
+
export const HEADER_RIVET_TARGET = "x-rivet-target";
|
|
23
|
+
export const HEADER_RIVET_ACTOR = "x-rivet-actor";
|
|
24
|
+
export const HEADER_RIVET_NAMESPACE = "x-rivet-namespace";
|
|
25
|
+
|
|
26
|
+
// MARK: WebSocket Protocol Prefixes
|
|
27
|
+
/** Some servers (such as node-ws & Cloudflare) require explicitly match a certain WebSocket protocol. This gives us a static protocol to match against. */
|
|
28
|
+
export const WS_PROTOCOL_STANDARD = "rivet";
|
|
29
|
+
export const WS_PROTOCOL_TARGET = "rivet_target.";
|
|
30
|
+
export const WS_PROTOCOL_ACTOR = "rivet_actor.";
|
|
31
|
+
export const WS_PROTOCOL_ENCODING = "rivet_encoding.";
|
|
32
|
+
export const WS_PROTOCOL_CONN_PARAMS = "rivet_conn_params.";
|
|
33
|
+
export const WS_PROTOCOL_TOKEN = "rivet_token.";
|
|
34
|
+
/**
|
|
35
|
+
* Used to pass an inspector token for connecting to the inspector.
|
|
36
|
+
* Only used internally by Rivet.
|
|
37
|
+
*/
|
|
38
|
+
export const WS_PROTOCOL_INSPECTOR_TOKEN = "rivet_inspector_token.";
|
|
39
|
+
|
|
40
|
+
// MARK: WebSocket Inline Test Protocol Prefixes
|
|
41
|
+
export const WS_TEST_PROTOCOL_PATH = "test_path.";
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Headers that publics can send from public clients.
|
|
45
|
+
*
|
|
46
|
+
* Used for CORS.
|
|
47
|
+
**/
|
|
48
|
+
export const ALLOWED_PUBLIC_HEADERS = [
|
|
49
|
+
"Content-Type",
|
|
50
|
+
"User-Agent",
|
|
51
|
+
HEADER_ACTOR_QUERY,
|
|
52
|
+
HEADER_ENCODING,
|
|
53
|
+
HEADER_CONN_PARAMS,
|
|
54
|
+
HEADER_ACTOR_ID,
|
|
55
|
+
HEADER_RIVET_TARGET,
|
|
56
|
+
HEADER_RIVET_ACTOR,
|
|
57
|
+
HEADER_RIVET_NAMESPACE,
|
|
58
|
+
HEADER_RIVET_TOKEN,
|
|
59
|
+
];
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { MiddlewareHandler } from "hono";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Simple CORS middleware that matches the gateway behavior.
|
|
5
|
+
*
|
|
6
|
+
* - Echoes back the Origin header from the request
|
|
7
|
+
* - Echoes back the Access-Control-Request-Headers from preflight
|
|
8
|
+
* - Supports credentials
|
|
9
|
+
* - Allows common HTTP methods
|
|
10
|
+
* - Caches preflight for 24 hours
|
|
11
|
+
* - Adds Vary header to prevent cache poisoning
|
|
12
|
+
*/
|
|
13
|
+
export const cors = (): MiddlewareHandler => {
|
|
14
|
+
return async (c, next) => {
|
|
15
|
+
// Extract origin from request
|
|
16
|
+
const origin = c.req.header("origin") || "*";
|
|
17
|
+
|
|
18
|
+
// Handle preflight OPTIONS request
|
|
19
|
+
if (c.req.method === "OPTIONS") {
|
|
20
|
+
const requestHeaders =
|
|
21
|
+
c.req.header("access-control-request-headers") || "*";
|
|
22
|
+
|
|
23
|
+
c.header("access-control-allow-origin", origin);
|
|
24
|
+
c.header("access-control-allow-credentials", "true");
|
|
25
|
+
c.header(
|
|
26
|
+
"access-control-allow-methods",
|
|
27
|
+
"GET, POST, PUT, DELETE, OPTIONS, PATCH",
|
|
28
|
+
);
|
|
29
|
+
c.header("access-control-allow-headers", requestHeaders);
|
|
30
|
+
c.header("access-control-expose-headers", "*");
|
|
31
|
+
c.header("access-control-max-age", "86400");
|
|
32
|
+
|
|
33
|
+
// Add Vary header to prevent cache poisoning when echoing origin
|
|
34
|
+
if (origin !== "*") {
|
|
35
|
+
c.header("vary", "Origin");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Remove content headers from preflight response
|
|
39
|
+
c.res.headers.delete("content-length");
|
|
40
|
+
c.res.headers.delete("content-type");
|
|
41
|
+
|
|
42
|
+
return c.body(null, 204);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
await next();
|
|
46
|
+
|
|
47
|
+
// Add CORS headers to actual request
|
|
48
|
+
c.header("access-control-allow-origin", origin);
|
|
49
|
+
c.header("access-control-allow-credentials", "true");
|
|
50
|
+
c.header("access-control-expose-headers", "*");
|
|
51
|
+
|
|
52
|
+
// Add Vary header to prevent cache poisoning when echoing origin
|
|
53
|
+
if (origin !== "*") {
|
|
54
|
+
c.header("vary", "Origin");
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// Define minimal event interfaces to avoid conflicts between different EventSource implementations
|
|
2
|
+
export interface UniversalEvent {
|
|
3
|
+
type: string;
|
|
4
|
+
target?: any;
|
|
5
|
+
currentTarget?: any;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface UniversalMessageEvent extends UniversalEvent {
|
|
9
|
+
data: string;
|
|
10
|
+
lastEventId: string;
|
|
11
|
+
origin: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface UniversalErrorEvent extends UniversalEvent {
|
|
15
|
+
message: string;
|
|
16
|
+
filename?: string;
|
|
17
|
+
lineno?: number;
|
|
18
|
+
colno?: number;
|
|
19
|
+
error?: any;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Common EventSource interface that can be implemented by different EventSource-like classes
|
|
24
|
+
* This is compatible with the standard EventSource API but allows for custom implementations
|
|
25
|
+
*/
|
|
26
|
+
export interface UniversalEventSource {
|
|
27
|
+
// EventSource readyState values
|
|
28
|
+
readonly CONNECTING: 0;
|
|
29
|
+
readonly OPEN: 1;
|
|
30
|
+
readonly CLOSED: 2;
|
|
31
|
+
|
|
32
|
+
// Properties
|
|
33
|
+
readonly readyState: 0 | 1 | 2;
|
|
34
|
+
readonly url: string;
|
|
35
|
+
readonly withCredentials: boolean;
|
|
36
|
+
|
|
37
|
+
// Methods
|
|
38
|
+
close(): void;
|
|
39
|
+
addEventListener(type: string, listener: (event: any) => void): void;
|
|
40
|
+
removeEventListener(type: string, listener: (event: any) => void): void;
|
|
41
|
+
dispatchEvent(event: UniversalEvent): boolean;
|
|
42
|
+
|
|
43
|
+
// Event handlers (optional)
|
|
44
|
+
onopen?: ((event: UniversalEvent) => void) | null;
|
|
45
|
+
onmessage?: ((event: UniversalMessageEvent) => void) | null;
|
|
46
|
+
onerror?: ((event: UniversalErrorEvent) => void) | null;
|
|
47
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { EventSource } from "eventsource";
|
|
2
|
+
import { logger } from "@/client/log";
|
|
3
|
+
|
|
4
|
+
// Global singleton promise that will be reused for subsequent calls
|
|
5
|
+
let eventSourcePromise: Promise<typeof EventSource> | null = null;
|
|
6
|
+
|
|
7
|
+
export async function importEventSource(): Promise<typeof EventSource> {
|
|
8
|
+
// IMPORTANT: Import `eventsource` from the custom `eventsource` library. We need a custom implementation
|
|
9
|
+
// since we need to attach our own custom headers to the request.
|
|
10
|
+
//
|
|
11
|
+
// We can't use the browser-provided EventSource since it does not allow providing custom headers.
|
|
12
|
+
|
|
13
|
+
// Return existing promise if we already started loading
|
|
14
|
+
if (eventSourcePromise !== null) {
|
|
15
|
+
return eventSourcePromise;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Create and store the promise
|
|
19
|
+
eventSourcePromise = (async () => {
|
|
20
|
+
let _EventSource: typeof EventSource;
|
|
21
|
+
|
|
22
|
+
// Node.js environment
|
|
23
|
+
try {
|
|
24
|
+
const moduleName = "eventsource";
|
|
25
|
+
const es = await import(/* webpackIgnore: true */ moduleName);
|
|
26
|
+
_EventSource = es.EventSource;
|
|
27
|
+
logger().debug("using eventsource from npm");
|
|
28
|
+
} catch (err) {
|
|
29
|
+
// EventSource not available
|
|
30
|
+
_EventSource = class MockEventSource {
|
|
31
|
+
constructor() {
|
|
32
|
+
throw new Error(
|
|
33
|
+
'EventSource support requires installing the "eventsource" peer dependency.',
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
} as unknown as typeof EventSource;
|
|
37
|
+
logger().debug("using mock eventsource");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return _EventSource;
|
|
41
|
+
})();
|
|
42
|
+
|
|
43
|
+
return eventSourcePromise;
|
|
44
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { WSContext } from "hono/ws";
|
|
2
|
+
import type { UpgradeWebSocketArgs } from "@/actor/router-websocket-endpoints";
|
|
3
|
+
import type { UniversalWebSocket } from "@/common/websocket-interface";
|
|
4
|
+
import { VirtualWebSocket } from "@rivetkit/virtual-websocket";
|
|
5
|
+
import { getLogger } from "./log";
|
|
6
|
+
|
|
7
|
+
function logger() {
|
|
8
|
+
return getLogger("inline-websocket-adapter");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* InlineWebSocketAdapter creates two linked WebSocket objects:
|
|
13
|
+
* - clientWs: for the client/proxy side (returned from openWebSocket)
|
|
14
|
+
* - actorWs: for the actor side (passed via wsContext.raw)
|
|
15
|
+
*
|
|
16
|
+
* Each side's send() triggers the OTHER side's message event.
|
|
17
|
+
*/
|
|
18
|
+
export class InlineWebSocketAdapter {
|
|
19
|
+
#handler: UpgradeWebSocketArgs;
|
|
20
|
+
#wsContext: WSContext;
|
|
21
|
+
#readyState: 0 | 1 | 2 | 3 = 0;
|
|
22
|
+
|
|
23
|
+
#clientWs: VirtualWebSocket;
|
|
24
|
+
#actorWs: VirtualWebSocket;
|
|
25
|
+
|
|
26
|
+
constructor(handler: UpgradeWebSocketArgs) {
|
|
27
|
+
this.#handler = handler;
|
|
28
|
+
|
|
29
|
+
// Create linked WebSocket pair
|
|
30
|
+
// Client's send() -> handler.onMessage (for RPC) + Actor's message event (for raw WS)
|
|
31
|
+
// Actor's send() -> Client's message event
|
|
32
|
+
this.#clientWs = new VirtualWebSocket({
|
|
33
|
+
getReadyState: () => this.#readyState,
|
|
34
|
+
onSend: (data) => {
|
|
35
|
+
try {
|
|
36
|
+
// Call handler.onMessage for protocol-based connections (RPC)
|
|
37
|
+
this.#handler.onMessage({ data }, this.#wsContext);
|
|
38
|
+
// Also trigger message event on actor's websocket for raw websocket handlers
|
|
39
|
+
this.#actorWs.triggerMessage(data);
|
|
40
|
+
} catch (err) {
|
|
41
|
+
this.#handleError(err);
|
|
42
|
+
this.#close(1011, "Internal error processing message");
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
onClose: (code, reason) => this.#close(code, reason),
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
this.#actorWs = new VirtualWebSocket({
|
|
49
|
+
getReadyState: () => this.#readyState,
|
|
50
|
+
onSend: (data) => this.#clientWs.triggerMessage(data),
|
|
51
|
+
onClose: (code, reason) => this.#close(code, reason),
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// Create WSContext with actorWs as raw
|
|
55
|
+
this.#wsContext = new WSContext({
|
|
56
|
+
raw: this.#actorWs,
|
|
57
|
+
send: (data: string | ArrayBuffer | Uint8Array) => {
|
|
58
|
+
logger().debug({ msg: "WSContext.send called" });
|
|
59
|
+
this.#clientWs.triggerMessage(data);
|
|
60
|
+
},
|
|
61
|
+
close: (code?: number, reason?: string) => {
|
|
62
|
+
logger().debug({ msg: "WSContext.close called", code, reason });
|
|
63
|
+
this.#close(code || 1000, reason || "");
|
|
64
|
+
},
|
|
65
|
+
readyState: 1,
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
// Defer initialization to allow event listeners to be attached first
|
|
69
|
+
setTimeout(() => {
|
|
70
|
+
this.#initialize();
|
|
71
|
+
}, 0);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Get the client-side WebSocket (for proxy/client code) */
|
|
75
|
+
get clientWebSocket(): UniversalWebSocket {
|
|
76
|
+
return this.#clientWs;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Get the actor-side WebSocket (passed to actor via wsContext.raw) */
|
|
80
|
+
get actorWebSocket(): UniversalWebSocket {
|
|
81
|
+
return this.#actorWs;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async #initialize(): Promise<void> {
|
|
85
|
+
try {
|
|
86
|
+
logger().debug({ msg: "websocket initializing" });
|
|
87
|
+
|
|
88
|
+
this.#readyState = 1; // OPEN
|
|
89
|
+
|
|
90
|
+
logger().debug({ msg: "calling handler.onOpen with WSContext" });
|
|
91
|
+
this.#handler.onOpen(undefined, this.#wsContext);
|
|
92
|
+
|
|
93
|
+
// Fire open event to both sides
|
|
94
|
+
this.#clientWs.triggerOpen();
|
|
95
|
+
this.#actorWs.triggerOpen();
|
|
96
|
+
} catch (err) {
|
|
97
|
+
this.#handleError(err);
|
|
98
|
+
this.#close(1011, "Internal error during initialization");
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
#handleError(err: unknown): void {
|
|
103
|
+
logger().error({
|
|
104
|
+
msg: "error in websocket",
|
|
105
|
+
error: err,
|
|
106
|
+
errorMessage: err instanceof Error ? err.message : String(err),
|
|
107
|
+
stack: err instanceof Error ? err.stack : undefined,
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// Call handler.onError
|
|
111
|
+
try {
|
|
112
|
+
this.#handler.onError(err, this.#wsContext);
|
|
113
|
+
} catch (handlerErr) {
|
|
114
|
+
logger().error({ msg: "error in onError handler", error: handlerErr });
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Fire error event to both sides
|
|
118
|
+
this.#clientWs.triggerError(err);
|
|
119
|
+
this.#actorWs.triggerError(err);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
#close(code: number, reason: string): void {
|
|
123
|
+
if (this.#readyState === 3 || this.#readyState === 2) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
logger().debug({ msg: "closing websocket", code, reason });
|
|
128
|
+
|
|
129
|
+
this.#readyState = 2; // CLOSING
|
|
130
|
+
|
|
131
|
+
try {
|
|
132
|
+
this.#handler.onClose({ code, reason, wasClean: true }, this.#wsContext);
|
|
133
|
+
} catch (err) {
|
|
134
|
+
logger().error({ msg: "error closing websocket", error: err });
|
|
135
|
+
} finally {
|
|
136
|
+
this.#readyState = 3; // CLOSED
|
|
137
|
+
|
|
138
|
+
// Fire close event to both sides
|
|
139
|
+
this.#clientWs.triggerClose(code, reason);
|
|
140
|
+
this.#actorWs.triggerClose(code, reason);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Creates an InlineWebSocketAdapter and returns the client-side WebSocket.
|
|
147
|
+
* This is the main entry point for creating inline WebSocket connections.
|
|
148
|
+
*/
|
|
149
|
+
export function createInlineWebSocket(
|
|
150
|
+
handler: UpgradeWebSocketArgs,
|
|
151
|
+
): UniversalWebSocket {
|
|
152
|
+
const adapter = new InlineWebSocketAdapter(handler);
|
|
153
|
+
return adapter.clientWebSocket;
|
|
154
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type LogLevel =
|
|
2
|
+
| "TRACE"
|
|
3
|
+
| "DEBUG"
|
|
4
|
+
| "INFO"
|
|
5
|
+
| "WARN"
|
|
6
|
+
| "ERROR"
|
|
7
|
+
| "CRITICAL";
|
|
8
|
+
|
|
9
|
+
export const LogLevels: Record<LogLevel, LevelIndex> = {
|
|
10
|
+
TRACE: 0,
|
|
11
|
+
DEBUG: 1,
|
|
12
|
+
INFO: 2,
|
|
13
|
+
WARN: 3,
|
|
14
|
+
ERROR: 4,
|
|
15
|
+
CRITICAL: 5,
|
|
16
|
+
} as const;
|
|
17
|
+
|
|
18
|
+
export const LevelNameMap: Record<number, LogLevel> = {
|
|
19
|
+
0: "TRACE",
|
|
20
|
+
1: "DEBUG",
|
|
21
|
+
2: "INFO",
|
|
22
|
+
3: "WARN",
|
|
23
|
+
4: "ERROR",
|
|
24
|
+
5: "CRITICAL",
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export type LevelIndex = number;
|