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,325 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
import type { ActorError } from "@/client/mod";
|
|
3
|
+
import type { DriverTestConfig } from "../mod";
|
|
4
|
+
import { setupDriverTest, waitFor } from "../utils";
|
|
5
|
+
|
|
6
|
+
export function runActorQueueTests(driverTestConfig: DriverTestConfig) {
|
|
7
|
+
describe("Actor Queue Tests", () => {
|
|
8
|
+
test("client can send to actor queue", async (c) => {
|
|
9
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
10
|
+
const handle = client.queueActor.getOrCreate(["client-send"]);
|
|
11
|
+
|
|
12
|
+
await handle.send("greeting", { hello: "world" });
|
|
13
|
+
|
|
14
|
+
const message = await handle.receiveOne("greeting");
|
|
15
|
+
expect(message).toEqual({
|
|
16
|
+
name: "greeting",
|
|
17
|
+
body: { hello: "world" },
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test("actor can send to its own queue", async (c) => {
|
|
22
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
23
|
+
const handle = client.queueActor.getOrCreate(["self-send"]);
|
|
24
|
+
|
|
25
|
+
await handle.sendToSelf("self", { value: 42 });
|
|
26
|
+
|
|
27
|
+
const message = await handle.receiveOne("self");
|
|
28
|
+
expect(message).toEqual({ name: "self", body: { value: 42 } });
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test("nextBatch supports name arrays and counts", async (c) => {
|
|
32
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
33
|
+
const handle = client.queueActor.getOrCreate(["receive-array"]);
|
|
34
|
+
|
|
35
|
+
await handle.send("a", 1);
|
|
36
|
+
await handle.send("b", 2);
|
|
37
|
+
await handle.send("c", 3);
|
|
38
|
+
|
|
39
|
+
const messages = await handle.receiveMany(["a", "b"], { count: 2 });
|
|
40
|
+
expect(messages).toEqual([
|
|
41
|
+
{ name: "a", body: 1 },
|
|
42
|
+
{ name: "b", body: 2 },
|
|
43
|
+
]);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test("nextBatch supports request objects", async (c) => {
|
|
47
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
48
|
+
const handle = client.queueActor.getOrCreate(["receive-request"]);
|
|
49
|
+
|
|
50
|
+
await handle.send("one", "first");
|
|
51
|
+
await handle.send("two", "second");
|
|
52
|
+
|
|
53
|
+
const messages = await handle.receiveRequest({
|
|
54
|
+
names: ["one", "two"],
|
|
55
|
+
count: 2,
|
|
56
|
+
});
|
|
57
|
+
expect(messages).toEqual([
|
|
58
|
+
{ name: "one", body: "first" },
|
|
59
|
+
{ name: "two", body: "second" },
|
|
60
|
+
]);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test("nextBatch defaults to all names when names is omitted", async (c) => {
|
|
64
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
65
|
+
const handle = client.queueActor.getOrCreate([
|
|
66
|
+
"receive-request-all",
|
|
67
|
+
]);
|
|
68
|
+
|
|
69
|
+
await handle.send("one", "first");
|
|
70
|
+
await handle.send("two", "second");
|
|
71
|
+
|
|
72
|
+
const messages = await handle.receiveRequest({ count: 2 });
|
|
73
|
+
expect(messages).toEqual([
|
|
74
|
+
{ name: "one", body: "first" },
|
|
75
|
+
{ name: "two", body: "second" },
|
|
76
|
+
]);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test("next timeout returns empty array", async (c) => {
|
|
80
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
81
|
+
const handle = client.queueActor.getOrCreate(["receive-timeout"]);
|
|
82
|
+
|
|
83
|
+
const promise = handle.receiveMany(["missing"], { timeout: 50 });
|
|
84
|
+
await waitFor(driverTestConfig, 60);
|
|
85
|
+
const messages = await promise;
|
|
86
|
+
expect(messages).toEqual([]);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test("tryNextBatch does not wait and returns empty array", async (c) => {
|
|
90
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
91
|
+
const handle = client.queueActor.getOrCreate(["try-next-empty"]);
|
|
92
|
+
|
|
93
|
+
const messages = await handle.tryReceiveMany({
|
|
94
|
+
names: ["missing"],
|
|
95
|
+
count: 1,
|
|
96
|
+
});
|
|
97
|
+
expect(messages).toEqual([]);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
test("abort throws ActorAborted", async (c) => {
|
|
101
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
102
|
+
const handle = client.queueActor.getOrCreate(["abort-test"]);
|
|
103
|
+
|
|
104
|
+
try {
|
|
105
|
+
await handle.waitForAbort();
|
|
106
|
+
expect.fail("expected ActorAborted error");
|
|
107
|
+
} catch (error) {
|
|
108
|
+
expect((error as ActorError).group).toBe("actor");
|
|
109
|
+
expect((error as ActorError).code).toBe("aborted");
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test("next supports signal abort", async (c) => {
|
|
114
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
115
|
+
const handle = client.queueActor.getOrCreate(["signal-abort-next"]);
|
|
116
|
+
|
|
117
|
+
const result = await handle.waitForSignalAbort();
|
|
118
|
+
expect(result).toEqual({
|
|
119
|
+
group: "actor",
|
|
120
|
+
code: "aborted",
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test("next supports actor abort when signal is provided", async (c) => {
|
|
125
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
126
|
+
const handle = client.queueActor.getOrCreate([
|
|
127
|
+
"actor-abort-with-signal-next",
|
|
128
|
+
]);
|
|
129
|
+
|
|
130
|
+
const result = await handle.waitForActorAbortWithSignal();
|
|
131
|
+
expect(result).toEqual({
|
|
132
|
+
group: "actor",
|
|
133
|
+
code: "aborted",
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
test("iter supports signal abort", async (c) => {
|
|
138
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
139
|
+
const handle = client.queueActor.getOrCreate(["signal-abort-iter"]);
|
|
140
|
+
|
|
141
|
+
const result = await handle.iterWithSignalAbort();
|
|
142
|
+
expect(result).toEqual({ ok: true });
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test("enforces queue size limit", async (c) => {
|
|
146
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
147
|
+
const key = `size-limit-${Date.now()}-${Math.random().toString(16).slice(2)}`;
|
|
148
|
+
const handle = client.queueLimitedActor.getOrCreate([key]);
|
|
149
|
+
|
|
150
|
+
await handle.send("message", 1);
|
|
151
|
+
|
|
152
|
+
await waitFor(driverTestConfig, 10);
|
|
153
|
+
|
|
154
|
+
try {
|
|
155
|
+
await handle.send("message", 2);
|
|
156
|
+
expect.fail("expected queue full error");
|
|
157
|
+
} catch (error) {
|
|
158
|
+
expect(error).toBeInstanceOf(Error);
|
|
159
|
+
expect((error as Error).message).toContain(
|
|
160
|
+
"Queue is full. Limit is",
|
|
161
|
+
);
|
|
162
|
+
if (driverTestConfig.clientType !== "http") {
|
|
163
|
+
expect((error as ActorError).group).toBe("queue");
|
|
164
|
+
expect((error as ActorError).code).toBe("full");
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
test("enforces message size limit", async (c) => {
|
|
170
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
171
|
+
const handle = client.queueLimitedActor.getOrCreate([
|
|
172
|
+
"message-limit",
|
|
173
|
+
]);
|
|
174
|
+
const largePayload = "a".repeat(200);
|
|
175
|
+
|
|
176
|
+
try {
|
|
177
|
+
await handle.send("oversize", largePayload);
|
|
178
|
+
expect.fail("expected message_too_large error");
|
|
179
|
+
} catch (error) {
|
|
180
|
+
expect((error as ActorError).group).toBe("queue");
|
|
181
|
+
expect((error as ActorError).code).toBe("message_too_large");
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
test("wait send returns completion response", async (c) => {
|
|
186
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
187
|
+
const handle = client.queueActor.getOrCreate(["wait-complete"]);
|
|
188
|
+
const waitTimeout = driverTestConfig.useRealTimers ? 5_000 : 1_000;
|
|
189
|
+
|
|
190
|
+
const actionPromise = handle.receiveAndComplete("tasks");
|
|
191
|
+
const result = await handle.send("tasks",
|
|
192
|
+
{ value: 123 },
|
|
193
|
+
{ wait: true, timeout: waitTimeout },
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
await actionPromise;
|
|
197
|
+
expect(result).toEqual({
|
|
198
|
+
status: "completed",
|
|
199
|
+
response: { echo: { value: 123 } },
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
test("wait send times out", async (c) => {
|
|
204
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
205
|
+
const handle = client.queueActor.getOrCreate(["wait-timeout"]);
|
|
206
|
+
|
|
207
|
+
const resultPromise = handle.send("timeout",
|
|
208
|
+
{ value: 456 },
|
|
209
|
+
{ wait: true, timeout: 50 },
|
|
210
|
+
);
|
|
211
|
+
|
|
212
|
+
await waitFor(driverTestConfig, 60);
|
|
213
|
+
const result = await resultPromise;
|
|
214
|
+
|
|
215
|
+
expect(result.status).toBe("timedOut");
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
test("manual receive retries message when not completed", async (c) => {
|
|
219
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
220
|
+
const handle = client.queueActor.getOrCreate([
|
|
221
|
+
"manual-retry-uncompleted",
|
|
222
|
+
]);
|
|
223
|
+
|
|
224
|
+
await handle.send("tasks", { value: 789 });
|
|
225
|
+
const first = await handle.receiveWithoutComplete("tasks");
|
|
226
|
+
expect(first).toEqual({ name: "tasks", body: { value: 789 } });
|
|
227
|
+
|
|
228
|
+
const retried = await handle.receiveOne("tasks", { timeout: 1_000 });
|
|
229
|
+
expect(retried).toEqual({ name: "tasks", body: { value: 789 } });
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
test("next throws when previous manual message is not completed", async (c) => {
|
|
233
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
234
|
+
const handle = client.queueActor.getOrCreate([
|
|
235
|
+
"manual-next-requires-complete",
|
|
236
|
+
]);
|
|
237
|
+
|
|
238
|
+
await handle.send("tasks", { value: 111 });
|
|
239
|
+
const result = await handle.receiveManualThenNextWithoutComplete(
|
|
240
|
+
"tasks",
|
|
241
|
+
);
|
|
242
|
+
expect(result).toEqual({
|
|
243
|
+
group: "queue",
|
|
244
|
+
code: "previous_message_not_completed",
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
test("manual receive includes complete even without completion schema", async (c) => {
|
|
249
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
250
|
+
const handle = client.queueActor.getOrCreate([
|
|
251
|
+
"complete-not-allowed",
|
|
252
|
+
]);
|
|
253
|
+
|
|
254
|
+
await handle.send("nowait", { value: "test" });
|
|
255
|
+
const result = await handle.receiveWithoutCompleteMethod("nowait");
|
|
256
|
+
|
|
257
|
+
expect(result).toEqual({
|
|
258
|
+
hasComplete: true,
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
test("manual receive retries queues without completion schema until completed", async (c) => {
|
|
263
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
264
|
+
const handle = client.queueActor.getOrCreate([
|
|
265
|
+
"complete-not-allowed-consume",
|
|
266
|
+
]);
|
|
267
|
+
|
|
268
|
+
await handle.send("nowait", { value: "test" });
|
|
269
|
+
const result = await handle.receiveWithoutCompleteMethod("nowait");
|
|
270
|
+
expect(result).toEqual({ hasComplete: true });
|
|
271
|
+
|
|
272
|
+
const next = await handle.receiveOne("nowait", { timeout: 1_000 });
|
|
273
|
+
expect(next).toEqual({ name: "nowait", body: { value: "test" } });
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
test("complete throws when called twice", async (c) => {
|
|
277
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
278
|
+
const handle = client.queueActor.getOrCreate([
|
|
279
|
+
"complete-twice",
|
|
280
|
+
]);
|
|
281
|
+
|
|
282
|
+
await handle.send("twice", { value: "test" });
|
|
283
|
+
const result = await handle.receiveAndCompleteTwice("twice");
|
|
284
|
+
|
|
285
|
+
expect(result).toEqual({
|
|
286
|
+
group: "queue",
|
|
287
|
+
code: "already_completed",
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
test("wait send no longer requires queue completion schema", async (c) => {
|
|
292
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
293
|
+
const handle = client.queueActor.getOrCreate([
|
|
294
|
+
"missing-completion-schema",
|
|
295
|
+
]);
|
|
296
|
+
|
|
297
|
+
const result = await handle.send(
|
|
298
|
+
"nowait",
|
|
299
|
+
{ value: "test" },
|
|
300
|
+
{ wait: true, timeout: 50 },
|
|
301
|
+
);
|
|
302
|
+
expect(result).toEqual({ status: "timedOut" });
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
test("iter can consume queued messages", async (c) => {
|
|
306
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
307
|
+
const handle = client.queueActor.getOrCreate(["iter-consume"]);
|
|
308
|
+
|
|
309
|
+
await handle.send("one", "first");
|
|
310
|
+
const message = await handle.receiveWithIterator("one");
|
|
311
|
+
expect(message).toEqual({ name: "one", body: "first" });
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
test("queue async iterator can consume queued messages", async (c) => {
|
|
315
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
316
|
+
const handle = client.queueActor.getOrCreate([
|
|
317
|
+
"async-iter-consume",
|
|
318
|
+
]);
|
|
319
|
+
|
|
320
|
+
await handle.send("two", "second");
|
|
321
|
+
const message = await handle.receiveWithAsyncIterator();
|
|
322
|
+
expect(message).toEqual({ name: "two", body: "second" });
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
import { RUN_SLEEP_TIMEOUT } from "../../../fixtures/driver-test-suite/run";
|
|
3
|
+
import type { DriverTestConfig } from "../mod";
|
|
4
|
+
import { setupDriverTest, waitFor } from "../utils";
|
|
5
|
+
|
|
6
|
+
export function runActorRunTests(driverTestConfig: DriverTestConfig) {
|
|
7
|
+
describe.skipIf(driverTestConfig.skip?.sleep)("Actor Run Tests", () => {
|
|
8
|
+
test("run handler starts after actor startup", async (c) => {
|
|
9
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
10
|
+
|
|
11
|
+
const actor = client.runWithTicks.getOrCreate(["run-starts"]);
|
|
12
|
+
|
|
13
|
+
// Wait a bit for run handler to start
|
|
14
|
+
await waitFor(driverTestConfig, 100);
|
|
15
|
+
|
|
16
|
+
const state = await actor.getState();
|
|
17
|
+
expect(state.runStarted).toBe(true);
|
|
18
|
+
expect(state.tickCount).toBeGreaterThan(0);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test("run handler ticks continuously", async (c) => {
|
|
22
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
23
|
+
|
|
24
|
+
const actor = client.runWithTicks.getOrCreate(["run-ticks"]);
|
|
25
|
+
|
|
26
|
+
// Wait for some ticks
|
|
27
|
+
await waitFor(driverTestConfig, 200);
|
|
28
|
+
|
|
29
|
+
const state1 = await actor.getState();
|
|
30
|
+
expect(state1.tickCount).toBeGreaterThan(0);
|
|
31
|
+
|
|
32
|
+
const count1 = state1.tickCount;
|
|
33
|
+
|
|
34
|
+
// Wait more and check tick count increased
|
|
35
|
+
await waitFor(driverTestConfig, 200);
|
|
36
|
+
|
|
37
|
+
const state2 = await actor.getState();
|
|
38
|
+
expect(state2.tickCount).toBeGreaterThan(count1);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test("active run handler keeps actor awake past sleep timeout", async (c) => {
|
|
42
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
43
|
+
|
|
44
|
+
const actor = client.runWithTicks.getOrCreate([
|
|
45
|
+
"run-stays-awake",
|
|
46
|
+
]);
|
|
47
|
+
|
|
48
|
+
// Wait for run to start
|
|
49
|
+
await waitFor(driverTestConfig, 100);
|
|
50
|
+
|
|
51
|
+
const state1 = await actor.getState();
|
|
52
|
+
expect(state1.runStarted).toBe(true);
|
|
53
|
+
const tickCount1 = state1.tickCount;
|
|
54
|
+
|
|
55
|
+
// Active run loops should keep the actor awake.
|
|
56
|
+
await waitFor(driverTestConfig, RUN_SLEEP_TIMEOUT + 300);
|
|
57
|
+
|
|
58
|
+
const state2 = await actor.getState();
|
|
59
|
+
expect(state2.runStarted).toBe(true);
|
|
60
|
+
expect(state2.runExited).toBe(false);
|
|
61
|
+
expect(state2.tickCount).toBeGreaterThan(tickCount1);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
test("actor without run handler works normally", async (c) => {
|
|
65
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
66
|
+
|
|
67
|
+
const actor = client.runWithoutHandler.getOrCreate([
|
|
68
|
+
"no-run-handler",
|
|
69
|
+
]);
|
|
70
|
+
|
|
71
|
+
const state = await actor.getState();
|
|
72
|
+
expect(state.wakeCount).toBe(1);
|
|
73
|
+
|
|
74
|
+
// Wait for sleep and wake again
|
|
75
|
+
await waitFor(driverTestConfig, RUN_SLEEP_TIMEOUT + 300);
|
|
76
|
+
|
|
77
|
+
const state2 = await actor.getState();
|
|
78
|
+
expect(state2.wakeCount).toBe(2);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
test("run handler can consume from queue", async (c) => {
|
|
82
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
83
|
+
|
|
84
|
+
const actor = client.runWithQueueConsumer.getOrCreate([
|
|
85
|
+
"queue-consumer",
|
|
86
|
+
]);
|
|
87
|
+
|
|
88
|
+
// Wait for run handler to start
|
|
89
|
+
await waitFor(driverTestConfig, 100);
|
|
90
|
+
|
|
91
|
+
// Send some messages to the queue
|
|
92
|
+
await actor.sendMessage({ type: "test", value: 1 });
|
|
93
|
+
await actor.sendMessage({ type: "test", value: 2 });
|
|
94
|
+
await actor.sendMessage({ type: "test", value: 3 });
|
|
95
|
+
|
|
96
|
+
// Wait for messages to be consumed
|
|
97
|
+
await waitFor(driverTestConfig, 1200);
|
|
98
|
+
|
|
99
|
+
const state = await actor.getState();
|
|
100
|
+
expect(state.runStarted).toBe(true);
|
|
101
|
+
expect(state.messagesReceived.length).toBe(3);
|
|
102
|
+
expect(state.messagesReceived[0].body).toEqual({
|
|
103
|
+
type: "test",
|
|
104
|
+
value: 1,
|
|
105
|
+
});
|
|
106
|
+
expect(state.messagesReceived[1].body).toEqual({
|
|
107
|
+
type: "test",
|
|
108
|
+
value: 2,
|
|
109
|
+
});
|
|
110
|
+
expect(state.messagesReceived[2].body).toEqual({
|
|
111
|
+
type: "test",
|
|
112
|
+
value: 3,
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test("queue-waiting run handler can sleep and resume", async (c) => {
|
|
117
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
118
|
+
|
|
119
|
+
const actor = client.runWithQueueConsumer.getOrCreate([
|
|
120
|
+
"queue-consumer-sleep",
|
|
121
|
+
]);
|
|
122
|
+
|
|
123
|
+
await waitFor(driverTestConfig, 100);
|
|
124
|
+
const state1 = await actor.getState();
|
|
125
|
+
expect(state1.runStarted).toBe(true);
|
|
126
|
+
|
|
127
|
+
await waitFor(driverTestConfig, RUN_SLEEP_TIMEOUT + 500);
|
|
128
|
+
const state2 = await actor.getState();
|
|
129
|
+
|
|
130
|
+
expect(state2.wakeCount).toBeGreaterThan(state1.wakeCount);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
test("run handler that exits early triggers destroy", async (c) => {
|
|
134
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
135
|
+
|
|
136
|
+
const actor = client.runWithEarlyExit.getOrCreate(["early-exit"]);
|
|
137
|
+
|
|
138
|
+
// Wait for run to start and exit
|
|
139
|
+
await waitFor(driverTestConfig, 100);
|
|
140
|
+
|
|
141
|
+
const state1 = await actor.getState();
|
|
142
|
+
expect(state1.runStarted).toBe(true);
|
|
143
|
+
|
|
144
|
+
// Wait for the actor to be destroyed
|
|
145
|
+
await waitFor(driverTestConfig, 300);
|
|
146
|
+
|
|
147
|
+
// After the run handler exits early, the actor should be destroyed.
|
|
148
|
+
// Depending on the driver, it may be in a destroyed state or recreated.
|
|
149
|
+
// In the file-system driver test environment, the actor is not automatically
|
|
150
|
+
// rescheduled, so we just verify the initial behavior worked.
|
|
151
|
+
// A new getOrCreate should create a fresh actor.
|
|
152
|
+
const actor2 = client.runWithEarlyExit.getOrCreate([
|
|
153
|
+
"early-exit-fresh",
|
|
154
|
+
]);
|
|
155
|
+
const state2 = await actor2.getState();
|
|
156
|
+
expect(state2.runStarted).toBe(true);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test("run handler that throws error triggers destroy", async (c) => {
|
|
160
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
161
|
+
|
|
162
|
+
const actor = client.runWithError.getOrCreate(["run-error"]);
|
|
163
|
+
|
|
164
|
+
// Wait for run to start and throw
|
|
165
|
+
await waitFor(driverTestConfig, 100);
|
|
166
|
+
|
|
167
|
+
const state1 = await actor.getState();
|
|
168
|
+
expect(state1.runStarted).toBe(true);
|
|
169
|
+
|
|
170
|
+
// Wait for the actor to be destroyed
|
|
171
|
+
await waitFor(driverTestConfig, 300);
|
|
172
|
+
|
|
173
|
+
// After the run handler throws, the actor should be destroyed.
|
|
174
|
+
// Similar to the early exit test, the driver may not automatically reschedule.
|
|
175
|
+
// A new getOrCreate should create a fresh actor.
|
|
176
|
+
const actor2 = client.runWithError.getOrCreate(["run-error-fresh"]);
|
|
177
|
+
const state2 = await actor2.getState();
|
|
178
|
+
expect(state2.runStarted).toBe(true);
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
import type { DriverTestConfig } from "../mod";
|
|
3
|
+
import { setupDriverTest, waitFor } from "../utils";
|
|
4
|
+
|
|
5
|
+
export function runActorScheduleTests(driverTestConfig: DriverTestConfig) {
|
|
6
|
+
describe.skipIf(driverTestConfig.skip?.schedule)(
|
|
7
|
+
"Actor Schedule Tests",
|
|
8
|
+
() => {
|
|
9
|
+
// See alarm + actor sleeping test in actor-sleep.ts
|
|
10
|
+
|
|
11
|
+
describe("Scheduled Alarms", () => {
|
|
12
|
+
test("executes c.schedule.at() with specific timestamp", async (c) => {
|
|
13
|
+
const { client } = await setupDriverTest(
|
|
14
|
+
c,
|
|
15
|
+
driverTestConfig,
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
// Create instance
|
|
19
|
+
const scheduled = client.scheduled.getOrCreate();
|
|
20
|
+
|
|
21
|
+
// Schedule a task to run using timestamp
|
|
22
|
+
const timestamp = Date.now() + 250;
|
|
23
|
+
await scheduled.scheduleTaskAt(timestamp);
|
|
24
|
+
|
|
25
|
+
// Wait for longer than the scheduled time
|
|
26
|
+
await waitFor(driverTestConfig, 500);
|
|
27
|
+
|
|
28
|
+
// Verify the scheduled task ran
|
|
29
|
+
const lastRun = await scheduled.getLastRun();
|
|
30
|
+
const scheduledCount = await scheduled.getScheduledCount();
|
|
31
|
+
|
|
32
|
+
expect(lastRun).toBeGreaterThan(0);
|
|
33
|
+
expect(scheduledCount).toBe(1);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test("executes c.schedule.after() with delay", async (c) => {
|
|
37
|
+
const { client } = await setupDriverTest(
|
|
38
|
+
c,
|
|
39
|
+
driverTestConfig,
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
// Create instance
|
|
43
|
+
const scheduled = client.scheduled.getOrCreate();
|
|
44
|
+
|
|
45
|
+
// Schedule a task to run using delay
|
|
46
|
+
await scheduled.scheduleTaskAfter(250);
|
|
47
|
+
|
|
48
|
+
// Wait for longer than the scheduled time
|
|
49
|
+
await waitFor(driverTestConfig, 500);
|
|
50
|
+
|
|
51
|
+
// Verify the scheduled task ran
|
|
52
|
+
const lastRun = await scheduled.getLastRun();
|
|
53
|
+
const scheduledCount = await scheduled.getScheduledCount();
|
|
54
|
+
|
|
55
|
+
expect(lastRun).toBeGreaterThan(0);
|
|
56
|
+
expect(scheduledCount).toBe(1);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test("multiple scheduled tasks execute in order", async (c) => {
|
|
60
|
+
const { client } = await setupDriverTest(
|
|
61
|
+
c,
|
|
62
|
+
driverTestConfig,
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
// Create instance
|
|
66
|
+
const scheduled = client.scheduled.getOrCreate();
|
|
67
|
+
|
|
68
|
+
// Reset history to start fresh
|
|
69
|
+
await scheduled.clearHistory();
|
|
70
|
+
|
|
71
|
+
// Schedule multiple tasks with different delays
|
|
72
|
+
await scheduled.scheduleTaskAfterWithId("first", 250);
|
|
73
|
+
await scheduled.scheduleTaskAfterWithId("second", 750);
|
|
74
|
+
await scheduled.scheduleTaskAfterWithId("third", 1250);
|
|
75
|
+
|
|
76
|
+
// Wait for first task only
|
|
77
|
+
await waitFor(driverTestConfig, 500);
|
|
78
|
+
const history1 = await scheduled.getTaskHistory();
|
|
79
|
+
expect(history1[0]).toBe("first");
|
|
80
|
+
|
|
81
|
+
// Wait for second task
|
|
82
|
+
await waitFor(driverTestConfig, 500);
|
|
83
|
+
const history2 = await scheduled.getTaskHistory();
|
|
84
|
+
expect(history2.slice(0, 2)).toEqual([
|
|
85
|
+
"first",
|
|
86
|
+
"second",
|
|
87
|
+
]);
|
|
88
|
+
|
|
89
|
+
// Wait for third task
|
|
90
|
+
await waitFor(driverTestConfig, 500);
|
|
91
|
+
const history3 = await scheduled.getTaskHistory();
|
|
92
|
+
expect(history3).toEqual(["first", "second", "third"]);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
},
|
|
96
|
+
);
|
|
97
|
+
}
|