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,2601 @@
|
|
|
1
|
+
import {
|
|
2
|
+
hibernationActor,
|
|
3
|
+
logger,
|
|
4
|
+
runWithEarlyExit,
|
|
5
|
+
runWithError,
|
|
6
|
+
runWithQueueConsumer,
|
|
7
|
+
runWithTicks,
|
|
8
|
+
runWithoutHandler,
|
|
9
|
+
sleep,
|
|
10
|
+
sleepWithLongRpc,
|
|
11
|
+
sleepWithNoSleepOption,
|
|
12
|
+
sleepWithRawHttp,
|
|
13
|
+
sleepWithRawWebSocket,
|
|
14
|
+
workflowAccessActor,
|
|
15
|
+
workflowCounterActor,
|
|
16
|
+
workflowQueueActor,
|
|
17
|
+
workflowSleepActor,
|
|
18
|
+
workflowStopTeardownActor
|
|
19
|
+
} from "../chunk-D4BYUPNQ.js";
|
|
20
|
+
import "../chunk-WMPW7JYC.js";
|
|
21
|
+
import "../chunk-Z7HNQ2WF.js";
|
|
22
|
+
import {
|
|
23
|
+
db as db2,
|
|
24
|
+
integer,
|
|
25
|
+
mod_exports,
|
|
26
|
+
sqliteTable,
|
|
27
|
+
text
|
|
28
|
+
} from "../chunk-VKVNIQRQ.js";
|
|
29
|
+
import {
|
|
30
|
+
actor,
|
|
31
|
+
event,
|
|
32
|
+
queue,
|
|
33
|
+
setup
|
|
34
|
+
} from "../chunk-QUD664YZ.js";
|
|
35
|
+
import {
|
|
36
|
+
createFileSystemOrMemoryDriver
|
|
37
|
+
} from "../chunk-MXNPAB5W.js";
|
|
38
|
+
import "../chunk-K6DGYILQ.js";
|
|
39
|
+
import "../chunk-JEAEA2PB.js";
|
|
40
|
+
import {
|
|
41
|
+
db
|
|
42
|
+
} from "../chunk-KJSYAUOM.js";
|
|
43
|
+
import "../chunk-N4KRDJ56.js";
|
|
44
|
+
import {
|
|
45
|
+
buildManagerRouter
|
|
46
|
+
} from "../chunk-HHXX2VRM.js";
|
|
47
|
+
import "../chunk-LXUQ667X.js";
|
|
48
|
+
import "../chunk-RTOCTWME.js";
|
|
49
|
+
import "../chunk-325TLXJT.js";
|
|
50
|
+
import {
|
|
51
|
+
UserError
|
|
52
|
+
} from "../chunk-7HTNH26M.js";
|
|
53
|
+
import "../chunk-424PT5DM.js";
|
|
54
|
+
|
|
55
|
+
// src/serve-test-suite/mod.ts
|
|
56
|
+
import { createServer } from "net";
|
|
57
|
+
import { fileURLToPath } from "url";
|
|
58
|
+
import { serve as honoServe } from "@hono/node-server";
|
|
59
|
+
import { createNodeWebSocket } from "@hono/node-ws";
|
|
60
|
+
import invariant from "invariant";
|
|
61
|
+
|
|
62
|
+
// fixtures/driver-test-suite/access-control.ts
|
|
63
|
+
import { Forbidden } from "rivetkit/errors";
|
|
64
|
+
var accessControlEvents = {
|
|
65
|
+
allowedEvent: event({
|
|
66
|
+
canSubscribe: (c) => {
|
|
67
|
+
c.state.lastCanSubscribeConnId = c.conn.id;
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
}),
|
|
71
|
+
blockedEvent: event({
|
|
72
|
+
canSubscribe: (c) => {
|
|
73
|
+
c.state.lastCanSubscribeConnId = c.conn.id;
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
})
|
|
77
|
+
};
|
|
78
|
+
var accessControlQueues = {
|
|
79
|
+
allowedQueue: queue({
|
|
80
|
+
canPublish: (c) => {
|
|
81
|
+
c.state.lastCanPublishConnId = c.conn.id;
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
}),
|
|
85
|
+
blockedQueue: queue({
|
|
86
|
+
canPublish: (c) => {
|
|
87
|
+
c.state.lastCanPublishConnId = c.conn.id;
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
})
|
|
91
|
+
};
|
|
92
|
+
var accessControlActor = actor({
|
|
93
|
+
state: {
|
|
94
|
+
lastCanPublishConnId: "",
|
|
95
|
+
lastCanSubscribeConnId: ""
|
|
96
|
+
},
|
|
97
|
+
events: accessControlEvents,
|
|
98
|
+
queues: accessControlQueues,
|
|
99
|
+
onBeforeConnect: (_c, params) => {
|
|
100
|
+
if ((params == null ? void 0 : params.allowRequest) === false || (params == null ? void 0 : params.allowWebSocket) === false) {
|
|
101
|
+
throw new Forbidden();
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
onRequest(_c, request) {
|
|
105
|
+
const url = new URL(request.url);
|
|
106
|
+
if (url.pathname === "/status") {
|
|
107
|
+
return Response.json({ ok: true });
|
|
108
|
+
}
|
|
109
|
+
return new Response("Not Found", { status: 404 });
|
|
110
|
+
},
|
|
111
|
+
onWebSocket(_c, websocket) {
|
|
112
|
+
websocket.send(JSON.stringify({ type: "welcome" }));
|
|
113
|
+
},
|
|
114
|
+
actions: {
|
|
115
|
+
allowedAction: (_c, value) => {
|
|
116
|
+
return `allowed:${value}`;
|
|
117
|
+
},
|
|
118
|
+
allowedGetLastCanPublishConnId: (c) => {
|
|
119
|
+
return c.state.lastCanPublishConnId;
|
|
120
|
+
},
|
|
121
|
+
allowedGetLastCanSubscribeConnId: (c) => {
|
|
122
|
+
return c.state.lastCanSubscribeConnId;
|
|
123
|
+
},
|
|
124
|
+
allowedReceiveQueue: async (c) => {
|
|
125
|
+
const message = await c.queue.tryNext({
|
|
126
|
+
names: ["allowedQueue"]
|
|
127
|
+
});
|
|
128
|
+
return (message == null ? void 0 : message.body) ?? null;
|
|
129
|
+
},
|
|
130
|
+
allowedReceiveAnyQueue: async (c) => {
|
|
131
|
+
const message = await c.queue.tryNext();
|
|
132
|
+
return (message == null ? void 0 : message.body) ?? null;
|
|
133
|
+
},
|
|
134
|
+
allowedBroadcastAllowedEvent: (c, value) => {
|
|
135
|
+
c.broadcast("allowedEvent", { value });
|
|
136
|
+
},
|
|
137
|
+
allowedBroadcastBlockedEvent: (c, value) => {
|
|
138
|
+
c.broadcast("blockedEvent", { value });
|
|
139
|
+
},
|
|
140
|
+
allowedBroadcastUndefinedEvent: (c, value) => {
|
|
141
|
+
c.broadcast("undefinedEvent", { value });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
var accessControlNoQueuesActor = actor({
|
|
146
|
+
state: {},
|
|
147
|
+
actions: {
|
|
148
|
+
readAnyQueue: async (c) => {
|
|
149
|
+
const message = await c.queue.tryNext();
|
|
150
|
+
return (message == null ? void 0 : message.body) ?? null;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
// fixtures/driver-test-suite/action-inputs.ts
|
|
156
|
+
var inputActor = actor({
|
|
157
|
+
createState: (c, input) => {
|
|
158
|
+
return {
|
|
159
|
+
initialInput: input,
|
|
160
|
+
onCreateInput: void 0
|
|
161
|
+
};
|
|
162
|
+
},
|
|
163
|
+
onCreate: (c, input) => {
|
|
164
|
+
c.state.onCreateInput = input;
|
|
165
|
+
},
|
|
166
|
+
actions: {
|
|
167
|
+
getInputs: (c) => {
|
|
168
|
+
return {
|
|
169
|
+
initialInput: c.state.initialInput,
|
|
170
|
+
onCreateInput: c.state.onCreateInput
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
// fixtures/driver-test-suite/action-timeout.ts
|
|
177
|
+
var shortTimeoutActor = actor({
|
|
178
|
+
state: { value: 0 },
|
|
179
|
+
options: {
|
|
180
|
+
actionTimeout: 50
|
|
181
|
+
// 50ms timeout
|
|
182
|
+
},
|
|
183
|
+
actions: {
|
|
184
|
+
quickAction: async (c) => {
|
|
185
|
+
return "quick response";
|
|
186
|
+
},
|
|
187
|
+
slowAction: async (c) => {
|
|
188
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
189
|
+
return "slow response";
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
var longTimeoutActor = actor({
|
|
194
|
+
state: { value: 0 },
|
|
195
|
+
options: {
|
|
196
|
+
actionTimeout: 200
|
|
197
|
+
// 200ms timeout
|
|
198
|
+
},
|
|
199
|
+
actions: {
|
|
200
|
+
delayedAction: async (c) => {
|
|
201
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
202
|
+
return "delayed response";
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
var defaultTimeoutActor = actor({
|
|
207
|
+
state: { value: 0 },
|
|
208
|
+
actions: {
|
|
209
|
+
normalAction: async (c) => {
|
|
210
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
211
|
+
return "normal response";
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
var syncTimeoutActor = actor({
|
|
216
|
+
state: { value: 0 },
|
|
217
|
+
options: {
|
|
218
|
+
actionTimeout: 50
|
|
219
|
+
// 50ms timeout
|
|
220
|
+
},
|
|
221
|
+
actions: {
|
|
222
|
+
syncAction: (c) => {
|
|
223
|
+
return "sync response";
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
// fixtures/driver-test-suite/action-types.ts
|
|
229
|
+
var syncActionActor = actor({
|
|
230
|
+
state: { value: 0 },
|
|
231
|
+
actions: {
|
|
232
|
+
// Simple synchronous action that returns a value directly
|
|
233
|
+
increment: (c, amount = 1) => {
|
|
234
|
+
c.state.value += amount;
|
|
235
|
+
return c.state.value;
|
|
236
|
+
},
|
|
237
|
+
// Synchronous action that returns an object
|
|
238
|
+
getInfo: (c) => {
|
|
239
|
+
return {
|
|
240
|
+
currentValue: c.state.value,
|
|
241
|
+
timestamp: Date.now()
|
|
242
|
+
};
|
|
243
|
+
},
|
|
244
|
+
// Synchronous action with no return value (void)
|
|
245
|
+
reset: (c) => {
|
|
246
|
+
c.state.value = 0;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
var asyncActionActor = actor({
|
|
251
|
+
state: { value: 0, data: null },
|
|
252
|
+
actions: {
|
|
253
|
+
// Async action with a delay
|
|
254
|
+
delayedIncrement: async (c, amount = 1) => {
|
|
255
|
+
await Promise.resolve();
|
|
256
|
+
c.state.value += amount;
|
|
257
|
+
return c.state.value;
|
|
258
|
+
},
|
|
259
|
+
// Async action that simulates an API call
|
|
260
|
+
fetchData: async (c, id) => {
|
|
261
|
+
await Promise.resolve();
|
|
262
|
+
const data = { id, timestamp: Date.now() };
|
|
263
|
+
c.state.data = data;
|
|
264
|
+
return data;
|
|
265
|
+
},
|
|
266
|
+
// Async action with error handling
|
|
267
|
+
asyncWithError: async (c, shouldError) => {
|
|
268
|
+
await Promise.resolve();
|
|
269
|
+
if (shouldError) {
|
|
270
|
+
throw new UserError("Intentional error");
|
|
271
|
+
}
|
|
272
|
+
return "Success";
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
var promiseActor = actor({
|
|
277
|
+
state: { results: [] },
|
|
278
|
+
actions: {
|
|
279
|
+
// Action that returns a resolved promise
|
|
280
|
+
resolvedPromise: (c) => {
|
|
281
|
+
return Promise.resolve("resolved value");
|
|
282
|
+
},
|
|
283
|
+
// Action that returns a promise that resolves after a delay
|
|
284
|
+
delayedPromise: (c) => {
|
|
285
|
+
return new Promise((resolve) => {
|
|
286
|
+
c.state.results.push("delayed");
|
|
287
|
+
resolve("delayed value");
|
|
288
|
+
});
|
|
289
|
+
},
|
|
290
|
+
// Action that returns a rejected promise
|
|
291
|
+
rejectedPromise: (c) => {
|
|
292
|
+
return Promise.reject(new UserError("promised rejection"));
|
|
293
|
+
},
|
|
294
|
+
// Action to check the collected results
|
|
295
|
+
getResults: (c) => {
|
|
296
|
+
return c.state.results;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
// fixtures/driver-test-suite/actor-db-raw.ts
|
|
302
|
+
function firstRowValue(row) {
|
|
303
|
+
if (!row) {
|
|
304
|
+
return void 0;
|
|
305
|
+
}
|
|
306
|
+
const values = Object.values(row);
|
|
307
|
+
return values.length > 0 ? values[0] : void 0;
|
|
308
|
+
}
|
|
309
|
+
function toSafeInteger(value) {
|
|
310
|
+
if (typeof value === "bigint") {
|
|
311
|
+
return Number(value);
|
|
312
|
+
}
|
|
313
|
+
if (typeof value === "number") {
|
|
314
|
+
return Number.isFinite(value) ? Math.trunc(value) : 0;
|
|
315
|
+
}
|
|
316
|
+
if (typeof value === "string") {
|
|
317
|
+
const parsed = Number.parseInt(value, 10);
|
|
318
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
319
|
+
}
|
|
320
|
+
return 0;
|
|
321
|
+
}
|
|
322
|
+
function normalizeRowIds(rowIds) {
|
|
323
|
+
const normalized = rowIds.map((id) => Math.trunc(id)).filter((id) => Number.isFinite(id) && id > 0);
|
|
324
|
+
return Array.from(new Set(normalized));
|
|
325
|
+
}
|
|
326
|
+
function makePayload(size) {
|
|
327
|
+
const normalizedSize = Math.max(0, Math.trunc(size));
|
|
328
|
+
return "x".repeat(normalizedSize);
|
|
329
|
+
}
|
|
330
|
+
var dbActorRaw = actor({
|
|
331
|
+
state: {
|
|
332
|
+
disconnectInsertEnabled: false,
|
|
333
|
+
disconnectInsertDelayMs: 0
|
|
334
|
+
},
|
|
335
|
+
db: db({
|
|
336
|
+
onMigrate: async (db3) => {
|
|
337
|
+
await db3.execute(`
|
|
338
|
+
CREATE TABLE IF NOT EXISTS test_data (
|
|
339
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
340
|
+
value TEXT NOT NULL,
|
|
341
|
+
payload TEXT NOT NULL DEFAULT '',
|
|
342
|
+
created_at INTEGER NOT NULL
|
|
343
|
+
)
|
|
344
|
+
`);
|
|
345
|
+
}
|
|
346
|
+
}),
|
|
347
|
+
onDisconnect: async (c) => {
|
|
348
|
+
if (!c.state.disconnectInsertEnabled) {
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
if (c.state.disconnectInsertDelayMs > 0) {
|
|
352
|
+
await new Promise(
|
|
353
|
+
(resolve) => setTimeout(resolve, c.state.disconnectInsertDelayMs)
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
await c.db.execute(
|
|
357
|
+
`INSERT INTO test_data (value, payload, created_at) VALUES ('__disconnect__', '', ${Date.now()})`
|
|
358
|
+
);
|
|
359
|
+
},
|
|
360
|
+
actions: {
|
|
361
|
+
configureDisconnectInsert: (c, enabled, delayMs) => {
|
|
362
|
+
c.state.disconnectInsertEnabled = enabled;
|
|
363
|
+
c.state.disconnectInsertDelayMs = Math.max(
|
|
364
|
+
0,
|
|
365
|
+
Math.floor(delayMs)
|
|
366
|
+
);
|
|
367
|
+
},
|
|
368
|
+
getDisconnectInsertCount: async (c) => {
|
|
369
|
+
var _a;
|
|
370
|
+
const results = await c.db.execute(
|
|
371
|
+
`SELECT COUNT(*) as count FROM test_data WHERE value = '__disconnect__'`
|
|
372
|
+
);
|
|
373
|
+
return ((_a = results[0]) == null ? void 0 : _a.count) ?? 0;
|
|
374
|
+
},
|
|
375
|
+
reset: async (c) => {
|
|
376
|
+
await c.db.execute(`DELETE FROM test_data`);
|
|
377
|
+
},
|
|
378
|
+
insertValue: async (c, value) => {
|
|
379
|
+
await c.db.execute(
|
|
380
|
+
`INSERT INTO test_data (value, payload, created_at) VALUES ('${value}', '', ${Date.now()})`
|
|
381
|
+
);
|
|
382
|
+
const results = await c.db.execute(
|
|
383
|
+
`SELECT last_insert_rowid() as id`
|
|
384
|
+
);
|
|
385
|
+
return { id: results[0].id };
|
|
386
|
+
},
|
|
387
|
+
getValues: async (c) => {
|
|
388
|
+
const results = await c.db.execute(
|
|
389
|
+
`SELECT * FROM test_data ORDER BY id`
|
|
390
|
+
);
|
|
391
|
+
return results;
|
|
392
|
+
},
|
|
393
|
+
getValue: async (c, id) => {
|
|
394
|
+
var _a;
|
|
395
|
+
const results = await c.db.execute(
|
|
396
|
+
`SELECT value FROM test_data WHERE id = ${id}`
|
|
397
|
+
);
|
|
398
|
+
return ((_a = results[0]) == null ? void 0 : _a.value) ?? null;
|
|
399
|
+
},
|
|
400
|
+
getCount: async (c) => {
|
|
401
|
+
const results = await c.db.execute(
|
|
402
|
+
`SELECT COUNT(*) as count FROM test_data`
|
|
403
|
+
);
|
|
404
|
+
return results[0].count;
|
|
405
|
+
},
|
|
406
|
+
rawSelectCount: async (c) => {
|
|
407
|
+
const results = await c.db.execute(
|
|
408
|
+
`SELECT COUNT(*) as count FROM test_data`
|
|
409
|
+
);
|
|
410
|
+
return results[0].count;
|
|
411
|
+
},
|
|
412
|
+
insertMany: async (c, count) => {
|
|
413
|
+
if (count <= 0) {
|
|
414
|
+
return { count: 0 };
|
|
415
|
+
}
|
|
416
|
+
const now = Date.now();
|
|
417
|
+
const values = [];
|
|
418
|
+
for (let i = 0; i < count; i++) {
|
|
419
|
+
values.push(`('User ${i}', '', ${now})`);
|
|
420
|
+
}
|
|
421
|
+
await c.db.execute(
|
|
422
|
+
`INSERT INTO test_data (value, payload, created_at) VALUES ${values.join(", ")}`
|
|
423
|
+
);
|
|
424
|
+
return { count };
|
|
425
|
+
},
|
|
426
|
+
updateValue: async (c, id, value) => {
|
|
427
|
+
await c.db.execute(
|
|
428
|
+
`UPDATE test_data SET value = '${value}' WHERE id = ${id}`
|
|
429
|
+
);
|
|
430
|
+
return { success: true };
|
|
431
|
+
},
|
|
432
|
+
deleteValue: async (c, id) => {
|
|
433
|
+
await c.db.execute(`DELETE FROM test_data WHERE id = ${id}`);
|
|
434
|
+
},
|
|
435
|
+
transactionCommit: async (c, value) => {
|
|
436
|
+
await c.db.execute(
|
|
437
|
+
`BEGIN; INSERT INTO test_data (value, payload, created_at) VALUES ('${value}', '', ${Date.now()}); COMMIT;`
|
|
438
|
+
);
|
|
439
|
+
},
|
|
440
|
+
transactionRollback: async (c, value) => {
|
|
441
|
+
await c.db.execute(
|
|
442
|
+
`BEGIN; INSERT INTO test_data (value, payload, created_at) VALUES ('${value}', '', ${Date.now()}); ROLLBACK;`
|
|
443
|
+
);
|
|
444
|
+
},
|
|
445
|
+
insertPayloadOfSize: async (c, size) => {
|
|
446
|
+
const payload = "x".repeat(size);
|
|
447
|
+
await c.db.execute(
|
|
448
|
+
`INSERT INTO test_data (value, payload, created_at) VALUES ('payload', '${payload}', ${Date.now()})`
|
|
449
|
+
);
|
|
450
|
+
const results = await c.db.execute(
|
|
451
|
+
`SELECT last_insert_rowid() as id`
|
|
452
|
+
);
|
|
453
|
+
return { id: results[0].id, size };
|
|
454
|
+
},
|
|
455
|
+
getPayloadSize: async (c, id) => {
|
|
456
|
+
var _a;
|
|
457
|
+
const results = await c.db.execute(
|
|
458
|
+
`SELECT length(payload) as size FROM test_data WHERE id = ${id}`
|
|
459
|
+
);
|
|
460
|
+
return ((_a = results[0]) == null ? void 0 : _a.size) ?? 0;
|
|
461
|
+
},
|
|
462
|
+
insertPayloadRows: async (c, count, payloadSize) => {
|
|
463
|
+
const normalizedCount = Math.max(0, Math.trunc(count));
|
|
464
|
+
if (normalizedCount === 0) {
|
|
465
|
+
return { count: 0 };
|
|
466
|
+
}
|
|
467
|
+
const payload = makePayload(payloadSize);
|
|
468
|
+
const now = Date.now();
|
|
469
|
+
for (let i = 0; i < normalizedCount; i++) {
|
|
470
|
+
await c.db.execute(
|
|
471
|
+
`INSERT INTO test_data (value, payload, created_at) VALUES ('bulk-${i}', '${payload}', ${now})`
|
|
472
|
+
);
|
|
473
|
+
}
|
|
474
|
+
return { count: normalizedCount };
|
|
475
|
+
},
|
|
476
|
+
roundRobinUpdateValues: async (c, rowIds, iterations) => {
|
|
477
|
+
const normalizedRowIds = normalizeRowIds(rowIds);
|
|
478
|
+
const normalizedIterations = Math.max(0, Math.trunc(iterations));
|
|
479
|
+
if (normalizedRowIds.length === 0 || normalizedIterations === 0) {
|
|
480
|
+
const emptyRows = [];
|
|
481
|
+
return emptyRows;
|
|
482
|
+
}
|
|
483
|
+
for (let i = 0; i < normalizedIterations; i++) {
|
|
484
|
+
const rowId = normalizedRowIds[i % normalizedRowIds.length] ?? 0;
|
|
485
|
+
await c.db.execute(
|
|
486
|
+
`UPDATE test_data SET value = 'v-${i}' WHERE id = ${rowId}`
|
|
487
|
+
);
|
|
488
|
+
}
|
|
489
|
+
return await c.db.execute(
|
|
490
|
+
`SELECT id, value FROM test_data WHERE id IN (${normalizedRowIds.join(",")}) ORDER BY id`
|
|
491
|
+
);
|
|
492
|
+
},
|
|
493
|
+
getPageCount: async (c) => {
|
|
494
|
+
const rows = await c.db.execute(
|
|
495
|
+
"PRAGMA page_count"
|
|
496
|
+
);
|
|
497
|
+
return toSafeInteger(firstRowValue(rows[0]));
|
|
498
|
+
},
|
|
499
|
+
vacuum: async (c) => {
|
|
500
|
+
await c.db.execute("VACUUM");
|
|
501
|
+
},
|
|
502
|
+
integrityCheck: async (c) => {
|
|
503
|
+
const rows = await c.db.execute(
|
|
504
|
+
"PRAGMA integrity_check"
|
|
505
|
+
);
|
|
506
|
+
const value = firstRowValue(rows[0]);
|
|
507
|
+
return String(value ?? "");
|
|
508
|
+
},
|
|
509
|
+
runMixedWorkload: async (c, seedCount, churnCount) => {
|
|
510
|
+
const normalizedSeedCount = Math.max(1, Math.trunc(seedCount));
|
|
511
|
+
const normalizedChurnCount = Math.max(0, Math.trunc(churnCount));
|
|
512
|
+
const now = Date.now();
|
|
513
|
+
for (let i = 0; i < normalizedSeedCount; i++) {
|
|
514
|
+
const payload = makePayload(1024 + i % 5 * 128);
|
|
515
|
+
await c.db.execute(
|
|
516
|
+
`INSERT OR REPLACE INTO test_data (id, value, payload, created_at) VALUES (${i + 1}, 'seed-${i}', '${payload}', ${now})`
|
|
517
|
+
);
|
|
518
|
+
}
|
|
519
|
+
for (let i = 0; i < normalizedChurnCount; i++) {
|
|
520
|
+
const id = i % normalizedSeedCount + 1;
|
|
521
|
+
if (i % 9 === 0) {
|
|
522
|
+
await c.db.execute(`DELETE FROM test_data WHERE id = ${id}`);
|
|
523
|
+
} else {
|
|
524
|
+
const payload = makePayload(768 + i % 7 * 96);
|
|
525
|
+
await c.db.execute(
|
|
526
|
+
`INSERT OR REPLACE INTO test_data (id, value, payload, created_at) VALUES (${id}, 'upd-${i}', '${payload}', ${now + i})`
|
|
527
|
+
);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
},
|
|
531
|
+
repeatUpdate: async (c, id, count) => {
|
|
532
|
+
let value = "";
|
|
533
|
+
if (count <= 0) {
|
|
534
|
+
return { value };
|
|
535
|
+
}
|
|
536
|
+
const statements = ["BEGIN"];
|
|
537
|
+
for (let i = 0; i < count; i++) {
|
|
538
|
+
value = `Updated ${i}`;
|
|
539
|
+
statements.push(
|
|
540
|
+
`UPDATE test_data SET value = '${value}' WHERE id = ${id}`
|
|
541
|
+
);
|
|
542
|
+
}
|
|
543
|
+
statements.push("COMMIT");
|
|
544
|
+
await c.db.execute(statements.join("; "));
|
|
545
|
+
return { value };
|
|
546
|
+
},
|
|
547
|
+
multiStatementInsert: async (c, value) => {
|
|
548
|
+
var _a;
|
|
549
|
+
await c.db.execute(
|
|
550
|
+
`BEGIN; INSERT INTO test_data (value, payload, created_at) VALUES ('${value}', '', ${Date.now()}); UPDATE test_data SET value = '${value}-updated' WHERE id = last_insert_rowid(); COMMIT;`
|
|
551
|
+
);
|
|
552
|
+
const results = await c.db.execute(
|
|
553
|
+
`SELECT value FROM test_data ORDER BY id DESC LIMIT 1`
|
|
554
|
+
);
|
|
555
|
+
return ((_a = results[0]) == null ? void 0 : _a.value) ?? null;
|
|
556
|
+
},
|
|
557
|
+
triggerSleep: (c) => {
|
|
558
|
+
c.sleep();
|
|
559
|
+
}
|
|
560
|
+
},
|
|
561
|
+
options: {
|
|
562
|
+
actionTimeout: 12e4,
|
|
563
|
+
sleepTimeout: 100
|
|
564
|
+
}
|
|
565
|
+
});
|
|
566
|
+
|
|
567
|
+
// fixtures/driver-test-suite/db/migrations.ts
|
|
568
|
+
var migrations = {
|
|
569
|
+
journal: {
|
|
570
|
+
entries: [
|
|
571
|
+
{
|
|
572
|
+
idx: 0,
|
|
573
|
+
when: 17e11,
|
|
574
|
+
tag: "0000_init",
|
|
575
|
+
breakpoints: false
|
|
576
|
+
}
|
|
577
|
+
]
|
|
578
|
+
},
|
|
579
|
+
migrations: {
|
|
580
|
+
m0000: `
|
|
581
|
+
CREATE TABLE IF NOT EXISTS test_data (
|
|
582
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
583
|
+
value TEXT NOT NULL,
|
|
584
|
+
payload TEXT NOT NULL DEFAULT '',
|
|
585
|
+
created_at INTEGER NOT NULL
|
|
586
|
+
);
|
|
587
|
+
`
|
|
588
|
+
}
|
|
589
|
+
};
|
|
590
|
+
|
|
591
|
+
// fixtures/driver-test-suite/db/schema.ts
|
|
592
|
+
var testData = sqliteTable("test_data", {
|
|
593
|
+
id: integer("id").primaryKey({ autoIncrement: true }),
|
|
594
|
+
value: text("value").notNull(),
|
|
595
|
+
payload: text("payload").notNull().default(""),
|
|
596
|
+
createdAt: integer("created_at").notNull()
|
|
597
|
+
});
|
|
598
|
+
var schema = {
|
|
599
|
+
testData
|
|
600
|
+
};
|
|
601
|
+
|
|
602
|
+
// fixtures/driver-test-suite/actor-db-drizzle.ts
|
|
603
|
+
function firstRowValue2(row) {
|
|
604
|
+
if (!row) {
|
|
605
|
+
return void 0;
|
|
606
|
+
}
|
|
607
|
+
const values = Object.values(row);
|
|
608
|
+
return values.length > 0 ? values[0] : void 0;
|
|
609
|
+
}
|
|
610
|
+
function toSafeInteger2(value) {
|
|
611
|
+
if (typeof value === "bigint") {
|
|
612
|
+
return Number(value);
|
|
613
|
+
}
|
|
614
|
+
if (typeof value === "number") {
|
|
615
|
+
return Number.isFinite(value) ? Math.trunc(value) : 0;
|
|
616
|
+
}
|
|
617
|
+
if (typeof value === "string") {
|
|
618
|
+
const parsed = Number.parseInt(value, 10);
|
|
619
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
620
|
+
}
|
|
621
|
+
return 0;
|
|
622
|
+
}
|
|
623
|
+
function normalizeRowIds2(rowIds) {
|
|
624
|
+
const normalized = rowIds.map((id) => Math.trunc(id)).filter((id) => Number.isFinite(id) && id > 0);
|
|
625
|
+
return Array.from(new Set(normalized));
|
|
626
|
+
}
|
|
627
|
+
function makePayload2(size) {
|
|
628
|
+
const normalizedSize = Math.max(0, Math.trunc(size));
|
|
629
|
+
return "x".repeat(normalizedSize);
|
|
630
|
+
}
|
|
631
|
+
var dbActorDrizzle = actor({
|
|
632
|
+
state: {
|
|
633
|
+
disconnectInsertEnabled: false,
|
|
634
|
+
disconnectInsertDelayMs: 0
|
|
635
|
+
},
|
|
636
|
+
db: db2({
|
|
637
|
+
schema,
|
|
638
|
+
migrations
|
|
639
|
+
}),
|
|
640
|
+
onDisconnect: async (c) => {
|
|
641
|
+
if (!c.state.disconnectInsertEnabled) {
|
|
642
|
+
return;
|
|
643
|
+
}
|
|
644
|
+
if (c.state.disconnectInsertDelayMs > 0) {
|
|
645
|
+
await new Promise(
|
|
646
|
+
(resolve) => setTimeout(resolve, c.state.disconnectInsertDelayMs)
|
|
647
|
+
);
|
|
648
|
+
}
|
|
649
|
+
await c.db.execute(
|
|
650
|
+
`INSERT INTO test_data (value, payload, created_at) VALUES ('__disconnect__', '', ${Date.now()})`
|
|
651
|
+
);
|
|
652
|
+
},
|
|
653
|
+
actions: {
|
|
654
|
+
configureDisconnectInsert: (c, enabled, delayMs) => {
|
|
655
|
+
c.state.disconnectInsertEnabled = enabled;
|
|
656
|
+
c.state.disconnectInsertDelayMs = Math.max(
|
|
657
|
+
0,
|
|
658
|
+
Math.floor(delayMs)
|
|
659
|
+
);
|
|
660
|
+
},
|
|
661
|
+
getDisconnectInsertCount: async (c) => {
|
|
662
|
+
var _a;
|
|
663
|
+
const results = await c.db.execute(
|
|
664
|
+
`SELECT COUNT(*) as count FROM test_data WHERE value = '__disconnect__'`
|
|
665
|
+
);
|
|
666
|
+
return ((_a = results[0]) == null ? void 0 : _a.count) ?? 0;
|
|
667
|
+
},
|
|
668
|
+
reset: async (c) => {
|
|
669
|
+
await c.db.execute(`DELETE FROM test_data`);
|
|
670
|
+
},
|
|
671
|
+
insertValue: async (c, value) => {
|
|
672
|
+
await c.db.execute(
|
|
673
|
+
`INSERT INTO test_data (value, payload, created_at) VALUES ('${value}', '', ${Date.now()})`
|
|
674
|
+
);
|
|
675
|
+
const results = await c.db.execute(
|
|
676
|
+
`SELECT last_insert_rowid() as id`
|
|
677
|
+
);
|
|
678
|
+
return { id: results[0].id };
|
|
679
|
+
},
|
|
680
|
+
getValues: async (c) => {
|
|
681
|
+
const results = await c.db.execute(
|
|
682
|
+
`SELECT * FROM test_data ORDER BY id`
|
|
683
|
+
);
|
|
684
|
+
return results;
|
|
685
|
+
},
|
|
686
|
+
getValue: async (c, id) => {
|
|
687
|
+
var _a;
|
|
688
|
+
const results = await c.db.execute(
|
|
689
|
+
`SELECT value FROM test_data WHERE id = ${id}`
|
|
690
|
+
);
|
|
691
|
+
return ((_a = results[0]) == null ? void 0 : _a.value) ?? null;
|
|
692
|
+
},
|
|
693
|
+
getCount: async (c) => {
|
|
694
|
+
const results = await c.db.execute(
|
|
695
|
+
`SELECT COUNT(*) as count FROM test_data`
|
|
696
|
+
);
|
|
697
|
+
return results[0].count;
|
|
698
|
+
},
|
|
699
|
+
rawSelectCount: async (c) => {
|
|
700
|
+
var _a;
|
|
701
|
+
const results = await c.db.execute(
|
|
702
|
+
`SELECT COUNT(*) as count FROM test_data`
|
|
703
|
+
);
|
|
704
|
+
return ((_a = results[0]) == null ? void 0 : _a.count) ?? 0;
|
|
705
|
+
},
|
|
706
|
+
insertMany: async (c, count) => {
|
|
707
|
+
if (count <= 0) {
|
|
708
|
+
return { count: 0 };
|
|
709
|
+
}
|
|
710
|
+
const now = Date.now();
|
|
711
|
+
const values = [];
|
|
712
|
+
for (let i = 0; i < count; i++) {
|
|
713
|
+
values.push(`('User ${i}', '', ${now})`);
|
|
714
|
+
}
|
|
715
|
+
await c.db.execute(
|
|
716
|
+
`INSERT INTO test_data (value, payload, created_at) VALUES ${values.join(", ")}`
|
|
717
|
+
);
|
|
718
|
+
return { count };
|
|
719
|
+
},
|
|
720
|
+
updateValue: async (c, id, value) => {
|
|
721
|
+
await c.db.execute(
|
|
722
|
+
`UPDATE test_data SET value = '${value}' WHERE id = ${id}`
|
|
723
|
+
);
|
|
724
|
+
return { success: true };
|
|
725
|
+
},
|
|
726
|
+
deleteValue: async (c, id) => {
|
|
727
|
+
await c.db.execute(`DELETE FROM test_data WHERE id = ${id}`);
|
|
728
|
+
},
|
|
729
|
+
transactionCommit: async (c, value) => {
|
|
730
|
+
await c.db.execute(
|
|
731
|
+
`BEGIN; INSERT INTO test_data (value, payload, created_at) VALUES ('${value}', '', ${Date.now()}); COMMIT;`
|
|
732
|
+
);
|
|
733
|
+
},
|
|
734
|
+
transactionRollback: async (c, value) => {
|
|
735
|
+
await c.db.execute(
|
|
736
|
+
`BEGIN; INSERT INTO test_data (value, payload, created_at) VALUES ('${value}', '', ${Date.now()}); ROLLBACK;`
|
|
737
|
+
);
|
|
738
|
+
},
|
|
739
|
+
insertPayloadOfSize: async (c, size) => {
|
|
740
|
+
const payload = "x".repeat(size);
|
|
741
|
+
await c.db.execute(
|
|
742
|
+
`INSERT INTO test_data (value, payload, created_at) VALUES ('payload', '${payload}', ${Date.now()})`
|
|
743
|
+
);
|
|
744
|
+
const results = await c.db.execute(
|
|
745
|
+
`SELECT last_insert_rowid() as id`
|
|
746
|
+
);
|
|
747
|
+
return { id: results[0].id, size };
|
|
748
|
+
},
|
|
749
|
+
getPayloadSize: async (c, id) => {
|
|
750
|
+
var _a;
|
|
751
|
+
const results = await c.db.execute(
|
|
752
|
+
`SELECT length(payload) as size FROM test_data WHERE id = ${id}`
|
|
753
|
+
);
|
|
754
|
+
return ((_a = results[0]) == null ? void 0 : _a.size) ?? 0;
|
|
755
|
+
},
|
|
756
|
+
insertPayloadRows: async (c, count, payloadSize) => {
|
|
757
|
+
const normalizedCount = Math.max(0, Math.trunc(count));
|
|
758
|
+
if (normalizedCount === 0) {
|
|
759
|
+
return { count: 0 };
|
|
760
|
+
}
|
|
761
|
+
const payload = makePayload2(payloadSize);
|
|
762
|
+
const now = Date.now();
|
|
763
|
+
for (let i = 0; i < normalizedCount; i++) {
|
|
764
|
+
await c.db.execute(
|
|
765
|
+
`INSERT INTO test_data (value, payload, created_at) VALUES ('bulk-${i}', '${payload}', ${now})`
|
|
766
|
+
);
|
|
767
|
+
}
|
|
768
|
+
return { count: normalizedCount };
|
|
769
|
+
},
|
|
770
|
+
roundRobinUpdateValues: async (c, rowIds, iterations) => {
|
|
771
|
+
const normalizedRowIds = normalizeRowIds2(rowIds);
|
|
772
|
+
const normalizedIterations = Math.max(0, Math.trunc(iterations));
|
|
773
|
+
if (normalizedRowIds.length === 0 || normalizedIterations === 0) {
|
|
774
|
+
const emptyRows = [];
|
|
775
|
+
return emptyRows;
|
|
776
|
+
}
|
|
777
|
+
for (let i = 0; i < normalizedIterations; i++) {
|
|
778
|
+
const rowId = normalizedRowIds[i % normalizedRowIds.length] ?? 0;
|
|
779
|
+
await c.db.execute(
|
|
780
|
+
`UPDATE test_data SET value = 'v-${i}' WHERE id = ${rowId}`
|
|
781
|
+
);
|
|
782
|
+
}
|
|
783
|
+
return await c.db.execute(
|
|
784
|
+
`SELECT id, value FROM test_data WHERE id IN (${normalizedRowIds.join(",")}) ORDER BY id`
|
|
785
|
+
);
|
|
786
|
+
},
|
|
787
|
+
getPageCount: async (c) => {
|
|
788
|
+
const rows = await c.db.execute(
|
|
789
|
+
"PRAGMA page_count"
|
|
790
|
+
);
|
|
791
|
+
return toSafeInteger2(firstRowValue2(rows[0]));
|
|
792
|
+
},
|
|
793
|
+
vacuum: async (c) => {
|
|
794
|
+
await c.db.execute("VACUUM");
|
|
795
|
+
},
|
|
796
|
+
integrityCheck: async (c) => {
|
|
797
|
+
const rows = await c.db.execute(
|
|
798
|
+
"PRAGMA integrity_check"
|
|
799
|
+
);
|
|
800
|
+
const value = firstRowValue2(rows[0]);
|
|
801
|
+
return String(value ?? "");
|
|
802
|
+
},
|
|
803
|
+
runMixedWorkload: async (c, seedCount, churnCount) => {
|
|
804
|
+
const normalizedSeedCount = Math.max(1, Math.trunc(seedCount));
|
|
805
|
+
const normalizedChurnCount = Math.max(0, Math.trunc(churnCount));
|
|
806
|
+
const now = Date.now();
|
|
807
|
+
for (let i = 0; i < normalizedSeedCount; i++) {
|
|
808
|
+
const payload = makePayload2(1024 + i % 5 * 128);
|
|
809
|
+
await c.db.execute(
|
|
810
|
+
`INSERT OR REPLACE INTO test_data (id, value, payload, created_at) VALUES (${i + 1}, 'seed-${i}', '${payload}', ${now})`
|
|
811
|
+
);
|
|
812
|
+
}
|
|
813
|
+
for (let i = 0; i < normalizedChurnCount; i++) {
|
|
814
|
+
const id = i % normalizedSeedCount + 1;
|
|
815
|
+
if (i % 9 === 0) {
|
|
816
|
+
await c.db.execute(`DELETE FROM test_data WHERE id = ${id}`);
|
|
817
|
+
} else {
|
|
818
|
+
const payload = makePayload2(768 + i % 7 * 96);
|
|
819
|
+
await c.db.execute(
|
|
820
|
+
`INSERT OR REPLACE INTO test_data (id, value, payload, created_at) VALUES (${id}, 'upd-${i}', '${payload}', ${now + i})`
|
|
821
|
+
);
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
},
|
|
825
|
+
repeatUpdate: async (c, id, count) => {
|
|
826
|
+
let value = "";
|
|
827
|
+
if (count <= 0) {
|
|
828
|
+
return { value };
|
|
829
|
+
}
|
|
830
|
+
const statements = ["BEGIN"];
|
|
831
|
+
for (let i = 0; i < count; i++) {
|
|
832
|
+
value = `Updated ${i}`;
|
|
833
|
+
statements.push(
|
|
834
|
+
`UPDATE test_data SET value = '${value}' WHERE id = ${id}`
|
|
835
|
+
);
|
|
836
|
+
}
|
|
837
|
+
statements.push("COMMIT");
|
|
838
|
+
await c.db.execute(statements.join("; "));
|
|
839
|
+
return { value };
|
|
840
|
+
},
|
|
841
|
+
multiStatementInsert: async (c, value) => {
|
|
842
|
+
var _a;
|
|
843
|
+
await c.db.execute(
|
|
844
|
+
`BEGIN; INSERT INTO test_data (value, payload, created_at) VALUES ('${value}', '', ${Date.now()}); UPDATE test_data SET value = '${value}-updated' WHERE id = last_insert_rowid(); COMMIT;`
|
|
845
|
+
);
|
|
846
|
+
const results = await c.db.execute(
|
|
847
|
+
`SELECT value FROM test_data ORDER BY id DESC LIMIT 1`
|
|
848
|
+
);
|
|
849
|
+
return ((_a = results[0]) == null ? void 0 : _a.value) ?? null;
|
|
850
|
+
},
|
|
851
|
+
triggerSleep: (c) => {
|
|
852
|
+
c.sleep();
|
|
853
|
+
}
|
|
854
|
+
},
|
|
855
|
+
options: {
|
|
856
|
+
actionTimeout: 12e4,
|
|
857
|
+
sleepTimeout: 100
|
|
858
|
+
}
|
|
859
|
+
});
|
|
860
|
+
|
|
861
|
+
// fixtures/driver-test-suite/db-lifecycle.ts
|
|
862
|
+
var clientActorIds = /* @__PURE__ */ new WeakMap();
|
|
863
|
+
var createCounts = /* @__PURE__ */ new Map();
|
|
864
|
+
var migrateCounts = /* @__PURE__ */ new Map();
|
|
865
|
+
var cleanupCounts = /* @__PURE__ */ new Map();
|
|
866
|
+
function increment(map, actorId) {
|
|
867
|
+
map.set(actorId, (map.get(actorId) ?? 0) + 1);
|
|
868
|
+
}
|
|
869
|
+
function getCounts(actorId) {
|
|
870
|
+
return {
|
|
871
|
+
create: createCounts.get(actorId) ?? 0,
|
|
872
|
+
migrate: migrateCounts.get(actorId) ?? 0,
|
|
873
|
+
cleanup: cleanupCounts.get(actorId) ?? 0
|
|
874
|
+
};
|
|
875
|
+
}
|
|
876
|
+
function getTotalCleanupCount() {
|
|
877
|
+
let total = 0;
|
|
878
|
+
for (const count of cleanupCounts.values()) {
|
|
879
|
+
total += count;
|
|
880
|
+
}
|
|
881
|
+
return total;
|
|
882
|
+
}
|
|
883
|
+
var baseProvider = db({
|
|
884
|
+
onMigrate: async (dbHandle) => {
|
|
885
|
+
await dbHandle.execute(`
|
|
886
|
+
CREATE TABLE IF NOT EXISTS lifecycle_data (
|
|
887
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
888
|
+
value TEXT NOT NULL,
|
|
889
|
+
created_at INTEGER NOT NULL
|
|
890
|
+
)
|
|
891
|
+
`);
|
|
892
|
+
}
|
|
893
|
+
});
|
|
894
|
+
var lifecycleProvider = {
|
|
895
|
+
createClient: async (ctx) => {
|
|
896
|
+
const client = await baseProvider.createClient(ctx);
|
|
897
|
+
clientActorIds.set(client, ctx.actorId);
|
|
898
|
+
increment(createCounts, ctx.actorId);
|
|
899
|
+
return client;
|
|
900
|
+
},
|
|
901
|
+
onMigrate: async (client) => {
|
|
902
|
+
const actorId = clientActorIds.get(client);
|
|
903
|
+
if (actorId) {
|
|
904
|
+
increment(migrateCounts, actorId);
|
|
905
|
+
}
|
|
906
|
+
await baseProvider.onMigrate(client);
|
|
907
|
+
},
|
|
908
|
+
onDestroy: async (client) => {
|
|
909
|
+
var _a;
|
|
910
|
+
const actorId = clientActorIds.get(client);
|
|
911
|
+
if (actorId) {
|
|
912
|
+
increment(cleanupCounts, actorId);
|
|
913
|
+
}
|
|
914
|
+
await ((_a = baseProvider.onDestroy) == null ? void 0 : _a.call(baseProvider, client));
|
|
915
|
+
}
|
|
916
|
+
};
|
|
917
|
+
var failingLifecycleProvider = {
|
|
918
|
+
createClient: async (ctx) => {
|
|
919
|
+
const client = await baseProvider.createClient(ctx);
|
|
920
|
+
clientActorIds.set(client, ctx.actorId);
|
|
921
|
+
increment(createCounts, ctx.actorId);
|
|
922
|
+
return client;
|
|
923
|
+
},
|
|
924
|
+
onMigrate: async (client) => {
|
|
925
|
+
const actorId = clientActorIds.get(client);
|
|
926
|
+
if (actorId) {
|
|
927
|
+
increment(migrateCounts, actorId);
|
|
928
|
+
}
|
|
929
|
+
throw new Error("forced migrate failure");
|
|
930
|
+
},
|
|
931
|
+
onDestroy: async (client) => {
|
|
932
|
+
var _a;
|
|
933
|
+
const actorId = clientActorIds.get(client);
|
|
934
|
+
if (actorId) {
|
|
935
|
+
increment(cleanupCounts, actorId);
|
|
936
|
+
}
|
|
937
|
+
await ((_a = baseProvider.onDestroy) == null ? void 0 : _a.call(baseProvider, client));
|
|
938
|
+
}
|
|
939
|
+
};
|
|
940
|
+
var dbLifecycle = actor({
|
|
941
|
+
db: lifecycleProvider,
|
|
942
|
+
actions: {
|
|
943
|
+
getActorId: (c) => c.actorId,
|
|
944
|
+
ping: () => "pong",
|
|
945
|
+
insertValue: async (c, value) => {
|
|
946
|
+
await c.db.execute(
|
|
947
|
+
"INSERT INTO lifecycle_data (value, created_at) VALUES (?, ?)",
|
|
948
|
+
value,
|
|
949
|
+
Date.now()
|
|
950
|
+
);
|
|
951
|
+
},
|
|
952
|
+
getCount: async (c) => {
|
|
953
|
+
var _a;
|
|
954
|
+
const results = await c.db.execute(
|
|
955
|
+
`SELECT COUNT(*) as count FROM lifecycle_data`
|
|
956
|
+
);
|
|
957
|
+
return ((_a = results[0]) == null ? void 0 : _a.count) ?? 0;
|
|
958
|
+
},
|
|
959
|
+
triggerSleep: (c) => {
|
|
960
|
+
c.sleep();
|
|
961
|
+
},
|
|
962
|
+
triggerDestroy: (c) => {
|
|
963
|
+
c.destroy();
|
|
964
|
+
}
|
|
965
|
+
},
|
|
966
|
+
options: {
|
|
967
|
+
sleepTimeout: 100
|
|
968
|
+
}
|
|
969
|
+
});
|
|
970
|
+
var dbLifecycleFailing = actor({
|
|
971
|
+
db: failingLifecycleProvider,
|
|
972
|
+
actions: {
|
|
973
|
+
ping: () => "pong"
|
|
974
|
+
}
|
|
975
|
+
});
|
|
976
|
+
var dbLifecycleObserver = actor({
|
|
977
|
+
actions: {
|
|
978
|
+
getCounts: (_c, actorId) => {
|
|
979
|
+
return getCounts(actorId);
|
|
980
|
+
},
|
|
981
|
+
getTotalCleanupCount: () => {
|
|
982
|
+
return getTotalCleanupCount();
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
});
|
|
986
|
+
|
|
987
|
+
// fixtures/driver-test-suite/actor-onstatechange.ts
|
|
988
|
+
var onStateChangeActor = actor({
|
|
989
|
+
state: {
|
|
990
|
+
value: 0,
|
|
991
|
+
changeCount: 0
|
|
992
|
+
},
|
|
993
|
+
actions: {
|
|
994
|
+
// Action that modifies state - should trigger onStateChange
|
|
995
|
+
setValue: (c, newValue) => {
|
|
996
|
+
c.state.value = newValue;
|
|
997
|
+
return c.state.value;
|
|
998
|
+
},
|
|
999
|
+
// Action that modifies state multiple times - should trigger onStateChange for each change
|
|
1000
|
+
incrementMultiple: (c, times) => {
|
|
1001
|
+
for (let i = 0; i < times; i++) {
|
|
1002
|
+
c.state.value++;
|
|
1003
|
+
}
|
|
1004
|
+
return c.state.value;
|
|
1005
|
+
},
|
|
1006
|
+
// Action that doesn't modify state - should NOT trigger onStateChange
|
|
1007
|
+
getValue: (c) => {
|
|
1008
|
+
return c.state.value;
|
|
1009
|
+
},
|
|
1010
|
+
// Action that reads and returns without modifying - should NOT trigger onStateChange
|
|
1011
|
+
getDoubled: (c) => {
|
|
1012
|
+
const doubled = c.state.value * 2;
|
|
1013
|
+
return doubled;
|
|
1014
|
+
},
|
|
1015
|
+
// Get the count of how many times onStateChange was called
|
|
1016
|
+
getChangeCount: (c) => {
|
|
1017
|
+
return c.state.changeCount;
|
|
1018
|
+
},
|
|
1019
|
+
// Reset change counter for testing
|
|
1020
|
+
resetChangeCount: (c) => {
|
|
1021
|
+
c.state.changeCount = 0;
|
|
1022
|
+
}
|
|
1023
|
+
},
|
|
1024
|
+
// Track onStateChange calls
|
|
1025
|
+
onStateChange: (c) => {
|
|
1026
|
+
c.state.changeCount++;
|
|
1027
|
+
}
|
|
1028
|
+
});
|
|
1029
|
+
|
|
1030
|
+
// fixtures/driver-test-suite/conn-params.ts
|
|
1031
|
+
var counterWithParams = actor({
|
|
1032
|
+
state: { count: 0, initializers: [] },
|
|
1033
|
+
createConnState: (c, params) => {
|
|
1034
|
+
return {
|
|
1035
|
+
name: params.name || "anonymous"
|
|
1036
|
+
};
|
|
1037
|
+
},
|
|
1038
|
+
onConnect: (c, conn) => {
|
|
1039
|
+
c.state.initializers.push(conn.state.name);
|
|
1040
|
+
},
|
|
1041
|
+
actions: {
|
|
1042
|
+
increment: (c, x) => {
|
|
1043
|
+
c.state.count += x;
|
|
1044
|
+
c.broadcast("newCount", {
|
|
1045
|
+
count: c.state.count,
|
|
1046
|
+
by: c.conn.state.name
|
|
1047
|
+
});
|
|
1048
|
+
return c.state.count;
|
|
1049
|
+
},
|
|
1050
|
+
getInitializers: (c) => {
|
|
1051
|
+
return c.state.initializers;
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
});
|
|
1055
|
+
|
|
1056
|
+
// fixtures/driver-test-suite/conn-state.ts
|
|
1057
|
+
var connStateActor = actor({
|
|
1058
|
+
state: {
|
|
1059
|
+
sharedCounter: 0,
|
|
1060
|
+
disconnectionCount: 0
|
|
1061
|
+
},
|
|
1062
|
+
// Define connection state
|
|
1063
|
+
createConnState: (c, params) => {
|
|
1064
|
+
return {
|
|
1065
|
+
username: (params == null ? void 0 : params.username) || "anonymous",
|
|
1066
|
+
role: (params == null ? void 0 : params.role) || "user",
|
|
1067
|
+
counter: 0,
|
|
1068
|
+
createdAt: Date.now(),
|
|
1069
|
+
noCount: (params == null ? void 0 : params.noCount) ?? false
|
|
1070
|
+
};
|
|
1071
|
+
},
|
|
1072
|
+
// Lifecycle hook when a connection is established
|
|
1073
|
+
onConnect: (c, conn) => {
|
|
1074
|
+
c.broadcast("userConnected", {
|
|
1075
|
+
id: conn.id,
|
|
1076
|
+
username: "anonymous",
|
|
1077
|
+
role: "user"
|
|
1078
|
+
});
|
|
1079
|
+
},
|
|
1080
|
+
// Lifecycle hook when a connection is closed
|
|
1081
|
+
onDisconnect: (c, conn) => {
|
|
1082
|
+
var _a;
|
|
1083
|
+
if (!((_a = conn.state) == null ? void 0 : _a.noCount)) {
|
|
1084
|
+
c.state.disconnectionCount += 1;
|
|
1085
|
+
c.broadcast("userDisconnected", {
|
|
1086
|
+
id: conn.id
|
|
1087
|
+
});
|
|
1088
|
+
}
|
|
1089
|
+
},
|
|
1090
|
+
actions: {
|
|
1091
|
+
// Action to increment the connection's counter
|
|
1092
|
+
incrementConnCounter: (c, amount = 1) => {
|
|
1093
|
+
c.conn.state.counter += amount;
|
|
1094
|
+
},
|
|
1095
|
+
// Action to increment the shared counter
|
|
1096
|
+
incrementSharedCounter: (c, amount = 1) => {
|
|
1097
|
+
c.state.sharedCounter += amount;
|
|
1098
|
+
return c.state.sharedCounter;
|
|
1099
|
+
},
|
|
1100
|
+
// Get the connection state
|
|
1101
|
+
getConnectionState: (c) => {
|
|
1102
|
+
return { id: c.conn.id, ...c.conn.state };
|
|
1103
|
+
},
|
|
1104
|
+
// Check all active connections
|
|
1105
|
+
getConnectionIds: (c) => {
|
|
1106
|
+
return c.conns.entries().filter((c2) => {
|
|
1107
|
+
var _a;
|
|
1108
|
+
return !((_a = c2[1].state) == null ? void 0 : _a.noCount);
|
|
1109
|
+
}).map((x) => x[0]).toArray();
|
|
1110
|
+
},
|
|
1111
|
+
// Get disconnection count
|
|
1112
|
+
getDisconnectionCount: (c) => {
|
|
1113
|
+
return c.state.disconnectionCount;
|
|
1114
|
+
},
|
|
1115
|
+
// Get all active connection states
|
|
1116
|
+
getAllConnectionStates: (c) => {
|
|
1117
|
+
return c.conns.entries().map(([id, conn]) => ({ id, ...conn.state })).toArray();
|
|
1118
|
+
},
|
|
1119
|
+
// Send message to a specific connection with matching ID
|
|
1120
|
+
sendToConnection: (c, targetId, message) => {
|
|
1121
|
+
if (c.conns.has(targetId)) {
|
|
1122
|
+
c.conns.get(targetId).send("directMessage", { from: c.conn.id, message });
|
|
1123
|
+
return true;
|
|
1124
|
+
} else {
|
|
1125
|
+
return false;
|
|
1126
|
+
}
|
|
1127
|
+
},
|
|
1128
|
+
// Update connection state (simulated for tests)
|
|
1129
|
+
updateConnection: (c, updates) => {
|
|
1130
|
+
if (updates.username) c.conn.state.username = updates.username;
|
|
1131
|
+
if (updates.role) c.conn.state.role = updates.role;
|
|
1132
|
+
return c.conn.state;
|
|
1133
|
+
},
|
|
1134
|
+
disconnectSelf: (c, reason) => {
|
|
1135
|
+
c.conn.disconnect(reason ?? "test.disconnect");
|
|
1136
|
+
return true;
|
|
1137
|
+
}
|
|
1138
|
+
}
|
|
1139
|
+
});
|
|
1140
|
+
|
|
1141
|
+
// fixtures/driver-test-suite/counter.ts
|
|
1142
|
+
var counter = actor({
|
|
1143
|
+
state: { count: 0 },
|
|
1144
|
+
actions: {
|
|
1145
|
+
increment: (c, x) => {
|
|
1146
|
+
c.state.count += x;
|
|
1147
|
+
c.broadcast("newCount", c.state.count);
|
|
1148
|
+
return c.state.count;
|
|
1149
|
+
},
|
|
1150
|
+
setCount: (c, x) => {
|
|
1151
|
+
c.state.count = x;
|
|
1152
|
+
c.broadcast("newCount", x);
|
|
1153
|
+
return c.state.count;
|
|
1154
|
+
},
|
|
1155
|
+
getCount: (c) => {
|
|
1156
|
+
return c.state.count;
|
|
1157
|
+
},
|
|
1158
|
+
getKey: (c) => {
|
|
1159
|
+
return c.key;
|
|
1160
|
+
}
|
|
1161
|
+
}
|
|
1162
|
+
});
|
|
1163
|
+
|
|
1164
|
+
// fixtures/driver-test-suite/counter-conn.ts
|
|
1165
|
+
var counterConn = actor({
|
|
1166
|
+
state: {
|
|
1167
|
+
connectionCount: 0
|
|
1168
|
+
},
|
|
1169
|
+
connState: { count: 0 },
|
|
1170
|
+
onConnect: (c, conn) => {
|
|
1171
|
+
c.state.connectionCount += 1;
|
|
1172
|
+
},
|
|
1173
|
+
onDisconnect: (c, conn) => {
|
|
1174
|
+
c.state.connectionCount -= 1;
|
|
1175
|
+
},
|
|
1176
|
+
actions: {
|
|
1177
|
+
increment: (c, x) => {
|
|
1178
|
+
c.conn.state.count += x;
|
|
1179
|
+
c.broadcast("newCount", c.conn.state.count);
|
|
1180
|
+
},
|
|
1181
|
+
setCount: (c, x) => {
|
|
1182
|
+
c.conn.state.count = x;
|
|
1183
|
+
c.broadcast("newCount", x);
|
|
1184
|
+
},
|
|
1185
|
+
getCount: (c) => {
|
|
1186
|
+
return c.conn.state.count;
|
|
1187
|
+
},
|
|
1188
|
+
getConnectionCount: (c) => {
|
|
1189
|
+
return c.state.connectionCount;
|
|
1190
|
+
}
|
|
1191
|
+
}
|
|
1192
|
+
});
|
|
1193
|
+
|
|
1194
|
+
// fixtures/driver-test-suite/destroy.ts
|
|
1195
|
+
var destroyObserver = actor({
|
|
1196
|
+
state: { destroyedActors: [] },
|
|
1197
|
+
actions: {
|
|
1198
|
+
notifyDestroyed: (c, actorKey) => {
|
|
1199
|
+
c.state.destroyedActors.push(actorKey);
|
|
1200
|
+
},
|
|
1201
|
+
wasDestroyed: (c, actorKey) => {
|
|
1202
|
+
return c.state.destroyedActors.includes(actorKey);
|
|
1203
|
+
},
|
|
1204
|
+
reset: (c) => {
|
|
1205
|
+
c.state.destroyedActors = [];
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1208
|
+
});
|
|
1209
|
+
var destroyActor = actor({
|
|
1210
|
+
state: { value: 0, key: "" },
|
|
1211
|
+
onWake: (c) => {
|
|
1212
|
+
c.state.key = c.key.join("/");
|
|
1213
|
+
},
|
|
1214
|
+
onDestroy: async (c) => {
|
|
1215
|
+
const client = c.client();
|
|
1216
|
+
const observer = client.destroyObserver.getOrCreate(["observer"]);
|
|
1217
|
+
await observer.notifyDestroyed(c.state.key);
|
|
1218
|
+
},
|
|
1219
|
+
actions: {
|
|
1220
|
+
setValue: async (c, newValue) => {
|
|
1221
|
+
c.state.value = newValue;
|
|
1222
|
+
await c.saveState({ immediate: true });
|
|
1223
|
+
return c.state.value;
|
|
1224
|
+
},
|
|
1225
|
+
getValue: (c) => {
|
|
1226
|
+
return c.state.value;
|
|
1227
|
+
},
|
|
1228
|
+
destroy: (c) => {
|
|
1229
|
+
c.destroy();
|
|
1230
|
+
}
|
|
1231
|
+
}
|
|
1232
|
+
});
|
|
1233
|
+
|
|
1234
|
+
// fixtures/driver-test-suite/error-handling.ts
|
|
1235
|
+
var errorHandlingActor = actor({
|
|
1236
|
+
state: {
|
|
1237
|
+
errorLog: []
|
|
1238
|
+
},
|
|
1239
|
+
actions: {
|
|
1240
|
+
// Action that throws a UserError with just a message
|
|
1241
|
+
throwSimpleError: () => {
|
|
1242
|
+
throw new UserError("Simple error message");
|
|
1243
|
+
},
|
|
1244
|
+
// Action that throws a UserError with code and metadata
|
|
1245
|
+
throwDetailedError: () => {
|
|
1246
|
+
throw new UserError("Detailed error message", {
|
|
1247
|
+
code: "detailed_error",
|
|
1248
|
+
metadata: {
|
|
1249
|
+
reason: "test",
|
|
1250
|
+
timestamp: Date.now()
|
|
1251
|
+
}
|
|
1252
|
+
});
|
|
1253
|
+
},
|
|
1254
|
+
// Action that throws an internal error
|
|
1255
|
+
throwInternalError: () => {
|
|
1256
|
+
throw new Error("This is an internal error");
|
|
1257
|
+
},
|
|
1258
|
+
// Action that returns successfully
|
|
1259
|
+
successfulAction: () => {
|
|
1260
|
+
return "success";
|
|
1261
|
+
},
|
|
1262
|
+
// Action that times out (simulated with a long delay)
|
|
1263
|
+
timeoutAction: async (c) => {
|
|
1264
|
+
return new Promise((resolve) => {
|
|
1265
|
+
setTimeout(() => {
|
|
1266
|
+
resolve("This should not be reached if timeout works");
|
|
1267
|
+
}, 1e4);
|
|
1268
|
+
});
|
|
1269
|
+
},
|
|
1270
|
+
// Action with configurable delay to test timeout edge cases
|
|
1271
|
+
delayedAction: async (c, delayMs) => {
|
|
1272
|
+
return new Promise((resolve) => {
|
|
1273
|
+
setTimeout(() => {
|
|
1274
|
+
resolve(`Completed after ${delayMs}ms`);
|
|
1275
|
+
}, delayMs);
|
|
1276
|
+
});
|
|
1277
|
+
},
|
|
1278
|
+
// Log an error for inspection
|
|
1279
|
+
logError: (c, error) => {
|
|
1280
|
+
c.state.errorLog.push(error);
|
|
1281
|
+
return c.state.errorLog;
|
|
1282
|
+
},
|
|
1283
|
+
// Get the error log
|
|
1284
|
+
getErrorLog: (c) => {
|
|
1285
|
+
return c.state.errorLog;
|
|
1286
|
+
},
|
|
1287
|
+
// Clear the error log
|
|
1288
|
+
clearErrorLog: (c) => {
|
|
1289
|
+
c.state.errorLog = [];
|
|
1290
|
+
return true;
|
|
1291
|
+
}
|
|
1292
|
+
},
|
|
1293
|
+
options: {
|
|
1294
|
+
actionTimeout: 500
|
|
1295
|
+
// 500ms timeout for actions
|
|
1296
|
+
}
|
|
1297
|
+
});
|
|
1298
|
+
var customTimeoutActor = actor({
|
|
1299
|
+
state: {},
|
|
1300
|
+
actions: {
|
|
1301
|
+
quickAction: async () => {
|
|
1302
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
1303
|
+
return "Quick action completed";
|
|
1304
|
+
},
|
|
1305
|
+
slowAction: async () => {
|
|
1306
|
+
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
1307
|
+
return "Slow action completed";
|
|
1308
|
+
}
|
|
1309
|
+
},
|
|
1310
|
+
options: {
|
|
1311
|
+
actionTimeout: 200
|
|
1312
|
+
// 200ms timeout
|
|
1313
|
+
}
|
|
1314
|
+
});
|
|
1315
|
+
|
|
1316
|
+
// fixtures/driver-test-suite/file-system-hibernation-cleanup.ts
|
|
1317
|
+
var fileSystemHibernationCleanupActor = actor({
|
|
1318
|
+
state: {
|
|
1319
|
+
wakeCount: 0,
|
|
1320
|
+
sleepCount: 0,
|
|
1321
|
+
disconnectWakeCounts: []
|
|
1322
|
+
},
|
|
1323
|
+
createConnState: () => ({}),
|
|
1324
|
+
onWake: (c) => {
|
|
1325
|
+
c.state.wakeCount += 1;
|
|
1326
|
+
},
|
|
1327
|
+
onSleep: (c) => {
|
|
1328
|
+
c.state.sleepCount += 1;
|
|
1329
|
+
},
|
|
1330
|
+
onDisconnect: (c, conn) => {
|
|
1331
|
+
if (conn.isHibernatable) {
|
|
1332
|
+
c.state.disconnectWakeCounts.push(c.state.wakeCount);
|
|
1333
|
+
}
|
|
1334
|
+
},
|
|
1335
|
+
actions: {
|
|
1336
|
+
ping: () => "pong",
|
|
1337
|
+
triggerSleep: (c) => {
|
|
1338
|
+
c.sleep();
|
|
1339
|
+
},
|
|
1340
|
+
getCounts: (c) => ({
|
|
1341
|
+
wakeCount: c.state.wakeCount,
|
|
1342
|
+
sleepCount: c.state.sleepCount
|
|
1343
|
+
}),
|
|
1344
|
+
getDisconnectWakeCounts: (c) => c.state.disconnectWakeCounts
|
|
1345
|
+
},
|
|
1346
|
+
options: {
|
|
1347
|
+
sleepTimeout: 500
|
|
1348
|
+
}
|
|
1349
|
+
});
|
|
1350
|
+
|
|
1351
|
+
// fixtures/driver-test-suite/inline-client.ts
|
|
1352
|
+
var inlineClientActor = actor({
|
|
1353
|
+
state: { messages: [] },
|
|
1354
|
+
actions: {
|
|
1355
|
+
// Action that uses client to call another actor (stateless)
|
|
1356
|
+
callCounterIncrement: async (c, amount) => {
|
|
1357
|
+
const client = c.client();
|
|
1358
|
+
const result = await client.counter.getOrCreate(["inline-test"]).increment(amount);
|
|
1359
|
+
c.state.messages.push(
|
|
1360
|
+
`Called counter.increment(${amount}), result: ${result}`
|
|
1361
|
+
);
|
|
1362
|
+
return result;
|
|
1363
|
+
},
|
|
1364
|
+
// Action that uses client to get counter state (stateless)
|
|
1365
|
+
getCounterState: async (c) => {
|
|
1366
|
+
const client = c.client();
|
|
1367
|
+
const count = await client.counter.getOrCreate(["inline-test"]).getCount();
|
|
1368
|
+
c.state.messages.push(`Got counter state: ${count}`);
|
|
1369
|
+
return count;
|
|
1370
|
+
},
|
|
1371
|
+
// Action that uses client with .connect() for stateful communication
|
|
1372
|
+
connectToCounterAndIncrement: async (c, amount) => {
|
|
1373
|
+
const client = c.client();
|
|
1374
|
+
const handle = client.counter.getOrCreate(["inline-test-stateful"]);
|
|
1375
|
+
const connection = handle.connect();
|
|
1376
|
+
const events = [];
|
|
1377
|
+
connection.on("newCount", (count) => {
|
|
1378
|
+
events.push(count);
|
|
1379
|
+
});
|
|
1380
|
+
const result1 = await connection.increment(amount);
|
|
1381
|
+
const result2 = await connection.increment(amount * 2);
|
|
1382
|
+
await connection.dispose();
|
|
1383
|
+
c.state.messages.push(
|
|
1384
|
+
`Connected to counter, incremented by ${amount} and ${amount * 2}, results: ${result1}, ${result2}, events: ${JSON.stringify(events)}`
|
|
1385
|
+
);
|
|
1386
|
+
return { result1, result2, events };
|
|
1387
|
+
},
|
|
1388
|
+
// Get all messages from this actor's state
|
|
1389
|
+
getMessages: (c) => {
|
|
1390
|
+
return c.state.messages;
|
|
1391
|
+
},
|
|
1392
|
+
// Clear messages
|
|
1393
|
+
clearMessages: (c) => {
|
|
1394
|
+
c.state.messages = [];
|
|
1395
|
+
}
|
|
1396
|
+
}
|
|
1397
|
+
});
|
|
1398
|
+
|
|
1399
|
+
// fixtures/driver-test-suite/kv.ts
|
|
1400
|
+
var kvActor = actor({
|
|
1401
|
+
actions: {
|
|
1402
|
+
putText: async (c, key, value) => {
|
|
1403
|
+
await c.kv.put(key, value);
|
|
1404
|
+
return true;
|
|
1405
|
+
},
|
|
1406
|
+
getText: async (c, key) => {
|
|
1407
|
+
return await c.kv.get(key);
|
|
1408
|
+
},
|
|
1409
|
+
listText: async (c, prefix) => {
|
|
1410
|
+
const results = await c.kv.list(prefix, { keyType: "text" });
|
|
1411
|
+
return results.map(([key, value]) => ({
|
|
1412
|
+
key,
|
|
1413
|
+
value
|
|
1414
|
+
}));
|
|
1415
|
+
},
|
|
1416
|
+
roundtripArrayBuffer: async (c, key, values) => {
|
|
1417
|
+
const buffer = new Uint8Array(values).buffer;
|
|
1418
|
+
await c.kv.put(key, buffer, { type: "arrayBuffer" });
|
|
1419
|
+
const result = await c.kv.get(key, { type: "arrayBuffer" });
|
|
1420
|
+
if (!result) {
|
|
1421
|
+
return null;
|
|
1422
|
+
}
|
|
1423
|
+
return Array.from(new Uint8Array(result));
|
|
1424
|
+
}
|
|
1425
|
+
}
|
|
1426
|
+
});
|
|
1427
|
+
|
|
1428
|
+
// fixtures/driver-test-suite/large-payloads.ts
|
|
1429
|
+
var largePayloadActor = actor({
|
|
1430
|
+
state: {},
|
|
1431
|
+
actions: {
|
|
1432
|
+
/**
|
|
1433
|
+
* Accepts a large request payload and returns its size
|
|
1434
|
+
*/
|
|
1435
|
+
processLargeRequest: (c, data) => {
|
|
1436
|
+
return {
|
|
1437
|
+
itemCount: data.items.length,
|
|
1438
|
+
firstItem: data.items[0],
|
|
1439
|
+
lastItem: data.items[data.items.length - 1]
|
|
1440
|
+
};
|
|
1441
|
+
},
|
|
1442
|
+
/**
|
|
1443
|
+
* Returns a large response payload
|
|
1444
|
+
*/
|
|
1445
|
+
getLargeResponse: (c, itemCount) => {
|
|
1446
|
+
const items = [];
|
|
1447
|
+
for (let i = 0; i < itemCount; i++) {
|
|
1448
|
+
items.push(`Item ${i} with some additional text to increase size`);
|
|
1449
|
+
}
|
|
1450
|
+
return { items };
|
|
1451
|
+
},
|
|
1452
|
+
/**
|
|
1453
|
+
* Echo back the request data
|
|
1454
|
+
*/
|
|
1455
|
+
echo: (c, data) => {
|
|
1456
|
+
return data;
|
|
1457
|
+
}
|
|
1458
|
+
}
|
|
1459
|
+
});
|
|
1460
|
+
var largePayloadConnActor = actor({
|
|
1461
|
+
state: {},
|
|
1462
|
+
connState: {
|
|
1463
|
+
lastRequestSize: 0
|
|
1464
|
+
},
|
|
1465
|
+
actions: {
|
|
1466
|
+
/**
|
|
1467
|
+
* Accepts a large request payload and returns its size
|
|
1468
|
+
*/
|
|
1469
|
+
processLargeRequest: (c, data) => {
|
|
1470
|
+
c.conn.state.lastRequestSize = data.items.length;
|
|
1471
|
+
return {
|
|
1472
|
+
itemCount: data.items.length,
|
|
1473
|
+
firstItem: data.items[0],
|
|
1474
|
+
lastItem: data.items[data.items.length - 1]
|
|
1475
|
+
};
|
|
1476
|
+
},
|
|
1477
|
+
/**
|
|
1478
|
+
* Returns a large response payload
|
|
1479
|
+
*/
|
|
1480
|
+
getLargeResponse: (c, itemCount) => {
|
|
1481
|
+
const items = [];
|
|
1482
|
+
for (let i = 0; i < itemCount; i++) {
|
|
1483
|
+
items.push(`Item ${i} with some additional text to increase size`);
|
|
1484
|
+
}
|
|
1485
|
+
return { items };
|
|
1486
|
+
},
|
|
1487
|
+
/**
|
|
1488
|
+
* Echo back the request data
|
|
1489
|
+
*/
|
|
1490
|
+
echo: (c, data) => {
|
|
1491
|
+
return data;
|
|
1492
|
+
},
|
|
1493
|
+
/**
|
|
1494
|
+
* Get the last request size
|
|
1495
|
+
*/
|
|
1496
|
+
getLastRequestSize: (c) => {
|
|
1497
|
+
return c.conn.state.lastRequestSize;
|
|
1498
|
+
}
|
|
1499
|
+
}
|
|
1500
|
+
});
|
|
1501
|
+
|
|
1502
|
+
// fixtures/driver-test-suite/lifecycle.ts
|
|
1503
|
+
var counterWithLifecycle = actor({
|
|
1504
|
+
state: {
|
|
1505
|
+
count: 0,
|
|
1506
|
+
events: []
|
|
1507
|
+
},
|
|
1508
|
+
createConnState: (c, params) => ({
|
|
1509
|
+
joinTime: Date.now()
|
|
1510
|
+
}),
|
|
1511
|
+
onWake: (c) => {
|
|
1512
|
+
c.state.events.push("onWake");
|
|
1513
|
+
},
|
|
1514
|
+
onBeforeConnect: (c, params) => {
|
|
1515
|
+
if (params == null ? void 0 : params.trackLifecycle) c.state.events.push("onBeforeConnect");
|
|
1516
|
+
},
|
|
1517
|
+
onConnect: (c, conn) => {
|
|
1518
|
+
var _a;
|
|
1519
|
+
if ((_a = conn.params) == null ? void 0 : _a.trackLifecycle) c.state.events.push("onConnect");
|
|
1520
|
+
},
|
|
1521
|
+
onDisconnect: (c, conn) => {
|
|
1522
|
+
var _a;
|
|
1523
|
+
if ((_a = conn.params) == null ? void 0 : _a.trackLifecycle) c.state.events.push("onDisconnect");
|
|
1524
|
+
},
|
|
1525
|
+
actions: {
|
|
1526
|
+
getEvents: (c) => {
|
|
1527
|
+
return c.state.events;
|
|
1528
|
+
},
|
|
1529
|
+
increment: (c, x) => {
|
|
1530
|
+
c.state.count += x;
|
|
1531
|
+
return c.state.count;
|
|
1532
|
+
}
|
|
1533
|
+
}
|
|
1534
|
+
});
|
|
1535
|
+
|
|
1536
|
+
// fixtures/driver-test-suite/metadata.ts
|
|
1537
|
+
var metadataActor = actor({
|
|
1538
|
+
state: {
|
|
1539
|
+
lastMetadata: null,
|
|
1540
|
+
actorName: "",
|
|
1541
|
+
// Store tags and region in state for testing since they may not be
|
|
1542
|
+
// available in the context in all environments
|
|
1543
|
+
storedTags: {},
|
|
1544
|
+
storedRegion: null
|
|
1545
|
+
},
|
|
1546
|
+
onWake: (c) => {
|
|
1547
|
+
c.state.actorName = c.name;
|
|
1548
|
+
},
|
|
1549
|
+
actions: {
|
|
1550
|
+
// Set up test tags - this will be called by tests to simulate tags
|
|
1551
|
+
setupTestTags: (c, tags) => {
|
|
1552
|
+
c.state.storedTags = tags;
|
|
1553
|
+
return tags;
|
|
1554
|
+
},
|
|
1555
|
+
// Set up test region - this will be called by tests to simulate region
|
|
1556
|
+
setupTestRegion: (c, region) => {
|
|
1557
|
+
c.state.storedRegion = region;
|
|
1558
|
+
return region;
|
|
1559
|
+
},
|
|
1560
|
+
// Get all available metadata
|
|
1561
|
+
getMetadata: (c) => {
|
|
1562
|
+
const metadata = {
|
|
1563
|
+
name: c.name,
|
|
1564
|
+
tags: c.state.storedTags,
|
|
1565
|
+
region: c.state.storedRegion
|
|
1566
|
+
};
|
|
1567
|
+
c.state.lastMetadata = metadata;
|
|
1568
|
+
return metadata;
|
|
1569
|
+
},
|
|
1570
|
+
// Get the actor name
|
|
1571
|
+
getActorName: (c) => {
|
|
1572
|
+
return c.name;
|
|
1573
|
+
},
|
|
1574
|
+
// Get a specific tag by key
|
|
1575
|
+
getTag: (c, key) => {
|
|
1576
|
+
return c.state.storedTags[key] || null;
|
|
1577
|
+
},
|
|
1578
|
+
// Get all tags
|
|
1579
|
+
getTags: (c) => {
|
|
1580
|
+
return c.state.storedTags;
|
|
1581
|
+
},
|
|
1582
|
+
// Get the region
|
|
1583
|
+
getRegion: (c) => {
|
|
1584
|
+
return c.state.storedRegion;
|
|
1585
|
+
},
|
|
1586
|
+
// Get the stored actor name (from onWake)
|
|
1587
|
+
getStoredActorName: (c) => {
|
|
1588
|
+
return c.state.actorName;
|
|
1589
|
+
},
|
|
1590
|
+
// Get last retrieved metadata
|
|
1591
|
+
getLastMetadata: (c) => {
|
|
1592
|
+
return c.state.lastMetadata;
|
|
1593
|
+
}
|
|
1594
|
+
}
|
|
1595
|
+
});
|
|
1596
|
+
|
|
1597
|
+
// fixtures/driver-test-suite/queue.ts
|
|
1598
|
+
var queueSchemas = {
|
|
1599
|
+
greeting: queue(),
|
|
1600
|
+
self: queue(),
|
|
1601
|
+
a: queue(),
|
|
1602
|
+
b: queue(),
|
|
1603
|
+
c: queue(),
|
|
1604
|
+
one: queue(),
|
|
1605
|
+
two: queue(),
|
|
1606
|
+
missing: queue(),
|
|
1607
|
+
abort: queue(),
|
|
1608
|
+
tasks: queue(),
|
|
1609
|
+
timeout: queue(),
|
|
1610
|
+
nowait: queue(),
|
|
1611
|
+
twice: queue()
|
|
1612
|
+
};
|
|
1613
|
+
var queueActor = actor({
|
|
1614
|
+
state: {},
|
|
1615
|
+
queues: queueSchemas,
|
|
1616
|
+
actions: {
|
|
1617
|
+
receiveOne: async (c, name, opts) => {
|
|
1618
|
+
const message = await c.queue.next({
|
|
1619
|
+
names: [name],
|
|
1620
|
+
timeout: opts == null ? void 0 : opts.timeout
|
|
1621
|
+
});
|
|
1622
|
+
if (!message) {
|
|
1623
|
+
return null;
|
|
1624
|
+
}
|
|
1625
|
+
return { name: message.name, body: message.body };
|
|
1626
|
+
},
|
|
1627
|
+
receiveMany: async (c, names, opts) => {
|
|
1628
|
+
const messages = await c.queue.nextBatch({
|
|
1629
|
+
names,
|
|
1630
|
+
count: opts == null ? void 0 : opts.count,
|
|
1631
|
+
timeout: opts == null ? void 0 : opts.timeout
|
|
1632
|
+
});
|
|
1633
|
+
return messages.map((message) => ({
|
|
1634
|
+
name: message.name,
|
|
1635
|
+
body: message.body
|
|
1636
|
+
}));
|
|
1637
|
+
},
|
|
1638
|
+
receiveRequest: async (c, request) => {
|
|
1639
|
+
const messages = await c.queue.nextBatch(request);
|
|
1640
|
+
return messages.map((message) => ({
|
|
1641
|
+
name: message.name,
|
|
1642
|
+
body: message.body
|
|
1643
|
+
}));
|
|
1644
|
+
},
|
|
1645
|
+
tryReceiveMany: async (c, request) => {
|
|
1646
|
+
const messages = await c.queue.tryNextBatch(request);
|
|
1647
|
+
return messages.map((message) => ({
|
|
1648
|
+
name: message.name,
|
|
1649
|
+
body: message.body
|
|
1650
|
+
}));
|
|
1651
|
+
},
|
|
1652
|
+
receiveWithIterator: async (c, name) => {
|
|
1653
|
+
for await (const message of c.queue.iter({ names: [name] })) {
|
|
1654
|
+
return { name: message.name, body: message.body };
|
|
1655
|
+
}
|
|
1656
|
+
return null;
|
|
1657
|
+
},
|
|
1658
|
+
receiveWithAsyncIterator: async (c) => {
|
|
1659
|
+
for await (const message of c.queue.iter()) {
|
|
1660
|
+
return { name: message.name, body: message.body };
|
|
1661
|
+
}
|
|
1662
|
+
return null;
|
|
1663
|
+
},
|
|
1664
|
+
sendToSelf: async (c, name, body) => {
|
|
1665
|
+
const client = c.client();
|
|
1666
|
+
const handle = client.queueActor.getForId(c.actorId);
|
|
1667
|
+
await handle.send(name, body);
|
|
1668
|
+
return true;
|
|
1669
|
+
},
|
|
1670
|
+
waitForAbort: async (c) => {
|
|
1671
|
+
setTimeout(() => {
|
|
1672
|
+
c.destroy();
|
|
1673
|
+
}, 10);
|
|
1674
|
+
await c.queue.next({ names: ["abort"], timeout: 1e4 });
|
|
1675
|
+
return true;
|
|
1676
|
+
},
|
|
1677
|
+
waitForSignalAbort: async (c) => {
|
|
1678
|
+
const controller = new AbortController();
|
|
1679
|
+
controller.abort();
|
|
1680
|
+
try {
|
|
1681
|
+
await c.queue.next({
|
|
1682
|
+
names: ["abort"],
|
|
1683
|
+
timeout: 1e4,
|
|
1684
|
+
signal: controller.signal
|
|
1685
|
+
});
|
|
1686
|
+
return { ok: false };
|
|
1687
|
+
} catch (error) {
|
|
1688
|
+
const actorError = error;
|
|
1689
|
+
return { group: actorError.group, code: actorError.code };
|
|
1690
|
+
}
|
|
1691
|
+
},
|
|
1692
|
+
waitForActorAbortWithSignal: async (c) => {
|
|
1693
|
+
const controller = new AbortController();
|
|
1694
|
+
setTimeout(() => {
|
|
1695
|
+
c.destroy();
|
|
1696
|
+
}, 10);
|
|
1697
|
+
try {
|
|
1698
|
+
await c.queue.next({
|
|
1699
|
+
names: ["abort"],
|
|
1700
|
+
timeout: 1e4,
|
|
1701
|
+
signal: controller.signal
|
|
1702
|
+
});
|
|
1703
|
+
return { ok: false };
|
|
1704
|
+
} catch (error) {
|
|
1705
|
+
const actorError = error;
|
|
1706
|
+
return { group: actorError.group, code: actorError.code };
|
|
1707
|
+
}
|
|
1708
|
+
},
|
|
1709
|
+
iterWithSignalAbort: async (c) => {
|
|
1710
|
+
const controller = new AbortController();
|
|
1711
|
+
controller.abort();
|
|
1712
|
+
for await (const _message of c.queue.iter({
|
|
1713
|
+
names: ["abort"],
|
|
1714
|
+
signal: controller.signal
|
|
1715
|
+
})) {
|
|
1716
|
+
return { ok: false };
|
|
1717
|
+
}
|
|
1718
|
+
return { ok: true };
|
|
1719
|
+
},
|
|
1720
|
+
receiveAndComplete: async (c, name) => {
|
|
1721
|
+
const message = await c.queue.next({
|
|
1722
|
+
names: [name],
|
|
1723
|
+
completable: true
|
|
1724
|
+
});
|
|
1725
|
+
if (!message) {
|
|
1726
|
+
return null;
|
|
1727
|
+
}
|
|
1728
|
+
await message.complete({ echo: message.body });
|
|
1729
|
+
return { name: message.name, body: message.body };
|
|
1730
|
+
},
|
|
1731
|
+
receiveWithoutComplete: async (c, name) => {
|
|
1732
|
+
const message = await c.queue.next({
|
|
1733
|
+
names: [name],
|
|
1734
|
+
completable: true
|
|
1735
|
+
});
|
|
1736
|
+
if (!message) {
|
|
1737
|
+
return null;
|
|
1738
|
+
}
|
|
1739
|
+
return { name: message.name, body: message.body };
|
|
1740
|
+
},
|
|
1741
|
+
receiveManualThenNextWithoutComplete: async (c, name) => {
|
|
1742
|
+
const message = await c.queue.next({
|
|
1743
|
+
names: [name],
|
|
1744
|
+
completable: true
|
|
1745
|
+
});
|
|
1746
|
+
if (!message) {
|
|
1747
|
+
return { ok: false, reason: "no_message" };
|
|
1748
|
+
}
|
|
1749
|
+
try {
|
|
1750
|
+
await c.queue.next({ names: [name], timeout: 0 });
|
|
1751
|
+
c.destroy();
|
|
1752
|
+
return { ok: false, reason: "next_succeeded" };
|
|
1753
|
+
} catch (error) {
|
|
1754
|
+
c.destroy();
|
|
1755
|
+
const actorError = error;
|
|
1756
|
+
return { group: actorError.group, code: actorError.code };
|
|
1757
|
+
}
|
|
1758
|
+
},
|
|
1759
|
+
receiveAndCompleteTwice: async (c, name) => {
|
|
1760
|
+
const message = await c.queue.next({
|
|
1761
|
+
names: [name],
|
|
1762
|
+
completable: true
|
|
1763
|
+
});
|
|
1764
|
+
if (!message) {
|
|
1765
|
+
return null;
|
|
1766
|
+
}
|
|
1767
|
+
await message.complete({ ok: true });
|
|
1768
|
+
try {
|
|
1769
|
+
await message.complete({ ok: true });
|
|
1770
|
+
return { ok: false };
|
|
1771
|
+
} catch (error) {
|
|
1772
|
+
const actorError = error;
|
|
1773
|
+
return { group: actorError.group, code: actorError.code };
|
|
1774
|
+
}
|
|
1775
|
+
},
|
|
1776
|
+
receiveWithoutCompleteMethod: async (c, name) => {
|
|
1777
|
+
const message = await c.queue.next({
|
|
1778
|
+
names: [name],
|
|
1779
|
+
completable: true
|
|
1780
|
+
});
|
|
1781
|
+
return {
|
|
1782
|
+
hasComplete: message !== void 0 && typeof message.complete === "function"
|
|
1783
|
+
};
|
|
1784
|
+
}
|
|
1785
|
+
}
|
|
1786
|
+
});
|
|
1787
|
+
var queueLimitedActor = actor({
|
|
1788
|
+
state: {},
|
|
1789
|
+
queues: {
|
|
1790
|
+
message: queue(),
|
|
1791
|
+
oversize: queue()
|
|
1792
|
+
},
|
|
1793
|
+
actions: {},
|
|
1794
|
+
options: {
|
|
1795
|
+
maxQueueSize: 1,
|
|
1796
|
+
maxQueueMessageSize: 64
|
|
1797
|
+
}
|
|
1798
|
+
});
|
|
1799
|
+
|
|
1800
|
+
// fixtures/driver-test-suite/raw-http.ts
|
|
1801
|
+
import { Hono } from "hono";
|
|
1802
|
+
var rawHttpActor = actor({
|
|
1803
|
+
state: {
|
|
1804
|
+
requestCount: 0
|
|
1805
|
+
},
|
|
1806
|
+
onRequest(ctx, request) {
|
|
1807
|
+
const url = new URL(request.url);
|
|
1808
|
+
const method = request.method;
|
|
1809
|
+
ctx.state.requestCount++;
|
|
1810
|
+
if (url.pathname === "/api/hello") {
|
|
1811
|
+
return new Response(
|
|
1812
|
+
JSON.stringify({ message: "Hello from actor!" }),
|
|
1813
|
+
{
|
|
1814
|
+
headers: { "Content-Type": "application/json" }
|
|
1815
|
+
}
|
|
1816
|
+
);
|
|
1817
|
+
}
|
|
1818
|
+
if (url.pathname === "/api/echo" && method === "POST") {
|
|
1819
|
+
return new Response(request.body, {
|
|
1820
|
+
headers: request.headers
|
|
1821
|
+
});
|
|
1822
|
+
}
|
|
1823
|
+
if (url.pathname === "/api/state") {
|
|
1824
|
+
return new Response(
|
|
1825
|
+
JSON.stringify({
|
|
1826
|
+
requestCount: ctx.state.requestCount
|
|
1827
|
+
}),
|
|
1828
|
+
{
|
|
1829
|
+
headers: { "Content-Type": "application/json" }
|
|
1830
|
+
}
|
|
1831
|
+
);
|
|
1832
|
+
}
|
|
1833
|
+
if (url.pathname === "/api/headers") {
|
|
1834
|
+
const headers = {};
|
|
1835
|
+
request.headers.forEach((value, key) => {
|
|
1836
|
+
headers[key] = value;
|
|
1837
|
+
});
|
|
1838
|
+
return new Response(JSON.stringify(headers), {
|
|
1839
|
+
headers: { "Content-Type": "application/json" }
|
|
1840
|
+
});
|
|
1841
|
+
}
|
|
1842
|
+
return new Response("Not Found", { status: 404 });
|
|
1843
|
+
},
|
|
1844
|
+
actions: {}
|
|
1845
|
+
});
|
|
1846
|
+
var rawHttpNoHandlerActor = actor({
|
|
1847
|
+
actions: {}
|
|
1848
|
+
});
|
|
1849
|
+
var rawHttpVoidReturnActor = actor({
|
|
1850
|
+
onRequest(ctx, request) {
|
|
1851
|
+
return void 0;
|
|
1852
|
+
},
|
|
1853
|
+
actions: {}
|
|
1854
|
+
});
|
|
1855
|
+
var rawHttpHonoActor = actor({
|
|
1856
|
+
createVars() {
|
|
1857
|
+
const router = new Hono();
|
|
1858
|
+
router.get(
|
|
1859
|
+
"/",
|
|
1860
|
+
(c) => c.json({ message: "Welcome to Hono actor!" })
|
|
1861
|
+
);
|
|
1862
|
+
router.get(
|
|
1863
|
+
"/users",
|
|
1864
|
+
(c) => c.json([
|
|
1865
|
+
{ id: 1, name: "Alice" },
|
|
1866
|
+
{ id: 2, name: "Bob" }
|
|
1867
|
+
])
|
|
1868
|
+
);
|
|
1869
|
+
router.get("/users/:id", (c) => {
|
|
1870
|
+
const id = c.req.param("id");
|
|
1871
|
+
return c.json({
|
|
1872
|
+
id: parseInt(id),
|
|
1873
|
+
name: id === "1" ? "Alice" : "Bob"
|
|
1874
|
+
});
|
|
1875
|
+
});
|
|
1876
|
+
router.post("/users", async (c) => {
|
|
1877
|
+
const body = await c.req.json();
|
|
1878
|
+
return c.json({ id: 3, ...body }, 201);
|
|
1879
|
+
});
|
|
1880
|
+
router.put("/users/:id", async (c) => {
|
|
1881
|
+
const id = c.req.param("id");
|
|
1882
|
+
const body = await c.req.json();
|
|
1883
|
+
return c.json({ id: parseInt(id), ...body });
|
|
1884
|
+
});
|
|
1885
|
+
router.delete("/users/:id", (c) => {
|
|
1886
|
+
const id = c.req.param("id");
|
|
1887
|
+
return c.json({ message: `User ${id} deleted` });
|
|
1888
|
+
});
|
|
1889
|
+
return { router };
|
|
1890
|
+
},
|
|
1891
|
+
onRequest(ctx, request) {
|
|
1892
|
+
return ctx.vars.router.fetch(request);
|
|
1893
|
+
},
|
|
1894
|
+
actions: {}
|
|
1895
|
+
});
|
|
1896
|
+
|
|
1897
|
+
// fixtures/driver-test-suite/raw-http-request-properties.ts
|
|
1898
|
+
var rawHttpRequestPropertiesActor = actor({
|
|
1899
|
+
actions: {},
|
|
1900
|
+
onRequest(ctx, request) {
|
|
1901
|
+
const url = new URL(request.url);
|
|
1902
|
+
const method = request.method;
|
|
1903
|
+
const headers = {};
|
|
1904
|
+
request.headers.forEach((value, key) => {
|
|
1905
|
+
headers[key] = value;
|
|
1906
|
+
});
|
|
1907
|
+
const handleBody = async () => {
|
|
1908
|
+
if (!request.body) {
|
|
1909
|
+
return null;
|
|
1910
|
+
}
|
|
1911
|
+
const contentType = request.headers.get("content-type") || "";
|
|
1912
|
+
try {
|
|
1913
|
+
if (contentType.includes("application/json")) {
|
|
1914
|
+
const text2 = await request.text();
|
|
1915
|
+
return text2 ? JSON.parse(text2) : null;
|
|
1916
|
+
} else {
|
|
1917
|
+
const text2 = await request.text();
|
|
1918
|
+
return text2 || null;
|
|
1919
|
+
}
|
|
1920
|
+
} catch (error) {
|
|
1921
|
+
return null;
|
|
1922
|
+
}
|
|
1923
|
+
};
|
|
1924
|
+
if (method === "HEAD") {
|
|
1925
|
+
return new Response(null, {
|
|
1926
|
+
status: 200
|
|
1927
|
+
});
|
|
1928
|
+
}
|
|
1929
|
+
if (method === "OPTIONS") {
|
|
1930
|
+
return new Response(null, {
|
|
1931
|
+
status: 204
|
|
1932
|
+
});
|
|
1933
|
+
}
|
|
1934
|
+
return handleBody().then((body) => {
|
|
1935
|
+
const responseData = {
|
|
1936
|
+
// URL properties
|
|
1937
|
+
url: request.url,
|
|
1938
|
+
pathname: url.pathname,
|
|
1939
|
+
search: url.search,
|
|
1940
|
+
searchParams: Object.fromEntries(url.searchParams.entries()),
|
|
1941
|
+
hash: url.hash,
|
|
1942
|
+
// Method
|
|
1943
|
+
method: request.method,
|
|
1944
|
+
// Headers
|
|
1945
|
+
headers,
|
|
1946
|
+
// Body
|
|
1947
|
+
body,
|
|
1948
|
+
bodyText: typeof body === "string" ? body : body === null && request.body !== null ? "" : null,
|
|
1949
|
+
// Additional properties that might be available
|
|
1950
|
+
// Note: Some properties like cache, credentials, mode, etc.
|
|
1951
|
+
// might not be available in all environments
|
|
1952
|
+
cache: request.cache || null,
|
|
1953
|
+
credentials: request.credentials || null,
|
|
1954
|
+
mode: request.mode || null,
|
|
1955
|
+
redirect: request.redirect || null,
|
|
1956
|
+
referrer: request.referrer || null
|
|
1957
|
+
};
|
|
1958
|
+
return new Response(JSON.stringify(responseData), {
|
|
1959
|
+
headers: { "Content-Type": "application/json" }
|
|
1960
|
+
});
|
|
1961
|
+
});
|
|
1962
|
+
}
|
|
1963
|
+
});
|
|
1964
|
+
|
|
1965
|
+
// fixtures/driver-test-suite/raw-websocket.ts
|
|
1966
|
+
var rawWebSocketActor = actor({
|
|
1967
|
+
state: {
|
|
1968
|
+
connectionCount: 0,
|
|
1969
|
+
messageCount: 0
|
|
1970
|
+
},
|
|
1971
|
+
onWebSocket(ctx, websocket) {
|
|
1972
|
+
ctx.state.connectionCount = ctx.state.connectionCount + 1;
|
|
1973
|
+
console.log(
|
|
1974
|
+
`[ACTOR] New connection, count: ${ctx.state.connectionCount}`
|
|
1975
|
+
);
|
|
1976
|
+
websocket.send(
|
|
1977
|
+
JSON.stringify({
|
|
1978
|
+
type: "welcome",
|
|
1979
|
+
connectionCount: ctx.state.connectionCount
|
|
1980
|
+
})
|
|
1981
|
+
);
|
|
1982
|
+
console.log("[ACTOR] Sent welcome message");
|
|
1983
|
+
websocket.addEventListener("message", (event2) => {
|
|
1984
|
+
var _a;
|
|
1985
|
+
ctx.state.messageCount = ctx.state.messageCount + 1;
|
|
1986
|
+
console.log(
|
|
1987
|
+
`[ACTOR] Message received, total count: ${ctx.state.messageCount}, data:`,
|
|
1988
|
+
event2.data
|
|
1989
|
+
);
|
|
1990
|
+
const data = event2.data;
|
|
1991
|
+
if (typeof data === "string") {
|
|
1992
|
+
try {
|
|
1993
|
+
const parsed = JSON.parse(data);
|
|
1994
|
+
if (parsed.type === "ping") {
|
|
1995
|
+
websocket.send(
|
|
1996
|
+
JSON.stringify({
|
|
1997
|
+
type: "pong",
|
|
1998
|
+
timestamp: Date.now()
|
|
1999
|
+
})
|
|
2000
|
+
);
|
|
2001
|
+
} else if (parsed.type === "getStats") {
|
|
2002
|
+
console.log(
|
|
2003
|
+
`[ACTOR] Sending stats - connections: ${ctx.state.connectionCount}, messages: ${ctx.state.messageCount}`
|
|
2004
|
+
);
|
|
2005
|
+
websocket.send(
|
|
2006
|
+
JSON.stringify({
|
|
2007
|
+
type: "stats",
|
|
2008
|
+
connectionCount: ctx.state.connectionCount,
|
|
2009
|
+
messageCount: ctx.state.messageCount
|
|
2010
|
+
})
|
|
2011
|
+
);
|
|
2012
|
+
} else if (parsed.type === "getRequestInfo") {
|
|
2013
|
+
const url = ((_a = ctx.request) == null ? void 0 : _a.url) || "ws://actor/websocket";
|
|
2014
|
+
const urlObj = new URL(url);
|
|
2015
|
+
websocket.send(
|
|
2016
|
+
JSON.stringify({
|
|
2017
|
+
type: "requestInfo",
|
|
2018
|
+
url,
|
|
2019
|
+
pathname: urlObj.pathname,
|
|
2020
|
+
search: urlObj.search
|
|
2021
|
+
})
|
|
2022
|
+
);
|
|
2023
|
+
} else {
|
|
2024
|
+
websocket.send(data);
|
|
2025
|
+
}
|
|
2026
|
+
} catch {
|
|
2027
|
+
websocket.send(data);
|
|
2028
|
+
}
|
|
2029
|
+
} else {
|
|
2030
|
+
websocket.send(data);
|
|
2031
|
+
}
|
|
2032
|
+
});
|
|
2033
|
+
websocket.addEventListener("close", () => {
|
|
2034
|
+
ctx.state.connectionCount = ctx.state.connectionCount - 1;
|
|
2035
|
+
console.log(
|
|
2036
|
+
`[ACTOR] Connection closed, count: ${ctx.state.connectionCount}`
|
|
2037
|
+
);
|
|
2038
|
+
});
|
|
2039
|
+
},
|
|
2040
|
+
actions: {
|
|
2041
|
+
getStats(ctx) {
|
|
2042
|
+
return {
|
|
2043
|
+
connectionCount: ctx.state.connectionCount,
|
|
2044
|
+
messageCount: ctx.state.messageCount
|
|
2045
|
+
};
|
|
2046
|
+
}
|
|
2047
|
+
}
|
|
2048
|
+
});
|
|
2049
|
+
var rawWebSocketBinaryActor = actor({
|
|
2050
|
+
onWebSocket(ctx, websocket) {
|
|
2051
|
+
websocket.addEventListener("message", (event2) => {
|
|
2052
|
+
const data = event2.data;
|
|
2053
|
+
if (data instanceof ArrayBuffer || data instanceof Uint8Array) {
|
|
2054
|
+
const bytes = new Uint8Array(data);
|
|
2055
|
+
const reversed = new Uint8Array(bytes.length);
|
|
2056
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
2057
|
+
reversed[i] = bytes[bytes.length - 1 - i];
|
|
2058
|
+
}
|
|
2059
|
+
websocket.send(reversed);
|
|
2060
|
+
}
|
|
2061
|
+
});
|
|
2062
|
+
},
|
|
2063
|
+
actions: {}
|
|
2064
|
+
});
|
|
2065
|
+
|
|
2066
|
+
// fixtures/driver-test-suite/request-access.ts
|
|
2067
|
+
var requestAccessActor = actor({
|
|
2068
|
+
state: {
|
|
2069
|
+
// Track request info from different hooks
|
|
2070
|
+
onBeforeConnectRequest: {
|
|
2071
|
+
hasRequest: false,
|
|
2072
|
+
requestUrl: null,
|
|
2073
|
+
requestMethod: null,
|
|
2074
|
+
requestHeaders: {}
|
|
2075
|
+
},
|
|
2076
|
+
createConnStateRequest: {
|
|
2077
|
+
hasRequest: false,
|
|
2078
|
+
requestUrl: null,
|
|
2079
|
+
requestMethod: null,
|
|
2080
|
+
requestHeaders: {}
|
|
2081
|
+
},
|
|
2082
|
+
onRequestRequest: {
|
|
2083
|
+
hasRequest: false,
|
|
2084
|
+
requestUrl: null,
|
|
2085
|
+
requestMethod: null,
|
|
2086
|
+
requestHeaders: {}
|
|
2087
|
+
},
|
|
2088
|
+
onWebSocketRequest: {
|
|
2089
|
+
hasRequest: false,
|
|
2090
|
+
requestUrl: null,
|
|
2091
|
+
requestMethod: null,
|
|
2092
|
+
requestHeaders: {}
|
|
2093
|
+
}
|
|
2094
|
+
},
|
|
2095
|
+
createConnState: (c, params) => {
|
|
2096
|
+
let requestInfo = null;
|
|
2097
|
+
if ((params == null ? void 0 : params.trackRequest) && c.request) {
|
|
2098
|
+
const headers = {};
|
|
2099
|
+
c.request.headers.forEach((value, key) => {
|
|
2100
|
+
headers[key] = value;
|
|
2101
|
+
});
|
|
2102
|
+
requestInfo = {
|
|
2103
|
+
hasRequest: true,
|
|
2104
|
+
requestUrl: c.request.url,
|
|
2105
|
+
requestMethod: c.request.method,
|
|
2106
|
+
requestHeaders: headers
|
|
2107
|
+
};
|
|
2108
|
+
}
|
|
2109
|
+
return {
|
|
2110
|
+
trackRequest: (params == null ? void 0 : params.trackRequest) || false,
|
|
2111
|
+
requestInfo
|
|
2112
|
+
};
|
|
2113
|
+
},
|
|
2114
|
+
onConnect: (c, conn) => {
|
|
2115
|
+
if (conn.state.requestInfo) {
|
|
2116
|
+
c.state.createConnStateRequest = conn.state.requestInfo;
|
|
2117
|
+
}
|
|
2118
|
+
},
|
|
2119
|
+
onBeforeConnect: (c, params) => {
|
|
2120
|
+
if (params == null ? void 0 : params.trackRequest) {
|
|
2121
|
+
if (c.request) {
|
|
2122
|
+
c.state.onBeforeConnectRequest.hasRequest = true;
|
|
2123
|
+
c.state.onBeforeConnectRequest.requestUrl = c.request.url;
|
|
2124
|
+
c.state.onBeforeConnectRequest.requestMethod = c.request.method;
|
|
2125
|
+
const headers = {};
|
|
2126
|
+
c.request.headers.forEach((value, key) => {
|
|
2127
|
+
headers[key] = value;
|
|
2128
|
+
});
|
|
2129
|
+
c.state.onBeforeConnectRequest.requestHeaders = headers;
|
|
2130
|
+
} else {
|
|
2131
|
+
c.state.onBeforeConnectRequest.hasRequest = false;
|
|
2132
|
+
}
|
|
2133
|
+
}
|
|
2134
|
+
},
|
|
2135
|
+
onRequest: (c, request) => {
|
|
2136
|
+
c.state.onRequestRequest.hasRequest = true;
|
|
2137
|
+
c.state.onRequestRequest.requestUrl = request.url;
|
|
2138
|
+
c.state.onRequestRequest.requestMethod = request.method;
|
|
2139
|
+
const headers = {};
|
|
2140
|
+
request.headers.forEach((value, key) => {
|
|
2141
|
+
headers[key] = value;
|
|
2142
|
+
});
|
|
2143
|
+
c.state.onRequestRequest.requestHeaders = headers;
|
|
2144
|
+
return new Response(
|
|
2145
|
+
JSON.stringify({
|
|
2146
|
+
hasRequest: true,
|
|
2147
|
+
requestUrl: request.url,
|
|
2148
|
+
requestMethod: request.method,
|
|
2149
|
+
requestHeaders: headers
|
|
2150
|
+
}),
|
|
2151
|
+
{
|
|
2152
|
+
status: 200,
|
|
2153
|
+
headers: { "Content-Type": "application/json" }
|
|
2154
|
+
}
|
|
2155
|
+
);
|
|
2156
|
+
},
|
|
2157
|
+
onWebSocket: (c, websocket) => {
|
|
2158
|
+
if (!c.request) throw "Missing request";
|
|
2159
|
+
c.state.onWebSocketRequest.hasRequest = true;
|
|
2160
|
+
c.state.onWebSocketRequest.requestUrl = c.request.url;
|
|
2161
|
+
c.state.onWebSocketRequest.requestMethod = c.request.method;
|
|
2162
|
+
const headers = {};
|
|
2163
|
+
c.request.headers.forEach((value, key) => {
|
|
2164
|
+
headers[key] = value;
|
|
2165
|
+
});
|
|
2166
|
+
c.state.onWebSocketRequest.requestHeaders = headers;
|
|
2167
|
+
websocket.send(
|
|
2168
|
+
JSON.stringify({
|
|
2169
|
+
hasRequest: true,
|
|
2170
|
+
requestUrl: c.request.url,
|
|
2171
|
+
requestMethod: c.request.method,
|
|
2172
|
+
requestHeaders: headers
|
|
2173
|
+
})
|
|
2174
|
+
);
|
|
2175
|
+
websocket.addEventListener("message", (event2) => {
|
|
2176
|
+
websocket.send(event2.data);
|
|
2177
|
+
});
|
|
2178
|
+
},
|
|
2179
|
+
actions: {
|
|
2180
|
+
getRequestInfo: (c) => {
|
|
2181
|
+
return {
|
|
2182
|
+
onBeforeConnect: c.state.onBeforeConnectRequest,
|
|
2183
|
+
createConnState: c.state.createConnStateRequest,
|
|
2184
|
+
onRequest: c.state.onRequestRequest,
|
|
2185
|
+
onWebSocket: c.state.onWebSocketRequest
|
|
2186
|
+
};
|
|
2187
|
+
}
|
|
2188
|
+
}
|
|
2189
|
+
});
|
|
2190
|
+
|
|
2191
|
+
// fixtures/driver-test-suite/reject-connection.ts
|
|
2192
|
+
var rejectConnectionActor = actor({
|
|
2193
|
+
onBeforeConnect: async (_c, params) => {
|
|
2194
|
+
if (params == null ? void 0 : params.reject) {
|
|
2195
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
2196
|
+
throw new UserError("Rejected connection", {
|
|
2197
|
+
code: "rejected"
|
|
2198
|
+
});
|
|
2199
|
+
}
|
|
2200
|
+
},
|
|
2201
|
+
actions: {
|
|
2202
|
+
ping: () => "pong"
|
|
2203
|
+
}
|
|
2204
|
+
});
|
|
2205
|
+
|
|
2206
|
+
// fixtures/driver-test-suite/scheduled.ts
|
|
2207
|
+
var scheduled = actor({
|
|
2208
|
+
state: {
|
|
2209
|
+
lastRun: 0,
|
|
2210
|
+
scheduledCount: 0,
|
|
2211
|
+
taskHistory: []
|
|
2212
|
+
},
|
|
2213
|
+
actions: {
|
|
2214
|
+
// Schedule using 'at' with specific timestamp
|
|
2215
|
+
scheduleTaskAt: (c, timestamp) => {
|
|
2216
|
+
c.schedule.at(timestamp, "onScheduledTask");
|
|
2217
|
+
return timestamp;
|
|
2218
|
+
},
|
|
2219
|
+
// Schedule using 'after' with delay
|
|
2220
|
+
scheduleTaskAfter: (c, delayMs) => {
|
|
2221
|
+
c.schedule.after(delayMs, "onScheduledTask");
|
|
2222
|
+
return Date.now() + delayMs;
|
|
2223
|
+
},
|
|
2224
|
+
// Schedule with a task ID for ordering tests
|
|
2225
|
+
scheduleTaskAfterWithId: (c, taskId, delayMs) => {
|
|
2226
|
+
c.schedule.after(delayMs, "onScheduledTaskWithId", taskId);
|
|
2227
|
+
return { taskId, scheduledFor: Date.now() + delayMs };
|
|
2228
|
+
},
|
|
2229
|
+
// Original method for backward compatibility
|
|
2230
|
+
scheduleTask: (c, delayMs) => {
|
|
2231
|
+
const timestamp = Date.now() + delayMs;
|
|
2232
|
+
c.schedule.at(timestamp, "onScheduledTask");
|
|
2233
|
+
return timestamp;
|
|
2234
|
+
},
|
|
2235
|
+
// Getters for state
|
|
2236
|
+
getLastRun: (c) => {
|
|
2237
|
+
return c.state.lastRun;
|
|
2238
|
+
},
|
|
2239
|
+
getScheduledCount: (c) => {
|
|
2240
|
+
return c.state.scheduledCount;
|
|
2241
|
+
},
|
|
2242
|
+
getTaskHistory: (c) => {
|
|
2243
|
+
return c.state.taskHistory;
|
|
2244
|
+
},
|
|
2245
|
+
clearHistory: (c) => {
|
|
2246
|
+
c.state.taskHistory = [];
|
|
2247
|
+
c.state.scheduledCount = 0;
|
|
2248
|
+
c.state.lastRun = 0;
|
|
2249
|
+
return true;
|
|
2250
|
+
},
|
|
2251
|
+
// Scheduled task handlers
|
|
2252
|
+
onScheduledTask: (c) => {
|
|
2253
|
+
c.state.lastRun = Date.now();
|
|
2254
|
+
c.state.scheduledCount++;
|
|
2255
|
+
c.broadcast("scheduled", {
|
|
2256
|
+
time: c.state.lastRun,
|
|
2257
|
+
count: c.state.scheduledCount
|
|
2258
|
+
});
|
|
2259
|
+
},
|
|
2260
|
+
onScheduledTaskWithId: (c, taskId) => {
|
|
2261
|
+
c.state.lastRun = Date.now();
|
|
2262
|
+
c.state.scheduledCount++;
|
|
2263
|
+
c.state.taskHistory.push(taskId);
|
|
2264
|
+
c.broadcast("scheduledWithId", {
|
|
2265
|
+
taskId,
|
|
2266
|
+
time: c.state.lastRun,
|
|
2267
|
+
count: c.state.scheduledCount
|
|
2268
|
+
});
|
|
2269
|
+
}
|
|
2270
|
+
}
|
|
2271
|
+
});
|
|
2272
|
+
|
|
2273
|
+
// fixtures/driver-test-suite/stateless.ts
|
|
2274
|
+
var statelessActor = actor({
|
|
2275
|
+
actions: {
|
|
2276
|
+
ping: () => "pong",
|
|
2277
|
+
echo: (c, message) => message,
|
|
2278
|
+
getActorId: (c) => c.actorId,
|
|
2279
|
+
// Try to access state - should throw StateNotEnabled
|
|
2280
|
+
tryGetState: (c) => {
|
|
2281
|
+
try {
|
|
2282
|
+
const state = c.state;
|
|
2283
|
+
return { success: true, state };
|
|
2284
|
+
} catch (error) {
|
|
2285
|
+
return { success: false, error: error.message };
|
|
2286
|
+
}
|
|
2287
|
+
},
|
|
2288
|
+
// Try to access db - should throw DatabaseNotEnabled
|
|
2289
|
+
tryGetDb: (c) => {
|
|
2290
|
+
try {
|
|
2291
|
+
const db3 = c.db;
|
|
2292
|
+
return { success: true, db: db3 };
|
|
2293
|
+
} catch (error) {
|
|
2294
|
+
return { success: false, error: error.message };
|
|
2295
|
+
}
|
|
2296
|
+
}
|
|
2297
|
+
}
|
|
2298
|
+
});
|
|
2299
|
+
|
|
2300
|
+
// fixtures/driver-test-suite/vars.ts
|
|
2301
|
+
var staticVarActor = actor({
|
|
2302
|
+
state: { value: 0 },
|
|
2303
|
+
connState: { hello: "world" },
|
|
2304
|
+
vars: { counter: 42, name: "test-actor" },
|
|
2305
|
+
actions: {
|
|
2306
|
+
getVars: (c) => {
|
|
2307
|
+
return c.vars;
|
|
2308
|
+
},
|
|
2309
|
+
getName: (c) => {
|
|
2310
|
+
return c.vars.name;
|
|
2311
|
+
}
|
|
2312
|
+
}
|
|
2313
|
+
});
|
|
2314
|
+
var nestedVarActor = actor({
|
|
2315
|
+
state: { value: 0 },
|
|
2316
|
+
connState: { hello: "world" },
|
|
2317
|
+
vars: {
|
|
2318
|
+
counter: 42,
|
|
2319
|
+
nested: {
|
|
2320
|
+
value: "original",
|
|
2321
|
+
array: [1, 2, 3],
|
|
2322
|
+
obj: { key: "value" }
|
|
2323
|
+
}
|
|
2324
|
+
},
|
|
2325
|
+
actions: {
|
|
2326
|
+
getVars: (c) => {
|
|
2327
|
+
return c.vars;
|
|
2328
|
+
},
|
|
2329
|
+
modifyNested: (c) => {
|
|
2330
|
+
c.vars.nested.value = "modified";
|
|
2331
|
+
c.vars.nested.array.push(4);
|
|
2332
|
+
c.vars.nested.obj.key = "new-value";
|
|
2333
|
+
return c.vars;
|
|
2334
|
+
}
|
|
2335
|
+
}
|
|
2336
|
+
});
|
|
2337
|
+
var dynamicVarActor = actor({
|
|
2338
|
+
state: { value: 0 },
|
|
2339
|
+
connState: { hello: "world" },
|
|
2340
|
+
createVars: () => {
|
|
2341
|
+
return {
|
|
2342
|
+
random: Math.random(),
|
|
2343
|
+
computed: `Actor-${Math.floor(Math.random() * 1e3)}`
|
|
2344
|
+
};
|
|
2345
|
+
},
|
|
2346
|
+
actions: {
|
|
2347
|
+
getVars: (c) => {
|
|
2348
|
+
return c.vars;
|
|
2349
|
+
}
|
|
2350
|
+
}
|
|
2351
|
+
});
|
|
2352
|
+
var uniqueVarActor = actor({
|
|
2353
|
+
state: { value: 0 },
|
|
2354
|
+
connState: { hello: "world" },
|
|
2355
|
+
createVars: () => {
|
|
2356
|
+
return {
|
|
2357
|
+
id: Math.floor(Math.random() * 1e6)
|
|
2358
|
+
};
|
|
2359
|
+
},
|
|
2360
|
+
actions: {
|
|
2361
|
+
getVars: (c) => {
|
|
2362
|
+
return c.vars;
|
|
2363
|
+
}
|
|
2364
|
+
}
|
|
2365
|
+
});
|
|
2366
|
+
var driverCtxActor = actor({
|
|
2367
|
+
state: { value: 0 },
|
|
2368
|
+
connState: { hello: "world" },
|
|
2369
|
+
createVars: (c, driverCtx) => {
|
|
2370
|
+
return {
|
|
2371
|
+
hasDriverCtx: Boolean(driverCtx == null ? void 0 : driverCtx.isTest)
|
|
2372
|
+
};
|
|
2373
|
+
},
|
|
2374
|
+
actions: {
|
|
2375
|
+
getVars: (c) => {
|
|
2376
|
+
return c.vars;
|
|
2377
|
+
}
|
|
2378
|
+
}
|
|
2379
|
+
});
|
|
2380
|
+
|
|
2381
|
+
// fixtures/driver-test-suite/registry.ts
|
|
2382
|
+
var registry = setup({
|
|
2383
|
+
use: {
|
|
2384
|
+
// From counter.ts
|
|
2385
|
+
counter,
|
|
2386
|
+
// From counter-conn.ts
|
|
2387
|
+
counterConn,
|
|
2388
|
+
// From lifecycle.ts
|
|
2389
|
+
counterWithLifecycle,
|
|
2390
|
+
// From scheduled.ts
|
|
2391
|
+
scheduled,
|
|
2392
|
+
// From sleep.ts
|
|
2393
|
+
sleep,
|
|
2394
|
+
sleepWithLongRpc,
|
|
2395
|
+
sleepWithRawHttp,
|
|
2396
|
+
sleepWithRawWebSocket,
|
|
2397
|
+
sleepWithNoSleepOption,
|
|
2398
|
+
// From error-handling.ts
|
|
2399
|
+
errorHandlingActor,
|
|
2400
|
+
customTimeoutActor,
|
|
2401
|
+
// From inline-client.ts
|
|
2402
|
+
inlineClientActor,
|
|
2403
|
+
// From kv.ts
|
|
2404
|
+
kvActor,
|
|
2405
|
+
// From queue.ts
|
|
2406
|
+
queueActor,
|
|
2407
|
+
queueLimitedActor,
|
|
2408
|
+
// From action-inputs.ts
|
|
2409
|
+
inputActor,
|
|
2410
|
+
// From action-timeout.ts
|
|
2411
|
+
shortTimeoutActor,
|
|
2412
|
+
longTimeoutActor,
|
|
2413
|
+
defaultTimeoutActor,
|
|
2414
|
+
syncTimeoutActor,
|
|
2415
|
+
// From action-types.ts
|
|
2416
|
+
syncActionActor,
|
|
2417
|
+
asyncActionActor,
|
|
2418
|
+
promiseActor,
|
|
2419
|
+
// From conn-params.ts
|
|
2420
|
+
counterWithParams,
|
|
2421
|
+
// From conn-state.ts
|
|
2422
|
+
connStateActor,
|
|
2423
|
+
// From metadata.ts
|
|
2424
|
+
metadataActor,
|
|
2425
|
+
// From vars.ts
|
|
2426
|
+
staticVarActor,
|
|
2427
|
+
nestedVarActor,
|
|
2428
|
+
dynamicVarActor,
|
|
2429
|
+
uniqueVarActor,
|
|
2430
|
+
driverCtxActor,
|
|
2431
|
+
// From raw-http.ts
|
|
2432
|
+
rawHttpActor,
|
|
2433
|
+
rawHttpNoHandlerActor,
|
|
2434
|
+
rawHttpVoidReturnActor,
|
|
2435
|
+
rawHttpHonoActor,
|
|
2436
|
+
// From raw-http-request-properties.ts
|
|
2437
|
+
rawHttpRequestPropertiesActor,
|
|
2438
|
+
// From raw-websocket.ts
|
|
2439
|
+
rawWebSocketActor,
|
|
2440
|
+
rawWebSocketBinaryActor,
|
|
2441
|
+
// From reject-connection.ts
|
|
2442
|
+
rejectConnectionActor,
|
|
2443
|
+
// From request-access.ts
|
|
2444
|
+
requestAccessActor,
|
|
2445
|
+
// From actor-onstatechange.ts
|
|
2446
|
+
onStateChangeActor,
|
|
2447
|
+
// From destroy.ts
|
|
2448
|
+
destroyActor,
|
|
2449
|
+
destroyObserver,
|
|
2450
|
+
// From hibernation.ts
|
|
2451
|
+
hibernationActor,
|
|
2452
|
+
// From file-system-hibernation-cleanup.ts
|
|
2453
|
+
fileSystemHibernationCleanupActor,
|
|
2454
|
+
// From large-payloads.ts
|
|
2455
|
+
largePayloadActor,
|
|
2456
|
+
largePayloadConnActor,
|
|
2457
|
+
// From run.ts
|
|
2458
|
+
runWithTicks,
|
|
2459
|
+
runWithQueueConsumer,
|
|
2460
|
+
runWithEarlyExit,
|
|
2461
|
+
runWithError,
|
|
2462
|
+
runWithoutHandler,
|
|
2463
|
+
// From workflow.ts
|
|
2464
|
+
workflowCounterActor,
|
|
2465
|
+
workflowQueueActor,
|
|
2466
|
+
workflowAccessActor,
|
|
2467
|
+
workflowSleepActor,
|
|
2468
|
+
workflowStopTeardownActor,
|
|
2469
|
+
// From actor-db-raw.ts
|
|
2470
|
+
dbActorRaw,
|
|
2471
|
+
// From actor-db-drizzle.ts
|
|
2472
|
+
dbActorDrizzle,
|
|
2473
|
+
// From db-lifecycle.ts
|
|
2474
|
+
dbLifecycle,
|
|
2475
|
+
dbLifecycleFailing,
|
|
2476
|
+
dbLifecycleObserver,
|
|
2477
|
+
// From stateless.ts
|
|
2478
|
+
statelessActor,
|
|
2479
|
+
// From access-control.ts
|
|
2480
|
+
accessControlActor,
|
|
2481
|
+
accessControlNoQueuesActor
|
|
2482
|
+
}
|
|
2483
|
+
});
|
|
2484
|
+
|
|
2485
|
+
// src/serve-test-suite/mod.ts
|
|
2486
|
+
async function getPort() {
|
|
2487
|
+
const MIN_PORT = 1e4;
|
|
2488
|
+
const MAX_PORT = 65535;
|
|
2489
|
+
const getRandomPort = () => Math.floor(Math.random() * (MAX_PORT - MIN_PORT + 1)) + MIN_PORT;
|
|
2490
|
+
let port = getRandomPort();
|
|
2491
|
+
let maxAttempts = 10;
|
|
2492
|
+
while (maxAttempts > 0) {
|
|
2493
|
+
try {
|
|
2494
|
+
const server = await new Promise((resolve, reject) => {
|
|
2495
|
+
const server2 = createServer();
|
|
2496
|
+
server2.once("error", (err) => {
|
|
2497
|
+
if (err.code === "EADDRINUSE") {
|
|
2498
|
+
reject(new Error(`Port ${port} is in use`));
|
|
2499
|
+
} else {
|
|
2500
|
+
reject(err);
|
|
2501
|
+
}
|
|
2502
|
+
});
|
|
2503
|
+
server2.once("listening", () => {
|
|
2504
|
+
resolve(server2);
|
|
2505
|
+
});
|
|
2506
|
+
server2.listen(port);
|
|
2507
|
+
});
|
|
2508
|
+
await new Promise((resolve) => {
|
|
2509
|
+
server.close(() => resolve());
|
|
2510
|
+
});
|
|
2511
|
+
return port;
|
|
2512
|
+
} catch {
|
|
2513
|
+
maxAttempts--;
|
|
2514
|
+
if (maxAttempts <= 0) {
|
|
2515
|
+
break;
|
|
2516
|
+
}
|
|
2517
|
+
port = getRandomPort();
|
|
2518
|
+
}
|
|
2519
|
+
}
|
|
2520
|
+
throw new Error("Could not find an available port after multiple attempts");
|
|
2521
|
+
}
|
|
2522
|
+
async function serveTestSuite() {
|
|
2523
|
+
var _a;
|
|
2524
|
+
registry.config.test = { ...registry.config.test, enabled: true };
|
|
2525
|
+
registry.config.inspector = {
|
|
2526
|
+
enabled: true,
|
|
2527
|
+
token: () => "token"
|
|
2528
|
+
};
|
|
2529
|
+
const port = await getPort();
|
|
2530
|
+
registry.config.managerPort = port;
|
|
2531
|
+
registry.config.serverless = {
|
|
2532
|
+
...registry.config.serverless,
|
|
2533
|
+
publicEndpoint: `http://127.0.0.1:${port}`
|
|
2534
|
+
};
|
|
2535
|
+
const driver = await createFileSystemOrMemoryDriver(true, {
|
|
2536
|
+
path: `/tmp/rivetkit-test-suite-${crypto.randomUUID()}`
|
|
2537
|
+
});
|
|
2538
|
+
registry.config.driver = driver;
|
|
2539
|
+
let upgradeWebSocket;
|
|
2540
|
+
const parsedConfig = registry.parseConfig();
|
|
2541
|
+
const managerDriver = (_a = driver.manager) == null ? void 0 : _a.call(driver, parsedConfig);
|
|
2542
|
+
invariant(managerDriver, "missing manager driver");
|
|
2543
|
+
const { router } = buildManagerRouter(
|
|
2544
|
+
parsedConfig,
|
|
2545
|
+
managerDriver,
|
|
2546
|
+
() => upgradeWebSocket
|
|
2547
|
+
);
|
|
2548
|
+
const nodeWebSocket = createNodeWebSocket({ app: router });
|
|
2549
|
+
upgradeWebSocket = nodeWebSocket.upgradeWebSocket;
|
|
2550
|
+
managerDriver.setGetUpgradeWebSocket(() => upgradeWebSocket);
|
|
2551
|
+
const server = honoServe({
|
|
2552
|
+
fetch: router.fetch,
|
|
2553
|
+
hostname: "127.0.0.1",
|
|
2554
|
+
port
|
|
2555
|
+
});
|
|
2556
|
+
invariant(
|
|
2557
|
+
nodeWebSocket.injectWebSocket !== void 0,
|
|
2558
|
+
"should have injectWebSocket"
|
|
2559
|
+
);
|
|
2560
|
+
nodeWebSocket.injectWebSocket(server);
|
|
2561
|
+
const endpoint = `http://127.0.0.1:${port}`;
|
|
2562
|
+
logger().info({ msg: "test suite server listening", port });
|
|
2563
|
+
return {
|
|
2564
|
+
endpoint,
|
|
2565
|
+
namespace: "default",
|
|
2566
|
+
runnerName: "default",
|
|
2567
|
+
close: async () => {
|
|
2568
|
+
await new Promise(
|
|
2569
|
+
(resolve) => server.close(() => resolve(void 0))
|
|
2570
|
+
);
|
|
2571
|
+
}
|
|
2572
|
+
};
|
|
2573
|
+
}
|
|
2574
|
+
async function runCli() {
|
|
2575
|
+
const result = await serveTestSuite();
|
|
2576
|
+
process.stdout.write(
|
|
2577
|
+
`${JSON.stringify({
|
|
2578
|
+
endpoint: result.endpoint,
|
|
2579
|
+
namespace: result.namespace,
|
|
2580
|
+
runnerName: result.runnerName
|
|
2581
|
+
})}
|
|
2582
|
+
`
|
|
2583
|
+
);
|
|
2584
|
+
const shutdown = async () => {
|
|
2585
|
+
await result.close();
|
|
2586
|
+
process.exit(0);
|
|
2587
|
+
};
|
|
2588
|
+
process.on("SIGINT", shutdown);
|
|
2589
|
+
process.on("SIGTERM", shutdown);
|
|
2590
|
+
}
|
|
2591
|
+
var mainPath = process.argv[1];
|
|
2592
|
+
if (mainPath && mainPath === fileURLToPath(import.meta.url)) {
|
|
2593
|
+
runCli().catch((err) => {
|
|
2594
|
+
logger().error({ msg: "serve-test-suite failed", error: err });
|
|
2595
|
+
process.exit(1);
|
|
2596
|
+
});
|
|
2597
|
+
}
|
|
2598
|
+
export {
|
|
2599
|
+
serveTestSuite
|
|
2600
|
+
};
|
|
2601
|
+
//# sourceMappingURL=mod.js.map
|