rivetkit 2.0.2 → 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 (403) hide show
  1. package/README.md +3 -5
  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 +225 -0
  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 +441 -0
  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 +108 -0
  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 +106 -0
  26. package/dist/tsup/actor/errors.cjs.map +1 -0
  27. package/dist/tsup/actor/errors.d.cts +188 -0
  28. package/dist/tsup/actor/errors.d.ts +188 -0
  29. package/dist/tsup/actor/errors.js +106 -0
  30. package/dist/tsup/actor/errors.js.map +1 -0
  31. package/dist/tsup/actor-router-consts-D29T1Z-K.d.cts +24 -0
  32. package/dist/tsup/actor-router-consts-D29T1Z-K.d.ts +24 -0
  33. package/dist/tsup/chunk-325TLXJT.js +1060 -0
  34. package/dist/tsup/chunk-325TLXJT.js.map +1 -0
  35. package/dist/tsup/chunk-424PT5DM.js +23 -0
  36. package/dist/tsup/chunk-424PT5DM.js.map +1 -0
  37. package/dist/tsup/chunk-4JVIG3SS.cjs +6289 -0
  38. package/dist/tsup/chunk-4JVIG3SS.cjs.map +1 -0
  39. package/dist/tsup/chunk-6LJAZ5R4.cjs +96 -0
  40. package/dist/tsup/chunk-6LJAZ5R4.cjs.map +1 -0
  41. package/dist/tsup/chunk-6XU3FMCB.cjs +534 -0
  42. package/dist/tsup/chunk-6XU3FMCB.cjs.map +1 -0
  43. package/dist/tsup/chunk-7HTNH26M.js +509 -0
  44. package/dist/tsup/chunk-7HTNH26M.js.map +1 -0
  45. package/dist/tsup/chunk-AUVH72RE.cjs +5977 -0
  46. package/dist/tsup/chunk-AUVH72RE.cjs.map +1 -0
  47. package/dist/tsup/chunk-D4BYUPNQ.js +645 -0
  48. package/dist/tsup/chunk-D4BYUPNQ.js.map +1 -0
  49. package/dist/tsup/chunk-HDQ2JUQT.cjs +23 -0
  50. package/dist/tsup/chunk-HDQ2JUQT.cjs.map +1 -0
  51. package/dist/tsup/chunk-HHXX2VRM.js +6289 -0
  52. package/dist/tsup/chunk-HHXX2VRM.js.map +1 -0
  53. package/dist/tsup/chunk-JEAEA2PB.js +49 -0
  54. package/dist/tsup/chunk-JEAEA2PB.js.map +1 -0
  55. package/dist/tsup/chunk-JYSEG3VF.cjs +642 -0
  56. package/dist/tsup/chunk-JYSEG3VF.cjs.map +1 -0
  57. package/dist/tsup/chunk-K6DGYILQ.js +2657 -0
  58. package/dist/tsup/chunk-K6DGYILQ.js.map +1 -0
  59. package/dist/tsup/chunk-KJSYAUOM.js +96 -0
  60. package/dist/tsup/chunk-KJSYAUOM.js.map +1 -0
  61. package/dist/tsup/chunk-L47L3ZWJ.cjs +509 -0
  62. package/dist/tsup/chunk-L47L3ZWJ.cjs.map +1 -0
  63. package/dist/tsup/chunk-LXUQ667X.js +2006 -0
  64. package/dist/tsup/chunk-LXUQ667X.js.map +1 -0
  65. package/dist/tsup/chunk-MXNPAB5W.js +5977 -0
  66. package/dist/tsup/chunk-MXNPAB5W.js.map +1 -0
  67. package/dist/tsup/chunk-N4KRDJ56.js +72 -0
  68. package/dist/tsup/chunk-N4KRDJ56.js.map +1 -0
  69. package/dist/tsup/chunk-NIYZDWMW.cjs +2006 -0
  70. package/dist/tsup/chunk-NIYZDWMW.cjs.map +1 -0
  71. package/dist/tsup/chunk-PQZHDKRW.cjs +1060 -0
  72. package/dist/tsup/chunk-PQZHDKRW.cjs.map +1 -0
  73. package/dist/tsup/chunk-PVOE6BU7.cjs +1050 -0
  74. package/dist/tsup/chunk-PVOE6BU7.cjs.map +1 -0
  75. package/dist/tsup/chunk-Q4UD2GA4.cjs +1810 -0
  76. package/dist/tsup/chunk-Q4UD2GA4.cjs.map +1 -0
  77. package/dist/tsup/chunk-QUD664YZ.js +1810 -0
  78. package/dist/tsup/chunk-QUD664YZ.js.map +1 -0
  79. package/dist/tsup/chunk-RTOCTWME.js +1050 -0
  80. package/dist/tsup/chunk-RTOCTWME.js.map +1 -0
  81. package/dist/tsup/chunk-SAZZ4SB2.cjs +2657 -0
  82. package/dist/tsup/chunk-SAZZ4SB2.cjs.map +1 -0
  83. package/dist/tsup/chunk-SR3KQE7Q.cjs +72 -0
  84. package/dist/tsup/chunk-SR3KQE7Q.cjs.map +1 -0
  85. package/dist/tsup/chunk-V2GHLYC6.cjs +49 -0
  86. package/dist/tsup/chunk-V2GHLYC6.cjs.map +1 -0
  87. package/dist/tsup/chunk-V3WG7XTW.cjs +645 -0
  88. package/dist/tsup/chunk-V3WG7XTW.cjs.map +1 -0
  89. package/dist/tsup/chunk-VKVNIQRQ.js +257 -0
  90. package/dist/tsup/chunk-VKVNIQRQ.js.map +1 -0
  91. package/dist/tsup/chunk-WMPW7JYC.js +642 -0
  92. package/dist/tsup/chunk-WMPW7JYC.js.map +1 -0
  93. package/dist/tsup/chunk-Z7HNQ2WF.js +534 -0
  94. package/dist/tsup/chunk-Z7HNQ2WF.js.map +1 -0
  95. package/dist/tsup/chunk-ZFY5J2EP.cjs +257 -0
  96. package/dist/tsup/chunk-ZFY5J2EP.cjs.map +1 -0
  97. package/dist/tsup/client/mod.cjs +33 -0
  98. package/dist/tsup/client/mod.cjs.map +1 -0
  99. package/dist/tsup/client/mod.d.cts +64 -0
  100. package/dist/tsup/client/mod.d.ts +64 -0
  101. package/dist/tsup/client/mod.js +33 -0
  102. package/dist/tsup/client/mod.js.map +1 -0
  103. package/dist/tsup/common/log.cjs +21 -0
  104. package/dist/tsup/common/log.cjs.map +1 -0
  105. package/dist/tsup/common/log.d.cts +34 -0
  106. package/dist/tsup/common/log.d.ts +34 -0
  107. package/dist/tsup/common/log.js +21 -0
  108. package/dist/tsup/common/log.js.map +1 -0
  109. package/dist/tsup/common/websocket.cjs +10 -0
  110. package/dist/tsup/common/websocket.cjs.map +1 -0
  111. package/dist/tsup/common/websocket.d.cts +3 -0
  112. package/dist/tsup/common/websocket.d.ts +3 -0
  113. package/dist/tsup/common/websocket.js +10 -0
  114. package/dist/tsup/common/websocket.js.map +1 -0
  115. package/dist/tsup/config-BiNoIHRs.d.cts +80 -0
  116. package/dist/tsup/config-BiNoIHRs.d.ts +80 -0
  117. package/dist/tsup/config-P3XujgRr.d.ts +2594 -0
  118. package/dist/tsup/config-_gfywqqI.d.cts +2594 -0
  119. package/dist/tsup/context-Bxd8Cx4H.d.cts +75 -0
  120. package/dist/tsup/context-uNA4TRn3.d.ts +75 -0
  121. package/dist/tsup/db/drizzle/mod.cjs +49 -0
  122. package/dist/tsup/db/drizzle/mod.cjs.map +1 -0
  123. package/dist/tsup/db/drizzle/mod.d.cts +17 -0
  124. package/dist/tsup/db/drizzle/mod.d.ts +17 -0
  125. package/dist/tsup/db/drizzle/mod.js +49 -0
  126. package/dist/tsup/db/drizzle/mod.js.map +1 -0
  127. package/dist/tsup/db/mod.cjs +9 -0
  128. package/dist/tsup/db/mod.cjs.map +1 -0
  129. package/dist/tsup/db/mod.d.cts +9 -0
  130. package/dist/tsup/db/mod.d.ts +9 -0
  131. package/dist/tsup/db/mod.js +9 -0
  132. package/dist/tsup/db/mod.js.map +1 -0
  133. package/dist/tsup/driver-BcLvZcKl.d.cts +13 -0
  134. package/dist/tsup/driver-CPGHKXyh.d.ts +13 -0
  135. package/dist/tsup/driver-helpers/mod.cjs +53 -0
  136. package/dist/tsup/driver-helpers/mod.cjs.map +1 -0
  137. package/dist/tsup/driver-helpers/mod.d.cts +47 -0
  138. package/dist/tsup/driver-helpers/mod.d.ts +47 -0
  139. package/dist/tsup/driver-helpers/mod.js +53 -0
  140. package/dist/tsup/driver-helpers/mod.js.map +1 -0
  141. package/dist/tsup/driver-test-suite/mod.cjs +4974 -0
  142. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -0
  143. package/dist/tsup/driver-test-suite/mod.d.cts +73 -0
  144. package/dist/tsup/driver-test-suite/mod.d.ts +73 -0
  145. package/dist/tsup/driver-test-suite/mod.js +4974 -0
  146. package/dist/tsup/driver-test-suite/mod.js.map +1 -0
  147. package/dist/tsup/inspector/mod.cjs +164 -0
  148. package/dist/tsup/inspector/mod.cjs.map +1 -0
  149. package/dist/tsup/inspector/mod.d.cts +130 -0
  150. package/dist/tsup/inspector/mod.d.ts +130 -0
  151. package/dist/tsup/inspector/mod.js +164 -0
  152. package/dist/tsup/inspector/mod.js.map +1 -0
  153. package/dist/tsup/keys-CydblqMh.d.cts +13 -0
  154. package/dist/tsup/keys-CydblqMh.d.ts +13 -0
  155. package/dist/tsup/mod.cjs +82 -0
  156. package/dist/tsup/mod.cjs.map +1 -0
  157. package/dist/tsup/mod.d.cts +126 -0
  158. package/dist/tsup/mod.d.ts +126 -0
  159. package/dist/tsup/mod.js +82 -0
  160. package/dist/tsup/mod.js.map +1 -0
  161. package/dist/tsup/serve-test-suite/mod.cjs +2601 -0
  162. package/dist/tsup/serve-test-suite/mod.cjs.map +1 -0
  163. package/dist/tsup/serve-test-suite/mod.d.cts +9 -0
  164. package/dist/tsup/serve-test-suite/mod.d.ts +9 -0
  165. package/dist/tsup/serve-test-suite/mod.js +2601 -0
  166. package/dist/tsup/serve-test-suite/mod.js.map +1 -0
  167. package/dist/tsup/test/mod.cjs +90 -0
  168. package/dist/tsup/test/mod.cjs.map +1 -0
  169. package/dist/tsup/test/mod.d.cts +26 -0
  170. package/dist/tsup/test/mod.d.ts +26 -0
  171. package/dist/tsup/test/mod.js +90 -0
  172. package/dist/tsup/test/mod.js.map +1 -0
  173. package/dist/tsup/utils-fwx3o3K9.d.cts +18 -0
  174. package/dist/tsup/utils-fwx3o3K9.d.ts +18 -0
  175. package/dist/tsup/utils.cjs +43 -0
  176. package/dist/tsup/utils.cjs.map +1 -0
  177. package/dist/tsup/utils.d.cts +148 -0
  178. package/dist/tsup/utils.d.ts +148 -0
  179. package/dist/tsup/utils.js +43 -0
  180. package/dist/tsup/utils.js.map +1 -0
  181. package/dist/tsup/v3-DnYObHH3.d.cts +279 -0
  182. package/dist/tsup/v3-DnYObHH3.d.ts +279 -0
  183. package/dist/tsup/workflow/mod.cjs +16 -0
  184. package/dist/tsup/workflow/mod.cjs.map +1 -0
  185. package/dist/tsup/workflow/mod.d.cts +25 -0
  186. package/dist/tsup/workflow/mod.d.ts +25 -0
  187. package/dist/tsup/workflow/mod.js +16 -0
  188. package/dist/tsup/workflow/mod.js.map +1 -0
  189. package/package.json +293 -5
  190. package/src/actor/config.ts +1221 -0
  191. package/src/actor/conn/driver.ts +61 -0
  192. package/src/actor/conn/drivers/http.ts +17 -0
  193. package/src/actor/conn/drivers/raw-request.ts +24 -0
  194. package/src/actor/conn/drivers/raw-websocket.ts +65 -0
  195. package/src/actor/conn/drivers/websocket.ts +144 -0
  196. package/src/actor/conn/mod.ts +288 -0
  197. package/src/actor/conn/persisted.ts +81 -0
  198. package/src/actor/conn/state-manager.ts +196 -0
  199. package/src/actor/contexts/action.ts +47 -0
  200. package/src/actor/contexts/base/actor.ts +347 -0
  201. package/src/actor/contexts/base/conn-init.ts +68 -0
  202. package/src/actor/contexts/base/conn.ts +73 -0
  203. package/src/actor/contexts/before-action-response.ts +42 -0
  204. package/src/actor/contexts/before-connect.ts +31 -0
  205. package/src/actor/contexts/connect.ts +42 -0
  206. package/src/actor/contexts/create-conn-state.ts +32 -0
  207. package/src/actor/contexts/create-vars.ts +39 -0
  208. package/src/actor/contexts/create.ts +39 -0
  209. package/src/actor/contexts/destroy.ts +42 -0
  210. package/src/actor/contexts/disconnect.ts +43 -0
  211. package/src/actor/contexts/index.ts +33 -0
  212. package/src/actor/contexts/request.ts +80 -0
  213. package/src/actor/contexts/run.ts +47 -0
  214. package/src/actor/contexts/sleep.ts +42 -0
  215. package/src/actor/contexts/state-change.ts +42 -0
  216. package/src/actor/contexts/wake.ts +42 -0
  217. package/src/actor/contexts/websocket.ts +80 -0
  218. package/src/actor/database.ts +13 -0
  219. package/src/actor/definition.ts +64 -0
  220. package/src/actor/driver.ts +114 -0
  221. package/src/actor/errors.ts +556 -0
  222. package/src/actor/instance/connection-manager.ts +574 -0
  223. package/src/actor/instance/event-manager.ts +314 -0
  224. package/src/actor/instance/keys.ts +146 -0
  225. package/src/actor/instance/kv.ts +241 -0
  226. package/src/actor/instance/mod.ts +1658 -0
  227. package/src/actor/instance/persisted.ts +67 -0
  228. package/src/actor/instance/queue-manager.ts +603 -0
  229. package/src/actor/instance/queue.ts +345 -0
  230. package/src/actor/instance/schedule-manager.ts +392 -0
  231. package/src/actor/instance/state-manager.ts +542 -0
  232. package/src/actor/instance/traces-driver.ts +128 -0
  233. package/src/actor/keys.test.ts +275 -0
  234. package/src/actor/keys.ts +89 -0
  235. package/src/actor/log.ts +6 -0
  236. package/src/actor/mod.ts +110 -0
  237. package/src/actor/protocol/old.ts +416 -0
  238. package/src/actor/protocol/serde.ts +222 -0
  239. package/src/actor/router-endpoints.ts +400 -0
  240. package/src/actor/router-websocket-endpoints.test.ts +54 -0
  241. package/src/actor/router-websocket-endpoints.ts +405 -0
  242. package/src/actor/router.ts +380 -0
  243. package/src/actor/schedule.ts +17 -0
  244. package/src/actor/schema.ts +291 -0
  245. package/src/actor/utils.test.ts +48 -0
  246. package/src/actor/utils.ts +158 -0
  247. package/src/client/actor-common.ts +32 -0
  248. package/src/client/actor-conn.ts +1262 -0
  249. package/src/client/actor-handle.ts +344 -0
  250. package/src/client/actor-query.ts +112 -0
  251. package/src/client/client.ts +558 -0
  252. package/src/client/config.ts +151 -0
  253. package/src/client/errors.ts +76 -0
  254. package/src/client/log.ts +5 -0
  255. package/src/client/mod.browser.ts +2 -0
  256. package/src/client/mod.ts +70 -0
  257. package/src/client/queue.ts +146 -0
  258. package/src/client/raw-utils.ts +149 -0
  259. package/src/client/test.ts +44 -0
  260. package/src/client/utils.ts +252 -0
  261. package/src/common/actor-router-consts.ts +59 -0
  262. package/src/common/cors.ts +57 -0
  263. package/src/common/eventsource-interface.ts +47 -0
  264. package/src/common/eventsource.ts +44 -0
  265. package/src/common/inline-websocket-adapter.ts +154 -0
  266. package/src/common/log-levels.ts +27 -0
  267. package/src/common/log.ts +229 -0
  268. package/src/common/logfmt.ts +221 -0
  269. package/src/common/network.ts +2 -0
  270. package/src/common/router.ts +174 -0
  271. package/src/common/utils.ts +339 -0
  272. package/src/common/websocket-interface.ts +7 -0
  273. package/src/common/websocket.ts +43 -0
  274. package/src/db/config.ts +100 -0
  275. package/src/db/drizzle/mod.ts +226 -0
  276. package/src/db/drizzle/sqlite-core.ts +22 -0
  277. package/src/db/mod.ts +125 -0
  278. package/src/db/shared.ts +92 -0
  279. package/src/db/sqlite-vfs.ts +12 -0
  280. package/src/devtools-loader/index.ts +33 -0
  281. package/src/devtools-loader/log.ts +5 -0
  282. package/src/driver-helpers/mod.ts +33 -0
  283. package/src/driver-helpers/utils.ts +54 -0
  284. package/src/driver-test-suite/log.ts +5 -0
  285. package/src/driver-test-suite/mod.ts +293 -0
  286. package/src/driver-test-suite/test-inline-client-driver.ts +307 -0
  287. package/src/driver-test-suite/tests/access-control.ts +218 -0
  288. package/src/driver-test-suite/tests/action-features.ts +203 -0
  289. package/src/driver-test-suite/tests/actor-conn-hibernation.ts +152 -0
  290. package/src/driver-test-suite/tests/actor-conn-state.ts +300 -0
  291. package/src/driver-test-suite/tests/actor-conn.ts +596 -0
  292. package/src/driver-test-suite/tests/actor-db-raw.ts +73 -0
  293. package/src/driver-test-suite/tests/actor-db.ts +477 -0
  294. package/src/driver-test-suite/tests/actor-destroy.ts +294 -0
  295. package/src/driver-test-suite/tests/actor-driver.ts +18 -0
  296. package/src/driver-test-suite/tests/actor-error-handling.ts +150 -0
  297. package/src/driver-test-suite/tests/actor-handle.ts +312 -0
  298. package/src/driver-test-suite/tests/actor-inline-client.ts +163 -0
  299. package/src/driver-test-suite/tests/actor-inspector.ts +264 -0
  300. package/src/driver-test-suite/tests/actor-kv.ts +65 -0
  301. package/src/driver-test-suite/tests/actor-metadata.ts +116 -0
  302. package/src/driver-test-suite/tests/actor-onstatechange.ts +95 -0
  303. package/src/driver-test-suite/tests/actor-queue.ts +325 -0
  304. package/src/driver-test-suite/tests/actor-run.ts +181 -0
  305. package/src/driver-test-suite/tests/actor-schedule.ts +97 -0
  306. package/src/driver-test-suite/tests/actor-sleep.ts +415 -0
  307. package/src/driver-test-suite/tests/actor-state.ts +54 -0
  308. package/src/driver-test-suite/tests/actor-stateless.ts +70 -0
  309. package/src/driver-test-suite/tests/actor-vars.ts +97 -0
  310. package/src/driver-test-suite/tests/actor-workflow.ts +118 -0
  311. package/src/driver-test-suite/tests/manager-driver.ts +388 -0
  312. package/src/driver-test-suite/tests/raw-http-direct-registry.ts +227 -0
  313. package/src/driver-test-suite/tests/raw-http-request-properties.ts +454 -0
  314. package/src/driver-test-suite/tests/raw-http.ts +359 -0
  315. package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +393 -0
  316. package/src/driver-test-suite/tests/raw-websocket.ts +513 -0
  317. package/src/driver-test-suite/tests/request-access.ts +240 -0
  318. package/src/driver-test-suite/utils.ts +80 -0
  319. package/src/drivers/default.ts +38 -0
  320. package/src/drivers/engine/actor-driver.ts +1027 -0
  321. package/src/drivers/engine/config.ts +43 -0
  322. package/src/drivers/engine/log.ts +5 -0
  323. package/src/drivers/engine/mod.ts +36 -0
  324. package/src/drivers/file-system/actor.ts +102 -0
  325. package/src/drivers/file-system/global-state.ts +1445 -0
  326. package/src/drivers/file-system/kv-limits.ts +70 -0
  327. package/src/drivers/file-system/log.ts +5 -0
  328. package/src/drivers/file-system/manager.ts +300 -0
  329. package/src/drivers/file-system/mod.ts +78 -0
  330. package/src/drivers/file-system/sqlite-runtime.ts +210 -0
  331. package/src/drivers/file-system/utils.ts +125 -0
  332. package/src/engine-process/constants.ts +2 -0
  333. package/src/engine-process/log.ts +5 -0
  334. package/src/engine-process/mod.ts +464 -0
  335. package/src/globals.d.ts +35 -0
  336. package/src/inspector/actor-inspector.ts +352 -0
  337. package/src/inspector/config.ts +49 -0
  338. package/src/inspector/handler.ts +273 -0
  339. package/src/inspector/log.ts +5 -0
  340. package/src/inspector/mod.browser.ts +8 -0
  341. package/src/inspector/mod.ts +4 -0
  342. package/src/inspector/serve-ui.ts +40 -0
  343. package/src/inspector/transport.ts +18 -0
  344. package/src/inspector/utils.ts +32 -0
  345. package/src/manager/driver.ts +106 -0
  346. package/src/manager/gateway.ts +668 -0
  347. package/src/manager/log.ts +5 -0
  348. package/src/manager/mod.ts +2 -0
  349. package/src/manager/protocol/mod.ts +22 -0
  350. package/src/manager/protocol/query.ts +85 -0
  351. package/src/manager/router-schema.ts +22 -0
  352. package/src/manager/router.ts +660 -0
  353. package/src/manager-api/actors.ts +83 -0
  354. package/src/manager-api/common.ts +4 -0
  355. package/src/mod.ts +24 -0
  356. package/src/registry/config/driver.ts +21 -0
  357. package/src/registry/config/index.ts +510 -0
  358. package/src/registry/config/legacy-runner.ts +157 -0
  359. package/src/registry/config/runner.ts +21 -0
  360. package/src/registry/config/serverless.ts +94 -0
  361. package/src/registry/index.ts +194 -0
  362. package/src/registry/log.ts +5 -0
  363. package/src/remote-manager-driver/actor-http-client.ts +84 -0
  364. package/src/remote-manager-driver/actor-websocket-client.ts +81 -0
  365. package/src/remote-manager-driver/api-endpoints.ts +159 -0
  366. package/src/remote-manager-driver/api-utils.ts +69 -0
  367. package/src/remote-manager-driver/log.ts +5 -0
  368. package/src/remote-manager-driver/metadata.ts +64 -0
  369. package/src/remote-manager-driver/mod.ts +414 -0
  370. package/src/remote-manager-driver/ws-proxy.ts +189 -0
  371. package/src/schemas/actor-inspector/mod.ts +1 -0
  372. package/src/schemas/actor-inspector/versioned.ts +233 -0
  373. package/src/schemas/actor-persist/mod.ts +1 -0
  374. package/src/schemas/actor-persist/versioned.ts +217 -0
  375. package/src/schemas/client-protocol/mod.ts +1 -0
  376. package/src/schemas/client-protocol/versioned.ts +330 -0
  377. package/src/schemas/client-protocol-zod/mod.ts +118 -0
  378. package/src/schemas/file-system-driver/mod.ts +1 -0
  379. package/src/schemas/file-system-driver/versioned.ts +135 -0
  380. package/src/schemas/persist/mod.ts +1 -0
  381. package/src/schemas/transport/mod.ts +1 -0
  382. package/src/serde.ts +138 -0
  383. package/src/serve-test-suite/mod.ts +148 -0
  384. package/src/serverless/configure.ts +82 -0
  385. package/src/serverless/log.ts +5 -0
  386. package/src/serverless/router.test.ts +299 -0
  387. package/src/serverless/router.ts +215 -0
  388. package/src/test/log.ts +5 -0
  389. package/src/test/mod.ts +99 -0
  390. package/src/utils/crypto.ts +24 -0
  391. package/src/utils/endpoint-parser.test.ts +202 -0
  392. package/src/utils/endpoint-parser.ts +124 -0
  393. package/src/utils/env-vars.ts +78 -0
  394. package/src/utils/node.ts +178 -0
  395. package/src/utils/router.ts +83 -0
  396. package/src/utils/serve.ts +212 -0
  397. package/src/utils.test.ts +34 -0
  398. package/src/utils.ts +437 -0
  399. package/src/workflow/constants.ts +2 -0
  400. package/src/workflow/context.ts +597 -0
  401. package/src/workflow/driver.ts +194 -0
  402. package/src/workflow/inspector.ts +268 -0
  403. package/src/workflow/mod.ts +128 -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
+ }