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,542 @@
|
|
|
1
|
+
import { idToStr } from "@rivetkit/engine-runner";
|
|
2
|
+
import onChange from "@rivetkit/on-change";
|
|
3
|
+
import { isCborSerializable, stringifyError } from "@/common/utils";
|
|
4
|
+
import {
|
|
5
|
+
CURRENT_VERSION as ACTOR_PERSIST_CURRENT_VERSION,
|
|
6
|
+
ACTOR_VERSIONED,
|
|
7
|
+
CONN_VERSIONED,
|
|
8
|
+
} from "@/schemas/actor-persist/versioned";
|
|
9
|
+
import { promiseWithResolvers, SinglePromiseQueue } from "@/utils";
|
|
10
|
+
import { loggerWithoutContext } from "@/actor/log";
|
|
11
|
+
import { type AnyConn, CONN_STATE_MANAGER_SYMBOL } from "../conn/mod";
|
|
12
|
+
import { convertConnToBarePersistedConn } from "../conn/persisted";
|
|
13
|
+
import type { ActorDriver } from "../driver";
|
|
14
|
+
import * as errors from "../errors";
|
|
15
|
+
import type { EventSchemaConfig, QueueSchemaConfig } from "../schema";
|
|
16
|
+
import { isConnStatePath, isStatePath } from "../utils";
|
|
17
|
+
import { KEYS, makeConnKey } from "./keys";
|
|
18
|
+
import type { ActorInstance } from "./mod";
|
|
19
|
+
import { convertActorToBarePersisted, type PersistedActor } from "./persisted";
|
|
20
|
+
|
|
21
|
+
export interface SaveStateOptions {
|
|
22
|
+
/**
|
|
23
|
+
* Forces the state to be saved immediately. This function will return when the state has saved successfully.
|
|
24
|
+
*/
|
|
25
|
+
immediate?: boolean;
|
|
26
|
+
/** Bypass ready check for stopping. */
|
|
27
|
+
allowStoppingState?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Maximum time in milliseconds to wait before forcing a save.
|
|
30
|
+
*
|
|
31
|
+
* If a save is already scheduled to occur later than this deadline, it will be rescheduled earlier.
|
|
32
|
+
*/
|
|
33
|
+
maxWait?: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Manages actor state persistence, proxying, and synchronization.
|
|
38
|
+
* Handles automatic state change detection and throttled persistence to KV storage.
|
|
39
|
+
*/
|
|
40
|
+
export class StateManager<
|
|
41
|
+
S,
|
|
42
|
+
CP,
|
|
43
|
+
CS,
|
|
44
|
+
I,
|
|
45
|
+
E extends EventSchemaConfig = Record<never, never>,
|
|
46
|
+
Q extends QueueSchemaConfig = Record<never, never>,
|
|
47
|
+
> {
|
|
48
|
+
#actor: ActorInstance<S, CP, CS, any, I, any, E, Q>;
|
|
49
|
+
#actorDriver: ActorDriver;
|
|
50
|
+
|
|
51
|
+
// State tracking
|
|
52
|
+
#persist!: PersistedActor<S, I>;
|
|
53
|
+
#persistRaw!: PersistedActor<S, I>;
|
|
54
|
+
#persistChanged = false;
|
|
55
|
+
#isInOnStateChange = false;
|
|
56
|
+
|
|
57
|
+
// Save management
|
|
58
|
+
#persistWriteQueue = new SinglePromiseQueue();
|
|
59
|
+
#lastSaveTime = 0;
|
|
60
|
+
#pendingSaveTimeout?: NodeJS.Timeout;
|
|
61
|
+
#pendingSaveScheduledTimestamp?: number;
|
|
62
|
+
#onPersistSavedPromise?: ReturnType<typeof promiseWithResolvers<void>>;
|
|
63
|
+
|
|
64
|
+
// Configuration
|
|
65
|
+
#config: any; // ActorConfig type
|
|
66
|
+
#stateSaveInterval: number;
|
|
67
|
+
|
|
68
|
+
constructor(
|
|
69
|
+
actor: ActorInstance<S, CP, CS, any, I, any, E, Q>,
|
|
70
|
+
actorDriver: ActorDriver,
|
|
71
|
+
config: any,
|
|
72
|
+
) {
|
|
73
|
+
this.#actor = actor;
|
|
74
|
+
this.#actorDriver = actorDriver;
|
|
75
|
+
this.#config = config;
|
|
76
|
+
this.#stateSaveInterval = config.options.stateSaveInterval || 100;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// MARK: - Public API
|
|
80
|
+
|
|
81
|
+
get persist(): PersistedActor<S, I> {
|
|
82
|
+
return this.#persist;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
get persistRaw(): PersistedActor<S, I> {
|
|
86
|
+
return this.#persistRaw;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
get persistChanged(): boolean {
|
|
90
|
+
return this.#persistChanged;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
get state(): S {
|
|
94
|
+
this.#validateStateEnabled();
|
|
95
|
+
return this.#persist.state;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
set state(value: S) {
|
|
99
|
+
this.#validateStateEnabled();
|
|
100
|
+
this.#persist.state = value;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
get stateEnabled(): boolean {
|
|
104
|
+
return "createState" in this.#config || "state" in this.#config;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// MARK: - Initialization
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Initializes state from persisted data or creates new state.
|
|
111
|
+
*/
|
|
112
|
+
async initializeState(persistData: PersistedActor<S, I>): Promise<void> {
|
|
113
|
+
if (!persistData.hasInitialized) {
|
|
114
|
+
// Create initial state
|
|
115
|
+
let stateData: unknown;
|
|
116
|
+
if (this.stateEnabled) {
|
|
117
|
+
this.#actor.rLog.info({ msg: "actor state initializing" });
|
|
118
|
+
|
|
119
|
+
if ("createState" in this.#config) {
|
|
120
|
+
stateData = await this.#actor.runInTraceSpan(
|
|
121
|
+
"actor.createState",
|
|
122
|
+
undefined,
|
|
123
|
+
() =>
|
|
124
|
+
this.#config.createState!(
|
|
125
|
+
this.#actor.actorContext,
|
|
126
|
+
persistData.input!,
|
|
127
|
+
),
|
|
128
|
+
);
|
|
129
|
+
} else if ("state" in this.#config) {
|
|
130
|
+
stateData = structuredClone(this.#config.state);
|
|
131
|
+
} else {
|
|
132
|
+
throw new Error(
|
|
133
|
+
"Both 'createState' or 'state' were not defined",
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
} else {
|
|
137
|
+
this.#actor.rLog.debug({ msg: "state not enabled" });
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Update persisted data
|
|
141
|
+
persistData.state = stateData as S;
|
|
142
|
+
persistData.hasInitialized = true;
|
|
143
|
+
|
|
144
|
+
// Save initial state
|
|
145
|
+
//
|
|
146
|
+
// We don't use #savePersistInner because the actor is not fully
|
|
147
|
+
// initialized yet
|
|
148
|
+
const bareData = convertActorToBarePersisted<S, I>(persistData);
|
|
149
|
+
await this.#actorDriver.kvBatchPut(this.#actor.id, [
|
|
150
|
+
[
|
|
151
|
+
KEYS.PERSIST_DATA,
|
|
152
|
+
ACTOR_VERSIONED.serializeWithEmbeddedVersion(
|
|
153
|
+
bareData,
|
|
154
|
+
ACTOR_PERSIST_CURRENT_VERSION,
|
|
155
|
+
),
|
|
156
|
+
],
|
|
157
|
+
]);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Initialize proxy
|
|
161
|
+
this.initPersistProxy(persistData);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Creates proxy for persist object that handles automatic state change detection.
|
|
166
|
+
*/
|
|
167
|
+
initPersistProxy(target: PersistedActor<S, I>) {
|
|
168
|
+
// Set raw persist object
|
|
169
|
+
this.#persistRaw = target;
|
|
170
|
+
|
|
171
|
+
// Validate serializability
|
|
172
|
+
if (target === null || typeof target !== "object") {
|
|
173
|
+
let invalidPath = "";
|
|
174
|
+
if (
|
|
175
|
+
!isCborSerializable(
|
|
176
|
+
target,
|
|
177
|
+
(path) => {
|
|
178
|
+
invalidPath = path;
|
|
179
|
+
},
|
|
180
|
+
"",
|
|
181
|
+
)
|
|
182
|
+
) {
|
|
183
|
+
throw new errors.InvalidStateType({ path: invalidPath });
|
|
184
|
+
}
|
|
185
|
+
return target;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Unsubscribe from old state
|
|
189
|
+
if (this.#persist) {
|
|
190
|
+
onChange.unsubscribe(this.#persist);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Listen for changes to automatically write state
|
|
194
|
+
this.#persist = onChange(
|
|
195
|
+
target,
|
|
196
|
+
(
|
|
197
|
+
path: string,
|
|
198
|
+
value: any,
|
|
199
|
+
_previousValue: any,
|
|
200
|
+
_applyData: any,
|
|
201
|
+
) => {
|
|
202
|
+
this.#handleStateChange(path, value);
|
|
203
|
+
},
|
|
204
|
+
{ ignoreDetached: true },
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// MARK: - State Persistence
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Forces the state to get saved.
|
|
212
|
+
*/
|
|
213
|
+
async saveState(opts: SaveStateOptions): Promise<void> {
|
|
214
|
+
this.#actor.assertReady(opts.allowStoppingState);
|
|
215
|
+
|
|
216
|
+
if (this.#persistChanged) {
|
|
217
|
+
if (opts.immediate) {
|
|
218
|
+
await this.#savePersistInner();
|
|
219
|
+
} else {
|
|
220
|
+
// Create promise for waiting
|
|
221
|
+
if (!this.#onPersistSavedPromise) {
|
|
222
|
+
this.#onPersistSavedPromise = promiseWithResolvers((reason) => loggerWithoutContext().warn({ msg: "unhandled persist saved promise rejection", reason }));
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Save throttled
|
|
226
|
+
this.savePersistThrottled(opts.maxWait);
|
|
227
|
+
|
|
228
|
+
// Wait for save
|
|
229
|
+
await this.#onPersistSavedPromise?.promise;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Throttled save state method. Used to write to KV at a reasonable cadence.
|
|
236
|
+
*
|
|
237
|
+
* Passing a maxWait will override the stateSaveInterval with the min
|
|
238
|
+
* between that and the maxWait.
|
|
239
|
+
*/
|
|
240
|
+
savePersistThrottled(maxWait?: number) {
|
|
241
|
+
const now = Date.now();
|
|
242
|
+
const timeSinceLastSave = now - this.#lastSaveTime;
|
|
243
|
+
|
|
244
|
+
// Calculate when the save should happen based on throttle interval
|
|
245
|
+
let saveDelay = Math.max(
|
|
246
|
+
0,
|
|
247
|
+
this.#stateSaveInterval - timeSinceLastSave,
|
|
248
|
+
);
|
|
249
|
+
if (maxWait !== undefined) {
|
|
250
|
+
saveDelay = Math.min(saveDelay, maxWait);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Check if we need to reschedule the same timeout
|
|
254
|
+
if (
|
|
255
|
+
this.#pendingSaveTimeout !== undefined &&
|
|
256
|
+
this.#pendingSaveScheduledTimestamp !== undefined
|
|
257
|
+
) {
|
|
258
|
+
// Check if we have an earlier save deadline
|
|
259
|
+
const newScheduledTimestamp = now + saveDelay;
|
|
260
|
+
if (newScheduledTimestamp < this.#pendingSaveScheduledTimestamp) {
|
|
261
|
+
// Cancel existing timeout and reschedule
|
|
262
|
+
clearTimeout(this.#pendingSaveTimeout);
|
|
263
|
+
this.#pendingSaveTimeout = undefined;
|
|
264
|
+
this.#pendingSaveScheduledTimestamp = undefined;
|
|
265
|
+
} else {
|
|
266
|
+
// Current schedule is fine, don't reschedule
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
if (saveDelay > 0) {
|
|
272
|
+
// Schedule save
|
|
273
|
+
this.#pendingSaveScheduledTimestamp = now + saveDelay;
|
|
274
|
+
this.#pendingSaveTimeout = setTimeout(() => {
|
|
275
|
+
this.#pendingSaveTimeout = undefined;
|
|
276
|
+
this.#pendingSaveScheduledTimestamp = undefined;
|
|
277
|
+
this.#savePersistInner().catch((error) => {
|
|
278
|
+
this.#actor.rLog.error({
|
|
279
|
+
msg: "error saving persist data in scheduled save",
|
|
280
|
+
error: stringifyError(error),
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
}, saveDelay);
|
|
284
|
+
} else {
|
|
285
|
+
// Save immediately
|
|
286
|
+
this.#savePersistInner().catch((error) => {
|
|
287
|
+
this.#actor.rLog.error({
|
|
288
|
+
msg: "error saving persist data immediately",
|
|
289
|
+
error: stringifyError(error),
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Clears any pending save timeout.
|
|
297
|
+
*/
|
|
298
|
+
clearPendingSaveTimeout() {
|
|
299
|
+
if (this.#pendingSaveTimeout) {
|
|
300
|
+
clearTimeout(this.#pendingSaveTimeout);
|
|
301
|
+
this.#pendingSaveTimeout = undefined;
|
|
302
|
+
this.#pendingSaveScheduledTimestamp = undefined;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Waits for any pending write operations to complete.
|
|
308
|
+
*/
|
|
309
|
+
async waitForPendingWrites(): Promise<void> {
|
|
310
|
+
if (this.#persistWriteQueue.runningDrainLoop) {
|
|
311
|
+
await this.#persistWriteQueue.runningDrainLoop;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// MARK: - Private Helpers
|
|
316
|
+
|
|
317
|
+
#validateStateEnabled() {
|
|
318
|
+
if (!this.stateEnabled) {
|
|
319
|
+
throw new errors.StateNotEnabled();
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
#handleStateChange(path: string, value: any) {
|
|
324
|
+
const actorStatePath = isStatePath(path);
|
|
325
|
+
const connStatePath = isConnStatePath(path);
|
|
326
|
+
|
|
327
|
+
// Validate CBOR serializability
|
|
328
|
+
if (actorStatePath || connStatePath) {
|
|
329
|
+
let invalidPath = "";
|
|
330
|
+
if (
|
|
331
|
+
!isCborSerializable(
|
|
332
|
+
value,
|
|
333
|
+
(invalidPathPart) => {
|
|
334
|
+
invalidPath = invalidPathPart;
|
|
335
|
+
},
|
|
336
|
+
"",
|
|
337
|
+
)
|
|
338
|
+
) {
|
|
339
|
+
throw new errors.InvalidStateType({
|
|
340
|
+
path: path + (invalidPath ? `.${invalidPath}` : ""),
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
this.#actor.rLog.debug({
|
|
346
|
+
msg: "onChange triggered, setting persistChanged=true",
|
|
347
|
+
path,
|
|
348
|
+
});
|
|
349
|
+
this.#persistChanged = true;
|
|
350
|
+
|
|
351
|
+
// Inform inspector about state changes
|
|
352
|
+
if (actorStatePath) {
|
|
353
|
+
this.#actor.inspector.emitter.emit(
|
|
354
|
+
"stateUpdated",
|
|
355
|
+
this.#persist.state,
|
|
356
|
+
);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// Call onStateChange lifecycle hook
|
|
360
|
+
if (
|
|
361
|
+
actorStatePath &&
|
|
362
|
+
this.#config.onStateChange &&
|
|
363
|
+
this.#actor.isReady() &&
|
|
364
|
+
!this.#isInOnStateChange
|
|
365
|
+
) {
|
|
366
|
+
const span = this.#actor.startTraceSpan("actor.onStateChange", {
|
|
367
|
+
"rivet.state.path": path,
|
|
368
|
+
});
|
|
369
|
+
try {
|
|
370
|
+
this.#isInOnStateChange = true;
|
|
371
|
+
this.#actor.traces.withSpan(span, () =>
|
|
372
|
+
this.#config.onStateChange!(
|
|
373
|
+
this.#actor.actorContext,
|
|
374
|
+
this.#persistRaw.state,
|
|
375
|
+
),
|
|
376
|
+
);
|
|
377
|
+
this.#actor.endTraceSpan(span, { code: "OK" });
|
|
378
|
+
} catch (error) {
|
|
379
|
+
this.#actor.endTraceSpan(span, {
|
|
380
|
+
code: "ERROR",
|
|
381
|
+
message: stringifyError(error),
|
|
382
|
+
});
|
|
383
|
+
this.#actor.rLog.error({
|
|
384
|
+
msg: "error in `_onStateChange`",
|
|
385
|
+
error: stringifyError(error),
|
|
386
|
+
});
|
|
387
|
+
} finally {
|
|
388
|
+
this.#isInOnStateChange = false;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
async #savePersistInner() {
|
|
394
|
+
this.#actor.rLog.info({
|
|
395
|
+
msg: "savePersistInner called",
|
|
396
|
+
persistChanged: this.#persistChanged,
|
|
397
|
+
connsWithPersistChangedSize:
|
|
398
|
+
this.#actor.connectionManager.connsWithPersistChanged.size,
|
|
399
|
+
connsWithPersistChangedIds: Array.from(
|
|
400
|
+
this.#actor.connectionManager.connsWithPersistChanged,
|
|
401
|
+
),
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
try {
|
|
405
|
+
this.#lastSaveTime = Date.now();
|
|
406
|
+
|
|
407
|
+
// Check if either actor state or connections have changed
|
|
408
|
+
const hasChanges =
|
|
409
|
+
this.#persistChanged ||
|
|
410
|
+
this.#actor.connectionManager.connsWithPersistChanged.size > 0;
|
|
411
|
+
|
|
412
|
+
if (hasChanges) {
|
|
413
|
+
await this.#persistWriteQueue.enqueue(async () => {
|
|
414
|
+
this.#actor.rLog.debug({
|
|
415
|
+
msg: "saving persist",
|
|
416
|
+
actorChanged: this.#persistChanged,
|
|
417
|
+
connectionsChanged:
|
|
418
|
+
this.#actor.connectionManager
|
|
419
|
+
.connsWithPersistChanged.size,
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
const entries: Array<[Uint8Array, Uint8Array]> = [];
|
|
423
|
+
|
|
424
|
+
// Build actor entries
|
|
425
|
+
if (this.#persistChanged) {
|
|
426
|
+
this.#persistChanged = false;
|
|
427
|
+
const bareData = convertActorToBarePersisted<S, I>(
|
|
428
|
+
this.#persistRaw,
|
|
429
|
+
);
|
|
430
|
+
entries.push([
|
|
431
|
+
KEYS.PERSIST_DATA,
|
|
432
|
+
ACTOR_VERSIONED.serializeWithEmbeddedVersion(
|
|
433
|
+
bareData,
|
|
434
|
+
ACTOR_PERSIST_CURRENT_VERSION,
|
|
435
|
+
),
|
|
436
|
+
]);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// Build connection entries
|
|
440
|
+
const connections: Array<AnyConn> = [];
|
|
441
|
+
for (const connId of this.#actor.connectionManager
|
|
442
|
+
.connsWithPersistChanged) {
|
|
443
|
+
const conn = this.#actor.conns.get(connId);
|
|
444
|
+
if (!conn) {
|
|
445
|
+
this.#actor.rLog.warn({
|
|
446
|
+
msg: "connection not found in conns map",
|
|
447
|
+
connId,
|
|
448
|
+
});
|
|
449
|
+
continue;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
const connStateManager =
|
|
453
|
+
conn[CONN_STATE_MANAGER_SYMBOL];
|
|
454
|
+
const hibernatableDataRaw =
|
|
455
|
+
connStateManager.hibernatableDataRaw;
|
|
456
|
+
if (!hibernatableDataRaw) {
|
|
457
|
+
this.#actor.log.warn({
|
|
458
|
+
msg: "missing raw hibernatable data for conn in getChangedConnectionsData",
|
|
459
|
+
connId: conn.id,
|
|
460
|
+
});
|
|
461
|
+
continue;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
this.#actor.rLog.info({
|
|
465
|
+
msg: "persisting connection",
|
|
466
|
+
connId,
|
|
467
|
+
gatewayId: idToStr(hibernatableDataRaw.gatewayId),
|
|
468
|
+
requestId: idToStr(hibernatableDataRaw.requestId),
|
|
469
|
+
serverMessageIndex:
|
|
470
|
+
hibernatableDataRaw.serverMessageIndex,
|
|
471
|
+
clientMessageIndex:
|
|
472
|
+
hibernatableDataRaw.clientMessageIndex,
|
|
473
|
+
hasState: hibernatableDataRaw.state !== undefined,
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
const bareData = convertConnToBarePersistedConn<CP, CS>(
|
|
477
|
+
hibernatableDataRaw,
|
|
478
|
+
);
|
|
479
|
+
const connData =
|
|
480
|
+
CONN_VERSIONED.serializeWithEmbeddedVersion(
|
|
481
|
+
bareData,
|
|
482
|
+
ACTOR_PERSIST_CURRENT_VERSION,
|
|
483
|
+
);
|
|
484
|
+
|
|
485
|
+
entries.push([makeConnKey(connId), connData]);
|
|
486
|
+
connections.push(conn);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
this.#actor.rLog.info({
|
|
490
|
+
msg: "prepared entries for kvBatchPut",
|
|
491
|
+
totalEntries: entries.length,
|
|
492
|
+
connectionEntries: connections.length,
|
|
493
|
+
connectionIds: connections.map((c) => c.id),
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
// Notify driver before persisting connections
|
|
497
|
+
if (this.#actorDriver.onBeforePersistConn) {
|
|
498
|
+
for (const conn of connections) {
|
|
499
|
+
this.#actorDriver.onBeforePersistConn(conn);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
// Clear changed connections
|
|
504
|
+
this.#actor.connectionManager.clearConnWithPersistChanged();
|
|
505
|
+
|
|
506
|
+
// Write data
|
|
507
|
+
this.#actor.rLog.info({
|
|
508
|
+
msg: "calling kvBatchPut",
|
|
509
|
+
actorId: this.#actor.id,
|
|
510
|
+
entriesCount: entries.length,
|
|
511
|
+
});
|
|
512
|
+
await this.#actorDriver.kvBatchPut(this.#actor.id, entries);
|
|
513
|
+
this.#actor.rLog.info({
|
|
514
|
+
msg: "kvBatchPut completed successfully",
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
// Notify driver after persisting connections
|
|
518
|
+
if (this.#actorDriver.onAfterPersistConn) {
|
|
519
|
+
for (const conn of connections) {
|
|
520
|
+
this.#actorDriver.onAfterPersistConn(conn);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
this.#actor.rLog.debug({ msg: "persist saved" });
|
|
525
|
+
});
|
|
526
|
+
} else {
|
|
527
|
+
this.#actor.rLog.info({
|
|
528
|
+
msg: "savePersistInner skipped - no changes",
|
|
529
|
+
});
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
this.#onPersistSavedPromise?.resolve();
|
|
533
|
+
} catch (error) {
|
|
534
|
+
this.#actor.rLog.error({
|
|
535
|
+
msg: "error saving persist",
|
|
536
|
+
error: stringifyError(error),
|
|
537
|
+
});
|
|
538
|
+
this.#onPersistSavedPromise?.reject(error);
|
|
539
|
+
throw error;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import type { TracesDriver } from "@rivetkit/traces";
|
|
2
|
+
import type { ActorDriver } from "../driver";
|
|
3
|
+
import { tracesStoragePrefix } from "./keys";
|
|
4
|
+
|
|
5
|
+
function concatPrefix(prefix: Uint8Array, key: Uint8Array): Uint8Array {
|
|
6
|
+
const merged = new Uint8Array(prefix.length + key.length);
|
|
7
|
+
merged.set(prefix, 0);
|
|
8
|
+
merged.set(key, prefix.length);
|
|
9
|
+
return merged;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function stripPrefix(prefix: Uint8Array, key: Uint8Array): Uint8Array {
|
|
13
|
+
return key.slice(prefix.length);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function compareBytes(a: Uint8Array, b: Uint8Array): number {
|
|
17
|
+
const len = Math.min(a.length, b.length);
|
|
18
|
+
for (let i = 0; i < len; i++) {
|
|
19
|
+
if (a[i] !== b[i]) {
|
|
20
|
+
return a[i] - b[i];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return a.length - b.length;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export class ActorTracesDriver implements TracesDriver {
|
|
27
|
+
#driver: ActorDriver;
|
|
28
|
+
#actorId: string;
|
|
29
|
+
#prefix: Uint8Array;
|
|
30
|
+
|
|
31
|
+
constructor(driver: ActorDriver, actorId: string) {
|
|
32
|
+
this.#driver = driver;
|
|
33
|
+
this.#actorId = actorId;
|
|
34
|
+
this.#prefix = tracesStoragePrefix();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async get(key: Uint8Array): Promise<Uint8Array | null> {
|
|
38
|
+
const [value] = await this.#driver.kvBatchGet(this.#actorId, [
|
|
39
|
+
concatPrefix(this.#prefix, key),
|
|
40
|
+
]);
|
|
41
|
+
return value ?? null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async set(key: Uint8Array, value: Uint8Array): Promise<void> {
|
|
45
|
+
await this.#driver.kvBatchPut(this.#actorId, [
|
|
46
|
+
[concatPrefix(this.#prefix, key), value],
|
|
47
|
+
]);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async delete(key: Uint8Array): Promise<void> {
|
|
51
|
+
await this.#driver.kvBatchDelete(this.#actorId, [
|
|
52
|
+
concatPrefix(this.#prefix, key),
|
|
53
|
+
]);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async deletePrefix(prefix: Uint8Array): Promise<void> {
|
|
57
|
+
const fullPrefix = concatPrefix(this.#prefix, prefix);
|
|
58
|
+
const entries = await this.#driver.kvListPrefix(
|
|
59
|
+
this.#actorId,
|
|
60
|
+
fullPrefix,
|
|
61
|
+
);
|
|
62
|
+
if (entries.length === 0) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
await this.#driver.kvBatchDelete(
|
|
66
|
+
this.#actorId,
|
|
67
|
+
entries.map(([key]) => key),
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async list(
|
|
72
|
+
prefix: Uint8Array,
|
|
73
|
+
): Promise<Array<{ key: Uint8Array; value: Uint8Array }>> {
|
|
74
|
+
const fullPrefix = concatPrefix(this.#prefix, prefix);
|
|
75
|
+
const entries = await this.#driver.kvListPrefix(
|
|
76
|
+
this.#actorId,
|
|
77
|
+
fullPrefix,
|
|
78
|
+
);
|
|
79
|
+
return entries.map(([key, value]) => ({
|
|
80
|
+
key: stripPrefix(this.#prefix, key),
|
|
81
|
+
value,
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async listRange(
|
|
86
|
+
start: Uint8Array,
|
|
87
|
+
end: Uint8Array,
|
|
88
|
+
options?: { reverse?: boolean; limit?: number },
|
|
89
|
+
): Promise<Array<{ key: Uint8Array; value: Uint8Array }>> {
|
|
90
|
+
const fullStart = concatPrefix(this.#prefix, start);
|
|
91
|
+
const fullEnd = concatPrefix(this.#prefix, end);
|
|
92
|
+
const entries = await this.#driver.kvListPrefix(
|
|
93
|
+
this.#actorId,
|
|
94
|
+
this.#prefix,
|
|
95
|
+
);
|
|
96
|
+
const filtered = entries
|
|
97
|
+
.filter(([key]) => {
|
|
98
|
+
return (
|
|
99
|
+
compareBytes(key, fullStart) >= 0 &&
|
|
100
|
+
compareBytes(key, fullEnd) < 0
|
|
101
|
+
);
|
|
102
|
+
})
|
|
103
|
+
.sort(([keyA], [keyB]) => compareBytes(keyA, keyB));
|
|
104
|
+
if (options?.reverse) {
|
|
105
|
+
filtered.reverse();
|
|
106
|
+
}
|
|
107
|
+
const limited = options?.limit
|
|
108
|
+
? filtered.slice(0, options.limit)
|
|
109
|
+
: filtered;
|
|
110
|
+
return limited.map(([key, value]) => ({
|
|
111
|
+
key: stripPrefix(this.#prefix, key),
|
|
112
|
+
value,
|
|
113
|
+
}));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async batch(writes: Array<{ key: Uint8Array; value: Uint8Array }>): Promise<void> {
|
|
117
|
+
if (writes.length === 0) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
await this.#driver.kvBatchPut(
|
|
121
|
+
this.#actorId,
|
|
122
|
+
writes.map(({ key, value }) => [
|
|
123
|
+
concatPrefix(this.#prefix, key),
|
|
124
|
+
value,
|
|
125
|
+
]),
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
}
|