rivetkit 2.0.3 → 2.0.4-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (474) hide show
  1. package/README.md +11 -0
  2. package/dist/browser/client.d.ts +2485 -0
  3. package/dist/browser/client.js +5182 -0
  4. package/dist/browser/client.js.map +1 -0
  5. package/dist/browser/inspector/client.d.ts +130 -0
  6. package/dist/browser/inspector/client.js +2854 -0
  7. package/dist/browser/inspector/client.js.map +1 -0
  8. package/dist/browser/v3-DnYObHH3.d.ts +279 -0
  9. package/dist/inspector.tar.gz +0 -0
  10. package/dist/schemas/actor-inspector/v1.ts +784 -0
  11. package/dist/schemas/actor-inspector/v2.ts +796 -0
  12. package/dist/schemas/actor-inspector/v3.ts +899 -0
  13. package/dist/schemas/actor-persist/v1.ts +28 -31
  14. package/dist/schemas/actor-persist/v2.ts +268 -0
  15. package/dist/schemas/actor-persist/v3.ts +280 -0
  16. package/dist/schemas/actor-persist/v4.ts +406 -0
  17. package/dist/schemas/client-protocol/v1.ts +13 -1
  18. package/dist/schemas/client-protocol/v2.ts +438 -0
  19. package/dist/schemas/client-protocol/v3.ts +554 -0
  20. package/dist/schemas/file-system-driver/v1.ts +7 -1
  21. package/dist/schemas/file-system-driver/v2.ts +142 -0
  22. package/dist/schemas/file-system-driver/v3.ts +167 -0
  23. package/dist/schemas/persist/v1.ts +781 -0
  24. package/dist/schemas/transport/v1.ts +697 -0
  25. package/dist/tsup/actor/errors.cjs +39 -2
  26. package/dist/tsup/actor/errors.cjs.map +1 -1
  27. package/dist/tsup/actor/errors.d.cts +73 -28
  28. package/dist/tsup/actor/errors.d.ts +73 -28
  29. package/dist/tsup/actor/errors.js +54 -17
  30. package/dist/tsup/actor-router-consts-D29T1Z-K.d.cts +24 -0
  31. package/dist/tsup/actor-router-consts-D29T1Z-K.d.ts +24 -0
  32. package/dist/tsup/chunk-325TLXJT.js +1060 -0
  33. package/dist/tsup/chunk-325TLXJT.js.map +1 -0
  34. package/dist/tsup/chunk-424PT5DM.js +23 -0
  35. package/dist/tsup/chunk-424PT5DM.js.map +1 -0
  36. package/dist/tsup/chunk-4JVIG3SS.cjs +6289 -0
  37. package/dist/tsup/chunk-4JVIG3SS.cjs.map +1 -0
  38. package/dist/tsup/chunk-6LJAZ5R4.cjs +96 -0
  39. package/dist/tsup/chunk-6LJAZ5R4.cjs.map +1 -0
  40. package/dist/tsup/chunk-6XU3FMCB.cjs +534 -0
  41. package/dist/tsup/chunk-6XU3FMCB.cjs.map +1 -0
  42. package/dist/tsup/chunk-7HTNH26M.js +509 -0
  43. package/dist/tsup/chunk-7HTNH26M.js.map +1 -0
  44. package/dist/tsup/chunk-AUVH72RE.cjs +5977 -0
  45. package/dist/tsup/chunk-AUVH72RE.cjs.map +1 -0
  46. package/dist/tsup/chunk-D4BYUPNQ.js +645 -0
  47. package/dist/tsup/chunk-D4BYUPNQ.js.map +1 -0
  48. package/dist/tsup/chunk-HDQ2JUQT.cjs +23 -0
  49. package/dist/tsup/chunk-HDQ2JUQT.cjs.map +1 -0
  50. package/dist/tsup/chunk-HHXX2VRM.js +6289 -0
  51. package/dist/tsup/chunk-HHXX2VRM.js.map +1 -0
  52. package/dist/tsup/{chunk-PO4VLDWA.js → chunk-JEAEA2PB.js} +8 -6
  53. package/dist/tsup/chunk-JEAEA2PB.js.map +1 -0
  54. package/dist/tsup/chunk-JYSEG3VF.cjs +642 -0
  55. package/dist/tsup/chunk-JYSEG3VF.cjs.map +1 -0
  56. package/dist/tsup/chunk-K6DGYILQ.js +2657 -0
  57. package/dist/tsup/chunk-K6DGYILQ.js.map +1 -0
  58. package/dist/tsup/chunk-KJSYAUOM.js +96 -0
  59. package/dist/tsup/chunk-KJSYAUOM.js.map +1 -0
  60. package/dist/tsup/chunk-L47L3ZWJ.cjs +509 -0
  61. package/dist/tsup/chunk-L47L3ZWJ.cjs.map +1 -0
  62. package/dist/tsup/chunk-LXUQ667X.js +2006 -0
  63. package/dist/tsup/chunk-LXUQ667X.js.map +1 -0
  64. package/dist/tsup/chunk-MXNPAB5W.js +5977 -0
  65. package/dist/tsup/chunk-MXNPAB5W.js.map +1 -0
  66. package/dist/tsup/chunk-N4KRDJ56.js +72 -0
  67. package/dist/tsup/chunk-N4KRDJ56.js.map +1 -0
  68. package/dist/tsup/chunk-NIYZDWMW.cjs +2006 -0
  69. package/dist/tsup/chunk-NIYZDWMW.cjs.map +1 -0
  70. package/dist/tsup/chunk-PQZHDKRW.cjs +1060 -0
  71. package/dist/tsup/chunk-PQZHDKRW.cjs.map +1 -0
  72. package/dist/tsup/chunk-PVOE6BU7.cjs +1050 -0
  73. package/dist/tsup/chunk-PVOE6BU7.cjs.map +1 -0
  74. package/dist/tsup/chunk-Q4UD2GA4.cjs +1810 -0
  75. package/dist/tsup/chunk-Q4UD2GA4.cjs.map +1 -0
  76. package/dist/tsup/chunk-QUD664YZ.js +1810 -0
  77. package/dist/tsup/chunk-QUD664YZ.js.map +1 -0
  78. package/dist/tsup/chunk-RTOCTWME.js +1050 -0
  79. package/dist/tsup/chunk-RTOCTWME.js.map +1 -0
  80. package/dist/tsup/chunk-SAZZ4SB2.cjs +2657 -0
  81. package/dist/tsup/chunk-SAZZ4SB2.cjs.map +1 -0
  82. package/dist/tsup/chunk-SR3KQE7Q.cjs +72 -0
  83. package/dist/tsup/chunk-SR3KQE7Q.cjs.map +1 -0
  84. package/dist/tsup/{chunk-TZJKSBUQ.cjs → chunk-V2GHLYC6.cjs} +8 -6
  85. package/dist/tsup/chunk-V2GHLYC6.cjs.map +1 -0
  86. package/dist/tsup/chunk-V3WG7XTW.cjs +645 -0
  87. package/dist/tsup/chunk-V3WG7XTW.cjs.map +1 -0
  88. package/dist/tsup/chunk-VKVNIQRQ.js +257 -0
  89. package/dist/tsup/chunk-VKVNIQRQ.js.map +1 -0
  90. package/dist/tsup/chunk-WMPW7JYC.js +642 -0
  91. package/dist/tsup/chunk-WMPW7JYC.js.map +1 -0
  92. package/dist/tsup/chunk-Z7HNQ2WF.js +534 -0
  93. package/dist/tsup/chunk-Z7HNQ2WF.js.map +1 -0
  94. package/dist/tsup/chunk-ZFY5J2EP.cjs +257 -0
  95. package/dist/tsup/chunk-ZFY5J2EP.cjs.map +1 -0
  96. package/dist/tsup/client/mod.cjs +11 -10
  97. package/dist/tsup/client/mod.cjs.map +1 -1
  98. package/dist/tsup/client/mod.d.cts +57 -19
  99. package/dist/tsup/client/mod.d.ts +57 -19
  100. package/dist/tsup/client/mod.js +15 -14
  101. package/dist/tsup/common/log.cjs +12 -4
  102. package/dist/tsup/common/log.cjs.map +1 -1
  103. package/dist/tsup/common/log.d.cts +31 -17
  104. package/dist/tsup/common/log.d.ts +31 -17
  105. package/dist/tsup/common/log.js +15 -7
  106. package/dist/tsup/common/websocket.cjs +5 -5
  107. package/dist/tsup/common/websocket.cjs.map +1 -1
  108. package/dist/tsup/common/websocket.js +4 -4
  109. package/dist/tsup/config-BiNoIHRs.d.cts +80 -0
  110. package/dist/tsup/config-BiNoIHRs.d.ts +80 -0
  111. package/dist/tsup/config-P3XujgRr.d.ts +2594 -0
  112. package/dist/tsup/config-_gfywqqI.d.cts +2594 -0
  113. package/dist/tsup/context-Bxd8Cx4H.d.cts +75 -0
  114. package/dist/tsup/context-uNA4TRn3.d.ts +75 -0
  115. package/dist/tsup/db/drizzle/mod.cjs +49 -0
  116. package/dist/tsup/db/drizzle/mod.cjs.map +1 -0
  117. package/dist/tsup/db/drizzle/mod.d.cts +17 -0
  118. package/dist/tsup/db/drizzle/mod.d.ts +17 -0
  119. package/dist/tsup/db/drizzle/mod.js +49 -0
  120. package/dist/tsup/db/drizzle/mod.js.map +1 -0
  121. package/dist/tsup/db/mod.cjs +9 -0
  122. package/dist/tsup/db/mod.cjs.map +1 -0
  123. package/dist/tsup/db/mod.d.cts +9 -0
  124. package/dist/tsup/db/mod.d.ts +9 -0
  125. package/dist/tsup/db/mod.js +9 -0
  126. package/dist/tsup/db/mod.js.map +1 -0
  127. package/dist/tsup/driver-BcLvZcKl.d.cts +13 -0
  128. package/dist/tsup/driver-CPGHKXyh.d.ts +13 -0
  129. package/dist/tsup/driver-helpers/mod.cjs +27 -7
  130. package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
  131. package/dist/tsup/driver-helpers/mod.d.cts +43 -14
  132. package/dist/tsup/driver-helpers/mod.d.ts +43 -14
  133. package/dist/tsup/driver-helpers/mod.js +41 -21
  134. package/dist/tsup/driver-test-suite/mod.cjs +2749 -2394
  135. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
  136. package/dist/tsup/driver-test-suite/mod.d.cts +28 -12
  137. package/dist/tsup/driver-test-suite/mod.d.ts +28 -12
  138. package/dist/tsup/driver-test-suite/mod.js +3319 -2964
  139. package/dist/tsup/driver-test-suite/mod.js.map +1 -1
  140. package/dist/tsup/inspector/mod.cjs +118 -7
  141. package/dist/tsup/inspector/mod.cjs.map +1 -1
  142. package/dist/tsup/inspector/mod.d.cts +126 -404
  143. package/dist/tsup/inspector/mod.d.ts +126 -404
  144. package/dist/tsup/inspector/mod.js +159 -48
  145. package/dist/tsup/keys-CydblqMh.d.cts +13 -0
  146. package/dist/tsup/keys-CydblqMh.d.ts +13 -0
  147. package/dist/tsup/mod.cjs +21 -12
  148. package/dist/tsup/mod.cjs.map +1 -1
  149. package/dist/tsup/mod.d.cts +102 -76
  150. package/dist/tsup/mod.d.ts +102 -76
  151. package/dist/tsup/mod.js +51 -42
  152. package/dist/tsup/serve-test-suite/mod.cjs +2601 -0
  153. package/dist/tsup/serve-test-suite/mod.cjs.map +1 -0
  154. package/dist/tsup/serve-test-suite/mod.d.cts +9 -0
  155. package/dist/tsup/serve-test-suite/mod.d.ts +9 -0
  156. package/dist/tsup/serve-test-suite/mod.js +2601 -0
  157. package/dist/tsup/serve-test-suite/mod.js.map +1 -0
  158. package/dist/tsup/test/mod.cjs +84 -15
  159. package/dist/tsup/test/mod.cjs.map +1 -1
  160. package/dist/tsup/test/mod.d.cts +15 -16
  161. package/dist/tsup/test/mod.d.ts +15 -16
  162. package/dist/tsup/test/mod.js +85 -16
  163. package/dist/tsup/test/mod.js.map +1 -1
  164. package/dist/tsup/{utils-CT0cv4jd.d.ts → utils-fwx3o3K9.d.cts} +1 -0
  165. package/dist/tsup/{utils-CT0cv4jd.d.cts → utils-fwx3o3K9.d.ts} +1 -0
  166. package/dist/tsup/utils.cjs +20 -3
  167. package/dist/tsup/utils.cjs.map +1 -1
  168. package/dist/tsup/utils.d.cts +114 -2
  169. package/dist/tsup/utils.d.ts +114 -2
  170. package/dist/tsup/utils.js +19 -2
  171. package/dist/tsup/v3-DnYObHH3.d.cts +279 -0
  172. package/dist/tsup/v3-DnYObHH3.d.ts +279 -0
  173. package/dist/tsup/workflow/mod.cjs +16 -0
  174. package/dist/tsup/workflow/mod.cjs.map +1 -0
  175. package/dist/tsup/workflow/mod.d.cts +25 -0
  176. package/dist/tsup/workflow/mod.d.ts +25 -0
  177. package/dist/tsup/workflow/mod.js +16 -0
  178. package/dist/tsup/workflow/mod.js.map +1 -0
  179. package/package.json +101 -16
  180. package/src/actor/config.ts +674 -218
  181. package/src/actor/conn/driver.ts +61 -0
  182. package/src/actor/conn/drivers/http.ts +17 -0
  183. package/src/actor/conn/drivers/raw-request.ts +24 -0
  184. package/src/actor/conn/drivers/raw-websocket.ts +65 -0
  185. package/src/actor/conn/drivers/websocket.ts +144 -0
  186. package/src/actor/conn/mod.ts +288 -0
  187. package/src/actor/conn/persisted.ts +81 -0
  188. package/src/actor/conn/state-manager.ts +196 -0
  189. package/src/actor/contexts/action.ts +47 -0
  190. package/src/actor/contexts/base/actor.ts +347 -0
  191. package/src/actor/contexts/base/conn-init.ts +68 -0
  192. package/src/actor/contexts/base/conn.ts +73 -0
  193. package/src/actor/contexts/before-action-response.ts +42 -0
  194. package/src/actor/contexts/before-connect.ts +31 -0
  195. package/src/actor/contexts/connect.ts +42 -0
  196. package/src/actor/contexts/create-conn-state.ts +32 -0
  197. package/src/actor/contexts/create-vars.ts +39 -0
  198. package/src/actor/contexts/create.ts +39 -0
  199. package/src/actor/contexts/destroy.ts +42 -0
  200. package/src/actor/contexts/disconnect.ts +43 -0
  201. package/src/actor/contexts/index.ts +33 -0
  202. package/src/actor/contexts/request.ts +80 -0
  203. package/src/actor/contexts/run.ts +47 -0
  204. package/src/actor/contexts/sleep.ts +42 -0
  205. package/src/actor/contexts/state-change.ts +42 -0
  206. package/src/actor/contexts/wake.ts +42 -0
  207. package/src/actor/contexts/websocket.ts +80 -0
  208. package/src/actor/database.ts +8 -18
  209. package/src/actor/definition.ts +23 -45
  210. package/src/actor/driver.ts +78 -48
  211. package/src/actor/errors.ts +281 -85
  212. package/src/actor/instance/connection-manager.ts +574 -0
  213. package/src/actor/instance/event-manager.ts +314 -0
  214. package/src/actor/instance/keys.ts +146 -0
  215. package/src/actor/instance/kv.ts +241 -0
  216. package/src/actor/instance/mod.ts +1658 -0
  217. package/src/actor/instance/persisted.ts +67 -0
  218. package/src/actor/instance/queue-manager.ts +603 -0
  219. package/src/actor/instance/queue.ts +345 -0
  220. package/src/actor/instance/schedule-manager.ts +392 -0
  221. package/src/actor/instance/state-manager.ts +542 -0
  222. package/src/actor/instance/traces-driver.ts +128 -0
  223. package/src/{drivers/engine → actor}/keys.test.ts +13 -4
  224. package/src/actor/log.ts +4 -13
  225. package/src/actor/mod.ts +37 -40
  226. package/src/actor/protocol/old.ts +205 -70
  227. package/src/actor/protocol/serde.ts +100 -9
  228. package/src/actor/router-endpoints.ts +249 -534
  229. package/src/actor/router-websocket-endpoints.test.ts +54 -0
  230. package/src/actor/router-websocket-endpoints.ts +405 -0
  231. package/src/actor/router.ts +305 -188
  232. package/src/actor/schedule.ts +1 -1
  233. package/src/actor/schema.ts +291 -0
  234. package/src/actor/utils.test.ts +48 -0
  235. package/src/actor/utils.ts +71 -11
  236. package/src/client/actor-common.ts +4 -2
  237. package/src/client/actor-conn.ts +758 -300
  238. package/src/client/actor-handle.ts +198 -62
  239. package/src/client/actor-query.ts +112 -0
  240. package/src/client/client.ts +59 -124
  241. package/src/client/config.ts +151 -0
  242. package/src/client/errors.ts +37 -2
  243. package/src/client/log.ts +2 -4
  244. package/src/client/mod.browser.ts +2 -0
  245. package/src/client/mod.ts +33 -19
  246. package/src/client/queue.ts +146 -0
  247. package/src/client/raw-utils.ts +84 -27
  248. package/src/client/utils.ts +141 -39
  249. package/src/common/actor-router-consts.ts +59 -0
  250. package/src/common/cors.ts +57 -0
  251. package/src/common/eventsource.ts +7 -43
  252. package/src/common/inline-websocket-adapter.ts +154 -0
  253. package/src/common/log.ts +191 -101
  254. package/src/common/logfmt.ts +23 -30
  255. package/src/common/router.ts +114 -27
  256. package/src/common/utils.ts +35 -18
  257. package/src/common/websocket-interface.ts +7 -49
  258. package/src/common/websocket.ts +2 -2
  259. package/src/db/config.ts +100 -0
  260. package/src/db/drizzle/mod.ts +226 -0
  261. package/src/db/drizzle/sqlite-core.ts +22 -0
  262. package/src/db/mod.ts +125 -0
  263. package/src/db/shared.ts +92 -0
  264. package/src/db/sqlite-vfs.ts +12 -0
  265. package/src/devtools-loader/index.ts +33 -0
  266. package/src/devtools-loader/log.ts +5 -0
  267. package/src/driver-helpers/mod.ts +19 -8
  268. package/src/driver-helpers/utils.ts +46 -9
  269. package/src/driver-test-suite/log.ts +1 -3
  270. package/src/driver-test-suite/mod.ts +188 -108
  271. package/src/driver-test-suite/test-inline-client-driver.ts +179 -274
  272. package/src/driver-test-suite/tests/access-control.ts +218 -0
  273. package/src/driver-test-suite/tests/action-features.ts +69 -2
  274. package/src/driver-test-suite/tests/actor-conn-hibernation.ts +152 -0
  275. package/src/driver-test-suite/tests/actor-conn-state.ts +73 -22
  276. package/src/driver-test-suite/tests/actor-conn.ts +375 -128
  277. package/src/driver-test-suite/tests/actor-db-raw.ts +73 -0
  278. package/src/driver-test-suite/tests/actor-db.ts +477 -0
  279. package/src/driver-test-suite/tests/actor-destroy.ts +294 -0
  280. package/src/driver-test-suite/tests/actor-driver.ts +0 -7
  281. package/src/driver-test-suite/tests/actor-error-handling.ts +4 -12
  282. package/src/driver-test-suite/tests/actor-handle.ts +78 -25
  283. package/src/driver-test-suite/tests/actor-inline-client.ts +34 -23
  284. package/src/driver-test-suite/tests/actor-inspector.ts +216 -522
  285. package/src/driver-test-suite/tests/actor-kv.ts +65 -0
  286. package/src/driver-test-suite/tests/actor-metadata.ts +1 -1
  287. package/src/driver-test-suite/tests/actor-queue.ts +325 -0
  288. package/src/driver-test-suite/tests/actor-run.ts +181 -0
  289. package/src/driver-test-suite/tests/actor-schedule.ts +31 -42
  290. package/src/driver-test-suite/tests/actor-sleep.ts +27 -25
  291. package/src/driver-test-suite/tests/actor-stateless.ts +70 -0
  292. package/src/driver-test-suite/tests/actor-vars.ts +6 -2
  293. package/src/driver-test-suite/tests/actor-workflow.ts +118 -0
  294. package/src/driver-test-suite/tests/manager-driver.ts +32 -9
  295. package/src/driver-test-suite/tests/raw-http-direct-registry.ts +227 -226
  296. package/src/driver-test-suite/tests/raw-http-request-properties.ts +71 -31
  297. package/src/driver-test-suite/tests/raw-http.ts +22 -10
  298. package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +393 -392
  299. package/src/driver-test-suite/tests/raw-websocket.ts +86 -57
  300. package/src/driver-test-suite/tests/request-access.ts +130 -134
  301. package/src/driver-test-suite/utils.ts +28 -16
  302. package/src/drivers/default.ts +22 -15
  303. package/src/drivers/engine/actor-driver.ts +864 -197
  304. package/src/drivers/engine/config.ts +41 -37
  305. package/src/drivers/engine/log.ts +1 -3
  306. package/src/drivers/engine/mod.ts +16 -16
  307. package/src/drivers/file-system/actor.ts +46 -35
  308. package/src/drivers/file-system/global-state.ts +903 -131
  309. package/src/drivers/file-system/kv-limits.ts +70 -0
  310. package/src/drivers/file-system/log.ts +1 -3
  311. package/src/drivers/file-system/manager.ts +171 -177
  312. package/src/drivers/file-system/mod.ts +47 -17
  313. package/src/drivers/file-system/sqlite-runtime.ts +210 -0
  314. package/src/drivers/file-system/utils.ts +26 -10
  315. package/src/engine-process/constants.ts +2 -0
  316. package/src/engine-process/log.ts +5 -0
  317. package/src/engine-process/mod.ts +464 -0
  318. package/src/globals.d.ts +29 -0
  319. package/src/inspector/actor-inspector.ts +352 -0
  320. package/src/inspector/config.ts +11 -45
  321. package/src/inspector/handler.ts +273 -0
  322. package/src/inspector/log.ts +1 -1
  323. package/src/inspector/mod.browser.ts +8 -0
  324. package/src/inspector/mod.ts +4 -2
  325. package/src/inspector/serve-ui.ts +40 -0
  326. package/src/inspector/transport.ts +18 -0
  327. package/src/inspector/utils.ts +13 -57
  328. package/src/manager/driver.ts +40 -14
  329. package/src/manager/gateway.ts +668 -0
  330. package/src/manager/log.ts +2 -4
  331. package/src/manager/mod.ts +2 -2
  332. package/src/manager/protocol/mod.ts +1 -3
  333. package/src/manager/protocol/query.ts +2 -6
  334. package/src/manager/router-schema.ts +22 -0
  335. package/src/manager/router.ts +555 -1687
  336. package/src/manager-api/actors.ts +83 -0
  337. package/src/manager-api/common.ts +4 -0
  338. package/src/mod.ts +10 -6
  339. package/src/registry/config/driver.ts +21 -0
  340. package/src/registry/config/index.ts +510 -0
  341. package/src/registry/config/legacy-runner.ts +157 -0
  342. package/src/registry/config/runner.ts +21 -0
  343. package/src/registry/config/serverless.ts +94 -0
  344. package/src/registry/index.ts +194 -0
  345. package/src/registry/log.ts +2 -4
  346. package/src/remote-manager-driver/actor-http-client.ts +84 -0
  347. package/src/remote-manager-driver/actor-websocket-client.ts +81 -0
  348. package/src/remote-manager-driver/api-endpoints.ts +159 -0
  349. package/src/remote-manager-driver/api-utils.ts +69 -0
  350. package/src/remote-manager-driver/log.ts +5 -0
  351. package/src/remote-manager-driver/metadata.ts +64 -0
  352. package/src/remote-manager-driver/mod.ts +414 -0
  353. package/src/{drivers/engine → remote-manager-driver}/ws-proxy.ts +46 -27
  354. package/src/schemas/actor-inspector/mod.ts +1 -0
  355. package/src/schemas/actor-inspector/versioned.ts +233 -0
  356. package/src/schemas/actor-persist/mod.ts +1 -1
  357. package/src/schemas/actor-persist/versioned.ts +211 -19
  358. package/src/schemas/client-protocol/mod.ts +1 -1
  359. package/src/schemas/client-protocol/versioned.ts +310 -43
  360. package/src/schemas/client-protocol-zod/mod.ts +118 -0
  361. package/src/schemas/file-system-driver/mod.ts +1 -1
  362. package/src/schemas/file-system-driver/versioned.ts +128 -21
  363. package/src/schemas/persist/mod.ts +1 -0
  364. package/src/schemas/transport/mod.ts +1 -0
  365. package/src/serde.ts +67 -13
  366. package/src/serve-test-suite/mod.ts +148 -0
  367. package/src/serverless/configure.ts +82 -0
  368. package/src/serverless/log.ts +5 -0
  369. package/src/serverless/router.test.ts +299 -0
  370. package/src/serverless/router.ts +215 -0
  371. package/src/test/log.ts +1 -3
  372. package/src/test/mod.ts +70 -124
  373. package/src/utils/crypto.ts +24 -0
  374. package/src/utils/endpoint-parser.test.ts +202 -0
  375. package/src/utils/endpoint-parser.ts +124 -0
  376. package/src/utils/env-vars.ts +78 -0
  377. package/src/utils/node.ts +178 -0
  378. package/src/utils/router.ts +83 -0
  379. package/src/utils/serve.ts +212 -0
  380. package/src/utils.test.ts +34 -0
  381. package/src/utils.ts +278 -13
  382. package/src/workflow/constants.ts +2 -0
  383. package/src/workflow/context.ts +597 -0
  384. package/src/workflow/driver.ts +194 -0
  385. package/src/workflow/inspector.ts +268 -0
  386. package/src/workflow/mod.ts +128 -0
  387. package/dist/tsup/chunk-2CRLFV6Z.cjs +0 -202
  388. package/dist/tsup/chunk-2CRLFV6Z.cjs.map +0 -1
  389. package/dist/tsup/chunk-3H7O2A7I.js +0 -525
  390. package/dist/tsup/chunk-3H7O2A7I.js.map +0 -1
  391. package/dist/tsup/chunk-42I3OZ3Q.js +0 -15
  392. package/dist/tsup/chunk-42I3OZ3Q.js.map +0 -1
  393. package/dist/tsup/chunk-4NSUQZ2H.js +0 -1790
  394. package/dist/tsup/chunk-4NSUQZ2H.js.map +0 -1
  395. package/dist/tsup/chunk-6PDXBYI5.js +0 -132
  396. package/dist/tsup/chunk-6PDXBYI5.js.map +0 -1
  397. package/dist/tsup/chunk-6WKQDDUD.cjs +0 -1790
  398. package/dist/tsup/chunk-6WKQDDUD.cjs.map +0 -1
  399. package/dist/tsup/chunk-CTBOSFUH.cjs +0 -116
  400. package/dist/tsup/chunk-CTBOSFUH.cjs.map +0 -1
  401. package/dist/tsup/chunk-EGVZZFE2.js +0 -2857
  402. package/dist/tsup/chunk-EGVZZFE2.js.map +0 -1
  403. package/dist/tsup/chunk-FCCPJNMA.cjs +0 -132
  404. package/dist/tsup/chunk-FCCPJNMA.cjs.map +0 -1
  405. package/dist/tsup/chunk-FLMTTN27.js +0 -244
  406. package/dist/tsup/chunk-FLMTTN27.js.map +0 -1
  407. package/dist/tsup/chunk-GIR3AFFI.cjs +0 -315
  408. package/dist/tsup/chunk-GIR3AFFI.cjs.map +0 -1
  409. package/dist/tsup/chunk-INGJP237.js +0 -315
  410. package/dist/tsup/chunk-INGJP237.js.map +0 -1
  411. package/dist/tsup/chunk-KJCJLKRM.js +0 -116
  412. package/dist/tsup/chunk-KJCJLKRM.js.map +0 -1
  413. package/dist/tsup/chunk-KUPQZYUQ.cjs +0 -15
  414. package/dist/tsup/chunk-KUPQZYUQ.cjs.map +0 -1
  415. package/dist/tsup/chunk-O2MBYIXO.cjs +0 -2857
  416. package/dist/tsup/chunk-O2MBYIXO.cjs.map +0 -1
  417. package/dist/tsup/chunk-OGAPU3UG.cjs +0 -525
  418. package/dist/tsup/chunk-OGAPU3UG.cjs.map +0 -1
  419. package/dist/tsup/chunk-OV6AYD4S.js +0 -4406
  420. package/dist/tsup/chunk-OV6AYD4S.js.map +0 -1
  421. package/dist/tsup/chunk-PO4VLDWA.js.map +0 -1
  422. package/dist/tsup/chunk-R2OPSKIV.cjs +0 -244
  423. package/dist/tsup/chunk-R2OPSKIV.cjs.map +0 -1
  424. package/dist/tsup/chunk-TZJKSBUQ.cjs.map +0 -1
  425. package/dist/tsup/chunk-UBUC5C3G.cjs +0 -189
  426. package/dist/tsup/chunk-UBUC5C3G.cjs.map +0 -1
  427. package/dist/tsup/chunk-UIM22YJL.cjs +0 -4406
  428. package/dist/tsup/chunk-UIM22YJL.cjs.map +0 -1
  429. package/dist/tsup/chunk-URVFQMYI.cjs +0 -230
  430. package/dist/tsup/chunk-URVFQMYI.cjs.map +0 -1
  431. package/dist/tsup/chunk-UVUPOS46.js +0 -230
  432. package/dist/tsup/chunk-UVUPOS46.js.map +0 -1
  433. package/dist/tsup/chunk-VRRHBNJC.js +0 -189
  434. package/dist/tsup/chunk-VRRHBNJC.js.map +0 -1
  435. package/dist/tsup/chunk-XFSS33EQ.js +0 -202
  436. package/dist/tsup/chunk-XFSS33EQ.js.map +0 -1
  437. package/dist/tsup/common-CpqORuCq.d.cts +0 -218
  438. package/dist/tsup/common-CpqORuCq.d.ts +0 -218
  439. package/dist/tsup/connection-BR_Ve4ku.d.cts +0 -2117
  440. package/dist/tsup/connection-BwUMoe6n.d.ts +0 -2117
  441. package/dist/tsup/router-endpoints-AYkXG8Tl.d.cts +0 -66
  442. package/dist/tsup/router-endpoints-DAbqVFx2.d.ts +0 -66
  443. package/src/actor/action.ts +0 -182
  444. package/src/actor/connection.ts +0 -260
  445. package/src/actor/context.ts +0 -171
  446. package/src/actor/generic-conn-driver.ts +0 -234
  447. package/src/actor/instance.ts +0 -1800
  448. package/src/actor/persisted.ts +0 -42
  449. package/src/actor/unstable-react.ts +0 -110
  450. package/src/client/http-client-driver.ts +0 -326
  451. package/src/common/fake-event-source.ts +0 -266
  452. package/src/common/inline-websocket-adapter2.ts +0 -445
  453. package/src/common/versioned-data.ts +0 -95
  454. package/src/driver-test-suite/tests/actor-auth.ts +0 -591
  455. package/src/drivers/engine/api-endpoints.ts +0 -128
  456. package/src/drivers/engine/api-utils.ts +0 -70
  457. package/src/drivers/engine/kv.ts +0 -3
  458. package/src/drivers/engine/manager-driver.ts +0 -391
  459. package/src/inline-client-driver/log.ts +0 -7
  460. package/src/inline-client-driver/mod.ts +0 -385
  461. package/src/inspector/actor.ts +0 -298
  462. package/src/inspector/manager.ts +0 -86
  463. package/src/inspector/protocol/actor.ts +0 -10
  464. package/src/inspector/protocol/common.ts +0 -196
  465. package/src/inspector/protocol/manager.ts +0 -10
  466. package/src/inspector/protocol/mod.ts +0 -2
  467. package/src/manager/auth.ts +0 -121
  468. package/src/manager/hono-websocket-adapter.ts +0 -333
  469. package/src/registry/config.ts +0 -32
  470. package/src/registry/mod.ts +0 -124
  471. package/src/registry/run-config.ts +0 -54
  472. package/src/registry/serve.ts +0 -53
  473. package/src/test/config.ts +0 -16
  474. /package/src/{drivers/engine → actor}/keys.ts +0 -0
