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,574 @@
1
+ import { HibernatingWebSocketMetadata } from "@rivetkit/engine-runner";
2
+ import * as cbor from "cbor-x";
3
+ import invariant from "invariant";
4
+ import { CONN_VERSIONED } from "@/schemas/actor-persist/versioned";
5
+ import {
6
+ CURRENT_VERSION as CLIENT_PROTOCOL_CURRENT_VERSION,
7
+ TO_CLIENT_VERSIONED,
8
+ } from "@/schemas/client-protocol/versioned";
9
+ import { ToClientSchema } from "@/schemas/client-protocol-zod/mod";
10
+ import { arrayBuffersEqual, stringifyError } from "@/utils";
11
+ import type { ConnDriver } from "../conn/driver";
12
+ import {
13
+ CONN_CONNECTED_SYMBOL,
14
+ CONN_DRIVER_SYMBOL,
15
+ CONN_SEND_MESSAGE_SYMBOL,
16
+ CONN_SPEAKS_RIVETKIT_SYMBOL,
17
+ CONN_STATE_MANAGER_SYMBOL,
18
+ Conn,
19
+ type ConnId,
20
+ } from "../conn/mod";
21
+ import {
22
+ convertConnToBarePersistedConn,
23
+ type PersistedConn,
24
+ } from "../conn/persisted";
25
+ import type { ConnDataInput } from "../conn/state-manager";
26
+ import {
27
+ BeforeConnectContext,
28
+ ConnectContext,
29
+ CreateConnStateContext,
30
+ } from "../contexts";
31
+ import type { AnyDatabaseProvider } from "../database";
32
+ import { CachedSerializer } from "../protocol/serde";
33
+ import type { EventSchemaConfig, QueueSchemaConfig } from "../schema";
34
+ import { deadline } from "../utils";
35
+ import { makeConnKey } from "./keys";
36
+ import type { ActorInstance } from "./mod";
37
+ /**
38
+ * Manages all connection-related operations for an actor instance.
39
+ * Handles connection creation, tracking, hibernation, and cleanup.
40
+ */
41
+ export class ConnectionManager<
42
+ S,
43
+ CP,
44
+ CS,
45
+ V,
46
+ I,
47
+ DB extends AnyDatabaseProvider,
48
+ E extends EventSchemaConfig = Record<never, never>,
49
+ Q extends QueueSchemaConfig = Record<never, never>,
50
+ > {
51
+ #actor: ActorInstance<S, CP, CS, V, I, DB, E, Q>;
52
+ #connections = new Map<ConnId, Conn<S, CP, CS, V, I, DB, E, Q>>();
53
+ #pendingDisconnectCount = 0;
54
+
55
+ /** Connections that have had their state changed and need to be persisted. */
56
+ #connsWithPersistChanged = new Set<ConnId>();
57
+
58
+ constructor(actor: ActorInstance<S, CP, CS, V, I, DB, E, Q>) {
59
+ this.#actor = actor;
60
+ }
61
+
62
+ get connections(): Map<ConnId, Conn<S, CP, CS, V, I, DB, E, Q>> {
63
+ return this.#connections;
64
+ }
65
+
66
+ getConnForId(id: string): Conn<S, CP, CS, V, I, DB, E, Q> | undefined {
67
+ return this.#connections.get(id);
68
+ }
69
+
70
+ get connsWithPersistChanged(): Set<ConnId> {
71
+ return this.#connsWithPersistChanged;
72
+ }
73
+
74
+ get pendingDisconnectCount(): number {
75
+ return this.#pendingDisconnectCount;
76
+ }
77
+
78
+ clearConnWithPersistChanged() {
79
+ this.#connsWithPersistChanged.clear();
80
+ }
81
+
82
+ markConnWithPersistChanged(conn: Conn<S, CP, CS, V, I, DB, E, Q>) {
83
+ invariant(
84
+ conn.isHibernatable,
85
+ "cannot mark non-hibernatable conn for persist",
86
+ );
87
+
88
+ this.#actor.rLog.debug({
89
+ msg: "marked connection as changed",
90
+ connId: conn.id,
91
+ totalChanged: this.#connsWithPersistChanged.size,
92
+ });
93
+
94
+ this.#connsWithPersistChanged.add(conn.id);
95
+
96
+ this.#actor.stateManager.savePersistThrottled();
97
+ }
98
+
99
+ // MARK: - Connection Lifecycle
100
+ /**
101
+ * Handles pre-connection logic (i.e. auth & create state) before actually connecting the connection.
102
+ */
103
+ async prepareConn(
104
+ driver: ConnDriver,
105
+ params: CP,
106
+ request: Request | undefined,
107
+ requestPath: string | undefined,
108
+ requestHeaders: Record<string, string> | undefined,
109
+ isHibernatable: boolean,
110
+ isRestoringHibernatable: boolean,
111
+ ): Promise<Conn<S, CP, CS, V, I, DB, E, Q>> {
112
+ this.#actor.assertReady();
113
+
114
+ // TODO: Add back
115
+ // const url = request?.url;
116
+ // invariant(
117
+ // url?.startsWith("http://actor/") ?? true,
118
+ // `url ${url} must start with 'http://actor/'`,
119
+ // );
120
+
121
+ // Check for hibernatable websocket reconnection
122
+ if (isRestoringHibernatable) {
123
+ return this.#reconnectHibernatableConn(driver);
124
+ }
125
+
126
+ // Create new connection
127
+ if (this.#actor.config.onBeforeConnect) {
128
+ const ctx = new BeforeConnectContext(this.#actor, request);
129
+ await this.#actor.runInTraceSpan(
130
+ "actor.onBeforeConnect",
131
+ {
132
+ "rivet.conn.type": driver.type,
133
+ },
134
+ () => this.#actor.config.onBeforeConnect!(ctx, params),
135
+ );
136
+ }
137
+
138
+ // Create connection state if enabled
139
+ let connState: CS | undefined;
140
+ if (this.#actor.connStateEnabled) {
141
+ connState = await this.#createConnState(params, request);
142
+ }
143
+
144
+ // Create connection persist data
145
+ let connData: ConnDataInput<CP, CS>;
146
+ if (isHibernatable) {
147
+ const hibernatable = driver.hibernatable;
148
+ invariant(hibernatable, "must have hibernatable");
149
+ invariant(requestPath, "missing requestPath for hibernatable ws");
150
+ invariant(
151
+ requestHeaders,
152
+ "missing requestHeaders for hibernatable ws",
153
+ );
154
+ connData = {
155
+ hibernatable: {
156
+ id: crypto.randomUUID(),
157
+ parameters: params,
158
+ state: connState as CS,
159
+ subscriptions: [],
160
+ gatewayId: hibernatable.gatewayId,
161
+ requestId: hibernatable.requestId,
162
+ clientMessageIndex: 0,
163
+ // First message index will be 1, so we start at 0
164
+ serverMessageIndex: 0,
165
+ requestPath,
166
+ requestHeaders,
167
+ },
168
+ };
169
+ } else {
170
+ connData = {
171
+ ephemeral: {
172
+ id: crypto.randomUUID(),
173
+ parameters: params,
174
+ state: connState as CS,
175
+ },
176
+ };
177
+ }
178
+
179
+ // Create connection instance
180
+ const conn = new Conn<S, CP, CS, V, I, DB, E, Q>(this.#actor, connData);
181
+ conn[CONN_DRIVER_SYMBOL] = driver;
182
+
183
+ return conn;
184
+ }
185
+
186
+ /**
187
+ * Adds a connection form prepareConn to the actor and calls onConnect.
188
+ *
189
+ * This method is intentionally not async since it needs to be called in
190
+ * `onOpen` for WebSockets. If this is async, the order of open events will
191
+ * be messed up and cause race conditions that can drop WebSocket messages.
192
+ * So all async work in prepareConn.
193
+ */
194
+ connectConn(conn: Conn<S, CP, CS, V, I, DB, E, Q>) {
195
+ invariant(!this.#connections.has(conn.id), "conn already connected");
196
+
197
+ this.#connections.set(conn.id, conn);
198
+
199
+ // Notify driver about new connection BEFORE marking as changed
200
+ //
201
+ // This ensures the driver can set up any necessary state (like #hwsMessageIndex)
202
+ // before saveState is triggered by markConnWithPersistChanged
203
+ if (this.#actor.driver.onCreateConn) {
204
+ this.#actor.driver.onCreateConn(conn);
205
+ }
206
+
207
+ if (conn.isHibernatable) {
208
+ this.markConnWithPersistChanged(conn);
209
+ }
210
+
211
+ this.#callOnConnect(conn);
212
+
213
+ this.#actor.inspector.emitter.emit("connectionsUpdated");
214
+
215
+ this.#actor.resetSleepTimer();
216
+
217
+ conn[CONN_CONNECTED_SYMBOL] = true;
218
+
219
+ // Send init message
220
+ if (conn[CONN_SPEAKS_RIVETKIT_SYMBOL]) {
221
+ const initData = { actorId: this.#actor.id, connectionId: conn.id };
222
+ conn[CONN_SEND_MESSAGE_SYMBOL](
223
+ new CachedSerializer(
224
+ initData,
225
+ TO_CLIENT_VERSIONED,
226
+ CLIENT_PROTOCOL_CURRENT_VERSION,
227
+ ToClientSchema,
228
+ // JSON: identity conversion (no nested data to encode)
229
+ (value) => ({
230
+ body: {
231
+ tag: "Init" as const,
232
+ val: value,
233
+ },
234
+ }),
235
+ // BARE/CBOR: identity conversion (no nested data to encode)
236
+ (value) => ({
237
+ body: {
238
+ tag: "Init" as const,
239
+ val: value,
240
+ },
241
+ }),
242
+ ),
243
+ );
244
+ }
245
+ }
246
+
247
+ #reconnectHibernatableConn(
248
+ driver: ConnDriver,
249
+ ): Conn<S, CP, CS, V, I, DB, E, Q> {
250
+ invariant(driver.hibernatable, "missing requestIdBuf");
251
+ const existingConn = this.findHibernatableConn(
252
+ driver.hibernatable.gatewayId,
253
+ driver.hibernatable.requestId,
254
+ );
255
+ invariant(
256
+ existingConn,
257
+ "cannot find connection for restoring connection",
258
+ );
259
+
260
+ this.#actor.rLog.debug({
261
+ msg: "reconnecting hibernatable websocket connection",
262
+ connectionId: existingConn.id,
263
+ });
264
+
265
+ // Clean up existing driver state if present
266
+ if (existingConn[CONN_DRIVER_SYMBOL]) {
267
+ this.#disconnectExistingDriver(existingConn);
268
+ }
269
+
270
+ // Update connection with new socket
271
+ existingConn[CONN_DRIVER_SYMBOL] = driver;
272
+
273
+ // Reset sleep timer since we have an active connection
274
+ this.#actor.resetSleepTimer();
275
+
276
+ // Mark connection as connected
277
+ existingConn[CONN_CONNECTED_SYMBOL] = true;
278
+
279
+ this.#actor.inspector.emitter.emit("connectionsUpdated");
280
+
281
+ return existingConn;
282
+ }
283
+
284
+ #disconnectExistingDriver(conn: Conn<S, CP, CS, V, I, DB, E, Q>) {
285
+ const driver = conn[CONN_DRIVER_SYMBOL];
286
+ if (driver?.disconnect) {
287
+ driver.disconnect(
288
+ this.#actor,
289
+ conn,
290
+ "Reconnecting hibernatable websocket with new driver state",
291
+ );
292
+ }
293
+ }
294
+
295
+ /**
296
+ * Handle connection disconnection.
297
+ *
298
+ * This is called by `Conn.disconnect`. This should not call `Conn.disconnect.`
299
+ */
300
+ async connDisconnected(conn: Conn<S, CP, CS, V, I, DB, E, Q>) {
301
+ // Remove from tracking
302
+ this.#connections.delete(conn.id);
303
+
304
+ this.#actor.rLog.debug({ msg: "removed conn", connId: conn.id });
305
+
306
+ // Notify driver about connection removal
307
+ if (this.#actor.driver.onDestroyConn) {
308
+ this.#actor.driver.onDestroyConn(conn);
309
+ }
310
+
311
+ for (const eventName of [...conn.subscriptions.values()]) {
312
+ this.#actor.eventManager.removeSubscription(eventName, conn, true);
313
+ }
314
+
315
+ this.#actor.inspector.emitter.emit("connectionsUpdated");
316
+ this.#pendingDisconnectCount += 1;
317
+
318
+ const attributes = {
319
+ "rivet.conn.id": conn.id,
320
+ "rivet.conn.type": conn[CONN_DRIVER_SYMBOL]?.type,
321
+ "rivet.conn.hibernatable": conn.isHibernatable,
322
+ };
323
+ const span = this.#actor.startTraceSpan(
324
+ "actor.onDisconnect",
325
+ attributes,
326
+ );
327
+
328
+ try {
329
+ if (this.#actor.config.onDisconnect) {
330
+ const result = this.#actor.traces.withSpan(span, () =>
331
+ this.#actor.config.onDisconnect!(
332
+ this.#actor.actorContext,
333
+ conn,
334
+ ),
335
+ );
336
+ this.#actor.emitTraceEvent(
337
+ "connection.disconnect",
338
+ attributes,
339
+ span,
340
+ );
341
+ if (result instanceof Promise) {
342
+ await result;
343
+ }
344
+ this.#actor.endTraceSpan(span, { code: "OK" });
345
+ } else {
346
+ this.#actor.emitTraceEvent(
347
+ "connection.disconnect",
348
+ attributes,
349
+ span,
350
+ );
351
+ this.#actor.endTraceSpan(span, { code: "OK" });
352
+ }
353
+ } catch (error) {
354
+ this.#actor.endTraceSpan(span, {
355
+ code: "ERROR",
356
+ message: stringifyError(error),
357
+ });
358
+ this.#actor.rLog.error({
359
+ msg: "error in `onDisconnect`",
360
+ error: stringifyError(error),
361
+ });
362
+ } finally {
363
+ // Remove from connsWithPersistChanged after onDisconnect to handle any
364
+ // state changes made during the disconnect callback. Disconnected connections
365
+ // are removed from KV storage via kvBatchDelete below, not through the
366
+ // normal persist save flow, so they should not trigger persist saves.
367
+ this.#connsWithPersistChanged.delete(conn.id);
368
+
369
+ // Remove from KV storage.
370
+ if (conn.isHibernatable) {
371
+ const key = makeConnKey(conn.id);
372
+ try {
373
+ await this.#actor.driver.kvBatchDelete(this.#actor.id, [key]);
374
+ this.#actor.rLog.debug({
375
+ msg: "removed connection from KV",
376
+ connId: conn.id,
377
+ });
378
+ } catch (err) {
379
+ this.#actor.rLog.error({
380
+ msg: "kvBatchDelete failed for conn",
381
+ err: stringifyError(err),
382
+ });
383
+ }
384
+ }
385
+
386
+ this.#pendingDisconnectCount = Math.max(
387
+ 0,
388
+ this.#pendingDisconnectCount - 1,
389
+ );
390
+ this.#actor.resetSleepTimer();
391
+ }
392
+ }
393
+
394
+ async cleanupPersistedHibernatableConnections(
395
+ reason?: string,
396
+ ): Promise<number> {
397
+ const staleConnections = Array.from(this.#connections.values()).filter(
398
+ (conn) =>
399
+ conn.isHibernatable &&
400
+ conn[CONN_DRIVER_SYMBOL] === undefined,
401
+ );
402
+ if (staleConnections.length === 0) {
403
+ return 0;
404
+ }
405
+
406
+ this.#actor.rLog.info({
407
+ msg: "cleaning up persisted hibernatable connections",
408
+ reason: reason ?? "unknown",
409
+ count: staleConnections.length,
410
+ });
411
+
412
+ for (const conn of staleConnections) {
413
+ await this.connDisconnected(conn);
414
+ }
415
+
416
+ return staleConnections.length;
417
+ }
418
+
419
+ /**
420
+ * Utilify function for call sites that don't need a separate prepare and connect phase.
421
+ */
422
+ async prepareAndConnectConn(
423
+ driver: ConnDriver,
424
+ params: CP,
425
+ request: Request | undefined,
426
+ requestPath: string | undefined,
427
+ requestHeaders: Record<string, string> | undefined,
428
+ ): Promise<Conn<S, CP, CS, V, I, DB, E, Q>> {
429
+ const conn = await this.prepareConn(
430
+ driver,
431
+ params,
432
+ request,
433
+ requestPath,
434
+ requestHeaders,
435
+ false,
436
+ false,
437
+ );
438
+ this.connectConn(conn);
439
+ return conn;
440
+ }
441
+
442
+ // MARK: - Persistence
443
+
444
+ /**
445
+ * Restores connections from persisted data during actor initialization.
446
+ */
447
+ restoreConnections(connections: PersistedConn<CP, CS>[]) {
448
+ for (const connPersist of connections) {
449
+ // Create connection instance
450
+ const conn = new Conn<S, CP, CS, V, I, DB, E, Q>(this.#actor, {
451
+ hibernatable: connPersist,
452
+ });
453
+ this.#connections.set(conn.id, conn);
454
+
455
+ // Notify driver about restored connection
456
+ if (this.#actor.driver.onCreateConn) {
457
+ this.#actor.driver.onCreateConn(conn);
458
+ }
459
+
460
+ // Restore subscriptions
461
+ for (const sub of connPersist.subscriptions) {
462
+ this.#actor.eventManager.addSubscription(
463
+ sub.eventName,
464
+ conn,
465
+ true,
466
+ );
467
+ }
468
+ }
469
+ }
470
+
471
+ // MARK: - Private Helpers
472
+
473
+ findHibernatableConn(
474
+ gatewayIdBuf: ArrayBuffer,
475
+ requestIdBuf: ArrayBuffer,
476
+ ): Conn<S, CP, CS, V, I, DB, E, Q> | undefined {
477
+ return Array.from(this.#connections.values()).find((conn) => {
478
+ const connStateManager = conn[CONN_STATE_MANAGER_SYMBOL];
479
+ const h = connStateManager.hibernatableDataRaw;
480
+ return (
481
+ h &&
482
+ arrayBuffersEqual(h.gatewayId, gatewayIdBuf) &&
483
+ arrayBuffersEqual(h.requestId, requestIdBuf)
484
+ );
485
+ });
486
+ }
487
+
488
+ async #createConnState(
489
+ params: CP,
490
+ request: Request | undefined,
491
+ ): Promise<CS | undefined> {
492
+ if ("createConnState" in this.#actor.config) {
493
+ const createConnState = this.#actor.config.createConnState;
494
+ const ctx = new CreateConnStateContext(this.#actor, request);
495
+ return await this.#actor.runInTraceSpan(
496
+ "actor.createConnState",
497
+ undefined,
498
+ () => {
499
+ const dataOrPromise = createConnState!(ctx, params);
500
+ if (dataOrPromise instanceof Promise) {
501
+ return deadline(
502
+ dataOrPromise,
503
+ this.#actor.config.options.createConnStateTimeout,
504
+ );
505
+ }
506
+ return dataOrPromise;
507
+ },
508
+ );
509
+ } else if ("connState" in this.#actor.config) {
510
+ return structuredClone(this.#actor.config.connState);
511
+ }
512
+
513
+ throw new Error(
514
+ "Could not create connection state from 'createConnState' or 'connState'",
515
+ );
516
+ }
517
+
518
+ #callOnConnect(conn: Conn<S, CP, CS, V, I, DB, E, Q>) {
519
+ const attributes = {
520
+ "rivet.conn.id": conn.id,
521
+ "rivet.conn.type": conn[CONN_DRIVER_SYMBOL]?.type,
522
+ "rivet.conn.hibernatable": conn.isHibernatable,
523
+ };
524
+ const span = this.#actor.startTraceSpan("actor.onConnect", attributes);
525
+
526
+ try {
527
+ if (this.#actor.config.onConnect) {
528
+ const ctx = new ConnectContext(this.#actor, conn);
529
+ const result = this.#actor.traces.withSpan(span, () =>
530
+ this.#actor.config.onConnect!(ctx, conn),
531
+ );
532
+ this.#actor.emitTraceEvent(
533
+ "connection.connect",
534
+ attributes,
535
+ span,
536
+ );
537
+ if (result instanceof Promise) {
538
+ deadline(
539
+ result,
540
+ this.#actor.config.options.onConnectTimeout,
541
+ )
542
+ .then(() => {
543
+ this.#actor.endTraceSpan(span, { code: "OK" });
544
+ })
545
+ .catch((error) => {
546
+ this.#actor.endTraceSpan(span, {
547
+ code: "ERROR",
548
+ message: stringifyError(error),
549
+ });
550
+ this.#actor.rLog.error({
551
+ msg: "error in `onConnect`, closing socket",
552
+ error,
553
+ });
554
+ conn?.disconnect("`onConnect` failed");
555
+ });
556
+ return;
557
+ }
558
+ }
559
+
560
+ this.#actor.emitTraceEvent("connection.connect", attributes, span);
561
+ this.#actor.endTraceSpan(span, { code: "OK" });
562
+ } catch (error) {
563
+ this.#actor.endTraceSpan(span, {
564
+ code: "ERROR",
565
+ message: stringifyError(error),
566
+ });
567
+ this.#actor.rLog.error({
568
+ msg: "error in `onConnect`",
569
+ error: stringifyError(error),
570
+ });
571
+ conn?.disconnect("`onConnect` failed");
572
+ }
573
+ }
574
+ }