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,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
+ }