@@ -0,0 +1,542 @@
1
+ import { idToStr } from "@rivetkit/engine-runner";
2
+ import onChange from "@rivetkit/on-change";
3
+ import { isCborSerializable, stringifyError } from "@/common/utils";
4
+ import {
5
+ CURRENT_VERSION as ACTOR_PERSIST_CURRENT_VERSION,
6
+ ACTOR_VERSIONED,
7
+ CONN_VERSIONED,
8
+ } from "@/schemas/actor-persist/versioned";
9
+ import { promiseWithResolvers, SinglePromiseQueue } from "@/utils";
10
+ import { loggerWithoutContext } from "@/actor/log";
11
+ import { type AnyConn, CONN_STATE_MANAGER_SYMBOL } from "../conn/mod";
12
+ import { convertConnToBarePersistedConn } from "../conn/persisted";
13
+ import type { ActorDriver } from "../driver";
14
+ import * as errors from "../errors";
15
+ import type { EventSchemaConfig, QueueSchemaConfig } from "../schema";
16
+ import { isConnStatePath, isStatePath } from "../utils";
17
+ import { KEYS, makeConnKey } from "./keys";
18
+ import type { ActorInstance } from "./mod";
19
+ import { convertActorToBarePersisted, type PersistedActor } from "./persisted";
20
+
21
+ export interface SaveStateOptions {
22
+ /**
23
+ * Forces the state to be saved immediately. This function will return when the state has saved successfully.
24
+ */
25
+ immediate?: boolean;
26
+ /** Bypass ready check for stopping. */
27
+ allowStoppingState?: boolean;
28
+ /**
29
+ * Maximum time in milliseconds to wait before forcing a save.
30
+ *
31
+ * If a save is already scheduled to occur later than this deadline, it will be rescheduled earlier.
32
+ */
33
+ maxWait?: number;
34
+ }
35
+
36
+ /**
37
+ * Manages actor state persistence, proxying, and synchronization.
38
+ * Handles automatic state change detection and throttled persistence to KV storage.
39
+ */
40
+ export class StateManager<
41
+ S,
42
+ CP,
43
+ CS,
44
+ I,
45
+ E extends EventSchemaConfig = Record<never, never>,
46
+ Q extends QueueSchemaConfig = Record<never, never>,
47
+ > {
48
+ #actor: ActorInstance<S, CP, CS, any, I, any, E, Q>;
49
+ #actorDriver: ActorDriver;
50
+
51
+ // State tracking
52
+ #persist!: PersistedActor<S, I>;
53
+ #persistRaw!: PersistedActor<S, I>;
54
+ #persistChanged = false;
55
+ #isInOnStateChange = false;
56
+
57
+ // Save management
58
+ #persistWriteQueue = new SinglePromiseQueue();
59
+ #lastSaveTime = 0;
60
+ #pendingSaveTimeout?: NodeJS.Timeout;
61
+ #pendingSaveScheduledTimestamp?: number;
62
+ #onPersistSavedPromise?: ReturnType<typeof promiseWithResolvers<void>>;
63
+
64
+ // Configuration
65
+ #config: any; // ActorConfig type
66
+ #stateSaveInterval: number;
67
+
68
+ constructor(
69
+ actor: ActorInstance<S, CP, CS, any, I, any, E, Q>,
70
+ actorDriver: ActorDriver,
71
+ config: any,
72
+ ) {
73
+ this.#actor = actor;
74
+ this.#actorDriver = actorDriver;
75
+ this.#config = config;
76
+ this.#stateSaveInterval = config.options.stateSaveInterval || 100;
77
+ }
78
+
79
+ // MARK: - Public API
80
+
81
+ get persist(): PersistedActor<S, I> {
82
+ return this.#persist;
83
+ }
84
+
85
+ get persistRaw(): PersistedActor<S, I> {
86
+ return this.#persistRaw;
87
+ }
88
+
89
+ get persistChanged(): boolean {
90
+ return this.#persistChanged;
91
+ }
92
+
93
+ get state(): S {
94
+ this.#validateStateEnabled();
95
+ return this.#persist.state;
96
+ }
97
+
98
+ set state(value: S) {
99
+ this.#validateStateEnabled();
100
+ this.#persist.state = value;
101
+ }
102
+
103
+ get stateEnabled(): boolean {
104
+ return "createState" in this.#config || "state" in this.#config;
105
+ }
106
+
107
+ // MARK: - Initialization
108
+
109
+ /**
110
+ * Initializes state from persisted data or creates new state.
111
+ */
112
+ async initializeState(persistData: PersistedActor<S, I>): Promise<void> {
113
+ if (!persistData.hasInitialized) {
114
+ // Create initial state
115
+ let stateData: unknown;
116
+ if (this.stateEnabled) {
117
+ this.#actor.rLog.info({ msg: "actor state initializing" });
118
+
119
+ if ("createState" in this.#config) {
120
+ stateData = await this.#actor.runInTraceSpan(
121
+ "actor.createState",
122
+ undefined,
123
+ () =>
124
+ this.#config.createState!(
125
+ this.#actor.actorContext,
126
+ persistData.input!,
127
+ ),
128
+ );
129
+ } else if ("state" in this.#config) {
130
+ stateData = structuredClone(this.#config.state);
131
+ } else {
132
+ throw new Error(
133
+ "Both 'createState' or 'state' were not defined",
134
+ );
135
+ }
136
+ } else {
137
+ this.#actor.rLog.debug({ msg: "state not enabled" });
138
+ }
139
+
140
+ // Update persisted data
141
+ persistData.state = stateData as S;
142
+ persistData.hasInitialized = true;
143
+
144
+ // Save initial state
145
+ //
146
+ // We don't use #savePersistInner because the actor is not fully
147
+ // initialized yet
148
+ const bareData = convertActorToBarePersisted<S, I>(persistData);
149
+ await this.#actorDriver.kvBatchPut(this.#actor.id, [
150
+ [
151
+ KEYS.PERSIST_DATA,
152
+ ACTOR_VERSIONED.serializeWithEmbeddedVersion(
153
+ bareData,
154
+ ACTOR_PERSIST_CURRENT_VERSION,
155
+ ),
156
+ ],
157
+ ]);
158
+ }
159
+
160
+ // Initialize proxy
161
+ this.initPersistProxy(persistData);
162
+ }
163
+
164
+ /**
165
+ * Creates proxy for persist object that handles automatic state change detection.
166
+ */
167
+ initPersistProxy(target: PersistedActor<S, I>) {
168
+ // Set raw persist object
169
+ this.#persistRaw = target;
170
+
171
+ // Validate serializability
172
+ if (target === null || typeof target !== "object") {
173
+ let invalidPath = "";
174
+ if (
175
+ !isCborSerializable(
176
+ target,
177
+ (path) => {
178
+ invalidPath = path;
179
+ },
180
+ "",
181
+ )
182
+ ) {
183
+ throw new errors.InvalidStateType({ path: invalidPath });
184
+ }
185
+ return target;
186
+ }
187
+
188
+ // Unsubscribe from old state
189
+ if (this.#persist) {
190
+ onChange.unsubscribe(this.#persist);
191
+ }
192
+
193
+ // Listen for changes to automatically write state
194
+ this.#persist = onChange(
195
+ target,
196
+ (
197
+ path: string,
198
+ value: any,
199
+ _previousValue: any,
200
+ _applyData: any,
201
+ ) => {
202
+ this.#handleStateChange(path, value);
203
+ },
204
+ { ignoreDetached: true },
205
+ );
206
+ }
207
+
208
+ // MARK: - State Persistence
209
+
210
+ /**
211
+ * Forces the state to get saved.
212
+ */
213
+ async saveState(opts: SaveStateOptions): Promise<void> {
214
+ this.#actor.assertReady(opts.allowStoppingState);
215
+
216
+ if (this.#persistChanged) {
217
+ if (opts.immediate) {
218
+ await this.#savePersistInner();
219
+ } else {
220
+ // Create promise for waiting
221
+ if (!this.#onPersistSavedPromise) {
222
+ this.#onPersistSavedPromise = promiseWithResolvers((reason) => loggerWithoutContext().warn({ msg: "unhandled persist saved promise rejection", reason }));
223
+ }
224
+
225
+ // Save throttled
226
+ this.savePersistThrottled(opts.maxWait);
227
+
228
+ // Wait for save
229
+ await this.#onPersistSavedPromise?.promise;
230
+ }
231
+ }
232
+ }
233
+
234
+ /**
235
+ * Throttled save state method. Used to write to KV at a reasonable cadence.
236
+ *
237
+ * Passing a maxWait will override the stateSaveInterval with the min
238
+ * between that and the maxWait.
239
+ */
240
+ savePersistThrottled(maxWait?: number) {
241
+ const now = Date.now();
242
+ const timeSinceLastSave = now - this.#lastSaveTime;
243
+
244
+ // Calculate when the save should happen based on throttle interval
245
+ let saveDelay = Math.max(
246
+ 0,
247
+ this.#stateSaveInterval - timeSinceLastSave,
248
+ );
249
+ if (maxWait !== undefined) {
250
+ saveDelay = Math.min(saveDelay, maxWait);
251
+ }
252
+
253
+ // Check if we need to reschedule the same timeout
254
+ if (
255
+ this.#pendingSaveTimeout !== undefined &&
256
+ this.#pendingSaveScheduledTimestamp !== undefined
257
+ ) {
258
+ // Check if we have an earlier save deadline
259
+ const newScheduledTimestamp = now + saveDelay;
260
+ if (newScheduledTimestamp < this.#pendingSaveScheduledTimestamp) {
261
+ // Cancel existing timeout and reschedule
262
+ clearTimeout(this.#pendingSaveTimeout);
263
+ this.#pendingSaveTimeout = undefined;
264
+ this.#pendingSaveScheduledTimestamp = undefined;
265
+ } else {
266
+ // Current schedule is fine, don't reschedule
267
+ return;
268
+ }
269
+ }
270
+
271
+ if (saveDelay > 0) {
272
+ // Schedule save
273
+ this.#pendingSaveScheduledTimestamp = now + saveDelay;
274
+ this.#pendingSaveTimeout = setTimeout(() => {
275
+ this.#pendingSaveTimeout = undefined;
276
+ this.#pendingSaveScheduledTimestamp = undefined;
277
+ this.#savePersistInner().catch((error) => {
278
+ this.#actor.rLog.error({
279
+ msg: "error saving persist data in scheduled save",
280
+ error: stringifyError(error),
281
+ });
282
+ });
283
+ }, saveDelay);
284
+ } else {
285
+ // Save immediately
286
+ this.#savePersistInner().catch((error) => {
287
+ this.#actor.rLog.error({
288
+ msg: "error saving persist data immediately",
289
+ error: stringifyError(error),
290
+ });
291
+ });
292
+ }
293
+ }
294
+
295
+ /**
296
+ * Clears any pending save timeout.
297
+ */
298
+ clearPendingSaveTimeout() {
299
+ if (this.#pendingSaveTimeout) {
300
+ clearTimeout(this.#pendingSaveTimeout);
301
+ this.#pendingSaveTimeout = undefined;
302
+ this.#pendingSaveScheduledTimestamp = undefined;
303
+ }
304
+ }
305
+
306
+ /**
307
+ * Waits for any pending write operations to complete.
308
+ */
309
+ async waitForPendingWrites(): Promise<void> {
310
+ if (this.#persistWriteQueue.runningDrainLoop) {
311
+ await this.#persistWriteQueue.runningDrainLoop;
312
+ }
313
+ }
314
+
315
+ // MARK: - Private Helpers
316
+
317
+ #validateStateEnabled() {
318
+ if (!this.stateEnabled) {
319
+ throw new errors.StateNotEnabled();
320
+ }
321
+ }
322
+
323
+ #handleStateChange(path: string, value: any) {
324
+ const actorStatePath = isStatePath(path);
325
+ const connStatePath = isConnStatePath(path);
326
+
327
+ // Validate CBOR serializability
328
+ if (actorStatePath || connStatePath) {
329
+ let invalidPath = "";
330
+ if (
331
+ !isCborSerializable(
332
+ value,
333
+ (invalidPathPart) => {
334
+ invalidPath = invalidPathPart;
335
+ },
336
+ "",
337
+ )
338
+ ) {
339
+ throw new errors.InvalidStateType({
340
+ path: path + (invalidPath ? `.${invalidPath}` : ""),
341
+ });
342
+ }
343
+ }
344
+
345
+ this.#actor.rLog.debug({
346
+ msg: "onChange triggered, setting persistChanged=true",
347
+ path,
348
+ });
349
+ this.#persistChanged = true;
350
+
351
+ // Inform inspector about state changes
352
+ if (actorStatePath) {
353
+ this.#actor.inspector.emitter.emit(
354
+ "stateUpdated",
355
+ this.#persist.state,
356
+ );
357
+ }
358
+
359
+ // Call onStateChange lifecycle hook
360
+ if (
361
+ actorStatePath &&
362
+ this.#config.onStateChange &&
363
+ this.#actor.isReady() &&
364
+ !this.#isInOnStateChange
365
+ ) {
366
+ const span = this.#actor.startTraceSpan("actor.onStateChange", {
367
+ "rivet.state.path": path,
368
+ });
369
+ try {
370
+ this.#isInOnStateChange = true;
371
+ this.#actor.traces.withSpan(span, () =>
372
+ this.#config.onStateChange!(
373
+ this.#actor.actorContext,
374
+ this.#persistRaw.state,
375
+ ),
376
+ );
377
+ this.#actor.endTraceSpan(span, { code: "OK" });
378
+ } catch (error) {
379
+ this.#actor.endTraceSpan(span, {
380
+ code: "ERROR",
381
+ message: stringifyError(error),
382
+ });
383
+ this.#actor.rLog.error({
384
+ msg: "error in `_onStateChange`",
385
+ error: stringifyError(error),
386
+ });
387
+ } finally {
388
+ this.#isInOnStateChange = false;
389
+ }
390
+ }
391
+ }
392
+
393
+ async #savePersistInner() {
394
+ this.#actor.rLog.info({
395
+ msg: "savePersistInner called",
396
+ persistChanged: this.#persistChanged,
397
+ connsWithPersistChangedSize:
398
+ this.#actor.connectionManager.connsWithPersistChanged.size,
399
+ connsWithPersistChangedIds: Array.from(
400
+ this.#actor.connectionManager.connsWithPersistChanged,
401
+ ),
402
+ });
403
+
404
+ try {
405
+ this.#lastSaveTime = Date.now();
406
+
407
+ // Check if either actor state or connections have changed
408
+ const hasChanges =
409
+ this.#persistChanged ||
410
+ this.#actor.connectionManager.connsWithPersistChanged.size > 0;
411
+
412
+ if (hasChanges) {
413
+ await this.#persistWriteQueue.enqueue(async () => {
414
+ this.#actor.rLog.debug({
415
+ msg: "saving persist",
416
+ actorChanged: this.#persistChanged,
417
+ connectionsChanged:
418
+ this.#actor.connectionManager
419
+ .connsWithPersistChanged.size,
420
+ });
421
+
422
+ const entries: Array<[Uint8Array, Uint8Array]> = [];
423
+
424
+ // Build actor entries
425
+ if (this.#persistChanged) {
426
+ this.#persistChanged = false;
427
+ const bareData = convertActorToBarePersisted<S, I>(
428
+ this.#persistRaw,
429
+ );
430
+ entries.push([
431
+ KEYS.PERSIST_DATA,
432
+ ACTOR_VERSIONED.serializeWithEmbeddedVersion(
433
+ bareData,
434
+ ACTOR_PERSIST_CURRENT_VERSION,
435
+ ),
436
+ ]);
437
+ }
438
+
439
+ // Build connection entries
440
+ const connections: Array<AnyConn> = [];
441
+ for (const connId of this.#actor.connectionManager
442
+ .connsWithPersistChanged) {
443
+ const conn = this.#actor.conns.get(connId);
444
+ if (!conn) {
445
+ this.#actor.rLog.warn({
446
+ msg: "connection not found in conns map",
447
+ connId,
448
+ });
449
+ continue;
450
+ }
451
+
452
+ const connStateManager =
453
+ conn[CONN_STATE_MANAGER_SYMBOL];
454
+ const hibernatableDataRaw =
455
+ connStateManager.hibernatableDataRaw;
456
+ if (!hibernatableDataRaw) {
457
+ this.#actor.log.warn({
458
+ msg: "missing raw hibernatable data for conn in getChangedConnectionsData",
459
+ connId: conn.id,
460
+ });
461
+ continue;
462
+ }
463
+
464
+ this.#actor.rLog.info({
465
+ msg: "persisting connection",
466
+ connId,
467
+ gatewayId: idToStr(hibernatableDataRaw.gatewayId),
468
+ requestId: idToStr(hibernatableDataRaw.requestId),
469
+ serverMessageIndex:
470
+ hibernatableDataRaw.serverMessageIndex,
471
+ clientMessageIndex:
472
+ hibernatableDataRaw.clientMessageIndex,
473
+ hasState: hibernatableDataRaw.state !== undefined,
474
+ });
475
+
476
+ const bareData = convertConnToBarePersistedConn<CP, CS>(
477
+ hibernatableDataRaw,
478
+ );
479
+ const connData =
480
+ CONN_VERSIONED.serializeWithEmbeddedVersion(
481
+ bareData,
482
+ ACTOR_PERSIST_CURRENT_VERSION,
483
+ );
484
+
485
+ entries.push([makeConnKey(connId), connData]);
486
+ connections.push(conn);
487
+ }
488
+
489
+ this.#actor.rLog.info({
490
+ msg: "prepared entries for kvBatchPut",
491
+ totalEntries: entries.length,
492
+ connectionEntries: connections.length,
493
+ connectionIds: connections.map((c) => c.id),
494
+ });
495
+
496
+ // Notify driver before persisting connections
497
+ if (this.#actorDriver.onBeforePersistConn) {
498
+ for (const conn of connections) {
499
+ this.#actorDriver.onBeforePersistConn(conn);
500
+ }
501
+ }
502
+
503
+ // Clear changed connections
504
+ this.#actor.connectionManager.clearConnWithPersistChanged();
505
+
506
+ // Write data
507
+ this.#actor.rLog.info({
508
+ msg: "calling kvBatchPut",
509
+ actorId: this.#actor.id,
510
+ entriesCount: entries.length,
511
+ });
512
+ await this.#actorDriver.kvBatchPut(this.#actor.id, entries);
513
+ this.#actor.rLog.info({
514
+ msg: "kvBatchPut completed successfully",
515
+ });
516
+
517
+ // Notify driver after persisting connections
518
+ if (this.#actorDriver.onAfterPersistConn) {
519
+ for (const conn of connections) {
520
+ this.#actorDriver.onAfterPersistConn(conn);
521
+ }
522
+ }
523
+
524
+ this.#actor.rLog.debug({ msg: "persist saved" });
525
+ });
526
+ } else {
527
+ this.#actor.rLog.info({
528
+ msg: "savePersistInner skipped - no changes",
529
+ });
530
+ }
531
+
532
+ this.#onPersistSavedPromise?.resolve();
533
+ } catch (error) {
534
+ this.#actor.rLog.error({
535
+ msg: "error saving persist",
536
+ error: stringifyError(error),
537
+ });
538
+ this.#onPersistSavedPromise?.reject(error);
539
+ throw error;
540
+ }
541
+ }
542
+ }
@@ -0,0 +1,128 @@
1
+ import type { TracesDriver } from "@rivetkit/traces";
2
+ import type { ActorDriver } from "../driver";
3
+ import { tracesStoragePrefix } from "./keys";
4
+
5
+ function concatPrefix(prefix: Uint8Array, key: Uint8Array): Uint8Array {
6
+ const merged = new Uint8Array(prefix.length + key.length);
7
+ merged.set(prefix, 0);
8
+ merged.set(key, prefix.length);
9
+ return merged;
10
+ }
11
+
12
+ function stripPrefix(prefix: Uint8Array, key: Uint8Array): Uint8Array {
13
+ return key.slice(prefix.length);
14
+ }
15
+
16
+ function compareBytes(a: Uint8Array, b: Uint8Array): number {
17
+ const len = Math.min(a.length, b.length);
18
+ for (let i = 0; i < len; i++) {
19
+ if (a[i] !== b[i]) {
20
+ return a[i] - b[i];
21
+ }
22
+ }
23
+ return a.length - b.length;
24
+ }
25
+
26
+ export class ActorTracesDriver implements TracesDriver {
27
+ #driver: ActorDriver;
28
+ #actorId: string;
29
+ #prefix: Uint8Array;
30
+
31
+ constructor(driver: ActorDriver, actorId: string) {
32
+ this.#driver = driver;
33
+ this.#actorId = actorId;
34
+ this.#prefix = tracesStoragePrefix();
35
+ }
36
+
37
+ async get(key: Uint8Array): Promise<Uint8Array | null> {
38
+ const [value] = await this.#driver.kvBatchGet(this.#actorId, [
39
+ concatPrefix(this.#prefix, key),
40
+ ]);
41
+ return value ?? null;
42
+ }
43
+
44
+ async set(key: Uint8Array, value: Uint8Array): Promise<void> {
45
+ await this.#driver.kvBatchPut(this.#actorId, [
46
+ [concatPrefix(this.#prefix, key), value],
47
+ ]);
48
+ }
49
+
50
+ async delete(key: Uint8Array): Promise<void> {
51
+ await this.#driver.kvBatchDelete(this.#actorId, [
52
+ concatPrefix(this.#prefix, key),
53
+ ]);
54
+ }
55
+
56
+ async deletePrefix(prefix: Uint8Array): Promise<void> {
57
+ const fullPrefix = concatPrefix(this.#prefix, prefix);
58
+ const entries = await this.#driver.kvListPrefix(
59
+ this.#actorId,
60
+ fullPrefix,
61
+ );
62
+ if (entries.length === 0) {
63
+ return;
64
+ }
65
+ await this.#driver.kvBatchDelete(
66
+ this.#actorId,
67
+ entries.map(([key]) => key),
68
+ );
69
+ }
70
+
71
+ async list(
72
+ prefix: Uint8Array,
73
+ ): Promise<Array<{ key: Uint8Array; value: Uint8Array }>> {
74
+ const fullPrefix = concatPrefix(this.#prefix, prefix);
75
+ const entries = await this.#driver.kvListPrefix(
76
+ this.#actorId,
77
+ fullPrefix,
78
+ );
79
+ return entries.map(([key, value]) => ({
80
+ key: stripPrefix(this.#prefix, key),
81
+ value,
82
+ }));
83
+ }
84
+
85
+ async listRange(
86
+ start: Uint8Array,
87
+ end: Uint8Array,
88
+ options?: { reverse?: boolean; limit?: number },
89
+ ): Promise<Array<{ key: Uint8Array; value: Uint8Array }>> {
90
+ const fullStart = concatPrefix(this.#prefix, start);
91
+ const fullEnd = concatPrefix(this.#prefix, end);
92
+ const entries = await this.#driver.kvListPrefix(
93
+ this.#actorId,
94
+ this.#prefix,
95
+ );
96
+ const filtered = entries
97
+ .filter(([key]) => {
98
+ return (
99
+ compareBytes(key, fullStart) >= 0 &&
100
+ compareBytes(key, fullEnd) < 0
101
+ );
102
+ })
103
+ .sort(([keyA], [keyB]) => compareBytes(keyA, keyB));
104
+ if (options?.reverse) {
105
+ filtered.reverse();
106
+ }
107
+ const limited = options?.limit
108
+ ? filtered.slice(0, options.limit)
109
+ : filtered;
110
+ return limited.map(([key, value]) => ({
111
+ key: stripPrefix(this.#prefix, key),
112
+ value,
113
+ }));
114
+ }
115
+
116
+ async batch(writes: Array<{ key: Uint8Array; value: Uint8Array }>): Promise<void> {
117
+ if (writes.length === 0) {
118
+ return;
119
+ }
120
+ await this.#driver.kvBatchPut(
121
+ this.#actorId,
122
+ writes.map(({ key, value }) => [
123
+ concatPrefix(this.#prefix, key),
124
+ value,
125
+ ]),
126
+ );
127
+ }
128
+ }
@@ -25,7 +25,9 @@ describe("Key serialization and deserialization", () => {
25
25
 
26
26
  test("escapes forward slashes in keys", () => {
27
27
  expect(serializeActorKey(["a/b"])).toBe("a\\/b");
28
- expect(serializeActorKey(["a/b", "c"])).toBe(`a\\/b${KEY_SEPARATOR}c`);
28
+ expect(serializeActorKey(["a/b", "c"])).toBe(
29
+ `a\\/b${KEY_SEPARATOR}c`,
30
+ );
29
31
  });
30
32
 
31
33
  test("escapes empty key marker in keys", () => {
@@ -46,7 +48,9 @@ describe("Key serialization and deserialization", () => {
46
48
  });
47
49
 
48
50
  test("deserializes undefined/null", () => {
49
- expect(deserializeActorKey(undefined as unknown as string)).toEqual([]);
51
+ expect(deserializeActorKey(undefined as unknown as string)).toEqual(
52
+ [],
53
+ );
50
54
  expect(deserializeActorKey(null as unknown as string)).toEqual([]);
51
55
  });
52
56
 
@@ -127,7 +131,9 @@ describe("Key serialization and deserialization", () => {
127
131
  expect(serialized2).toBe("\\0"); // Empty string becomes \0 marker
128
132
 
129
133
  expect(deserializeActorKey(serialized1)).toEqual(emptyArray);
130
- expect(deserializeActorKey(serialized2)).toEqual(arrayWithEmptyString);
134
+ expect(deserializeActorKey(serialized2)).toEqual(
135
+ arrayWithEmptyString,
136
+ );
131
137
  });
132
138
 
133
139
  test("handles mix of empty strings and forward slash (EMPTY_KEY)", () => {
@@ -194,7 +200,10 @@ describe("Key serialization and deserialization", () => {
194
200
  const testCases: Array<[string[], string]> = [
195
201
  [["path\\to\\file/dir"], "path\\\\to\\\\file\\/dir"],
196
202
  [["file\\with/slash"], "file\\\\with\\/slash"],
197
- [["path\\to\\file", "with/slash"], "path\\\\to\\\\file/with\\/slash"],
203
+ [
204
+ ["path\\to\\file", "with/slash"],
205
+ "path\\\\to\\\\file/with\\/slash",
206
+ ],
198
207
  ];
199
208
 
200
209
  for (const [key, expectedSerialized] of testCases) {