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,67 @@
1
+ /**
2
+ * Persisted data structures for actors.
3
+ *
4
+ * Keep this file in sync with the Connection section of rivetkit-typescript/packages/rivetkit/schemas/actor-persist/
5
+ */
6
+
7
+ import * as cbor from "cbor-x";
8
+ import type * as persistSchema from "@/schemas/actor-persist/mod";
9
+ import { bufferToArrayBuffer } from "@/utils";
10
+
11
+ export type Cbor = ArrayBuffer;
12
+
13
+ // MARK: Schedule Event
14
+ /** Scheduled event to be executed at a specific timestamp */
15
+ export interface PersistedScheduleEvent {
16
+ eventId: string;
17
+ timestamp: number;
18
+ action: string;
19
+ args?: Cbor;
20
+ }
21
+
22
+ // MARK: Actor
23
+ /** State object that gets automatically persisted to storage */
24
+ export interface PersistedActor<S, I> {
25
+ /** Input data passed to the actor on initialization */
26
+ input?: I;
27
+ hasInitialized: boolean;
28
+ state: S;
29
+ scheduledEvents: PersistedScheduleEvent[];
30
+ }
31
+
32
+ export function convertActorToBarePersisted<S, I>(
33
+ persist: PersistedActor<S, I>,
34
+ ): persistSchema.Actor {
35
+ return {
36
+ input:
37
+ persist.input !== undefined
38
+ ? bufferToArrayBuffer(cbor.encode(persist.input))
39
+ : null,
40
+ hasInitialized: persist.hasInitialized,
41
+ state: bufferToArrayBuffer(cbor.encode(persist.state)),
42
+ scheduledEvents: persist.scheduledEvents.map((event) => ({
43
+ eventId: event.eventId,
44
+ timestamp: BigInt(event.timestamp),
45
+ action: event.action,
46
+ args: event.args ?? null,
47
+ })),
48
+ };
49
+ }
50
+
51
+ export function convertActorFromBarePersisted<S, I>(
52
+ bareData: persistSchema.Actor,
53
+ ): PersistedActor<S, I> {
54
+ return {
55
+ input: bareData.input
56
+ ? cbor.decode(new Uint8Array(bareData.input))
57
+ : undefined,
58
+ hasInitialized: bareData.hasInitialized,
59
+ state: cbor.decode(new Uint8Array(bareData.state)),
60
+ scheduledEvents: bareData.scheduledEvents.map((event) => ({
61
+ eventId: event.eventId,
62
+ timestamp: Number(event.timestamp),
63
+ action: event.action,
64
+ args: event.args ?? undefined,
65
+ })),
66
+ };
67
+ }
@@ -0,0 +1,603 @@
1
+ import * as cbor from "cbor-x";
2
+ import { isCborSerializable } from "@/common/utils";
3
+ import {
4
+ CURRENT_VERSION as ACTOR_PERSIST_CURRENT_VERSION,
5
+ QUEUE_MESSAGE_VERSIONED,
6
+ QUEUE_METADATA_VERSIONED,
7
+ } from "@/schemas/actor-persist/versioned";
8
+ import { promiseWithResolvers } from "@/utils";
9
+ import type { AnyDatabaseProvider } from "../database";
10
+ import type { ActorDriver } from "../driver";
11
+ import * as errors from "../errors";
12
+ import type { EventSchemaConfig, QueueSchemaConfig } from "../schema";
13
+ import {
14
+ decodeQueueMessageKey,
15
+ makeQueueMessageKey,
16
+ queueMessagesPrefix,
17
+ queueMetadataKey,
18
+ } from "./keys";
19
+ import type { ActorInstance } from "./mod";
20
+
21
+ export interface QueueMessage {
22
+ id: bigint;
23
+ name: string;
24
+ body: unknown;
25
+ createdAt: number;
26
+ }
27
+
28
+ interface QueueMetadata {
29
+ nextId: bigint;
30
+ size: number;
31
+ }
32
+
33
+ interface QueueWaiter {
34
+ id: string;
35
+ nameSet?: Set<string>;
36
+ count: number;
37
+ completable: boolean;
38
+ resolve: (messages: QueueMessage[]) => void;
39
+ reject: (error: Error) => void;
40
+ }
41
+
42
+ interface MessageListener {
43
+ nameSet?: Set<string>;
44
+ resolve: () => void;
45
+ reject: (error: Error) => void;
46
+ actorAbortCleanup?: () => void;
47
+ signal?: AbortSignal;
48
+ signalAbortCleanup?: () => void;
49
+ }
50
+
51
+ const DEFAULT_METADATA: QueueMetadata = {
52
+ nextId: 1n,
53
+ size: 0,
54
+ };
55
+
56
+ const QUEUE_METADATA_KEY = queueMetadataKey();
57
+ const QUEUE_MESSAGES_PREFIX = queueMessagesPrefix();
58
+
59
+ interface PendingCompletion {
60
+ resolve: (result: {
61
+ status: "completed" | "timedOut";
62
+ response?: unknown;
63
+ }) => void;
64
+ timeoutHandle?: ReturnType<typeof setTimeout>;
65
+ }
66
+
67
+ export class QueueManager<
68
+ S,
69
+ CP,
70
+ CS,
71
+ V,
72
+ I,
73
+ DB extends AnyDatabaseProvider,
74
+ E extends EventSchemaConfig = Record<never, never>,
75
+ Q extends QueueSchemaConfig = Record<never, never>,
76
+ > {
77
+ #actor: ActorInstance<S, CP, CS, V, I, DB, E, Q>;
78
+ #driver: ActorDriver;
79
+ #waiters = new Map<string, QueueWaiter>();
80
+ #metadata: QueueMetadata = { ...DEFAULT_METADATA };
81
+ #messageListeners = new Set<MessageListener>();
82
+ #pendingCompletions = new Map<string, PendingCompletion>();
83
+
84
+ constructor(
85
+ actor: ActorInstance<S, CP, CS, V, I, DB, E, Q>,
86
+ driver: ActorDriver,
87
+ ) {
88
+ this.#actor = actor;
89
+ this.#driver = driver;
90
+ }
91
+
92
+ /** Returns the current number of messages in the queue. */
93
+ get size(): number {
94
+ return this.#metadata.size;
95
+ }
96
+
97
+ /** Loads queue metadata from storage and initializes internal state. */
98
+ async initialize(): Promise<void> {
99
+ const [metadataBuffer] = await this.#driver.kvBatchGet(this.#actor.id, [
100
+ QUEUE_METADATA_KEY,
101
+ ]);
102
+ if (!metadataBuffer) {
103
+ await this.#driver.kvBatchPut(this.#actor.id, [
104
+ [QUEUE_METADATA_KEY, this.#serializeMetadata()],
105
+ ]);
106
+ this.#actor.inspector.updateQueueSize(this.#metadata.size);
107
+ return;
108
+ }
109
+ try {
110
+ const decoded =
111
+ QUEUE_METADATA_VERSIONED.deserializeWithEmbeddedVersion(
112
+ metadataBuffer,
113
+ );
114
+ this.#metadata.nextId = decoded.nextId;
115
+ this.#metadata.size = Number(decoded.size);
116
+ } catch (error) {
117
+ this.#actor.rLog.error({
118
+ msg: "failed to decode queue metadata, rebuilding from messages",
119
+ error,
120
+ });
121
+ await this.#rebuildMetadata();
122
+ }
123
+ this.#actor.inspector.updateQueueSize(this.#metadata.size);
124
+ }
125
+
126
+ /** Adds a message to the queue with the given name and body. */
127
+ async enqueue(name: string, body: unknown): Promise<QueueMessage> {
128
+ this.#actor.assertReady();
129
+
130
+ const sizeLimit = this.#actor.config.options.maxQueueSize;
131
+ if (this.#metadata.size >= sizeLimit) {
132
+ throw new errors.QueueFull(sizeLimit);
133
+ }
134
+
135
+ let invalidPath = "";
136
+ if (
137
+ !isCborSerializable(body, (path) => {
138
+ invalidPath = path;
139
+ })
140
+ ) {
141
+ throw new errors.QueueMessageInvalid(invalidPath);
142
+ }
143
+
144
+ const createdAt = Date.now();
145
+ const bodyCborBuffer = cbor.encode(body);
146
+ const encodedMessage =
147
+ QUEUE_MESSAGE_VERSIONED.serializeWithEmbeddedVersion(
148
+ {
149
+ name,
150
+ body: new Uint8Array(bodyCborBuffer).buffer as ArrayBuffer,
151
+ createdAt: BigInt(createdAt),
152
+ failureCount: null,
153
+ availableAt: null,
154
+ inFlight: null,
155
+ inFlightAt: null,
156
+ },
157
+ ACTOR_PERSIST_CURRENT_VERSION,
158
+ );
159
+ const encodedSize = encodedMessage.byteLength;
160
+ if (encodedSize > this.#actor.config.options.maxQueueMessageSize) {
161
+ throw new errors.QueueMessageTooLarge(
162
+ encodedSize,
163
+ this.#actor.config.options.maxQueueMessageSize,
164
+ );
165
+ }
166
+
167
+ const id = this.#metadata.nextId;
168
+ const messageKey = makeQueueMessageKey(id);
169
+
170
+ // Update metadata before writing so we can batch both writes
171
+ this.#metadata.nextId = id + 1n;
172
+ this.#metadata.size += 1;
173
+ const encodedMetadata = this.#serializeMetadata();
174
+
175
+ // Batch write message and metadata together
176
+ await this.#driver.kvBatchPut(this.#actor.id, [
177
+ [messageKey, encodedMessage],
178
+ [QUEUE_METADATA_KEY, encodedMetadata],
179
+ ]);
180
+
181
+ this.#actor.inspector.updateQueueSize(this.#metadata.size);
182
+
183
+ const message: QueueMessage = {
184
+ id,
185
+ name,
186
+ body,
187
+ createdAt,
188
+ };
189
+
190
+ this.#actor.resetSleepTimer();
191
+ await this.#maybeResolveWaiters();
192
+ this.#notifyMessageListeners(name);
193
+
194
+ return message;
195
+ }
196
+
197
+ /**
198
+ * Adds a message and waits for completion.
199
+ */
200
+ async enqueueAndWait(
201
+ name: string,
202
+ body: unknown,
203
+ timeout?: number,
204
+ ): Promise<{ status: "completed" | "timedOut"; response?: unknown }> {
205
+ if (timeout !== undefined && timeout <= 0) {
206
+ return { status: "timedOut" };
207
+ }
208
+
209
+ const message = await this.enqueue(name, body);
210
+ const messageId = message.id.toString();
211
+ const { promise, resolve } = promiseWithResolvers<{
212
+ status: "completed" | "timedOut";
213
+ response?: unknown;
214
+ }>(() => {});
215
+
216
+ const pending: PendingCompletion = { resolve };
217
+ if (timeout !== undefined) {
218
+ pending.timeoutHandle = setTimeout(() => {
219
+ this.#pendingCompletions.delete(messageId);
220
+ resolve({ status: "timedOut" });
221
+ }, timeout);
222
+ }
223
+ this.#pendingCompletions.set(messageId, pending);
224
+
225
+ return await promise;
226
+ }
227
+
228
+ async completeMessage(
229
+ message: QueueMessage,
230
+ response?: unknown,
231
+ ): Promise<void> {
232
+ await this.completeMessageById(message.id, response);
233
+ }
234
+
235
+ async completeMessageById(
236
+ messageId: bigint,
237
+ response?: unknown,
238
+ ): Promise<void> {
239
+ const messageIdString = messageId.toString();
240
+ const pending = this.#pendingCompletions.get(messageIdString);
241
+ if (pending) {
242
+ if (pending.timeoutHandle) {
243
+ clearTimeout(pending.timeoutHandle);
244
+ }
245
+ this.#pendingCompletions.delete(messageIdString);
246
+ pending.resolve({ status: "completed", response });
247
+ }
248
+
249
+ await this.deleteMessagesById([messageId]);
250
+ }
251
+
252
+ /** Receives messages from the queue matching the given names. Waits until messages are available or timeout is reached. */
253
+ async receive(
254
+ names: string[] | undefined,
255
+ count: number,
256
+ timeout?: number,
257
+ abortSignal?: AbortSignal,
258
+ completable = false,
259
+ ): Promise<QueueMessage[]> {
260
+ this.#actor.assertReady();
261
+ const limitedCount = Math.max(1, count);
262
+ const nameSet =
263
+ names && names.length > 0 ? new Set(names) : undefined;
264
+
265
+ const immediate = await this.#drainMessages(
266
+ nameSet,
267
+ limitedCount,
268
+ completable,
269
+ );
270
+ if (immediate.length > 0) {
271
+ return immediate;
272
+ }
273
+ if (timeout === 0) {
274
+ return [];
275
+ }
276
+
277
+ const { promise, resolve, reject } = promiseWithResolvers<
278
+ QueueMessage[]
279
+ >(() => {});
280
+ const waiterId = crypto.randomUUID();
281
+ let timeoutHandle: ReturnType<typeof setTimeout> | undefined;
282
+ let cleanedUp = false;
283
+ let actorAbortCleanup: (() => void) | undefined;
284
+ let signalAbortCleanup: (() => void) | undefined;
285
+
286
+ const cleanup = () => {
287
+ if (cleanedUp) {
288
+ return;
289
+ }
290
+ cleanedUp = true;
291
+ this.#waiters.delete(waiterId);
292
+ if (timeoutHandle) {
293
+ clearTimeout(timeoutHandle);
294
+ timeoutHandle = undefined;
295
+ }
296
+ actorAbortCleanup?.();
297
+ signalAbortCleanup?.();
298
+ this.#actor.endQueueWait();
299
+ };
300
+ const resolveWaiter = (messages: QueueMessage[]) => {
301
+ cleanup();
302
+ resolve(messages);
303
+ };
304
+ const rejectWaiter = (error: Error) => {
305
+ cleanup();
306
+ reject(error);
307
+ };
308
+
309
+ const waiter: QueueWaiter = {
310
+ id: waiterId,
311
+ nameSet,
312
+ count: limitedCount,
313
+ completable,
314
+ resolve: resolveWaiter,
315
+ reject: rejectWaiter,
316
+ };
317
+
318
+ this.#actor.beginQueueWait();
319
+
320
+ if (timeout !== undefined) {
321
+ timeoutHandle = setTimeout(() => {
322
+ resolveWaiter([]);
323
+ }, timeout);
324
+ }
325
+
326
+ const onAbort = () => {
327
+ rejectWaiter(new errors.ActorAborted());
328
+ };
329
+ const onStop = () => {
330
+ rejectWaiter(new errors.ActorAborted());
331
+ };
332
+ const actorAbortSignal = this.#actor.abortSignal;
333
+ if (actorAbortSignal.aborted) {
334
+ onStop();
335
+ return promise;
336
+ }
337
+ actorAbortSignal.addEventListener("abort", onStop, { once: true });
338
+ actorAbortCleanup = () =>
339
+ actorAbortSignal.removeEventListener("abort", onStop);
340
+
341
+ if (abortSignal) {
342
+ if (abortSignal.aborted) {
343
+ onAbort();
344
+ return promise;
345
+ }
346
+ abortSignal.addEventListener("abort", onAbort, { once: true });
347
+ signalAbortCleanup = () =>
348
+ abortSignal.removeEventListener("abort", onAbort);
349
+ }
350
+
351
+ this.#waiters.set(waiterId, waiter);
352
+ return promise;
353
+ }
354
+
355
+ async waitForNames(
356
+ names: readonly string[] | undefined,
357
+ abortSignal?: AbortSignal,
358
+ ): Promise<void> {
359
+ const nameSet =
360
+ names && names.length > 0 ? new Set(names) : undefined;
361
+ const existing = await this.#loadQueueMessages();
362
+ if (nameSet) {
363
+ if (existing.some((message) => nameSet.has(message.name))) {
364
+ return;
365
+ }
366
+ } else if (existing.length > 0) {
367
+ return;
368
+ }
369
+
370
+ return await new Promise<void>((resolve, reject) => {
371
+ this.#actor.beginQueueWait();
372
+ const listener: MessageListener = {
373
+ nameSet,
374
+ resolve: () => {
375
+ this.#removeMessageListener(listener);
376
+ this.#actor.endQueueWait();
377
+ resolve();
378
+ },
379
+ reject: (error) => {
380
+ this.#removeMessageListener(listener);
381
+ this.#actor.endQueueWait();
382
+ reject(error);
383
+ },
384
+ };
385
+
386
+ const actorAbortSignal = this.#actor.abortSignal;
387
+ const onActorAbort = () =>
388
+ listener.reject(new errors.ActorAborted());
389
+ if (actorAbortSignal.aborted) {
390
+ onActorAbort();
391
+ return;
392
+ }
393
+ actorAbortSignal.addEventListener("abort", onActorAbort, {
394
+ once: true,
395
+ });
396
+ listener.actorAbortCleanup = () =>
397
+ actorAbortSignal.removeEventListener("abort", onActorAbort);
398
+
399
+ if (abortSignal) {
400
+ const onAbort = () =>
401
+ listener.reject(new errors.ActorAborted());
402
+ if (abortSignal.aborted) {
403
+ onAbort();
404
+ return;
405
+ }
406
+ abortSignal.addEventListener("abort", onAbort, { once: true });
407
+ listener.signalAbortCleanup = () =>
408
+ abortSignal.removeEventListener("abort", onAbort);
409
+ }
410
+
411
+ this.#messageListeners.add(listener);
412
+ });
413
+ }
414
+
415
+ /** Returns all messages currently in the queue without removing them. */
416
+ async getMessages(): Promise<QueueMessage[]> {
417
+ return await this.#loadQueueMessages();
418
+ }
419
+
420
+ /** Deletes messages matching the provided IDs. Returns the IDs that were removed. */
421
+ async deleteMessagesById(ids: bigint[]): Promise<bigint[]> {
422
+ if (ids.length === 0) {
423
+ return [];
424
+ }
425
+ const idSet = new Set(ids.map((id) => id.toString()));
426
+ const entries = await this.#loadQueueMessages();
427
+ const toRemove = entries.filter((entry) =>
428
+ idSet.has(entry.id.toString()),
429
+ );
430
+ if (toRemove.length === 0) {
431
+ return [];
432
+ }
433
+ await this.#removeMessages(toRemove);
434
+ return toRemove.map((entry) => entry.id);
435
+ }
436
+
437
+ async #drainMessages(
438
+ nameSet: Set<string> | undefined,
439
+ count: number,
440
+ completable: boolean,
441
+ ): Promise<QueueMessage[]> {
442
+ if (this.#metadata.size === 0) {
443
+ return [];
444
+ }
445
+ const entries = await this.#loadQueueMessages();
446
+ const matched = nameSet
447
+ ? entries.filter((entry) => nameSet.has(entry.name))
448
+ : entries;
449
+ if (matched.length === 0) {
450
+ return [];
451
+ }
452
+
453
+ const selected = matched.slice(0, count);
454
+ if (!completable) {
455
+ await this.#removeMessages(selected);
456
+ }
457
+ const now = Date.now();
458
+ for (const message of selected) {
459
+ this.#actor.emitTraceEvent("queue.message.receive", {
460
+ "rivet.queue.name": message.name,
461
+ "rivet.queue.message_id": message.id.toString(),
462
+ "rivet.queue.created_at_ms": message.createdAt,
463
+ "rivet.queue.latency_ms": now - message.createdAt,
464
+ });
465
+ }
466
+ return selected;
467
+ }
468
+
469
+ async #loadQueueMessages(): Promise<QueueMessage[]> {
470
+ const entries = await this.#driver.kvListPrefix(
471
+ this.#actor.id,
472
+ QUEUE_MESSAGES_PREFIX,
473
+ );
474
+ const decoded: QueueMessage[] = [];
475
+ for (const [key, value] of entries) {
476
+ try {
477
+ const messageId = decodeQueueMessageKey(key);
478
+ const decodedPayload =
479
+ QUEUE_MESSAGE_VERSIONED.deserializeWithEmbeddedVersion(
480
+ value,
481
+ );
482
+ const body = cbor.decode(new Uint8Array(decodedPayload.body));
483
+ decoded.push({
484
+ id: messageId,
485
+ name: decodedPayload.name,
486
+ body,
487
+ createdAt: Number(decodedPayload.createdAt),
488
+ });
489
+ } catch (error) {
490
+ this.#actor.rLog.error({
491
+ msg: "failed to decode queue message",
492
+ error,
493
+ });
494
+ }
495
+ }
496
+ decoded.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
497
+ if (this.#metadata.size !== decoded.length) {
498
+ this.#metadata.size = decoded.length;
499
+ this.#actor.inspector.updateQueueSize(this.#metadata.size);
500
+ }
501
+ return decoded;
502
+ }
503
+
504
+ #removeMessageListener(listener: MessageListener): void {
505
+ if (this.#messageListeners.delete(listener)) {
506
+ listener.actorAbortCleanup?.();
507
+ listener.signalAbortCleanup?.();
508
+ }
509
+ }
510
+
511
+ #notifyMessageListeners(name: string): void {
512
+ if (this.#messageListeners.size === 0) {
513
+ return;
514
+ }
515
+ for (const listener of [...this.#messageListeners]) {
516
+ if (listener.nameSet && !listener.nameSet.has(name)) {
517
+ continue;
518
+ }
519
+ this.#removeMessageListener(listener);
520
+ listener.resolve();
521
+ }
522
+ }
523
+
524
+ async #removeMessages(messages: QueueMessage[]): Promise<void> {
525
+ if (messages.length === 0) {
526
+ return;
527
+ }
528
+ const keys = messages.map((message) => makeQueueMessageKey(message.id));
529
+
530
+ // Update metadata
531
+ this.#metadata.size = Math.max(
532
+ 0,
533
+ this.#metadata.size - messages.length,
534
+ );
535
+
536
+ // Delete messages and update metadata
537
+ // Note: kvBatchDelete doesn't support mixed operations, so we do two calls
538
+ await this.#driver.kvBatchDelete(this.#actor.id, keys);
539
+ await this.#driver.kvBatchPut(this.#actor.id, [
540
+ [QUEUE_METADATA_KEY, this.#serializeMetadata()],
541
+ ]);
542
+
543
+ this.#actor.inspector.updateQueueSize(this.#metadata.size);
544
+ }
545
+
546
+ async #maybeResolveWaiters() {
547
+ if (this.#waiters.size === 0) {
548
+ return;
549
+ }
550
+ const pending = [...this.#waiters.values()];
551
+ for (const waiter of pending) {
552
+ const messages = await this.#drainMessages(
553
+ waiter.nameSet,
554
+ waiter.count,
555
+ waiter.completable,
556
+ );
557
+ if (messages.length === 0) {
558
+ continue;
559
+ }
560
+ this.#waiters.delete(waiter.id);
561
+ waiter.resolve(messages);
562
+ }
563
+ }
564
+
565
+ /** Rebuilds metadata by scanning existing queue messages. Used when metadata is corrupted. */
566
+ async #rebuildMetadata(): Promise<void> {
567
+ const entries = await this.#driver.kvListPrefix(
568
+ this.#actor.id,
569
+ QUEUE_MESSAGES_PREFIX,
570
+ );
571
+
572
+ let maxId = 0n;
573
+ for (const [key] of entries) {
574
+ try {
575
+ const messageId = decodeQueueMessageKey(key);
576
+ if (messageId > maxId) {
577
+ maxId = messageId;
578
+ }
579
+ } catch {
580
+ // Skip malformed keys
581
+ }
582
+ }
583
+
584
+ this.#metadata.nextId = maxId + 1n;
585
+ this.#metadata.size = entries.length;
586
+
587
+ await this.#driver.kvBatchPut(this.#actor.id, [
588
+ [QUEUE_METADATA_KEY, this.#serializeMetadata()],
589
+ ]);
590
+ this.#actor.inspector.updateQueueSize(this.#metadata.size);
591
+ }
592
+
593
+ #serializeMetadata(): Uint8Array {
594
+ return QUEUE_METADATA_VERSIONED.serializeWithEmbeddedVersion(
595
+ {
596
+ nextId: this.#metadata.nextId,
597
+ size: this.#metadata.size,
598
+ },
599
+ ACTOR_PERSIST_CURRENT_VERSION,
600
+ );
601
+ }
602
+
603
+ }