rivetkit 2.1.5 → 2.1.6-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/dist/browser/client.d.ts +593 -588
- package/dist/browser/client.js +215 -35
- package/dist/browser/client.js.map +1 -1
- package/dist/browser/inspector/client.js +109 -10
- package/dist/browser/inspector/client.js.map +1 -1
- package/dist/inspector.tar.gz +0 -0
- package/dist/tsup/actor/errors.cjs +2 -2
- package/dist/tsup/actor/errors.js +1 -1
- package/dist/tsup/{actor-router-consts-D29T1Z-K.d.cts → actor-router-consts-DU-1IdQj.d.cts} +1 -1
- package/dist/tsup/{actor-router-consts-D29T1Z-K.d.ts → actor-router-consts-DU-1IdQj.d.ts} +1 -1
- package/dist/tsup/chunk-2ELYUO6C.cjs +112 -0
- package/dist/tsup/chunk-2ELYUO6C.cjs.map +1 -0
- package/dist/tsup/chunk-2LY7RW3Y.cjs +2316 -0
- package/dist/tsup/chunk-2LY7RW3Y.cjs.map +1 -0
- package/dist/tsup/{chunk-L47L3ZWJ.cjs → chunk-6G7ZNM27.cjs} +11 -6
- package/dist/tsup/chunk-6G7ZNM27.cjs.map +1 -0
- package/dist/tsup/{chunk-PB5AEMKQ.cjs → chunk-A4KEUCB6.cjs} +84 -34
- package/dist/tsup/chunk-A4KEUCB6.cjs.map +1 -0
- package/dist/tsup/{chunk-7HTNH26M.js → chunk-AKUJ5OTO.js} +11 -6
- package/dist/tsup/chunk-AKUJ5OTO.js.map +1 -0
- package/dist/tsup/{chunk-TADUYCHF.js → chunk-C22JYHVT.js} +77 -27
- package/dist/tsup/chunk-C22JYHVT.js.map +1 -0
- package/dist/tsup/chunk-C4EB42ET.js +1459 -0
- package/dist/tsup/chunk-C4EB42ET.js.map +1 -0
- package/dist/tsup/chunk-CGGGBIDP.cjs +1459 -0
- package/dist/tsup/chunk-CGGGBIDP.cjs.map +1 -0
- package/dist/tsup/chunk-CMQPDBBR.cjs +1486 -0
- package/dist/tsup/chunk-CMQPDBBR.cjs.map +1 -0
- package/dist/tsup/{chunk-GQGRQDRL.cjs → chunk-DH6UINWA.cjs} +4 -4
- package/dist/tsup/{chunk-GQGRQDRL.cjs.map → chunk-DH6UINWA.cjs.map} +1 -1
- package/dist/tsup/chunk-DK46YYCJ.js +1486 -0
- package/dist/tsup/chunk-DK46YYCJ.js.map +1 -0
- package/dist/tsup/chunk-EGWXXBZV.js +2316 -0
- package/dist/tsup/chunk-EGWXXBZV.js.map +1 -0
- package/dist/tsup/{chunk-S662Y6ZU.js → chunk-EONWXYMN.js} +2 -2
- package/dist/tsup/{chunk-N4KRDJ56.js → chunk-GFGRBYO2.js} +35 -6
- package/dist/tsup/chunk-GFGRBYO2.js.map +1 -0
- package/dist/tsup/{chunk-IIJNPVPQ.cjs → chunk-GUHXWPGB.cjs} +1515 -1479
- package/dist/tsup/chunk-GUHXWPGB.cjs.map +1 -0
- package/dist/tsup/{chunk-TI5PXQGG.cjs → chunk-HNE2AK6C.cjs} +2375 -3713
- package/dist/tsup/chunk-HNE2AK6C.cjs.map +1 -0
- package/dist/tsup/{chunk-2OK7S6QF.js → chunk-I5I6OALK.js} +2 -2
- package/dist/tsup/chunk-IHQAF2HV.cjs +23 -0
- package/dist/tsup/chunk-IHQAF2HV.cjs.map +1 -0
- package/dist/tsup/{chunk-U5SMSA27.cjs → chunk-JJNZQDUN.cjs} +667 -2517
- package/dist/tsup/chunk-JJNZQDUN.cjs.map +1 -0
- package/dist/tsup/{chunk-ZPWOYQHN.js → chunk-JJSPHLJN.js} +219 -287
- package/dist/tsup/chunk-JJSPHLJN.js.map +1 -0
- package/dist/tsup/chunk-JRKPV5NJ.js +481 -0
- package/dist/tsup/chunk-JRKPV5NJ.js.map +1 -0
- package/dist/tsup/{chunk-VKVNIQRQ.js → chunk-K7MVU5SI.js} +36 -41
- package/dist/tsup/chunk-K7MVU5SI.js.map +1 -0
- package/dist/tsup/{chunk-KJSYAUOM.js → chunk-MLK3GY6P.js} +43 -27
- package/dist/tsup/chunk-MLK3GY6P.js.map +1 -0
- package/dist/tsup/{chunk-HYPIHCDT.cjs → chunk-MPLMTJY5.cjs} +123 -23
- package/dist/tsup/chunk-MPLMTJY5.cjs.map +1 -0
- package/dist/tsup/{chunk-MIX2KB6U.js → chunk-PQWI44WD.js} +1755 -3093
- package/dist/tsup/chunk-PQWI44WD.js.map +1 -0
- package/dist/tsup/{chunk-SR3KQE7Q.cjs → chunk-SQFCIDCG.cjs} +35 -6
- package/dist/tsup/chunk-SQFCIDCG.cjs.map +1 -0
- package/dist/tsup/{chunk-WY2SHWXQ.js → chunk-SVHJSM2E.js} +110 -24
- package/dist/tsup/chunk-SVHJSM2E.js.map +1 -0
- package/dist/tsup/chunk-T5KYKM6R.js +49 -0
- package/dist/tsup/chunk-T5KYKM6R.js.map +1 -0
- package/dist/tsup/{chunk-7WF2QSIC.cjs → chunk-TJ7DKW6F.cjs} +123 -37
- package/dist/tsup/chunk-TJ7DKW6F.cjs.map +1 -0
- package/dist/tsup/chunk-UQZRMTM3.js +23 -0
- package/dist/tsup/chunk-UQZRMTM3.js.map +1 -0
- package/dist/tsup/{chunk-JC6BEPE7.cjs → chunk-V3JSZR5P.cjs} +3 -3
- package/dist/tsup/{chunk-JC6BEPE7.cjs.map → chunk-V3JSZR5P.cjs.map} +1 -1
- package/dist/tsup/{chunk-OAXJWGMU.cjs → chunk-VBR35EQF.cjs} +271 -339
- package/dist/tsup/chunk-VBR35EQF.cjs.map +1 -0
- package/dist/tsup/{chunk-EIATSBYZ.js → chunk-VWYO36X4.js} +117 -17
- package/dist/tsup/chunk-VWYO36X4.js.map +1 -0
- package/dist/tsup/{chunk-JPXO2H55.js → chunk-WW27B6DM.js} +1452 -1416
- package/dist/tsup/chunk-WW27B6DM.js.map +1 -0
- package/dist/tsup/chunk-YAE3MEJM.cjs +49 -0
- package/dist/tsup/chunk-YAE3MEJM.cjs.map +1 -0
- package/dist/tsup/{chunk-SRIM3GHD.js → chunk-YGYGANCA.js} +473 -2323
- package/dist/tsup/chunk-YGYGANCA.js.map +1 -0
- package/dist/tsup/chunk-YZJWZBY5.cjs +481 -0
- package/dist/tsup/chunk-YZJWZBY5.cjs.map +1 -0
- package/dist/tsup/{chunk-ZFY5J2EP.cjs → chunk-ZZLJ5TSM.cjs} +39 -44
- package/dist/tsup/chunk-ZZLJ5TSM.cjs.map +1 -0
- package/dist/tsup/client/mod.cjs +10 -7
- package/dist/tsup/client/mod.cjs.map +1 -1
- package/dist/tsup/client/mod.d.cts +6 -6
- package/dist/tsup/client/mod.d.ts +6 -6
- package/dist/tsup/client/mod.js +11 -8
- package/dist/tsup/common/log.cjs +3 -3
- package/dist/tsup/common/log.js +2 -2
- package/dist/tsup/common/websocket.cjs +4 -4
- package/dist/tsup/common/websocket.js +3 -3
- package/dist/tsup/{config-Qj-zLJPc.d.ts → config-C2Wwnc69.d.ts} +142 -208
- package/dist/tsup/{config-BiNoIHRs.d.ts → config-DROwzBLT.d.cts} +82 -6
- package/dist/tsup/{config-BiNoIHRs.d.cts → config-DROwzBLT.d.ts} +82 -6
- package/dist/tsup/{config-iPj5l1bL.d.cts → config-ehT-_3BB.d.cts} +142 -208
- package/dist/tsup/{context-DzvH1PBK.d.cts → context-DGMJuAyc.d.ts} +16 -3
- package/dist/tsup/{context-CQCMuHND.d.ts → context-Dpp2RJbW.d.cts} +16 -3
- package/dist/tsup/db/drizzle/mod.cjs +3 -3
- package/dist/tsup/db/drizzle/mod.d.cts +1 -1
- package/dist/tsup/db/drizzle/mod.d.ts +1 -1
- package/dist/tsup/db/drizzle/mod.js +2 -2
- package/dist/tsup/db/mod.cjs +3 -3
- package/dist/tsup/db/mod.d.cts +1 -1
- package/dist/tsup/db/mod.d.ts +1 -1
- package/dist/tsup/db/mod.js +2 -2
- package/dist/tsup/{driver-Jo8v-kbU.d.ts → driver-CYZP9QYo.d.ts} +1 -1
- package/dist/tsup/{driver-iV8J-WMv.d.cts → driver-CoTFpipv.d.cts} +1 -1
- package/dist/tsup/driver-helpers/mod.cjs +7 -5
- package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
- package/dist/tsup/driver-helpers/mod.d.cts +17 -18
- package/dist/tsup/driver-helpers/mod.d.ts +17 -18
- package/dist/tsup/driver-helpers/mod.js +11 -9
- package/dist/tsup/driver-test-suite/mod.cjs +1275 -228
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/driver-test-suite/mod.d.cts +6 -5
- package/dist/tsup/driver-test-suite/mod.d.ts +6 -5
- package/dist/tsup/driver-test-suite/mod.js +1581 -534
- package/dist/tsup/driver-test-suite/mod.js.map +1 -1
- package/dist/tsup/inspector/mod.cjs +4 -4
- package/dist/tsup/inspector/mod.js +3 -3
- package/dist/tsup/mod.cjs +15 -9
- package/dist/tsup/mod.cjs.map +1 -1
- package/dist/tsup/mod.d.cts +9 -9
- package/dist/tsup/mod.d.ts +9 -9
- package/dist/tsup/mod.js +19 -13
- package/dist/tsup/sandbox/client.cjs +28 -0
- package/dist/tsup/sandbox/client.cjs.map +1 -0
- package/dist/tsup/sandbox/client.d.cts +88 -0
- package/dist/tsup/sandbox/client.d.ts +88 -0
- package/dist/tsup/sandbox/client.js +28 -0
- package/dist/tsup/sandbox/client.js.map +1 -0
- package/dist/tsup/sandbox/index.cjs +761 -0
- package/dist/tsup/sandbox/index.cjs.map +1 -0
- package/dist/tsup/sandbox/index.d.cts +120 -0
- package/dist/tsup/sandbox/index.d.ts +120 -0
- package/dist/tsup/sandbox/index.js +761 -0
- package/dist/tsup/sandbox/index.js.map +1 -0
- package/dist/tsup/sandbox/providers/computesdk.cjs +3 -0
- package/dist/tsup/sandbox/providers/computesdk.cjs.map +1 -0
- package/dist/tsup/sandbox/providers/computesdk.d.cts +7 -0
- package/dist/tsup/sandbox/providers/computesdk.d.ts +7 -0
- package/dist/tsup/sandbox/providers/computesdk.js +3 -0
- package/dist/tsup/sandbox/providers/computesdk.js.map +1 -0
- package/dist/tsup/sandbox/providers/daytona.cjs +3 -0
- package/dist/tsup/sandbox/providers/daytona.cjs.map +1 -0
- package/dist/tsup/sandbox/providers/daytona.d.cts +1 -0
- package/dist/tsup/sandbox/providers/daytona.d.ts +1 -0
- package/dist/tsup/sandbox/providers/daytona.js +3 -0
- package/dist/tsup/sandbox/providers/daytona.js.map +1 -0
- package/dist/tsup/sandbox/providers/docker.cjs +3 -0
- package/dist/tsup/sandbox/providers/docker.cjs.map +1 -0
- package/dist/tsup/sandbox/providers/docker.d.cts +1 -0
- package/dist/tsup/sandbox/providers/docker.d.ts +1 -0
- package/dist/tsup/sandbox/providers/docker.js +3 -0
- package/dist/tsup/sandbox/providers/docker.js.map +1 -0
- package/dist/tsup/sandbox/providers/e2b.cjs +3 -0
- package/dist/tsup/sandbox/providers/e2b.cjs.map +1 -0
- package/dist/tsup/sandbox/providers/e2b.d.cts +1 -0
- package/dist/tsup/sandbox/providers/e2b.d.ts +1 -0
- package/dist/tsup/sandbox/providers/e2b.js +3 -0
- package/dist/tsup/sandbox/providers/e2b.js.map +1 -0
- package/dist/tsup/sandbox/providers/local.cjs +3 -0
- package/dist/tsup/sandbox/providers/local.cjs.map +1 -0
- package/dist/tsup/sandbox/providers/local.d.cts +1 -0
- package/dist/tsup/sandbox/providers/local.d.ts +1 -0
- package/dist/tsup/sandbox/providers/local.js +3 -0
- package/dist/tsup/sandbox/providers/local.js.map +1 -0
- package/dist/tsup/sandbox/providers/modal.cjs +3 -0
- package/dist/tsup/sandbox/providers/modal.cjs.map +1 -0
- package/dist/tsup/sandbox/providers/modal.d.cts +1 -0
- package/dist/tsup/sandbox/providers/modal.d.ts +1 -0
- package/dist/tsup/sandbox/providers/modal.js +3 -0
- package/dist/tsup/sandbox/providers/modal.js.map +1 -0
- package/dist/tsup/sandbox/providers/vercel.cjs +3 -0
- package/dist/tsup/sandbox/providers/vercel.cjs.map +1 -0
- package/dist/tsup/sandbox/providers/vercel.d.cts +1 -0
- package/dist/tsup/sandbox/providers/vercel.d.ts +1 -0
- package/dist/tsup/sandbox/providers/vercel.js +3 -0
- package/dist/tsup/sandbox/providers/vercel.js.map +1 -0
- package/dist/tsup/serve-test-suite/mod.cjs +451 -327
- package/dist/tsup/serve-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/serve-test-suite/mod.js +362 -238
- package/dist/tsup/serve-test-suite/mod.js.map +1 -1
- package/dist/tsup/test/mod.cjs +17 -14
- package/dist/tsup/test/mod.cjs.map +1 -1
- package/dist/tsup/test/mod.d.cts +4 -4
- package/dist/tsup/test/mod.d.ts +4 -4
- package/dist/tsup/test/mod.js +14 -11
- package/dist/tsup/test/mod.js.map +1 -1
- package/dist/tsup/utils.cjs +3 -3
- package/dist/tsup/utils.js +2 -2
- package/dist/tsup/workflow/mod.cjs +6 -6
- package/dist/tsup/workflow/mod.d.cts +13 -9
- package/dist/tsup/workflow/mod.d.ts +13 -9
- package/dist/tsup/workflow/mod.js +5 -5
- package/package.json +114 -15
- package/src/actor/config.ts +94 -88
- package/src/actor/conn/drivers/websocket.ts +2 -1
- package/src/actor/contexts/base/actor.ts +27 -4
- package/src/actor/database.ts +6 -1
- package/src/actor/driver.ts +27 -8
- package/src/actor/errors.ts +10 -5
- package/src/actor/instance/connection-manager.ts +4 -3
- package/src/actor/instance/kv.ts +52 -9
- package/src/actor/instance/mod.ts +135 -84
- package/src/actor/instance/queue-manager.ts +2 -5
- package/src/actor/instance/queue.ts +31 -29
- package/src/actor/instance/state-manager.ts +7 -1
- package/src/actor/instance/traces-driver.ts +34 -36
- package/src/actor/metrics.ts +137 -0
- package/src/actor/protocol/old.ts +9 -12
- package/src/actor/router-websocket-endpoints.ts +12 -6
- package/src/actor/router.ts +46 -9
- package/src/actor/schema.ts +14 -22
- package/src/client/actor-common.ts +65 -0
- package/src/client/actor-conn.ts +71 -9
- package/src/client/actor-handle.ts +22 -5
- package/src/client/client.ts +32 -6
- package/src/client/config.ts +18 -21
- package/src/client/mod.ts +1 -0
- package/src/client/queue.ts +8 -6
- package/src/common/inline-websocket-adapter.ts +8 -2
- package/src/common/router.ts +1 -4
- package/src/common/utils.ts +2 -5
- package/src/db/config.ts +10 -5
- package/src/db/drizzle/mod.ts +51 -41
- package/src/db/mod.ts +54 -29
- package/src/db/shared.ts +42 -8
- package/src/driver-helpers/mod.ts +2 -1
- package/src/driver-helpers/sqlite-pool.ts +42 -0
- package/src/driver-helpers/utils.ts +0 -20
- package/src/driver-test-suite/mod.ts +11 -1
- package/src/driver-test-suite/tests/access-control.ts +19 -12
- package/src/driver-test-suite/tests/action-features.ts +20 -8
- package/src/driver-test-suite/tests/actor-conn.ts +94 -8
- package/src/driver-test-suite/tests/actor-db-kv-stats.ts +282 -0
- package/src/driver-test-suite/tests/actor-db-raw.ts +6 -2
- package/src/driver-test-suite/tests/actor-db.ts +101 -31
- package/src/driver-test-suite/tests/actor-inspector.ts +174 -32
- package/src/driver-test-suite/tests/actor-kv.ts +79 -33
- package/src/driver-test-suite/tests/actor-lifecycle.ts +4 -12
- package/src/driver-test-suite/tests/actor-queue.ts +125 -17
- package/src/driver-test-suite/tests/actor-run.ts +59 -55
- package/src/driver-test-suite/tests/actor-sandbox.ts +78 -0
- package/src/driver-test-suite/tests/actor-schedule.ts +1 -4
- package/src/driver-test-suite/tests/actor-sleep.ts +111 -0
- package/src/driver-test-suite/tests/actor-workflow.ts +387 -3
- package/src/driver-test-suite/tests/conn-error-serialization.ts +3 -1
- package/src/driver-test-suite/tests/raw-websocket.ts +5 -1
- package/src/drivers/default.ts +1 -3
- package/src/drivers/engine/actor-driver.ts +94 -21
- package/src/drivers/engine/config.ts +4 -12
- package/src/drivers/engine/mod.ts +1 -5
- package/src/drivers/file-system/actor.ts +43 -8
- package/src/drivers/file-system/global-state.ts +180 -64
- package/src/drivers/file-system/kv-limits.ts +1 -1
- package/src/drivers/file-system/sqlite-runtime.ts +13 -4
- package/src/engine-process/mod.ts +5 -1
- package/src/inspector/actor-inspector.ts +47 -21
- package/src/inspector/config.ts +1 -4
- package/src/inspector/mod.browser.ts +2 -2
- package/src/inspector/mod.ts +4 -1
- package/src/inspector/serve-ui.ts +0 -1
- package/src/inspector/workflow-history-json.ts +309 -0
- package/src/manager/gateway.ts +6 -2
- package/src/manager/router.ts +3 -3
- package/src/registry/config/index.ts +65 -12
- package/src/registry/config/runner.ts +19 -4
- package/src/registry/index.ts +42 -89
- package/src/sandbox/actor/db.ts +36 -0
- package/src/sandbox/actor/index.ts +476 -0
- package/src/sandbox/actor/session.ts +350 -0
- package/src/sandbox/actor.test.ts +36 -0
- package/src/sandbox/client.test.ts +484 -0
- package/src/sandbox/client.ts +707 -0
- package/src/sandbox/config.ts +151 -0
- package/src/sandbox/index.ts +41 -0
- package/src/sandbox/providers/computesdk.ts +1 -0
- package/src/sandbox/providers/daytona.ts +1 -0
- package/src/sandbox/providers/docker.ts +1 -0
- package/src/sandbox/providers/e2b.ts +1 -0
- package/src/sandbox/providers/local.ts +1 -0
- package/src/sandbox/providers/modal.ts +1 -0
- package/src/sandbox/providers/vercel.ts +1 -0
- package/src/sandbox/session-persist-driver.ts +180 -0
- package/src/sandbox/types.ts +138 -0
- package/src/serverless/configure.ts +5 -3
- package/src/serverless/router.test.ts +17 -9
- package/src/serverless/router.ts +20 -13
- package/src/test/mod.ts +3 -4
- package/src/utils/endpoint-parser.test.ts +6 -2
- package/src/utils/endpoint-parser.ts +6 -2
- package/src/utils/env-vars.ts +0 -2
- package/src/utils/node.ts +1 -1
- package/src/utils/serve.ts +10 -5
- package/src/utils.ts +6 -1
- package/src/workflow/constants.ts +1 -2
- package/src/workflow/context.ts +42 -9
- package/src/workflow/driver.ts +57 -23
- package/src/workflow/inspector.ts +7 -13
- package/src/workflow/mod.ts +91 -4
- package/dist/tsup/chunk-6LJAZ5R4.cjs +0 -96
- package/dist/tsup/chunk-6LJAZ5R4.cjs.map +0 -1
- package/dist/tsup/chunk-7HTNH26M.js.map +0 -1
- package/dist/tsup/chunk-7WF2QSIC.cjs.map +0 -1
- package/dist/tsup/chunk-D2SPAJVT.cjs +0 -645
- package/dist/tsup/chunk-D2SPAJVT.cjs.map +0 -1
- package/dist/tsup/chunk-EIATSBYZ.js.map +0 -1
- package/dist/tsup/chunk-HYPIHCDT.cjs.map +0 -1
- package/dist/tsup/chunk-IIJNPVPQ.cjs.map +0 -1
- package/dist/tsup/chunk-JPXO2H55.js.map +0 -1
- package/dist/tsup/chunk-KJSYAUOM.js.map +0 -1
- package/dist/tsup/chunk-L47L3ZWJ.cjs.map +0 -1
- package/dist/tsup/chunk-MIX2KB6U.js.map +0 -1
- package/dist/tsup/chunk-N4KRDJ56.js.map +0 -1
- package/dist/tsup/chunk-OAXJWGMU.cjs.map +0 -1
- package/dist/tsup/chunk-PB5AEMKQ.cjs.map +0 -1
- package/dist/tsup/chunk-R5OQUSLN.js +0 -645
- package/dist/tsup/chunk-R5OQUSLN.js.map +0 -1
- package/dist/tsup/chunk-SR3KQE7Q.cjs.map +0 -1
- package/dist/tsup/chunk-SRIM3GHD.js.map +0 -1
- package/dist/tsup/chunk-TADUYCHF.js.map +0 -1
- package/dist/tsup/chunk-TI5PXQGG.cjs.map +0 -1
- package/dist/tsup/chunk-U5SMSA27.cjs.map +0 -1
- package/dist/tsup/chunk-VKVNIQRQ.js.map +0 -1
- package/dist/tsup/chunk-WY2SHWXQ.js.map +0 -1
- package/dist/tsup/chunk-ZFY5J2EP.cjs.map +0 -1
- package/dist/tsup/chunk-ZPWOYQHN.js.map +0 -1
- package/src/db/sqlite-vfs.ts +0 -12
- /package/dist/tsup/{chunk-S662Y6ZU.js.map → chunk-EONWXYMN.js.map} +0 -0
- /package/dist/tsup/{chunk-2OK7S6QF.js.map → chunk-I5I6OALK.js.map} +0 -0
|
@@ -0,0 +1,2316 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
var _chunkJJNZQDUNcjs = require('./chunk-JJNZQDUN.cjs');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
var _chunkGUHXWPGBcjs = require('./chunk-GUHXWPGB.cjs');
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
var _chunkCGGGBIDPcjs = require('./chunk-CGGGBIDP.cjs');
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
var _chunkHNE2AK6Ccjs = require('./chunk-HNE2AK6C.cjs');
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
var _chunkMPLMTJY5cjs = require('./chunk-MPLMTJY5.cjs');
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
var _chunk6G7ZNM27cjs = require('./chunk-6G7ZNM27.cjs');
|
|
34
|
+
|
|
35
|
+
// src/common/inline-websocket-adapter.ts
|
|
36
|
+
var _ws = require('hono/ws');
|
|
37
|
+
var _virtualwebsocket = require('@rivetkit/virtual-websocket');
|
|
38
|
+
function logger() {
|
|
39
|
+
return _chunkMPLMTJY5cjs.getLogger.call(void 0, "inline-websocket-adapter");
|
|
40
|
+
}
|
|
41
|
+
var InlineWebSocketAdapter = class {
|
|
42
|
+
#handler;
|
|
43
|
+
#wsContext;
|
|
44
|
+
#readyState = 0;
|
|
45
|
+
#clientWs;
|
|
46
|
+
#actorWs;
|
|
47
|
+
constructor(handler) {
|
|
48
|
+
this.#handler = handler;
|
|
49
|
+
this.#clientWs = new (0, _virtualwebsocket.VirtualWebSocket)({
|
|
50
|
+
getReadyState: () => this.#readyState,
|
|
51
|
+
onSend: (data) => {
|
|
52
|
+
try {
|
|
53
|
+
this.#handler.onMessage({ data }, this.#wsContext);
|
|
54
|
+
this.#actorWs.triggerMessage(data);
|
|
55
|
+
} catch (err) {
|
|
56
|
+
this.#handleError(err);
|
|
57
|
+
this.#close(1011, "Internal error processing message");
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
onClose: (code, reason) => this.#close(code, reason)
|
|
61
|
+
});
|
|
62
|
+
this.#actorWs = new (0, _virtualwebsocket.VirtualWebSocket)({
|
|
63
|
+
getReadyState: () => this.#readyState,
|
|
64
|
+
onSend: (data) => this.#clientWs.triggerMessage(data),
|
|
65
|
+
onClose: (code, reason) => this.#close(code, reason)
|
|
66
|
+
});
|
|
67
|
+
this.#wsContext = new (0, _ws.WSContext)({
|
|
68
|
+
raw: this.#actorWs,
|
|
69
|
+
send: (data) => {
|
|
70
|
+
logger().debug({ msg: "WSContext.send called" });
|
|
71
|
+
this.#clientWs.triggerMessage(data);
|
|
72
|
+
},
|
|
73
|
+
close: (code, reason) => {
|
|
74
|
+
logger().debug({ msg: "WSContext.close called", code, reason });
|
|
75
|
+
this.#close(code || 1e3, reason || "");
|
|
76
|
+
},
|
|
77
|
+
readyState: 1
|
|
78
|
+
});
|
|
79
|
+
setTimeout(() => {
|
|
80
|
+
this.#initialize();
|
|
81
|
+
}, 0);
|
|
82
|
+
}
|
|
83
|
+
/** Get the client-side WebSocket (for proxy/client code) */
|
|
84
|
+
get clientWebSocket() {
|
|
85
|
+
return this.#clientWs;
|
|
86
|
+
}
|
|
87
|
+
/** Get the actor-side WebSocket (passed to actor via wsContext.raw) */
|
|
88
|
+
get actorWebSocket() {
|
|
89
|
+
return this.#actorWs;
|
|
90
|
+
}
|
|
91
|
+
async #initialize() {
|
|
92
|
+
try {
|
|
93
|
+
logger().debug({ msg: "websocket initializing" });
|
|
94
|
+
this.#readyState = 1;
|
|
95
|
+
logger().debug({ msg: "calling handler.onOpen with WSContext" });
|
|
96
|
+
this.#handler.onOpen(void 0, this.#wsContext);
|
|
97
|
+
this.#clientWs.triggerOpen();
|
|
98
|
+
this.#actorWs.triggerOpen();
|
|
99
|
+
} catch (err) {
|
|
100
|
+
this.#handleError(err);
|
|
101
|
+
this.#close(1011, "Internal error during initialization");
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
#handleError(err) {
|
|
105
|
+
logger().error({
|
|
106
|
+
msg: "error in websocket",
|
|
107
|
+
error: err,
|
|
108
|
+
errorMessage: err instanceof Error ? err.message : String(err),
|
|
109
|
+
stack: err instanceof Error ? err.stack : void 0
|
|
110
|
+
});
|
|
111
|
+
try {
|
|
112
|
+
this.#handler.onError(err, this.#wsContext);
|
|
113
|
+
} catch (handlerErr) {
|
|
114
|
+
logger().error({
|
|
115
|
+
msg: "error in onError handler",
|
|
116
|
+
error: handlerErr
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
this.#clientWs.triggerError(err);
|
|
120
|
+
this.#actorWs.triggerError(err);
|
|
121
|
+
}
|
|
122
|
+
#close(code, reason) {
|
|
123
|
+
if (this.#readyState === 3 || this.#readyState === 2) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
logger().debug({ msg: "closing websocket", code, reason });
|
|
127
|
+
this.#readyState = 2;
|
|
128
|
+
try {
|
|
129
|
+
this.#handler.onClose(
|
|
130
|
+
{ code, reason, wasClean: true },
|
|
131
|
+
this.#wsContext
|
|
132
|
+
);
|
|
133
|
+
} catch (err) {
|
|
134
|
+
logger().error({ msg: "error closing websocket", error: err });
|
|
135
|
+
} finally {
|
|
136
|
+
this.#readyState = 3;
|
|
137
|
+
this.#clientWs.triggerClose(code, reason);
|
|
138
|
+
this.#actorWs.triggerClose(code, reason);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
function createInlineWebSocket(handler) {
|
|
143
|
+
const adapter = new InlineWebSocketAdapter(handler);
|
|
144
|
+
return adapter.clientWebSocket;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// src/drivers/file-system/mod.ts
|
|
148
|
+
var _zod = require('zod');
|
|
149
|
+
|
|
150
|
+
// src/drivers/file-system/actor.ts
|
|
151
|
+
var FileSystemActorDriver = class {
|
|
152
|
+
#config;
|
|
153
|
+
#managerDriver;
|
|
154
|
+
#inlineClient;
|
|
155
|
+
#state;
|
|
156
|
+
#sqlitePool;
|
|
157
|
+
|
|
158
|
+
constructor(config4, managerDriver, inlineClient, state) {
|
|
159
|
+
this.#config = config4;
|
|
160
|
+
this.#managerDriver = managerDriver;
|
|
161
|
+
this.#inlineClient = inlineClient;
|
|
162
|
+
this.#state = state;
|
|
163
|
+
this.#sqlitePool = new (0, _chunkCGGGBIDPcjs.SqliteVfsPoolManager)(config4);
|
|
164
|
+
if (this.#state.persist) {
|
|
165
|
+
this.startSleep = (actorId) => {
|
|
166
|
+
this.#state.sleepActor(actorId);
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
async loadActor(actorId) {
|
|
171
|
+
return this.#state.startActor(
|
|
172
|
+
this.#config,
|
|
173
|
+
this.#inlineClient,
|
|
174
|
+
this,
|
|
175
|
+
actorId
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Get the current storage directory path
|
|
180
|
+
*/
|
|
181
|
+
get storagePath() {
|
|
182
|
+
return this.#state.storagePath;
|
|
183
|
+
}
|
|
184
|
+
getContext(_actorId) {
|
|
185
|
+
return {};
|
|
186
|
+
}
|
|
187
|
+
async kvBatchPut(actorId, entries) {
|
|
188
|
+
await this.#state.kvBatchPut(actorId, entries);
|
|
189
|
+
}
|
|
190
|
+
async kvBatchGet(actorId, keys) {
|
|
191
|
+
return await this.#state.kvBatchGet(actorId, keys);
|
|
192
|
+
}
|
|
193
|
+
async kvBatchDelete(actorId, keys) {
|
|
194
|
+
await this.#state.kvBatchDelete(actorId, keys);
|
|
195
|
+
}
|
|
196
|
+
async kvDeleteRange(actorId, start, end) {
|
|
197
|
+
await this.#state.kvDeleteRange(actorId, start, end);
|
|
198
|
+
}
|
|
199
|
+
async kvListPrefix(actorId, prefix, options) {
|
|
200
|
+
return await this.#state.kvListPrefix(actorId, prefix, options);
|
|
201
|
+
}
|
|
202
|
+
async kvListRange(actorId, start, end, options) {
|
|
203
|
+
return await this.#state.kvListRange(actorId, start, end, options);
|
|
204
|
+
}
|
|
205
|
+
async setAlarm(actor, timestamp) {
|
|
206
|
+
await this.#state.setActorAlarm(actor.id, timestamp);
|
|
207
|
+
}
|
|
208
|
+
/** Creates a SQLite VFS instance for creating KV-backed databases */
|
|
209
|
+
async createSqliteVfs(actorId) {
|
|
210
|
+
return await this.#sqlitePool.acquire(actorId);
|
|
211
|
+
}
|
|
212
|
+
async shutdownRunner(_immediate) {
|
|
213
|
+
await this.#sqlitePool.shutdown();
|
|
214
|
+
}
|
|
215
|
+
async startDestroy(actorId) {
|
|
216
|
+
await this.#state.destroyActor(actorId);
|
|
217
|
+
}
|
|
218
|
+
async onBeforeActorStart(actor) {
|
|
219
|
+
await actor.cleanupPersistedConnections("file-system-driver.start");
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
// src/drivers/file-system/global-state.ts
|
|
224
|
+
var _invariant = require('invariant'); var _invariant2 = _interopRequireDefault(_invariant);
|
|
225
|
+
|
|
226
|
+
// src/schemas/file-system-driver/versioned.ts
|
|
227
|
+
var _vbare = require('vbare');
|
|
228
|
+
|
|
229
|
+
// dist/schemas/file-system-driver/v1.ts
|
|
230
|
+
var _barets = require('@rivetkit/bare-ts'); var bare = _interopRequireWildcard(_barets); var bare2 = _interopRequireWildcard(_barets); var bare3 = _interopRequireWildcard(_barets);
|
|
231
|
+
var config = /* @__PURE__ */ bare.Config({});
|
|
232
|
+
function read0(bc) {
|
|
233
|
+
const len = bare.readUintSafe(bc);
|
|
234
|
+
if (len === 0) {
|
|
235
|
+
return [];
|
|
236
|
+
}
|
|
237
|
+
const result = [bare.readString(bc)];
|
|
238
|
+
for (let i = 1; i < len; i++) {
|
|
239
|
+
result[i] = bare.readString(bc);
|
|
240
|
+
}
|
|
241
|
+
return result;
|
|
242
|
+
}
|
|
243
|
+
function write0(bc, x) {
|
|
244
|
+
bare.writeUintSafe(bc, x.length);
|
|
245
|
+
for (let i = 0; i < x.length; i++) {
|
|
246
|
+
bare.writeString(bc, x[i]);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
function readActorState(bc) {
|
|
250
|
+
return {
|
|
251
|
+
actorId: bare.readString(bc),
|
|
252
|
+
name: bare.readString(bc),
|
|
253
|
+
key: read0(bc),
|
|
254
|
+
persistedData: bare.readData(bc),
|
|
255
|
+
createdAt: bare.readU64(bc)
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
function writeActorState(bc, x) {
|
|
259
|
+
bare.writeString(bc, x.actorId);
|
|
260
|
+
bare.writeString(bc, x.name);
|
|
261
|
+
write0(bc, x.key);
|
|
262
|
+
bare.writeData(bc, x.persistedData);
|
|
263
|
+
bare.writeU64(bc, x.createdAt);
|
|
264
|
+
}
|
|
265
|
+
function encodeActorState(x) {
|
|
266
|
+
const bc = new bare.ByteCursor(
|
|
267
|
+
new Uint8Array(config.initialBufferLength),
|
|
268
|
+
config
|
|
269
|
+
);
|
|
270
|
+
writeActorState(bc, x);
|
|
271
|
+
return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset);
|
|
272
|
+
}
|
|
273
|
+
function decodeActorState(bytes) {
|
|
274
|
+
const bc = new bare.ByteCursor(bytes, config);
|
|
275
|
+
const result = readActorState(bc);
|
|
276
|
+
if (bc.offset < bc.view.byteLength) {
|
|
277
|
+
throw new bare.BareError(bc.offset, "remaining bytes");
|
|
278
|
+
}
|
|
279
|
+
return result;
|
|
280
|
+
}
|
|
281
|
+
function readActorAlarm(bc) {
|
|
282
|
+
return {
|
|
283
|
+
actorId: bare.readString(bc),
|
|
284
|
+
timestamp: bare.readUint(bc)
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
function writeActorAlarm(bc, x) {
|
|
288
|
+
bare.writeString(bc, x.actorId);
|
|
289
|
+
bare.writeUint(bc, x.timestamp);
|
|
290
|
+
}
|
|
291
|
+
function encodeActorAlarm(x) {
|
|
292
|
+
const bc = new bare.ByteCursor(
|
|
293
|
+
new Uint8Array(config.initialBufferLength),
|
|
294
|
+
config
|
|
295
|
+
);
|
|
296
|
+
writeActorAlarm(bc, x);
|
|
297
|
+
return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset);
|
|
298
|
+
}
|
|
299
|
+
function decodeActorAlarm(bytes) {
|
|
300
|
+
const bc = new bare.ByteCursor(bytes, config);
|
|
301
|
+
const result = readActorAlarm(bc);
|
|
302
|
+
if (bc.offset < bc.view.byteLength) {
|
|
303
|
+
throw new bare.BareError(bc.offset, "remaining bytes");
|
|
304
|
+
}
|
|
305
|
+
return result;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// dist/schemas/file-system-driver/v2.ts
|
|
309
|
+
|
|
310
|
+
var config2 = /* @__PURE__ */ bare2.Config({});
|
|
311
|
+
function readActorKvEntry(bc) {
|
|
312
|
+
return {
|
|
313
|
+
key: bare2.readData(bc),
|
|
314
|
+
value: bare2.readData(bc)
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
function writeActorKvEntry(bc, x) {
|
|
318
|
+
bare2.writeData(bc, x.key);
|
|
319
|
+
bare2.writeData(bc, x.value);
|
|
320
|
+
}
|
|
321
|
+
function read02(bc) {
|
|
322
|
+
const len = bare2.readUintSafe(bc);
|
|
323
|
+
if (len === 0) {
|
|
324
|
+
return [];
|
|
325
|
+
}
|
|
326
|
+
const result = [bare2.readString(bc)];
|
|
327
|
+
for (let i = 1; i < len; i++) {
|
|
328
|
+
result[i] = bare2.readString(bc);
|
|
329
|
+
}
|
|
330
|
+
return result;
|
|
331
|
+
}
|
|
332
|
+
function write02(bc, x) {
|
|
333
|
+
bare2.writeUintSafe(bc, x.length);
|
|
334
|
+
for (let i = 0; i < x.length; i++) {
|
|
335
|
+
bare2.writeString(bc, x[i]);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
function read1(bc) {
|
|
339
|
+
const len = bare2.readUintSafe(bc);
|
|
340
|
+
if (len === 0) {
|
|
341
|
+
return [];
|
|
342
|
+
}
|
|
343
|
+
const result = [readActorKvEntry(bc)];
|
|
344
|
+
for (let i = 1; i < len; i++) {
|
|
345
|
+
result[i] = readActorKvEntry(bc);
|
|
346
|
+
}
|
|
347
|
+
return result;
|
|
348
|
+
}
|
|
349
|
+
function write1(bc, x) {
|
|
350
|
+
bare2.writeUintSafe(bc, x.length);
|
|
351
|
+
for (let i = 0; i < x.length; i++) {
|
|
352
|
+
writeActorKvEntry(bc, x[i]);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
function readActorState2(bc) {
|
|
356
|
+
return {
|
|
357
|
+
actorId: bare2.readString(bc),
|
|
358
|
+
name: bare2.readString(bc),
|
|
359
|
+
key: read02(bc),
|
|
360
|
+
kvStorage: read1(bc),
|
|
361
|
+
createdAt: bare2.readU64(bc)
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
function writeActorState2(bc, x) {
|
|
365
|
+
bare2.writeString(bc, x.actorId);
|
|
366
|
+
bare2.writeString(bc, x.name);
|
|
367
|
+
write02(bc, x.key);
|
|
368
|
+
write1(bc, x.kvStorage);
|
|
369
|
+
bare2.writeU64(bc, x.createdAt);
|
|
370
|
+
}
|
|
371
|
+
function encodeActorState2(x) {
|
|
372
|
+
const bc = new bare2.ByteCursor(
|
|
373
|
+
new Uint8Array(config2.initialBufferLength),
|
|
374
|
+
config2
|
|
375
|
+
);
|
|
376
|
+
writeActorState2(bc, x);
|
|
377
|
+
return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset);
|
|
378
|
+
}
|
|
379
|
+
function decodeActorState2(bytes) {
|
|
380
|
+
const bc = new bare2.ByteCursor(bytes, config2);
|
|
381
|
+
const result = readActorState2(bc);
|
|
382
|
+
if (bc.offset < bc.view.byteLength) {
|
|
383
|
+
throw new bare2.BareError(bc.offset, "remaining bytes");
|
|
384
|
+
}
|
|
385
|
+
return result;
|
|
386
|
+
}
|
|
387
|
+
function readActorAlarm2(bc) {
|
|
388
|
+
return {
|
|
389
|
+
actorId: bare2.readString(bc),
|
|
390
|
+
timestamp: bare2.readUint(bc)
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
function writeActorAlarm2(bc, x) {
|
|
394
|
+
bare2.writeString(bc, x.actorId);
|
|
395
|
+
bare2.writeUint(bc, x.timestamp);
|
|
396
|
+
}
|
|
397
|
+
function encodeActorAlarm2(x) {
|
|
398
|
+
const bc = new bare2.ByteCursor(
|
|
399
|
+
new Uint8Array(config2.initialBufferLength),
|
|
400
|
+
config2
|
|
401
|
+
);
|
|
402
|
+
writeActorAlarm2(bc, x);
|
|
403
|
+
return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset);
|
|
404
|
+
}
|
|
405
|
+
function decodeActorAlarm2(bytes) {
|
|
406
|
+
const bc = new bare2.ByteCursor(bytes, config2);
|
|
407
|
+
const result = readActorAlarm2(bc);
|
|
408
|
+
if (bc.offset < bc.view.byteLength) {
|
|
409
|
+
throw new bare2.BareError(bc.offset, "remaining bytes");
|
|
410
|
+
}
|
|
411
|
+
return result;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// dist/schemas/file-system-driver/v3.ts
|
|
415
|
+
|
|
416
|
+
var config3 = /* @__PURE__ */ bare3.Config({});
|
|
417
|
+
function readActorKvEntry2(bc) {
|
|
418
|
+
return {
|
|
419
|
+
key: bare3.readData(bc),
|
|
420
|
+
value: bare3.readData(bc)
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
function writeActorKvEntry2(bc, x) {
|
|
424
|
+
bare3.writeData(bc, x.key);
|
|
425
|
+
bare3.writeData(bc, x.value);
|
|
426
|
+
}
|
|
427
|
+
function read03(bc) {
|
|
428
|
+
const len = bare3.readUintSafe(bc);
|
|
429
|
+
if (len === 0) {
|
|
430
|
+
return [];
|
|
431
|
+
}
|
|
432
|
+
const result = [bare3.readString(bc)];
|
|
433
|
+
for (let i = 1; i < len; i++) {
|
|
434
|
+
result[i] = bare3.readString(bc);
|
|
435
|
+
}
|
|
436
|
+
return result;
|
|
437
|
+
}
|
|
438
|
+
function write03(bc, x) {
|
|
439
|
+
bare3.writeUintSafe(bc, x.length);
|
|
440
|
+
for (let i = 0; i < x.length; i++) {
|
|
441
|
+
bare3.writeString(bc, x[i]);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
function read12(bc) {
|
|
445
|
+
const len = bare3.readUintSafe(bc);
|
|
446
|
+
if (len === 0) {
|
|
447
|
+
return [];
|
|
448
|
+
}
|
|
449
|
+
const result = [readActorKvEntry2(bc)];
|
|
450
|
+
for (let i = 1; i < len; i++) {
|
|
451
|
+
result[i] = readActorKvEntry2(bc);
|
|
452
|
+
}
|
|
453
|
+
return result;
|
|
454
|
+
}
|
|
455
|
+
function write12(bc, x) {
|
|
456
|
+
bare3.writeUintSafe(bc, x.length);
|
|
457
|
+
for (let i = 0; i < x.length; i++) {
|
|
458
|
+
writeActorKvEntry2(bc, x[i]);
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
function read2(bc) {
|
|
462
|
+
return bare3.readBool(bc) ? bare3.readU64(bc) : null;
|
|
463
|
+
}
|
|
464
|
+
function write2(bc, x) {
|
|
465
|
+
bare3.writeBool(bc, x !== null);
|
|
466
|
+
if (x !== null) {
|
|
467
|
+
bare3.writeU64(bc, x);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
function readActorState3(bc) {
|
|
471
|
+
return {
|
|
472
|
+
actorId: bare3.readString(bc),
|
|
473
|
+
name: bare3.readString(bc),
|
|
474
|
+
key: read03(bc),
|
|
475
|
+
kvStorage: read12(bc),
|
|
476
|
+
createdAt: bare3.readU64(bc),
|
|
477
|
+
startTs: read2(bc),
|
|
478
|
+
connectableTs: read2(bc),
|
|
479
|
+
sleepTs: read2(bc),
|
|
480
|
+
destroyTs: read2(bc)
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
function writeActorState3(bc, x) {
|
|
484
|
+
bare3.writeString(bc, x.actorId);
|
|
485
|
+
bare3.writeString(bc, x.name);
|
|
486
|
+
write03(bc, x.key);
|
|
487
|
+
write12(bc, x.kvStorage);
|
|
488
|
+
bare3.writeU64(bc, x.createdAt);
|
|
489
|
+
write2(bc, x.startTs);
|
|
490
|
+
write2(bc, x.connectableTs);
|
|
491
|
+
write2(bc, x.sleepTs);
|
|
492
|
+
write2(bc, x.destroyTs);
|
|
493
|
+
}
|
|
494
|
+
function encodeActorState3(x) {
|
|
495
|
+
const bc = new bare3.ByteCursor(
|
|
496
|
+
new Uint8Array(config3.initialBufferLength),
|
|
497
|
+
config3
|
|
498
|
+
);
|
|
499
|
+
writeActorState3(bc, x);
|
|
500
|
+
return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset);
|
|
501
|
+
}
|
|
502
|
+
function decodeActorState3(bytes) {
|
|
503
|
+
const bc = new bare3.ByteCursor(bytes, config3);
|
|
504
|
+
const result = readActorState3(bc);
|
|
505
|
+
if (bc.offset < bc.view.byteLength) {
|
|
506
|
+
throw new bare3.BareError(bc.offset, "remaining bytes");
|
|
507
|
+
}
|
|
508
|
+
return result;
|
|
509
|
+
}
|
|
510
|
+
function readActorAlarm3(bc) {
|
|
511
|
+
return {
|
|
512
|
+
actorId: bare3.readString(bc),
|
|
513
|
+
timestamp: bare3.readUint(bc)
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
function writeActorAlarm3(bc, x) {
|
|
517
|
+
bare3.writeString(bc, x.actorId);
|
|
518
|
+
bare3.writeUint(bc, x.timestamp);
|
|
519
|
+
}
|
|
520
|
+
function encodeActorAlarm3(x) {
|
|
521
|
+
const bc = new bare3.ByteCursor(
|
|
522
|
+
new Uint8Array(config3.initialBufferLength),
|
|
523
|
+
config3
|
|
524
|
+
);
|
|
525
|
+
writeActorAlarm3(bc, x);
|
|
526
|
+
return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset);
|
|
527
|
+
}
|
|
528
|
+
function decodeActorAlarm3(bytes) {
|
|
529
|
+
const bc = new bare3.ByteCursor(bytes, config3);
|
|
530
|
+
const result = readActorAlarm3(bc);
|
|
531
|
+
if (bc.offset < bc.view.byteLength) {
|
|
532
|
+
throw new bare3.BareError(bc.offset, "remaining bytes");
|
|
533
|
+
}
|
|
534
|
+
return result;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
// src/schemas/file-system-driver/versioned.ts
|
|
538
|
+
var CURRENT_VERSION = 3;
|
|
539
|
+
var v1ToV2 = (v1State) => {
|
|
540
|
+
const kvStorage = [];
|
|
541
|
+
if (v1State.persistedData) {
|
|
542
|
+
const key = new Uint8Array([1]);
|
|
543
|
+
kvStorage.push({
|
|
544
|
+
key: _chunkMPLMTJY5cjs.bufferToArrayBuffer.call(void 0, key),
|
|
545
|
+
value: v1State.persistedData
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
return {
|
|
549
|
+
actorId: v1State.actorId,
|
|
550
|
+
name: v1State.name,
|
|
551
|
+
key: v1State.key,
|
|
552
|
+
kvStorage,
|
|
553
|
+
createdAt: v1State.createdAt
|
|
554
|
+
};
|
|
555
|
+
};
|
|
556
|
+
var v2ToV3 = (v2State) => {
|
|
557
|
+
return {
|
|
558
|
+
actorId: v2State.actorId,
|
|
559
|
+
name: v2State.name,
|
|
560
|
+
key: v2State.key,
|
|
561
|
+
kvStorage: v2State.kvStorage,
|
|
562
|
+
createdAt: v2State.createdAt,
|
|
563
|
+
startTs: null,
|
|
564
|
+
connectableTs: null,
|
|
565
|
+
sleepTs: null,
|
|
566
|
+
destroyTs: null
|
|
567
|
+
};
|
|
568
|
+
};
|
|
569
|
+
var v3ToV2 = (v3State) => {
|
|
570
|
+
return {
|
|
571
|
+
actorId: v3State.actorId,
|
|
572
|
+
name: v3State.name,
|
|
573
|
+
key: v3State.key,
|
|
574
|
+
kvStorage: v3State.kvStorage,
|
|
575
|
+
createdAt: v3State.createdAt
|
|
576
|
+
};
|
|
577
|
+
};
|
|
578
|
+
var v2ToV1 = (v2State) => {
|
|
579
|
+
const persistDataEntry = v2State.kvStorage.find((entry) => {
|
|
580
|
+
const key = new Uint8Array(entry.key);
|
|
581
|
+
return key.length === 1 && key[0] === 1;
|
|
582
|
+
});
|
|
583
|
+
return {
|
|
584
|
+
actorId: v2State.actorId,
|
|
585
|
+
name: v2State.name,
|
|
586
|
+
key: v2State.key,
|
|
587
|
+
persistedData: (persistDataEntry == null ? void 0 : persistDataEntry.value) || new ArrayBuffer(0),
|
|
588
|
+
createdAt: v2State.createdAt
|
|
589
|
+
};
|
|
590
|
+
};
|
|
591
|
+
var ACTOR_STATE_VERSIONED = _vbare.createVersionedDataHandler.call(void 0, {
|
|
592
|
+
deserializeVersion: (bytes, version) => {
|
|
593
|
+
switch (version) {
|
|
594
|
+
case 1:
|
|
595
|
+
return decodeActorState(bytes);
|
|
596
|
+
case 2:
|
|
597
|
+
return decodeActorState2(bytes);
|
|
598
|
+
case 3:
|
|
599
|
+
return decodeActorState3(bytes);
|
|
600
|
+
default:
|
|
601
|
+
throw new Error(`Unknown version ${version}`);
|
|
602
|
+
}
|
|
603
|
+
},
|
|
604
|
+
serializeVersion: (data, version) => {
|
|
605
|
+
switch (version) {
|
|
606
|
+
case 1:
|
|
607
|
+
return encodeActorState(data);
|
|
608
|
+
case 2:
|
|
609
|
+
return encodeActorState2(data);
|
|
610
|
+
case 3:
|
|
611
|
+
return encodeActorState3(data);
|
|
612
|
+
default:
|
|
613
|
+
throw new Error(`Unknown version ${version}`);
|
|
614
|
+
}
|
|
615
|
+
},
|
|
616
|
+
deserializeConverters: () => [v1ToV2, v2ToV3],
|
|
617
|
+
serializeConverters: () => [v3ToV2, v2ToV1]
|
|
618
|
+
});
|
|
619
|
+
var ACTOR_ALARM_VERSIONED = _vbare.createVersionedDataHandler.call(void 0, {
|
|
620
|
+
deserializeVersion: (bytes, version) => {
|
|
621
|
+
switch (version) {
|
|
622
|
+
case 1:
|
|
623
|
+
return decodeActorAlarm(bytes);
|
|
624
|
+
case 2:
|
|
625
|
+
return decodeActorAlarm2(bytes);
|
|
626
|
+
case 3:
|
|
627
|
+
return decodeActorAlarm3(bytes);
|
|
628
|
+
default:
|
|
629
|
+
throw new Error(`Unknown version ${version}`);
|
|
630
|
+
}
|
|
631
|
+
},
|
|
632
|
+
serializeVersion: (data, version) => {
|
|
633
|
+
switch (version) {
|
|
634
|
+
case 1:
|
|
635
|
+
return encodeActorAlarm(data);
|
|
636
|
+
case 2:
|
|
637
|
+
return encodeActorAlarm2(data);
|
|
638
|
+
case 3:
|
|
639
|
+
return encodeActorAlarm3(data);
|
|
640
|
+
default:
|
|
641
|
+
throw new Error(`Unknown version ${version}`);
|
|
642
|
+
}
|
|
643
|
+
},
|
|
644
|
+
deserializeConverters: () => [],
|
|
645
|
+
serializeConverters: () => []
|
|
646
|
+
});
|
|
647
|
+
|
|
648
|
+
// src/drivers/file-system/log.ts
|
|
649
|
+
function logger2() {
|
|
650
|
+
return _chunkMPLMTJY5cjs.getLogger.call(void 0, "driver-fs");
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
// src/drivers/file-system/utils.ts
|
|
654
|
+
function generateActorId(name, key) {
|
|
655
|
+
const jsonString = JSON.stringify([name, key]);
|
|
656
|
+
const crypto2 = _chunkCGGGBIDPcjs.getNodeCrypto.call(void 0, );
|
|
657
|
+
const hash = crypto2.createHash("sha256").update(jsonString).digest("hex").substring(0, 16);
|
|
658
|
+
return hash;
|
|
659
|
+
}
|
|
660
|
+
function createHashForPath(dirPath) {
|
|
661
|
+
const path = _chunkCGGGBIDPcjs.getNodePath.call(void 0, );
|
|
662
|
+
const normalizedPath = path.normalize(dirPath);
|
|
663
|
+
const lastComponent = path.basename(normalizedPath);
|
|
664
|
+
const crypto2 = _chunkCGGGBIDPcjs.getNodeCrypto.call(void 0, );
|
|
665
|
+
const hash = crypto2.createHash("sha256").update(normalizedPath).digest("hex").substring(0, 8);
|
|
666
|
+
return `${lastComponent}-${hash}`;
|
|
667
|
+
}
|
|
668
|
+
function getStoragePath() {
|
|
669
|
+
const dataPath = getDataPath("rivetkit");
|
|
670
|
+
const dirHash = createHashForPath(process.cwd());
|
|
671
|
+
const path = _chunkCGGGBIDPcjs.getNodePath.call(void 0, );
|
|
672
|
+
return path.join(dataPath, dirHash);
|
|
673
|
+
}
|
|
674
|
+
async function pathExists(path) {
|
|
675
|
+
try {
|
|
676
|
+
const fs = _chunkCGGGBIDPcjs.getNodeFs.call(void 0, );
|
|
677
|
+
await fs.access(path);
|
|
678
|
+
return true;
|
|
679
|
+
} catch (e) {
|
|
680
|
+
return false;
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
async function ensureDirectoryExists(directoryPath) {
|
|
684
|
+
if (!await pathExists(directoryPath)) {
|
|
685
|
+
const fs = _chunkCGGGBIDPcjs.getNodeFs.call(void 0, );
|
|
686
|
+
await fs.mkdir(directoryPath, { recursive: true });
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
function ensureDirectoryExistsSync(directoryPath) {
|
|
690
|
+
const fsSync = _chunkCGGGBIDPcjs.getNodeFsSync.call(void 0, );
|
|
691
|
+
if (!fsSync.existsSync(directoryPath)) {
|
|
692
|
+
fsSync.mkdirSync(directoryPath, { recursive: true });
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
function getDataPath(appName) {
|
|
696
|
+
const platform = process.platform;
|
|
697
|
+
const os = _chunkCGGGBIDPcjs.getNodeOs.call(void 0, );
|
|
698
|
+
const homeDir = os.homedir();
|
|
699
|
+
const path = _chunkCGGGBIDPcjs.getNodePath.call(void 0, );
|
|
700
|
+
switch (platform) {
|
|
701
|
+
case "win32":
|
|
702
|
+
return path.join(
|
|
703
|
+
process.env.APPDATA || path.join(homeDir, "AppData", "Roaming"),
|
|
704
|
+
appName
|
|
705
|
+
);
|
|
706
|
+
case "darwin":
|
|
707
|
+
return path.join(
|
|
708
|
+
homeDir,
|
|
709
|
+
"Library",
|
|
710
|
+
"Application Support",
|
|
711
|
+
appName
|
|
712
|
+
);
|
|
713
|
+
default:
|
|
714
|
+
return path.join(
|
|
715
|
+
process.env.XDG_DATA_HOME || path.join(homeDir, ".local", "share"),
|
|
716
|
+
appName
|
|
717
|
+
);
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
// src/drivers/file-system/sqlite-runtime.ts
|
|
722
|
+
function normalizeParams(params) {
|
|
723
|
+
if (!params || params.length === 0) {
|
|
724
|
+
return [];
|
|
725
|
+
}
|
|
726
|
+
return params.map((value) => {
|
|
727
|
+
if (value instanceof Uint8Array) {
|
|
728
|
+
return Buffer.from(value);
|
|
729
|
+
}
|
|
730
|
+
return value;
|
|
731
|
+
});
|
|
732
|
+
}
|
|
733
|
+
function createPreparedDatabaseAdapter(rawDb, prepare) {
|
|
734
|
+
return {
|
|
735
|
+
exec: (sql) => {
|
|
736
|
+
rawDb.exec(sql);
|
|
737
|
+
},
|
|
738
|
+
run: (sql, params) => {
|
|
739
|
+
const stmt = prepare(sql);
|
|
740
|
+
stmt.run(...normalizeParams(params));
|
|
741
|
+
},
|
|
742
|
+
get: (sql, params) => {
|
|
743
|
+
const stmt = prepare(sql);
|
|
744
|
+
return stmt.get(...normalizeParams(params));
|
|
745
|
+
},
|
|
746
|
+
all: (sql, params) => {
|
|
747
|
+
const stmt = prepare(sql);
|
|
748
|
+
return stmt.all(...normalizeParams(params));
|
|
749
|
+
},
|
|
750
|
+
close: () => {
|
|
751
|
+
rawDb.close();
|
|
752
|
+
}
|
|
753
|
+
};
|
|
754
|
+
}
|
|
755
|
+
function configureSqliteRuntimeDatabase(rawDb, path) {
|
|
756
|
+
rawDb.exec("PRAGMA busy_timeout = 5000");
|
|
757
|
+
if (path !== ":memory:") {
|
|
758
|
+
rawDb.exec("PRAGMA journal_mode = WAL");
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
function loadSqliteRuntime() {
|
|
762
|
+
const requireFn = _chunkCGGGBIDPcjs.getRequireFn.call(void 0, );
|
|
763
|
+
const loadErrors = [];
|
|
764
|
+
try {
|
|
765
|
+
const bunSqlite = requireFn(
|
|
766
|
+
/* webpackIgnore: true */
|
|
767
|
+
"bun:sqlite"
|
|
768
|
+
);
|
|
769
|
+
const BunDatabase = bunSqlite.Database;
|
|
770
|
+
if (BunDatabase) {
|
|
771
|
+
return {
|
|
772
|
+
kind: "bun",
|
|
773
|
+
open: (path) => {
|
|
774
|
+
var _a;
|
|
775
|
+
const rawDb = new BunDatabase(path);
|
|
776
|
+
configureSqliteRuntimeDatabase(rawDb, path);
|
|
777
|
+
const query = (_a = rawDb.query) == null ? void 0 : _a.bind(rawDb);
|
|
778
|
+
if (!query)
|
|
779
|
+
throw new Error(
|
|
780
|
+
"bun:sqlite database missing query method"
|
|
781
|
+
);
|
|
782
|
+
return createPreparedDatabaseAdapter(rawDb, query);
|
|
783
|
+
}
|
|
784
|
+
};
|
|
785
|
+
}
|
|
786
|
+
} catch (error) {
|
|
787
|
+
loadErrors.push(`bun:sqlite unavailable: ${String(error)}`);
|
|
788
|
+
}
|
|
789
|
+
try {
|
|
790
|
+
const nodeSqlite = requireFn(
|
|
791
|
+
/* webpackIgnore: true */
|
|
792
|
+
"node:sqlite"
|
|
793
|
+
);
|
|
794
|
+
const NodeDatabaseSync = nodeSqlite.DatabaseSync;
|
|
795
|
+
if (NodeDatabaseSync) {
|
|
796
|
+
return {
|
|
797
|
+
kind: "node",
|
|
798
|
+
open: (path) => {
|
|
799
|
+
var _a;
|
|
800
|
+
const rawDb = new NodeDatabaseSync(path);
|
|
801
|
+
configureSqliteRuntimeDatabase(rawDb, path);
|
|
802
|
+
const prepare = (_a = rawDb.prepare) == null ? void 0 : _a.bind(rawDb);
|
|
803
|
+
if (!prepare) {
|
|
804
|
+
throw new Error(
|
|
805
|
+
"node:sqlite DatabaseSync missing prepare method"
|
|
806
|
+
);
|
|
807
|
+
}
|
|
808
|
+
return createPreparedDatabaseAdapter(rawDb, prepare);
|
|
809
|
+
}
|
|
810
|
+
};
|
|
811
|
+
}
|
|
812
|
+
} catch (error) {
|
|
813
|
+
loadErrors.push(`node:sqlite unavailable: ${String(error)}`);
|
|
814
|
+
}
|
|
815
|
+
try {
|
|
816
|
+
const betterSqlite3Module = requireFn(
|
|
817
|
+
/* webpackIgnore: true */
|
|
818
|
+
"better-sqlite3"
|
|
819
|
+
);
|
|
820
|
+
const BetterSqlite3 = typeof betterSqlite3Module === "function" ? betterSqlite3Module : betterSqlite3Module.default;
|
|
821
|
+
if (BetterSqlite3) {
|
|
822
|
+
return {
|
|
823
|
+
kind: "better-sqlite3",
|
|
824
|
+
open: (path) => {
|
|
825
|
+
var _a;
|
|
826
|
+
const rawDb = new BetterSqlite3(path);
|
|
827
|
+
configureSqliteRuntimeDatabase(rawDb, path);
|
|
828
|
+
const prepare = (_a = rawDb.prepare) == null ? void 0 : _a.bind(rawDb);
|
|
829
|
+
if (!prepare) {
|
|
830
|
+
throw new Error(
|
|
831
|
+
"better-sqlite3 database missing prepare method"
|
|
832
|
+
);
|
|
833
|
+
}
|
|
834
|
+
return createPreparedDatabaseAdapter(rawDb, prepare);
|
|
835
|
+
}
|
|
836
|
+
};
|
|
837
|
+
}
|
|
838
|
+
} catch (error) {
|
|
839
|
+
loadErrors.push(`better-sqlite3 unavailable: ${String(error)}`);
|
|
840
|
+
throw new Error(
|
|
841
|
+
`No SQLite runtime available. Tried bun:sqlite, node:sqlite, and better-sqlite3. Install better-sqlite3 (e.g. "pnpm add better-sqlite3") if native runtimes are unavailable.
|
|
842
|
+
${loadErrors.join("\n")}`
|
|
843
|
+
);
|
|
844
|
+
}
|
|
845
|
+
throw new Error(
|
|
846
|
+
`No SQLite runtime available. Tried bun:sqlite, node:sqlite, and better-sqlite3.
|
|
847
|
+
${loadErrors.join("\n")}`
|
|
848
|
+
);
|
|
849
|
+
}
|
|
850
|
+
function computePrefixUpperBound(prefix) {
|
|
851
|
+
if (prefix.length === 0) {
|
|
852
|
+
return void 0;
|
|
853
|
+
}
|
|
854
|
+
const upperBound = new Uint8Array(prefix);
|
|
855
|
+
for (let i = upperBound.length - 1; i >= 0; i--) {
|
|
856
|
+
if (upperBound[i] !== 255) {
|
|
857
|
+
upperBound[i] += 1;
|
|
858
|
+
return upperBound.slice(0, i + 1);
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
return void 0;
|
|
862
|
+
}
|
|
863
|
+
function ensureUint8Array(value, fieldName) {
|
|
864
|
+
if (value instanceof Uint8Array) {
|
|
865
|
+
return value;
|
|
866
|
+
}
|
|
867
|
+
if (value instanceof ArrayBuffer) {
|
|
868
|
+
return new Uint8Array(value);
|
|
869
|
+
}
|
|
870
|
+
if (ArrayBuffer.isView(value)) {
|
|
871
|
+
return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
|
|
872
|
+
}
|
|
873
|
+
throw new Error(`SQLite row field "${fieldName}" is not binary data`);
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
// src/drivers/file-system/kv-limits.ts
|
|
877
|
+
var KV_MAX_KEY_SIZE = 2 * 1024;
|
|
878
|
+
var KV_MAX_VALUE_SIZE = 128 * 1024;
|
|
879
|
+
var KV_MAX_KEYS = 128;
|
|
880
|
+
var KV_MAX_PUT_PAYLOAD_SIZE = 976 * 1024;
|
|
881
|
+
var KV_MAX_STORAGE_SIZE = 10 * 1024 * 1024 * 1024;
|
|
882
|
+
var KV_KEY_WRAPPER_OVERHEAD_SIZE = 2;
|
|
883
|
+
function estimateKvSize(db) {
|
|
884
|
+
const row = db.get(
|
|
885
|
+
"SELECT COALESCE(SUM(LENGTH(key) + LENGTH(value)), 0) AS total FROM kv"
|
|
886
|
+
);
|
|
887
|
+
return row ? Number(_nullishCoalesce(row.total, () => ( 0))) : 0;
|
|
888
|
+
}
|
|
889
|
+
function validateKvKey(key, keyLabel = "key") {
|
|
890
|
+
if (key.byteLength + KV_KEY_WRAPPER_OVERHEAD_SIZE > KV_MAX_KEY_SIZE) {
|
|
891
|
+
throw new Error(`${keyLabel} is too long (max 2048 bytes)`);
|
|
892
|
+
}
|
|
893
|
+
}
|
|
894
|
+
function validateKvKeys(keys) {
|
|
895
|
+
if (keys.length > KV_MAX_KEYS) {
|
|
896
|
+
throw new Error("a maximum of 128 keys is allowed");
|
|
897
|
+
}
|
|
898
|
+
for (const key of keys) {
|
|
899
|
+
validateKvKey(key);
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
function validateKvEntries(entries, totalSize) {
|
|
903
|
+
if (entries.length > KV_MAX_KEYS) {
|
|
904
|
+
throw new Error("A maximum of 128 key-value entries is allowed");
|
|
905
|
+
}
|
|
906
|
+
let payloadSize = 0;
|
|
907
|
+
for (const [key, value] of entries) {
|
|
908
|
+
payloadSize += key.byteLength + KV_KEY_WRAPPER_OVERHEAD_SIZE + value.byteLength;
|
|
909
|
+
}
|
|
910
|
+
if (payloadSize > KV_MAX_PUT_PAYLOAD_SIZE) {
|
|
911
|
+
throw new Error("total payload is too large (max 976 KiB)");
|
|
912
|
+
}
|
|
913
|
+
const storageRemaining = Math.max(0, KV_MAX_STORAGE_SIZE - totalSize);
|
|
914
|
+
if (payloadSize > storageRemaining) {
|
|
915
|
+
throw new Error(
|
|
916
|
+
`not enough space left in storage (${storageRemaining} bytes remaining, current payload is ${payloadSize} bytes)`
|
|
917
|
+
);
|
|
918
|
+
}
|
|
919
|
+
for (const [key, value] of entries) {
|
|
920
|
+
validateKvKey(key);
|
|
921
|
+
if (value.byteLength > KV_MAX_VALUE_SIZE) {
|
|
922
|
+
throw new Error(
|
|
923
|
+
`value is too large (max ${KV_MAX_VALUE_SIZE / 1024} KiB)`
|
|
924
|
+
);
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
// src/drivers/file-system/global-state.ts
|
|
930
|
+
var DEFAULT_LIST_LIMIT = 16384;
|
|
931
|
+
function compareBytes(a, b) {
|
|
932
|
+
const len = Math.min(a.length, b.length);
|
|
933
|
+
for (let i = 0; i < len; i++) {
|
|
934
|
+
if (a[i] !== b[i]) {
|
|
935
|
+
return a[i] - b[i];
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
return a.length - b.length;
|
|
939
|
+
}
|
|
940
|
+
var FileSystemGlobalState = class {
|
|
941
|
+
#storagePath;
|
|
942
|
+
#stateDir;
|
|
943
|
+
#dbsDir;
|
|
944
|
+
#alarmsDir;
|
|
945
|
+
#persist;
|
|
946
|
+
#sqliteRuntime;
|
|
947
|
+
#actorKvDatabases = /* @__PURE__ */ new Map();
|
|
948
|
+
// IMPORTANT: Never delete from this map. Doing so will result in race
|
|
949
|
+
// conditions since the actor generation will cease to be tracked
|
|
950
|
+
// correctly. Always increment generation if a new actor is created.
|
|
951
|
+
#actors = /* @__PURE__ */ new Map();
|
|
952
|
+
#actorCountOnStartup = 0;
|
|
953
|
+
#runnerParams;
|
|
954
|
+
get persist() {
|
|
955
|
+
return this.#persist;
|
|
956
|
+
}
|
|
957
|
+
get storagePath() {
|
|
958
|
+
return this.#storagePath;
|
|
959
|
+
}
|
|
960
|
+
get actorCountOnStartup() {
|
|
961
|
+
return this.#actorCountOnStartup;
|
|
962
|
+
}
|
|
963
|
+
constructor(options = {}) {
|
|
964
|
+
const { persist = true, customPath, useNativeSqlite = true } = options;
|
|
965
|
+
if (!useNativeSqlite) {
|
|
966
|
+
throw new Error(
|
|
967
|
+
"File-system driver no longer supports non-SQLite KV storage."
|
|
968
|
+
);
|
|
969
|
+
}
|
|
970
|
+
this.#persist = persist;
|
|
971
|
+
this.#sqliteRuntime = loadSqliteRuntime();
|
|
972
|
+
this.#storagePath = persist ? _nullishCoalesce(customPath, () => ( getStoragePath())) : "/tmp";
|
|
973
|
+
const path = _chunkCGGGBIDPcjs.getNodePath.call(void 0, );
|
|
974
|
+
this.#stateDir = path.join(this.#storagePath, "state");
|
|
975
|
+
this.#dbsDir = path.join(this.#storagePath, "databases");
|
|
976
|
+
this.#alarmsDir = path.join(this.#storagePath, "alarms");
|
|
977
|
+
if (this.#persist) {
|
|
978
|
+
ensureDirectoryExistsSync(this.#stateDir);
|
|
979
|
+
ensureDirectoryExistsSync(this.#dbsDir);
|
|
980
|
+
ensureDirectoryExistsSync(this.#alarmsDir);
|
|
981
|
+
try {
|
|
982
|
+
const fsSync = _chunkCGGGBIDPcjs.getNodeFsSync.call(void 0, );
|
|
983
|
+
const actorIds = fsSync.readdirSync(this.#stateDir);
|
|
984
|
+
this.#actorCountOnStartup = actorIds.length;
|
|
985
|
+
} catch (error) {
|
|
986
|
+
logger2().error({ msg: "failed to count actors", error });
|
|
987
|
+
}
|
|
988
|
+
logger2().debug({
|
|
989
|
+
msg: "file system driver ready",
|
|
990
|
+
dir: this.#storagePath,
|
|
991
|
+
actorCount: this.#actorCountOnStartup,
|
|
992
|
+
sqliteRuntime: this.#sqliteRuntime.kind
|
|
993
|
+
});
|
|
994
|
+
try {
|
|
995
|
+
this.#cleanupTempFilesSync();
|
|
996
|
+
} catch (err) {
|
|
997
|
+
logger2().error({
|
|
998
|
+
msg: "failed to cleanup temp files",
|
|
999
|
+
error: err
|
|
1000
|
+
});
|
|
1001
|
+
}
|
|
1002
|
+
try {
|
|
1003
|
+
this.#migrateLegacyKvToSqliteOnStartupSync();
|
|
1004
|
+
} catch (error) {
|
|
1005
|
+
logger2().error({
|
|
1006
|
+
msg: "failed legacy kv startup migration",
|
|
1007
|
+
error
|
|
1008
|
+
});
|
|
1009
|
+
throw error;
|
|
1010
|
+
}
|
|
1011
|
+
} else {
|
|
1012
|
+
logger2().debug({
|
|
1013
|
+
msg: "memory driver ready",
|
|
1014
|
+
sqliteRuntime: this.#sqliteRuntime.kind
|
|
1015
|
+
});
|
|
1016
|
+
}
|
|
1017
|
+
}
|
|
1018
|
+
getActorStatePath(actorId) {
|
|
1019
|
+
return _chunkCGGGBIDPcjs.getNodePath.call(void 0, ).join(this.#stateDir, actorId);
|
|
1020
|
+
}
|
|
1021
|
+
getActorDbPath(actorId) {
|
|
1022
|
+
return _chunkCGGGBIDPcjs.getNodePath.call(void 0, ).join(this.#dbsDir, `${actorId}.db`);
|
|
1023
|
+
}
|
|
1024
|
+
getActorAlarmPath(actorId) {
|
|
1025
|
+
return _chunkCGGGBIDPcjs.getNodePath.call(void 0, ).join(this.#alarmsDir, actorId);
|
|
1026
|
+
}
|
|
1027
|
+
#getActorKvDatabasePath(actorId) {
|
|
1028
|
+
if (this.#persist) {
|
|
1029
|
+
return this.getActorDbPath(actorId);
|
|
1030
|
+
}
|
|
1031
|
+
return ":memory:";
|
|
1032
|
+
}
|
|
1033
|
+
#ensureActorKvTables(db) {
|
|
1034
|
+
db.exec(`
|
|
1035
|
+
CREATE TABLE IF NOT EXISTS kv (
|
|
1036
|
+
key BLOB PRIMARY KEY NOT NULL,
|
|
1037
|
+
value BLOB NOT NULL
|
|
1038
|
+
)
|
|
1039
|
+
`);
|
|
1040
|
+
}
|
|
1041
|
+
#getOrCreateActorKvDatabase(actorId) {
|
|
1042
|
+
const existing = this.#actorKvDatabases.get(actorId);
|
|
1043
|
+
if (existing) {
|
|
1044
|
+
return existing;
|
|
1045
|
+
}
|
|
1046
|
+
const dbPath = this.#getActorKvDatabasePath(actorId);
|
|
1047
|
+
if (this.#persist) {
|
|
1048
|
+
const path = _chunkCGGGBIDPcjs.getNodePath.call(void 0, );
|
|
1049
|
+
ensureDirectoryExistsSync(path.dirname(dbPath));
|
|
1050
|
+
}
|
|
1051
|
+
let db;
|
|
1052
|
+
try {
|
|
1053
|
+
db = this.#sqliteRuntime.open(dbPath);
|
|
1054
|
+
} catch (error) {
|
|
1055
|
+
throw new Error(
|
|
1056
|
+
`failed to open actor kv database for actor ${actorId} at ${dbPath}: ${error}`
|
|
1057
|
+
);
|
|
1058
|
+
}
|
|
1059
|
+
this.#ensureActorKvTables(db);
|
|
1060
|
+
this.#actorKvDatabases.set(actorId, db);
|
|
1061
|
+
return db;
|
|
1062
|
+
}
|
|
1063
|
+
#closeActorKvDatabase(actorId) {
|
|
1064
|
+
const db = this.#actorKvDatabases.get(actorId);
|
|
1065
|
+
if (!db) {
|
|
1066
|
+
return;
|
|
1067
|
+
}
|
|
1068
|
+
try {
|
|
1069
|
+
db.close();
|
|
1070
|
+
} finally {
|
|
1071
|
+
this.#actorKvDatabases.delete(actorId);
|
|
1072
|
+
}
|
|
1073
|
+
}
|
|
1074
|
+
#putKvEntriesInDb(db, entries) {
|
|
1075
|
+
if (entries.length === 0) {
|
|
1076
|
+
return;
|
|
1077
|
+
}
|
|
1078
|
+
db.exec("BEGIN");
|
|
1079
|
+
try {
|
|
1080
|
+
for (const [key, value] of entries) {
|
|
1081
|
+
db.run("INSERT OR REPLACE INTO kv (key, value) VALUES (?, ?)", [
|
|
1082
|
+
key,
|
|
1083
|
+
value
|
|
1084
|
+
]);
|
|
1085
|
+
}
|
|
1086
|
+
db.exec("COMMIT");
|
|
1087
|
+
} catch (error) {
|
|
1088
|
+
try {
|
|
1089
|
+
db.exec("ROLLBACK");
|
|
1090
|
+
} catch (e2) {
|
|
1091
|
+
}
|
|
1092
|
+
throw error;
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1095
|
+
#isKvDbPopulated(db) {
|
|
1096
|
+
const row = db.get(
|
|
1097
|
+
"SELECT COUNT(*) AS count FROM kv"
|
|
1098
|
+
);
|
|
1099
|
+
const count = row ? Number(row.count) : 0;
|
|
1100
|
+
return count > 0;
|
|
1101
|
+
}
|
|
1102
|
+
#migrateLegacyKvToSqliteOnStartupSync() {
|
|
1103
|
+
const fsSync = _chunkCGGGBIDPcjs.getNodeFsSync.call(void 0, );
|
|
1104
|
+
if (!fsSync.existsSync(this.#stateDir)) {
|
|
1105
|
+
return;
|
|
1106
|
+
}
|
|
1107
|
+
const actorIds = fsSync.readdirSync(this.#stateDir).filter((id) => !id.includes(".tmp."));
|
|
1108
|
+
for (const actorId of actorIds) {
|
|
1109
|
+
const statePath = this.getActorStatePath(actorId);
|
|
1110
|
+
let state;
|
|
1111
|
+
try {
|
|
1112
|
+
const stateBytes = fsSync.readFileSync(statePath);
|
|
1113
|
+
state = ACTOR_STATE_VERSIONED.deserializeWithEmbeddedVersion(
|
|
1114
|
+
new Uint8Array(stateBytes)
|
|
1115
|
+
);
|
|
1116
|
+
} catch (error) {
|
|
1117
|
+
logger2().warn({
|
|
1118
|
+
msg: "failed to parse actor state during startup migration",
|
|
1119
|
+
actorId,
|
|
1120
|
+
error
|
|
1121
|
+
});
|
|
1122
|
+
continue;
|
|
1123
|
+
}
|
|
1124
|
+
if (!state.kvStorage || state.kvStorage.length === 0) {
|
|
1125
|
+
continue;
|
|
1126
|
+
}
|
|
1127
|
+
const dbPath = this.getActorDbPath(actorId);
|
|
1128
|
+
const path = _chunkCGGGBIDPcjs.getNodePath.call(void 0, );
|
|
1129
|
+
ensureDirectoryExistsSync(path.dirname(dbPath));
|
|
1130
|
+
const db = this.#sqliteRuntime.open(dbPath);
|
|
1131
|
+
try {
|
|
1132
|
+
this.#ensureActorKvTables(db);
|
|
1133
|
+
if (this.#isKvDbPopulated(db)) {
|
|
1134
|
+
continue;
|
|
1135
|
+
}
|
|
1136
|
+
const legacyEntries = state.kvStorage.map((entry) => [
|
|
1137
|
+
new Uint8Array(entry.key),
|
|
1138
|
+
new Uint8Array(entry.value)
|
|
1139
|
+
]);
|
|
1140
|
+
this.#putKvEntriesInDb(db, legacyEntries);
|
|
1141
|
+
logger2().info({
|
|
1142
|
+
msg: "migrated legacy actor kv storage to sqlite",
|
|
1143
|
+
actorId,
|
|
1144
|
+
entryCount: legacyEntries.length
|
|
1145
|
+
});
|
|
1146
|
+
} finally {
|
|
1147
|
+
db.close();
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
1150
|
+
}
|
|
1151
|
+
async *getActorsIterator(params) {
|
|
1152
|
+
let actorIds = Array.from(this.#actors.keys()).sort();
|
|
1153
|
+
const fsSync = _chunkCGGGBIDPcjs.getNodeFsSync.call(void 0, );
|
|
1154
|
+
if (fsSync.existsSync(this.#stateDir)) {
|
|
1155
|
+
actorIds = fsSync.readdirSync(this.#stateDir).filter((id) => !id.includes(".tmp")).sort();
|
|
1156
|
+
}
|
|
1157
|
+
const startIndex = params.cursor ? actorIds.indexOf(params.cursor) + 1 : 0;
|
|
1158
|
+
for (let i = startIndex; i < actorIds.length; i++) {
|
|
1159
|
+
const actorId = actorIds[i];
|
|
1160
|
+
if (!actorId) {
|
|
1161
|
+
continue;
|
|
1162
|
+
}
|
|
1163
|
+
try {
|
|
1164
|
+
const state = await this.loadActorStateOrError(actorId);
|
|
1165
|
+
yield state;
|
|
1166
|
+
} catch (error) {
|
|
1167
|
+
logger2().error({
|
|
1168
|
+
msg: "failed to load actor state",
|
|
1169
|
+
actorId,
|
|
1170
|
+
error
|
|
1171
|
+
});
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
/**
|
|
1176
|
+
* Ensures an entry exists for this actor.
|
|
1177
|
+
*
|
|
1178
|
+
* Used for #createActor and #loadActor.
|
|
1179
|
+
*/
|
|
1180
|
+
#upsertEntry(actorId) {
|
|
1181
|
+
let entry = this.#actors.get(actorId);
|
|
1182
|
+
if (entry) {
|
|
1183
|
+
return entry;
|
|
1184
|
+
}
|
|
1185
|
+
entry = {
|
|
1186
|
+
id: actorId,
|
|
1187
|
+
lifecycleState: 0 /* NONEXISTENT */,
|
|
1188
|
+
generation: crypto.randomUUID()
|
|
1189
|
+
};
|
|
1190
|
+
this.#actors.set(actorId, entry);
|
|
1191
|
+
return entry;
|
|
1192
|
+
}
|
|
1193
|
+
/**
|
|
1194
|
+
* Creates a new actor and writes to file system.
|
|
1195
|
+
*/
|
|
1196
|
+
async createActor(actorId, name, key, input) {
|
|
1197
|
+
await this.#waitForActorStop(actorId);
|
|
1198
|
+
let entry = this.#upsertEntry(actorId);
|
|
1199
|
+
if (entry.state) {
|
|
1200
|
+
throw new (0, _chunk6G7ZNM27cjs.ActorDuplicateKey)(name, key);
|
|
1201
|
+
}
|
|
1202
|
+
if (this.isActorStopping(actorId)) {
|
|
1203
|
+
await this.#waitForActorStop(actorId);
|
|
1204
|
+
entry = this.#upsertEntry(actorId);
|
|
1205
|
+
}
|
|
1206
|
+
if (entry.lifecycleState === 4 /* DESTROYED */) {
|
|
1207
|
+
entry.lifecycleState = 0 /* NONEXISTENT */;
|
|
1208
|
+
entry.generation = crypto.randomUUID();
|
|
1209
|
+
}
|
|
1210
|
+
const initialKvState = _chunkCGGGBIDPcjs.getInitialActorKvState.call(void 0, input);
|
|
1211
|
+
await this.#withActorWrite(actorId, async (lockedEntry) => {
|
|
1212
|
+
lockedEntry.state = {
|
|
1213
|
+
actorId,
|
|
1214
|
+
name,
|
|
1215
|
+
key,
|
|
1216
|
+
createdAt: BigInt(Date.now()),
|
|
1217
|
+
kvStorage: [],
|
|
1218
|
+
startTs: null,
|
|
1219
|
+
connectableTs: null,
|
|
1220
|
+
sleepTs: null,
|
|
1221
|
+
destroyTs: null
|
|
1222
|
+
};
|
|
1223
|
+
lockedEntry.lifecycleState = 1 /* AWAKE */;
|
|
1224
|
+
if (this.#persist) {
|
|
1225
|
+
await this.#performWrite(
|
|
1226
|
+
actorId,
|
|
1227
|
+
lockedEntry.generation,
|
|
1228
|
+
lockedEntry.state
|
|
1229
|
+
);
|
|
1230
|
+
}
|
|
1231
|
+
if (initialKvState.length > 0) {
|
|
1232
|
+
const db = this.#getOrCreateActorKvDatabase(actorId);
|
|
1233
|
+
this.#putKvEntriesInDb(db, initialKvState);
|
|
1234
|
+
}
|
|
1235
|
+
});
|
|
1236
|
+
return entry;
|
|
1237
|
+
}
|
|
1238
|
+
/**
|
|
1239
|
+
* Loads the actor from disk or returns the existing actor entry. This will return an entry even if the actor does not actually exist.
|
|
1240
|
+
*/
|
|
1241
|
+
async loadActor(actorId) {
|
|
1242
|
+
const entry = this.#upsertEntry(actorId);
|
|
1243
|
+
if (entry.lifecycleState === 4 /* DESTROYED */) {
|
|
1244
|
+
return entry;
|
|
1245
|
+
}
|
|
1246
|
+
if (entry.state) {
|
|
1247
|
+
return entry;
|
|
1248
|
+
}
|
|
1249
|
+
if (!this.#persist) {
|
|
1250
|
+
return entry;
|
|
1251
|
+
}
|
|
1252
|
+
if (entry.loadPromise) {
|
|
1253
|
+
await entry.loadPromise;
|
|
1254
|
+
return entry;
|
|
1255
|
+
}
|
|
1256
|
+
entry.loadPromise = this.loadActorState(entry);
|
|
1257
|
+
return entry.loadPromise;
|
|
1258
|
+
}
|
|
1259
|
+
async loadActorState(entry) {
|
|
1260
|
+
const stateFilePath = this.getActorStatePath(entry.id);
|
|
1261
|
+
try {
|
|
1262
|
+
const fs = _chunkCGGGBIDPcjs.getNodeFs.call(void 0, );
|
|
1263
|
+
const stateData = await fs.readFile(stateFilePath);
|
|
1264
|
+
const loadedState = ACTOR_STATE_VERSIONED.deserializeWithEmbeddedVersion(
|
|
1265
|
+
new Uint8Array(stateData)
|
|
1266
|
+
);
|
|
1267
|
+
entry.state = {
|
|
1268
|
+
...loadedState,
|
|
1269
|
+
kvStorage: []
|
|
1270
|
+
};
|
|
1271
|
+
return entry;
|
|
1272
|
+
} catch (innerError) {
|
|
1273
|
+
if (innerError.code === "ENOENT") {
|
|
1274
|
+
entry.loadPromise = void 0;
|
|
1275
|
+
return entry;
|
|
1276
|
+
}
|
|
1277
|
+
const error = new Error(
|
|
1278
|
+
`Failed to load actor state: ${innerError}`
|
|
1279
|
+
);
|
|
1280
|
+
throw error;
|
|
1281
|
+
}
|
|
1282
|
+
}
|
|
1283
|
+
async loadOrCreateActor(actorId, name, key, input) {
|
|
1284
|
+
await this.#waitForActorStop(actorId);
|
|
1285
|
+
const entry = await this.loadActor(actorId);
|
|
1286
|
+
if (!entry.state) {
|
|
1287
|
+
if (this.isActorStopping(actorId)) {
|
|
1288
|
+
await this.#waitForActorStop(actorId);
|
|
1289
|
+
return await this.loadOrCreateActor(actorId, name, key, input);
|
|
1290
|
+
}
|
|
1291
|
+
if (entry.lifecycleState === 4 /* DESTROYED */) {
|
|
1292
|
+
entry.lifecycleState = 0 /* NONEXISTENT */;
|
|
1293
|
+
entry.generation = crypto.randomUUID();
|
|
1294
|
+
}
|
|
1295
|
+
const initialKvState = _chunkCGGGBIDPcjs.getInitialActorKvState.call(void 0, input);
|
|
1296
|
+
await this.#withActorWrite(actorId, async (lockedEntry) => {
|
|
1297
|
+
lockedEntry.state = {
|
|
1298
|
+
actorId,
|
|
1299
|
+
name,
|
|
1300
|
+
key,
|
|
1301
|
+
createdAt: BigInt(Date.now()),
|
|
1302
|
+
kvStorage: [],
|
|
1303
|
+
startTs: null,
|
|
1304
|
+
connectableTs: null,
|
|
1305
|
+
sleepTs: null,
|
|
1306
|
+
destroyTs: null
|
|
1307
|
+
};
|
|
1308
|
+
if (this.#persist) {
|
|
1309
|
+
await this.#performWrite(
|
|
1310
|
+
actorId,
|
|
1311
|
+
lockedEntry.generation,
|
|
1312
|
+
lockedEntry.state
|
|
1313
|
+
);
|
|
1314
|
+
}
|
|
1315
|
+
if (initialKvState.length > 0) {
|
|
1316
|
+
const db = this.#getOrCreateActorKvDatabase(actorId);
|
|
1317
|
+
this.#putKvEntriesInDb(db, initialKvState);
|
|
1318
|
+
}
|
|
1319
|
+
});
|
|
1320
|
+
}
|
|
1321
|
+
return entry;
|
|
1322
|
+
}
|
|
1323
|
+
async sleepActor(actorId) {
|
|
1324
|
+
var _a, _b;
|
|
1325
|
+
_invariant2.default.call(void 0,
|
|
1326
|
+
this.#persist,
|
|
1327
|
+
"cannot sleep actor with memory driver, must use file system driver"
|
|
1328
|
+
);
|
|
1329
|
+
const actor = this.#upsertEntry(actorId);
|
|
1330
|
+
_invariant2.default.call(void 0, actor, `tried to sleep ${actorId}, does not exist`);
|
|
1331
|
+
if (this.isActorStopping(actorId)) {
|
|
1332
|
+
return;
|
|
1333
|
+
}
|
|
1334
|
+
actor.lifecycleState = 2 /* STARTING_SLEEP */;
|
|
1335
|
+
actor.stopPromise = _chunkMPLMTJY5cjs.promiseWithResolvers.call(void 0,
|
|
1336
|
+
(reason) => logger2().warn({
|
|
1337
|
+
msg: "unhandled actor sleep stop promise rejection",
|
|
1338
|
+
reason
|
|
1339
|
+
})
|
|
1340
|
+
);
|
|
1341
|
+
if (actor.loadPromise) await actor.loadPromise.catch();
|
|
1342
|
+
if ((_a = actor.startPromise) == null ? void 0 : _a.promise)
|
|
1343
|
+
await actor.startPromise.promise.catch();
|
|
1344
|
+
try {
|
|
1345
|
+
if (actor.state) {
|
|
1346
|
+
await this.#withActorWrite(actorId, async (lockedEntry) => {
|
|
1347
|
+
if (!lockedEntry.state) {
|
|
1348
|
+
return;
|
|
1349
|
+
}
|
|
1350
|
+
lockedEntry.state = {
|
|
1351
|
+
...lockedEntry.state,
|
|
1352
|
+
sleepTs: BigInt(Date.now())
|
|
1353
|
+
};
|
|
1354
|
+
if (this.#persist) {
|
|
1355
|
+
await this.#performWrite(
|
|
1356
|
+
actorId,
|
|
1357
|
+
lockedEntry.generation,
|
|
1358
|
+
lockedEntry.state
|
|
1359
|
+
);
|
|
1360
|
+
}
|
|
1361
|
+
});
|
|
1362
|
+
}
|
|
1363
|
+
_invariant2.default.call(void 0, actor.actor, "actor should be loaded");
|
|
1364
|
+
await actor.actor.onStop("sleep");
|
|
1365
|
+
} finally {
|
|
1366
|
+
await this.#withActorWrite(actorId, async () => {
|
|
1367
|
+
});
|
|
1368
|
+
this.#closeActorKvDatabase(actorId);
|
|
1369
|
+
(_b = actor.stopPromise) == null ? void 0 : _b.resolve();
|
|
1370
|
+
actor.stopPromise = void 0;
|
|
1371
|
+
this.#actors.delete(actorId);
|
|
1372
|
+
}
|
|
1373
|
+
}
|
|
1374
|
+
async destroyActor(actorId) {
|
|
1375
|
+
var _a, _b;
|
|
1376
|
+
const actor = this.#upsertEntry(actorId);
|
|
1377
|
+
if (this.isActorStopping(actorId)) {
|
|
1378
|
+
return;
|
|
1379
|
+
}
|
|
1380
|
+
actor.lifecycleState = 3 /* STARTING_DESTROY */;
|
|
1381
|
+
actor.stopPromise = _chunkMPLMTJY5cjs.promiseWithResolvers.call(void 0,
|
|
1382
|
+
(reason) => logger2().warn({
|
|
1383
|
+
msg: "unhandled actor destroy stop promise rejection",
|
|
1384
|
+
reason
|
|
1385
|
+
})
|
|
1386
|
+
);
|
|
1387
|
+
if (actor.loadPromise) await actor.loadPromise.catch();
|
|
1388
|
+
if ((_a = actor.startPromise) == null ? void 0 : _a.promise)
|
|
1389
|
+
await actor.startPromise.promise.catch();
|
|
1390
|
+
try {
|
|
1391
|
+
if (actor.state) {
|
|
1392
|
+
await this.#withActorWrite(actorId, async (lockedEntry) => {
|
|
1393
|
+
if (!lockedEntry.state) {
|
|
1394
|
+
return;
|
|
1395
|
+
}
|
|
1396
|
+
lockedEntry.state = {
|
|
1397
|
+
...lockedEntry.state,
|
|
1398
|
+
destroyTs: BigInt(Date.now())
|
|
1399
|
+
};
|
|
1400
|
+
if (this.#persist) {
|
|
1401
|
+
await this.#performWrite(
|
|
1402
|
+
actorId,
|
|
1403
|
+
lockedEntry.generation,
|
|
1404
|
+
lockedEntry.state
|
|
1405
|
+
);
|
|
1406
|
+
}
|
|
1407
|
+
});
|
|
1408
|
+
}
|
|
1409
|
+
if (actor.actor) {
|
|
1410
|
+
await actor.actor.onStop("destroy");
|
|
1411
|
+
}
|
|
1412
|
+
await this.#withActorWrite(actorId, async () => {
|
|
1413
|
+
});
|
|
1414
|
+
this.#closeActorKvDatabase(actorId);
|
|
1415
|
+
if (actor.alarmTimeout) {
|
|
1416
|
+
actor.alarmTimeout.abort();
|
|
1417
|
+
}
|
|
1418
|
+
if (this.#persist) {
|
|
1419
|
+
const fs = _chunkCGGGBIDPcjs.getNodeFs.call(void 0, );
|
|
1420
|
+
await Promise.all([
|
|
1421
|
+
// Delete actor state file
|
|
1422
|
+
(async () => {
|
|
1423
|
+
try {
|
|
1424
|
+
await fs.unlink(this.getActorStatePath(actorId));
|
|
1425
|
+
} catch (err) {
|
|
1426
|
+
if ((err == null ? void 0 : err.code) !== "ENOENT") {
|
|
1427
|
+
logger2().error({
|
|
1428
|
+
msg: "failed to delete actor state file",
|
|
1429
|
+
actorId,
|
|
1430
|
+
error: _chunkMPLMTJY5cjs.stringifyError.call(void 0, err)
|
|
1431
|
+
});
|
|
1432
|
+
}
|
|
1433
|
+
}
|
|
1434
|
+
})(),
|
|
1435
|
+
// Delete actor database file
|
|
1436
|
+
(async () => {
|
|
1437
|
+
try {
|
|
1438
|
+
await fs.unlink(this.getActorDbPath(actorId));
|
|
1439
|
+
} catch (err) {
|
|
1440
|
+
if ((err == null ? void 0 : err.code) !== "ENOENT") {
|
|
1441
|
+
logger2().error({
|
|
1442
|
+
msg: "failed to delete actor database file",
|
|
1443
|
+
actorId,
|
|
1444
|
+
error: _chunkMPLMTJY5cjs.stringifyError.call(void 0, err)
|
|
1445
|
+
});
|
|
1446
|
+
}
|
|
1447
|
+
}
|
|
1448
|
+
})(),
|
|
1449
|
+
// Delete actor alarm file
|
|
1450
|
+
(async () => {
|
|
1451
|
+
try {
|
|
1452
|
+
await fs.unlink(this.getActorAlarmPath(actorId));
|
|
1453
|
+
} catch (err) {
|
|
1454
|
+
if ((err == null ? void 0 : err.code) !== "ENOENT") {
|
|
1455
|
+
logger2().error({
|
|
1456
|
+
msg: "failed to delete actor alarm file",
|
|
1457
|
+
actorId,
|
|
1458
|
+
error: _chunkMPLMTJY5cjs.stringifyError.call(void 0, err)
|
|
1459
|
+
});
|
|
1460
|
+
}
|
|
1461
|
+
}
|
|
1462
|
+
})()
|
|
1463
|
+
]);
|
|
1464
|
+
}
|
|
1465
|
+
} finally {
|
|
1466
|
+
await this.#withActorWrite(actorId, async () => {
|
|
1467
|
+
});
|
|
1468
|
+
(_b = actor.stopPromise) == null ? void 0 : _b.resolve();
|
|
1469
|
+
actor.stopPromise = void 0;
|
|
1470
|
+
actor.state = void 0;
|
|
1471
|
+
actor.loadPromise = void 0;
|
|
1472
|
+
actor.actor = void 0;
|
|
1473
|
+
actor.startPromise = void 0;
|
|
1474
|
+
actor.alarmTimeout = void 0;
|
|
1475
|
+
actor.alarmTimeout = void 0;
|
|
1476
|
+
actor.pendingWriteResolver = void 0;
|
|
1477
|
+
actor.lifecycleState = 4 /* DESTROYED */;
|
|
1478
|
+
}
|
|
1479
|
+
}
|
|
1480
|
+
/**
|
|
1481
|
+
* Save actor state to disk.
|
|
1482
|
+
*/
|
|
1483
|
+
async writeActor(actorId, generation, state) {
|
|
1484
|
+
if (!this.#persist) {
|
|
1485
|
+
return;
|
|
1486
|
+
}
|
|
1487
|
+
await this.#withActorWrite(actorId, async () => {
|
|
1488
|
+
await this.#performWrite(actorId, generation, state);
|
|
1489
|
+
});
|
|
1490
|
+
}
|
|
1491
|
+
isGenerationCurrentAndNotDestroyed(actorId, generation) {
|
|
1492
|
+
const entry = this.#upsertEntry(actorId);
|
|
1493
|
+
if (!entry) return false;
|
|
1494
|
+
return entry.generation === generation && entry.lifecycleState !== 3 /* STARTING_DESTROY */;
|
|
1495
|
+
}
|
|
1496
|
+
isActorStopping(actorId) {
|
|
1497
|
+
const entry = this.#upsertEntry(actorId);
|
|
1498
|
+
if (!entry) return false;
|
|
1499
|
+
return entry.lifecycleState === 2 /* STARTING_SLEEP */ || entry.lifecycleState === 3 /* STARTING_DESTROY */;
|
|
1500
|
+
}
|
|
1501
|
+
async #waitForActorStop(actorId) {
|
|
1502
|
+
while (true) {
|
|
1503
|
+
const entry = this.#actors.get(actorId);
|
|
1504
|
+
if (!(entry == null ? void 0 : entry.stopPromise)) {
|
|
1505
|
+
return;
|
|
1506
|
+
}
|
|
1507
|
+
try {
|
|
1508
|
+
await entry.stopPromise.promise;
|
|
1509
|
+
} catch (e3) {
|
|
1510
|
+
return;
|
|
1511
|
+
}
|
|
1512
|
+
}
|
|
1513
|
+
}
|
|
1514
|
+
async #withActorWrite(actorId, fn) {
|
|
1515
|
+
const entry = this.#actors.get(actorId);
|
|
1516
|
+
_invariant2.default.call(void 0, entry, "actor entry does not exist");
|
|
1517
|
+
const previousWrite = entry.pendingWriteResolver;
|
|
1518
|
+
const currentWrite = _chunkMPLMTJY5cjs.promiseWithResolvers.call(void 0,
|
|
1519
|
+
(reason) => logger2().warn({
|
|
1520
|
+
msg: "unhandled kv write promise rejection",
|
|
1521
|
+
reason
|
|
1522
|
+
})
|
|
1523
|
+
);
|
|
1524
|
+
entry.pendingWriteResolver = currentWrite;
|
|
1525
|
+
if (previousWrite) {
|
|
1526
|
+
try {
|
|
1527
|
+
await previousWrite.promise;
|
|
1528
|
+
} catch (e4) {
|
|
1529
|
+
}
|
|
1530
|
+
}
|
|
1531
|
+
try {
|
|
1532
|
+
return await fn(entry);
|
|
1533
|
+
} finally {
|
|
1534
|
+
currentWrite.resolve();
|
|
1535
|
+
if (entry.pendingWriteResolver === currentWrite) {
|
|
1536
|
+
entry.pendingWriteResolver = void 0;
|
|
1537
|
+
}
|
|
1538
|
+
}
|
|
1539
|
+
}
|
|
1540
|
+
async #waitForPendingWrite(actorId) {
|
|
1541
|
+
const entry = this.#actors.get(actorId);
|
|
1542
|
+
if (!(entry == null ? void 0 : entry.pendingWriteResolver)) {
|
|
1543
|
+
return;
|
|
1544
|
+
}
|
|
1545
|
+
while (entry.pendingWriteResolver) {
|
|
1546
|
+
const pending = entry.pendingWriteResolver;
|
|
1547
|
+
try {
|
|
1548
|
+
await pending.promise;
|
|
1549
|
+
} catch (e5) {
|
|
1550
|
+
}
|
|
1551
|
+
}
|
|
1552
|
+
}
|
|
1553
|
+
async setActorAlarm(actorId, timestamp) {
|
|
1554
|
+
const entry = this.#actors.get(actorId);
|
|
1555
|
+
_invariant2.default.call(void 0, entry, "actor entry does not exist");
|
|
1556
|
+
const writeGeneration = entry.generation;
|
|
1557
|
+
if (this.isActorStopping(actorId)) {
|
|
1558
|
+
logger2().info("skipping set alarm since actor stopping");
|
|
1559
|
+
return;
|
|
1560
|
+
}
|
|
1561
|
+
if (this.#persist) {
|
|
1562
|
+
const alarmPath = this.getActorAlarmPath(actorId);
|
|
1563
|
+
const crypto2 = _chunkCGGGBIDPcjs.getNodeCrypto.call(void 0, );
|
|
1564
|
+
const tempPath = `${alarmPath}.tmp.${crypto2.randomUUID()}`;
|
|
1565
|
+
try {
|
|
1566
|
+
const path = _chunkCGGGBIDPcjs.getNodePath.call(void 0, );
|
|
1567
|
+
await ensureDirectoryExists(path.dirname(alarmPath));
|
|
1568
|
+
const alarmData = {
|
|
1569
|
+
actorId,
|
|
1570
|
+
timestamp: BigInt(timestamp)
|
|
1571
|
+
};
|
|
1572
|
+
const data = ACTOR_ALARM_VERSIONED.serializeWithEmbeddedVersion(
|
|
1573
|
+
alarmData,
|
|
1574
|
+
CURRENT_VERSION
|
|
1575
|
+
);
|
|
1576
|
+
const fs = _chunkCGGGBIDPcjs.getNodeFs.call(void 0, );
|
|
1577
|
+
await fs.writeFile(tempPath, data);
|
|
1578
|
+
if (!this.isGenerationCurrentAndNotDestroyed(
|
|
1579
|
+
actorId,
|
|
1580
|
+
writeGeneration
|
|
1581
|
+
)) {
|
|
1582
|
+
logger2().debug(
|
|
1583
|
+
"skipping writing alarm since actor destroying or new generation"
|
|
1584
|
+
);
|
|
1585
|
+
return;
|
|
1586
|
+
}
|
|
1587
|
+
await fs.rename(tempPath, alarmPath);
|
|
1588
|
+
} catch (error) {
|
|
1589
|
+
try {
|
|
1590
|
+
const fs = _chunkCGGGBIDPcjs.getNodeFs.call(void 0, );
|
|
1591
|
+
await fs.unlink(tempPath);
|
|
1592
|
+
} catch (e6) {
|
|
1593
|
+
}
|
|
1594
|
+
logger2().error({
|
|
1595
|
+
msg: "failed to write alarm",
|
|
1596
|
+
actorId,
|
|
1597
|
+
error
|
|
1598
|
+
});
|
|
1599
|
+
throw new Error(`Failed to write alarm: ${error}`);
|
|
1600
|
+
}
|
|
1601
|
+
}
|
|
1602
|
+
this.#scheduleAlarmTimeout(actorId, timestamp);
|
|
1603
|
+
}
|
|
1604
|
+
/**
|
|
1605
|
+
* Perform the actual write operation with atomic writes
|
|
1606
|
+
*/
|
|
1607
|
+
async #performWrite(actorId, generation, state) {
|
|
1608
|
+
const dataPath = this.getActorStatePath(actorId);
|
|
1609
|
+
const crypto2 = _chunkCGGGBIDPcjs.getNodeCrypto.call(void 0, );
|
|
1610
|
+
const tempPath = `${dataPath}.tmp.${crypto2.randomUUID()}`;
|
|
1611
|
+
try {
|
|
1612
|
+
const path = _chunkCGGGBIDPcjs.getNodePath.call(void 0, );
|
|
1613
|
+
await ensureDirectoryExists(path.dirname(dataPath));
|
|
1614
|
+
const bareState = {
|
|
1615
|
+
actorId: state.actorId,
|
|
1616
|
+
name: state.name,
|
|
1617
|
+
key: state.key,
|
|
1618
|
+
createdAt: state.createdAt,
|
|
1619
|
+
kvStorage: state.kvStorage,
|
|
1620
|
+
startTs: state.startTs,
|
|
1621
|
+
connectableTs: state.connectableTs,
|
|
1622
|
+
sleepTs: state.sleepTs,
|
|
1623
|
+
destroyTs: state.destroyTs
|
|
1624
|
+
};
|
|
1625
|
+
const serializedState = ACTOR_STATE_VERSIONED.serializeWithEmbeddedVersion(
|
|
1626
|
+
bareState,
|
|
1627
|
+
CURRENT_VERSION
|
|
1628
|
+
);
|
|
1629
|
+
const fs = _chunkCGGGBIDPcjs.getNodeFs.call(void 0, );
|
|
1630
|
+
await fs.writeFile(tempPath, serializedState);
|
|
1631
|
+
if (!this.isGenerationCurrentAndNotDestroyed(actorId, generation)) {
|
|
1632
|
+
logger2().debug(
|
|
1633
|
+
"skipping writing alarm since actor destroying or new generation"
|
|
1634
|
+
);
|
|
1635
|
+
return;
|
|
1636
|
+
}
|
|
1637
|
+
await fs.rename(tempPath, dataPath);
|
|
1638
|
+
} catch (error) {
|
|
1639
|
+
try {
|
|
1640
|
+
const fs = _chunkCGGGBIDPcjs.getNodeFs.call(void 0, );
|
|
1641
|
+
await fs.unlink(tempPath);
|
|
1642
|
+
} catch (e7) {
|
|
1643
|
+
}
|
|
1644
|
+
logger2().error({
|
|
1645
|
+
msg: "failed to save actor state",
|
|
1646
|
+
actorId,
|
|
1647
|
+
error
|
|
1648
|
+
});
|
|
1649
|
+
throw new Error(`Failed to save actor state: ${error}`);
|
|
1650
|
+
}
|
|
1651
|
+
}
|
|
1652
|
+
/**
|
|
1653
|
+
* Call this method after the actor driver has been initiated.
|
|
1654
|
+
*
|
|
1655
|
+
* This will trigger all initial alarms from the file system.
|
|
1656
|
+
*
|
|
1657
|
+
* This needs to be sync since DriverConfig.actor is sync
|
|
1658
|
+
*/
|
|
1659
|
+
onRunnerStart(config4, inlineClient, actorDriver) {
|
|
1660
|
+
if (this.#runnerParams) {
|
|
1661
|
+
return;
|
|
1662
|
+
}
|
|
1663
|
+
this.#runnerParams = {
|
|
1664
|
+
config: config4,
|
|
1665
|
+
inlineClient,
|
|
1666
|
+
actorDriver
|
|
1667
|
+
};
|
|
1668
|
+
try {
|
|
1669
|
+
this.#loadAlarmsSync();
|
|
1670
|
+
} catch (err) {
|
|
1671
|
+
logger2().error({
|
|
1672
|
+
msg: "failed to load alarms on startup",
|
|
1673
|
+
error: err
|
|
1674
|
+
});
|
|
1675
|
+
}
|
|
1676
|
+
}
|
|
1677
|
+
async startActor(config4, inlineClient, actorDriver, actorId) {
|
|
1678
|
+
var _a;
|
|
1679
|
+
await this.#waitForActorStop(actorId);
|
|
1680
|
+
let entry = await this.loadActor(actorId);
|
|
1681
|
+
if (!entry.state) {
|
|
1682
|
+
throw new Error(
|
|
1683
|
+
`Actor does not exist and cannot be started: "${actorId}"`
|
|
1684
|
+
);
|
|
1685
|
+
}
|
|
1686
|
+
if (entry.startPromise) {
|
|
1687
|
+
await entry.startPromise.promise;
|
|
1688
|
+
_invariant2.default.call(void 0, entry.actor, "actor should have loaded");
|
|
1689
|
+
return entry.actor;
|
|
1690
|
+
}
|
|
1691
|
+
if (entry.actor) {
|
|
1692
|
+
if (entry.actor.isStopping || this.isActorStopping(actorId)) {
|
|
1693
|
+
await this.#waitForActorStop(actorId);
|
|
1694
|
+
entry = await this.loadActor(actorId);
|
|
1695
|
+
if (!entry.state) {
|
|
1696
|
+
throw new Error(
|
|
1697
|
+
`Actor does not exist and cannot be started: "${actorId}"`
|
|
1698
|
+
);
|
|
1699
|
+
}
|
|
1700
|
+
} else {
|
|
1701
|
+
return entry.actor;
|
|
1702
|
+
}
|
|
1703
|
+
}
|
|
1704
|
+
entry.startPromise = _chunkMPLMTJY5cjs.promiseWithResolvers.call(void 0,
|
|
1705
|
+
(reason) => logger2().warn({
|
|
1706
|
+
msg: "unhandled actor start promise rejection",
|
|
1707
|
+
reason
|
|
1708
|
+
})
|
|
1709
|
+
);
|
|
1710
|
+
try {
|
|
1711
|
+
const definition = _chunkJJNZQDUNcjs.lookupInRegistry.call(void 0, config4, entry.state.name);
|
|
1712
|
+
entry.actor = await definition.instantiate();
|
|
1713
|
+
entry.lifecycleState = 1 /* AWAKE */;
|
|
1714
|
+
await entry.actor.start(
|
|
1715
|
+
actorDriver,
|
|
1716
|
+
inlineClient,
|
|
1717
|
+
actorId,
|
|
1718
|
+
entry.state.name,
|
|
1719
|
+
entry.state.key,
|
|
1720
|
+
"unknown"
|
|
1721
|
+
);
|
|
1722
|
+
const now = BigInt(Date.now());
|
|
1723
|
+
await this.#withActorWrite(actorId, async (lockedEntry) => {
|
|
1724
|
+
if (!lockedEntry.state) {
|
|
1725
|
+
throw new Error(
|
|
1726
|
+
`Actor does not exist and cannot be started: "${actorId}"`
|
|
1727
|
+
);
|
|
1728
|
+
}
|
|
1729
|
+
lockedEntry.state = {
|
|
1730
|
+
...lockedEntry.state,
|
|
1731
|
+
startTs: now,
|
|
1732
|
+
connectableTs: now,
|
|
1733
|
+
sleepTs: null
|
|
1734
|
+
// Clear sleep timestamp when actor wakes up
|
|
1735
|
+
};
|
|
1736
|
+
if (this.#persist) {
|
|
1737
|
+
await this.#performWrite(
|
|
1738
|
+
actorId,
|
|
1739
|
+
lockedEntry.generation,
|
|
1740
|
+
lockedEntry.state
|
|
1741
|
+
);
|
|
1742
|
+
}
|
|
1743
|
+
});
|
|
1744
|
+
entry.startPromise.resolve();
|
|
1745
|
+
entry.startPromise = void 0;
|
|
1746
|
+
return entry.actor;
|
|
1747
|
+
} catch (innerError) {
|
|
1748
|
+
const error = new Error(
|
|
1749
|
+
`Failed to start actor ${actorId}: ${innerError}`,
|
|
1750
|
+
{ cause: innerError }
|
|
1751
|
+
);
|
|
1752
|
+
(_a = entry.startPromise) == null ? void 0 : _a.reject(error);
|
|
1753
|
+
entry.startPromise = void 0;
|
|
1754
|
+
throw error;
|
|
1755
|
+
}
|
|
1756
|
+
}
|
|
1757
|
+
async loadActorStateOrError(actorId) {
|
|
1758
|
+
const state = (await this.loadActor(actorId)).state;
|
|
1759
|
+
if (!state) throw new Error(`Actor does not exist: ${actorId}`);
|
|
1760
|
+
return state;
|
|
1761
|
+
}
|
|
1762
|
+
getActorOrError(actorId) {
|
|
1763
|
+
const entry = this.#actors.get(actorId);
|
|
1764
|
+
if (!entry) throw new Error(`No entry for actor: ${actorId}`);
|
|
1765
|
+
return entry;
|
|
1766
|
+
}
|
|
1767
|
+
async createDatabase(actorId) {
|
|
1768
|
+
return this.getActorDbPath(actorId);
|
|
1769
|
+
}
|
|
1770
|
+
/**
|
|
1771
|
+
* Load all persisted alarms from disk and schedule their timers.
|
|
1772
|
+
*/
|
|
1773
|
+
#loadAlarmsSync() {
|
|
1774
|
+
try {
|
|
1775
|
+
const fsSync = _chunkCGGGBIDPcjs.getNodeFsSync.call(void 0, );
|
|
1776
|
+
const files = fsSync.existsSync(this.#alarmsDir) ? fsSync.readdirSync(this.#alarmsDir) : [];
|
|
1777
|
+
for (const file of files) {
|
|
1778
|
+
if (file.includes(".tmp.")) continue;
|
|
1779
|
+
const path = _chunkCGGGBIDPcjs.getNodePath.call(void 0, );
|
|
1780
|
+
const fullPath = path.join(this.#alarmsDir, file);
|
|
1781
|
+
try {
|
|
1782
|
+
const buf = fsSync.readFileSync(fullPath);
|
|
1783
|
+
const alarmData = ACTOR_ALARM_VERSIONED.deserializeWithEmbeddedVersion(
|
|
1784
|
+
new Uint8Array(buf)
|
|
1785
|
+
);
|
|
1786
|
+
const timestamp = Number(alarmData.timestamp);
|
|
1787
|
+
if (Number.isFinite(timestamp)) {
|
|
1788
|
+
this.#scheduleAlarmTimeout(
|
|
1789
|
+
alarmData.actorId,
|
|
1790
|
+
timestamp
|
|
1791
|
+
);
|
|
1792
|
+
} else {
|
|
1793
|
+
logger2().debug({
|
|
1794
|
+
msg: "invalid alarm file contents",
|
|
1795
|
+
file
|
|
1796
|
+
});
|
|
1797
|
+
}
|
|
1798
|
+
} catch (err) {
|
|
1799
|
+
logger2().error({
|
|
1800
|
+
msg: "failed to read alarm file",
|
|
1801
|
+
file,
|
|
1802
|
+
error: _chunkMPLMTJY5cjs.stringifyError.call(void 0, err)
|
|
1803
|
+
});
|
|
1804
|
+
}
|
|
1805
|
+
}
|
|
1806
|
+
} catch (err) {
|
|
1807
|
+
logger2().error({
|
|
1808
|
+
msg: "failed to list alarms directory",
|
|
1809
|
+
error: err
|
|
1810
|
+
});
|
|
1811
|
+
}
|
|
1812
|
+
}
|
|
1813
|
+
/**
|
|
1814
|
+
* Schedule an alarm timer for an actor without writing to disk.
|
|
1815
|
+
*/
|
|
1816
|
+
#scheduleAlarmTimeout(actorId, timestamp) {
|
|
1817
|
+
var _a;
|
|
1818
|
+
const entry = this.#upsertEntry(actorId);
|
|
1819
|
+
if (entry.alarmTimestamp !== void 0 && timestamp >= entry.alarmTimestamp) {
|
|
1820
|
+
logger2().debug({
|
|
1821
|
+
msg: "skipping alarm schedule (later than existing)",
|
|
1822
|
+
actorId,
|
|
1823
|
+
timestamp,
|
|
1824
|
+
current: entry.alarmTimestamp
|
|
1825
|
+
});
|
|
1826
|
+
return;
|
|
1827
|
+
}
|
|
1828
|
+
logger2().debug({ msg: "scheduling alarm", actorId, timestamp });
|
|
1829
|
+
(_a = entry.alarmTimeout) == null ? void 0 : _a.abort();
|
|
1830
|
+
entry.alarmTimestamp = timestamp;
|
|
1831
|
+
const delay = Math.max(0, timestamp - Date.now());
|
|
1832
|
+
entry.alarmTimeout = _chunkMPLMTJY5cjs.setLongTimeout.call(void 0, async () => {
|
|
1833
|
+
entry.alarmTimestamp = void 0;
|
|
1834
|
+
if (this.#persist) {
|
|
1835
|
+
try {
|
|
1836
|
+
const fs = _chunkCGGGBIDPcjs.getNodeFs.call(void 0, );
|
|
1837
|
+
await fs.unlink(this.getActorAlarmPath(actorId));
|
|
1838
|
+
} catch (err) {
|
|
1839
|
+
if ((err == null ? void 0 : err.code) !== "ENOENT") {
|
|
1840
|
+
logger2().debug({
|
|
1841
|
+
msg: "failed to remove alarm file",
|
|
1842
|
+
actorId,
|
|
1843
|
+
error: _chunkMPLMTJY5cjs.stringifyError.call(void 0, err)
|
|
1844
|
+
});
|
|
1845
|
+
}
|
|
1846
|
+
}
|
|
1847
|
+
}
|
|
1848
|
+
try {
|
|
1849
|
+
logger2().debug({ msg: "triggering alarm", actorId, timestamp });
|
|
1850
|
+
const loaded = await this.loadActor(actorId);
|
|
1851
|
+
if (!loaded.state)
|
|
1852
|
+
throw new Error(`Actor does not exist: ${actorId}`);
|
|
1853
|
+
const runnerParams = this.#runnerParams;
|
|
1854
|
+
_invariant2.default.call(void 0, runnerParams, "missing runner params");
|
|
1855
|
+
if (!loaded.actor) {
|
|
1856
|
+
await this.startActor(
|
|
1857
|
+
runnerParams.config,
|
|
1858
|
+
runnerParams.inlineClient,
|
|
1859
|
+
runnerParams.actorDriver,
|
|
1860
|
+
actorId
|
|
1861
|
+
);
|
|
1862
|
+
}
|
|
1863
|
+
_invariant2.default.call(void 0, loaded.actor, "actor should be loaded after wake");
|
|
1864
|
+
await loaded.actor.onAlarm();
|
|
1865
|
+
} catch (err) {
|
|
1866
|
+
logger2().error({
|
|
1867
|
+
msg: "failed to handle alarm",
|
|
1868
|
+
actorId,
|
|
1869
|
+
error: _chunkMPLMTJY5cjs.stringifyError.call(void 0, err)
|
|
1870
|
+
});
|
|
1871
|
+
}
|
|
1872
|
+
}, delay);
|
|
1873
|
+
}
|
|
1874
|
+
/**
|
|
1875
|
+
* Cleanup stale temp files on startup (synchronous)
|
|
1876
|
+
*/
|
|
1877
|
+
#cleanupTempFilesSync() {
|
|
1878
|
+
try {
|
|
1879
|
+
const fsSync = _chunkCGGGBIDPcjs.getNodeFsSync.call(void 0, );
|
|
1880
|
+
const files = fsSync.readdirSync(this.#stateDir);
|
|
1881
|
+
const tempFiles = files.filter((f) => f.includes(".tmp."));
|
|
1882
|
+
const oneHourAgo = Date.now() - 36e5;
|
|
1883
|
+
for (const tempFile of tempFiles) {
|
|
1884
|
+
try {
|
|
1885
|
+
const path = _chunkCGGGBIDPcjs.getNodePath.call(void 0, );
|
|
1886
|
+
const fullPath = path.join(this.#stateDir, tempFile);
|
|
1887
|
+
const stat = fsSync.statSync(fullPath);
|
|
1888
|
+
if (stat.mtimeMs < oneHourAgo) {
|
|
1889
|
+
fsSync.unlinkSync(fullPath);
|
|
1890
|
+
logger2().info({
|
|
1891
|
+
msg: "cleaned up stale temp file",
|
|
1892
|
+
file: tempFile
|
|
1893
|
+
});
|
|
1894
|
+
}
|
|
1895
|
+
} catch (err) {
|
|
1896
|
+
logger2().debug({
|
|
1897
|
+
msg: "failed to cleanup temp file",
|
|
1898
|
+
file: tempFile,
|
|
1899
|
+
error: err
|
|
1900
|
+
});
|
|
1901
|
+
}
|
|
1902
|
+
}
|
|
1903
|
+
} catch (err) {
|
|
1904
|
+
logger2().error({
|
|
1905
|
+
msg: "failed to read actors directory for cleanup",
|
|
1906
|
+
error: err
|
|
1907
|
+
});
|
|
1908
|
+
}
|
|
1909
|
+
}
|
|
1910
|
+
/**
|
|
1911
|
+
* Batch put KV entries for an actor.
|
|
1912
|
+
*/
|
|
1913
|
+
async kvBatchPut(actorId, entries) {
|
|
1914
|
+
await this.loadActor(actorId);
|
|
1915
|
+
await this.#withActorWrite(actorId, async (entry) => {
|
|
1916
|
+
if (!entry.state) {
|
|
1917
|
+
if (this.isActorStopping(actorId)) {
|
|
1918
|
+
return;
|
|
1919
|
+
}
|
|
1920
|
+
throw new Error(`Actor ${actorId} state not loaded`);
|
|
1921
|
+
}
|
|
1922
|
+
const db = this.#getOrCreateActorKvDatabase(actorId);
|
|
1923
|
+
const totalSize = estimateKvSize(db);
|
|
1924
|
+
validateKvEntries(entries, totalSize);
|
|
1925
|
+
this.#putKvEntriesInDb(db, entries);
|
|
1926
|
+
});
|
|
1927
|
+
}
|
|
1928
|
+
/**
|
|
1929
|
+
* Batch get KV entries for an actor.
|
|
1930
|
+
*/
|
|
1931
|
+
async kvBatchGet(actorId, keys) {
|
|
1932
|
+
const entry = await this.loadActor(actorId);
|
|
1933
|
+
await this.#waitForPendingWrite(actorId);
|
|
1934
|
+
if (!entry.state) {
|
|
1935
|
+
if (this.isActorStopping(actorId)) {
|
|
1936
|
+
throw new Error(`Actor ${actorId} is stopping`);
|
|
1937
|
+
} else {
|
|
1938
|
+
throw new Error(`Actor ${actorId} state not loaded`);
|
|
1939
|
+
}
|
|
1940
|
+
}
|
|
1941
|
+
validateKvKeys(keys);
|
|
1942
|
+
const db = this.#getOrCreateActorKvDatabase(actorId);
|
|
1943
|
+
const results = [];
|
|
1944
|
+
for (const key of keys) {
|
|
1945
|
+
const row = db.get(
|
|
1946
|
+
"SELECT value FROM kv WHERE key = ?",
|
|
1947
|
+
[key]
|
|
1948
|
+
);
|
|
1949
|
+
if (!row) {
|
|
1950
|
+
results.push(null);
|
|
1951
|
+
continue;
|
|
1952
|
+
}
|
|
1953
|
+
results.push(ensureUint8Array(row.value, "value"));
|
|
1954
|
+
}
|
|
1955
|
+
return results;
|
|
1956
|
+
}
|
|
1957
|
+
/**
|
|
1958
|
+
* Batch delete KV entries for an actor.
|
|
1959
|
+
*/
|
|
1960
|
+
async kvBatchDelete(actorId, keys) {
|
|
1961
|
+
await this.loadActor(actorId);
|
|
1962
|
+
await this.#withActorWrite(actorId, async (entry) => {
|
|
1963
|
+
if (!entry.state) {
|
|
1964
|
+
if (this.isActorStopping(actorId)) {
|
|
1965
|
+
return;
|
|
1966
|
+
}
|
|
1967
|
+
throw new Error(`Actor ${actorId} state not loaded`);
|
|
1968
|
+
}
|
|
1969
|
+
if (keys.length === 0) {
|
|
1970
|
+
return;
|
|
1971
|
+
}
|
|
1972
|
+
validateKvKeys(keys);
|
|
1973
|
+
const db = this.#getOrCreateActorKvDatabase(actorId);
|
|
1974
|
+
db.exec("BEGIN");
|
|
1975
|
+
try {
|
|
1976
|
+
for (const key of keys) {
|
|
1977
|
+
db.run("DELETE FROM kv WHERE key = ?", [key]);
|
|
1978
|
+
}
|
|
1979
|
+
db.exec("COMMIT");
|
|
1980
|
+
} catch (error) {
|
|
1981
|
+
try {
|
|
1982
|
+
db.exec("ROLLBACK");
|
|
1983
|
+
} catch (e8) {
|
|
1984
|
+
}
|
|
1985
|
+
throw error;
|
|
1986
|
+
}
|
|
1987
|
+
});
|
|
1988
|
+
}
|
|
1989
|
+
/**
|
|
1990
|
+
* Delete KV entries in the half-open range [start, end).
|
|
1991
|
+
*/
|
|
1992
|
+
async kvDeleteRange(actorId, start, end) {
|
|
1993
|
+
await this.loadActor(actorId);
|
|
1994
|
+
await this.#withActorWrite(actorId, async (entry) => {
|
|
1995
|
+
if (!entry.state) {
|
|
1996
|
+
if (this.isActorStopping(actorId)) {
|
|
1997
|
+
return;
|
|
1998
|
+
}
|
|
1999
|
+
throw new Error(`Actor ${actorId} state not loaded`);
|
|
2000
|
+
}
|
|
2001
|
+
validateKvKey(start, "start key");
|
|
2002
|
+
validateKvKey(end, "end key");
|
|
2003
|
+
if (compareBytes(start, end) >= 0) {
|
|
2004
|
+
return;
|
|
2005
|
+
}
|
|
2006
|
+
const db = this.#getOrCreateActorKvDatabase(actorId);
|
|
2007
|
+
db.run("DELETE FROM kv WHERE key >= ? AND key < ?", [start, end]);
|
|
2008
|
+
});
|
|
2009
|
+
}
|
|
2010
|
+
/**
|
|
2011
|
+
* List KV entries with a given prefix for an actor.
|
|
2012
|
+
*/
|
|
2013
|
+
async kvListPrefix(actorId, prefix, options) {
|
|
2014
|
+
const entry = await this.loadActor(actorId);
|
|
2015
|
+
await this.#waitForPendingWrite(actorId);
|
|
2016
|
+
if (!entry.state) {
|
|
2017
|
+
if (this.isActorStopping(actorId)) {
|
|
2018
|
+
throw new Error(`Actor ${actorId} is destroying`);
|
|
2019
|
+
} else {
|
|
2020
|
+
throw new Error(`Actor ${actorId} state not loaded`);
|
|
2021
|
+
}
|
|
2022
|
+
}
|
|
2023
|
+
validateKvKey(prefix, "prefix key");
|
|
2024
|
+
const db = this.#getOrCreateActorKvDatabase(actorId);
|
|
2025
|
+
const upperBound = computePrefixUpperBound(prefix);
|
|
2026
|
+
const direction = (options == null ? void 0 : options.reverse) ? "DESC" : "ASC";
|
|
2027
|
+
const limit = _nullishCoalesce((options == null ? void 0 : options.limit), () => ( DEFAULT_LIST_LIMIT));
|
|
2028
|
+
const rows = upperBound ? db.all(
|
|
2029
|
+
`SELECT key, value FROM kv WHERE key >= ? AND key < ? ORDER BY key ${direction} LIMIT ?`,
|
|
2030
|
+
[prefix, upperBound, limit]
|
|
2031
|
+
) : db.all(
|
|
2032
|
+
`SELECT key, value FROM kv WHERE key >= ? ORDER BY key ${direction} LIMIT ?`,
|
|
2033
|
+
[prefix, limit]
|
|
2034
|
+
);
|
|
2035
|
+
return rows.map((row) => [
|
|
2036
|
+
ensureUint8Array(row.key, "key"),
|
|
2037
|
+
ensureUint8Array(row.value, "value")
|
|
2038
|
+
]);
|
|
2039
|
+
}
|
|
2040
|
+
/**
|
|
2041
|
+
* List KV entries in the half-open range [start, end).
|
|
2042
|
+
*/
|
|
2043
|
+
async kvListRange(actorId, start, end, options) {
|
|
2044
|
+
const entry = await this.loadActor(actorId);
|
|
2045
|
+
await this.#waitForPendingWrite(actorId);
|
|
2046
|
+
if (!entry.state) {
|
|
2047
|
+
if (this.isActorStopping(actorId)) {
|
|
2048
|
+
throw new Error(`Actor ${actorId} is destroying`);
|
|
2049
|
+
} else {
|
|
2050
|
+
throw new Error(`Actor ${actorId} state not loaded`);
|
|
2051
|
+
}
|
|
2052
|
+
}
|
|
2053
|
+
validateKvKey(start, "start key");
|
|
2054
|
+
validateKvKey(end, "end key");
|
|
2055
|
+
if (compareBytes(start, end) >= 0) {
|
|
2056
|
+
return [];
|
|
2057
|
+
}
|
|
2058
|
+
const db = this.#getOrCreateActorKvDatabase(actorId);
|
|
2059
|
+
const direction = (options == null ? void 0 : options.reverse) ? "DESC" : "ASC";
|
|
2060
|
+
const limit = _nullishCoalesce((options == null ? void 0 : options.limit), () => ( DEFAULT_LIST_LIMIT));
|
|
2061
|
+
const rows = db.all(
|
|
2062
|
+
`SELECT key, value FROM kv WHERE key >= ? AND key < ? ORDER BY key ${direction} LIMIT ?`,
|
|
2063
|
+
[start, end, limit]
|
|
2064
|
+
);
|
|
2065
|
+
return rows.map((row) => [
|
|
2066
|
+
ensureUint8Array(row.key, "key"),
|
|
2067
|
+
ensureUint8Array(row.value, "value")
|
|
2068
|
+
]);
|
|
2069
|
+
}
|
|
2070
|
+
};
|
|
2071
|
+
|
|
2072
|
+
// src/drivers/file-system/manager.ts
|
|
2073
|
+
|
|
2074
|
+
var FileSystemManagerDriver = class {
|
|
2075
|
+
#config;
|
|
2076
|
+
#state;
|
|
2077
|
+
#driverConfig;
|
|
2078
|
+
#getUpgradeWebSocket;
|
|
2079
|
+
#actorDriver;
|
|
2080
|
+
#actorRouter;
|
|
2081
|
+
constructor(config4, state, driverConfig) {
|
|
2082
|
+
this.#config = config4;
|
|
2083
|
+
this.#state = state;
|
|
2084
|
+
this.#driverConfig = driverConfig;
|
|
2085
|
+
const inlineClient = _chunkGUHXWPGBcjs.createClientWithDriver.call(void 0, this);
|
|
2086
|
+
this.#actorDriver = this.#driverConfig.actor(
|
|
2087
|
+
config4,
|
|
2088
|
+
this,
|
|
2089
|
+
inlineClient
|
|
2090
|
+
);
|
|
2091
|
+
this.#actorRouter = _chunkJJNZQDUNcjs.createActorRouter.call(void 0,
|
|
2092
|
+
this.#config,
|
|
2093
|
+
this.#actorDriver,
|
|
2094
|
+
void 0,
|
|
2095
|
+
config4.test.enabled
|
|
2096
|
+
);
|
|
2097
|
+
}
|
|
2098
|
+
async sendRequest(actorId, actorRequest) {
|
|
2099
|
+
return await this.#actorRouter.fetch(actorRequest, {
|
|
2100
|
+
actorId
|
|
2101
|
+
});
|
|
2102
|
+
}
|
|
2103
|
+
async openWebSocket(path, actorId, encoding, params) {
|
|
2104
|
+
const normalizedPath = path.startsWith("/") ? path : `/${path}`;
|
|
2105
|
+
const fakeUrl = `http://inline-actor${normalizedPath}`;
|
|
2106
|
+
const fakeRequest = new Request(fakeUrl, {
|
|
2107
|
+
method: "GET"
|
|
2108
|
+
});
|
|
2109
|
+
const pathOnly = normalizedPath.split("?")[0];
|
|
2110
|
+
const { gatewayId, requestId } = createHibernatableRequestMetadata();
|
|
2111
|
+
const wsHandler = await _chunkHNE2AK6Ccjs.routeWebSocket.call(void 0,
|
|
2112
|
+
fakeRequest,
|
|
2113
|
+
pathOnly,
|
|
2114
|
+
{},
|
|
2115
|
+
this.#config,
|
|
2116
|
+
this.#actorDriver,
|
|
2117
|
+
actorId,
|
|
2118
|
+
encoding,
|
|
2119
|
+
params,
|
|
2120
|
+
gatewayId,
|
|
2121
|
+
requestId,
|
|
2122
|
+
true,
|
|
2123
|
+
false
|
|
2124
|
+
);
|
|
2125
|
+
return createInlineWebSocket(wsHandler);
|
|
2126
|
+
}
|
|
2127
|
+
async proxyRequest(c, actorRequest, actorId) {
|
|
2128
|
+
return await this.#actorRouter.fetch(actorRequest, {
|
|
2129
|
+
actorId
|
|
2130
|
+
});
|
|
2131
|
+
}
|
|
2132
|
+
async proxyWebSocket(c, path, actorId, encoding, params) {
|
|
2133
|
+
var _a;
|
|
2134
|
+
const upgradeWebSocket = (_a = this.#getUpgradeWebSocket) == null ? void 0 : _a.call(this);
|
|
2135
|
+
_invariant2.default.call(void 0, upgradeWebSocket, "missing getUpgradeWebSocket");
|
|
2136
|
+
const pathOnly = path.split("?")[0];
|
|
2137
|
+
const normalizedPath = pathOnly.startsWith("/") ? pathOnly : `/${pathOnly}`;
|
|
2138
|
+
const { gatewayId, requestId } = createHibernatableRequestMetadata();
|
|
2139
|
+
const wsHandler = await _chunkHNE2AK6Ccjs.routeWebSocket.call(void 0,
|
|
2140
|
+
// TODO: Create new request with new path
|
|
2141
|
+
c.req.raw,
|
|
2142
|
+
normalizedPath,
|
|
2143
|
+
c.req.header(),
|
|
2144
|
+
this.#config,
|
|
2145
|
+
this.#actorDriver,
|
|
2146
|
+
actorId,
|
|
2147
|
+
encoding,
|
|
2148
|
+
params,
|
|
2149
|
+
gatewayId,
|
|
2150
|
+
requestId,
|
|
2151
|
+
true,
|
|
2152
|
+
false
|
|
2153
|
+
);
|
|
2154
|
+
return upgradeWebSocket(() => wsHandler)(c, _chunkMPLMTJY5cjs.noopNext.call(void 0, ));
|
|
2155
|
+
}
|
|
2156
|
+
async buildGatewayUrl(actorId) {
|
|
2157
|
+
const port = _nullishCoalesce(this.#config.managerPort, () => ( 6420));
|
|
2158
|
+
return `http://127.0.0.1:${port}/gateway/${encodeURIComponent(actorId)}`;
|
|
2159
|
+
}
|
|
2160
|
+
async getForId({
|
|
2161
|
+
actorId
|
|
2162
|
+
}) {
|
|
2163
|
+
const actor = await this.#state.loadActor(actorId);
|
|
2164
|
+
if (!actor.state) {
|
|
2165
|
+
return void 0;
|
|
2166
|
+
}
|
|
2167
|
+
if (this.#state.isActorStopping(actorId)) {
|
|
2168
|
+
throw new (0, _chunk6G7ZNM27cjs.ActorStopping)(actorId);
|
|
2169
|
+
}
|
|
2170
|
+
return actorStateToOutput(actor.state);
|
|
2171
|
+
}
|
|
2172
|
+
async getWithKey({
|
|
2173
|
+
name,
|
|
2174
|
+
key
|
|
2175
|
+
}) {
|
|
2176
|
+
const actorId = generateActorId(name, key);
|
|
2177
|
+
const actor = await this.#state.loadActor(actorId);
|
|
2178
|
+
if (actor.state) {
|
|
2179
|
+
return actorStateToOutput(actor.state);
|
|
2180
|
+
}
|
|
2181
|
+
return void 0;
|
|
2182
|
+
}
|
|
2183
|
+
async getOrCreateWithKey(input) {
|
|
2184
|
+
const actorId = generateActorId(input.name, input.key);
|
|
2185
|
+
await this.#state.loadOrCreateActor(
|
|
2186
|
+
actorId,
|
|
2187
|
+
input.name,
|
|
2188
|
+
input.key,
|
|
2189
|
+
input.input
|
|
2190
|
+
);
|
|
2191
|
+
await this.#actorDriver.loadActor(actorId);
|
|
2192
|
+
const state = await this.#state.loadActorStateOrError(actorId);
|
|
2193
|
+
return actorStateToOutput(state);
|
|
2194
|
+
}
|
|
2195
|
+
async createActor({ name, key, input }) {
|
|
2196
|
+
const actorId = generateActorId(name, key);
|
|
2197
|
+
await this.#state.createActor(actorId, name, key, input);
|
|
2198
|
+
await this.#actorDriver.loadActor(actorId);
|
|
2199
|
+
const state = await this.#state.loadActorStateOrError(actorId);
|
|
2200
|
+
return actorStateToOutput(state);
|
|
2201
|
+
}
|
|
2202
|
+
async listActors({ name }) {
|
|
2203
|
+
const actors = [];
|
|
2204
|
+
const itr = this.#state.getActorsIterator({});
|
|
2205
|
+
for await (const actor of itr) {
|
|
2206
|
+
if (actor.name === name) {
|
|
2207
|
+
actors.push(actorStateToOutput(actor));
|
|
2208
|
+
}
|
|
2209
|
+
}
|
|
2210
|
+
actors.sort((a, b) => {
|
|
2211
|
+
const aTs = _nullishCoalesce(a.createTs, () => ( 0));
|
|
2212
|
+
const bTs = _nullishCoalesce(b.createTs, () => ( 0));
|
|
2213
|
+
return bTs - aTs;
|
|
2214
|
+
});
|
|
2215
|
+
return actors;
|
|
2216
|
+
}
|
|
2217
|
+
async kvGet(actorId, key) {
|
|
2218
|
+
const response = await this.#state.kvBatchGet(actorId, [key]);
|
|
2219
|
+
return response[0] !== null ? new TextDecoder().decode(response[0]) : null;
|
|
2220
|
+
}
|
|
2221
|
+
displayInformation() {
|
|
2222
|
+
return {
|
|
2223
|
+
properties: {
|
|
2224
|
+
...this.#state.persist ? { Data: this.#state.storagePath } : {},
|
|
2225
|
+
Instances: this.#state.actorCountOnStartup.toString()
|
|
2226
|
+
}
|
|
2227
|
+
};
|
|
2228
|
+
}
|
|
2229
|
+
extraStartupLog() {
|
|
2230
|
+
return {
|
|
2231
|
+
instances: this.#state.actorCountOnStartup,
|
|
2232
|
+
data: this.#state.storagePath
|
|
2233
|
+
};
|
|
2234
|
+
}
|
|
2235
|
+
setGetUpgradeWebSocket(getUpgradeWebSocket) {
|
|
2236
|
+
this.#getUpgradeWebSocket = getUpgradeWebSocket;
|
|
2237
|
+
}
|
|
2238
|
+
};
|
|
2239
|
+
function actorStateToOutput(state) {
|
|
2240
|
+
return {
|
|
2241
|
+
actorId: state.actorId,
|
|
2242
|
+
name: state.name,
|
|
2243
|
+
key: state.key,
|
|
2244
|
+
createTs: Number(state.createdAt),
|
|
2245
|
+
startTs: state.startTs !== null ? Number(state.startTs) : null,
|
|
2246
|
+
connectableTs: state.connectableTs !== null ? Number(state.connectableTs) : null,
|
|
2247
|
+
sleepTs: state.sleepTs !== null ? Number(state.sleepTs) : null,
|
|
2248
|
+
destroyTs: state.destroyTs !== null ? Number(state.destroyTs) : null
|
|
2249
|
+
};
|
|
2250
|
+
}
|
|
2251
|
+
function createHibernatableRequestMetadata() {
|
|
2252
|
+
const gatewayId = new Uint8Array(4);
|
|
2253
|
+
const requestId = new Uint8Array(4);
|
|
2254
|
+
crypto.getRandomValues(gatewayId);
|
|
2255
|
+
crypto.getRandomValues(requestId);
|
|
2256
|
+
return {
|
|
2257
|
+
gatewayId: gatewayId.buffer.slice(0),
|
|
2258
|
+
requestId: requestId.buffer.slice(0)
|
|
2259
|
+
};
|
|
2260
|
+
}
|
|
2261
|
+
|
|
2262
|
+
// src/drivers/file-system/mod.ts
|
|
2263
|
+
var CreateFileSystemDriverOptionsSchema = _zod.z.object({
|
|
2264
|
+
/** Custom path for storage. */
|
|
2265
|
+
path: _zod.z.string().optional(),
|
|
2266
|
+
/** Deprecated: file-system driver KV is now always SQLite-backed. */
|
|
2267
|
+
useNativeSqlite: _zod.z.boolean().optional()
|
|
2268
|
+
});
|
|
2269
|
+
function createFileSystemOrMemoryDriver(persist = true, options) {
|
|
2270
|
+
_chunkCGGGBIDPcjs.importNodeDependencies.call(void 0, );
|
|
2271
|
+
if ((options == null ? void 0 : options.useNativeSqlite) === false) {
|
|
2272
|
+
throw new Error(
|
|
2273
|
+
"File-system driver no longer supports non-SQLite KV storage. Remove useNativeSqlite: false."
|
|
2274
|
+
);
|
|
2275
|
+
}
|
|
2276
|
+
const stateOptions = {
|
|
2277
|
+
persist,
|
|
2278
|
+
customPath: options == null ? void 0 : options.path,
|
|
2279
|
+
useNativeSqlite: true
|
|
2280
|
+
};
|
|
2281
|
+
const state = new FileSystemGlobalState(stateOptions);
|
|
2282
|
+
const driverConfig = {
|
|
2283
|
+
name: persist ? "file-system" : "memory",
|
|
2284
|
+
displayName: persist ? "File System" : "Memory",
|
|
2285
|
+
manager: (config4) => new FileSystemManagerDriver(config4, state, driverConfig),
|
|
2286
|
+
actor: (config4, managerDriver, inlineClient) => {
|
|
2287
|
+
const actorDriver = new FileSystemActorDriver(
|
|
2288
|
+
config4,
|
|
2289
|
+
managerDriver,
|
|
2290
|
+
inlineClient,
|
|
2291
|
+
state
|
|
2292
|
+
);
|
|
2293
|
+
state.onRunnerStart(config4, inlineClient, actorDriver);
|
|
2294
|
+
return actorDriver;
|
|
2295
|
+
},
|
|
2296
|
+
autoStartActorDriver: true
|
|
2297
|
+
};
|
|
2298
|
+
return driverConfig;
|
|
2299
|
+
}
|
|
2300
|
+
function createFileSystemDriver(opts) {
|
|
2301
|
+
const validatedOpts = opts ? CreateFileSystemDriverOptionsSchema.parse(opts) : void 0;
|
|
2302
|
+
return createFileSystemOrMemoryDriver(true, validatedOpts);
|
|
2303
|
+
}
|
|
2304
|
+
function createMemoryDriver() {
|
|
2305
|
+
return createFileSystemOrMemoryDriver(false);
|
|
2306
|
+
}
|
|
2307
|
+
|
|
2308
|
+
|
|
2309
|
+
|
|
2310
|
+
|
|
2311
|
+
|
|
2312
|
+
|
|
2313
|
+
|
|
2314
|
+
|
|
2315
|
+
exports.InlineWebSocketAdapter = InlineWebSocketAdapter; exports.getStoragePath = getStoragePath; exports.ensureDirectoryExists = ensureDirectoryExists; exports.createFileSystemOrMemoryDriver = createFileSystemOrMemoryDriver; exports.createFileSystemDriver = createFileSystemDriver; exports.createMemoryDriver = createMemoryDriver;
|
|
2316
|
+
//# sourceMappingURL=chunk-2LY7RW3Y.cjs.map
|