rivetkit 2.1.4 → 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-LK36OGGO.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-ANKZ2FS6.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-AQD4CBZ2.cjs → chunk-DH6UINWA.cjs} +4 -4
- package/dist/tsup/{chunk-AQD4CBZ2.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-HBYEYBIC.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-TEUL4UYN.cjs → chunk-GUHXWPGB.cjs} +1515 -1479
- package/dist/tsup/chunk-GUHXWPGB.cjs.map +1 -0
- package/dist/tsup/{chunk-3B6PCYJB.cjs → chunk-HNE2AK6C.cjs} +2375 -3713
- package/dist/tsup/chunk-HNE2AK6C.cjs.map +1 -0
- package/dist/tsup/{chunk-5UEFNG7P.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-UWAGLDT6.cjs → chunk-JJNZQDUN.cjs} +667 -2517
- package/dist/tsup/chunk-JJNZQDUN.cjs.map +1 -0
- package/dist/tsup/{chunk-M6H4XIF4.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-4KSHPFXF.cjs → chunk-MPLMTJY5.cjs} +123 -23
- package/dist/tsup/chunk-MPLMTJY5.cjs.map +1 -0
- package/dist/tsup/{chunk-UDMRZR6A.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-3GTO6H3E.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-GXRVSSVD.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-QPADHLDU.cjs → chunk-V3JSZR5P.cjs} +3 -3
- package/dist/tsup/{chunk-QPADHLDU.cjs.map → chunk-V3JSZR5P.cjs.map} +1 -1
- package/dist/tsup/{chunk-HKOSZKKZ.cjs → chunk-VBR35EQF.cjs} +271 -339
- package/dist/tsup/chunk-VBR35EQF.cjs.map +1 -0
- package/dist/tsup/{chunk-DZXDUGLL.js → chunk-VWYO36X4.js} +117 -17
- package/dist/tsup/chunk-VWYO36X4.js.map +1 -0
- package/dist/tsup/{chunk-I6PL6QIY.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-KTWY3K6Z.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 +113 -14
- 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-3B6PCYJB.cjs.map +0 -1
- package/dist/tsup/chunk-3GTO6H3E.js.map +0 -1
- package/dist/tsup/chunk-4KSHPFXF.cjs.map +0 -1
- 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-ANKZ2FS6.js.map +0 -1
- package/dist/tsup/chunk-DZXDUGLL.js.map +0 -1
- package/dist/tsup/chunk-GXRVSSVD.cjs.map +0 -1
- package/dist/tsup/chunk-H5TSEPN4.cjs +0 -645
- package/dist/tsup/chunk-H5TSEPN4.cjs.map +0 -1
- package/dist/tsup/chunk-HKOSZKKZ.cjs.map +0 -1
- package/dist/tsup/chunk-I6PL6QIY.js.map +0 -1
- package/dist/tsup/chunk-KJSYAUOM.js.map +0 -1
- package/dist/tsup/chunk-KTWY3K6Z.js.map +0 -1
- package/dist/tsup/chunk-L47L3ZWJ.cjs.map +0 -1
- package/dist/tsup/chunk-LK36OGGO.cjs.map +0 -1
- package/dist/tsup/chunk-M6H4XIF4.js.map +0 -1
- package/dist/tsup/chunk-N4KRDJ56.js.map +0 -1
- package/dist/tsup/chunk-SR3KQE7Q.cjs.map +0 -1
- package/dist/tsup/chunk-TEFYRRAK.js +0 -645
- package/dist/tsup/chunk-TEFYRRAK.js.map +0 -1
- package/dist/tsup/chunk-TEUL4UYN.cjs.map +0 -1
- package/dist/tsup/chunk-UDMRZR6A.js.map +0 -1
- package/dist/tsup/chunk-UWAGLDT6.cjs.map +0 -1
- package/dist/tsup/chunk-VKVNIQRQ.js.map +0 -1
- package/dist/tsup/chunk-ZFY5J2EP.cjs.map +0 -1
- package/src/db/sqlite-vfs.ts +0 -12
- /package/dist/tsup/{chunk-HBYEYBIC.js.map → chunk-EONWXYMN.js.map} +0 -0
- /package/dist/tsup/{chunk-5UEFNG7P.js.map → chunk-I5I6OALK.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/actor/instance/mod.ts","../../src/actor/metrics.ts","../../src/inspector/actor-inspector.ts","../../src/inspector/workflow-history-json.ts","../../src/actor/conn/persisted.ts","../../src/actor/schedule.ts","../../src/actor/instance/connection-manager.ts","../../src/actor/instance/event-manager.ts","../../src/actor/instance/persisted.ts","../../src/actor/instance/queue-manager.ts","../../src/actor/instance/schedule-manager.ts","../../src/actor/instance/state-manager.ts","../../src/actor/instance/traces-driver.ts","../../src/actor/definition.ts","../../src/actor/router.ts"],"sourcesContent":["import type { OtlpExportTraceServiceRequestJson } from \"@rivetkit/traces\";\nimport {\n\tcreateNoopTraces,\n\tcreateTraces,\n\ttype SpanHandle,\n\ttype SpanStatusInput,\n\ttype Traces,\n} from \"@rivetkit/traces\";\nimport type { ISqliteVfs } from \"@rivetkit/sqlite-vfs\";\nimport { ActorMetrics } from \"@/actor/metrics\";\nimport invariant from \"invariant\";\nimport type { ActorKey } from \"@/actor/mod\";\nimport type { Client } from \"@/client/client\";\nimport { getBaseLogger, getIncludeTarget, type Logger } from \"@/common/log\";\nimport { stringifyError } from \"@/common/utils\";\nimport type { UniversalWebSocket } from \"@/common/websocket-interface\";\nimport { ActorInspector } from \"@/inspector/actor-inspector\";\nimport type { Registry } from \"@/mod\";\nimport {\n\tACTOR_VERSIONED,\n\tCONN_VERSIONED,\n} from \"@/schemas/actor-persist/versioned\";\nimport { EXTRA_ERROR_LOG } from \"@/utils\";\nimport { getRivetExperimentalOtel } from \"@/utils/env-vars\";\nimport { type ActorConfig, getRunFunction } from \"../config\";\nimport type { ConnDriver } from \"../conn/driver\";\nimport { createHttpDriver } from \"../conn/drivers/http\";\nimport {\n\tCONN_DRIVER_SYMBOL,\n\tCONN_STATE_MANAGER_SYMBOL,\n\ttype Conn,\n\ttype ConnId,\n} from \"../conn/mod\";\nimport {\n\tconvertConnFromBarePersistedConn,\n\ttype PersistedConn,\n} from \"../conn/persisted\";\nimport {\n\tActionContext,\n\tActorContext,\n\tRequestContext,\n\tWebSocketContext,\n} from \"../contexts\";\n\nimport type { AnyDatabaseProvider, InferDatabaseClient } from \"../database\";\nimport type { ActorDriver } from \"../driver\";\nimport * as errors from \"../errors\";\nimport { serializeActorKey } from \"../keys\";\nimport { processMessage } from \"../protocol/old\";\nimport { Schedule } from \"../schedule\";\nimport {\n\ttype EventSchemaConfig,\n\tgetEventCanSubscribe,\n\tgetQueueCanPublish,\n\ttype QueueSchemaConfig,\n} from \"../schema\";\nimport {\n\tassertUnreachable,\n\tDeadlineError,\n\tdeadline,\n\tgenerateSecureToken,\n} from \"../utils\";\nimport { ConnectionManager } from \"./connection-manager\";\nimport { EventManager } from \"./event-manager\";\nimport { KEYS } from \"./keys\";\nimport {\n\tconvertActorFromBarePersisted,\n\ttype PersistedActor,\n} from \"./persisted\";\nimport { QueueManager } from \"./queue-manager\";\nimport { ScheduleManager } from \"./schedule-manager\";\nimport { type SaveStateOptions, StateManager } from \"./state-manager\";\nimport { ActorTracesDriver } from \"./traces-driver\";\n\nexport type { SaveStateOptions };\n\nenum CanSleep {\n\tYes,\n\tNotReady,\n\tNotStarted,\n\tPreventSleep,\n\tActiveConns,\n\tActiveDisconnectCallbacks,\n\tActiveHonoHttpRequests,\n\tActiveKeepAwake,\n\tActiveRun,\n}\n\n/** Actor type alias with all `any` types. Used for `extends` in classes referencing this actor. */\nexport type AnyActorInstance = ActorInstance<\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany\n>;\n\nexport type ExtractActorState<A extends AnyActorInstance> =\n\tA extends ActorInstance<infer State, any, any, any, any, any, any, any>\n\t\t? State\n\t\t: never;\n\nexport type ExtractActorConnParams<A extends AnyActorInstance> =\n\tA extends ActorInstance<any, infer ConnParams, any, any, any, any, any, any>\n\t\t? ConnParams\n\t\t: never;\n\nexport type ExtractActorConnState<A extends AnyActorInstance> =\n\tA extends ActorInstance<any, any, infer ConnState, any, any, any, any, any>\n\t\t? ConnState\n\t\t: never;\n\n// MARK: - Main ActorInstance Class\nexport class ActorInstance<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n> {\n\t// MARK: - Core Properties\n\tactorContext: ActorContext<S, CP, CS, V, I, DB, E, Q>;\n\t#config: ActorConfig<S, CP, CS, V, I, DB, E, Q>;\n\tdriver!: ActorDriver;\n\t#inlineClient!: Client<Registry<any>>;\n\t#actorId!: string;\n\t#name!: string;\n\t#key!: ActorKey;\n\t#actorKeyString!: string;\n\t#region!: string;\n\n\t// MARK: - Managers\n\tconnectionManager!: ConnectionManager<S, CP, CS, V, I, DB, E, Q>;\n\n\tstateManager!: StateManager<S, CP, CS, I, E, Q>;\n\n\teventManager!: EventManager<S, CP, CS, V, I, DB, E, Q>;\n\n\t#scheduleManager!: ScheduleManager<S, CP, CS, V, I, DB, E, Q>;\n\n\tqueueManager!: QueueManager<S, CP, CS, V, I, DB, E, Q>;\n\n\t// MARK: - Logging\n\t#log!: Logger;\n\t#rLog!: Logger;\n\n\t// MARK: - Lifecycle State\n\t/**\n\t * If the core actor initiation has set up.\n\t *\n\t * Almost all actions on this actor will throw an error if false.\n\t **/\n\t#ready = false;\n\t/**\n\t * If the actor has fully started.\n\t *\n\t * The only purpose of this is to prevent sleeping until started.\n\t */\n\t#started = false;\n\t#sleepCalled = false;\n\t#destroyCalled = false;\n\t#stopCalled = false;\n\t#sleepTimeout?: NodeJS.Timeout;\n\t#abortController = new AbortController();\n\n\t// MARK: - Variables & Database\n\t#vars?: V;\n\t#db?: InferDatabaseClient<DB>;\n\t#sqliteVfs?: ISqliteVfs;\n\t#metrics = new ActorMetrics();\n\n\t// MARK: - Background Tasks\n\t#backgroundPromises: Promise<void>[] = [];\n\t#runPromise?: Promise<void>;\n\t#runHandlerActive = false;\n\t#activeQueueWaitCount = 0;\n\n\t// MARK: - HTTP/WebSocket Tracking\n\t#activeHonoHttpRequests = 0;\n\t#activeKeepAwakeCount = 0;\n\t#preventSleep = false;\n\n\t// MARK: - Deprecated (kept for compatibility)\n\t#schedule!: Schedule;\n\n\t// MARK: - Inspector\n\t#inspectorToken?: string;\n\t#inspector: ActorInspector;\n\n\t// MARK: - Tracing\n\t#traces!: Traces<OtlpExportTraceServiceRequestJson>;\n\n\t// MARK: - Driver Overrides\n\t/**\n\t * Per-instance config option overrides applied by the driver after creation.\n\t * When set, the effective option value is the minimum of the base config\n\t * value and the override value.\n\t */\n\toverrides: {\n\t\tonSleepTimeout?: number;\n\t\tonDestroyTimeout?: number;\n\t\trunStopTimeout?: number;\n\t\twaitUntilTimeout?: number;\n\t} = {};\n\n\t// MARK: - Constructor\n\tconstructor(config: ActorConfig<S, CP, CS, V, I, DB, E, Q>) {\n\t\tthis.#config = config;\n\t\tthis.actorContext = new ActorContext(this);\n\t\tthis.#inspector = new ActorInspector(this);\n\t}\n\n\t// MARK: - Public Getters\n\tget log(): Logger {\n\t\tinvariant(this.#log, \"log not configured\");\n\t\treturn this.#log;\n\t}\n\n\tget rLog(): Logger {\n\t\tinvariant(this.#rLog, \"log not configured\");\n\t\treturn this.#rLog;\n\t}\n\n\tget isStopping(): boolean {\n\t\treturn this.#stopCalled;\n\t}\n\n\tget id(): string {\n\t\treturn this.#actorId;\n\t}\n\n\tget name(): string {\n\t\treturn this.#name;\n\t}\n\n\tget key(): ActorKey {\n\t\treturn this.#key;\n\t}\n\n\tget region(): string {\n\t\treturn this.#region;\n\t}\n\n\tget inlineClient(): Client<Registry<any>> {\n\t\treturn this.#inlineClient;\n\t}\n\n\tget inspector(): ActorInspector {\n\t\treturn this.#inspector;\n\t}\n\n\tget traces(): Traces<OtlpExportTraceServiceRequestJson> {\n\t\treturn this.#traces;\n\t}\n\n\tget inspectorToken(): string | undefined {\n\t\treturn this.#inspectorToken;\n\t}\n\n\tget metrics(): ActorMetrics {\n\t\treturn this.#metrics;\n\t}\n\n\t// MARK: - Tracing\n\tgetCurrentTraceSpan(): SpanHandle | null {\n\t\treturn this.#traces.getCurrentSpan();\n\t}\n\n\tstartTraceSpan(\n\t\tname: string,\n\t\tattributes?: Record<string, unknown>,\n\t): SpanHandle {\n\t\treturn this.#traces.startSpan(name, {\n\t\t\tparent: this.#traces.getCurrentSpan() ?? undefined,\n\t\t\tattributes: this.#traceAttributes(attributes),\n\t\t});\n\t}\n\n\tendTraceSpan(handle: SpanHandle, status?: SpanStatusInput): void {\n\t\tthis.#traces.endSpan(handle, status ? { status } : undefined);\n\t}\n\n\tasync runInTraceSpan<T>(\n\t\tname: string,\n\t\tattributes: Record<string, unknown> | undefined,\n\t\tfn: () => T | Promise<T>,\n\t): Promise<T> {\n\t\tconst span = this.startTraceSpan(name, attributes);\n\t\ttry {\n\t\t\tconst result = this.#traces.withSpan(span, fn);\n\t\t\tconst resolved = result instanceof Promise ? await result : result;\n\t\t\tthis.#traces.endSpan(span, {\n\t\t\t\tstatus: { code: \"OK\" },\n\t\t\t});\n\t\t\treturn resolved;\n\t\t} catch (error) {\n\t\t\tthis.#traces.endSpan(span, {\n\t\t\t\tstatus: {\n\t\t\t\t\tcode: \"ERROR\",\n\t\t\t\t\tmessage: stringifyError(error),\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\temitTraceEvent(\n\t\tname: string,\n\t\tattributes?: Record<string, unknown>,\n\t\thandle?: SpanHandle,\n\t): void {\n\t\tconst span = handle ?? this.#traces.getCurrentSpan();\n\t\tif (!span) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#traces.emitEvent(span, name, {\n\t\t\tattributes: this.#traceAttributes(attributes),\n\t\t\ttimeUnixMs: Date.now(),\n\t\t});\n\t}\n\n\tget conns(): Map<ConnId, Conn<S, CP, CS, V, I, DB, E, Q>> {\n\t\treturn this.connectionManager.connections;\n\t}\n\n\tget schedule(): Schedule {\n\t\treturn this.#schedule;\n\t}\n\n\tget abortSignal(): AbortSignal {\n\t\treturn this.#abortController.signal;\n\t}\n\n\tget preventSleep(): boolean {\n\t\treturn this.#preventSleep;\n\t}\n\n\tget actions(): string[] {\n\t\treturn Object.keys(this.#config.actions ?? {});\n\t}\n\n\tget config(): ActorConfig<S, CP, CS, V, I, DB, E, Q> {\n\t\treturn this.#config;\n\t}\n\n\t// MARK: - State Access\n\tget persist(): PersistedActor<S, I> {\n\t\treturn this.stateManager.persist;\n\t}\n\n\tget state(): S {\n\t\treturn this.stateManager.state;\n\t}\n\n\tset state(value: S) {\n\t\tthis.stateManager.state = value;\n\t}\n\n\tget stateEnabled(): boolean {\n\t\treturn this.stateManager.stateEnabled;\n\t}\n\n\tget connStateEnabled(): boolean {\n\t\treturn \"createConnState\" in this.#config || \"connState\" in this.#config;\n\t}\n\n\t// MARK: - Variables & Database\n\tget vars(): V {\n\t\tthis.#validateVarsEnabled();\n\t\tinvariant(this.#vars !== undefined, \"vars not enabled\");\n\t\treturn this.#vars;\n\t}\n\n\tget db(): InferDatabaseClient<DB> {\n\t\tif (!this.#db) {\n\t\t\tthrow new errors.DatabaseNotEnabled();\n\t\t}\n\t\treturn this.#db;\n\t}\n\n\t// MARK: - Initialization\n\tasync start(\n\t\tactorDriver: ActorDriver,\n\t\tinlineClient: Client<Registry<any>>,\n\t\tactorId: string,\n\t\tname: string,\n\t\tkey: ActorKey,\n\t\tregion: string,\n\t) {\n\t\t// Initialize properties\n\t\tthis.driver = actorDriver;\n\t\tthis.#inlineClient = inlineClient;\n\t\tthis.#actorId = actorId;\n\t\tthis.#name = name;\n\t\tthis.#key = key;\n\t\tthis.#actorKeyString = serializeActorKey(this.#key);\n\t\tthis.#region = region;\n\n\t\t// Initialize tracing\n\t\tthis.#initializeTraces();\n\n\t\t// Initialize logging\n\t\tthis.#initializeLogging();\n\n\t\t// Initialize managers\n\t\tthis.connectionManager = new ConnectionManager(this);\n\t\tthis.stateManager = new StateManager(this, actorDriver, this.#config);\n\t\tthis.eventManager = new EventManager(this);\n\t\tthis.queueManager = new QueueManager(this, actorDriver);\n\t\tthis.#scheduleManager = new ScheduleManager(\n\t\t\tthis,\n\t\t\tactorDriver,\n\t\t\tthis.#config,\n\t\t);\n\n\t\t// Legacy schedule object (for compatibility)\n\t\tthis.#schedule = new Schedule(this);\n\n\t\t// Load state\n\t\tawait this.#loadState();\n\n\t\tawait this.queueManager.initialize();\n\n\t\t// Generate or load inspector token\n\t\tawait this.#initializeInspectorToken();\n\n\t\t// Initialize variables\n\t\tif (this.#varsEnabled) {\n\t\t\tawait this.#initializeVars();\n\t\t}\n\n\t\t// Call onStart lifecycle\n\t\tawait this.#callOnStart();\n\n\t\t// Setup database\n\t\tawait this.#setupDatabase();\n\n\t\t// Initialize alarms\n\t\tawait this.#scheduleManager.initializeAlarms();\n\n\t\t// Mark as ready\n\t\tthis.#ready = true;\n\n\t\t// Finish up any remaining initiation\n\t\t//\n\t\t// Do this after #ready = true since this can call any actor callbacks\n\t\t// (which require #assertReady)\n\t\tawait this.driver.onBeforeActorStart?.(this);\n\n\t\t// Mark as started\n\t\t//\n\t\t// We do this after onBeforeActorStart to prevent the actor from going\n\t\t// to sleep before finishing setup\n\t\tthis.#started = true;\n\t\tthis.#rLog.info({ msg: \"actor started\" });\n\n\t\t// Start sleep timer after setting #started since this affects the\n\t\t// timer\n\t\tthis.resetSleepTimer();\n\n\t\t// Start run handler in background (does not block startup)\n\t\tthis.#startRunHandler();\n\n\t\t// Trigger any pending alarms\n\t\tawait this.onAlarm();\n\t}\n\n\t// MARK: - Ready Check\n\tisReady(): boolean {\n\t\treturn this.#ready;\n\t}\n\n\tassertReady(allowStoppingState: boolean = false) {\n\t\tif (!this.#ready) throw new errors.InternalError(\"Actor not ready\");\n\t\tif (!allowStoppingState && this.#stopCalled)\n\t\t\tthrow new errors.InternalError(\"Actor is stopping\");\n\t}\n\n\tasync cleanupPersistedConnections(reason?: string): Promise<number> {\n\t\tthis.assertReady(true);\n\t\treturn await this.connectionManager.cleanupPersistedHibernatableConnections(\n\t\t\treason,\n\t\t);\n\t}\n\n\t// MARK: - Stop\n\tasync onStop(mode: \"sleep\" | \"destroy\") {\n\t\tif (this.#stopCalled) {\n\t\t\tthis.#rLog.warn({ msg: \"already stopping actor\" });\n\t\t\treturn;\n\t\t}\n\t\tthis.#stopCalled = true;\n\t\tthis.#rLog.info({\n\t\t\tmsg: \"setting stopCalled=true\",\n\t\t\tmode,\n\t\t});\n\n\t\ttry {\n\t\t\t// Clear sleep timeout\n\t\t\tif (this.#sleepTimeout) {\n\t\t\t\tclearTimeout(this.#sleepTimeout);\n\t\t\t\tthis.#sleepTimeout = undefined;\n\t\t\t}\n\n\t\t\t// Abort listeners in the canonical stop path.\n\t\t\t// This must run for all stop modes, including sleep and remote stop.\n\t\t\t// Destroy may have already triggered an early abort, but repeating abort\n\t\t\t// is intentional and safe.\n\t\t\ttry {\n\t\t\t\tthis.#abortController.abort();\n\t\t\t} catch {}\n\n\t\t\t// Wait for run handler to complete\n\t\t\tawait this.#waitForRunHandler(\n\t\t\t\tthis.overrides.runStopTimeout !== undefined\n\t\t\t\t\t? Math.min(\n\t\t\t\t\t\t\tthis.#config.options.runStopTimeout,\n\t\t\t\t\t\t\tthis.overrides.runStopTimeout,\n\t\t\t\t\t\t)\n\t\t\t\t\t: this.#config.options.runStopTimeout,\n\t\t\t);\n\n\t\t\t// Call onStop lifecycle\n\t\t\tif (mode === \"sleep\") {\n\t\t\t\tawait this.#callOnSleep();\n\t\t\t} else if (mode === \"destroy\") {\n\t\t\t\tawait this.#callOnDestroy();\n\t\t\t} else {\n\t\t\t\tassertUnreachable(mode);\n\t\t\t}\n\n\t\t\t// Wait for background tasks\n\t\t\tawait this.#waitBackgroundPromises(\n\t\t\t\tthis.overrides.waitUntilTimeout !== undefined\n\t\t\t\t\t? Math.min(\n\t\t\t\t\t\t\tthis.#config.options.waitUntilTimeout,\n\t\t\t\t\t\t\tthis.overrides.waitUntilTimeout,\n\t\t\t\t\t\t)\n\t\t\t\t\t: this.#config.options.waitUntilTimeout,\n\t\t\t);\n\n\t\t\t// Disconnect non-hibernatable connections\n\t\t\tawait this.#disconnectConnections();\n\n\t\t\t// Clear timeouts and save state\n\t\t\tthis.#rLog.info({ msg: \"clearing pending save timeouts\" });\n\t\t\tthis.stateManager.clearPendingSaveTimeout();\n\t\t\tthis.#rLog.info({ msg: \"saving state immediately\" });\n\t\t\tawait this.stateManager.saveState({\n\t\t\t\timmediate: true,\n\t\t\t\tallowStoppingState: true,\n\t\t\t});\n\n\t\t\t// Wait for write queues\n\t\t\tawait this.stateManager.waitForPendingWrites();\n\t\t\tawait this.#scheduleManager.waitForPendingAlarmWrites();\n\t\t} finally {\n\t\t\tawait this.#cleanupDatabase();\n\t\t}\n\t}\n\n\t// MARK: - Sleep\n\tstartSleep() {\n\t\tif (this.#stopCalled || this.#destroyCalled) {\n\t\t\tthis.#rLog.debug({\n\t\t\t\tmsg: \"cannot call startSleep if actor already stopping\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.#sleepCalled) {\n\t\t\tthis.#rLog.warn({\n\t\t\t\tmsg: \"cannot call startSleep twice, actor already sleeping\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tthis.#sleepCalled = true;\n\n\t\tconst sleep = this.driver.startSleep?.bind(this.driver, this.#actorId);\n\t\tinvariant(this.#sleepingSupported, \"sleeping not supported\");\n\t\tinvariant(sleep, \"no sleep on driver\");\n\n\t\tthis.#rLog.info({ msg: \"actor sleeping\" });\n\n\t\t// Start sleep on next tick so call site of startSleep can exit\n\t\tsetImmediate(() => {\n\t\t\tsleep();\n\t\t});\n\t}\n\n\t// MARK: - Destroy\n\tstartDestroy() {\n\t\tif (this.#stopCalled || this.#sleepCalled) {\n\t\t\tthis.#rLog.debug({\n\t\t\t\tmsg: \"cannot call startDestroy if actor already stopping or sleeping\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.#destroyCalled) {\n\t\t\tthis.#rLog.warn({\n\t\t\t\tmsg: \"cannot call startDestroy twice, actor already destroying\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tthis.#destroyCalled = true;\n\n\t\t// Abort immediately so in flight waits can exit before the driver stop\n\t\t// handshake completes.\n\t\t// The onStop path will call abort again as a safety net for all stop\n\t\t// modes.\n\t\ttry {\n\t\t\tthis.#abortController.abort();\n\t\t} catch {}\n\n\t\tconst destroy = this.driver.startDestroy.bind(\n\t\t\tthis.driver,\n\t\t\tthis.#actorId,\n\t\t);\n\n\t\tthis.#rLog.info({ msg: \"actor destroying\" });\n\n\t\t// Start destroy on next tick so call site of startDestroy can exit\n\t\tsetImmediate(() => {\n\t\t\tdestroy();\n\t\t});\n\t}\n\n\t// MARK: - HTTP Request Tracking\n\tbeginHonoHttpRequest() {\n\t\tthis.#activeHonoHttpRequests++;\n\t\tthis.resetSleepTimer();\n\t}\n\n\tendHonoHttpRequest() {\n\t\tthis.#activeHonoHttpRequests--;\n\t\tif (this.#activeHonoHttpRequests < 0) {\n\t\t\tthis.#activeHonoHttpRequests = 0;\n\t\t\tthis.#rLog.warn({\n\t\t\t\tmsg: \"active hono requests went below 0, this is a RivetKit bug\",\n\t\t\t\t...EXTRA_ERROR_LOG,\n\t\t\t});\n\t\t}\n\t\tthis.resetSleepTimer();\n\t}\n\n\t// MARK: - Message Processing\n\tasync processMessage(\n\t\tmessage: {\n\t\t\tbody:\n\t\t\t\t| {\n\t\t\t\t\t\ttag: \"ActionRequest\";\n\t\t\t\t\t\tval: { id: bigint; name: string; args: unknown };\n\t\t\t\t }\n\t\t\t\t| {\n\t\t\t\t\t\ttag: \"SubscriptionRequest\";\n\t\t\t\t\t\tval: { eventName: string; subscribe: boolean };\n\t\t\t\t };\n\t\t},\n\t\tconn: Conn<S, CP, CS, V, I, DB, E, Q>,\n\t) {\n\t\tawait processMessage(message, this, conn, {\n\t\t\tonExecuteAction: async (ctx, name, args) => {\n\t\t\t\treturn await this.executeAction(ctx, name, args);\n\t\t\t},\n\t\t\tonSubscribe: async (eventName, conn) => {\n\t\t\t\tthis.eventManager.addSubscription(eventName, conn, false);\n\t\t\t},\n\t\t\tonUnsubscribe: async (eventName, conn) => {\n\t\t\t\tthis.eventManager.removeSubscription(eventName, conn, false);\n\t\t\t},\n\t\t});\n\t}\n\n\tasync assertCanSubscribe(\n\t\tctx: ActionContext<S, CP, CS, V, I, DB, E, Q>,\n\t\teventName: string,\n\t): Promise<void> {\n\t\tconst canSubscribe = getEventCanSubscribe(\n\t\t\tthis.#config.events,\n\t\t\teventName,\n\t\t);\n\t\tif (!canSubscribe) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst result = await canSubscribe(ctx);\n\t\tif (typeof result !== \"boolean\") {\n\t\t\tthrow new errors.InvalidCanSubscribeResponse();\n\t\t}\n\t\tif (!result) {\n\t\t\tthrow new errors.Forbidden();\n\t\t}\n\t}\n\n\tasync assertCanPublish(\n\t\tctx: ActionContext<S, CP, CS, V, I, DB, E, Q>,\n\t\tqueueName: string,\n\t): Promise<void> {\n\t\tconst canPublish = getQueueCanPublish<\n\t\t\tActionContext<S, CP, CS, V, I, DB, E, Q>\n\t\t>(this.#config.queues, queueName);\n\t\tif (!canPublish) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst result = await canPublish(ctx);\n\t\tif (typeof result !== \"boolean\") {\n\t\t\tthrow new errors.InvalidCanPublishResponse();\n\t\t}\n\t\tif (!result) {\n\t\t\tthrow new errors.Forbidden();\n\t\t}\n\t}\n\n\t// MARK: - Action Execution\n\tasync executeAction(\n\t\tctx: ActionContext<S, CP, CS, V, I, DB, E, Q>,\n\t\tactionName: string,\n\t\targs: unknown[],\n\t): Promise<unknown> {\n\t\tthis.assertReady();\n\n\t\tconst actions = this.#config.actions ?? {};\n\t\tif (!(actionName in actions)) {\n\t\t\tthis.#rLog.warn({ msg: \"action does not exist\", actionName });\n\t\t\tthrow new errors.ActionNotFound(actionName);\n\t\t}\n\n\t\tconst actionFunction = actions[actionName];\n\t\tif (typeof actionFunction !== \"function\") {\n\t\t\tthis.#rLog.warn({\n\t\t\t\tmsg: \"action is not a function\",\n\t\t\t\tactionName,\n\t\t\t\ttype: typeof actionFunction,\n\t\t\t});\n\t\t\tthrow new errors.ActionNotFound(actionName);\n\t\t}\n\n\t\tthis.#activeKeepAwakeCount++;\n\t\tthis.#metrics.actionCalls++;\n\t\tthis.resetSleepTimer();\n\t\tconst actionStart = performance.now();\n\t\tconst actionSpan = this.startTraceSpan(`actor.action.${actionName}`, {\n\t\t\t\"rivet.action.name\": actionName,\n\t\t});\n\t\tlet spanEnded = false;\n\n\t\ttry {\n\t\t\treturn await this.#traces.withSpan(actionSpan, async () => {\n\t\t\t\tthis.#rLog.debug({\n\t\t\t\t\tmsg: \"executing action\",\n\t\t\t\t\tactionName,\n\t\t\t\t\targs,\n\t\t\t\t});\n\n\t\t\t\tconst outputOrPromise = actionFunction.call(\n\t\t\t\t\tundefined,\n\t\t\t\t\tctx,\n\t\t\t\t\t...args,\n\t\t\t\t);\n\n\t\t\t\tlet output: unknown;\n\t\t\t\tconst maybeThenable = outputOrPromise as {\n\t\t\t\t\tthen?: (\n\t\t\t\t\t\tonfulfilled?: unknown,\n\t\t\t\t\t\tonrejected?: unknown,\n\t\t\t\t\t) => unknown;\n\t\t\t\t};\n\t\t\t\tif (maybeThenable && typeof maybeThenable.then === \"function\") {\n\t\t\t\t\toutput = await deadline(\n\t\t\t\t\t\tPromise.resolve(outputOrPromise),\n\t\t\t\t\t\tthis.#config.options.actionTimeout,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\toutput = outputOrPromise;\n\t\t\t\t}\n\n\t\t\t\t// Process through onBeforeActionResponse if configured\n\t\t\t\tif (this.#config.onBeforeActionResponse) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\toutput = await this.runInTraceSpan(\n\t\t\t\t\t\t\t\"actor.onBeforeActionResponse\",\n\t\t\t\t\t\t\t{ \"rivet.action.name\": actionName },\n\t\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\t\tthis.#config.onBeforeActionResponse!(\n\t\t\t\t\t\t\t\t\tthis.actorContext,\n\t\t\t\t\t\t\t\t\tactionName,\n\t\t\t\t\t\t\t\t\targs,\n\t\t\t\t\t\t\t\t\toutput,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.#rLog.error({\n\t\t\t\t\t\t\tmsg: \"error in `onBeforeActionResponse`\",\n\t\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn output;\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis.#metrics.actionErrors++;\n\t\t\tconst isTimeout = error instanceof DeadlineError;\n\t\t\tconst message = isTimeout\n\t\t\t\t? \"ActionTimedOut\"\n\t\t\t\t: stringifyError(error);\n\t\t\tthis.#traces.setAttributes(actionSpan, {\n\t\t\t\t\"error.message\": message,\n\t\t\t\t\"error.type\":\n\t\t\t\t\terror instanceof Error ? error.name : typeof error,\n\t\t\t});\n\t\t\tthis.#traces.endSpan(actionSpan, {\n\t\t\t\tstatus: { code: \"ERROR\", message },\n\t\t\t});\n\t\t\tspanEnded = true;\n\t\t\tif (isTimeout) {\n\t\t\t\tthrow new errors.ActionTimedOut();\n\t\t\t}\n\t\t\tthis.#rLog.error({\n\t\t\t\tmsg: \"action error\",\n\t\t\t\tactionName,\n\t\t\t\terror: stringifyError(error),\n\t\t\t});\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tthis.#metrics.actionTotalMs += performance.now() - actionStart;\n\t\t\tif (!spanEnded && actionSpan.isActive()) {\n\t\t\t\tthis.#traces.endSpan(actionSpan, {\n\t\t\t\t\tstatus: { code: \"OK\" },\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.#activeKeepAwakeCount--;\n\t\t\tif (this.#activeKeepAwakeCount < 0) {\n\t\t\t\tthis.#activeKeepAwakeCount = 0;\n\t\t\t\tthis.#rLog.warn({\n\t\t\t\t\tmsg: \"active keep awake count went below 0, this is a RivetKit bug\",\n\t\t\t\t\t...EXTRA_ERROR_LOG,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.resetSleepTimer();\n\t\t\tthis.stateManager.savePersistThrottled();\n\t\t}\n\t}\n\n\t// MARK: - HTTP/WebSocket Handlers\n\tasync handleRawRequest(\n\t\tconn: Conn<S, CP, CS, V, I, DB, E, Q>,\n\t\trequest: Request,\n\t): Promise<Response> {\n\t\tthis.assertReady();\n\n\t\tif (!this.#config.onRequest) {\n\t\t\tthrow new errors.RequestHandlerNotDefined();\n\t\t}\n\t\tconst onRequest = this.#config.onRequest;\n\n\t\treturn await this.runInTraceSpan(\n\t\t\t\"actor.onRequest\",\n\t\t\t{\n\t\t\t\t\"http.method\": request.method,\n\t\t\t\t\"http.url\": request.url,\n\t\t\t\t\"rivet.conn.id\": conn.id,\n\t\t\t},\n\t\t\tasync () => {\n\t\t\t\tconst ctx = new RequestContext(this, conn, request);\n\t\t\t\ttry {\n\t\t\t\t\tconst response = await onRequest(ctx, request);\n\t\t\t\t\tif (!response) {\n\t\t\t\t\t\tthrow new errors.InvalidRequestHandlerResponse();\n\t\t\t\t\t}\n\t\t\t\t\treturn response;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.#rLog.error({\n\t\t\t\t\t\tmsg: \"onRequest error\",\n\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t});\n\t\t\t\t\tthrow error;\n\t\t\t\t} finally {\n\t\t\t\t\tthis.stateManager.savePersistThrottled();\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\thandleRawWebSocket(\n\t\tconn: Conn<S, CP, CS, V, I, DB, E, Q>,\n\t\twebsocket: UniversalWebSocket,\n\t\trequest?: Request,\n\t) {\n\t\t// NOTE: All code before `onWebSocket` must be synchronous in order to ensure the order of `open` events happen in the correct order.\n\n\t\tthis.assertReady();\n\n\t\tif (!this.#config.onWebSocket) {\n\t\t\tthrow new errors.InternalError(\"onWebSocket handler not defined\");\n\t\t}\n\n\t\tconst span = this.startTraceSpan(\"actor.onWebSocket\", {\n\t\t\t\"http.url\": request?.url,\n\t\t\t\"rivet.conn.id\": conn.id,\n\t\t});\n\t\tlet spanEnded = false;\n\n\t\ttry {\n\t\t\t// Reset sleep timer when handling WebSocket\n\t\t\tthis.resetSleepTimer();\n\n\t\t\t// Handle WebSocket\n\t\t\tconst ctx = new WebSocketContext(this, conn, request);\n\n\t\t\t// NOTE: This is async and will run in the background\n\t\t\tconst voidOrPromise = this.#traces.withSpan(span, () =>\n\t\t\t\tthis.#config.onWebSocket!(ctx, websocket),\n\t\t\t);\n\n\t\t\t// Save changes from the WebSocket open\n\t\t\tif (voidOrPromise instanceof Promise) {\n\t\t\t\tvoidOrPromise\n\t\t\t\t\t.then(() => {\n\t\t\t\t\t\tif (!spanEnded) {\n\t\t\t\t\t\t\tthis.endTraceSpan(span, { code: \"OK\" });\n\t\t\t\t\t\t\tspanEnded = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tif (!spanEnded) {\n\t\t\t\t\t\t\tthis.endTraceSpan(span, {\n\t\t\t\t\t\t\t\tcode: \"ERROR\",\n\t\t\t\t\t\t\t\tmessage: stringifyError(error),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tspanEnded = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.#rLog.error({\n\t\t\t\t\t\t\tmsg: \"onWebSocket error\",\n\t\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\tthis.stateManager.savePersistThrottled();\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tif (!spanEnded) {\n\t\t\t\t\tthis.endTraceSpan(span, { code: \"OK\" });\n\t\t\t\t\tspanEnded = true;\n\t\t\t\t}\n\t\t\t\tthis.stateManager.savePersistThrottled();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (!spanEnded) {\n\t\t\t\tthis.endTraceSpan(span, {\n\t\t\t\t\tcode: \"ERROR\",\n\t\t\t\t\tmessage: stringifyError(error),\n\t\t\t\t});\n\t\t\t\tspanEnded = true;\n\t\t\t}\n\t\t\tthis.#rLog.error({\n\t\t\t\tmsg: \"onWebSocket error\",\n\t\t\t\terror: stringifyError(error),\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t// MARK: - Scheduling\n\tasync scheduleEvent(\n\t\ttimestamp: number,\n\t\taction: string,\n\t\targs: unknown[],\n\t): Promise<void> {\n\t\tawait this.#scheduleManager.scheduleEvent(timestamp, action, args);\n\t}\n\n\tasync onAlarm() {\n\t\tthis.resetSleepTimer();\n\t\tawait this.#scheduleManager.onAlarm();\n\t}\n\n\t// MARK: - Background Tasks\n\twaitUntil(promise: Promise<void>) {\n\t\tthis.assertReady();\n\n\t\tconst nonfailablePromise = promise\n\t\t\t.then(() => {\n\t\t\t\tthis.#rLog.debug({ msg: \"wait until promise complete\" });\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tthis.#rLog.error({\n\t\t\t\t\tmsg: \"wait until promise failed\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t});\n\t\tthis.#backgroundPromises.push(nonfailablePromise);\n\t}\n\n\t/**\n\t * Prevents the actor from sleeping while the given promise is running.\n\t *\n\t * Use this when performing async operations in the `run` handler or other\n\t * background contexts where you need to ensure the actor stays awake.\n\t *\n\t * Returns the resolved value and resets the sleep timer on completion.\n\t * Errors are propagated to the caller.\n\t */\n\tasync keepAwake<T>(promise: Promise<T>): Promise<T> {\n\t\tthis.assertReady(true);\n\n\t\tthis.#activeKeepAwakeCount++;\n\t\tthis.resetSleepTimer();\n\n\t\ttry {\n\t\t\treturn await promise;\n\t\t} finally {\n\t\t\tthis.#activeKeepAwakeCount--;\n\t\t\tif (this.#activeKeepAwakeCount < 0) {\n\t\t\t\tthis.#activeKeepAwakeCount = 0;\n\t\t\t\tthis.#rLog.warn({\n\t\t\t\t\tmsg: \"active keep awake count went below 0, this is a RivetKit bug\",\n\t\t\t\t\t...EXTRA_ERROR_LOG,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.resetSleepTimer();\n\t\t}\n\t}\n\n\tsetPreventSleep(prevent: boolean) {\n\t\tif (this.#preventSleep === prevent) return;\n\n\t\tthis.#preventSleep = prevent;\n\t\tthis.#rLog.debug({\n\t\t\tmsg: \"updated prevent sleep state\",\n\t\t\tprevent,\n\t\t});\n\t\tthis.resetSleepTimer();\n\t}\n\n\tbeginQueueWait() {\n\t\tthis.assertReady(true);\n\t\tthis.#activeQueueWaitCount++;\n\t\tthis.resetSleepTimer();\n\t}\n\n\tendQueueWait() {\n\t\tthis.#activeQueueWaitCount--;\n\t\tif (this.#activeQueueWaitCount < 0) {\n\t\t\tthis.#activeQueueWaitCount = 0;\n\t\t\tthis.#rLog.warn({\n\t\t\t\tmsg: \"active queue wait count went below 0, this is a RivetKit bug\",\n\t\t\t\t...EXTRA_ERROR_LOG,\n\t\t\t});\n\t\t}\n\t\tthis.resetSleepTimer();\n\t}\n\n\t// MARK: - Private Helper Methods\n\t#initializeTraces() {\n\t\tif (getRivetExperimentalOtel()) {\n\t\t\t// Experimental mode persists trace data to actor storage so inspector\n\t\t\t// queries can return OTel payloads.\n\t\t\tthis.#traces = createTraces({\n\t\t\t\tdriver: new ActorTracesDriver(this.driver, this.#actorId),\n\t\t\t});\n\t\t} else {\n\t\t\t// Keep the tracing API calls active while disabling trace persistence\n\t\t\t// until the experimental flag is enabled.\n\t\t\tthis.#traces = createNoopTraces();\n\t\t}\n\t}\n\n\t#traceAttributes(\n\t\tattributes?: Record<string, unknown>,\n\t): Record<string, unknown> {\n\t\treturn {\n\t\t\t\"rivet.actor.id\": this.#actorId,\n\t\t\t\"rivet.actor.name\": this.#name,\n\t\t\t\"rivet.actor.key\": this.#actorKeyString,\n\t\t\t\"rivet.actor.region\": this.#region,\n\t\t\t...(attributes ?? {}),\n\t\t};\n\t}\n\n\t#patchLoggerForTraces(logger: Logger) {\n\t\tconst levels: Array<\n\t\t\t\"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\"\n\t\t> = [\"trace\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\"];\n\t\tfor (const level of levels) {\n\t\t\tconst original = logger[level].bind(logger) as (\n\t\t\t\t...args: any[]\n\t\t\t) => unknown;\n\t\t\tlogger[level] = ((...args: unknown[]) => {\n\t\t\t\tthis.#emitLogEvent(level, args);\n\t\t\t\treturn original(...(args as any[]));\n\t\t\t}) as Logger[typeof level];\n\t\t}\n\t}\n\n\t#emitLogEvent(level: string, args: unknown[]) {\n\t\tconst span = this.#traces.getCurrentSpan();\n\t\tif (!span || !span.isActive()) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet message: string | undefined;\n\t\tif (args.length >= 2) {\n\t\t\tmessage = String(args[1]);\n\t\t} else if (args.length === 1) {\n\t\t\tconst [value] = args;\n\t\t\tif (typeof value === \"string\") {\n\t\t\t\tmessage = value;\n\t\t\t} else if (\n\t\t\t\ttypeof value === \"number\" ||\n\t\t\t\ttypeof value === \"boolean\"\n\t\t\t) {\n\t\t\t\tmessage = String(value);\n\t\t\t} else if (value && typeof value === \"object\") {\n\t\t\t\tconst maybeMsg = (value as { msg?: unknown }).msg;\n\t\t\t\tif (maybeMsg !== undefined) {\n\t\t\t\t\tmessage = String(maybeMsg);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.#traces.emitEvent(span, \"log\", {\n\t\t\tattributes: this.#traceAttributes({\n\t\t\t\t\"log.level\": level,\n\t\t\t\t...(message ? { \"log.message\": message } : {}),\n\t\t\t}),\n\t\t\ttimeUnixMs: Date.now(),\n\t\t});\n\t}\n\n\t#initializeLogging() {\n\t\tconst logParams = {\n\t\t\tactor: this.#name,\n\t\t\tkey: this.#actorKeyString,\n\t\t\tactorId: this.#actorId,\n\t\t};\n\n\t\tconst extraLogParams = this.driver.getExtraActorLogParams?.();\n\t\tif (extraLogParams) Object.assign(logParams, extraLogParams);\n\n\t\tthis.#log = getBaseLogger().child(\n\t\t\tObject.assign(\n\t\t\t\tgetIncludeTarget() ? { target: \"actor\" } : {},\n\t\t\t\tlogParams,\n\t\t\t),\n\t\t);\n\t\tthis.#rLog = getBaseLogger().child(\n\t\t\tObject.assign(\n\t\t\t\tgetIncludeTarget() ? { target: \"actor-runtime\" } : {},\n\t\t\t\tlogParams,\n\t\t\t),\n\t\t);\n\n\t\tthis.#patchLoggerForTraces(this.#log);\n\t\tthis.#patchLoggerForTraces(this.#rLog);\n\t}\n\n\tasync #loadState() {\n\t\t// Read initial state from KV\n\t\tconst [persistDataBuffer] = await this.driver.kvBatchGet(\n\t\t\tthis.#actorId,\n\t\t\t[KEYS.PERSIST_DATA],\n\t\t);\n\t\tinvariant(\n\t\t\tpersistDataBuffer !== null,\n\t\t\t\"persist data has not been set, it should be set when initialized\",\n\t\t);\n\n\t\tconst bareData =\n\t\t\tACTOR_VERSIONED.deserializeWithEmbeddedVersion(persistDataBuffer);\n\t\tconst persistData = convertActorFromBarePersisted<S, I>(bareData);\n\n\t\tif (persistData.hasInitialized) {\n\t\t\t// Restore existing actor\n\t\t\tawait this.#restoreExistingActor(persistData);\n\t\t} else {\n\t\t\t// Create new actor\n\t\t\tawait this.#createNewActor(persistData);\n\t\t}\n\n\t\t// Pass persist reference to schedule manager\n\t\tthis.#scheduleManager.setPersist(this.stateManager.persist);\n\t}\n\n\tasync #createNewActor(persistData: PersistedActor<S, I>) {\n\t\tthis.#rLog.info({ msg: \"actor creating\" });\n\n\t\t// Initialize state\n\t\tawait this.stateManager.initializeState(persistData);\n\n\t\t// Call onCreate lifecycle\n\t\tif (this.#config.onCreate) {\n\t\t\tconst onCreate = this.#config.onCreate;\n\t\t\tawait this.runInTraceSpan(\"actor.onCreate\", undefined, () =>\n\t\t\t\tonCreate(this.actorContext as any, persistData.input!),\n\t\t\t);\n\t\t}\n\t}\n\n\tasync #restoreExistingActor(persistData: PersistedActor<S, I>) {\n\t\t// List all connection keys\n\t\tconst connEntries = await this.driver.kvListPrefix(\n\t\t\tthis.#actorId,\n\t\t\tKEYS.CONN_PREFIX,\n\t\t);\n\n\t\t// Decode connections\n\t\tconst connections: PersistedConn<CP, CS>[] = [];\n\t\tfor (const [_key, value] of connEntries) {\n\t\t\ttry {\n\t\t\t\tconst bareData = CONN_VERSIONED.deserializeWithEmbeddedVersion(\n\t\t\t\t\tnew Uint8Array(value),\n\t\t\t\t);\n\t\t\t\tconst conn = convertConnFromBarePersistedConn<CP, CS>(bareData);\n\t\t\t\tconnections.push(conn);\n\t\t\t} catch (error) {\n\t\t\t\tthis.#rLog.error({\n\t\t\t\t\tmsg: \"failed to decode connection\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis.#rLog.info({\n\t\t\tmsg: \"actor restoring\",\n\t\t\tconnections: connections.length,\n\t\t});\n\n\t\t// Initialize state\n\t\tthis.stateManager.initPersistProxy(persistData);\n\n\t\t// Restore connections\n\t\tthis.connectionManager.restoreConnections(connections);\n\t}\n\n\tasync #initializeInspectorToken() {\n\t\t// Try to load existing token\n\t\tconst [tokenBuffer] = await this.driver.kvBatchGet(this.#actorId, [\n\t\t\tKEYS.INSPECTOR_TOKEN,\n\t\t]);\n\n\t\tif (tokenBuffer !== null) {\n\t\t\t// Token exists, decode it\n\t\t\tconst decoder = new TextDecoder();\n\t\t\tthis.#inspectorToken = decoder.decode(tokenBuffer);\n\t\t\tthis.#rLog.debug({ msg: \"loaded existing inspector token\" });\n\t\t} else {\n\t\t\t// Generate new token\n\t\t\tthis.#inspectorToken = generateSecureToken();\n\t\t\tconst tokenBytes = new TextEncoder().encode(this.#inspectorToken);\n\t\t\tawait this.driver.kvBatchPut(this.#actorId, [\n\t\t\t\t[KEYS.INSPECTOR_TOKEN, tokenBytes],\n\t\t\t]);\n\t\t\tthis.#rLog.debug({ msg: \"generated new inspector token\" });\n\t\t}\n\t}\n\n\tasync #initializeVars() {\n\t\tlet vars: V | undefined;\n\t\tif (\"createVars\" in this.#config) {\n\t\t\tconst createVars = this.#config.createVars;\n\t\t\tvars = await this.runInTraceSpan(\n\t\t\t\t\"actor.createVars\",\n\t\t\t\tundefined,\n\t\t\t\t() => {\n\t\t\t\t\tconst dataOrPromise = createVars!(\n\t\t\t\t\t\tthis.actorContext as any,\n\t\t\t\t\t\tthis.driver.getContext(this.#actorId),\n\t\t\t\t\t);\n\t\t\t\t\tif (dataOrPromise instanceof Promise) {\n\t\t\t\t\t\treturn deadline(\n\t\t\t\t\t\t\tdataOrPromise,\n\t\t\t\t\t\t\tthis.#config.options.createVarsTimeout,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn dataOrPromise;\n\t\t\t\t},\n\t\t\t);\n\t\t} else if (\"vars\" in this.#config) {\n\t\t\tvars = structuredClone(this.#config.vars);\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t\"Could not create variables from 'createVars' or 'vars'\",\n\t\t\t);\n\t\t}\n\t\tthis.#vars = vars;\n\t}\n\n\tasync #callOnStart() {\n\t\tthis.#rLog.info({ msg: \"actor starting\" });\n\t\tif (this.#config.onWake) {\n\t\t\tconst onWake = this.#config.onWake;\n\t\t\tawait this.runInTraceSpan(\"actor.onWake\", undefined, () =>\n\t\t\t\tonWake(this.actorContext),\n\t\t\t);\n\t\t}\n\t}\n\n\tasync #callOnSleep() {\n\t\tif (this.#config.onSleep) {\n\t\t\tconst onSleep = this.#config.onSleep;\n\t\t\ttry {\n\t\t\t\tthis.#rLog.debug({ msg: \"calling onSleep\" });\n\t\t\t\tawait this.runInTraceSpan(\n\t\t\t\t\t\"actor.onSleep\",\n\t\t\t\t\tundefined,\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst result = onSleep(this.actorContext);\n\t\t\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\t\t\tawait deadline(\n\t\t\t\t\t\t\t\tresult,\n\t\t\t\t\t\t\t\tthis.overrides.onSleepTimeout !== undefined\n\t\t\t\t\t\t\t\t\t? Math.min(\n\t\t\t\t\t\t\t\t\t\t\tthis.#config.options.onSleepTimeout,\n\t\t\t\t\t\t\t\t\t\t\tthis.overrides.onSleepTimeout,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t: this.#config.options.onSleepTimeout,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tthis.#rLog.debug({ msg: \"onSleep completed\" });\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof DeadlineError) {\n\t\t\t\t\tthis.#rLog.error({ msg: \"onSleep timed out\" });\n\t\t\t\t} else {\n\t\t\t\t\tthis.#rLog.error({\n\t\t\t\t\t\tmsg: \"error in onSleep\",\n\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #callOnDestroy() {\n\t\tif (this.#config.onDestroy) {\n\t\t\tconst onDestroy = this.#config.onDestroy;\n\t\t\ttry {\n\t\t\t\tthis.#rLog.debug({ msg: \"calling onDestroy\" });\n\t\t\t\tawait this.runInTraceSpan(\n\t\t\t\t\t\"actor.onDestroy\",\n\t\t\t\t\tundefined,\n\t\t\t\t\tasync () => {\n\t\t\t\t\t\tconst result = onDestroy(this.actorContext);\n\t\t\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\t\t\tawait deadline(\n\t\t\t\t\t\t\t\tresult,\n\t\t\t\t\t\t\t\tthis.overrides.onDestroyTimeout !== undefined\n\t\t\t\t\t\t\t\t\t? Math.min(\n\t\t\t\t\t\t\t\t\t\t\tthis.#config.options\n\t\t\t\t\t\t\t\t\t\t\t\t.onDestroyTimeout,\n\t\t\t\t\t\t\t\t\t\t\tthis.overrides.onDestroyTimeout,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t: this.#config.options.onDestroyTimeout,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tthis.#rLog.debug({ msg: \"onDestroy completed\" });\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof DeadlineError) {\n\t\t\t\t\tthis.#rLog.error({ msg: \"onDestroy timed out\" });\n\t\t\t\t} else {\n\t\t\t\t\tthis.#rLog.error({\n\t\t\t\t\t\tmsg: \"error in onDestroy\",\n\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t#startRunHandler() {\n\t\tconst runFn = getRunFunction(this.#config.run);\n\t\tif (!runFn) return;\n\n\t\tthis.#rLog.debug({ msg: \"starting run handler\" });\n\t\tthis.#runHandlerActive = true;\n\t\tthis.resetSleepTimer();\n\n\t\tconst runSpan = this.startTraceSpan(\"actor.run\");\n\t\tconst runResult = this.#traces.withSpan(runSpan, () =>\n\t\t\trunFn(this.actorContext),\n\t\t);\n\n\t\t// Do not destroy or immediately sleep the actor when run exits. Finished\n\t\t// workflows must stay inspectable when something goes wrong, and callers\n\t\t// may still need to invoke actions after the run handler has completed.\n\t\tif (runResult instanceof Promise) {\n\t\t\tthis.#runPromise = runResult\n\t\t\t\t.then(() => {\n\t\t\t\t\tif (this.#stopCalled) {\n\t\t\t\t\t\tif (runSpan.isActive()) {\n\t\t\t\t\t\t\tthis.endTraceSpan(runSpan, { code: \"OK\" });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.#rLog.debug({\n\t\t\t\t\t\t\tmsg: \"run handler exited during actor stop\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (runSpan.isActive()) {\n\t\t\t\t\t\tthis.endTraceSpan(runSpan, { code: \"OK\" });\n\t\t\t\t\t}\n\t\t\t\t\tthis.#rLog.info({\n\t\t\t\t\t\tmsg: \"run handler exited\",\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tif (this.#stopCalled) {\n\t\t\t\t\t\tif (runSpan.isActive()) {\n\t\t\t\t\t\t\tthis.endTraceSpan(runSpan, { code: \"OK\" });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.#rLog.debug({\n\t\t\t\t\t\t\tmsg: \"run handler threw during actor stop\",\n\t\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.endTraceSpan(runSpan, {\n\t\t\t\t\t\tcode: \"ERROR\",\n\t\t\t\t\t\tmessage: stringifyError(error),\n\t\t\t\t\t});\n\t\t\t\t\tthis.#rLog.error({\n\t\t\t\t\t\tmsg: \"run handler threw error\",\n\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.finally(() => {\n\t\t\t\t\tthis.#runHandlerActive = false;\n\t\t\t\t\tthis.resetSleepTimer();\n\t\t\t\t});\n\t\t} else if (runSpan.isActive()) {\n\t\t\tthis.endTraceSpan(runSpan, { code: \"OK\" });\n\t\t\tthis.#rLog.info({\n\t\t\t\tmsg: \"run handler exited\",\n\t\t\t});\n\t\t\tthis.#runHandlerActive = false;\n\t\t\tthis.resetSleepTimer();\n\t\t}\n\t}\n\n\tasync #waitForRunHandler(timeoutMs: number) {\n\t\tif (!this.#runPromise) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#rLog.debug({ msg: \"waiting for run handler to complete\" });\n\n\t\tconst timedOut = await Promise.race([\n\t\t\tthis.#runPromise.then(() => false).catch(() => false),\n\t\t\tnew Promise<true>((resolve) =>\n\t\t\t\tsetTimeout(() => resolve(true), timeoutMs),\n\t\t\t),\n\t\t]);\n\n\t\tif (timedOut) {\n\t\t\tthis.#rLog.warn({\n\t\t\t\tmsg: \"run handler did not complete in time, it may have leaked - ensure you use c.aborted (or the abort signal c.abortSignal) to exit gracefully\",\n\t\t\t\ttimeoutMs,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.#rLog.debug({ msg: \"run handler completed\" });\n\t\t}\n\t}\n\n\tasync #setupDatabase() {\n\t\tif (!(\"db\" in this.#config) || !this.#config.db) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet client: InferDatabaseClient<DB> | undefined;\n\t\ttry {\n\t\t\t// Acquire a SQLite VFS handle for this actor. The driver may return a\n\t\t\t// standalone VFS or a pooled handle that shares a WASM instance.\n\t\t\tif (!this.#sqliteVfs && this.driver.createSqliteVfs) {\n\t\t\t\tthis.#sqliteVfs = await this.driver.createSqliteVfs(this.#actorId);\n\t\t\t}\n\n\t\t\tclient = await this.#config.db.createClient({\n\t\t\t\tactorId: this.#actorId,\n\t\t\t\toverrideRawDatabaseClient: this.driver.overrideRawDatabaseClient\n\t\t\t\t\t? () =>\n\t\t\t\t\t\t\tthis.driver.overrideRawDatabaseClient!(\n\t\t\t\t\t\t\t\tthis.#actorId,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t: undefined,\n\t\t\t\toverrideDrizzleDatabaseClient: this.driver\n\t\t\t\t\t.overrideDrizzleDatabaseClient\n\t\t\t\t\t? () =>\n\t\t\t\t\t\t\tthis.driver.overrideDrizzleDatabaseClient!(\n\t\t\t\t\t\t\t\tthis.#actorId,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t: undefined,\n\t\t\t\tkv: {\n\t\t\t\t\tbatchPut: (entries) =>\n\t\t\t\t\t\tthis.driver.kvBatchPut(this.#actorId, entries),\n\t\t\t\t\tbatchGet: (keys) =>\n\t\t\t\t\t\tthis.driver.kvBatchGet(this.#actorId, keys),\n\t\t\t\t\tbatchDelete: (keys) =>\n\t\t\t\t\t\tthis.driver.kvBatchDelete(this.#actorId, keys),\n\t\t\t\t},\n\t\t\t\tsqliteVfs: this.#sqliteVfs,\n\t\t\t\tmetrics: this.#metrics,\n\t\t\t});\n\t\t\tthis.#rLog.info({ msg: \"database migration starting\" });\n\t\t\tawait this.#config.db.onMigrate?.(client);\n\t\t\tthis.#rLog.info({ msg: \"database migration complete\" });\n\t\t\tthis.#db = client;\n\t\t} catch (error) {\n\t\t\tif (client) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.#config.db.onDestroy?.(client);\n\t\t\t\t} catch (cleanupError) {\n\t\t\t\t\tthis.#rLog.error({\n\t\t\t\t\t\tmsg: \"database setup cleanup failed\",\n\t\t\t\t\t\terror: stringifyError(cleanupError),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.#sqliteVfs) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.#sqliteVfs.destroy();\n\t\t\t\t} catch (cleanupError) {\n\t\t\t\t\tthis.#rLog.error({\n\t\t\t\t\t\tmsg: \"sqlite vfs teardown after setup failure failed\",\n\t\t\t\t\t\terror: stringifyError(cleanupError),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.#sqliteVfs = undefined;\n\t\t\tif (error instanceof Error) {\n\t\t\t\tthis.#rLog.error({\n\t\t\t\t\tmsg: \"database setup failed\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tconst wrappedError = new Error(\n\t\t\t\t`Database setup failed: ${String(error)}`,\n\t\t\t);\n\t\t\tthis.#rLog.error({\n\t\t\t\tmsg: \"database setup failed with non-Error object\",\n\t\t\t\terror: String(error),\n\t\t\t\terrorType: typeof error,\n\t\t\t});\n\t\t\tthrow wrappedError;\n\t\t}\n\t}\n\n\tasync #cleanupDatabase() {\n\t\tconst client = this.#db;\n\t\tconst sqliteVfs = this.#sqliteVfs;\n\t\tconst dbConfig = \"db\" in this.#config ? this.#config.db : undefined;\n\t\tthis.#db = undefined;\n\t\tthis.#sqliteVfs = undefined;\n\n\t\tif (client && dbConfig) {\n\t\t\ttry {\n\t\t\t\tawait dbConfig.onDestroy?.(client);\n\t\t\t} catch (error) {\n\t\t\t\tthis.#rLog.error({\n\t\t\t\t\tmsg: \"database cleanup failed\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (sqliteVfs) {\n\t\t\ttry {\n\t\t\t\tawait sqliteVfs.destroy();\n\t\t\t} catch (error) {\n\t\t\t\tthis.#rLog.error({\n\t\t\t\t\tmsg: \"sqlite vfs cleanup failed\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #disconnectConnections() {\n\t\tconst promises: Promise<unknown>[] = [];\n\t\tthis.#rLog.debug({\n\t\t\tmsg: \"disconnecting connections on actor stop\",\n\t\t\ttotalConns: this.connectionManager.connections.size,\n\t\t});\n\t\tfor (const connection of this.connectionManager.connections.values()) {\n\t\t\tthis.#rLog.debug({\n\t\t\t\tmsg: \"checking connection for disconnect\",\n\t\t\t\tconnId: connection.id,\n\t\t\t\tisHibernatable: connection.isHibernatable,\n\t\t\t});\n\t\t\tif (!connection.isHibernatable) {\n\t\t\t\tthis.#rLog.debug({\n\t\t\t\t\tmsg: \"disconnecting non-hibernatable connection on actor stop\",\n\t\t\t\t\tconnId: connection.id,\n\t\t\t\t});\n\t\t\t\tpromises.push(connection.disconnect());\n\t\t\t} else {\n\t\t\t\tthis.#rLog.debug({\n\t\t\t\t\tmsg: \"preserving hibernatable connection on actor stop\",\n\t\t\t\t\tconnId: connection.id,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Wait with timeout\n\t\tconst res = await Promise.race([\n\t\t\tPromise.all(promises).then(() => false),\n\t\t\tnew Promise<boolean>((res) =>\n\t\t\t\tglobalThis.setTimeout(() => res(true), 1500),\n\t\t\t),\n\t\t]);\n\n\t\tif (res) {\n\t\t\tthis.#rLog.warn({\n\t\t\t\tmsg: \"timed out waiting for connections to close, shutting down anyway\",\n\t\t\t});\n\t\t}\n\t}\n\n\tasync #waitBackgroundPromises(timeoutMs: number) {\n\t\tconst pending = this.#backgroundPromises;\n\t\tif (pending.length === 0) {\n\t\t\tthis.#rLog.debug({ msg: \"no background promises\" });\n\t\t\treturn;\n\t\t}\n\n\t\tconst timedOut = await Promise.race([\n\t\t\tPromise.allSettled(pending).then(() => false),\n\t\t\tnew Promise<true>((resolve) =>\n\t\t\t\tsetTimeout(() => resolve(true), timeoutMs),\n\t\t\t),\n\t\t]);\n\n\t\tif (timedOut) {\n\t\t\tthis.#rLog.error({\n\t\t\t\tmsg: \"timed out waiting for background tasks\",\n\t\t\t\tcount: pending.length,\n\t\t\t\ttimeoutMs,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.#rLog.debug({ msg: \"background promises finished\" });\n\t\t}\n\t}\n\n\tresetSleepTimer() {\n\t\tif (this.#config.options.noSleep || !this.#sleepingSupported) return;\n\t\tif (this.#stopCalled) return;\n\n\t\tconst canSleep = this.#canSleep();\n\n\t\tthis.#rLog.debug({\n\t\t\tmsg: \"resetting sleep timer\",\n\t\t\tcanSleep: CanSleep[canSleep],\n\t\t\texistingTimeout: !!this.#sleepTimeout,\n\t\t\ttimeout: this.#config.options.sleepTimeout,\n\t\t});\n\n\t\tif (this.#sleepTimeout) {\n\t\t\tclearTimeout(this.#sleepTimeout);\n\t\t\tthis.#sleepTimeout = undefined;\n\t\t}\n\n\t\tif (this.#sleepCalled) return;\n\n\t\tif (canSleep === CanSleep.Yes) {\n\t\t\tthis.#sleepTimeout = setTimeout(() => {\n\t\t\t\tthis.startSleep();\n\t\t\t}, this.#config.options.sleepTimeout);\n\t\t}\n\t}\n\n\t#canSleep(): CanSleep {\n\t\tif (!this.#ready) return CanSleep.NotReady;\n\t\tif (!this.#started) return CanSleep.NotReady;\n\t\tif (this.#preventSleep) return CanSleep.PreventSleep;\n\t\tif (this.#activeHonoHttpRequests > 0)\n\t\t\treturn CanSleep.ActiveHonoHttpRequests;\n\t\tif (this.#activeKeepAwakeCount > 0) return CanSleep.ActiveKeepAwake;\n\t\tif (this.#runHandlerActive && this.#activeQueueWaitCount === 0) {\n\t\t\treturn CanSleep.ActiveRun;\n\t\t}\n\n\t\tfor (const _conn of this.connectionManager.connections.values()) {\n\t\t\t// TODO: Add back\n\t\t\t// if (!_conn.isHibernatable) {\n\t\t\treturn CanSleep.ActiveConns;\n\t\t\t// }\n\t\t}\n\n\t\tif (this.connectionManager.pendingDisconnectCount > 0) {\n\t\t\treturn CanSleep.ActiveDisconnectCallbacks;\n\t\t}\n\n\t\treturn CanSleep.Yes;\n\t}\n\n\tget #sleepingSupported(): boolean {\n\t\treturn this.driver.startSleep !== undefined;\n\t}\n\n\tget #varsEnabled(): boolean {\n\t\treturn \"createVars\" in this.#config || \"vars\" in this.#config;\n\t}\n\n\t#validateVarsEnabled() {\n\t\tif (!this.#varsEnabled) {\n\t\t\tthrow new errors.VarsNotEnabled();\n\t\t}\n\t}\n}\n","/**\n * Lightweight in-memory metrics for actor instances.\n *\n * Metrics are collected per actor wake cycle and are NOT persisted. They reset\n * when the actor sleeps and wakes again.\n */\n\nexport interface CounterMetric {\n\ttype: \"counter\";\n\thelp: string;\n\tvalue: number;\n}\n\nexport interface GaugeMetric {\n\ttype: \"gauge\";\n\thelp: string;\n\tvalue: number;\n}\n\nexport interface LabeledCounterMetric {\n\ttype: \"labeled_counter\";\n\thelp: string;\n\tvalues: Record<string, number>;\n}\n\nexport interface LabeledTimingMetric {\n\ttype: \"labeled_timing\";\n\thelp: string;\n\tvalues: Record<string, { calls: number; totalMs: number; keys: number }>;\n}\n\nexport type Metric =\n\t| CounterMetric\n\t| GaugeMetric\n\t| LabeledCounterMetric\n\t| LabeledTimingMetric;\n\nexport type MetricsSnapshot = Record<string, Metric>;\n\nexport class ActorMetrics {\n\t// KV operations\n\tkvGet = { calls: 0, keys: 0, totalMs: 0 };\n\tkvGetBatch = { calls: 0, keys: 0, totalMs: 0 };\n\tkvPut = { calls: 0, keys: 0, totalMs: 0 };\n\tkvPutBatch = { calls: 0, keys: 0, totalMs: 0 };\n\tkvDeleteBatch = { calls: 0, keys: 0, totalMs: 0 };\n\n\t// SQL statements\n\tsqlSelects = 0;\n\tsqlInserts = 0;\n\tsqlUpdates = 0;\n\tsqlDeletes = 0;\n\tsqlOther = 0;\n\tsqlTotalMs = 0;\n\n\t// Actions\n\tactionCalls = 0;\n\tactionErrors = 0;\n\tactionTotalMs = 0;\n\n\t// Connections\n\tconnectionsOpened = 0;\n\tconnectionsClosed = 0;\n\n\ttrackSql(query: string, durationMs: number): void {\n\t\tconst token = query.trimStart().slice(0, 8).toUpperCase();\n\t\tif (token.startsWith(\"SELECT\") || token.startsWith(\"PRAGMA\") || token.startsWith(\"WITH\")) {\n\t\t\tthis.sqlSelects++;\n\t\t} else if (token.startsWith(\"INSERT\")) {\n\t\t\tthis.sqlInserts++;\n\t\t} else if (token.startsWith(\"UPDATE\")) {\n\t\t\tthis.sqlUpdates++;\n\t\t} else if (token.startsWith(\"DELETE\")) {\n\t\t\tthis.sqlDeletes++;\n\t\t} else {\n\t\t\tthis.sqlOther++;\n\t\t}\n\t\tthis.sqlTotalMs += durationMs;\n\t}\n\n\tsnapshot(): MetricsSnapshot {\n\t\treturn {\n\t\t\tkv_operations: {\n\t\t\t\ttype: \"labeled_timing\",\n\t\t\t\thelp: \"KV round trips by operation type\",\n\t\t\t\tvalues: {\n\t\t\t\t\tget: { ...this.kvGet },\n\t\t\t\t\tgetBatch: { ...this.kvGetBatch },\n\t\t\t\t\tput: { ...this.kvPut },\n\t\t\t\t\tputBatch: { ...this.kvPutBatch },\n\t\t\t\t\tdeleteBatch: { ...this.kvDeleteBatch },\n\t\t\t\t},\n\t\t\t},\n\t\t\tsql_statements: {\n\t\t\t\ttype: \"labeled_counter\",\n\t\t\t\thelp: \"SQL statements executed by type\",\n\t\t\t\tvalues: {\n\t\t\t\t\tselect: this.sqlSelects,\n\t\t\t\t\tinsert: this.sqlInserts,\n\t\t\t\t\tupdate: this.sqlUpdates,\n\t\t\t\t\tdelete: this.sqlDeletes,\n\t\t\t\t\tother: this.sqlOther,\n\t\t\t\t},\n\t\t\t},\n\t\t\tsql_duration_ms: {\n\t\t\t\ttype: \"counter\",\n\t\t\t\thelp: \"Total SQL execution time in milliseconds\",\n\t\t\t\tvalue: this.sqlTotalMs,\n\t\t\t},\n\t\t\taction_calls: {\n\t\t\t\ttype: \"counter\",\n\t\t\t\thelp: \"Total action invocations\",\n\t\t\t\tvalue: this.actionCalls,\n\t\t\t},\n\t\t\taction_errors: {\n\t\t\t\ttype: \"counter\",\n\t\t\t\thelp: \"Total action errors\",\n\t\t\t\tvalue: this.actionErrors,\n\t\t\t},\n\t\t\taction_duration_ms: {\n\t\t\t\ttype: \"counter\",\n\t\t\t\thelp: \"Total action execution time in milliseconds\",\n\t\t\t\tvalue: this.actionTotalMs,\n\t\t\t},\n\t\t\tconnections_opened: {\n\t\t\t\ttype: \"counter\",\n\t\t\t\thelp: \"Total WebSocket connections opened\",\n\t\t\t\tvalue: this.connectionsOpened,\n\t\t\t},\n\t\t\tconnections_closed: {\n\t\t\t\ttype: \"counter\",\n\t\t\t\thelp: \"Total WebSocket connections closed\",\n\t\t\t\tvalue: this.connectionsClosed,\n\t\t\t},\n\t\t};\n\t}\n}\n","import * as cbor from \"cbor-x\";\nimport { createNanoEvents } from \"nanoevents\";\nimport { createHttpDriver } from \"@/actor/conn/drivers/http\";\nimport {\n\tCONN_DRIVER_SYMBOL,\n\tCONN_STATE_MANAGER_SYMBOL,\n} from \"@/actor/conn/mod\";\nimport { getRunInspectorConfig } from \"@/actor/config\";\nimport { ActionContext } from \"@/actor/contexts/action\";\nimport * as actorErrors from \"@/actor/errors\";\nimport type { AnyActorInstance } from \"@/mod\";\nimport type * as schema from \"@/schemas/actor-inspector/mod\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nimport { serializeWorkflowHistoryForJson } from \"./workflow-history-json\";\n\ninterface ActorInspectorEmitterEvents {\n\tstateUpdated: (state: unknown) => void;\n\tconnectionsUpdated: () => void;\n\tqueueUpdated: () => void;\n\tworkflowHistoryUpdated: (history: schema.WorkflowHistory) => void;\n}\n\nexport type Connection = Omit<schema.Connection, \"details\"> & {\n\tdetails: unknown;\n};\n\n/**\n * Provides a unified interface for inspecting actor external and internal state.\n */\nexport class ActorInspector {\n\tpublic readonly emitter = createNanoEvents<ActorInspectorEmitterEvents>();\n\n\t#lastQueueSize = 0;\n\t#workflowInspector?: NonNullable<\n\t\tReturnType<typeof getRunInspectorConfig>\n\t>[\"workflow\"];\n\n\tconstructor(private readonly actor: AnyActorInstance) {\n\t\tthis.#lastQueueSize = actor.queueManager?.size ?? 0;\n\t\tconst runInspector = getRunInspectorConfig(actor.config.run);\n\t\tthis.#workflowInspector = runInspector?.workflow;\n\t\tif (this.#workflowInspector?.onHistoryUpdated) {\n\t\t\tthis.#workflowInspector.onHistoryUpdated((history) => {\n\t\t\t\tthis.emitter.emit(\n\t\t\t\t\t\"workflowHistoryUpdated\",\n\t\t\t\t\thistory as schema.WorkflowHistory,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t}\n\n\tgetQueueSize() {\n\t\treturn this.#lastQueueSize;\n\t}\n\n\tasync getQueueStatus(limit: number): Promise<schema.QueueStatus> {\n\t\tconst maxSize = this.actor.config.options.maxQueueSize;\n\t\tconst safeLimit = Math.max(0, Math.floor(limit));\n\t\tconst messages = await this.actor.queueManager.getMessages();\n\t\tconst sorted = messages.sort((a, b) => a.createdAt - b.createdAt);\n\t\tconst limited = safeLimit > 0 ? sorted.slice(0, safeLimit) : [];\n\t\treturn {\n\t\t\tsize: BigInt(this.#lastQueueSize),\n\t\t\tmaxSize: BigInt(maxSize),\n\t\t\ttruncated: sorted.length > limited.length,\n\t\t\tmessages: limited.map((message) => ({\n\t\t\t\tid: message.id,\n\t\t\t\tname: message.name,\n\t\t\t\tcreatedAtMs: BigInt(message.createdAt),\n\t\t\t})),\n\t\t};\n\t}\n\n\tupdateQueueSize(size: number) {\n\t\tif (this.#lastQueueSize === size) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#lastQueueSize = size;\n\t\tthis.emitter.emit(\"queueUpdated\");\n\t}\n\n\tisWorkflowEnabled() {\n\t\treturn this.#workflowInspector !== undefined;\n\t}\n\n\tgetWorkflowHistory(): schema.WorkflowHistory | null {\n\t\tif (!this.#workflowInspector) {\n\t\t\treturn null;\n\t\t}\n\t\tconst history = this.#workflowInspector.getHistory();\n\t\treturn (history ?? null) as schema.WorkflowHistory | null;\n\t}\n\n\t// actor accessor methods\n\n\tisDatabaseEnabled() {\n\t\ttry {\n\t\t\treturn this.actor.db !== undefined;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync getDatabaseSchema(): Promise<ArrayBuffer> {\n\t\tif (!this.isDatabaseEnabled()) {\n\t\t\tthrow new actorErrors.DatabaseNotEnabled();\n\t\t}\n\n\t\tconst db = this.actor.db;\n\n\t\t// Get table list from sqlite_master, excluding internal tables.\n\t\tconst tables = (await db.execute(\n\t\t\t\"SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%' AND name NOT LIKE '__drizzle_%'\",\n\t\t)) as { name: string; type: string }[];\n\n\t\t// Serialize all queries to avoid concurrent @rivetkit/sqlite access\n\t\t// which can cause \"file is not a database\" errors.\n\t\tconst tableInfos = [];\n\t\tfor (const table of tables) {\n\t\t\tconst quoted = `\"${escapeDoubleQuotes(table.name)}\"`;\n\t\t\tconst sample = (await db.execute(\n\t\t\t\t`SELECT * FROM ${quoted} LIMIT 1`,\n\t\t\t)) as Record<string, unknown>[];\n\t\t\tconst countResult = (await db.execute(\n\t\t\t\t`SELECT COUNT(*) as count FROM ${quoted}`,\n\t\t\t)) as { count: number }[];\n\n\t\t\tconst columnNames = sample?.[0] ? Object.keys(sample[0]) : [];\n\n\t\t\ttableInfos.push({\n\t\t\t\ttable: { schema: \"main\", name: table.name, type: table.type },\n\t\t\t\tcolumns: columnNames.map((name, cid) => ({\n\t\t\t\t\tcid,\n\t\t\t\t\tname,\n\t\t\t\t\ttype: \"\",\n\t\t\t\t\tnotnull: 0,\n\t\t\t\t\tdflt_value: null,\n\t\t\t\t\tpk: 0,\n\t\t\t\t})),\n\t\t\t\tforeignKeys: [],\n\t\t\t\trecords: countResult?.[0]?.count ?? 0,\n\t\t\t});\n\t\t}\n\n\t\treturn bufferToArrayBuffer(cbor.encode({ tables: tableInfos }));\n\t}\n\n\tasync getDatabaseTableRows(\n\t\ttable: string,\n\t\tlimit: number,\n\t\toffset: number,\n\t): Promise<ArrayBuffer> {\n\t\tif (!this.isDatabaseEnabled()) {\n\t\t\tthrow new actorErrors.DatabaseNotEnabled();\n\t\t}\n\n\t\tconst db = this.actor.db;\n\t\tconst safeLimit = Math.max(0, Math.min(Math.floor(limit), 500));\n\t\tconst safeOffset = Math.max(0, Math.floor(offset));\n\t\tconst quoted = `\"${escapeDoubleQuotes(table)}\"`;\n\t\tconst result = await db.execute(\n\t\t\t`SELECT * FROM ${quoted} LIMIT ? OFFSET ?`,\n\t\t\tsafeLimit,\n\t\t\tsafeOffset,\n\t\t);\n\t\treturn bufferToArrayBuffer(cbor.encode(result));\n\t}\n\n\tisStateEnabled() {\n\t\treturn this.actor.stateEnabled;\n\t}\n\n\tgetState() {\n\t\tif (!this.actor.stateEnabled) {\n\t\t\tthrow new actorErrors.StateNotEnabled();\n\t\t}\n\t\treturn bufferToArrayBuffer(\n\t\t\tcbor.encode(this.actor.stateManager.persistRaw.state),\n\t\t);\n\t}\n\n\tgetRpcs() {\n\t\treturn this.actor.actions;\n\t}\n\n\tgetConnections() {\n\t\treturn Array.from(\n\t\t\tthis.actor.connectionManager.connections.entries(),\n\t\t).map(([id, conn]) => {\n\t\t\tconst connStateManager = conn[CONN_STATE_MANAGER_SYMBOL];\n\t\t\treturn {\n\t\t\t\ttype: conn[CONN_DRIVER_SYMBOL]?.type,\n\t\t\t\tid,\n\t\t\t\tdetails: bufferToArrayBuffer(\n\t\t\t\t\tcbor.encode({\n\t\t\t\t\t\ttype: conn[CONN_DRIVER_SYMBOL]?.type,\n\t\t\t\t\t\tparams: conn.params as any,\n\t\t\t\t\t\tstateEnabled: connStateManager.stateEnabled,\n\t\t\t\t\t\tstate: connStateManager.stateEnabled\n\t\t\t\t\t\t\t? connStateManager.state\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\tsubscriptions: conn.subscriptions.size,\n\t\t\t\t\t\tisHibernatable: conn.isHibernatable,\n\t\t\t\t\t\t// TODO: Include underlying hibernatable metadata +\n\t\t\t\t\t\t// path + headers\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t};\n\t\t});\n\t}\n\tasync setState(state: ArrayBuffer) {\n\t\tif (!this.actor.stateEnabled) {\n\t\t\tthrow new actorErrors.StateNotEnabled();\n\t\t}\n\t\tthis.actor.stateManager.state = cbor.decode(Buffer.from(state));\n\t\tawait this.actor.stateManager.saveState({ immediate: true });\n\t}\n\n\tasync executeAction(name: string, params: ArrayBuffer) {\n\t\tconst conn = await this.actor.connectionManager.prepareAndConnectConn(\n\t\t\tcreateHttpDriver(),\n\t\t\t// TODO: This may cause issues\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t);\n\n\t\ttry {\n\t\t\treturn bufferToArrayBuffer(\n\t\t\t\tcbor.encode(\n\t\t\t\t\tawait this.actor.executeAction(\n\t\t\t\t\t\tnew ActionContext(this.actor, conn),\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tcbor.decode(Buffer.from(params)),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\t\t} finally {\n\t\t\tconn.disconnect();\n\t\t}\n\t}\n\n\t// JSON-native methods for the HTTP inspector API. These return raw JS\n\t// objects suitable for JSON serialization instead of CBOR-encoded buffers.\n\n\tgetStateJson(): unknown {\n\t\tif (!this.actor.stateEnabled) {\n\t\t\tthrow new actorErrors.StateNotEnabled();\n\t\t}\n\t\treturn this.actor.stateManager.persistRaw.state;\n\t}\n\n\tasync setStateJson(state: unknown): Promise<void> {\n\t\tif (!this.actor.stateEnabled) {\n\t\t\tthrow new actorErrors.StateNotEnabled();\n\t\t}\n\t\tthis.actor.stateManager.state = state;\n\t\tawait this.actor.stateManager.saveState({ immediate: true });\n\t}\n\n\tasync getDatabaseSchemaJson(): Promise<unknown> {\n\t\treturn toHttpJsonCompatible(\n\t\t\tcbor.decode(Buffer.from(await this.getDatabaseSchema())),\n\t\t);\n\t}\n\n\tasync getDatabaseTableRowsJson(\n\t\ttable: string,\n\t\tlimit: number,\n\t\toffset: number,\n\t): Promise<unknown[]> {\n\t\treturn toHttpJsonCompatible(\n\t\t\tcbor.decode(\n\t\t\t\tBuffer.from(\n\t\t\t\t\tawait this.getDatabaseTableRows(table, limit, offset),\n\t\t\t\t),\n\t\t\t),\n\t\t) as unknown[];\n\t}\n\n\tgetConnectionsJson(): { id: string; details: unknown }[] {\n\t\treturn Array.from(\n\t\t\tthis.actor.connectionManager.connections.entries(),\n\t\t).map(([id, conn]) => {\n\t\t\tconst connStateManager = conn[CONN_STATE_MANAGER_SYMBOL];\n\t\t\treturn {\n\t\t\t\ttype: conn[CONN_DRIVER_SYMBOL]?.type,\n\t\t\t\tid,\n\t\t\t\tdetails: {\n\t\t\t\t\ttype: conn[CONN_DRIVER_SYMBOL]?.type,\n\t\t\t\t\tparams: conn.params as any,\n\t\t\t\t\tstateEnabled: connStateManager.stateEnabled,\n\t\t\t\t\tstate: connStateManager.stateEnabled\n\t\t\t\t\t\t? connStateManager.state\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tsubscriptions: conn.subscriptions.size,\n\t\t\t\t\tisHibernatable: conn.isHibernatable,\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\t}\n\n\tasync executeActionJson(name: string, args: unknown[]): Promise<unknown> {\n\t\tconst conn = await this.actor.connectionManager.prepareAndConnectConn(\n\t\t\tcreateHttpDriver(),\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t);\n\n\t\ttry {\n\t\t\treturn await this.actor.executeAction(\n\t\t\t\tnew ActionContext(this.actor, conn),\n\t\t\t\tname,\n\t\t\t\targs,\n\t\t\t);\n\t\t} finally {\n\t\t\tconn.disconnect();\n\t\t}\n\t}\n\n\tasync getTracesJson(options: {\n\t\tstartMs: number;\n\t\tendMs: number;\n\t\tlimit: number;\n\t}): Promise<{ otlp: unknown; clamped: boolean }> {\n\t\tconst result = await this.actor.traces.readRange(options);\n\t\treturn result;\n\t}\n\n\tgetWorkflowHistoryJson(): {\n\t\thistory: unknown | null;\n\t\tisWorkflowEnabled: boolean;\n\t} {\n\t\treturn {\n\t\t\thistory: serializeWorkflowHistoryForJson(\n\t\t\t\tthis.getWorkflowHistory(),\n\t\t\t),\n\t\t\tisWorkflowEnabled: this.isWorkflowEnabled(),\n\t\t};\n\t}\n\n\tgetQueueStatusJson(limit: number): Promise<{\n\t\tsize: number;\n\t\tmaxSize: number;\n\t\ttruncated: boolean;\n\t\tmessages: { id: number; name: string; createdAtMs: number }[];\n\t}> {\n\t\treturn this.getQueueStatus(limit).then((status) => ({\n\t\t\tsize: Number(status.size),\n\t\t\tmaxSize: Number(status.maxSize),\n\t\t\ttruncated: status.truncated,\n\t\t\tmessages: status.messages.map((m) => ({\n\t\t\t\tid: Number(m.id),\n\t\t\t\tname: m.name,\n\t\t\t\tcreatedAtMs: Number(m.createdAtMs),\n\t\t\t})),\n\t\t}));\n\t}\n}\n\nfunction escapeDoubleQuotes(value: string): string {\n\treturn value.replace(/\"/g, '\"\"');\n}\n\nfunction toHttpJsonCompatible<T>(value: T): T {\n\treturn JSON.parse(\n\t\tJSON.stringify(value, (_key, nestedValue) =>\n\t\t\ttypeof nestedValue === \"bigint\"\n\t\t\t\t? Number(nestedValue)\n\t\t\t\t: nestedValue instanceof Uint8Array\n\t\t\t\t\t? Array.from(nestedValue)\n\t\t\t\t\t: nestedValue,\n\t\t),\n\t) as T;\n}\n","import * as cbor from \"cbor-x\";\nimport { decodeWorkflowHistoryTransport } from \"@/inspector/transport\";\nimport type * as transport from \"@/schemas/transport/mod\";\n\nfunction decodeWorkflowCbor(data: ArrayBuffer | null): unknown | null {\n\tif (data === null) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\treturn cbor.decode(new Uint8Array(data));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction serializeWorkflowLocation(\n\tlocation: transport.WorkflowLocation,\n): Array<\n\t| { tag: \"WorkflowNameIndex\"; val: number }\n\t| {\n\t\t\ttag: \"WorkflowLoopIterationMarker\";\n\t\t\tval: { loop: number; iteration: number };\n\t }\n> {\n\treturn location.map((segment) => {\n\t\tif (segment.tag === \"WorkflowNameIndex\") {\n\t\t\treturn {\n\t\t\t\ttag: segment.tag,\n\t\t\t\tval: segment.val,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\ttag: segment.tag,\n\t\t\tval: {\n\t\t\t\tloop: segment.val.loop,\n\t\t\t\titeration: segment.val.iteration,\n\t\t\t},\n\t\t};\n\t});\n}\n\nfunction serializeWorkflowBranches(\n\tbranches: ReadonlyMap<string, transport.WorkflowBranchStatus>,\n): Record<\n\tstring,\n\t{ status: string; output: unknown | null; error: string | null }\n> {\n\treturn Object.fromEntries(\n\t\tArray.from(branches.entries()).map(([name, branch]) => [\n\t\t\tname,\n\t\t\t{\n\t\t\t\tstatus: branch.status,\n\t\t\t\toutput: decodeWorkflowCbor(branch.output),\n\t\t\t\terror: branch.error,\n\t\t\t},\n\t\t]),\n\t);\n}\n\nfunction serializeWorkflowEntryKind(kind: transport.WorkflowEntryKind):\n\t| {\n\t\t\ttag: \"WorkflowStepEntry\";\n\t\t\tval: { output: unknown | null; error: string | null };\n\t }\n\t| {\n\t\t\ttag: \"WorkflowLoopEntry\";\n\t\t\tval: {\n\t\t\t\tstate: unknown | null;\n\t\t\t\titeration: number;\n\t\t\t\toutput: unknown | null;\n\t\t\t};\n\t }\n\t| {\n\t\t\ttag: \"WorkflowSleepEntry\";\n\t\t\tval: { deadline: number; state: string };\n\t }\n\t| {\n\t\t\ttag: \"WorkflowMessageEntry\";\n\t\t\tval: { name: string; messageData: unknown | null };\n\t }\n\t| {\n\t\t\ttag: \"WorkflowRollbackCheckpointEntry\";\n\t\t\tval: { name: string };\n\t }\n\t| {\n\t\t\ttag: \"WorkflowJoinEntry\";\n\t\t\tval: {\n\t\t\t\tbranches: Record<\n\t\t\t\t\tstring,\n\t\t\t\t\t{\n\t\t\t\t\t\tstatus: string;\n\t\t\t\t\t\toutput: unknown | null;\n\t\t\t\t\t\terror: string | null;\n\t\t\t\t\t}\n\t\t\t\t>;\n\t\t\t};\n\t }\n\t| {\n\t\t\ttag: \"WorkflowRaceEntry\";\n\t\t\tval: {\n\t\t\t\twinner: string | null;\n\t\t\t\tbranches: Record<\n\t\t\t\t\tstring,\n\t\t\t\t\t{\n\t\t\t\t\t\tstatus: string;\n\t\t\t\t\t\toutput: unknown | null;\n\t\t\t\t\t\terror: string | null;\n\t\t\t\t\t}\n\t\t\t\t>;\n\t\t\t};\n\t }\n\t| {\n\t\t\ttag: \"WorkflowRemovedEntry\";\n\t\t\tval: { originalType: string; originalName: string | null };\n\t } {\n\tswitch (kind.tag) {\n\t\tcase \"WorkflowStepEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\toutput: decodeWorkflowCbor(kind.val.output),\n\t\t\t\t\terror: kind.val.error,\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"WorkflowLoopEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\tstate: decodeWorkflowCbor(kind.val.state),\n\t\t\t\t\titeration: kind.val.iteration,\n\t\t\t\t\toutput: decodeWorkflowCbor(kind.val.output),\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"WorkflowSleepEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\tdeadline: Number(kind.val.deadline),\n\t\t\t\t\tstate: kind.val.state,\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"WorkflowMessageEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\tname: kind.val.name,\n\t\t\t\t\tmessageData: decodeWorkflowCbor(kind.val.messageData),\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"WorkflowRollbackCheckpointEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\tname: kind.val.name,\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"WorkflowJoinEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\tbranches: serializeWorkflowBranches(kind.val.branches),\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"WorkflowRaceEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\twinner: kind.val.winner,\n\t\t\t\t\tbranches: serializeWorkflowBranches(kind.val.branches),\n\t\t\t\t},\n\t\t\t};\n\t\tcase \"WorkflowRemovedEntry\":\n\t\t\treturn {\n\t\t\t\ttag: kind.tag,\n\t\t\t\tval: {\n\t\t\t\t\toriginalType: kind.val.originalType,\n\t\t\t\t\toriginalName: kind.val.originalName,\n\t\t\t\t},\n\t\t\t};\n\t}\n}\n\nexport function serializeWorkflowHistoryForJson(\n\tdata: ArrayBuffer | null,\n):\n\t| {\n\t\t\tnameRegistry: string[];\n\t\t\tentries: Array<{\n\t\t\t\tid: string;\n\t\t\t\tlocation: Array<\n\t\t\t\t\t| { tag: \"WorkflowNameIndex\"; val: number }\n\t\t\t\t\t| {\n\t\t\t\t\t\t\ttag: \"WorkflowLoopIterationMarker\";\n\t\t\t\t\t\t\tval: { loop: number; iteration: number };\n\t\t\t\t\t }\n\t\t\t\t>;\n\t\t\t\tkind:\n\t\t\t\t\t| {\n\t\t\t\t\t\t\ttag: \"WorkflowStepEntry\";\n\t\t\t\t\t\t\tval: { output: unknown | null; error: string | null };\n\t\t\t\t\t }\n\t\t\t\t\t| {\n\t\t\t\t\t\t\ttag: \"WorkflowLoopEntry\";\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\tstate: unknown | null;\n\t\t\t\t\t\t\t\titeration: number;\n\t\t\t\t\t\t\t\toutput: unknown | null;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t }\n\t\t\t\t\t| {\n\t\t\t\t\t\t\ttag: \"WorkflowSleepEntry\";\n\t\t\t\t\t\t\tval: { deadline: number; state: string };\n\t\t\t\t\t }\n\t\t\t\t\t| {\n\t\t\t\t\t\t\ttag: \"WorkflowMessageEntry\";\n\t\t\t\t\t\t\tval: { name: string; messageData: unknown | null };\n\t\t\t\t\t }\n\t\t\t\t\t| {\n\t\t\t\t\t\t\ttag: \"WorkflowRollbackCheckpointEntry\";\n\t\t\t\t\t\t\tval: { name: string };\n\t\t\t\t\t }\n\t\t\t\t\t| {\n\t\t\t\t\t\t\ttag: \"WorkflowJoinEntry\";\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\tbranches: Record<\n\t\t\t\t\t\t\t\t\tstring,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tstatus: string;\n\t\t\t\t\t\t\t\t\t\toutput: unknown | null;\n\t\t\t\t\t\t\t\t\t\terror: string | null;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t }\n\t\t\t\t\t| {\n\t\t\t\t\t\t\ttag: \"WorkflowRaceEntry\";\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\twinner: string | null;\n\t\t\t\t\t\t\t\tbranches: Record<\n\t\t\t\t\t\t\t\t\tstring,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tstatus: string;\n\t\t\t\t\t\t\t\t\t\toutput: unknown | null;\n\t\t\t\t\t\t\t\t\t\terror: string | null;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t }\n\t\t\t\t\t| {\n\t\t\t\t\t\t\ttag: \"WorkflowRemovedEntry\";\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\toriginalType: string;\n\t\t\t\t\t\t\t\toriginalName: string | null;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t };\n\t\t\t}>;\n\t\t\tentryMetadata: Record<\n\t\t\t\tstring,\n\t\t\t\t{\n\t\t\t\t\tstatus: string;\n\t\t\t\t\terror: string | null;\n\t\t\t\t\tattempts: number;\n\t\t\t\t\tlastAttemptAt: number;\n\t\t\t\t\tcreatedAt: number;\n\t\t\t\t\tcompletedAt: number | null;\n\t\t\t\t\trollbackCompletedAt: number | null;\n\t\t\t\t\trollbackError: string | null;\n\t\t\t\t}\n\t\t\t>;\n\t }\n\t| null {\n\tif (data === null) {\n\t\treturn null;\n\t}\n\n\tconst history = decodeWorkflowHistoryTransport(data);\n\n\treturn {\n\t\tnameRegistry: [...history.nameRegistry],\n\t\tentries: history.entries.map((entry) => ({\n\t\t\tid: entry.id,\n\t\t\tlocation: serializeWorkflowLocation(entry.location),\n\t\t\tkind: serializeWorkflowEntryKind(entry.kind),\n\t\t})),\n\t\tentryMetadata: Object.fromEntries(\n\t\t\tArray.from(history.entryMetadata.entries()).map(([entryId, meta]) => [\n\t\t\t\tentryId,\n\t\t\t\t{\n\t\t\t\t\tstatus: meta.status,\n\t\t\t\t\terror: meta.error,\n\t\t\t\t\tattempts: meta.attempts,\n\t\t\t\t\tlastAttemptAt: Number(meta.lastAttemptAt),\n\t\t\t\t\tcreatedAt: Number(meta.createdAt),\n\t\t\t\t\tcompletedAt:\n\t\t\t\t\t\tmeta.completedAt === null\n\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t: Number(meta.completedAt),\n\t\t\t\t\trollbackCompletedAt:\n\t\t\t\t\t\tmeta.rollbackCompletedAt === null\n\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t: Number(meta.rollbackCompletedAt),\n\t\t\t\t\trollbackError: meta.rollbackError,\n\t\t\t\t},\n\t\t\t]),\n\t\t),\n\t};\n}\n","/**\n * Persisted data structures for connections.\n *\n * Keep this file in sync with the Connection section of rivetkit-typescript/packages/rivetkit/schemas/actor-persist/\n */\n\nimport * as cbor from \"cbor-x\";\nimport type * as persistSchema from \"@/schemas/actor-persist/mod\";\nimport { bufferToArrayBuffer } from \"@/utils\";\n\nexport type GatewayId = ArrayBuffer;\nexport type RequestId = ArrayBuffer;\n\nexport type Cbor = ArrayBuffer;\n\n// MARK: Connection\n/** Event subscription for connection */\nexport interface PersistedSubscription {\n\teventName: string;\n}\n\n/** Connection associated with hibernatable WebSocket that should persist across lifecycles */\nexport interface PersistedConn<CP, CS> {\n\t/** Connection ID generated by RivetKit */\n\tid: string;\n\tparameters: CP;\n\tstate: CS;\n\tsubscriptions: PersistedSubscription[];\n\tgatewayId: GatewayId;\n\trequestId: RequestId;\n\tserverMessageIndex: number;\n\tclientMessageIndex: number;\n\trequestPath: string;\n\trequestHeaders: Record<string, string>;\n}\n\n/**\n * Converts persisted connection data to BARE schema format for serialization.\n * @throws {Error} If the connection is ephemeral (not hibernatable)\n */\nexport function convertConnToBarePersistedConn<CP, CS>(\n\tpersist: PersistedConn<CP, CS>,\n): persistSchema.Conn {\n\treturn {\n\t\tid: persist.id,\n\t\tparameters: bufferToArrayBuffer(cbor.encode(persist.parameters)),\n\t\tstate: bufferToArrayBuffer(cbor.encode(persist.state)),\n\t\tsubscriptions: persist.subscriptions.map((sub) => ({\n\t\t\teventName: sub.eventName,\n\t\t})),\n\t\tgatewayId: persist.gatewayId,\n\t\trequestId: persist.requestId,\n\t\tserverMessageIndex: persist.serverMessageIndex,\n\t\tclientMessageIndex: persist.clientMessageIndex,\n\t\trequestPath: persist.requestPath,\n\t\trequestHeaders: new Map(Object.entries(persist.requestHeaders)),\n\t};\n}\n\n/**\n * Converts BARE schema format to persisted connection data.\n * @throws {Error} If the connection is ephemeral (not hibernatable)\n */\nexport function convertConnFromBarePersistedConn<CP, CS>(\n\tbareData: persistSchema.Conn,\n): PersistedConn<CP, CS> {\n\treturn {\n\t\tid: bareData.id,\n\t\tparameters: cbor.decode(new Uint8Array(bareData.parameters)),\n\t\tstate: cbor.decode(new Uint8Array(bareData.state)),\n\t\tsubscriptions: bareData.subscriptions.map((sub) => ({\n\t\t\teventName: sub.eventName,\n\t\t})),\n\t\tgatewayId: bareData.gatewayId,\n\t\trequestId: bareData.requestId,\n\t\tserverMessageIndex: bareData.serverMessageIndex,\n\t\tclientMessageIndex: bareData.clientMessageIndex,\n\t\trequestPath: bareData.requestPath,\n\t\trequestHeaders: Object.fromEntries(bareData.requestHeaders),\n\t};\n}\n","import type { AnyActorInstance } from \"./instance/mod\";\n\nexport class Schedule {\n\t#actor: AnyActorInstance;\n\n\tconstructor(actor: AnyActorInstance) {\n\t\tthis.#actor = actor;\n\t}\n\n\tasync after(duration: number, fn: string, ...args: unknown[]) {\n\t\tawait this.#actor.scheduleEvent(Date.now() + duration, fn, args);\n\t}\n\n\tasync at(timestamp: number, fn: string, ...args: unknown[]) {\n\t\tawait this.#actor.scheduleEvent(timestamp, fn, args);\n\t}\n}\n","import { HibernatingWebSocketMetadata } from \"@rivetkit/engine-runner\";\nimport * as cbor from \"cbor-x\";\nimport invariant from \"invariant\";\nimport { CONN_VERSIONED } from \"@/schemas/actor-persist/versioned\";\nimport {\n\tCURRENT_VERSION as CLIENT_PROTOCOL_CURRENT_VERSION,\n\tTO_CLIENT_VERSIONED,\n} from \"@/schemas/client-protocol/versioned\";\nimport { ToClientSchema } from \"@/schemas/client-protocol-zod/mod\";\nimport { arrayBuffersEqual, stringifyError } from \"@/utils\";\nimport type { ConnDriver } from \"../conn/driver\";\nimport {\n\tCONN_CONNECTED_SYMBOL,\n\tCONN_DRIVER_SYMBOL,\n\tCONN_SEND_MESSAGE_SYMBOL,\n\tCONN_SPEAKS_RIVETKIT_SYMBOL,\n\tCONN_STATE_MANAGER_SYMBOL,\n\tConn,\n\ttype ConnId,\n} from \"../conn/mod\";\nimport {\n\tconvertConnToBarePersistedConn,\n\ttype PersistedConn,\n} from \"../conn/persisted\";\nimport type { ConnDataInput } from \"../conn/state-manager\";\nimport {\n\tBeforeConnectContext,\n\tConnectContext,\n\tCreateConnStateContext,\n} from \"../contexts\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport { CachedSerializer } from \"../protocol/serde\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport { deadline } from \"../utils\";\nimport { makeConnKey } from \"./keys\";\nimport type { ActorInstance } from \"./mod\";\n/**\n * Manages all connection-related operations for an actor instance.\n * Handles connection creation, tracking, hibernation, and cleanup.\n */\nexport class ConnectionManager<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n> {\n\t#actor: ActorInstance<S, CP, CS, V, I, DB, E, Q>;\n\t#connections = new Map<ConnId, Conn<S, CP, CS, V, I, DB, E, Q>>();\n\t#pendingDisconnectCount = 0;\n\n\t/** Connections that have had their state changed and need to be persisted. */\n\t#connsWithPersistChanged = new Set<ConnId>();\n\n\tconstructor(actor: ActorInstance<S, CP, CS, V, I, DB, E, Q>) {\n\t\tthis.#actor = actor;\n\t}\n\n\tget connections(): Map<ConnId, Conn<S, CP, CS, V, I, DB, E, Q>> {\n\t\treturn this.#connections;\n\t}\n\n\tgetConnForId(id: string): Conn<S, CP, CS, V, I, DB, E, Q> | undefined {\n\t\treturn this.#connections.get(id);\n\t}\n\n\tget connsWithPersistChanged(): Set<ConnId> {\n\t\treturn this.#connsWithPersistChanged;\n\t}\n\n\tget pendingDisconnectCount(): number {\n\t\treturn this.#pendingDisconnectCount;\n\t}\n\n\tclearConnWithPersistChanged() {\n\t\tthis.#connsWithPersistChanged.clear();\n\t}\n\n\tmarkConnWithPersistChanged(conn: Conn<S, CP, CS, V, I, DB, E, Q>) {\n\t\tinvariant(\n\t\t\tconn.isHibernatable,\n\t\t\t\"cannot mark non-hibernatable conn for persist\",\n\t\t);\n\n\t\tthis.#actor.rLog.debug({\n\t\t\tmsg: \"marked connection as changed\",\n\t\t\tconnId: conn.id,\n\t\t\ttotalChanged: this.#connsWithPersistChanged.size,\n\t\t});\n\n\t\tthis.#connsWithPersistChanged.add(conn.id);\n\n\t\tthis.#actor.stateManager.savePersistThrottled();\n\t}\n\n\t// MARK: - Connection Lifecycle\n\t/**\n\t * Handles pre-connection logic (i.e. auth & create state) before actually connecting the connection.\n\t */\n\tasync prepareConn(\n\t\tdriver: ConnDriver,\n\t\tparams: CP,\n\t\trequest: Request | undefined,\n\t\trequestPath: string | undefined,\n\t\trequestHeaders: Record<string, string> | undefined,\n\t\tisHibernatable: boolean,\n\t\tisRestoringHibernatable: boolean,\n\t): Promise<Conn<S, CP, CS, V, I, DB, E, Q>> {\n\t\tthis.#actor.assertReady();\n\n\t\t// TODO: Add back\n\t\t// const url = request?.url;\n\t\t// invariant(\n\t\t// \turl?.startsWith(\"http://actor/\") ?? true,\n\t\t// \t`url ${url} must start with 'http://actor/'`,\n\t\t// );\n\n\t\t// Check for hibernatable websocket reconnection\n\t\tif (isRestoringHibernatable) {\n\t\t\treturn this.#reconnectHibernatableConn(driver);\n\t\t}\n\n\t\t// Create new connection\n\t\tif (this.#actor.config.onBeforeConnect) {\n\t\t\tconst ctx = new BeforeConnectContext(this.#actor, request);\n\t\t\tawait this.#actor.runInTraceSpan(\n\t\t\t\t\"actor.onBeforeConnect\",\n\t\t\t\t{\n\t\t\t\t\t\"rivet.conn.type\": driver.type,\n\t\t\t\t},\n\t\t\t\t() => this.#actor.config.onBeforeConnect!(ctx, params),\n\t\t\t);\n\t\t}\n\n\t\t// Create connection state if enabled\n\t\tlet connState: CS | undefined;\n\t\tif (this.#actor.connStateEnabled) {\n\t\t\tconnState = await this.#createConnState(params, request);\n\t\t}\n\n\t\t// Create connection persist data\n\t\tlet connData: ConnDataInput<CP, CS>;\n\t\tif (isHibernatable) {\n\t\t\tconst hibernatable = driver.hibernatable;\n\t\t\tinvariant(hibernatable, \"must have hibernatable\");\n\t\t\tinvariant(requestPath, \"missing requestPath for hibernatable ws\");\n\t\t\tinvariant(\n\t\t\t\trequestHeaders,\n\t\t\t\t\"missing requestHeaders for hibernatable ws\",\n\t\t\t);\n\t\t\tconnData = {\n\t\t\t\thibernatable: {\n\t\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\t\tparameters: params,\n\t\t\t\t\tstate: connState as CS,\n\t\t\t\t\tsubscriptions: [],\n\t\t\t\t\tgatewayId: hibernatable.gatewayId,\n\t\t\t\t\trequestId: hibernatable.requestId,\n\t\t\t\t\tclientMessageIndex: 0,\n\t\t\t\t\t// First message index will be 1, so we start at 0\n\t\t\t\t\tserverMessageIndex: 0,\n\t\t\t\t\trequestPath,\n\t\t\t\t\trequestHeaders,\n\t\t\t\t},\n\t\t\t};\n\t\t} else {\n\t\t\tconnData = {\n\t\t\t\tephemeral: {\n\t\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\t\tparameters: params,\n\t\t\t\t\tstate: connState as CS,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\t// Create connection instance\n\t\tconst conn = new Conn<S, CP, CS, V, I, DB, E, Q>(this.#actor, connData);\n\t\tconn[CONN_DRIVER_SYMBOL] = driver;\n\n\t\treturn conn;\n\t}\n\n\t/**\n\t * Adds a connection form prepareConn to the actor and calls onConnect.\n\t *\n\t * This method is intentionally not async since it needs to be called in\n\t * `onOpen` for WebSockets. If this is async, the order of open events will\n\t * be messed up and cause race conditions that can drop WebSocket messages.\n\t * So all async work in prepareConn.\n\t */\n\tconnectConn(conn: Conn<S, CP, CS, V, I, DB, E, Q>) {\n\t\tinvariant(!this.#connections.has(conn.id), \"conn already connected\");\n\n\t\tthis.#connections.set(conn.id, conn);\n\n\t\t// Notify driver about new connection BEFORE marking as changed\n\t\t//\n\t\t// This ensures the driver can set up any necessary state (like #hwsMessageIndex)\n\t\t// before saveState is triggered by markConnWithPersistChanged\n\t\tif (this.#actor.driver.onCreateConn) {\n\t\t\tthis.#actor.driver.onCreateConn(conn);\n\t\t}\n\n\t\tif (conn.isHibernatable) {\n\t\t\tthis.markConnWithPersistChanged(conn);\n\t\t}\n\n\t\tthis.#callOnConnect(conn);\n\n\t\tthis.#actor.inspector.emitter.emit(\"connectionsUpdated\");\n\n\t\tthis.#actor.resetSleepTimer();\n\n\t\tconn[CONN_CONNECTED_SYMBOL] = true;\n\n\t\t// Send init message\n\t\tif (conn[CONN_SPEAKS_RIVETKIT_SYMBOL]) {\n\t\t\tconst initData = { actorId: this.#actor.id, connectionId: conn.id };\n\t\t\tconn[CONN_SEND_MESSAGE_SYMBOL](\n\t\t\t\tnew CachedSerializer(\n\t\t\t\t\tinitData,\n\t\t\t\t\tTO_CLIENT_VERSIONED,\n\t\t\t\t\tCLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\t\t\tToClientSchema,\n\t\t\t\t\t// JSON: identity conversion (no nested data to encode)\n\t\t\t\t\t(value) => ({\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"Init\" as const,\n\t\t\t\t\t\t\tval: value,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\t// BARE/CBOR: identity conversion (no nested data to encode)\n\t\t\t\t\t(value) => ({\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"Init\" as const,\n\t\t\t\t\t\t\tval: value,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\t#reconnectHibernatableConn(\n\t\tdriver: ConnDriver,\n\t): Conn<S, CP, CS, V, I, DB, E, Q> {\n\t\tinvariant(driver.hibernatable, \"missing requestIdBuf\");\n\t\tconst existingConn = this.findHibernatableConn(\n\t\t\tdriver.hibernatable.gatewayId,\n\t\t\tdriver.hibernatable.requestId,\n\t\t);\n\t\tinvariant(\n\t\t\texistingConn,\n\t\t\t\"cannot find connection for restoring connection\",\n\t\t);\n\n\t\tthis.#actor.rLog.debug({\n\t\t\tmsg: \"reconnecting hibernatable websocket connection\",\n\t\t\tconnectionId: existingConn.id,\n\t\t});\n\n\t\t// Clean up existing driver state if present\n\t\tif (existingConn[CONN_DRIVER_SYMBOL]) {\n\t\t\tthis.#disconnectExistingDriver(existingConn);\n\t\t}\n\n\t\t// Update connection with new socket\n\t\texistingConn[CONN_DRIVER_SYMBOL] = driver;\n\n\t\t// Reset sleep timer since we have an active connection\n\t\tthis.#actor.resetSleepTimer();\n\n\t\t// Mark connection as connected\n\t\texistingConn[CONN_CONNECTED_SYMBOL] = true;\n\n\t\tthis.#actor.inspector.emitter.emit(\"connectionsUpdated\");\n\n\t\treturn existingConn;\n\t}\n\n\t#disconnectExistingDriver(conn: Conn<S, CP, CS, V, I, DB, E, Q>) {\n\t\tconst driver = conn[CONN_DRIVER_SYMBOL];\n\t\tif (driver?.disconnect) {\n\t\t\tdriver.disconnect(\n\t\t\t\tthis.#actor,\n\t\t\t\tconn,\n\t\t\t\t\"Reconnecting hibernatable websocket with new driver state\",\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Handle connection disconnection.\n\t *\n\t * This is called by `Conn.disconnect`. This should not call `Conn.disconnect.`\n\t */\n\tasync connDisconnected(conn: Conn<S, CP, CS, V, I, DB, E, Q>) {\n\t\t// Remove from tracking\n\t\tthis.#connections.delete(conn.id);\n\n\t\tthis.#actor.rLog.debug({ msg: \"removed conn\", connId: conn.id });\n\n\t\t// Notify driver about connection removal\n\t\tif (this.#actor.driver.onDestroyConn) {\n\t\t\tthis.#actor.driver.onDestroyConn(conn);\n\t\t}\n\n\t\tfor (const eventName of [...conn.subscriptions.values()]) {\n\t\t\tthis.#actor.eventManager.removeSubscription(eventName, conn, true);\n\t\t}\n\n\t\tthis.#actor.inspector.emitter.emit(\"connectionsUpdated\");\n\t\tthis.#pendingDisconnectCount += 1;\n\n\t\tconst attributes = {\n\t\t\t\"rivet.conn.id\": conn.id,\n\t\t\t\"rivet.conn.type\": conn[CONN_DRIVER_SYMBOL]?.type,\n\t\t\t\"rivet.conn.hibernatable\": conn.isHibernatable,\n\t\t};\n\t\tconst span = this.#actor.startTraceSpan(\n\t\t\t\"actor.onDisconnect\",\n\t\t\tattributes,\n\t\t);\n\n\t\ttry {\n\t\t\tif (this.#actor.config.onDisconnect) {\n\t\t\t\tconst result = this.#actor.traces.withSpan(span, () =>\n\t\t\t\t\tthis.#actor.config.onDisconnect!(\n\t\t\t\t\t\tthis.#actor.actorContext,\n\t\t\t\t\t\tconn,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tthis.#actor.emitTraceEvent(\n\t\t\t\t\t\"connection.disconnect\",\n\t\t\t\t\tattributes,\n\t\t\t\t\tspan,\n\t\t\t\t);\n\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\tawait result;\n\t\t\t\t}\n\t\t\t\tthis.#actor.endTraceSpan(span, { code: \"OK\" });\n\t\t\t} else {\n\t\t\t\tthis.#actor.emitTraceEvent(\n\t\t\t\t\t\"connection.disconnect\",\n\t\t\t\t\tattributes,\n\t\t\t\t\tspan,\n\t\t\t\t);\n\t\t\t\tthis.#actor.endTraceSpan(span, { code: \"OK\" });\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.#actor.endTraceSpan(span, {\n\t\t\t\tcode: \"ERROR\",\n\t\t\t\tmessage: stringifyError(error),\n\t\t\t});\n\t\t\tthis.#actor.rLog.error({\n\t\t\t\tmsg: \"error in `onDisconnect`\",\n\t\t\t\terror: stringifyError(error),\n\t\t\t});\n\t\t} finally {\n\t\t\t// Remove from connsWithPersistChanged after onDisconnect to handle any\n\t\t\t// state changes made during the disconnect callback. Disconnected connections\n\t\t\t// are removed from KV storage via kvBatchDelete below, not through the\n\t\t\t// normal persist save flow, so they should not trigger persist saves.\n\t\t\tthis.#connsWithPersistChanged.delete(conn.id);\n\n\t\t\t// Remove from KV storage.\n\t\t\tif (conn.isHibernatable) {\n\t\t\t\tconst key = makeConnKey(conn.id);\n\t\t\t\ttry {\n\t\t\t\t\tawait this.#actor.driver.kvBatchDelete(this.#actor.id, [\n\t\t\t\t\t\tkey,\n\t\t\t\t\t]);\n\t\t\t\t\tthis.#actor.rLog.debug({\n\t\t\t\t\t\tmsg: \"removed connection from KV\",\n\t\t\t\t\t\tconnId: conn.id,\n\t\t\t\t\t});\n\t\t\t\t} catch (err) {\n\t\t\t\t\tthis.#actor.rLog.error({\n\t\t\t\t\t\tmsg: \"kvBatchDelete failed for conn\",\n\t\t\t\t\t\terr: stringifyError(err),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.#pendingDisconnectCount = Math.max(\n\t\t\t\t0,\n\t\t\t\tthis.#pendingDisconnectCount - 1,\n\t\t\t);\n\t\t\tthis.#actor.resetSleepTimer();\n\t\t}\n\t}\n\n\tasync cleanupPersistedHibernatableConnections(\n\t\treason?: string,\n\t): Promise<number> {\n\t\tconst staleConnections = Array.from(this.#connections.values()).filter(\n\t\t\t(conn) =>\n\t\t\t\tconn.isHibernatable && conn[CONN_DRIVER_SYMBOL] === undefined,\n\t\t);\n\t\tif (staleConnections.length === 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tthis.#actor.rLog.info({\n\t\t\tmsg: \"cleaning up persisted hibernatable connections\",\n\t\t\treason: reason ?? \"unknown\",\n\t\t\tcount: staleConnections.length,\n\t\t});\n\n\t\tfor (const conn of staleConnections) {\n\t\t\tawait this.connDisconnected(conn);\n\t\t}\n\n\t\treturn staleConnections.length;\n\t}\n\n\t/**\n\t * Utilify function for call sites that don't need a separate prepare and connect phase.\n\t */\n\tasync prepareAndConnectConn(\n\t\tdriver: ConnDriver,\n\t\tparams: CP,\n\t\trequest: Request | undefined,\n\t\trequestPath: string | undefined,\n\t\trequestHeaders: Record<string, string> | undefined,\n\t): Promise<Conn<S, CP, CS, V, I, DB, E, Q>> {\n\t\tconst conn = await this.prepareConn(\n\t\t\tdriver,\n\t\t\tparams,\n\t\t\trequest,\n\t\t\trequestPath,\n\t\t\trequestHeaders,\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t);\n\t\tthis.connectConn(conn);\n\t\treturn conn;\n\t}\n\n\t// MARK: - Persistence\n\n\t/**\n\t * Restores connections from persisted data during actor initialization.\n\t */\n\trestoreConnections(connections: PersistedConn<CP, CS>[]) {\n\t\tfor (const connPersist of connections) {\n\t\t\t// Create connection instance\n\t\t\tconst conn = new Conn<S, CP, CS, V, I, DB, E, Q>(this.#actor, {\n\t\t\t\thibernatable: connPersist,\n\t\t\t});\n\t\t\tthis.#connections.set(conn.id, conn);\n\n\t\t\t// Notify driver about restored connection\n\t\t\tif (this.#actor.driver.onCreateConn) {\n\t\t\t\tthis.#actor.driver.onCreateConn(conn);\n\t\t\t}\n\n\t\t\t// Restore subscriptions\n\t\t\tfor (const sub of connPersist.subscriptions) {\n\t\t\t\tthis.#actor.eventManager.addSubscription(\n\t\t\t\t\tsub.eventName,\n\t\t\t\t\tconn,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// MARK: - Private Helpers\n\n\tfindHibernatableConn(\n\t\tgatewayIdBuf: ArrayBuffer,\n\t\trequestIdBuf: ArrayBuffer,\n\t): Conn<S, CP, CS, V, I, DB, E, Q> | undefined {\n\t\treturn Array.from(this.#connections.values()).find((conn) => {\n\t\t\tconst connStateManager = conn[CONN_STATE_MANAGER_SYMBOL];\n\t\t\tconst h = connStateManager.hibernatableDataRaw;\n\t\t\treturn (\n\t\t\t\th &&\n\t\t\t\tarrayBuffersEqual(h.gatewayId, gatewayIdBuf) &&\n\t\t\t\tarrayBuffersEqual(h.requestId, requestIdBuf)\n\t\t\t);\n\t\t});\n\t}\n\n\tasync #createConnState(\n\t\tparams: CP,\n\t\trequest: Request | undefined,\n\t): Promise<CS | undefined> {\n\t\tif (\"createConnState\" in this.#actor.config) {\n\t\t\tconst createConnState = this.#actor.config.createConnState;\n\t\t\tconst ctx = new CreateConnStateContext(this.#actor, request);\n\t\t\treturn await this.#actor.runInTraceSpan(\n\t\t\t\t\"actor.createConnState\",\n\t\t\t\tundefined,\n\t\t\t\t() => {\n\t\t\t\t\tconst dataOrPromise = createConnState!(ctx, params);\n\t\t\t\t\tif (dataOrPromise instanceof Promise) {\n\t\t\t\t\t\treturn deadline(\n\t\t\t\t\t\t\tdataOrPromise,\n\t\t\t\t\t\t\tthis.#actor.config.options.createConnStateTimeout,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn dataOrPromise;\n\t\t\t\t},\n\t\t\t);\n\t\t} else if (\"connState\" in this.#actor.config) {\n\t\t\treturn structuredClone(this.#actor.config.connState);\n\t\t}\n\n\t\tthrow new Error(\n\t\t\t\"Could not create connection state from 'createConnState' or 'connState'\",\n\t\t);\n\t}\n\n\t#callOnConnect(conn: Conn<S, CP, CS, V, I, DB, E, Q>) {\n\t\tconst attributes = {\n\t\t\t\"rivet.conn.id\": conn.id,\n\t\t\t\"rivet.conn.type\": conn[CONN_DRIVER_SYMBOL]?.type,\n\t\t\t\"rivet.conn.hibernatable\": conn.isHibernatable,\n\t\t};\n\t\tconst span = this.#actor.startTraceSpan(\"actor.onConnect\", attributes);\n\n\t\ttry {\n\t\t\tif (this.#actor.config.onConnect) {\n\t\t\t\tconst ctx = new ConnectContext(this.#actor, conn);\n\t\t\t\tconst result = this.#actor.traces.withSpan(span, () =>\n\t\t\t\t\tthis.#actor.config.onConnect!(ctx, conn),\n\t\t\t\t);\n\t\t\t\tthis.#actor.emitTraceEvent(\n\t\t\t\t\t\"connection.connect\",\n\t\t\t\t\tattributes,\n\t\t\t\t\tspan,\n\t\t\t\t);\n\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\tdeadline(\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\tthis.#actor.config.options.onConnectTimeout,\n\t\t\t\t\t)\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\tthis.#actor.endTraceSpan(span, { code: \"OK\" });\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\t\tthis.#actor.endTraceSpan(span, {\n\t\t\t\t\t\t\t\tcode: \"ERROR\",\n\t\t\t\t\t\t\t\tmessage: stringifyError(error),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tthis.#actor.rLog.error({\n\t\t\t\t\t\t\t\tmsg: \"error in `onConnect`, closing socket\",\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tconn?.disconnect(\"`onConnect` failed\");\n\t\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.#actor.emitTraceEvent(\"connection.connect\", attributes, span);\n\t\t\tthis.#actor.endTraceSpan(span, { code: \"OK\" });\n\t\t} catch (error) {\n\t\t\tthis.#actor.endTraceSpan(span, {\n\t\t\t\tcode: \"ERROR\",\n\t\t\t\tmessage: stringifyError(error),\n\t\t\t});\n\t\t\tthis.#actor.rLog.error({\n\t\t\t\tmsg: \"error in `onConnect`\",\n\t\t\t\terror: stringifyError(error),\n\t\t\t});\n\t\t\tconn?.disconnect(\"`onConnect` failed\");\n\t\t}\n\t}\n}\n","import * as cbor from \"cbor-x\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport {\n\tCURRENT_VERSION as CLIENT_PROTOCOL_CURRENT_VERSION,\n\tTO_CLIENT_VERSIONED,\n} from \"@/schemas/client-protocol/versioned\";\nimport {\n\ttype ToClient as ToClientJson,\n\tToClientSchema,\n} from \"@/schemas/client-protocol-zod/mod\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nimport {\n\tCONN_SEND_MESSAGE_SYMBOL,\n\tCONN_SPEAKS_RIVETKIT_SYMBOL,\n\tCONN_STATE_MANAGER_SYMBOL,\n\ttype Conn,\n} from \"../conn/mod\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport * as errors from \"../errors\";\nimport { CachedSerializer } from \"../protocol/serde\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport type { ActorInstance } from \"./mod\";\n\n/**\n * Manages event subscriptions and broadcasting for actor instances.\n * Handles subscription tracking and efficient message distribution to connected clients.\n */\nexport class EventManager<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n> {\n\t#actor: ActorInstance<S, CP, CS, V, I, DB, E, Q>;\n\t#subscriptionIndex = new Map<\n\t\tstring,\n\t\tSet<Conn<S, CP, CS, V, I, DB, E, Q>>\n\t>();\n\n\tconstructor(actor: ActorInstance<S, CP, CS, V, I, DB, E, Q>) {\n\t\tthis.#actor = actor;\n\t}\n\n\t// MARK: - Public API\n\n\t/**\n\t * Adds a subscription for a connection to an event.\n\t *\n\t * @param eventName - The name of the event to subscribe to\n\t * @param connection - The connection subscribing to the event\n\t * @param fromPersist - Whether this subscription is being restored from persistence\n\t */\n\taddSubscription(\n\t\teventName: string,\n\t\tconnection: Conn<S, CP, CS, V, I, DB, E, Q>,\n\t\tfromPersist: boolean,\n\t) {\n\t\t// Check if already subscribed\n\t\tif (connection.subscriptions.has(eventName)) {\n\t\t\tthis.#actor.rLog.debug({\n\t\t\t\tmsg: \"connection already has subscription\",\n\t\t\t\teventName,\n\t\t\t\tconnId: connection.id,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Update connection's subscription list\n\t\tconnection.subscriptions.add(eventName);\n\n\t\t// Update subscription index\n\t\tlet subscribers = this.#subscriptionIndex.get(eventName);\n\t\tif (!subscribers) {\n\t\t\tsubscribers = new Set();\n\t\t\tthis.#subscriptionIndex.set(eventName, subscribers);\n\t\t}\n\t\tsubscribers.add(connection);\n\n\t\t// Persist subscription if not restoring from persistence\n\t\tif (!fromPersist) {\n\t\t\tconnection[CONN_STATE_MANAGER_SYMBOL].addSubscription({\n\t\t\t\teventName,\n\t\t\t});\n\n\t\t\t// Save state immediately\n\t\t\tthis.#actor.stateManager.saveState({ immediate: true });\n\t\t}\n\n\t\tthis.#actor.rLog.debug({\n\t\t\tmsg: \"subscription added\",\n\t\t\teventName,\n\t\t\tconnId: connection.id,\n\t\t\ttotalSubscribers: subscribers.size,\n\t\t});\n\t}\n\n\t/**\n\t * Removes a subscription for a connection from an event.\n\t *\n\t * @param eventName - The name of the event to unsubscribe from\n\t * @param connection - The connection unsubscribing from the event\n\t * @param fromRemoveConn - Whether this is being called as part of connection removal\n\t */\n\tremoveSubscription(\n\t\teventName: string,\n\t\tconnection: Conn<S, CP, CS, V, I, DB, E, Q>,\n\t\tfromRemoveConn: boolean,\n\t) {\n\t\t// Check if subscription exists\n\t\tif (!connection.subscriptions.has(eventName)) {\n\t\t\tthis.#actor.rLog.warn({\n\t\t\t\tmsg: \"connection does not have subscription\",\n\t\t\t\teventName,\n\t\t\t\tconnId: connection.id,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove from connection's subscription list\n\t\tconnection.subscriptions.delete(eventName);\n\n\t\t// Update subscription index\n\t\tconst subscribers = this.#subscriptionIndex.get(eventName);\n\t\tif (subscribers) {\n\t\t\tsubscribers.delete(connection);\n\t\t\tif (subscribers.size === 0) {\n\t\t\t\tthis.#subscriptionIndex.delete(eventName);\n\t\t\t}\n\t\t}\n\n\t\t// Update persistence if not part of connection removal\n\t\tif (!fromRemoveConn) {\n\t\t\t// Remove from persisted subscriptions\n\t\t\tconst removed = connection[\n\t\t\t\tCONN_STATE_MANAGER_SYMBOL\n\t\t\t].removeSubscription({ eventName });\n\t\t\tif (!removed) {\n\t\t\t\tthis.#actor.rLog.warn({\n\t\t\t\t\tmsg: \"subscription does not exist in persist\",\n\t\t\t\t\teventName,\n\t\t\t\t\tconnId: connection.id,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Save state immediately\n\t\t\tthis.#actor.stateManager.saveState({ immediate: true });\n\t\t}\n\n\t\tthis.#actor.rLog.debug({\n\t\t\tmsg: \"subscription removed\",\n\t\t\teventName,\n\t\t\tconnId: connection.id,\n\t\t\tremainingSubscribers: subscribers?.size || 0,\n\t\t});\n\t}\n\n\t/**\n\t * Broadcasts an event to all subscribed connections.\n\t *\n\t * @param name - The name of the event to broadcast\n\t * @param args - The arguments to send with the event\n\t */\n\tbroadcast<Args extends Array<unknown>>(name: string, ...args: Args) {\n\t\tthis.#actor.assertReady();\n\n\t\t// Get subscribers for this event\n\t\tconst subscribers = this.#subscriptionIndex.get(name);\n\t\tif (!subscribers || subscribers.size === 0) {\n\t\t\tthis.#actor.rLog.debug({\n\t\t\t\tmsg: \"no subscribers for event\",\n\t\t\t\teventName: name,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#actor.emitTraceEvent(\"message.broadcast\", {\n\t\t\t\"rivet.event.name\": name,\n\t\t\t\"rivet.broadcast.subscribers\": subscribers.size,\n\t\t});\n\n\t\t// Create serialized message\n\t\tconst eventData = { name, args };\n\t\tconst toClientSerializer = new CachedSerializer(\n\t\t\teventData,\n\t\t\tTO_CLIENT_VERSIONED,\n\t\t\tCLIENT_PROTOCOL_CURRENT_VERSION,\n\t\t\tToClientSchema,\n\t\t\t// JSON: args is the raw value (array of arguments)\n\t\t\t(value): ToClientJson => ({\n\t\t\t\tbody: {\n\t\t\t\t\ttag: \"Event\" as const,\n\t\t\t\t\tval: {\n\t\t\t\t\t\tname: value.name,\n\t\t\t\t\t\targs: value.args,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t\t// BARE/CBOR: args needs to be CBOR-encoded to ArrayBuffer\n\t\t\t(value): protocol.ToClient => ({\n\t\t\t\tbody: {\n\t\t\t\t\ttag: \"Event\" as const,\n\t\t\t\t\tval: {\n\t\t\t\t\t\tname: value.name,\n\t\t\t\t\t\targs: bufferToArrayBuffer(cbor.encode(value.args)),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\t// Send to all subscribers\n\t\tlet sentCount = 0;\n\t\tfor (const connection of subscribers) {\n\t\t\tif (connection[CONN_SPEAKS_RIVETKIT_SYMBOL]) {\n\t\t\t\ttry {\n\t\t\t\t\tconnection[CONN_SEND_MESSAGE_SYMBOL](toClientSerializer);\n\t\t\t\t\tsentCount++;\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Propagate message size errors to the call site so developers\n\t\t\t\t\t// can handle them\n\t\t\t\t\tif (error instanceof errors.OutgoingMessageTooLong) {\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t\t// Log other errors (e.g., closed connections) and continue\n\t\t\t\t\tthis.#actor.rLog.error({\n\t\t\t\t\t\tmsg: \"failed to send event to connection\",\n\t\t\t\t\t\teventName: name,\n\t\t\t\t\t\tconnId: connection.id,\n\t\t\t\t\t\terror:\n\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t\t\t: String(error),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.#actor.rLog.debug({\n\t\t\tmsg: \"event broadcasted\",\n\t\t\teventName: name,\n\t\t\tsubscriberCount: subscribers.size,\n\t\t\tsentCount,\n\t\t});\n\t}\n\n\t/**\n\t * Gets all subscribers for a specific event.\n\t *\n\t * @param eventName - The name of the event\n\t * @returns Set of connections subscribed to the event, or undefined if no subscribers\n\t */\n\tgetSubscribers(\n\t\teventName: string,\n\t): Set<Conn<S, CP, CS, V, I, DB, E, Q>> | undefined {\n\t\treturn this.#subscriptionIndex.get(eventName);\n\t}\n\n\t/**\n\t * Gets all events and their subscriber counts.\n\t *\n\t * @returns Map of event names to subscriber counts\n\t */\n\tgetEventStats(): Map<string, number> {\n\t\tconst stats = new Map<string, number>();\n\t\tfor (const [eventName, subscribers] of this.#subscriptionIndex) {\n\t\t\tstats.set(eventName, subscribers.size);\n\t\t}\n\t\treturn stats;\n\t}\n\n\t/**\n\t * Clears all subscriptions for a connection.\n\t * Used during connection cleanup.\n\t *\n\t * @param connection - The connection to clear subscriptions for\n\t */\n\tclearConnectionSubscriptions(connection: Conn<S, CP, CS, V, I, DB, E, Q>) {\n\t\tfor (const eventName of [...connection.subscriptions.values()]) {\n\t\t\tthis.removeSubscription(eventName, connection, true);\n\t\t}\n\t}\n\n\t/**\n\t * Gets the total number of unique events being subscribed to.\n\t */\n\tget eventCount(): number {\n\t\treturn this.#subscriptionIndex.size;\n\t}\n\n\t/**\n\t * Gets the total number of subscriptions across all events.\n\t */\n\tget totalSubscriptionCount(): number {\n\t\tlet total = 0;\n\t\tfor (const subscribers of this.#subscriptionIndex.values()) {\n\t\t\ttotal += subscribers.size;\n\t\t}\n\t\treturn total;\n\t}\n\n\t/**\n\t * Checks if an event has any subscribers.\n\t *\n\t * @param eventName - The name of the event to check\n\t * @returns True if the event has at least one subscriber\n\t */\n\thasSubscribers(eventName: string): boolean {\n\t\tconst subscribers = this.#subscriptionIndex.get(eventName);\n\t\treturn subscribers !== undefined && subscribers.size > 0;\n\t}\n}\n","/**\n * Persisted data structures for actors.\n *\n * Keep this file in sync with the Connection section of rivetkit-typescript/packages/rivetkit/schemas/actor-persist/\n */\n\nimport * as cbor from \"cbor-x\";\nimport type * as persistSchema from \"@/schemas/actor-persist/mod\";\nimport { bufferToArrayBuffer } from \"@/utils\";\n\nexport type Cbor = ArrayBuffer;\n\n// MARK: Schedule Event\n/** Scheduled event to be executed at a specific timestamp */\nexport interface PersistedScheduleEvent {\n\teventId: string;\n\ttimestamp: number;\n\taction: string;\n\targs?: Cbor;\n}\n\n// MARK: Actor\n/** State object that gets automatically persisted to storage */\nexport interface PersistedActor<S, I> {\n\t/** Input data passed to the actor on initialization */\n\tinput?: I;\n\thasInitialized: boolean;\n\tstate: S;\n\tscheduledEvents: PersistedScheduleEvent[];\n}\n\nexport function convertActorToBarePersisted<S, I>(\n\tpersist: PersistedActor<S, I>,\n): persistSchema.Actor {\n\treturn {\n\t\tinput:\n\t\t\tpersist.input !== undefined\n\t\t\t\t? bufferToArrayBuffer(cbor.encode(persist.input))\n\t\t\t\t: null,\n\t\thasInitialized: persist.hasInitialized,\n\t\tstate: bufferToArrayBuffer(cbor.encode(persist.state)),\n\t\tscheduledEvents: persist.scheduledEvents.map((event) => ({\n\t\t\teventId: event.eventId,\n\t\t\ttimestamp: BigInt(event.timestamp),\n\t\t\taction: event.action,\n\t\t\targs: event.args ?? null,\n\t\t})),\n\t};\n}\n\nexport function convertActorFromBarePersisted<S, I>(\n\tbareData: persistSchema.Actor,\n): PersistedActor<S, I> {\n\treturn {\n\t\tinput: bareData.input\n\t\t\t? cbor.decode(new Uint8Array(bareData.input))\n\t\t\t: undefined,\n\t\thasInitialized: bareData.hasInitialized,\n\t\tstate: cbor.decode(new Uint8Array(bareData.state)),\n\t\tscheduledEvents: bareData.scheduledEvents.map((event) => ({\n\t\t\teventId: event.eventId,\n\t\t\ttimestamp: Number(event.timestamp),\n\t\t\taction: event.action,\n\t\t\targs: event.args ?? undefined,\n\t\t})),\n\t};\n}\n","import * as cbor from \"cbor-x\";\nimport { isCborSerializable } from \"@/common/utils\";\nimport {\n\tCURRENT_VERSION as ACTOR_PERSIST_CURRENT_VERSION,\n\tQUEUE_MESSAGE_VERSIONED,\n\tQUEUE_METADATA_VERSIONED,\n} from \"@/schemas/actor-persist/versioned\";\nimport { promiseWithResolvers } from \"@/utils\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorDriver } from \"../driver\";\nimport * as errors from \"../errors\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport {\n\tdecodeQueueMessageKey,\n\tmakeQueueMessageKey,\n\tqueueMessagesPrefix,\n\tqueueMetadataKey,\n} from \"./keys\";\nimport type { ActorInstance } from \"./mod\";\n\nexport interface QueueMessage {\n\tid: bigint;\n\tname: string;\n\tbody: unknown;\n\tcreatedAt: number;\n}\n\ninterface QueueMetadata {\n\tnextId: bigint;\n\tsize: number;\n}\n\ninterface QueueWaiter {\n\tid: string;\n\tnameSet?: Set<string>;\n\tcount: number;\n\tcompletable: boolean;\n\tresolve: (messages: QueueMessage[]) => void;\n\treject: (error: Error) => void;\n}\n\ninterface MessageListener {\n\tnameSet?: Set<string>;\n\tresolve: () => void;\n\treject: (error: Error) => void;\n\tactorAbortCleanup?: () => void;\n\tsignal?: AbortSignal;\n\tsignalAbortCleanup?: () => void;\n}\n\nconst DEFAULT_METADATA: QueueMetadata = {\n\tnextId: 1n,\n\tsize: 0,\n};\n\nconst QUEUE_METADATA_KEY = queueMetadataKey();\nconst QUEUE_MESSAGES_PREFIX = queueMessagesPrefix();\n\ninterface PendingCompletion {\n\tresolve: (result: {\n\t\tstatus: \"completed\" | \"timedOut\";\n\t\tresponse?: unknown;\n\t}) => void;\n\ttimeoutHandle?: ReturnType<typeof setTimeout>;\n}\n\nexport class QueueManager<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n> {\n\t#actor: ActorInstance<S, CP, CS, V, I, DB, E, Q>;\n\t#driver: ActorDriver;\n\t#waiters = new Map<string, QueueWaiter>();\n\t#metadata: QueueMetadata = { ...DEFAULT_METADATA };\n\t#messageListeners = new Set<MessageListener>();\n\t#pendingCompletions = new Map<string, PendingCompletion>();\n\n\tconstructor(\n\t\tactor: ActorInstance<S, CP, CS, V, I, DB, E, Q>,\n\t\tdriver: ActorDriver,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.#driver = driver;\n\t}\n\n\t/** Returns the current number of messages in the queue. */\n\tget size(): number {\n\t\treturn this.#metadata.size;\n\t}\n\n\t/** Loads queue metadata from storage and initializes internal state. */\n\tasync initialize(): Promise<void> {\n\t\tconst [metadataBuffer] = await this.#driver.kvBatchGet(this.#actor.id, [\n\t\t\tQUEUE_METADATA_KEY,\n\t\t]);\n\t\tif (!metadataBuffer) {\n\t\t\tawait this.#driver.kvBatchPut(this.#actor.id, [\n\t\t\t\t[QUEUE_METADATA_KEY, this.#serializeMetadata()],\n\t\t\t]);\n\t\t\tthis.#actor.inspector.updateQueueSize(this.#metadata.size);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst decoded =\n\t\t\t\tQUEUE_METADATA_VERSIONED.deserializeWithEmbeddedVersion(\n\t\t\t\t\tmetadataBuffer,\n\t\t\t\t);\n\t\t\tthis.#metadata.nextId = decoded.nextId;\n\t\t\tthis.#metadata.size = Number(decoded.size);\n\t\t} catch (error) {\n\t\t\tthis.#actor.rLog.error({\n\t\t\t\tmsg: \"failed to decode queue metadata, rebuilding from messages\",\n\t\t\t\terror,\n\t\t\t});\n\t\t\tawait this.#rebuildMetadata();\n\t\t}\n\t\tthis.#actor.inspector.updateQueueSize(this.#metadata.size);\n\t}\n\n\t/** Adds a message to the queue with the given name and body. */\n\tasync enqueue(name: string, body: unknown): Promise<QueueMessage> {\n\t\tthis.#actor.assertReady();\n\n\t\tconst sizeLimit = this.#actor.config.options.maxQueueSize;\n\t\tif (this.#metadata.size >= sizeLimit) {\n\t\t\tthrow new errors.QueueFull(sizeLimit);\n\t\t}\n\n\t\tlet invalidPath = \"\";\n\t\tif (\n\t\t\t!isCborSerializable(body, (path) => {\n\t\t\t\tinvalidPath = path;\n\t\t\t})\n\t\t) {\n\t\t\tthrow new errors.QueueMessageInvalid(invalidPath);\n\t\t}\n\n\t\tconst createdAt = Date.now();\n\t\tconst bodyCborBuffer = cbor.encode(body);\n\t\tconst encodedMessage =\n\t\t\tQUEUE_MESSAGE_VERSIONED.serializeWithEmbeddedVersion(\n\t\t\t\t{\n\t\t\t\t\tname,\n\t\t\t\t\tbody: new Uint8Array(bodyCborBuffer).buffer as ArrayBuffer,\n\t\t\t\t\tcreatedAt: BigInt(createdAt),\n\t\t\t\t\tfailureCount: null,\n\t\t\t\t\tavailableAt: null,\n\t\t\t\t\tinFlight: null,\n\t\t\t\t\tinFlightAt: null,\n\t\t\t\t},\n\t\t\t\tACTOR_PERSIST_CURRENT_VERSION,\n\t\t\t);\n\t\tconst encodedSize = encodedMessage.byteLength;\n\t\tif (encodedSize > this.#actor.config.options.maxQueueMessageSize) {\n\t\t\tthrow new errors.QueueMessageTooLarge(\n\t\t\t\tencodedSize,\n\t\t\t\tthis.#actor.config.options.maxQueueMessageSize,\n\t\t\t);\n\t\t}\n\n\t\tconst id = this.#metadata.nextId;\n\t\tconst messageKey = makeQueueMessageKey(id);\n\n\t\t// Update metadata before writing so we can batch both writes\n\t\tthis.#metadata.nextId = id + 1n;\n\t\tthis.#metadata.size += 1;\n\t\tconst encodedMetadata = this.#serializeMetadata();\n\n\t\t// Batch write message and metadata together\n\t\tawait this.#driver.kvBatchPut(this.#actor.id, [\n\t\t\t[messageKey, encodedMessage],\n\t\t\t[QUEUE_METADATA_KEY, encodedMetadata],\n\t\t]);\n\n\t\tthis.#actor.inspector.updateQueueSize(this.#metadata.size);\n\n\t\tconst message: QueueMessage = {\n\t\t\tid,\n\t\t\tname,\n\t\t\tbody,\n\t\t\tcreatedAt,\n\t\t};\n\n\t\tthis.#actor.resetSleepTimer();\n\t\tawait this.#maybeResolveWaiters();\n\t\tthis.#notifyMessageListeners(name);\n\n\t\treturn message;\n\t}\n\n\t/**\n\t * Adds a message and waits for completion.\n\t */\n\tasync enqueueAndWait(\n\t\tname: string,\n\t\tbody: unknown,\n\t\ttimeout?: number,\n\t): Promise<{ status: \"completed\" | \"timedOut\"; response?: unknown }> {\n\t\tif (timeout !== undefined && timeout <= 0) {\n\t\t\treturn { status: \"timedOut\" };\n\t\t}\n\n\t\tconst message = await this.enqueue(name, body);\n\t\tconst messageId = message.id.toString();\n\t\tconst { promise, resolve } = promiseWithResolvers<{\n\t\t\tstatus: \"completed\" | \"timedOut\";\n\t\t\tresponse?: unknown;\n\t\t}>(() => {});\n\n\t\tconst pending: PendingCompletion = { resolve };\n\t\tif (timeout !== undefined) {\n\t\t\tpending.timeoutHandle = setTimeout(() => {\n\t\t\t\tthis.#pendingCompletions.delete(messageId);\n\t\t\t\tresolve({ status: \"timedOut\" });\n\t\t\t}, timeout);\n\t\t}\n\t\tthis.#pendingCompletions.set(messageId, pending);\n\n\t\treturn await promise;\n\t}\n\n\tasync completeMessage(\n\t\tmessage: QueueMessage,\n\t\tresponse?: unknown,\n\t): Promise<void> {\n\t\tawait this.completeMessageById(message.id, response);\n\t}\n\n\tasync completeMessageById(\n\t\tmessageId: bigint,\n\t\tresponse?: unknown,\n\t): Promise<void> {\n\t\tconst messageIdString = messageId.toString();\n\t\tconst pending = this.#pendingCompletions.get(messageIdString);\n\t\tif (pending) {\n\t\t\tif (pending.timeoutHandle) {\n\t\t\t\tclearTimeout(pending.timeoutHandle);\n\t\t\t}\n\t\t\tthis.#pendingCompletions.delete(messageIdString);\n\t\t\tpending.resolve({ status: \"completed\", response });\n\t\t}\n\n\t\tawait this.deleteMessagesById([messageId]);\n\t}\n\n\t/** Receives messages from the queue matching the given names. Waits until messages are available or timeout is reached. */\n\tasync receive(\n\t\tnames: string[] | undefined,\n\t\tcount: number,\n\t\ttimeout?: number,\n\t\tabortSignal?: AbortSignal,\n\t\tcompletable = false,\n\t): Promise<QueueMessage[]> {\n\t\tthis.#actor.assertReady();\n\t\tconst limitedCount = Math.max(1, count);\n\t\tconst nameSet = names && names.length > 0 ? new Set(names) : undefined;\n\n\t\tconst immediate = await this.#drainMessages(\n\t\t\tnameSet,\n\t\t\tlimitedCount,\n\t\t\tcompletable,\n\t\t);\n\t\tif (immediate.length > 0) {\n\t\t\treturn immediate;\n\t\t}\n\t\tif (timeout === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst { promise, resolve, reject } = promiseWithResolvers<\n\t\t\tQueueMessage[]\n\t\t>(() => {});\n\t\tconst waiterId = crypto.randomUUID();\n\t\tlet timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n\t\tlet cleanedUp = false;\n\t\tlet actorAbortCleanup: (() => void) | undefined;\n\t\tlet signalAbortCleanup: (() => void) | undefined;\n\n\t\tconst cleanup = () => {\n\t\t\tif (cleanedUp) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcleanedUp = true;\n\t\t\tthis.#waiters.delete(waiterId);\n\t\t\tif (timeoutHandle) {\n\t\t\t\tclearTimeout(timeoutHandle);\n\t\t\t\ttimeoutHandle = undefined;\n\t\t\t}\n\t\t\tactorAbortCleanup?.();\n\t\t\tsignalAbortCleanup?.();\n\t\t\tthis.#actor.endQueueWait();\n\t\t};\n\t\tconst resolveWaiter = (messages: QueueMessage[]) => {\n\t\t\tcleanup();\n\t\t\tresolve(messages);\n\t\t};\n\t\tconst rejectWaiter = (error: Error) => {\n\t\t\tcleanup();\n\t\t\treject(error);\n\t\t};\n\n\t\tconst waiter: QueueWaiter = {\n\t\t\tid: waiterId,\n\t\t\tnameSet,\n\t\t\tcount: limitedCount,\n\t\t\tcompletable,\n\t\t\tresolve: resolveWaiter,\n\t\t\treject: rejectWaiter,\n\t\t};\n\n\t\tthis.#actor.beginQueueWait();\n\n\t\tif (timeout !== undefined) {\n\t\t\ttimeoutHandle = setTimeout(() => {\n\t\t\t\tresolveWaiter([]);\n\t\t\t}, timeout);\n\t\t}\n\n\t\tconst onAbort = () => {\n\t\t\trejectWaiter(new errors.ActorAborted());\n\t\t};\n\t\tconst onStop = () => {\n\t\t\trejectWaiter(new errors.ActorAborted());\n\t\t};\n\t\tconst actorAbortSignal = this.#actor.abortSignal;\n\t\tif (actorAbortSignal.aborted) {\n\t\t\tonStop();\n\t\t\treturn promise;\n\t\t}\n\t\tactorAbortSignal.addEventListener(\"abort\", onStop, { once: true });\n\t\tactorAbortCleanup = () =>\n\t\t\tactorAbortSignal.removeEventListener(\"abort\", onStop);\n\n\t\tif (abortSignal) {\n\t\t\tif (abortSignal.aborted) {\n\t\t\t\tonAbort();\n\t\t\t\treturn promise;\n\t\t\t}\n\t\t\tabortSignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\tsignalAbortCleanup = () =>\n\t\t\t\tabortSignal.removeEventListener(\"abort\", onAbort);\n\t\t}\n\n\t\tthis.#waiters.set(waiterId, waiter);\n\t\treturn promise;\n\t}\n\n\tasync waitForNames(\n\t\tnames: readonly string[] | undefined,\n\t\tabortSignal?: AbortSignal,\n\t): Promise<void> {\n\t\tconst nameSet = names && names.length > 0 ? new Set(names) : undefined;\n\t\tconst existing = await this.#loadQueueMessages();\n\t\tif (nameSet) {\n\t\t\tif (existing.some((message) => nameSet.has(message.name))) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else if (existing.length > 0) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn await new Promise<void>((resolve, reject) => {\n\t\t\tthis.#actor.beginQueueWait();\n\t\t\tconst listener: MessageListener = {\n\t\t\t\tnameSet,\n\t\t\t\tresolve: () => {\n\t\t\t\t\tthis.#removeMessageListener(listener);\n\t\t\t\t\tthis.#actor.endQueueWait();\n\t\t\t\t\tresolve();\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tthis.#removeMessageListener(listener);\n\t\t\t\t\tthis.#actor.endQueueWait();\n\t\t\t\t\treject(error);\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst actorAbortSignal = this.#actor.abortSignal;\n\t\t\tconst onActorAbort = () =>\n\t\t\t\tlistener.reject(new errors.ActorAborted());\n\t\t\tif (actorAbortSignal.aborted) {\n\t\t\t\tonActorAbort();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tactorAbortSignal.addEventListener(\"abort\", onActorAbort, {\n\t\t\t\tonce: true,\n\t\t\t});\n\t\t\tlistener.actorAbortCleanup = () =>\n\t\t\t\tactorAbortSignal.removeEventListener(\"abort\", onActorAbort);\n\n\t\t\tif (abortSignal) {\n\t\t\t\tconst onAbort = () =>\n\t\t\t\t\tlistener.reject(new errors.ActorAborted());\n\t\t\t\tif (abortSignal.aborted) {\n\t\t\t\t\tonAbort();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tabortSignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t\tlistener.signalAbortCleanup = () =>\n\t\t\t\t\tabortSignal.removeEventListener(\"abort\", onAbort);\n\t\t\t}\n\n\t\t\tthis.#messageListeners.add(listener);\n\t\t});\n\t}\n\n\t/** Returns all messages currently in the queue without removing them. */\n\tasync getMessages(): Promise<QueueMessage[]> {\n\t\treturn await this.#loadQueueMessages();\n\t}\n\n\t/** Deletes messages matching the provided IDs. Returns the IDs that were removed. */\n\tasync deleteMessagesById(ids: bigint[]): Promise<bigint[]> {\n\t\tif (ids.length === 0) {\n\t\t\treturn [];\n\t\t}\n\t\tconst idSet = new Set(ids.map((id) => id.toString()));\n\t\tconst entries = await this.#loadQueueMessages();\n\t\tconst toRemove = entries.filter((entry) =>\n\t\t\tidSet.has(entry.id.toString()),\n\t\t);\n\t\tif (toRemove.length === 0) {\n\t\t\treturn [];\n\t\t}\n\t\tawait this.#removeMessages(toRemove);\n\t\treturn toRemove.map((entry) => entry.id);\n\t}\n\n\tasync #drainMessages(\n\t\tnameSet: Set<string> | undefined,\n\t\tcount: number,\n\t\tcompletable: boolean,\n\t): Promise<QueueMessage[]> {\n\t\tif (this.#metadata.size === 0) {\n\t\t\treturn [];\n\t\t}\n\t\tconst entries = await this.#loadQueueMessages();\n\t\tconst matched = nameSet\n\t\t\t? entries.filter((entry) => nameSet.has(entry.name))\n\t\t\t: entries;\n\t\tif (matched.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst selected = matched.slice(0, count);\n\t\tif (!completable) {\n\t\t\tawait this.#removeMessages(selected);\n\t\t}\n\t\tconst now = Date.now();\n\t\tfor (const message of selected) {\n\t\t\tthis.#actor.emitTraceEvent(\"queue.message.receive\", {\n\t\t\t\t\"rivet.queue.name\": message.name,\n\t\t\t\t\"rivet.queue.message_id\": message.id.toString(),\n\t\t\t\t\"rivet.queue.created_at_ms\": message.createdAt,\n\t\t\t\t\"rivet.queue.latency_ms\": now - message.createdAt,\n\t\t\t});\n\t\t}\n\t\treturn selected;\n\t}\n\n\tasync #loadQueueMessages(): Promise<QueueMessage[]> {\n\t\tconst entries = await this.#driver.kvListPrefix(\n\t\t\tthis.#actor.id,\n\t\t\tQUEUE_MESSAGES_PREFIX,\n\t\t);\n\t\tconst decoded: QueueMessage[] = [];\n\t\tfor (const [key, value] of entries) {\n\t\t\ttry {\n\t\t\t\tconst messageId = decodeQueueMessageKey(key);\n\t\t\t\tconst decodedPayload =\n\t\t\t\t\tQUEUE_MESSAGE_VERSIONED.deserializeWithEmbeddedVersion(\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t);\n\t\t\t\tconst body = cbor.decode(new Uint8Array(decodedPayload.body));\n\t\t\t\tdecoded.push({\n\t\t\t\t\tid: messageId,\n\t\t\t\t\tname: decodedPayload.name,\n\t\t\t\t\tbody,\n\t\t\t\t\tcreatedAt: Number(decodedPayload.createdAt),\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tthis.#actor.rLog.error({\n\t\t\t\t\tmsg: \"failed to decode queue message\",\n\t\t\t\t\terror,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tdecoded.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));\n\t\tif (this.#metadata.size !== decoded.length) {\n\t\t\tthis.#metadata.size = decoded.length;\n\t\t\tthis.#actor.inspector.updateQueueSize(this.#metadata.size);\n\t\t}\n\t\treturn decoded;\n\t}\n\n\t#removeMessageListener(listener: MessageListener): void {\n\t\tif (this.#messageListeners.delete(listener)) {\n\t\t\tlistener.actorAbortCleanup?.();\n\t\t\tlistener.signalAbortCleanup?.();\n\t\t}\n\t}\n\n\t#notifyMessageListeners(name: string): void {\n\t\tif (this.#messageListeners.size === 0) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const listener of [...this.#messageListeners]) {\n\t\t\tif (listener.nameSet && !listener.nameSet.has(name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.#removeMessageListener(listener);\n\t\t\tlistener.resolve();\n\t\t}\n\t}\n\n\tasync #removeMessages(messages: QueueMessage[]): Promise<void> {\n\t\tif (messages.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst keys = messages.map((message) => makeQueueMessageKey(message.id));\n\n\t\t// Update metadata\n\t\tthis.#metadata.size = Math.max(\n\t\t\t0,\n\t\t\tthis.#metadata.size - messages.length,\n\t\t);\n\n\t\t// Delete messages and update metadata\n\t\t// Note: kvBatchDelete doesn't support mixed operations, so we do two calls\n\t\tawait this.#driver.kvBatchDelete(this.#actor.id, keys);\n\t\tawait this.#driver.kvBatchPut(this.#actor.id, [\n\t\t\t[QUEUE_METADATA_KEY, this.#serializeMetadata()],\n\t\t]);\n\n\t\tthis.#actor.inspector.updateQueueSize(this.#metadata.size);\n\t}\n\n\tasync #maybeResolveWaiters() {\n\t\tif (this.#waiters.size === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst pending = [...this.#waiters.values()];\n\t\tfor (const waiter of pending) {\n\t\t\tconst messages = await this.#drainMessages(\n\t\t\t\twaiter.nameSet,\n\t\t\t\twaiter.count,\n\t\t\t\twaiter.completable,\n\t\t\t);\n\t\t\tif (messages.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.#waiters.delete(waiter.id);\n\t\t\twaiter.resolve(messages);\n\t\t}\n\t}\n\n\t/** Rebuilds metadata by scanning existing queue messages. Used when metadata is corrupted. */\n\tasync #rebuildMetadata(): Promise<void> {\n\t\tconst entries = await this.#driver.kvListPrefix(\n\t\t\tthis.#actor.id,\n\t\t\tQUEUE_MESSAGES_PREFIX,\n\t\t);\n\n\t\tlet maxId = 0n;\n\t\tfor (const [key] of entries) {\n\t\t\ttry {\n\t\t\t\tconst messageId = decodeQueueMessageKey(key);\n\t\t\t\tif (messageId > maxId) {\n\t\t\t\t\tmaxId = messageId;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Skip malformed keys\n\t\t\t}\n\t\t}\n\n\t\tthis.#metadata.nextId = maxId + 1n;\n\t\tthis.#metadata.size = entries.length;\n\n\t\tawait this.#driver.kvBatchPut(this.#actor.id, [\n\t\t\t[QUEUE_METADATA_KEY, this.#serializeMetadata()],\n\t\t]);\n\t\tthis.#actor.inspector.updateQueueSize(this.#metadata.size);\n\t}\n\n\t#serializeMetadata(): Uint8Array {\n\t\treturn QUEUE_METADATA_VERSIONED.serializeWithEmbeddedVersion(\n\t\t\t{\n\t\t\t\tnextId: this.#metadata.nextId,\n\t\t\t\tsize: this.#metadata.size,\n\t\t\t},\n\t\t\tACTOR_PERSIST_CURRENT_VERSION,\n\t\t);\n\t}\n}\n","import * as cbor from \"cbor-x\";\nimport {\n\tbufferToArrayBuffer,\n\tSinglePromiseQueue,\n\tstringifyError,\n} from \"@/utils\";\nimport type { AnyDatabaseProvider } from \"../database\";\nimport type { ActorDriver } from \"../driver\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport type { ActorInstance } from \"./mod\";\nimport type { PersistedScheduleEvent } from \"./persisted\";\n\n/**\n * Manages scheduled events and alarms for actor instances.\n * Handles event scheduling, alarm triggers, and automatic event execution.\n */\nexport class ScheduleManager<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n> {\n\t#actor: ActorInstance<S, CP, CS, V, I, DB, E, Q>;\n\t#actorDriver: ActorDriver;\n\t#alarmWriteQueue = new SinglePromiseQueue();\n\t#config: any; // ActorConfig type\n\t#persist: any; // Reference to PersistedActor\n\n\tconstructor(\n\t\tactor: ActorInstance<S, CP, CS, V, I, DB, E, Q>,\n\t\tactorDriver: ActorDriver,\n\t\tconfig: any,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.#actorDriver = actorDriver;\n\t\tthis.#config = config;\n\t}\n\n\t// MARK: - Public API\n\n\t/**\n\t * Sets the persist object reference.\n\t * Called after StateManager initializes the persist proxy.\n\t */\n\tsetPersist(persist: any) {\n\t\tthis.#persist = persist;\n\t}\n\n\t/**\n\t * Schedules an event to be executed at a specific timestamp.\n\t *\n\t * @param timestamp - Unix timestamp in milliseconds when the event should fire\n\t * @param action - The name of the action to execute\n\t * @param args - Arguments to pass to the action\n\t */\n\tasync scheduleEvent(\n\t\ttimestamp: number,\n\t\taction: string,\n\t\targs: unknown[],\n\t): Promise<void> {\n\t\tconst newEvent: PersistedScheduleEvent = {\n\t\t\teventId: crypto.randomUUID(),\n\t\t\ttimestamp,\n\t\t\taction,\n\t\t\targs: bufferToArrayBuffer(cbor.encode(args)),\n\t\t};\n\n\t\tthis.#actor.emitTraceEvent(\"schedule.created\", {\n\t\t\t\"rivet.schedule.event_id\": newEvent.eventId,\n\t\t\t\"rivet.schedule.action\": newEvent.action,\n\t\t\t\"rivet.schedule.timestamp_ms\": newEvent.timestamp,\n\t\t});\n\n\t\tawait this.#scheduleEventInner(newEvent);\n\t}\n\n\t/**\n\t * Triggers any pending alarms that are due.\n\t * This method is idempotent and safe to call multiple times.\n\t */\n\tasync onAlarm(): Promise<void> {\n\t\tconst now = Date.now();\n\t\tthis.#actor.log.debug({\n\t\t\tmsg: \"alarm triggered\",\n\t\t\tnow,\n\t\t\tevents: this.#persist?.scheduledEvents?.length || 0,\n\t\t});\n\n\t\tif (!this.#persist?.scheduledEvents) {\n\t\t\tthis.#actor.rLog.debug({ msg: \"no scheduled events\" });\n\t\t\treturn;\n\t\t}\n\n\t\t// Find events that are due\n\t\tconst dueIndex = this.#persist.scheduledEvents.findIndex(\n\t\t\t(x: PersistedScheduleEvent) => x.timestamp <= now,\n\t\t);\n\n\t\tif (dueIndex === -1) {\n\t\t\t// No events are due yet\n\t\t\tthis.#actor.rLog.debug({ msg: \"no events are due yet\" });\n\n\t\t\t// Reschedule alarm for next event if any exist\n\t\t\tif (this.#persist.scheduledEvents.length > 0) {\n\t\t\t\tconst nextTs = this.#persist.scheduledEvents[0].timestamp;\n\t\t\t\tthis.#actor.log.debug({\n\t\t\t\t\tmsg: \"alarm fired early, rescheduling for next event\",\n\t\t\t\t\tnow,\n\t\t\t\t\tnextTs,\n\t\t\t\t\tdelta: nextTs - now,\n\t\t\t\t});\n\t\t\t\tawait this.#queueSetAlarm(nextTs);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove and process due events\n\t\tconst dueEvents = this.#persist.scheduledEvents.splice(0, dueIndex + 1);\n\t\tthis.#actor.log.debug({\n\t\t\tmsg: \"running events\",\n\t\t\tcount: dueEvents.length,\n\t\t});\n\n\t\t// Schedule next alarm if more events remain\n\t\tif (this.#persist.scheduledEvents.length > 0) {\n\t\t\tconst nextTs = this.#persist.scheduledEvents[0].timestamp;\n\t\t\tthis.#actor.log.info({\n\t\t\t\tmsg: \"setting next alarm\",\n\t\t\t\tnextTs,\n\t\t\t\tremainingEvents: this.#persist.scheduledEvents.length,\n\t\t\t});\n\t\t\tawait this.#queueSetAlarm(nextTs);\n\t\t}\n\n\t\t// Execute due events\n\t\tawait this.#executeDueEvents(dueEvents);\n\t}\n\n\t/**\n\t * Initializes alarms on actor startup.\n\t * Sets the alarm for the next scheduled event if any exist.\n\t */\n\tasync initializeAlarms(): Promise<void> {\n\t\tif (this.#persist?.scheduledEvents?.length > 0) {\n\t\t\tawait this.#queueSetAlarm(\n\t\t\t\tthis.#persist.scheduledEvents[0].timestamp,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Waits for any pending alarm write operations to complete.\n\t */\n\tasync waitForPendingAlarmWrites(): Promise<void> {\n\t\tif (this.#alarmWriteQueue.runningDrainLoop) {\n\t\t\tawait this.#alarmWriteQueue.runningDrainLoop;\n\t\t}\n\t}\n\n\t/**\n\t * Gets statistics about scheduled events.\n\t */\n\tgetScheduleStats(): {\n\t\ttotalEvents: number;\n\t\tnextEventTime: number | null;\n\t\toverdueCount: number;\n\t} {\n\t\tif (!this.#persist?.scheduledEvents) {\n\t\t\treturn {\n\t\t\t\ttotalEvents: 0,\n\t\t\t\tnextEventTime: null,\n\t\t\t\toverdueCount: 0,\n\t\t\t};\n\t\t}\n\n\t\tconst now = Date.now();\n\t\tconst events = this.#persist.scheduledEvents;\n\n\t\treturn {\n\t\t\ttotalEvents: events.length,\n\t\t\tnextEventTime: events.length > 0 ? events[0].timestamp : null,\n\t\t\toverdueCount: events.filter(\n\t\t\t\t(e: PersistedScheduleEvent) => e.timestamp <= now,\n\t\t\t).length,\n\t\t};\n\t}\n\n\t/**\n\t * Cancels a scheduled event by its ID.\n\t *\n\t * @param eventId - The ID of the event to cancel\n\t * @returns True if the event was found and cancelled\n\t */\n\tasync cancelEvent(eventId: string): Promise<boolean> {\n\t\tif (!this.#persist?.scheduledEvents) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst index = this.#persist.scheduledEvents.findIndex(\n\t\t\t(e: PersistedScheduleEvent) => e.eventId === eventId,\n\t\t);\n\n\t\tif (index === -1) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Remove the event\n\t\tconst wasFirst = index === 0;\n\t\tthis.#persist.scheduledEvents.splice(index, 1);\n\n\t\t// If we removed the first event, update the alarm\n\t\tif (wasFirst && this.#persist.scheduledEvents.length > 0) {\n\t\t\tawait this.#queueSetAlarm(\n\t\t\t\tthis.#persist.scheduledEvents[0].timestamp,\n\t\t\t);\n\t\t}\n\n\t\tthis.#actor.log.info({\n\t\t\tmsg: \"cancelled scheduled event\",\n\t\t\teventId,\n\t\t\tremainingEvents: this.#persist.scheduledEvents.length,\n\t\t});\n\n\t\treturn true;\n\t}\n\n\t// MARK: - Private Helpers\n\n\tasync #scheduleEventInner(newEvent: PersistedScheduleEvent): Promise<void> {\n\t\tthis.#actor.log.info({\n\t\t\tmsg: \"scheduling event\",\n\t\t\teventId: newEvent.eventId,\n\t\t\ttimestamp: newEvent.timestamp,\n\t\t\taction: newEvent.action,\n\t\t});\n\n\t\tif (!this.#persist?.scheduledEvents) {\n\t\t\tthrow new Error(\"Persist not initialized\");\n\t\t}\n\n\t\t// Find insertion point (events are sorted by timestamp)\n\t\tconst insertIndex = this.#persist.scheduledEvents.findIndex(\n\t\t\t(x: PersistedScheduleEvent) => x.timestamp > newEvent.timestamp,\n\t\t);\n\n\t\tif (insertIndex === -1) {\n\t\t\t// Add to end\n\t\t\tthis.#persist.scheduledEvents.push(newEvent);\n\t\t} else {\n\t\t\t// Insert at correct position\n\t\t\tthis.#persist.scheduledEvents.splice(insertIndex, 0, newEvent);\n\t\t}\n\n\t\t// Update alarm if this is the newest event\n\t\tif (insertIndex === 0 || this.#persist.scheduledEvents.length === 1) {\n\t\t\tthis.#actor.log.info({\n\t\t\t\tmsg: \"setting alarm for new event\",\n\t\t\t\ttimestamp: newEvent.timestamp,\n\t\t\t\teventCount: this.#persist.scheduledEvents.length,\n\t\t\t});\n\t\t\tawait this.#queueSetAlarm(newEvent.timestamp);\n\t\t}\n\t}\n\n\tasync #executeDueEvents(events: PersistedScheduleEvent[]): Promise<void> {\n\t\tfor (const event of events) {\n\t\t\tconst span = this.#actor.startTraceSpan(\n\t\t\t\t`actor.action.${event.action}`,\n\t\t\t\t{\n\t\t\t\t\t\"rivet.action.name\": event.action,\n\t\t\t\t\t\"rivet.action.scheduled\": true,\n\t\t\t\t\t\"rivet.schedule.event_id\": event.eventId,\n\t\t\t\t\t\"rivet.schedule.timestamp_ms\": event.timestamp,\n\t\t\t\t},\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tthis.#actor.emitTraceEvent(\n\t\t\t\t\t\"schedule.triggered\",\n\t\t\t\t\t{\n\t\t\t\t\t\t\"rivet.schedule.event_id\": event.eventId,\n\t\t\t\t\t\t\"rivet.schedule.action\": event.action,\n\t\t\t\t\t\t\"rivet.schedule.timestamp_ms\": event.timestamp,\n\t\t\t\t\t},\n\t\t\t\t\tspan,\n\t\t\t\t);\n\t\t\t\tthis.#actor.log.info({\n\t\t\t\t\tmsg: \"executing scheduled event\",\n\t\t\t\t\teventId: event.eventId,\n\t\t\t\t\ttimestamp: event.timestamp,\n\t\t\t\t\taction: event.action,\n\t\t\t\t});\n\n\t\t\t\t// Look up the action function\n\t\t\t\tconst actions = this.#config.actions ?? {};\n\t\t\t\tconst fn = actions[event.action];\n\n\t\t\t\tif (!fn) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Missing action for scheduled event: ${event.action}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (typeof fn !== \"function\") {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Scheduled event action ${event.action} is not a function (got ${typeof fn})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Decode arguments and execute\n\t\t\t\tconst args = event.args\n\t\t\t\t\t? cbor.decode(new Uint8Array(event.args))\n\t\t\t\t\t: [];\n\n\t\t\t\tconst result = this.#actor.traces.withSpan(span, () =>\n\t\t\t\t\tfn.call(undefined, this.#actor.actorContext, ...args),\n\t\t\t\t);\n\n\t\t\t\t// Handle async actions\n\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\tawait result;\n\t\t\t\t}\n\n\t\t\t\tthis.#actor.endTraceSpan(span, { code: \"OK\" });\n\t\t\t\tthis.#actor.log.debug({\n\t\t\t\t\tmsg: \"scheduled event completed\",\n\t\t\t\t\teventId: event.eventId,\n\t\t\t\t\taction: event.action,\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tthis.#actor.traces.setAttributes(span, {\n\t\t\t\t\t\"error.message\": stringifyError(error),\n\t\t\t\t\t\"error.type\":\n\t\t\t\t\t\terror instanceof Error ? error.name : typeof error,\n\t\t\t\t});\n\t\t\t\tthis.#actor.endTraceSpan(span, {\n\t\t\t\t\tcode: \"ERROR\",\n\t\t\t\t\tmessage: stringifyError(error),\n\t\t\t\t});\n\t\t\t\tthis.#actor.log.error({\n\t\t\t\t\tmsg: \"error executing scheduled event\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\teventId: event.eventId,\n\t\t\t\t\ttimestamp: event.timestamp,\n\t\t\t\t\taction: event.action,\n\t\t\t\t});\n\n\t\t\t\t// Continue processing other events even if one fails\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #queueSetAlarm(timestamp: number): Promise<void> {\n\t\tawait this.#alarmWriteQueue.enqueue(async () => {\n\t\t\tawait this.#actorDriver.setAlarm(this.#actor, timestamp);\n\t\t});\n\t}\n\n\t/**\n\t * Gets the next scheduled event, if any.\n\t */\n\tgetNextEvent(): PersistedScheduleEvent | null {\n\t\tif (\n\t\t\t!this.#persist?.scheduledEvents ||\n\t\t\tthis.#persist.scheduledEvents.length === 0\n\t\t) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.#persist.scheduledEvents[0];\n\t}\n\n\t/**\n\t * Gets all scheduled events.\n\t */\n\tgetAllEvents(): PersistedScheduleEvent[] {\n\t\treturn this.#persist?.scheduledEvents || [];\n\t}\n\n\t/**\n\t * Clears all scheduled events.\n\t * Use with caution - this removes all pending scheduled events.\n\t */\n\tclearAllEvents(): void {\n\t\tif (this.#persist?.scheduledEvents) {\n\t\t\tthis.#persist.scheduledEvents = [];\n\t\t\tthis.#actor.log.warn({ msg: \"cleared all scheduled events\" });\n\t\t}\n\t}\n}\n","import { idToStr } from \"@rivetkit/engine-runner\";\nimport onChange from \"@rivetkit/on-change\";\nimport { isCborSerializable, stringifyError } from \"@/common/utils\";\nimport {\n\tCURRENT_VERSION as ACTOR_PERSIST_CURRENT_VERSION,\n\tACTOR_VERSIONED,\n\tCONN_VERSIONED,\n} from \"@/schemas/actor-persist/versioned\";\nimport { promiseWithResolvers, SinglePromiseQueue } from \"@/utils\";\nimport { loggerWithoutContext } from \"@/actor/log\";\nimport { type AnyConn, CONN_STATE_MANAGER_SYMBOL } from \"../conn/mod\";\nimport { convertConnToBarePersistedConn } from \"../conn/persisted\";\nimport type { ActorDriver } from \"../driver\";\nimport * as errors from \"../errors\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"../schema\";\nimport { isConnStatePath, isStatePath } from \"../utils\";\nimport { KEYS, makeConnKey } from \"./keys\";\nimport type { ActorInstance } from \"./mod\";\nimport { convertActorToBarePersisted, type PersistedActor } from \"./persisted\";\n\nexport interface SaveStateOptions {\n\t/**\n\t * Forces the state to be saved immediately. This function will return when the state has saved successfully.\n\t */\n\timmediate?: boolean;\n\t/** Bypass ready check for stopping. */\n\tallowStoppingState?: boolean;\n\t/**\n\t * Maximum time in milliseconds to wait before forcing a save.\n\t *\n\t * If a save is already scheduled to occur later than this deadline, it will be rescheduled earlier.\n\t */\n\tmaxWait?: number;\n}\n\n/**\n * Manages actor state persistence, proxying, and synchronization.\n * Handles automatic state change detection and throttled persistence to KV storage.\n */\nexport class StateManager<\n\tS,\n\tCP,\n\tCS,\n\tI,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n> {\n\t#actor: ActorInstance<S, CP, CS, any, I, any, E, Q>;\n\t#actorDriver: ActorDriver;\n\n\t// State tracking\n\t#persist!: PersistedActor<S, I>;\n\t#persistRaw!: PersistedActor<S, I>;\n\t#persistChanged = false;\n\t#isInOnStateChange = false;\n\n\t// Save management\n\t#persistWriteQueue = new SinglePromiseQueue();\n\t#lastSaveTime = 0;\n\t#pendingSaveTimeout?: NodeJS.Timeout;\n\t#pendingSaveScheduledTimestamp?: number;\n\t#onPersistSavedPromise?: ReturnType<typeof promiseWithResolvers<void>>;\n\n\t// Configuration\n\t#config: any; // ActorConfig type\n\t#stateSaveInterval: number;\n\n\tconstructor(\n\t\tactor: ActorInstance<S, CP, CS, any, I, any, E, Q>,\n\t\tactorDriver: ActorDriver,\n\t\tconfig: any,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.#actorDriver = actorDriver;\n\t\tthis.#config = config;\n\t\tthis.#stateSaveInterval = config.options.stateSaveInterval || 100;\n\t}\n\n\t// MARK: - Public API\n\n\tget persist(): PersistedActor<S, I> {\n\t\treturn this.#persist;\n\t}\n\n\tget persistRaw(): PersistedActor<S, I> {\n\t\treturn this.#persistRaw;\n\t}\n\n\tget persistChanged(): boolean {\n\t\treturn this.#persistChanged;\n\t}\n\n\tget state(): S {\n\t\tthis.#validateStateEnabled();\n\t\treturn this.#persist.state;\n\t}\n\n\tset state(value: S) {\n\t\tthis.#validateStateEnabled();\n\t\tthis.#persist.state = value;\n\t}\n\n\tget stateEnabled(): boolean {\n\t\treturn \"createState\" in this.#config || \"state\" in this.#config;\n\t}\n\n\t// MARK: - Initialization\n\n\t/**\n\t * Initializes state from persisted data or creates new state.\n\t */\n\tasync initializeState(persistData: PersistedActor<S, I>): Promise<void> {\n\t\tif (!persistData.hasInitialized) {\n\t\t\t// Create initial state\n\t\t\tlet stateData: unknown;\n\t\t\tif (this.stateEnabled) {\n\t\t\t\tthis.#actor.rLog.info({ msg: \"actor state initializing\" });\n\n\t\t\t\tif (\"createState\" in this.#config) {\n\t\t\t\t\tstateData = await this.#actor.runInTraceSpan(\n\t\t\t\t\t\t\"actor.createState\",\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\tthis.#config.createState!(\n\t\t\t\t\t\t\t\tthis.#actor.actorContext,\n\t\t\t\t\t\t\t\tpersistData.input!,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} else if (\"state\" in this.#config) {\n\t\t\t\t\tstateData = structuredClone(this.#config.state);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Both 'createState' or 'state' were not defined\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.#actor.rLog.debug({ msg: \"state not enabled\" });\n\t\t\t}\n\n\t\t\t// Update persisted data\n\t\t\tpersistData.state = stateData as S;\n\t\t\tpersistData.hasInitialized = true;\n\n\t\t\t// Save initial state\n\t\t\t//\n\t\t\t// We don't use #savePersistInner because the actor is not fully\n\t\t\t// initialized yet\n\t\t\tconst bareData = convertActorToBarePersisted<S, I>(persistData);\n\t\t\tawait this.#actorDriver.kvBatchPut(this.#actor.id, [\n\t\t\t\t[\n\t\t\t\t\tKEYS.PERSIST_DATA,\n\t\t\t\t\tACTOR_VERSIONED.serializeWithEmbeddedVersion(\n\t\t\t\t\t\tbareData,\n\t\t\t\t\t\tACTOR_PERSIST_CURRENT_VERSION,\n\t\t\t\t\t),\n\t\t\t\t],\n\t\t\t]);\n\t\t}\n\n\t\t// Initialize proxy\n\t\tthis.initPersistProxy(persistData);\n\t}\n\n\t/**\n\t * Creates proxy for persist object that handles automatic state change detection.\n\t */\n\tinitPersistProxy(target: PersistedActor<S, I>) {\n\t\t// Set raw persist object\n\t\tthis.#persistRaw = target;\n\n\t\t// Validate serializability\n\t\tif (target === null || typeof target !== \"object\") {\n\t\t\tlet invalidPath = \"\";\n\t\t\tif (\n\t\t\t\t!isCborSerializable(\n\t\t\t\t\ttarget,\n\t\t\t\t\t(path) => {\n\t\t\t\t\t\tinvalidPath = path;\n\t\t\t\t\t},\n\t\t\t\t\t\"\",\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tthrow new errors.InvalidStateType({ path: invalidPath });\n\t\t\t}\n\t\t\treturn target;\n\t\t}\n\n\t\t// Unsubscribe from old state\n\t\tif (this.#persist) {\n\t\t\tonChange.unsubscribe(this.#persist);\n\t\t}\n\n\t\t// Listen for changes to automatically write state\n\t\tthis.#persist = onChange(\n\t\t\ttarget,\n\t\t\t(\n\t\t\t\tpath: string,\n\t\t\t\tvalue: any,\n\t\t\t\t_previousValue: any,\n\t\t\t\t_applyData: any,\n\t\t\t) => {\n\t\t\t\tthis.#handleStateChange(path, value);\n\t\t\t},\n\t\t\t{ ignoreDetached: true },\n\t\t);\n\t}\n\n\t// MARK: - State Persistence\n\n\t/**\n\t * Forces the state to get saved.\n\t */\n\tasync saveState(opts: SaveStateOptions): Promise<void> {\n\t\tthis.#actor.assertReady(opts.allowStoppingState);\n\n\t\tif (this.#persistChanged) {\n\t\t\tif (opts.immediate) {\n\t\t\t\tawait this.#savePersistInner();\n\t\t\t} else {\n\t\t\t\t// Create promise for waiting\n\t\t\t\tif (!this.#onPersistSavedPromise) {\n\t\t\t\t\tthis.#onPersistSavedPromise = promiseWithResolvers(\n\t\t\t\t\t\t(reason) =>\n\t\t\t\t\t\t\tloggerWithoutContext().warn({\n\t\t\t\t\t\t\t\tmsg: \"unhandled persist saved promise rejection\",\n\t\t\t\t\t\t\t\treason,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Save throttled\n\t\t\t\tthis.savePersistThrottled(opts.maxWait);\n\n\t\t\t\t// Wait for save\n\t\t\t\tawait this.#onPersistSavedPromise?.promise;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Throttled save state method. Used to write to KV at a reasonable cadence.\n\t *\n\t * Passing a maxWait will override the stateSaveInterval with the min\n\t * between that and the maxWait.\n\t */\n\tsavePersistThrottled(maxWait?: number) {\n\t\tconst now = Date.now();\n\t\tconst timeSinceLastSave = now - this.#lastSaveTime;\n\n\t\t// Calculate when the save should happen based on throttle interval\n\t\tlet saveDelay = Math.max(\n\t\t\t0,\n\t\t\tthis.#stateSaveInterval - timeSinceLastSave,\n\t\t);\n\t\tif (maxWait !== undefined) {\n\t\t\tsaveDelay = Math.min(saveDelay, maxWait);\n\t\t}\n\n\t\t// Check if we need to reschedule the same timeout\n\t\tif (\n\t\t\tthis.#pendingSaveTimeout !== undefined &&\n\t\t\tthis.#pendingSaveScheduledTimestamp !== undefined\n\t\t) {\n\t\t\t// Check if we have an earlier save deadline\n\t\t\tconst newScheduledTimestamp = now + saveDelay;\n\t\t\tif (newScheduledTimestamp < this.#pendingSaveScheduledTimestamp) {\n\t\t\t\t// Cancel existing timeout and reschedule\n\t\t\t\tclearTimeout(this.#pendingSaveTimeout);\n\t\t\t\tthis.#pendingSaveTimeout = undefined;\n\t\t\t\tthis.#pendingSaveScheduledTimestamp = undefined;\n\t\t\t} else {\n\t\t\t\t// Current schedule is fine, don't reschedule\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (saveDelay > 0) {\n\t\t\t// Schedule save\n\t\t\tthis.#pendingSaveScheduledTimestamp = now + saveDelay;\n\t\t\tthis.#pendingSaveTimeout = setTimeout(() => {\n\t\t\t\tthis.#pendingSaveTimeout = undefined;\n\t\t\t\tthis.#pendingSaveScheduledTimestamp = undefined;\n\t\t\t\tthis.#savePersistInner().catch((error) => {\n\t\t\t\t\tthis.#actor.rLog.error({\n\t\t\t\t\t\tmsg: \"error saving persist data in scheduled save\",\n\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}, saveDelay);\n\t\t} else {\n\t\t\t// Save immediately\n\t\t\tthis.#savePersistInner().catch((error) => {\n\t\t\t\tthis.#actor.rLog.error({\n\t\t\t\t\tmsg: \"error saving persist data immediately\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Clears any pending save timeout.\n\t */\n\tclearPendingSaveTimeout() {\n\t\tif (this.#pendingSaveTimeout) {\n\t\t\tclearTimeout(this.#pendingSaveTimeout);\n\t\t\tthis.#pendingSaveTimeout = undefined;\n\t\t\tthis.#pendingSaveScheduledTimestamp = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Waits for any pending write operations to complete.\n\t */\n\tasync waitForPendingWrites(): Promise<void> {\n\t\tif (this.#persistWriteQueue.runningDrainLoop) {\n\t\t\tawait this.#persistWriteQueue.runningDrainLoop;\n\t\t}\n\t}\n\n\t// MARK: - Private Helpers\n\n\t#validateStateEnabled() {\n\t\tif (!this.stateEnabled) {\n\t\t\tthrow new errors.StateNotEnabled();\n\t\t}\n\t}\n\n\t#handleStateChange(path: string, value: any) {\n\t\tconst actorStatePath = isStatePath(path);\n\t\tconst connStatePath = isConnStatePath(path);\n\n\t\t// Validate CBOR serializability\n\t\tif (actorStatePath || connStatePath) {\n\t\t\tlet invalidPath = \"\";\n\t\t\tif (\n\t\t\t\t!isCborSerializable(\n\t\t\t\t\tvalue,\n\t\t\t\t\t(invalidPathPart) => {\n\t\t\t\t\t\tinvalidPath = invalidPathPart;\n\t\t\t\t\t},\n\t\t\t\t\t\"\",\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tthrow new errors.InvalidStateType({\n\t\t\t\t\tpath: path + (invalidPath ? `.${invalidPath}` : \"\"),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis.#actor.rLog.debug({\n\t\t\tmsg: \"onChange triggered, setting persistChanged=true\",\n\t\t\tpath,\n\t\t});\n\t\tthis.#persistChanged = true;\n\n\t\t// Inform inspector about state changes\n\t\tif (actorStatePath) {\n\t\t\tthis.#actor.inspector.emitter.emit(\n\t\t\t\t\"stateUpdated\",\n\t\t\t\tthis.#persist.state,\n\t\t\t);\n\t\t}\n\n\t\t// Call onStateChange lifecycle hook\n\t\tif (\n\t\t\tactorStatePath &&\n\t\t\tthis.#config.onStateChange &&\n\t\t\tthis.#actor.isReady() &&\n\t\t\t!this.#isInOnStateChange\n\t\t) {\n\t\t\tconst span = this.#actor.startTraceSpan(\"actor.onStateChange\", {\n\t\t\t\t\"rivet.state.path\": path,\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tthis.#isInOnStateChange = true;\n\t\t\t\tthis.#actor.traces.withSpan(span, () =>\n\t\t\t\t\tthis.#config.onStateChange!(\n\t\t\t\t\t\tthis.#actor.actorContext,\n\t\t\t\t\t\tthis.#persistRaw.state,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tthis.#actor.endTraceSpan(span, { code: \"OK\" });\n\t\t\t} catch (error) {\n\t\t\t\tthis.#actor.endTraceSpan(span, {\n\t\t\t\t\tcode: \"ERROR\",\n\t\t\t\t\tmessage: stringifyError(error),\n\t\t\t\t});\n\t\t\t\tthis.#actor.rLog.error({\n\t\t\t\t\tmsg: \"error in `_onStateChange`\",\n\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t});\n\t\t\t} finally {\n\t\t\t\tthis.#isInOnStateChange = false;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #savePersistInner() {\n\t\tthis.#actor.rLog.info({\n\t\t\tmsg: \"savePersistInner called\",\n\t\t\tpersistChanged: this.#persistChanged,\n\t\t\tconnsWithPersistChangedSize:\n\t\t\t\tthis.#actor.connectionManager.connsWithPersistChanged.size,\n\t\t\tconnsWithPersistChangedIds: Array.from(\n\t\t\t\tthis.#actor.connectionManager.connsWithPersistChanged,\n\t\t\t),\n\t\t});\n\n\t\ttry {\n\t\t\tthis.#lastSaveTime = Date.now();\n\n\t\t\t// Check if either actor state or connections have changed\n\t\t\tconst hasChanges =\n\t\t\t\tthis.#persistChanged ||\n\t\t\t\tthis.#actor.connectionManager.connsWithPersistChanged.size > 0;\n\n\t\t\tif (hasChanges) {\n\t\t\t\tawait this.#persistWriteQueue.enqueue(async () => {\n\t\t\t\t\tthis.#actor.rLog.debug({\n\t\t\t\t\t\tmsg: \"saving persist\",\n\t\t\t\t\t\tactorChanged: this.#persistChanged,\n\t\t\t\t\t\tconnectionsChanged:\n\t\t\t\t\t\t\tthis.#actor.connectionManager\n\t\t\t\t\t\t\t\t.connsWithPersistChanged.size,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst entries: Array<[Uint8Array, Uint8Array]> = [];\n\n\t\t\t\t\t// Build actor entries\n\t\t\t\t\tif (this.#persistChanged) {\n\t\t\t\t\t\tthis.#persistChanged = false;\n\t\t\t\t\t\tconst bareData = convertActorToBarePersisted<S, I>(\n\t\t\t\t\t\t\tthis.#persistRaw,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tentries.push([\n\t\t\t\t\t\t\tKEYS.PERSIST_DATA,\n\t\t\t\t\t\t\tACTOR_VERSIONED.serializeWithEmbeddedVersion(\n\t\t\t\t\t\t\t\tbareData,\n\t\t\t\t\t\t\t\tACTOR_PERSIST_CURRENT_VERSION,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Build connection entries\n\t\t\t\t\tconst connections: Array<AnyConn> = [];\n\t\t\t\t\tfor (const connId of this.#actor.connectionManager\n\t\t\t\t\t\t.connsWithPersistChanged) {\n\t\t\t\t\t\tconst conn = this.#actor.conns.get(connId);\n\t\t\t\t\t\tif (!conn) {\n\t\t\t\t\t\t\tthis.#actor.rLog.warn({\n\t\t\t\t\t\t\t\tmsg: \"connection not found in conns map\",\n\t\t\t\t\t\t\t\tconnId,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst connStateManager =\n\t\t\t\t\t\t\tconn[CONN_STATE_MANAGER_SYMBOL];\n\t\t\t\t\t\tconst hibernatableDataRaw =\n\t\t\t\t\t\t\tconnStateManager.hibernatableDataRaw;\n\t\t\t\t\t\tif (!hibernatableDataRaw) {\n\t\t\t\t\t\t\tthis.#actor.log.warn({\n\t\t\t\t\t\t\t\tmsg: \"missing raw hibernatable data for conn in getChangedConnectionsData\",\n\t\t\t\t\t\t\t\tconnId: conn.id,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.#actor.rLog.info({\n\t\t\t\t\t\t\tmsg: \"persisting connection\",\n\t\t\t\t\t\t\tconnId,\n\t\t\t\t\t\t\tgatewayId: idToStr(hibernatableDataRaw.gatewayId),\n\t\t\t\t\t\t\trequestId: idToStr(hibernatableDataRaw.requestId),\n\t\t\t\t\t\t\tserverMessageIndex:\n\t\t\t\t\t\t\t\thibernatableDataRaw.serverMessageIndex,\n\t\t\t\t\t\t\tclientMessageIndex:\n\t\t\t\t\t\t\t\thibernatableDataRaw.clientMessageIndex,\n\t\t\t\t\t\t\thasState: hibernatableDataRaw.state !== undefined,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst bareData = convertConnToBarePersistedConn<CP, CS>(\n\t\t\t\t\t\t\thibernatableDataRaw,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst connData =\n\t\t\t\t\t\t\tCONN_VERSIONED.serializeWithEmbeddedVersion(\n\t\t\t\t\t\t\t\tbareData,\n\t\t\t\t\t\t\t\tACTOR_PERSIST_CURRENT_VERSION,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\tentries.push([makeConnKey(connId), connData]);\n\t\t\t\t\t\tconnections.push(conn);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.#actor.rLog.info({\n\t\t\t\t\t\tmsg: \"prepared entries for kvBatchPut\",\n\t\t\t\t\t\ttotalEntries: entries.length,\n\t\t\t\t\t\tconnectionEntries: connections.length,\n\t\t\t\t\t\tconnectionIds: connections.map((c) => c.id),\n\t\t\t\t\t});\n\n\t\t\t\t\t// Notify driver before persisting connections\n\t\t\t\t\tif (this.#actorDriver.onBeforePersistConn) {\n\t\t\t\t\t\tfor (const conn of connections) {\n\t\t\t\t\t\t\tthis.#actorDriver.onBeforePersistConn(conn);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Clear changed connections\n\t\t\t\t\tthis.#actor.connectionManager.clearConnWithPersistChanged();\n\n\t\t\t\t\t// Write data\n\t\t\t\t\tthis.#actor.rLog.info({\n\t\t\t\t\t\tmsg: \"calling kvBatchPut\",\n\t\t\t\t\t\tactorId: this.#actor.id,\n\t\t\t\t\t\tentriesCount: entries.length,\n\t\t\t\t\t});\n\t\t\t\t\tawait this.#actorDriver.kvBatchPut(this.#actor.id, entries);\n\t\t\t\t\tthis.#actor.rLog.info({\n\t\t\t\t\t\tmsg: \"kvBatchPut completed successfully\",\n\t\t\t\t\t});\n\n\t\t\t\t\t// Notify driver after persisting connections\n\t\t\t\t\tif (this.#actorDriver.onAfterPersistConn) {\n\t\t\t\t\t\tfor (const conn of connections) {\n\t\t\t\t\t\t\tthis.#actorDriver.onAfterPersistConn(conn);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.#actor.rLog.debug({ msg: \"persist saved\" });\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.#actor.rLog.info({\n\t\t\t\t\tmsg: \"savePersistInner skipped - no changes\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.#onPersistSavedPromise?.resolve();\n\t\t} catch (error) {\n\t\t\tthis.#actor.rLog.error({\n\t\t\t\tmsg: \"error saving persist\",\n\t\t\t\terror: stringifyError(error),\n\t\t\t});\n\t\t\tthis.#onPersistSavedPromise?.reject(error);\n\t\t\tthrow error;\n\t\t}\n\t}\n}\n","import type { TracesDriver } from \"@rivetkit/traces\";\nimport type { ActorDriver } from \"../driver\";\nimport { tracesStoragePrefix } from \"./keys\";\n\nfunction concatPrefix(prefix: Uint8Array, key: Uint8Array): Uint8Array {\n\tconst merged = new Uint8Array(prefix.length + key.length);\n\tmerged.set(prefix, 0);\n\tmerged.set(key, prefix.length);\n\treturn merged;\n}\n\nfunction stripPrefix(prefix: Uint8Array, key: Uint8Array): Uint8Array {\n\treturn key.slice(prefix.length);\n}\n\nfunction computeUpperBound(prefix: Uint8Array): Uint8Array | null {\n\tconst upperBound = prefix.slice();\n\tfor (let i = upperBound.length - 1; i >= 0; i--) {\n\t\tif (upperBound[i] !== 0xff) {\n\t\t\tupperBound[i]++;\n\t\t\treturn upperBound.slice(0, i + 1);\n\t\t}\n\t}\n\treturn null;\n}\n\nexport class ActorTracesDriver implements TracesDriver {\n\t#driver: ActorDriver;\n\t#actorId: string;\n\t#prefix: Uint8Array;\n\n\tconstructor(driver: ActorDriver, actorId: string) {\n\t\tthis.#driver = driver;\n\t\tthis.#actorId = actorId;\n\t\tthis.#prefix = tracesStoragePrefix();\n\t}\n\n\tasync get(key: Uint8Array): Promise<Uint8Array | null> {\n\t\tconst [value] = await this.#driver.kvBatchGet(this.#actorId, [\n\t\t\tconcatPrefix(this.#prefix, key),\n\t\t]);\n\t\treturn value ?? null;\n\t}\n\n\tasync set(key: Uint8Array, value: Uint8Array): Promise<void> {\n\t\tawait this.#driver.kvBatchPut(this.#actorId, [\n\t\t\t[concatPrefix(this.#prefix, key), value],\n\t\t]);\n\t}\n\n\tasync delete(key: Uint8Array): Promise<void> {\n\t\tawait this.#driver.kvBatchDelete(this.#actorId, [\n\t\t\tconcatPrefix(this.#prefix, key),\n\t\t]);\n\t}\n\n\tasync deletePrefix(prefix: Uint8Array): Promise<void> {\n\t\tconst fullPrefix = concatPrefix(this.#prefix, prefix);\n\t\tconst fullEnd = computeUpperBound(fullPrefix);\n\t\tif (fullEnd) {\n\t\t\tawait this.#driver.kvDeleteRange(\n\t\t\t\tthis.#actorId,\n\t\t\t\tfullPrefix,\n\t\t\t\tfullEnd,\n\t\t\t);\n\t\t} else {\n\t\t\tconst entries = await this.#driver.kvListPrefix(\n\t\t\t\tthis.#actorId,\n\t\t\t\tfullPrefix,\n\t\t\t);\n\t\t\tif (entries.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.#driver.kvBatchDelete(\n\t\t\t\tthis.#actorId,\n\t\t\t\tentries.map(([key]) => key),\n\t\t\t);\n\t\t}\n\t}\n\n\tasync list(\n\t\tprefix: Uint8Array,\n\t): Promise<Array<{ key: Uint8Array; value: Uint8Array }>> {\n\t\tconst fullPrefix = concatPrefix(this.#prefix, prefix);\n\t\tconst entries = await this.#driver.kvListPrefix(\n\t\t\tthis.#actorId,\n\t\t\tfullPrefix,\n\t\t);\n\t\treturn entries.map(([key, value]) => ({\n\t\t\tkey: stripPrefix(this.#prefix, key),\n\t\t\tvalue,\n\t\t}));\n\t}\n\n\tasync listRange(\n\t\tstart: Uint8Array,\n\t\tend: Uint8Array,\n\t\toptions?: { reverse?: boolean; limit?: number },\n\t): Promise<Array<{ key: Uint8Array; value: Uint8Array }>> {\n\t\tconst entries = await this.#driver.kvListRange(\n\t\t\tthis.#actorId,\n\t\t\tconcatPrefix(this.#prefix, start),\n\t\t\tconcatPrefix(this.#prefix, end),\n\t\t\toptions,\n\t\t);\n\t\treturn entries.map(([key, value]) => ({\n\t\t\tkey: stripPrefix(this.#prefix, key),\n\t\t\tvalue,\n\t\t}));\n\t}\n\n\tasync batch(\n\t\twrites: Array<{ key: Uint8Array; value: Uint8Array }>,\n\t): Promise<void> {\n\t\tif (writes.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tawait this.#driver.kvBatchPut(\n\t\t\tthis.#actorId,\n\t\t\twrites.map(({ key, value }) => [\n\t\t\t\tconcatPrefix(this.#prefix, key),\n\t\t\t\tvalue,\n\t\t\t]),\n\t\t);\n\t}\n}\n","import type { RegistryConfig } from \"@/registry/config\";\nimport { DeepMutable } from \"@/utils\";\nimport type { Actions, ActorConfig } from \"./config\";\nimport type { ActionContextOf, ActorContext } from \"./contexts\";\nimport type { AnyDatabaseProvider } from \"./database\";\nimport { ActorInstance } from \"./instance/mod\";\nimport type { EventSchemaConfig, QueueSchemaConfig } from \"./schema\";\n\nexport type AnyActorDefinition = ActorDefinition<\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany,\n\tany\n>;\n\nexport class ActorDefinition<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n\tE extends EventSchemaConfig = Record<never, never>,\n\tQ extends QueueSchemaConfig = Record<never, never>,\n\tR extends Actions<S, CP, CS, V, I, DB, E, Q> = Actions<\n\t\tS,\n\t\tCP,\n\t\tCS,\n\t\tV,\n\t\tI,\n\t\tDB,\n\t\tE,\n\t\tQ\n\t>,\n> {\n\t#config: ActorConfig<S, CP, CS, V, I, DB, E, Q>;\n\n\tconstructor(config: ActorConfig<S, CP, CS, V, I, DB, E, Q>) {\n\t\tthis.#config = config;\n\t}\n\n\tget config(): ActorConfig<S, CP, CS, V, I, DB, E, Q> {\n\t\treturn this.#config;\n\t}\n\n\tinstantiate(): ActorInstance<S, CP, CS, V, I, DB, E, Q> {\n\t\treturn new ActorInstance(this.#config);\n\t}\n}\n\nexport function lookupInRegistry(\n\tconfig: RegistryConfig,\n\tname: string,\n): AnyActorDefinition {\n\t// Build actor\n\tconst definition = config.use[name];\n\tif (!definition) throw new Error(`no actor in registry for name ${name}`);\n\treturn definition;\n}\n","import { Hono } from \"hono\";\nimport {\n\ttype ActionOpts,\n\ttype ActionOutput,\n\ttype ConnsMessageOpts,\n\thandleAction,\n\thandleQueueSend,\n\thandleRawRequest,\n} from \"@/actor/router-endpoints\";\n\nimport {\n\tPATH_CONNECT,\n\tPATH_INSPECTOR_CONNECT,\n\tPATH_WEBSOCKET_PREFIX,\n} from \"@/common/actor-router-consts\";\nimport {\n\thandleRouteError,\n\thandleRouteNotFound,\n\tloggerMiddleware,\n} from \"@/common/router\";\nimport { noopNext } from \"@/common/utils\";\nimport { inspectorLogger } from \"@/inspector/log\";\nimport type { RegistryConfig } from \"@/registry/config\";\nimport { type GetUpgradeWebSocket, VERSION } from \"@/utils\";\nimport { timingSafeEqual } from \"@/utils/crypto\";\nimport { isDev } from \"@/utils/env-vars\";\nimport { CONN_DRIVER_SYMBOL } from \"./conn/mod\";\nimport type { ActorDriver } from \"./driver\";\nimport { loggerWithoutContext } from \"./log\";\nimport {\n\tparseWebSocketProtocols,\n\trouteWebSocket,\n} from \"./router-websocket-endpoints\";\n\nexport type { ActionOpts, ActionOutput, ConnsMessageOpts };\n\ninterface ActorRouterBindings {\n\tactorId: string;\n}\n\nexport type ActorRouter = Hono<{ Bindings: ActorRouterBindings }>;\n\nexport interface MetadataResponse {\n\truntime: string;\n\tversion: string;\n\t/** \"local\" for development, \"deployed\" for production */\n\ttype: \"local\" | \"deployed\";\n}\n\n/**\n * Creates a router that runs on the partitioned instance.\n *\n * You only need to pass `getUpgradeWebSocket` if this router is exposed\n * directly publicly. Usually WebSockets are routed manually in the\n * ManagerDriver instead of via Hono. The only platform that uses this\n * currently is Cloudflare Workers.\n */\nexport function createActorRouter(\n\tconfig: RegistryConfig,\n\tactorDriver: ActorDriver,\n\tgetUpgradeWebSocket: GetUpgradeWebSocket | undefined,\n\tisTest: boolean,\n): ActorRouter {\n\tconst router = new Hono<{ Bindings: ActorRouterBindings }>({\n\t\tstrict: false,\n\t});\n\n\trouter.use(\"*\", loggerMiddleware(loggerWithoutContext()));\n\n\t// Track all HTTP requests to prevent actor from sleeping during active requests\n\trouter.use(\"*\", async (c, next) => {\n\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\tactor.beginHonoHttpRequest();\n\t\ttry {\n\t\t\tawait next();\n\t\t} finally {\n\t\t\tactor.endHonoHttpRequest();\n\t\t}\n\t});\n\n\trouter.get(\"/\", (c) => {\n\t\treturn c.text(\n\t\t\t\"This is an RivetKit actor.\\n\\nLearn more at https://rivetkit.org\",\n\t\t);\n\t});\n\n\trouter.get(\"/health\", (c) => {\n\t\treturn c.text(\"ok\");\n\t});\n\n\trouter.get(\"/metadata\", async (c) => {\n\t\treturn c.json({\n\t\t\truntime: \"rivetkit\",\n\t\t\tversion: VERSION,\n\t\t\ttype: isDev() ? \"local\" : \"deployed\",\n\t\t} satisfies MetadataResponse);\n\t});\n\n\tif (isTest) {\n\t\t// Test endpoint to force disconnect a connection non-cleanly\n\t\trouter.post(\"/.test/force-disconnect\", async (c) => {\n\t\t\tconst connId = c.req.query(\"conn\");\n\n\t\t\tif (!connId) {\n\t\t\t\treturn c.text(\"Missing conn query parameter\", 400);\n\t\t\t}\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\t\tconst conn = actor.connectionManager.getConnForId(connId);\n\n\t\t\tif (!conn) {\n\t\t\t\treturn c.text(`Connection not found: ${connId}`, 404);\n\t\t\t}\n\n\t\t\t// Force close the connection without clean shutdown\n\t\t\tif (conn[CONN_DRIVER_SYMBOL]?.terminate) {\n\t\t\t\tconn[CONN_DRIVER_SYMBOL].terminate(actor, conn);\n\t\t\t}\n\n\t\t\treturn c.json({ success: true });\n\t\t});\n\t}\n\n\t// Route all WebSocket paths using the same handler\n\t//\n\t// All WebSockets use a separate underlying router in routeWebSocket since\n\t// WebSockets also need to be routed from ManagerDriver.proxyWebSocket and\n\t// ManagerDriver.openWebSocket.\n\tif (getUpgradeWebSocket) {\n\t\trouter.on(\n\t\t\t\"GET\",\n\t\t\t[PATH_CONNECT, `${PATH_WEBSOCKET_PREFIX}*`, PATH_INSPECTOR_CONNECT],\n\t\t\tasync (c) => {\n\t\t\t\tconst upgradeWebSocket = getUpgradeWebSocket();\n\t\t\t\tif (upgradeWebSocket) {\n\t\t\t\t\treturn upgradeWebSocket(async (c) => {\n\t\t\t\t\t\tconst protocols = c.req.header(\n\t\t\t\t\t\t\t\"sec-websocket-protocol\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst { encoding, connParams } =\n\t\t\t\t\t\t\tparseWebSocketProtocols(protocols);\n\n\t\t\t\t\t\treturn await routeWebSocket(\n\t\t\t\t\t\t\tc.req.raw,\n\t\t\t\t\t\t\tc.req.path,\n\t\t\t\t\t\t\tc.req.header(),\n\t\t\t\t\t\t\tconfig,\n\t\t\t\t\t\t\tactorDriver,\n\t\t\t\t\t\t\tc.env.actorId,\n\t\t\t\t\t\t\tencoding,\n\t\t\t\t\t\t\tconnParams,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t);\n\t\t\t\t\t})(c, noopNext());\n\t\t\t\t} else {\n\t\t\t\t\treturn c.text(\n\t\t\t\t\t\t\"WebSockets are not enabled for this driver.\",\n\t\t\t\t\t\t400,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\t// Inspector HTTP endpoints for agent-based debugging\n\tif (config.inspector.enabled) {\n\t\t// Auth middleware for inspector routes\n\t\tconst inspectorAuth = async (c: any): Promise<Response | undefined> => {\n\t\t\tif (isDev() && !config.inspector.token()) {\n\t\t\t\tinspectorLogger().warn({\n\t\t\t\t\tmsg: \"RIVET_INSPECTOR_TOKEN is not set, skipping inspector auth in development mode\",\n\t\t\t\t});\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst userToken = c.req\n\t\t\t\t.header(\"Authorization\")\n\t\t\t\t?.replace(\"Bearer \", \"\");\n\t\t\tif (!userToken) {\n\t\t\t\treturn c.text(\"Unauthorized\", 401);\n\t\t\t}\n\n\t\t\tconst inspectorToken = config.inspector.token();\n\t\t\tif (!inspectorToken) {\n\t\t\t\treturn c.text(\"Unauthorized\", 401);\n\t\t\t}\n\n\t\t\tif (!timingSafeEqual(userToken, inspectorToken)) {\n\t\t\t\treturn c.text(\"Unauthorized\", 401);\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t};\n\n\t\trouter.get(\"/inspector/state\", async (c) => {\n\t\t\tconst authResponse = await inspectorAuth(c);\n\t\t\tif (authResponse) return authResponse;\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\t\tconst isStateEnabled = actor.inspector.isStateEnabled();\n\t\t\tconst state = isStateEnabled\n\t\t\t\t? actor.inspector.getStateJson()\n\t\t\t\t: undefined;\n\t\t\treturn c.json({ state, isStateEnabled });\n\t\t});\n\n\t\trouter.patch(\"/inspector/state\", async (c) => {\n\t\t\tconst authResponse = await inspectorAuth(c);\n\t\t\tif (authResponse) return authResponse;\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\t\tconst body = await c.req.json<{ state: unknown }>();\n\t\t\tawait actor.inspector.setStateJson(body.state);\n\t\t\treturn c.json({ ok: true });\n\t\t});\n\n\t\trouter.get(\"/inspector/connections\", async (c) => {\n\t\t\tconst authResponse = await inspectorAuth(c);\n\t\t\tif (authResponse) return authResponse;\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\t\tconst connections = actor.inspector.getConnectionsJson();\n\t\t\treturn c.json({ connections });\n\t\t});\n\n\t\trouter.get(\"/inspector/rpcs\", async (c) => {\n\t\t\tconst authResponse = await inspectorAuth(c);\n\t\t\tif (authResponse) return authResponse;\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\t\tconst rpcs = actor.inspector.getRpcs();\n\t\t\treturn c.json({ rpcs });\n\t\t});\n\n\t\trouter.post(\"/inspector/action/:name\", async (c) => {\n\t\t\tconst authResponse = await inspectorAuth(c);\n\t\t\tif (authResponse) return authResponse;\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\t\tconst name = c.req.param(\"name\");\n\t\t\tconst body = await c.req.json<{ args: unknown[] }>();\n\t\t\tconst output = await actor.inspector.executeActionJson(\n\t\t\t\tname,\n\t\t\t\tbody.args ?? [],\n\t\t\t);\n\t\t\treturn c.json({ output });\n\t\t});\n\n\t\trouter.get(\"/inspector/queue\", async (c) => {\n\t\t\tconst authResponse = await inspectorAuth(c);\n\t\t\tif (authResponse) return authResponse;\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\t\tconst limit = parseInt(c.req.query(\"limit\") ?? \"50\", 10);\n\t\t\tconst status = await actor.inspector.getQueueStatusJson(limit);\n\t\t\treturn c.json(status);\n\t\t});\n\n\t\trouter.get(\"/inspector/traces\", async (c) => {\n\t\t\tconst authResponse = await inspectorAuth(c);\n\t\t\tif (authResponse) return authResponse;\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\t\tconst startMs = parseInt(c.req.query(\"startMs\") ?? \"0\", 10);\n\t\t\tconst endMs = parseInt(\n\t\t\t\tc.req.query(\"endMs\") ?? String(Date.now()),\n\t\t\t\t10,\n\t\t\t);\n\t\t\tconst limit = parseInt(c.req.query(\"limit\") ?? \"1000\", 10);\n\n\t\t\tawait actor.traces.flush();\n\t\t\tconst result = await actor.inspector.getTracesJson({\n\t\t\t\tstartMs,\n\t\t\t\tendMs,\n\t\t\t\tlimit,\n\t\t\t});\n\t\t\treturn c.json(result);\n\t\t});\n\n\t\trouter.get(\"/inspector/workflow-history\", async (c) => {\n\t\t\tconst authResponse = await inspectorAuth(c);\n\t\t\tif (authResponse) return authResponse;\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\t\tconst result = actor.inspector.getWorkflowHistoryJson();\n\t\t\treturn c.json(result);\n\t\t});\n\n\t\trouter.get(\"/inspector/database/schema\", async (c) => {\n\t\t\tconst authResponse = await inspectorAuth(c);\n\t\t\tif (authResponse) return authResponse;\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\t\tconst schema = await actor.inspector.getDatabaseSchemaJson();\n\t\t\treturn c.json({ schema });\n\t\t});\n\n\t\trouter.get(\"/inspector/database/rows\", async (c) => {\n\t\t\tconst authResponse = await inspectorAuth(c);\n\t\t\tif (authResponse) return authResponse;\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\t\tconst table = c.req.query(\"table\");\n\t\t\tif (!table) {\n\t\t\t\treturn c.json(\n\t\t\t\t\t{ error: \"Missing required table query parameter\" },\n\t\t\t\t\t400,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst limit = parseInt(c.req.query(\"limit\") ?? \"100\", 10);\n\t\t\tconst offset = parseInt(c.req.query(\"offset\") ?? \"0\", 10);\n\t\t\tconst rows = await actor.inspector.getDatabaseTableRowsJson(\n\t\t\t\ttable,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t);\n\t\t\treturn c.json({ rows });\n\t\t});\n\n\t\trouter.get(\"/inspector/summary\", async (c) => {\n\t\t\tconst authResponse = await inspectorAuth(c);\n\t\t\tif (authResponse) return authResponse;\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\n\t\t\tconst isStateEnabled = actor.inspector.isStateEnabled();\n\t\t\tconst isDatabaseEnabled = actor.inspector.isDatabaseEnabled();\n\t\t\tconst isWorkflowEnabled = actor.inspector.isWorkflowEnabled();\n\t\t\tconst workflowHistory =\n\t\t\t\tactor.inspector.getWorkflowHistoryJson().history;\n\n\t\t\tconst state = isStateEnabled\n\t\t\t\t? actor.inspector.getStateJson()\n\t\t\t\t: undefined;\n\t\t\tconst connections = actor.inspector.getConnectionsJson();\n\t\t\tconst rpcs = actor.inspector.getRpcs();\n\t\t\tconst queueSize = actor.inspector.getQueueSize();\n\n\t\t\treturn c.json({\n\t\t\t\tstate,\n\t\t\t\tconnections,\n\t\t\t\trpcs,\n\t\t\t\tqueueSize,\n\t\t\t\tisStateEnabled,\n\t\t\t\tisDatabaseEnabled,\n\t\t\t\tisWorkflowEnabled,\n\t\t\t\tworkflowHistory,\n\t\t\t});\n\t\t});\n\n\t\trouter.get(\"/inspector/metrics\", async (c) => {\n\t\t\tconst authResponse = await inspectorAuth(c);\n\t\t\tif (authResponse) return authResponse;\n\n\t\t\tconst actor = await actorDriver.loadActor(c.env.actorId);\n\t\t\treturn c.json(actor.metrics.snapshot());\n\t\t});\n\t}\n\n\trouter.post(\"/action/:action\", async (c) => {\n\t\tconst actionName = c.req.param(\"action\");\n\n\t\treturn handleAction(c, config, actorDriver, actionName, c.env.actorId);\n\t});\n\n\trouter.post(\"/queue\", async (c) => {\n\t\treturn handleQueueSend(c, config, actorDriver, c.env.actorId);\n\t});\n\n\trouter.post(\"/queue/:name\", async (c) => {\n\t\treturn handleQueueSend(\n\t\t\tc,\n\t\t\tconfig,\n\t\t\tactorDriver,\n\t\t\tc.env.actorId,\n\t\t\tc.req.param(\"name\"),\n\t\t);\n\t});\n\n\trouter.all(\"/request/*\", async (c) => {\n\t\t// TODO: This is not a clean way of doing this since `/http/` might exist mid-path\n\t\t// Strip the /http prefix from the URL to get the original path\n\t\tconst url = new URL(c.req.url);\n\t\tconst originalPath = url.pathname.replace(/^\\/request/, \"\") || \"/\";\n\n\t\t// Create a new request with the corrected URL\n\t\tconst correctedUrl = new URL(originalPath + url.search, url.origin);\n\t\tconst correctedRequest = new Request(correctedUrl, {\n\t\t\tmethod: c.req.method,\n\t\t\theaders: c.req.raw.headers,\n\t\t\tbody: c.req.raw.body,\n\t\t\tduplex: \"half\",\n\t\t} as RequestInit);\n\n\t\tloggerWithoutContext().debug({\n\t\t\tmsg: \"rewriting http url\",\n\t\t\tfrom: c.req.url,\n\t\t\tto: correctedRequest.url,\n\t\t});\n\n\t\treturn await handleRawRequest(\n\t\t\tc,\n\t\t\tcorrectedRequest,\n\t\t\tactorDriver,\n\t\t\tc.env.actorId,\n\t\t);\n\t});\n\n\trouter.notFound(handleRouteNotFound);\n\trouter.onError(handleRouteError);\n\n\treturn router;\n}\n"],"mappings":"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","names":["invariant","cbor","cbor","cbor","cbor","cbor","CURRENT_VERSION","cbor","CURRENT_VERSION","CanSleep","invariant","conn","res","c"]}
|