rivetkit 2.1.5 → 2.1.6-rc.1

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