rivetkit 2.0.42 → 2.1.0-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 (322) hide show
  1. package/dist/{tsup/config-CLnylLYY.d.ts → browser/client.d.ts} +2127 -1910
  2. package/dist/browser/client.js +5182 -0
  3. package/dist/browser/client.js.map +1 -0
  4. package/dist/browser/inspector/client.d.ts +130 -0
  5. package/dist/browser/inspector/client.js +2854 -0
  6. package/dist/browser/inspector/client.js.map +1 -0
  7. package/dist/browser/v3-DnYObHH3.d.ts +279 -0
  8. package/dist/schemas/actor-inspector/v2.ts +796 -0
  9. package/dist/schemas/actor-inspector/v3.ts +899 -0
  10. package/dist/schemas/actor-persist/v4.ts +406 -0
  11. package/dist/schemas/client-protocol/v3.ts +554 -0
  12. package/dist/schemas/persist/v1.ts +781 -0
  13. package/dist/schemas/transport/v1.ts +697 -0
  14. package/dist/tsup/actor/errors.cjs +27 -3
  15. package/dist/tsup/actor/errors.cjs.map +1 -1
  16. package/dist/tsup/actor/errors.d.cts +37 -1
  17. package/dist/tsup/actor/errors.d.ts +37 -1
  18. package/dist/tsup/actor/errors.js +26 -1
  19. package/dist/tsup/{actor-router-consts-DzI2szci.d.cts → actor-router-consts-D29T1Z-K.d.cts} +1 -1
  20. package/dist/tsup/{actor-router-consts-DzI2szci.d.ts → actor-router-consts-D29T1Z-K.d.ts} +1 -1
  21. package/dist/tsup/chunk-424PT5DM.js +23 -0
  22. package/dist/tsup/chunk-424PT5DM.js.map +1 -0
  23. package/dist/tsup/{chunk-JDAD2YFA.js → chunk-5ESWDTHJ.js} +148 -273
  24. package/dist/tsup/chunk-5ESWDTHJ.js.map +1 -0
  25. package/dist/tsup/{chunk-FJ3KTN4V.js → chunk-6LIBPELE.js} +119 -11
  26. package/dist/tsup/chunk-6LIBPELE.js.map +1 -0
  27. package/dist/tsup/chunk-6LJAZ5R4.cjs +96 -0
  28. package/dist/tsup/chunk-6LJAZ5R4.cjs.map +1 -0
  29. package/dist/tsup/{chunk-LFVF5SCU.js → chunk-7HTNH26M.js} +126 -1
  30. package/dist/tsup/chunk-7HTNH26M.js.map +1 -0
  31. package/dist/tsup/chunk-7K4CYDGD.js +630 -0
  32. package/dist/tsup/chunk-7K4CYDGD.js.map +1 -0
  33. package/dist/tsup/{chunk-XXGJCOL6.js → chunk-A6YIZWTK.js} +2 -2
  34. package/dist/tsup/chunk-AIYEYMX5.cjs +630 -0
  35. package/dist/tsup/chunk-AIYEYMX5.cjs.map +1 -0
  36. package/dist/tsup/{chunk-Q6W7RJJP.js → chunk-DIGBC2VI.js} +211 -2316
  37. package/dist/tsup/chunk-DIGBC2VI.js.map +1 -0
  38. package/dist/tsup/{chunk-RZW2DNND.cjs → chunk-F6JYU5IK.cjs} +1957 -1039
  39. package/dist/tsup/chunk-F6JYU5IK.cjs.map +1 -0
  40. package/dist/tsup/chunk-HAZL2EPK.cjs +534 -0
  41. package/dist/tsup/chunk-HAZL2EPK.cjs.map +1 -0
  42. package/dist/tsup/chunk-HDQ2JUQT.cjs +23 -0
  43. package/dist/tsup/chunk-HDQ2JUQT.cjs.map +1 -0
  44. package/dist/tsup/chunk-HIDX4C5Y.cjs +1036 -0
  45. package/dist/tsup/chunk-HIDX4C5Y.cjs.map +1 -0
  46. package/dist/tsup/chunk-IVG73YCW.js +534 -0
  47. package/dist/tsup/chunk-IVG73YCW.js.map +1 -0
  48. package/dist/tsup/chunk-KJSYAUOM.js +96 -0
  49. package/dist/tsup/chunk-KJSYAUOM.js.map +1 -0
  50. package/dist/tsup/{chunk-2XQS746M.cjs → chunk-L47L3ZWJ.cjs} +127 -2
  51. package/dist/tsup/chunk-L47L3ZWJ.cjs.map +1 -0
  52. package/dist/tsup/{chunk-H4TB4X25.cjs → chunk-LW6KLR7A.cjs} +126 -18
  53. package/dist/tsup/chunk-LW6KLR7A.cjs.map +1 -0
  54. package/dist/tsup/chunk-LXUQ667X.js +2006 -0
  55. package/dist/tsup/chunk-LXUQ667X.js.map +1 -0
  56. package/dist/tsup/{chunk-GMAVRZSF.js → chunk-M2T62AZQ.js} +1790 -872
  57. package/dist/tsup/chunk-M2T62AZQ.js.map +1 -0
  58. package/dist/tsup/chunk-MZ37VV3P.js +5974 -0
  59. package/dist/tsup/chunk-MZ37VV3P.js.map +1 -0
  60. package/dist/tsup/chunk-N4KRDJ56.js +72 -0
  61. package/dist/tsup/chunk-N4KRDJ56.js.map +1 -0
  62. package/dist/tsup/chunk-NIYZDWMW.cjs +2006 -0
  63. package/dist/tsup/chunk-NIYZDWMW.cjs.map +1 -0
  64. package/dist/tsup/chunk-OMEPCQK2.js +649 -0
  65. package/dist/tsup/chunk-OMEPCQK2.js.map +1 -0
  66. package/dist/tsup/chunk-SR3KQE7Q.cjs +72 -0
  67. package/dist/tsup/chunk-SR3KQE7Q.cjs.map +1 -0
  68. package/dist/tsup/chunk-SSEP6DHP.cjs +2657 -0
  69. package/dist/tsup/chunk-SSEP6DHP.cjs.map +1 -0
  70. package/dist/tsup/chunk-T5YCUGVS.js +1036 -0
  71. package/dist/tsup/chunk-T5YCUGVS.js.map +1 -0
  72. package/dist/tsup/{chunk-EJVBH5VF.cjs → chunk-TPGXWFQT.cjs} +3 -3
  73. package/dist/tsup/{chunk-EJVBH5VF.cjs.map → chunk-TPGXWFQT.cjs.map} +1 -1
  74. package/dist/tsup/{chunk-X35U3YNX.cjs → chunk-TYLXNCA5.cjs} +214 -339
  75. package/dist/tsup/chunk-TYLXNCA5.cjs.map +1 -0
  76. package/dist/tsup/chunk-VKVNIQRQ.js +257 -0
  77. package/dist/tsup/chunk-VKVNIQRQ.js.map +1 -0
  78. package/dist/tsup/chunk-XWBAQO5H.cjs +649 -0
  79. package/dist/tsup/chunk-XWBAQO5H.cjs.map +1 -0
  80. package/dist/tsup/chunk-YQ4LDVD6.cjs +5974 -0
  81. package/dist/tsup/chunk-YQ4LDVD6.cjs.map +1 -0
  82. package/dist/tsup/chunk-ZFY5J2EP.cjs +257 -0
  83. package/dist/tsup/chunk-ZFY5J2EP.cjs.map +1 -0
  84. package/dist/tsup/client/mod.cjs +9 -10
  85. package/dist/tsup/client/mod.cjs.map +1 -1
  86. package/dist/tsup/client/mod.d.cts +11 -5
  87. package/dist/tsup/client/mod.d.ts +11 -5
  88. package/dist/tsup/client/mod.js +8 -8
  89. package/dist/tsup/common/log.cjs +4 -4
  90. package/dist/tsup/common/log.d.cts +2 -2
  91. package/dist/tsup/common/log.d.ts +2 -2
  92. package/dist/tsup/common/log.js +3 -2
  93. package/dist/tsup/common/websocket.cjs +5 -5
  94. package/dist/tsup/common/websocket.js +4 -3
  95. package/dist/tsup/config-BFqid9Gr.d.ts +2574 -0
  96. package/dist/tsup/config-BiNoIHRs.d.cts +80 -0
  97. package/dist/tsup/config-BiNoIHRs.d.ts +80 -0
  98. package/dist/tsup/{config-CZB2-W8x.d.cts → config-CAZphOS1.d.cts} +681 -355
  99. package/dist/tsup/db/drizzle/mod.cjs +49 -0
  100. package/dist/tsup/db/drizzle/mod.cjs.map +1 -0
  101. package/dist/tsup/db/drizzle/mod.d.cts +17 -0
  102. package/dist/tsup/db/drizzle/mod.d.ts +17 -0
  103. package/dist/tsup/db/drizzle/mod.js +49 -0
  104. package/dist/tsup/db/drizzle/mod.js.map +1 -0
  105. package/dist/tsup/db/mod.cjs +9 -0
  106. package/dist/tsup/db/mod.cjs.map +1 -0
  107. package/dist/tsup/db/mod.d.cts +9 -0
  108. package/dist/tsup/db/mod.d.ts +9 -0
  109. package/dist/tsup/db/mod.js +9 -0
  110. package/dist/tsup/db/mod.js.map +1 -0
  111. package/dist/tsup/{driver-D0QX9M11.d.ts → driver-Bxv62E2p.d.ts} +2 -2
  112. package/dist/tsup/{driver-q-zqG7fc.d.cts → driver-DYXwJR5D.d.cts} +2 -2
  113. package/dist/tsup/driver-helpers/mod.cjs +12 -6
  114. package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
  115. package/dist/tsup/driver-helpers/mod.d.cts +12 -5
  116. package/dist/tsup/driver-helpers/mod.d.ts +12 -5
  117. package/dist/tsup/driver-helpers/mod.js +12 -5
  118. package/dist/tsup/driver-test-suite/mod.cjs +1370 -116
  119. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
  120. package/dist/tsup/driver-test-suite/mod.d.cts +10 -4
  121. package/dist/tsup/driver-test-suite/mod.d.ts +10 -4
  122. package/dist/tsup/driver-test-suite/mod.js +2093 -838
  123. package/dist/tsup/driver-test-suite/mod.js.map +1 -1
  124. package/dist/tsup/inspector/mod.cjs +29 -3
  125. package/dist/tsup/inspector/mod.cjs.map +1 -1
  126. package/dist/tsup/inspector/mod.d.cts +124 -3
  127. package/dist/tsup/inspector/mod.d.ts +124 -3
  128. package/dist/tsup/inspector/mod.js +72 -45
  129. package/dist/tsup/keys-CydblqMh.d.cts +13 -0
  130. package/dist/tsup/keys-CydblqMh.d.ts +13 -0
  131. package/dist/tsup/mod.cjs +16 -10
  132. package/dist/tsup/mod.cjs.map +1 -1
  133. package/dist/tsup/mod.d.cts +26 -14
  134. package/dist/tsup/mod.d.ts +26 -14
  135. package/dist/tsup/mod.js +20 -13
  136. package/dist/tsup/serve-test-suite/mod.cjs +1165 -83
  137. package/dist/tsup/serve-test-suite/mod.cjs.map +1 -1
  138. package/dist/tsup/serve-test-suite/mod.js +1114 -29
  139. package/dist/tsup/serve-test-suite/mod.js.map +1 -1
  140. package/dist/tsup/test/mod.cjs +84 -11
  141. package/dist/tsup/test/mod.cjs.map +1 -1
  142. package/dist/tsup/test/mod.d.cts +10 -5
  143. package/dist/tsup/test/mod.d.ts +10 -5
  144. package/dist/tsup/test/mod.js +85 -11
  145. package/dist/tsup/test/mod.js.map +1 -1
  146. package/dist/tsup/utils.cjs +10 -4
  147. package/dist/tsup/utils.cjs.map +1 -1
  148. package/dist/tsup/utils.d.cts +72 -2
  149. package/dist/tsup/utils.d.ts +72 -2
  150. package/dist/tsup/utils.js +9 -2
  151. package/dist/tsup/v3-DnYObHH3.d.cts +279 -0
  152. package/dist/tsup/v3-DnYObHH3.d.ts +279 -0
  153. package/dist/tsup/workflow/mod.cjs +16 -0
  154. package/dist/tsup/workflow/mod.cjs.map +1 -0
  155. package/dist/tsup/workflow/mod.d.cts +83 -0
  156. package/dist/tsup/workflow/mod.d.ts +83 -0
  157. package/dist/tsup/workflow/mod.js +16 -0
  158. package/dist/tsup/workflow/mod.js.map +1 -0
  159. package/package.json +62 -5
  160. package/src/actor/config.ts +478 -68
  161. package/src/actor/conn/mod.ts +68 -16
  162. package/src/actor/conn/state-manager.ts +2 -2
  163. package/src/actor/contexts/action.ts +20 -12
  164. package/src/actor/contexts/base/actor.ts +137 -7
  165. package/src/actor/contexts/base/conn-init.ts +27 -7
  166. package/src/actor/contexts/base/conn.ts +27 -18
  167. package/src/actor/contexts/before-action-response.ts +9 -2
  168. package/src/actor/contexts/before-connect.ts +7 -2
  169. package/src/actor/contexts/connect.ts +9 -2
  170. package/src/actor/contexts/create-conn-state.ts +7 -2
  171. package/src/actor/contexts/create-vars.ts +16 -3
  172. package/src/actor/contexts/create.ts +16 -3
  173. package/src/actor/contexts/destroy.ts +9 -3
  174. package/src/actor/contexts/disconnect.ts +10 -4
  175. package/src/actor/contexts/index.ts +4 -3
  176. package/src/actor/contexts/request.ts +23 -6
  177. package/src/actor/contexts/run.ts +47 -0
  178. package/src/actor/contexts/sleep.ts +9 -3
  179. package/src/actor/contexts/state-change.ts +9 -3
  180. package/src/actor/contexts/wake.ts +9 -3
  181. package/src/actor/contexts/websocket.ts +23 -6
  182. package/src/actor/database.ts +8 -18
  183. package/src/actor/definition.ts +20 -6
  184. package/src/actor/driver.ts +32 -3
  185. package/src/actor/errors.ts +127 -0
  186. package/src/actor/instance/connection-manager.ts +183 -80
  187. package/src/actor/instance/event-manager.ts +26 -15
  188. package/src/actor/instance/keys.ts +117 -0
  189. package/src/actor/instance/mod.ts +784 -174
  190. package/src/actor/instance/queue-manager.ts +603 -0
  191. package/src/actor/instance/queue.ts +287 -0
  192. package/src/actor/instance/schedule-manager.ts +49 -7
  193. package/src/actor/instance/state-manager.ts +35 -11
  194. package/src/actor/instance/traces-driver.ts +128 -0
  195. package/src/actor/mod.ts +26 -2
  196. package/src/actor/protocol/old.ts +28 -13
  197. package/src/actor/protocol/serde.ts +1 -1
  198. package/src/actor/router-endpoints.ts +177 -21
  199. package/src/actor/router-websocket-endpoints.ts +18 -29
  200. package/src/actor/router.ts +177 -0
  201. package/src/actor/schema.ts +291 -0
  202. package/src/actor/utils.ts +40 -0
  203. package/src/client/actor-common.ts +1 -1
  204. package/src/client/actor-conn.ts +100 -33
  205. package/src/client/actor-handle.ts +61 -33
  206. package/src/client/client.ts +2 -4
  207. package/src/client/config.ts +1 -1
  208. package/src/client/mod.browser.ts +2 -0
  209. package/src/client/mod.ts +1 -4
  210. package/src/client/queue.ts +146 -0
  211. package/src/client/utils.ts +1 -1
  212. package/src/common/log.ts +1 -1
  213. package/src/common/utils.ts +3 -3
  214. package/src/db/config.ts +100 -0
  215. package/src/db/drizzle/mod.ts +226 -0
  216. package/src/db/drizzle/sqlite-core.ts +22 -0
  217. package/src/db/mod.ts +125 -0
  218. package/src/db/shared.ts +92 -0
  219. package/src/db/sqlite-vfs.ts +12 -0
  220. package/src/driver-helpers/mod.ts +1 -0
  221. package/src/driver-test-suite/mod.ts +69 -43
  222. package/src/driver-test-suite/tests/access-control.ts +218 -0
  223. package/src/driver-test-suite/tests/actor-db-raw.ts +73 -0
  224. package/src/driver-test-suite/tests/actor-db.ts +394 -0
  225. package/src/driver-test-suite/tests/actor-inspector.ts +259 -358
  226. package/src/driver-test-suite/tests/actor-kv.ts +41 -20
  227. package/src/driver-test-suite/tests/actor-queue.ts +324 -0
  228. package/src/driver-test-suite/tests/actor-run.ts +181 -0
  229. package/src/driver-test-suite/tests/actor-schedule.ts +5 -2
  230. package/src/driver-test-suite/tests/actor-sleep.ts +3 -3
  231. package/src/driver-test-suite/tests/actor-stateless.ts +70 -0
  232. package/src/driver-test-suite/tests/actor-workflow.ts +108 -0
  233. package/src/driver-test-suite/tests/manager-driver.ts +11 -0
  234. package/src/driver-test-suite/tests/raw-http-request-properties.ts +1 -1
  235. package/src/driver-test-suite/tests/raw-websocket.ts +12 -12
  236. package/src/drivers/default.ts +7 -2
  237. package/src/drivers/engine/actor-driver.ts +45 -37
  238. package/src/drivers/engine/config.ts +1 -1
  239. package/src/drivers/file-system/actor.ts +20 -2
  240. package/src/drivers/file-system/global-state.ts +569 -258
  241. package/src/drivers/file-system/kv-limits.ts +70 -0
  242. package/src/drivers/file-system/manager.ts +22 -6
  243. package/src/drivers/file-system/mod.ts +39 -16
  244. package/src/drivers/file-system/sqlite-runtime.ts +210 -0
  245. package/src/inspector/actor-inspector.ts +224 -102
  246. package/src/inspector/config.ts +1 -1
  247. package/src/inspector/handler.ts +102 -20
  248. package/src/inspector/mod.browser.ts +8 -0
  249. package/src/inspector/mod.ts +2 -0
  250. package/src/inspector/serve-ui.ts +40 -0
  251. package/src/inspector/transport.ts +18 -0
  252. package/src/inspector/utils.ts +5 -39
  253. package/src/manager/gateway.ts +1 -1
  254. package/src/manager/protocol/mod.ts +1 -1
  255. package/src/manager/protocol/query.ts +1 -1
  256. package/src/manager/router-schema.ts +1 -1
  257. package/src/manager/router.ts +38 -12
  258. package/src/manager-api/actors.ts +1 -1
  259. package/src/manager-api/common.ts +1 -1
  260. package/src/registry/config/driver.ts +1 -1
  261. package/src/registry/config/index.ts +212 -43
  262. package/src/registry/config/legacy-runner.ts +1 -1
  263. package/src/registry/config/runner.ts +1 -1
  264. package/src/registry/config/serverless.ts +1 -1
  265. package/src/registry/index.ts +7 -5
  266. package/src/remote-manager-driver/api-utils.ts +1 -1
  267. package/src/schemas/actor-inspector/mod.ts +1 -1
  268. package/src/schemas/actor-inspector/versioned.ts +195 -8
  269. package/src/schemas/actor-persist/versioned.ts +87 -7
  270. package/src/schemas/client-protocol/mod.ts +1 -1
  271. package/src/schemas/client-protocol/versioned.ts +127 -11
  272. package/src/schemas/client-protocol-zod/mod.ts +16 -1
  273. package/src/schemas/persist/mod.ts +1 -0
  274. package/src/schemas/transport/mod.ts +1 -0
  275. package/src/serde.ts +1 -1
  276. package/src/serve-test-suite/mod.ts +10 -9
  277. package/src/test/mod.ts +15 -56
  278. package/src/utils/endpoint-parser.test.ts +1 -1
  279. package/src/utils/endpoint-parser.ts +1 -1
  280. package/src/utils/env-vars.ts +12 -1
  281. package/src/utils/node.ts +15 -2
  282. package/src/utils.test.ts +34 -0
  283. package/src/utils.ts +140 -6
  284. package/src/workflow/constants.ts +2 -0
  285. package/src/workflow/context.ts +532 -0
  286. package/src/workflow/driver.ts +191 -0
  287. package/src/workflow/inspector.ts +268 -0
  288. package/src/workflow/mod.ts +122 -0
  289. package/dist/tsup/chunk-2IJTYN6K.cjs +0 -278
  290. package/dist/tsup/chunk-2IJTYN6K.cjs.map +0 -1
  291. package/dist/tsup/chunk-2XQS746M.cjs.map +0 -1
  292. package/dist/tsup/chunk-3VP5CSHV.cjs +0 -114
  293. package/dist/tsup/chunk-3VP5CSHV.cjs.map +0 -1
  294. package/dist/tsup/chunk-AQFSQMBG.js +0 -114
  295. package/dist/tsup/chunk-AQFSQMBG.js.map +0 -1
  296. package/dist/tsup/chunk-E6ZE2YEA.js +0 -664
  297. package/dist/tsup/chunk-E6ZE2YEA.js.map +0 -1
  298. package/dist/tsup/chunk-FJ3KTN4V.js.map +0 -1
  299. package/dist/tsup/chunk-GBENOENJ.cjs +0 -8
  300. package/dist/tsup/chunk-GBENOENJ.cjs.map +0 -1
  301. package/dist/tsup/chunk-GD7UXGOE.cjs +0 -4762
  302. package/dist/tsup/chunk-GD7UXGOE.cjs.map +0 -1
  303. package/dist/tsup/chunk-GMAVRZSF.js.map +0 -1
  304. package/dist/tsup/chunk-H4TB4X25.cjs.map +0 -1
  305. package/dist/tsup/chunk-JDAD2YFA.js.map +0 -1
  306. package/dist/tsup/chunk-KCOVZOPS.js +0 -1946
  307. package/dist/tsup/chunk-KCOVZOPS.js.map +0 -1
  308. package/dist/tsup/chunk-KDFWJKMJ.cjs +0 -664
  309. package/dist/tsup/chunk-KDFWJKMJ.cjs.map +0 -1
  310. package/dist/tsup/chunk-LFVF5SCU.js.map +0 -1
  311. package/dist/tsup/chunk-Q6W7RJJP.js.map +0 -1
  312. package/dist/tsup/chunk-RUW5CZ5Z.cjs +0 -1949
  313. package/dist/tsup/chunk-RUW5CZ5Z.cjs.map +0 -1
  314. package/dist/tsup/chunk-RZW2DNND.cjs.map +0 -1
  315. package/dist/tsup/chunk-TCOEBUUE.js +0 -278
  316. package/dist/tsup/chunk-TCOEBUUE.js.map +0 -1
  317. package/dist/tsup/chunk-X35U3YNX.cjs.map +0 -1
  318. package/dist/tsup/keys-Chhy4ylv.d.cts +0 -8
  319. package/dist/tsup/keys-Chhy4ylv.d.ts +0 -8
  320. package/dist/tsup/v1-Gq4avTK3.d.cts +0 -240
  321. package/dist/tsup/v1-Gq4avTK3.d.ts +0 -240
  322. /package/dist/tsup/{chunk-XXGJCOL6.js.map → chunk-A6YIZWTK.js.map} +0 -0
@@ -1,4762 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } var _class; var _class2; var _class3;
2
-
3
-
4
- var _chunkEJVBH5VFcjs = require('./chunk-EJVBH5VF.cjs');
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
- var _chunkRZW2DNNDcjs = require('./chunk-RZW2DNND.cjs');
63
-
64
-
65
-
66
-
67
-
68
-
69
-
70
-
71
-
72
-
73
-
74
-
75
-
76
-
77
-
78
-
79
-
80
-
81
-
82
-
83
-
84
-
85
-
86
-
87
- var _chunkH4TB4X25cjs = require('./chunk-H4TB4X25.cjs');
88
-
89
-
90
-
91
-
92
-
93
-
94
-
95
-
96
-
97
-
98
-
99
-
100
-
101
- var _chunk2XQS746Mcjs = require('./chunk-2XQS746M.cjs');
102
-
103
- // src/devtools-loader/log.ts
104
- function logger2() {
105
- return _chunkH4TB4X25cjs.getLogger.call(void 0, "devtools");
106
- }
107
-
108
- // src/devtools-loader/index.ts
109
- var DEFAULT_DEVTOOLS_URL = (version = _chunkH4TB4X25cjs.VERSION) => `https://releases.rivet.dev/rivet/latest/devtools/mod.js?v=${version}`;
110
- var scriptId = "rivetkit-devtools-script";
111
- function injectDevtools(config) {
112
- if (!window) {
113
- logger2().warn("devtools not available outside browser environment");
114
- return;
115
- }
116
- if (!document.getElementById(scriptId)) {
117
- const script = document.createElement("script");
118
- script.id = scriptId;
119
- script.src = DEFAULT_DEVTOOLS_URL();
120
- script.async = true;
121
- document.head.appendChild(script);
122
- }
123
- window.__rivetkit = window.__rivetkit || [];
124
- window.__rivetkit.push(config);
125
- }
126
-
127
- // src/remote-manager-driver/mod.ts
128
- var _cborx = require('cbor-x'); var cbor2 = _interopRequireWildcard(_cborx); var cbor = _interopRequireWildcard(_cborx); var cbor3 = _interopRequireWildcard(_cborx); var cbor4 = _interopRequireWildcard(_cborx); var cbor5 = _interopRequireWildcard(_cborx); var cbor6 = _interopRequireWildcard(_cborx); var cbor7 = _interopRequireWildcard(_cborx); var cbor8 = _interopRequireWildcard(_cborx); var cbor9 = _interopRequireWildcard(_cborx);
129
- var _invariant = require('invariant'); var _invariant2 = _interopRequireDefault(_invariant);
130
-
131
- // src/remote-manager-driver/api-utils.ts
132
- var _zod = require('zod'); var _zod2 = _interopRequireDefault(_zod);
133
-
134
- // src/client/utils.ts
135
-
136
-
137
-
138
- // src/client/errors.ts
139
- var ActorClientError = class extends Error {
140
- };
141
- var InternalError2 = class extends ActorClientError {
142
- };
143
- var ManagerError = class extends ActorClientError {
144
- constructor(error, opts) {
145
- super(`Manager error: ${error}`, opts);
146
- }
147
- };
148
- var MalformedResponseMessage = class extends ActorClientError {
149
- constructor(cause) {
150
- super(`Malformed response message: ${cause}`, { cause });
151
- }
152
- };
153
- var ActorError = (_class = class extends ActorClientError {
154
- constructor(group, code, message, metadata) {
155
- super(message);_class.prototype.__init.call(this);;
156
- this.group = group;
157
- this.code = code;
158
- this.metadata = metadata;
159
- }
160
- __init() {this.__type = "ActorError"}
161
- }, _class);
162
- var HttpRequestError = class extends ActorClientError {
163
- constructor(message, opts) {
164
- super(`HTTP request error: ${message}`, { cause: opts == null ? void 0 : opts.cause });
165
- }
166
- };
167
- var ActorConnDisposed = class extends ActorClientError {
168
- constructor() {
169
- super("Attempting to interact with a disposed actor connection.");
170
- }
171
- };
172
- function isSchedulingError(group, code) {
173
- return group === "guard" && (code === "actor_ready_timeout" || code === "actor_runner_failed");
174
- }
175
- var ActorSchedulingError = class extends ActorError {
176
-
177
-
178
- constructor(group, code, actorId, details) {
179
- super(
180
- group,
181
- code,
182
- `Actor failed to start (${actorId}): ${JSON.stringify(details)}`,
183
- { actorId, details }
184
- );
185
- this.name = "ActorSchedulingError";
186
- this.actorId = actorId;
187
- this.details = details;
188
- }
189
- };
190
-
191
- // src/client/utils.ts
192
- function parseWebSocketCloseReason(reason) {
193
- const [mainPart, rayId] = reason.split("#");
194
- const [group, code] = mainPart.split(".");
195
- if (!group || !code) {
196
- _chunkEJVBH5VFcjs.logger.call(void 0, ).warn({ msg: "failed to parse close reason", reason });
197
- return void 0;
198
- }
199
- return {
200
- group,
201
- code,
202
- rayId
203
- };
204
- }
205
- function messageLength(message) {
206
- if (message instanceof Blob) {
207
- return message.size;
208
- }
209
- if (message instanceof ArrayBuffer) {
210
- return message.byteLength;
211
- }
212
- if (message instanceof Uint8Array) {
213
- return message.byteLength;
214
- }
215
- if (typeof message === "string") {
216
- return message.length;
217
- }
218
- _chunkH4TB4X25cjs.assertUnreachable.call(void 0, message);
219
- }
220
- async function sendHttpRequest(opts) {
221
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({
222
- msg: "sending http request",
223
- url: opts.url,
224
- encoding: opts.encoding
225
- });
226
- let contentType;
227
- let bodyData;
228
- if (opts.method === "POST" || opts.method === "PUT") {
229
- _invariant2.default.call(void 0, opts.body !== void 0, "missing body");
230
- contentType = _chunkRZW2DNNDcjs.contentTypeForEncoding.call(void 0, opts.encoding);
231
- bodyData = _chunkRZW2DNNDcjs.serializeWithEncoding.call(void 0,
232
- opts.encoding,
233
- opts.body,
234
- opts.requestVersionedDataHandler,
235
- opts.requestVersion,
236
- opts.requestZodSchema,
237
- opts.requestToJson,
238
- opts.requestToBare
239
- );
240
- }
241
- let response;
242
- try {
243
- response = await (_nullishCoalesce(opts.customFetch, () => ( fetch)))(
244
- new globalThis.Request(opts.url, {
245
- method: opts.method,
246
- headers: {
247
- ...opts.headers,
248
- ...contentType ? {
249
- "Content-Type": contentType
250
- } : {},
251
- "User-Agent": _chunkH4TB4X25cjs.httpUserAgent.call(void 0, )
252
- },
253
- body: bodyData,
254
- credentials: "include",
255
- signal: opts.signal
256
- })
257
- );
258
- } catch (error) {
259
- throw new HttpRequestError(`Request failed: ${error}`, {
260
- cause: error
261
- });
262
- }
263
- if (!response.ok) {
264
- const bufferResponse = await response.arrayBuffer();
265
- const contentType2 = response.headers.get("content-type");
266
- const rayId = response.headers.get("x-rivet-ray-id");
267
- const encoding = (contentType2 == null ? void 0 : contentType2.includes("application/json")) ? "json" : opts.encoding;
268
- try {
269
- const responseData = _chunkRZW2DNNDcjs.deserializeWithEncoding.call(void 0,
270
- encoding,
271
- new Uint8Array(bufferResponse),
272
- _chunkRZW2DNNDcjs.HTTP_RESPONSE_ERROR_VERSIONED,
273
- _chunkRZW2DNNDcjs.HttpResponseErrorSchema,
274
- // JSON: metadata is already unknown
275
- (json) => json,
276
- // BARE: decode ArrayBuffer metadata to unknown
277
- (bare) => ({
278
- group: bare.group,
279
- code: bare.code,
280
- message: bare.message,
281
- metadata: bare.metadata ? cbor.decode(new Uint8Array(bare.metadata)) : void 0
282
- })
283
- );
284
- throw new ActorError(
285
- responseData.group,
286
- responseData.code,
287
- responseData.message,
288
- responseData.metadata
289
- );
290
- } catch (error) {
291
- if (error instanceof ActorError) {
292
- throw error;
293
- }
294
- const textResponse = new TextDecoder("utf-8", {
295
- fatal: false
296
- }).decode(bufferResponse);
297
- if (rayId) {
298
- throw new HttpRequestError(
299
- `${response.statusText} (${response.status}) (Ray ID: ${rayId}):
300
- ${textResponse}`
301
- );
302
- } else {
303
- throw new HttpRequestError(
304
- `${response.statusText} (${response.status}):
305
- ${textResponse}`
306
- );
307
- }
308
- }
309
- }
310
- if (opts.skipParseResponse) {
311
- return void 0;
312
- }
313
- try {
314
- const buffer = new Uint8Array(await response.arrayBuffer());
315
- return _chunkRZW2DNNDcjs.deserializeWithEncoding.call(void 0,
316
- opts.encoding,
317
- buffer,
318
- opts.responseVersionedDataHandler,
319
- opts.responseZodSchema,
320
- opts.responseFromJson,
321
- opts.responseFromBare
322
- );
323
- } catch (error) {
324
- throw new HttpRequestError(`Failed to parse response: ${error}`, {
325
- cause: error
326
- });
327
- }
328
- }
329
-
330
- // src/remote-manager-driver/log.ts
331
- function logger3() {
332
- return _chunkH4TB4X25cjs.getLogger.call(void 0, "remote-manager-driver");
333
- }
334
-
335
- // src/remote-manager-driver/api-utils.ts
336
- var EngineApiError = class extends Error {
337
- constructor(group, code, message) {
338
- super(message || `Engine API error: ${group}/${code}`);
339
- this.group = group;
340
- this.code = code;
341
- this.name = "EngineApiError";
342
- }
343
- };
344
- function getEndpoint(config) {
345
- return _nullishCoalesce(config.endpoint, () => ( "http://127.0.0.1:6420"));
346
- }
347
- async function apiCall(config, method, path, body) {
348
- const endpoint = getEndpoint(config);
349
- const url = _chunkH4TB4X25cjs.combineUrlPath.call(void 0, endpoint, path, {
350
- namespace: config.namespace
351
- });
352
- logger3().debug({ msg: "making api call", method, url });
353
- const headers = {
354
- ...config.headers
355
- };
356
- if (config.token) {
357
- headers.Authorization = `Bearer ${config.token}`;
358
- }
359
- return await sendHttpRequest({
360
- method,
361
- url,
362
- headers,
363
- body,
364
- encoding: "json",
365
- skipParseResponse: false,
366
- requestVersionedDataHandler: void 0,
367
- requestVersion: void 0,
368
- responseVersionedDataHandler: void 0,
369
- responseVersion: void 0,
370
- requestZodSchema: _zod.z.any(),
371
- responseZodSchema: _zod.z.any(),
372
- // Identity conversions (passthrough for generic API calls)
373
- requestToJson: (value) => value,
374
- requestToBare: (value) => value,
375
- responseFromJson: (value) => value,
376
- responseFromBare: (value) => value
377
- });
378
- }
379
-
380
- // src/remote-manager-driver/actor-websocket-client.ts
381
- function buildActorGatewayUrl(endpoint, actorId, token, path = "") {
382
- const tokenSegment = token !== void 0 ? `@${encodeURIComponent(token)}` : "";
383
- const gatewayPath = `/gateway/${encodeURIComponent(actorId)}${tokenSegment}${path}`;
384
- return _chunkH4TB4X25cjs.combineUrlPath.call(void 0, endpoint, gatewayPath);
385
- }
386
- async function openWebSocketToActor(runConfig, path, actorId, encoding, params) {
387
- const WebSocket2 = await _chunkEJVBH5VFcjs.importWebSocket.call(void 0, );
388
- const endpoint = getEndpoint(runConfig);
389
- const guardUrl = buildActorGatewayUrl(
390
- endpoint,
391
- actorId,
392
- runConfig.token,
393
- path
394
- );
395
- logger3().debug({
396
- msg: "opening websocket to actor via guard",
397
- actorId,
398
- path,
399
- guardUrl
400
- });
401
- const ws = new WebSocket2(
402
- guardUrl,
403
- buildWebSocketProtocols(runConfig, encoding, params)
404
- );
405
- ws.binaryType = "arraybuffer";
406
- logger3().debug({ msg: "websocket connection opened", actorId });
407
- return ws;
408
- }
409
- function buildWebSocketProtocols(runConfig, encoding, params) {
410
- const protocols = [];
411
- protocols.push(_chunkRZW2DNNDcjs.WS_PROTOCOL_STANDARD);
412
- protocols.push(`${_chunkRZW2DNNDcjs.WS_PROTOCOL_ENCODING}${encoding}`);
413
- if (params) {
414
- protocols.push(
415
- `${_chunkRZW2DNNDcjs.WS_PROTOCOL_CONN_PARAMS}${encodeURIComponent(JSON.stringify(params))}`
416
- );
417
- }
418
- return protocols;
419
- }
420
-
421
- // src/remote-manager-driver/actor-http-client.ts
422
- async function sendHttpRequestToActor(runConfig, actorId, actorRequest) {
423
- const url = new URL(actorRequest.url);
424
- const endpoint = getEndpoint(runConfig);
425
- const guardUrl = buildActorGatewayUrl(
426
- endpoint,
427
- actorId,
428
- runConfig.token,
429
- `${url.pathname}${url.search}`
430
- );
431
- let bodyToSend = null;
432
- const guardHeaders = buildGuardHeadersForHttp(
433
- runConfig,
434
- actorRequest,
435
- actorId
436
- );
437
- if (actorRequest.method !== "GET" && actorRequest.method !== "HEAD") {
438
- if (actorRequest.bodyUsed) {
439
- throw new Error("Request body has already been consumed");
440
- }
441
- const reqBody = await actorRequest.arrayBuffer();
442
- if (reqBody.byteLength !== 0) {
443
- bodyToSend = reqBody;
444
- guardHeaders.delete("transfer-encoding");
445
- guardHeaders.set("content-length", String(bodyToSend.byteLength));
446
- }
447
- }
448
- const guardRequest = new Request(guardUrl, {
449
- method: actorRequest.method,
450
- headers: guardHeaders,
451
- body: bodyToSend,
452
- signal: actorRequest.signal
453
- });
454
- return mutableResponse(await fetch(guardRequest));
455
- }
456
- function mutableResponse(fetchRes) {
457
- return new Response(fetchRes.body, fetchRes);
458
- }
459
- function buildGuardHeadersForHttp(runConfig, actorRequest, actorId) {
460
- const headers = new Headers();
461
- actorRequest.headers.forEach((value, key) => {
462
- headers.set(key, value);
463
- });
464
- for (const [key, value] of Object.entries(runConfig.headers)) {
465
- headers.set(key, value);
466
- }
467
- if (runConfig.token) {
468
- headers.set(_chunkRZW2DNNDcjs.HEADER_RIVET_TOKEN, runConfig.token);
469
- }
470
- return headers;
471
- }
472
-
473
- // src/remote-manager-driver/api-endpoints.ts
474
- async function getActor(config, _, actorId) {
475
- return apiCall(
476
- config,
477
- "GET",
478
- `/actors?actor_ids=${encodeURIComponent(actorId)}`
479
- );
480
- }
481
- async function getActorByKey(config, name, key) {
482
- const serializedKey = _chunkRZW2DNNDcjs.serializeActorKey.call(void 0, key);
483
- return apiCall(
484
- config,
485
- "GET",
486
- `/actors?name=${encodeURIComponent(name)}&key=${encodeURIComponent(serializedKey)}`
487
- );
488
- }
489
- async function listActorsByName(config, name) {
490
- return apiCall(
491
- config,
492
- "GET",
493
- `/actors?name=${encodeURIComponent(name)}`
494
- );
495
- }
496
- async function getOrCreateActor(config, request) {
497
- return apiCall(
498
- config,
499
- "PUT",
500
- `/actors`,
501
- request
502
- );
503
- }
504
- async function createActor(config, request) {
505
- return apiCall(
506
- config,
507
- "POST",
508
- `/actors`,
509
- request
510
- );
511
- }
512
- async function destroyActor(config, actorId) {
513
- return apiCall(
514
- config,
515
- "DELETE",
516
- `/actors/${encodeURIComponent(actorId)}`
517
- );
518
- }
519
- async function getMetadata(config) {
520
- return apiCall(config, "GET", `/metadata`);
521
- }
522
- async function getDatacenters(config) {
523
- return apiCall(config, "GET", `/datacenters`);
524
- }
525
- async function updateRunnerConfig(config, runnerName, request) {
526
- return apiCall(
527
- config,
528
- "PUT",
529
- `/runner-configs/${runnerName}`,
530
- request
531
- );
532
- }
533
- async function kvGet(config, actorId, key) {
534
- return apiCall(
535
- config,
536
- "GET",
537
- `/actors/${encodeURIComponent(actorId)}/kv/keys/${encodeURIComponent(key)}`
538
- );
539
- }
540
-
541
- // src/remote-manager-driver/metadata.ts
542
- var _pretry = require('p-retry'); var _pretry2 = _interopRequireDefault(_pretry);
543
- var metadataLookupCache = /* @__PURE__ */ new Map();
544
- async function lookupMetadataCached(config) {
545
- const endpoint = getEndpoint(config);
546
- const existingPromise = metadataLookupCache.get(endpoint);
547
- if (existingPromise) {
548
- return existingPromise;
549
- }
550
- const metadataLookupPromise = _pretry2.default.call(void 0,
551
- async () => {
552
- logger3().debug({
553
- msg: "fetching metadata",
554
- endpoint
555
- });
556
- const metadataData = await getMetadata(config);
557
- logger3().debug({
558
- msg: "received metadata",
559
- endpoint,
560
- clientEndpoint: metadataData.clientEndpoint
561
- });
562
- return metadataData;
563
- },
564
- {
565
- forever: true,
566
- minTimeout: 500,
567
- maxTimeout: 15e3,
568
- onFailedAttempt: (error) => {
569
- if (error.attemptNumber > 1) {
570
- logger3().warn({
571
- msg: "failed to fetch metadata, retrying",
572
- endpoint,
573
- attempt: error.attemptNumber,
574
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, error)
575
- });
576
- }
577
- }
578
- }
579
- );
580
- metadataLookupCache.set(endpoint, metadataLookupPromise);
581
- return metadataLookupPromise;
582
- }
583
-
584
- // src/remote-manager-driver/ws-proxy.ts
585
- async function createWebSocketProxy(c, targetUrl, protocols) {
586
- const WebSocket2 = await _chunkEJVBH5VFcjs.importWebSocket.call(void 0, );
587
- const state = {};
588
- return {
589
- onOpen: async (event, clientWs) => {
590
- logger3().debug({ msg: "client websocket connected", targetUrl });
591
- if (clientWs.readyState !== 1) {
592
- logger3().warn({
593
- msg: "client websocket not open on connection",
594
- targetUrl,
595
- readyState: clientWs.readyState
596
- });
597
- return;
598
- }
599
- const targetWs = new WebSocket2(targetUrl, protocols);
600
- state.targetWs = targetWs;
601
- state.connectPromise = new Promise((resolve, reject) => {
602
- targetWs.addEventListener("open", () => {
603
- logger3().debug({
604
- msg: "target websocket connected",
605
- targetUrl
606
- });
607
- if (clientWs.readyState !== 1) {
608
- logger3().warn({
609
- msg: "client websocket closed before target connected",
610
- targetUrl,
611
- clientReadyState: clientWs.readyState
612
- });
613
- targetWs.close(1001, "Client disconnected");
614
- reject(new Error("Client disconnected"));
615
- return;
616
- }
617
- resolve();
618
- });
619
- targetWs.addEventListener("error", (error) => {
620
- logger3().warn({
621
- msg: "target websocket error during connection",
622
- targetUrl
623
- });
624
- reject(error);
625
- });
626
- });
627
- state.targetWs.addEventListener("message", (event2) => {
628
- if (typeof event2.data === "string" || event2.data instanceof ArrayBuffer) {
629
- clientWs.send(event2.data);
630
- } else if (event2.data instanceof Blob) {
631
- event2.data.arrayBuffer().then((buffer) => {
632
- clientWs.send(buffer);
633
- });
634
- }
635
- });
636
- state.targetWs.addEventListener("close", (event2) => {
637
- logger3().debug({
638
- msg: "target websocket closed",
639
- targetUrl,
640
- code: event2.code,
641
- reason: event2.reason
642
- });
643
- closeWebSocketIfOpen(clientWs, event2.code, event2.reason);
644
- });
645
- state.targetWs.addEventListener("error", (error) => {
646
- logger3().error({
647
- msg: "target websocket error",
648
- targetUrl,
649
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, error)
650
- });
651
- closeWebSocketIfOpen(clientWs, 1011, "Target WebSocket error");
652
- });
653
- },
654
- onMessage: async (event, clientWs) => {
655
- if (!state.targetWs || !state.connectPromise) {
656
- logger3().error({
657
- msg: "websocket state not initialized",
658
- targetUrl
659
- });
660
- return;
661
- }
662
- try {
663
- await state.connectPromise;
664
- if (state.targetWs.readyState === WebSocket2.OPEN) {
665
- state.targetWs.send(event.data);
666
- } else {
667
- logger3().warn({
668
- msg: "target websocket not open",
669
- targetUrl,
670
- readyState: state.targetWs.readyState
671
- });
672
- }
673
- } catch (error) {
674
- logger3().error({
675
- msg: "failed to connect to target websocket",
676
- targetUrl,
677
- error
678
- });
679
- closeWebSocketIfOpen(
680
- clientWs,
681
- 1011,
682
- "Failed to connect to target"
683
- );
684
- }
685
- },
686
- onClose: (event, clientWs) => {
687
- logger3().debug({
688
- msg: "client websocket closed",
689
- targetUrl,
690
- code: event.code,
691
- reason: event.reason,
692
- wasClean: event.wasClean
693
- });
694
- if (state.targetWs) {
695
- if (state.targetWs.readyState === WebSocket2.OPEN || state.targetWs.readyState === WebSocket2.CONNECTING) {
696
- state.targetWs.close(
697
- 1e3,
698
- event.reason || "Client disconnected"
699
- );
700
- }
701
- }
702
- },
703
- onError: (event, clientWs) => {
704
- logger3().error({ msg: "client websocket error", targetUrl, event });
705
- if (state.targetWs) {
706
- if (state.targetWs.readyState === WebSocket2.OPEN) {
707
- state.targetWs.close(1011, "Client WebSocket error");
708
- } else if (state.targetWs.readyState === WebSocket2.CONNECTING) {
709
- state.targetWs.close();
710
- }
711
- }
712
- }
713
- };
714
- }
715
- function closeWebSocketIfOpen(ws, code, reason) {
716
- if (ws.readyState === 1) {
717
- ws.close(code, reason);
718
- } else if ("close" in ws && ws.readyState === WebSocket.OPEN) {
719
- ws.close(code, reason);
720
- }
721
- }
722
-
723
- // src/remote-manager-driver/mod.ts
724
- var RemoteManagerDriver = class {
725
- #config;
726
- #metadataPromise;
727
- constructor(runConfig) {
728
- if (_chunkH4TB4X25cjs.getNextPhase.call(void 0, ) === "phase-production-build") {
729
- logger3().info(
730
- "detected next.js build phase, disabling health check"
731
- );
732
- runConfig.disableMetadataLookup = true;
733
- }
734
- this.#config = { ...runConfig };
735
- if (!runConfig.disableMetadataLookup) {
736
- this.#metadataPromise = lookupMetadataCached(this.#config).then(
737
- (metadataData) => {
738
- if (metadataData.clientEndpoint) {
739
- this.#config.endpoint = metadataData.clientEndpoint;
740
- if (metadataData.clientNamespace) {
741
- this.#config.namespace = metadataData.clientNamespace;
742
- }
743
- if (metadataData.clientToken) {
744
- this.#config.token = metadataData.clientToken;
745
- }
746
- logger3().info({
747
- msg: "overriding client endpoint",
748
- endpoint: metadataData.clientEndpoint,
749
- namespace: metadataData.clientNamespace,
750
- token: metadataData.clientToken
751
- });
752
- }
753
- logger3().info({
754
- msg: "connected to rivetkit manager",
755
- runtime: metadataData.runtime,
756
- version: metadataData.version,
757
- runner: metadataData.runner
758
- });
759
- }
760
- );
761
- }
762
- }
763
- async getForId({
764
- c,
765
- name,
766
- actorId
767
- }) {
768
- if (this.#metadataPromise) {
769
- await this.#metadataPromise;
770
- }
771
- const response = await getActor(this.#config, name, actorId);
772
- const actor = response.actors[0];
773
- if (!actor) return void 0;
774
- if (actor.name !== name) {
775
- logger3().debug({
776
- msg: "actor name mismatch from api",
777
- actorId,
778
- apiName: actor.name,
779
- requestedName: name
780
- });
781
- return void 0;
782
- }
783
- return apiActorToOutput(actor);
784
- }
785
- async getWithKey({
786
- c,
787
- name,
788
- key
789
- }) {
790
- if (this.#metadataPromise) {
791
- await this.#metadataPromise;
792
- }
793
- logger3().debug({ msg: "getWithKey: searching for actor", name, key });
794
- try {
795
- const response = await getActorByKey(this.#config, name, key);
796
- const actor = response.actors[0];
797
- if (!actor) return void 0;
798
- logger3().debug({
799
- msg: "getWithKey: found actor via api",
800
- actorId: actor.actor_id,
801
- name,
802
- key
803
- });
804
- return apiActorToOutput(actor);
805
- } catch (error) {
806
- if (error instanceof EngineApiError && error.group === "actor" && error.code === "not_found") {
807
- return void 0;
808
- }
809
- throw error;
810
- }
811
- }
812
- async getOrCreateWithKey(input) {
813
- if (this.#metadataPromise) {
814
- await this.#metadataPromise;
815
- }
816
- const { c, name, key, input: actorInput, region } = input;
817
- logger3().info({
818
- msg: "getOrCreateWithKey: getting or creating actor via engine api",
819
- name,
820
- key
821
- });
822
- const { actor, created } = await getOrCreateActor(this.#config, {
823
- datacenter: region,
824
- name,
825
- key: _chunkRZW2DNNDcjs.serializeActorKey.call(void 0, key),
826
- runner_name_selector: this.#config.runnerName,
827
- input: actorInput ? _chunkRZW2DNNDcjs.uint8ArrayToBase64.call(void 0, cbor2.encode(actorInput)) : void 0,
828
- crash_policy: "sleep"
829
- });
830
- logger3().info({
831
- msg: "getOrCreateWithKey: actor ready",
832
- actorId: actor.actor_id,
833
- name,
834
- key,
835
- created
836
- });
837
- return apiActorToOutput(actor);
838
- }
839
- async createActor({
840
- c,
841
- name,
842
- key,
843
- input,
844
- region
845
- }) {
846
- if (this.#metadataPromise) {
847
- await this.#metadataPromise;
848
- }
849
- logger3().info({ msg: "creating actor via engine api", name, key });
850
- const result = await createActor(this.#config, {
851
- datacenter: region,
852
- name,
853
- runner_name_selector: this.#config.runnerName,
854
- key: _chunkRZW2DNNDcjs.serializeActorKey.call(void 0, key),
855
- input: input ? _chunkRZW2DNNDcjs.uint8ArrayToBase64.call(void 0, cbor2.encode(input)) : void 0,
856
- crash_policy: "sleep"
857
- });
858
- logger3().info({
859
- msg: "actor created",
860
- actorId: result.actor.actor_id,
861
- name,
862
- key
863
- });
864
- return apiActorToOutput(result.actor);
865
- }
866
- async listActors({ c, name }) {
867
- if (this.#metadataPromise) {
868
- await this.#metadataPromise;
869
- }
870
- logger3().debug({ msg: "listing actors via engine api", name });
871
- const response = await listActorsByName(this.#config, name);
872
- return response.actors.map(apiActorToOutput);
873
- }
874
- async destroyActor(actorId) {
875
- if (this.#metadataPromise) {
876
- await this.#metadataPromise;
877
- }
878
- logger3().info({ msg: "destroying actor via engine api", actorId });
879
- await destroyActor(this.#config, actorId);
880
- logger3().info({ msg: "actor destroyed", actorId });
881
- }
882
- async sendRequest(actorId, actorRequest) {
883
- if (this.#metadataPromise) {
884
- await this.#metadataPromise;
885
- }
886
- return await sendHttpRequestToActor(
887
- this.#config,
888
- actorId,
889
- actorRequest
890
- );
891
- }
892
- async openWebSocket(path, actorId, encoding, params) {
893
- if (this.#metadataPromise) {
894
- await this.#metadataPromise;
895
- }
896
- return await openWebSocketToActor(
897
- this.#config,
898
- path,
899
- actorId,
900
- encoding,
901
- params
902
- );
903
- }
904
- async buildGatewayUrl(actorId) {
905
- if (this.#metadataPromise) {
906
- await this.#metadataPromise;
907
- }
908
- const endpoint = getEndpoint(this.#config);
909
- return buildActorGatewayUrl(endpoint, actorId, this.#config.token);
910
- }
911
- async proxyRequest(_c, actorRequest, actorId) {
912
- if (this.#metadataPromise) {
913
- await this.#metadataPromise;
914
- }
915
- return await sendHttpRequestToActor(
916
- this.#config,
917
- actorId,
918
- actorRequest
919
- );
920
- }
921
- async proxyWebSocket(c, path, actorId, encoding, params) {
922
- var _a, _b;
923
- if (this.#metadataPromise) {
924
- await this.#metadataPromise;
925
- }
926
- const upgradeWebSocket = (_b = (_a = this.#config).getUpgradeWebSocket) == null ? void 0 : _b.call(_a);
927
- _invariant2.default.call(void 0, upgradeWebSocket, "missing getUpgradeWebSocket");
928
- const endpoint = getEndpoint(this.#config);
929
- const guardUrl = _chunkH4TB4X25cjs.combineUrlPath.call(void 0, endpoint, path);
930
- const wsGuardUrl = guardUrl.replace("http://", "ws://");
931
- logger3().debug({
932
- msg: "forwarding websocket to actor via guard",
933
- actorId,
934
- path,
935
- guardUrl
936
- });
937
- const protocols = buildWebSocketProtocols(
938
- this.#config,
939
- encoding,
940
- params
941
- );
942
- const args = await createWebSocketProxy(c, wsGuardUrl, protocols);
943
- return await upgradeWebSocket(() => args)(c, _chunkH4TB4X25cjs.noopNext.call(void 0, ));
944
- }
945
- async kvGet(actorId, key) {
946
- if (this.#metadataPromise) {
947
- await this.#metadataPromise;
948
- }
949
- logger3().debug({ msg: "getting kv value via engine api", key });
950
- const response = await kvGet(
951
- this.#config,
952
- actorId,
953
- new TextDecoder("utf8").decode(key)
954
- );
955
- return response.value;
956
- }
957
- displayInformation() {
958
- return { properties: {} };
959
- }
960
- setGetUpgradeWebSocket(getUpgradeWebSocket) {
961
- this.#config.getUpgradeWebSocket = getUpgradeWebSocket;
962
- }
963
- };
964
- function apiActorToOutput(actor) {
965
- return {
966
- actorId: actor.actor_id,
967
- name: actor.name,
968
- key: _chunkRZW2DNNDcjs.deserializeActorKey.call(void 0, actor.key),
969
- createTs: actor.create_ts,
970
- startTs: _nullishCoalesce(actor.start_ts, () => ( null)),
971
- connectableTs: _nullishCoalesce(actor.connectable_ts, () => ( null)),
972
- sleepTs: _nullishCoalesce(actor.sleep_ts, () => ( null)),
973
- destroyTs: _nullishCoalesce(actor.destroy_ts, () => ( null)),
974
- error: _nullishCoalesce(actor.error, () => ( void 0))
975
- };
976
- }
977
-
978
- // src/client/actor-conn.ts
979
-
980
-
981
-
982
-
983
- // src/client/actor-query.ts
984
- async function queryActor(c, query, managerDriver) {
985
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({ msg: "querying actor", query: JSON.stringify(query) });
986
- let actorOutput;
987
- if ("getForId" in query) {
988
- const output = await managerDriver.getForId({
989
- c,
990
- name: query.getForId.name,
991
- actorId: query.getForId.actorId
992
- });
993
- if (!output) throw new (0, _chunk2XQS746Mcjs.ActorNotFound)(query.getForId.actorId);
994
- actorOutput = output;
995
- } else if ("getForKey" in query) {
996
- const existingActor = await managerDriver.getWithKey({
997
- c,
998
- name: query.getForKey.name,
999
- key: query.getForKey.key
1000
- });
1001
- if (!existingActor) {
1002
- throw new (0, _chunk2XQS746Mcjs.ActorNotFound)(
1003
- `${query.getForKey.name}:${JSON.stringify(query.getForKey.key)}`
1004
- );
1005
- }
1006
- actorOutput = existingActor;
1007
- } else if ("getOrCreateForKey" in query) {
1008
- const getOrCreateOutput = await managerDriver.getOrCreateWithKey({
1009
- c,
1010
- name: query.getOrCreateForKey.name,
1011
- key: query.getOrCreateForKey.key,
1012
- input: query.getOrCreateForKey.input,
1013
- region: query.getOrCreateForKey.region
1014
- });
1015
- actorOutput = {
1016
- actorId: getOrCreateOutput.actorId
1017
- };
1018
- } else if ("create" in query) {
1019
- const createOutput = await managerDriver.createActor({
1020
- c,
1021
- name: query.create.name,
1022
- key: query.create.key,
1023
- input: query.create.input,
1024
- region: query.create.region
1025
- });
1026
- actorOutput = {
1027
- actorId: createOutput.actorId
1028
- };
1029
- } else {
1030
- throw new (0, _chunk2XQS746Mcjs.InvalidRequest)("Invalid query format");
1031
- }
1032
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({ msg: "actor query result", actorId: actorOutput.actorId });
1033
- return { actorId: actorOutput.actorId };
1034
- }
1035
- function getActorNameFromQuery(query) {
1036
- if ("getForId" in query) return query.getForId.name;
1037
- if ("getForKey" in query) return query.getForKey.name;
1038
- if ("getOrCreateForKey" in query) return query.getOrCreateForKey.name;
1039
- if ("create" in query) return query.create.name;
1040
- throw new (0, _chunk2XQS746Mcjs.InvalidRequest)("Invalid query format");
1041
- }
1042
- async function checkForSchedulingError(group, code, actorId, query, driver) {
1043
- const name = getActorNameFromQuery(query);
1044
- try {
1045
- const actor = await driver.getForId({ name, actorId });
1046
- if (actor == null ? void 0 : actor.error) {
1047
- _chunkEJVBH5VFcjs.logger.call(void 0, ).info({
1048
- msg: "found actor scheduling error",
1049
- actorId,
1050
- error: actor.error
1051
- });
1052
- return new ActorSchedulingError(group, code, actorId, actor.error);
1053
- }
1054
- } catch (err) {
1055
- _chunkEJVBH5VFcjs.logger.call(void 0, ).warn({
1056
- msg: "failed to fetch actor details for scheduling error check",
1057
- actorId,
1058
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, err)
1059
- });
1060
- }
1061
- return null;
1062
- }
1063
-
1064
- // src/client/actor-conn.ts
1065
- var CONNECT_SYMBOL = Symbol("connect");
1066
- var ActorConnRaw = class {
1067
- #disposed = false;
1068
- /* Will be aborted on dispose. */
1069
- #abortController = new AbortController();
1070
- #connStatus = "idle";
1071
- #actorId;
1072
- #connId;
1073
- #messageQueue = [];
1074
- #actionsInFlight = /* @__PURE__ */ new Map();
1075
- // biome-ignore lint/suspicious/noExplicitAny: Unknown subscription type
1076
- #eventSubscriptions = /* @__PURE__ */ new Map();
1077
- #errorHandlers = /* @__PURE__ */ new Set();
1078
- #openHandlers = /* @__PURE__ */ new Set();
1079
- #closeHandlers = /* @__PURE__ */ new Set();
1080
- #statusChangeHandlers = /* @__PURE__ */ new Set();
1081
- #actionIdCounter = 0;
1082
- /**
1083
- * Interval that keeps the NodeJS process alive if this is the only thing running.
1084
- *
1085
- * See ttps://github.com/nodejs/node/issues/22088
1086
- */
1087
- #keepNodeAliveInterval;
1088
- /** Promise used to indicate the socket has connected successfully. This will be rejected if the connection fails. */
1089
- #onOpenPromise;
1090
- #websocket;
1091
- #client;
1092
- #driver;
1093
- #params;
1094
- #encoding;
1095
- #actorQuery;
1096
- // TODO: ws message queue
1097
- /**
1098
- * Do not call this directly.
1099
- *
1100
- * Creates an instance of ActorConnRaw.
1101
- *
1102
- * @protected
1103
- */
1104
- constructor(client, driver, params, encoding, actorQuery) {
1105
- this.#client = client;
1106
- this.#driver = driver;
1107
- this.#params = params;
1108
- this.#encoding = encoding;
1109
- this.#actorQuery = actorQuery;
1110
- this.#keepNodeAliveInterval = setInterval(() => 6e4);
1111
- }
1112
- /**
1113
- * Call a raw action connection. See {@link ActorConn} for type-safe action calls.
1114
- *
1115
- * @see {@link ActorConn}
1116
- * @template Args - The type of arguments to pass to the action function.
1117
- * @template Response - The type of the response returned by the action function.
1118
- * @param {string} name - The name of the action function to call.
1119
- * @param {...Args} args - The arguments to pass to the action function.
1120
- * @returns {Promise<Response>} - A promise that resolves to the response of the action function.
1121
- */
1122
- async action(opts) {
1123
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({ msg: "action", name: opts.name, args: opts.args });
1124
- const actionId = this.#actionIdCounter;
1125
- this.#actionIdCounter += 1;
1126
- const { promise, resolve, reject } = _chunkH4TB4X25cjs.promiseWithResolvers.call(void 0, );
1127
- this.#actionsInFlight.set(actionId, {
1128
- name: opts.name,
1129
- resolve,
1130
- reject
1131
- });
1132
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({
1133
- msg: "added action to in-flight map",
1134
- actionId,
1135
- actionName: opts.name,
1136
- inFlightCount: this.#actionsInFlight.size
1137
- });
1138
- this.#sendMessage({
1139
- body: {
1140
- tag: "ActionRequest",
1141
- val: {
1142
- id: BigInt(actionId),
1143
- name: opts.name,
1144
- args: opts.args
1145
- }
1146
- }
1147
- });
1148
- const { id: responseId, output } = await promise;
1149
- if (responseId !== BigInt(actionId))
1150
- throw new Error(
1151
- `Request ID ${actionId} does not match response ID ${responseId}`
1152
- );
1153
- return output;
1154
- }
1155
- /**
1156
- * Do not call this directly.
1157
- enc
1158
- * Establishes a connection to the server using the specified endpoint & encoding & driver.
1159
- *
1160
- * @protected
1161
- */
1162
- [CONNECT_SYMBOL]() {
1163
- this.#connectWithRetry();
1164
- }
1165
- #setConnStatus(status) {
1166
- const prevStatus = this.#connStatus;
1167
- if (prevStatus === status) return;
1168
- this.#connStatus = status;
1169
- for (const handler of [...this.#statusChangeHandlers]) {
1170
- try {
1171
- handler(status);
1172
- } catch (err) {
1173
- _chunkEJVBH5VFcjs.logger.call(void 0, ).error({
1174
- msg: "error in status change handler",
1175
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, err)
1176
- });
1177
- }
1178
- }
1179
- if (status === "connected") {
1180
- for (const handler of [...this.#openHandlers]) {
1181
- try {
1182
- handler();
1183
- } catch (err) {
1184
- _chunkEJVBH5VFcjs.logger.call(void 0, ).error({
1185
- msg: "error in open handler",
1186
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, err)
1187
- });
1188
- }
1189
- }
1190
- }
1191
- if ((status === "disconnected" || status === "idle") && prevStatus === "connected") {
1192
- for (const handler of [...this.#closeHandlers]) {
1193
- try {
1194
- handler();
1195
- } catch (err) {
1196
- _chunkEJVBH5VFcjs.logger.call(void 0, ).error({
1197
- msg: "error in close handler",
1198
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, err)
1199
- });
1200
- }
1201
- }
1202
- }
1203
- }
1204
- #connectWithRetry() {
1205
- this.#setConnStatus("connecting");
1206
- _pretry2.default.call(void 0, this.#connectAndWait.bind(this), {
1207
- forever: true,
1208
- minTimeout: 250,
1209
- maxTimeout: 3e4,
1210
- onFailedAttempt: (error) => {
1211
- _chunkEJVBH5VFcjs.logger.call(void 0, ).warn({
1212
- msg: "failed to reconnect",
1213
- attempt: error.attemptNumber,
1214
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, error)
1215
- });
1216
- },
1217
- // Cancel retry if aborted
1218
- signal: this.#abortController.signal
1219
- }).catch((err) => {
1220
- if (err.name === "AbortError") {
1221
- _chunkEJVBH5VFcjs.logger.call(void 0, ).info({ msg: "connection retry aborted" });
1222
- } else {
1223
- _chunkEJVBH5VFcjs.logger.call(void 0, ).error({
1224
- msg: "unexpected error in connection retry",
1225
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, err)
1226
- });
1227
- }
1228
- });
1229
- }
1230
- async #connectAndWait() {
1231
- try {
1232
- if (this.#onOpenPromise)
1233
- throw new Error("#onOpenPromise already defined");
1234
- this.#onOpenPromise = _chunkH4TB4X25cjs.promiseWithResolvers.call(void 0, );
1235
- await this.#connectWebSocket();
1236
- await this.#onOpenPromise.promise;
1237
- } finally {
1238
- this.#onOpenPromise = void 0;
1239
- }
1240
- }
1241
- async #connectWebSocket() {
1242
- const { actorId } = await queryActor(
1243
- void 0,
1244
- this.#actorQuery,
1245
- this.#driver
1246
- );
1247
- this.#actorId = actorId;
1248
- const ws = await this.#driver.openWebSocket(
1249
- _chunkRZW2DNNDcjs.PATH_CONNECT,
1250
- actorId,
1251
- this.#encoding,
1252
- this.#params
1253
- );
1254
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({
1255
- msg: "opened websocket",
1256
- connId: this.#connId,
1257
- readyState: ws.readyState,
1258
- messageQueueLength: this.#messageQueue.length
1259
- });
1260
- this.#websocket = ws;
1261
- ws.addEventListener("open", () => {
1262
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({
1263
- msg: "client websocket open",
1264
- connId: this.#connId
1265
- });
1266
- });
1267
- ws.addEventListener("message", async (ev) => {
1268
- try {
1269
- await this.#handleOnMessage(ev.data);
1270
- } catch (err) {
1271
- _chunkEJVBH5VFcjs.logger.call(void 0, ).error({
1272
- msg: "error in websocket message handler",
1273
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, err)
1274
- });
1275
- }
1276
- });
1277
- ws.addEventListener("close", async (ev) => {
1278
- try {
1279
- await this.#handleOnClose(ev);
1280
- } catch (err) {
1281
- _chunkEJVBH5VFcjs.logger.call(void 0, ).error({
1282
- msg: "error in websocket close handler",
1283
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, err)
1284
- });
1285
- }
1286
- });
1287
- ws.addEventListener("error", (_ev) => {
1288
- try {
1289
- this.#handleOnError();
1290
- } catch (err) {
1291
- _chunkEJVBH5VFcjs.logger.call(void 0, ).error({
1292
- msg: "error in websocket error handler",
1293
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, err)
1294
- });
1295
- }
1296
- });
1297
- }
1298
- /** Called by the onopen event from drivers. */
1299
- #handleOnOpen() {
1300
- if (this.#disposed) {
1301
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({
1302
- msg: "handleOnOpen called after dispose, closing websocket"
1303
- });
1304
- if (this.#websocket) {
1305
- this.#websocket.close(1e3, "Disposed");
1306
- this.#websocket = void 0;
1307
- }
1308
- return;
1309
- }
1310
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({
1311
- msg: "socket open",
1312
- messageQueueLength: this.#messageQueue.length,
1313
- connId: this.#connId
1314
- });
1315
- this.#setConnStatus("connected");
1316
- if (this.#onOpenPromise) {
1317
- this.#onOpenPromise.resolve(void 0);
1318
- } else {
1319
- _chunkEJVBH5VFcjs.logger.call(void 0, ).warn({ msg: "#onOpenPromise is undefined" });
1320
- }
1321
- for (const eventName of this.#eventSubscriptions.keys()) {
1322
- this.#sendSubscription(eventName, true);
1323
- }
1324
- const queue = this.#messageQueue;
1325
- this.#messageQueue = [];
1326
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({
1327
- msg: "flushing message queue",
1328
- queueLength: queue.length
1329
- });
1330
- for (const msg of queue) {
1331
- this.#sendMessage(msg);
1332
- }
1333
- }
1334
- /** Called by the onmessage event from drivers. */
1335
- async #handleOnMessage(data) {
1336
- _chunkEJVBH5VFcjs.logger.call(void 0, ).trace({
1337
- msg: "received message",
1338
- dataType: typeof data,
1339
- isBlob: data instanceof Blob,
1340
- isArrayBuffer: data instanceof ArrayBuffer
1341
- });
1342
- const response = await this.#parseMessage(data);
1343
- _chunkEJVBH5VFcjs.logger.call(void 0, ).trace(
1344
- _chunkH4TB4X25cjs.getLogMessage.call(void 0, ) ? {
1345
- msg: "parsed message",
1346
- message: _chunkRZW2DNNDcjs.jsonStringifyCompat.call(void 0, response).substring(0, 100) + "..."
1347
- } : { msg: "parsed message" }
1348
- );
1349
- if (response.body.tag === "Init") {
1350
- this.#actorId = response.body.val.actorId;
1351
- this.#connId = response.body.val.connectionId;
1352
- _chunkEJVBH5VFcjs.logger.call(void 0, ).trace({
1353
- msg: "received init message",
1354
- actorId: this.#actorId,
1355
- connId: this.#connId
1356
- });
1357
- this.#handleOnOpen();
1358
- } else if (response.body.tag === "Error") {
1359
- const { group, code, message, metadata, actionId } = response.body.val;
1360
- if (actionId) {
1361
- const inFlight = this.#takeActionInFlight(Number(actionId));
1362
- _chunkEJVBH5VFcjs.logger.call(void 0, ).warn({
1363
- msg: "action error",
1364
- actionId,
1365
- actionName: inFlight == null ? void 0 : inFlight.name,
1366
- group,
1367
- code,
1368
- message,
1369
- metadata
1370
- });
1371
- inFlight.reject(
1372
- new ActorError(group, code, message, metadata)
1373
- );
1374
- } else {
1375
- _chunkEJVBH5VFcjs.logger.call(void 0, ).warn({
1376
- msg: "connection error",
1377
- group,
1378
- code,
1379
- message,
1380
- metadata
1381
- });
1382
- let errorToThrow = new ActorError(
1383
- group,
1384
- code,
1385
- message,
1386
- metadata
1387
- );
1388
- if (isSchedulingError(group, code) && this.#actorId) {
1389
- const schedulingError = await checkForSchedulingError(
1390
- group,
1391
- code,
1392
- this.#actorId,
1393
- this.#actorQuery,
1394
- this.#driver
1395
- );
1396
- if (schedulingError) {
1397
- errorToThrow = schedulingError;
1398
- }
1399
- }
1400
- if (this.#onOpenPromise) {
1401
- this.#onOpenPromise.reject(errorToThrow);
1402
- }
1403
- for (const [id, inFlight] of this.#actionsInFlight.entries()) {
1404
- inFlight.reject(errorToThrow);
1405
- this.#actionsInFlight.delete(id);
1406
- }
1407
- this.#dispatchActorError(errorToThrow);
1408
- }
1409
- } else if (response.body.tag === "ActionResponse") {
1410
- const { id: actionId } = response.body.val;
1411
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({
1412
- msg: "received action response",
1413
- actionId: Number(actionId),
1414
- inFlightCount: this.#actionsInFlight.size,
1415
- inFlightIds: Array.from(this.#actionsInFlight.keys())
1416
- });
1417
- const inFlight = this.#takeActionInFlight(Number(actionId));
1418
- _chunkEJVBH5VFcjs.logger.call(void 0, ).trace({
1419
- msg: "resolving action promise",
1420
- actionId,
1421
- actionName: inFlight == null ? void 0 : inFlight.name
1422
- });
1423
- inFlight.resolve(response.body.val);
1424
- } else if (response.body.tag === "Event") {
1425
- _chunkEJVBH5VFcjs.logger.call(void 0, ).trace({
1426
- msg: "received event",
1427
- name: response.body.val.name
1428
- });
1429
- this.#dispatchEvent(response.body.val);
1430
- } else {
1431
- _chunkH4TB4X25cjs.assertUnreachable.call(void 0, response.body);
1432
- }
1433
- }
1434
- /** Called by the onclose event from drivers. */
1435
- async #handleOnClose(event) {
1436
- const closeEvent = event;
1437
- const wasClean = closeEvent.wasClean;
1438
- const wasConnected = this.#connStatus === "connected";
1439
- _chunkEJVBH5VFcjs.logger.call(void 0, ).info({
1440
- msg: "socket closed",
1441
- code: closeEvent.code,
1442
- reason: closeEvent.reason,
1443
- wasClean,
1444
- disposed: this.#disposed,
1445
- connId: this.#connId
1446
- });
1447
- this.#websocket = void 0;
1448
- if (this.#disposed) {
1449
- this.#rejectPendingPromises(new ActorConnDisposed(), true);
1450
- } else {
1451
- this.#setConnStatus("disconnected");
1452
- let error;
1453
- const reason = closeEvent.reason || "";
1454
- const parsed = parseWebSocketCloseReason(reason);
1455
- if (parsed) {
1456
- const { group, code } = parsed;
1457
- if (isSchedulingError(group, code) && this.#actorId) {
1458
- const schedulingError = await checkForSchedulingError(
1459
- group,
1460
- code,
1461
- this.#actorId,
1462
- this.#actorQuery,
1463
- this.#driver
1464
- );
1465
- if (schedulingError) {
1466
- error = schedulingError;
1467
- } else {
1468
- error = new ActorError(
1469
- group,
1470
- code,
1471
- `Connection closed: ${reason}`,
1472
- void 0
1473
- );
1474
- }
1475
- } else {
1476
- error = new ActorError(
1477
- group,
1478
- code,
1479
- `Connection closed: ${reason}`,
1480
- void 0
1481
- );
1482
- }
1483
- } else {
1484
- error = new Error(
1485
- `${wasClean ? "Connection closed" : "Connection lost"} (code: ${closeEvent.code}, reason: ${reason})`
1486
- );
1487
- }
1488
- this.#rejectPendingPromises(error, false);
1489
- if (error instanceof ActorError) {
1490
- this.#dispatchActorError(error);
1491
- }
1492
- if (wasConnected) {
1493
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({
1494
- msg: "triggering reconnect",
1495
- connId: this.#connId
1496
- });
1497
- this.#connectWithRetry();
1498
- }
1499
- }
1500
- }
1501
- #rejectPendingPromises(error, suppressUnhandled) {
1502
- if (this.#onOpenPromise) {
1503
- if (suppressUnhandled) {
1504
- this.#onOpenPromise.promise.catch(() => {
1505
- });
1506
- }
1507
- this.#onOpenPromise.reject(error);
1508
- }
1509
- for (const actionInfo of this.#actionsInFlight.values()) {
1510
- actionInfo.reject(error);
1511
- }
1512
- this.#actionsInFlight.clear();
1513
- }
1514
- /** Called by the onerror event from drivers. */
1515
- #handleOnError() {
1516
- if (this.#disposed) return;
1517
- _chunkEJVBH5VFcjs.logger.call(void 0, ).warn("socket error");
1518
- }
1519
- #takeActionInFlight(id) {
1520
- const inFlight = this.#actionsInFlight.get(id);
1521
- if (!inFlight) {
1522
- _chunkEJVBH5VFcjs.logger.call(void 0, ).error({
1523
- msg: "action not found in in-flight map",
1524
- lookupId: id,
1525
- inFlightCount: this.#actionsInFlight.size,
1526
- inFlightIds: Array.from(this.#actionsInFlight.keys()),
1527
- inFlightActions: Array.from(
1528
- this.#actionsInFlight.entries()
1529
- ).map(([id2, action]) => ({
1530
- id: id2,
1531
- name: action.name
1532
- }))
1533
- });
1534
- throw new InternalError2(`No in flight response for ${id}`);
1535
- }
1536
- this.#actionsInFlight.delete(id);
1537
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({
1538
- msg: "removed action from in-flight map",
1539
- actionId: id,
1540
- actionName: inFlight.name,
1541
- inFlightCount: this.#actionsInFlight.size
1542
- });
1543
- return inFlight;
1544
- }
1545
- #dispatchEvent(event) {
1546
- const { name, args } = event;
1547
- const listeners = this.#eventSubscriptions.get(name);
1548
- if (!listeners) return;
1549
- for (const listener of [...listeners]) {
1550
- listener.callback(...args);
1551
- if (listener.once) {
1552
- listeners.delete(listener);
1553
- }
1554
- }
1555
- if (listeners.size === 0) {
1556
- this.#eventSubscriptions.delete(name);
1557
- }
1558
- }
1559
- #dispatchActorError(error) {
1560
- for (const handler of [...this.#errorHandlers]) {
1561
- try {
1562
- handler(error);
1563
- } catch (err) {
1564
- _chunkEJVBH5VFcjs.logger.call(void 0, ).error({
1565
- msg: "error in connection error handler",
1566
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, err)
1567
- });
1568
- }
1569
- }
1570
- }
1571
- #addEventSubscription(eventName, callback, once) {
1572
- const listener = {
1573
- callback,
1574
- once
1575
- };
1576
- let subscriptionSet = this.#eventSubscriptions.get(eventName);
1577
- if (subscriptionSet === void 0) {
1578
- subscriptionSet = /* @__PURE__ */ new Set();
1579
- this.#eventSubscriptions.set(eventName, subscriptionSet);
1580
- this.#sendSubscription(eventName, true);
1581
- }
1582
- subscriptionSet.add(listener);
1583
- return () => {
1584
- const listeners = this.#eventSubscriptions.get(eventName);
1585
- if (listeners) {
1586
- listeners.delete(listener);
1587
- if (listeners.size === 0) {
1588
- this.#eventSubscriptions.delete(eventName);
1589
- this.#sendSubscription(eventName, false);
1590
- }
1591
- }
1592
- };
1593
- }
1594
- /**
1595
- * Subscribes to an event that will happen repeatedly.
1596
- *
1597
- * @template Args - The type of arguments the event callback will receive.
1598
- * @param {string} eventName - The name of the event to subscribe to.
1599
- * @param {(...args: Args) => void} callback - The callback function to execute when the event is triggered.
1600
- * @returns {EventUnsubscribe} - A function to unsubscribe from the event.
1601
- * @see {@link https://rivet.dev/docs/events|Events Documentation}
1602
- */
1603
- on(eventName, callback) {
1604
- return this.#addEventSubscription(eventName, callback, false);
1605
- }
1606
- /**
1607
- * Subscribes to an event that will be triggered only once.
1608
- *
1609
- * @template Args - The type of arguments the event callback will receive.
1610
- * @param {string} eventName - The name of the event to subscribe to.
1611
- * @param {(...args: Args) => void} callback - The callback function to execute when the event is triggered.
1612
- * @returns {EventUnsubscribe} - A function to unsubscribe from the event.
1613
- * @see {@link https://rivet.dev/docs/events|Events Documentation}
1614
- */
1615
- once(eventName, callback) {
1616
- return this.#addEventSubscription(eventName, callback, true);
1617
- }
1618
- /**
1619
- * Subscribes to connection errors.
1620
- *
1621
- * @param {ActorErrorCallback} callback - The callback function to execute when a connection error occurs.
1622
- * @returns {() => void} - A function to unsubscribe from the error handler.
1623
- */
1624
- onError(callback) {
1625
- this.#errorHandlers.add(callback);
1626
- return () => {
1627
- this.#errorHandlers.delete(callback);
1628
- };
1629
- }
1630
- /**
1631
- * Returns the current connection status.
1632
- *
1633
- * @returns {ActorConnStatus} - The current connection status.
1634
- */
1635
- get connStatus() {
1636
- return this.#connStatus;
1637
- }
1638
- /**
1639
- * Returns whether the connection is currently open.
1640
- *
1641
- * @deprecated Use `connStatus` instead.
1642
- * @returns {boolean} - True if the connection is open, false otherwise.
1643
- */
1644
- get isConnected() {
1645
- return this.#connStatus === "connected";
1646
- }
1647
- /**
1648
- * Subscribes to connection open events.
1649
- *
1650
- * This is called when the WebSocket connection is established and the Init message is received.
1651
- *
1652
- * @param {ConnectionStateCallback} callback - The callback function to execute when the connection opens.
1653
- * @returns {() => void} - A function to unsubscribe from the open handler.
1654
- */
1655
- onOpen(callback) {
1656
- this.#openHandlers.add(callback);
1657
- return () => {
1658
- this.#openHandlers.delete(callback);
1659
- };
1660
- }
1661
- /**
1662
- * Subscribes to connection close events.
1663
- *
1664
- * This is called when the WebSocket connection is closed. The connection will automatically
1665
- * attempt to reconnect unless disposed.
1666
- *
1667
- * @param {ConnectionStateCallback} callback - The callback function to execute when the connection closes.
1668
- * @returns {() => void} - A function to unsubscribe from the close handler.
1669
- */
1670
- onClose(callback) {
1671
- this.#closeHandlers.add(callback);
1672
- return () => {
1673
- this.#closeHandlers.delete(callback);
1674
- };
1675
- }
1676
- /**
1677
- * Subscribes to connection status changes.
1678
- *
1679
- * This is called whenever the connection status changes between Disconnected, Connecting, and Connected.
1680
- *
1681
- * @param {StatusChangeCallback} callback - The callback function to execute when the status changes.
1682
- * @returns {() => void} - A function to unsubscribe from the status change handler.
1683
- */
1684
- onStatusChange(callback) {
1685
- this.#statusChangeHandlers.add(callback);
1686
- return () => {
1687
- this.#statusChangeHandlers.delete(callback);
1688
- };
1689
- }
1690
- #sendMessage(message, opts) {
1691
- var _a, _b;
1692
- if (this.#disposed) {
1693
- if (opts == null ? void 0 : opts.ephemeral) {
1694
- return;
1695
- } else {
1696
- throw new ActorConnDisposed();
1697
- }
1698
- }
1699
- let queueMessage = false;
1700
- if (this.#websocket) {
1701
- const readyState = this.#websocket.readyState;
1702
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({
1703
- msg: "websocket send attempt",
1704
- readyState,
1705
- readyStateString: readyState === 0 ? "CONNECTING" : readyState === 1 ? "OPEN" : readyState === 2 ? "CLOSING" : "CLOSED",
1706
- connId: this.#connId,
1707
- messageType: message.body.tag,
1708
- actionName: (_a = message.body.val) == null ? void 0 : _a.name
1709
- });
1710
- if (readyState === 1) {
1711
- try {
1712
- const messageSerialized = _chunkRZW2DNNDcjs.serializeWithEncoding.call(void 0,
1713
- this.#encoding,
1714
- message,
1715
- _chunkRZW2DNNDcjs.TO_SERVER_VERSIONED,
1716
- _chunkRZW2DNNDcjs.CURRENT_VERSION,
1717
- _chunkRZW2DNNDcjs.ToServerSchema,
1718
- // JSON: args is the raw value
1719
- (msg) => msg,
1720
- // BARE: args needs to be CBOR-encoded to ArrayBuffer
1721
- (msg) => {
1722
- if (msg.body.tag === "ActionRequest") {
1723
- return {
1724
- body: {
1725
- tag: "ActionRequest",
1726
- val: {
1727
- id: msg.body.val.id,
1728
- name: msg.body.val.name,
1729
- args: _chunkH4TB4X25cjs.bufferToArrayBuffer.call(void 0,
1730
- cbor3.encode(msg.body.val.args)
1731
- )
1732
- }
1733
- }
1734
- };
1735
- } else {
1736
- return msg;
1737
- }
1738
- }
1739
- );
1740
- this.#websocket.send(messageSerialized);
1741
- _chunkEJVBH5VFcjs.logger.call(void 0, ).trace({
1742
- msg: "sent websocket message",
1743
- len: messageLength(messageSerialized)
1744
- });
1745
- } catch (error) {
1746
- _chunkEJVBH5VFcjs.logger.call(void 0, ).warn({
1747
- msg: "failed to send message, added to queue",
1748
- error,
1749
- connId: this.#connId
1750
- });
1751
- queueMessage = true;
1752
- }
1753
- } else {
1754
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({
1755
- msg: "websocket not open, queueing message",
1756
- readyState
1757
- });
1758
- queueMessage = true;
1759
- }
1760
- } else {
1761
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({ msg: "no websocket, queueing message" });
1762
- queueMessage = true;
1763
- }
1764
- if (!(opts == null ? void 0 : opts.ephemeral) && queueMessage) {
1765
- this.#messageQueue.push(message);
1766
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({
1767
- msg: "queued connection message",
1768
- queueLength: this.#messageQueue.length,
1769
- connId: this.#connId,
1770
- messageType: message.body.tag,
1771
- actionName: (_b = message.body.val) == null ? void 0 : _b.name
1772
- });
1773
- }
1774
- }
1775
- async #parseMessage(data) {
1776
- _invariant2.default.call(void 0, this.#websocket, "websocket must be defined");
1777
- const buffer = await _chunkRZW2DNNDcjs.inputDataToBuffer.call(void 0, data);
1778
- return _chunkRZW2DNNDcjs.deserializeWithEncoding.call(void 0,
1779
- this.#encoding,
1780
- buffer,
1781
- _chunkRZW2DNNDcjs.TO_CLIENT_VERSIONED,
1782
- _chunkRZW2DNNDcjs.ToClientSchema,
1783
- // JSON: values are already the correct type
1784
- (msg) => msg,
1785
- // BARE: need to decode ArrayBuffer fields back to unknown
1786
- (msg) => {
1787
- if (msg.body.tag === "Error") {
1788
- return {
1789
- body: {
1790
- tag: "Error",
1791
- val: {
1792
- group: msg.body.val.group,
1793
- code: msg.body.val.code,
1794
- message: msg.body.val.message,
1795
- metadata: msg.body.val.metadata ? cbor3.decode(
1796
- new Uint8Array(
1797
- msg.body.val.metadata
1798
- )
1799
- ) : null,
1800
- actionId: msg.body.val.actionId
1801
- }
1802
- }
1803
- };
1804
- } else if (msg.body.tag === "ActionResponse") {
1805
- return {
1806
- body: {
1807
- tag: "ActionResponse",
1808
- val: {
1809
- id: msg.body.val.id,
1810
- output: cbor3.decode(
1811
- new Uint8Array(msg.body.val.output)
1812
- )
1813
- }
1814
- }
1815
- };
1816
- } else if (msg.body.tag === "Event") {
1817
- return {
1818
- body: {
1819
- tag: "Event",
1820
- val: {
1821
- name: msg.body.val.name,
1822
- args: cbor3.decode(
1823
- new Uint8Array(msg.body.val.args)
1824
- )
1825
- }
1826
- }
1827
- };
1828
- } else {
1829
- return msg;
1830
- }
1831
- }
1832
- );
1833
- }
1834
- /**
1835
- * Get the actor ID (for testing purposes).
1836
- * @internal
1837
- */
1838
- get actorId() {
1839
- return this.#actorId;
1840
- }
1841
- /**
1842
- * Get the connection ID (for testing purposes).
1843
- * @internal
1844
- */
1845
- get connId() {
1846
- return this.#connId;
1847
- }
1848
- /**
1849
- * Get the connection ID (for testing purposes).
1850
- * @internal
1851
- * @deprecated Use `connId` instead.
1852
- */
1853
- get connectionId() {
1854
- return this.#connId;
1855
- }
1856
- /**
1857
- * Disconnects from the actor.
1858
- *
1859
- * @returns {Promise<void>} A promise that resolves when the socket is gracefully closed.
1860
- */
1861
- async dispose() {
1862
- if (this.#disposed) {
1863
- _chunkEJVBH5VFcjs.logger.call(void 0, ).warn({ msg: "connection already disconnected" });
1864
- return;
1865
- }
1866
- this.#disposed = true;
1867
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({ msg: "disposing actor conn" });
1868
- this.#setConnStatus("idle");
1869
- clearInterval(this.#keepNodeAliveInterval);
1870
- this.#abortController.abort();
1871
- this.#client[ACTOR_CONNS_SYMBOL].delete(this);
1872
- if (this.#websocket) {
1873
- const ws = this.#websocket;
1874
- if (ws.readyState !== 2 && ws.readyState !== 3) {
1875
- const { promise, resolve } = _chunkH4TB4X25cjs.promiseWithResolvers.call(void 0, );
1876
- ws.addEventListener("close", () => resolve(void 0));
1877
- ws.close(1e3, "Disposed");
1878
- await promise;
1879
- }
1880
- } else {
1881
- this.#rejectPendingPromises(new ActorConnDisposed(), true);
1882
- }
1883
- this.#websocket = void 0;
1884
- }
1885
- #sendSubscription(eventName, subscribe) {
1886
- this.#sendMessage(
1887
- {
1888
- body: {
1889
- tag: "SubscriptionRequest",
1890
- val: {
1891
- eventName,
1892
- subscribe
1893
- }
1894
- }
1895
- },
1896
- { ephemeral: true }
1897
- );
1898
- }
1899
- };
1900
-
1901
- // src/client/actor-handle.ts
1902
-
1903
-
1904
-
1905
- // src/client/raw-utils.ts
1906
-
1907
- async function rawHttpFetch(driver, actorQuery, params, input, init) {
1908
- let path;
1909
- let mergedInit = init || {};
1910
- if (typeof input === "string") {
1911
- path = input;
1912
- } else if (input instanceof URL) {
1913
- path = input.pathname + input.search;
1914
- } else if (input instanceof Request) {
1915
- const url = new URL(input.url);
1916
- path = url.pathname + url.search;
1917
- const requestHeaders = new Headers(input.headers);
1918
- const initHeaders = new Headers((init == null ? void 0 : init.headers) || {});
1919
- const mergedHeaders = new Headers(requestHeaders);
1920
- initHeaders.forEach((value, key) => {
1921
- mergedHeaders.set(key, value);
1922
- });
1923
- mergedInit = {
1924
- method: input.method,
1925
- body: input.body,
1926
- mode: input.mode,
1927
- credentials: input.credentials,
1928
- redirect: input.redirect,
1929
- referrer: input.referrer,
1930
- referrerPolicy: input.referrerPolicy,
1931
- integrity: input.integrity,
1932
- keepalive: input.keepalive,
1933
- signal: input.signal,
1934
- ...mergedInit,
1935
- // init overrides Request properties
1936
- headers: mergedHeaders
1937
- // headers must be set after spread to ensure proper merge
1938
- };
1939
- if (mergedInit.body) {
1940
- mergedInit.duplex = "half";
1941
- }
1942
- } else {
1943
- throw new TypeError("Invalid input type for fetch");
1944
- }
1945
- try {
1946
- const { actorId } = await queryActor(void 0, actorQuery, driver);
1947
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({ msg: "found actor for raw http", actorId });
1948
- _invariant2.default.call(void 0, actorId, "Missing actor ID");
1949
- const normalizedPath = path.startsWith("/") ? path.slice(1) : path;
1950
- const url = new URL(`http://actor/request/${normalizedPath}`);
1951
- const proxyRequestHeaders = new Headers(mergedInit.headers);
1952
- if (params) {
1953
- proxyRequestHeaders.set(_chunkRZW2DNNDcjs.HEADER_CONN_PARAMS, JSON.stringify(params));
1954
- }
1955
- const proxyRequest = new Request(url, {
1956
- ...mergedInit,
1957
- headers: proxyRequestHeaders
1958
- });
1959
- return driver.sendRequest(actorId, proxyRequest);
1960
- } catch (err) {
1961
- const { group, code, message, metadata } = _chunkH4TB4X25cjs.deconstructError.call(void 0,
1962
- err,
1963
- _chunkEJVBH5VFcjs.logger.call(void 0, ),
1964
- {},
1965
- true
1966
- );
1967
- throw new ActorError(group, code, message, metadata);
1968
- }
1969
- }
1970
- async function rawWebSocket(driver, actorQuery, params, path, protocols) {
1971
- const encoding = "bare";
1972
- const { actorId } = await queryActor(void 0, actorQuery, driver);
1973
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({ msg: "found actor for action", actorId });
1974
- _invariant2.default.call(void 0, actorId, "Missing actor ID");
1975
- let pathPortion = "";
1976
- let queryPortion = "";
1977
- if (path) {
1978
- const queryIndex = path.indexOf("?");
1979
- if (queryIndex !== -1) {
1980
- pathPortion = path.substring(0, queryIndex);
1981
- queryPortion = path.substring(queryIndex);
1982
- } else {
1983
- pathPortion = path;
1984
- }
1985
- if (pathPortion.startsWith("/")) {
1986
- pathPortion = pathPortion.slice(1);
1987
- }
1988
- }
1989
- const fullPath = `${_chunkRZW2DNNDcjs.PATH_WEBSOCKET_PREFIX}${pathPortion}${queryPortion}`;
1990
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({
1991
- msg: "opening websocket",
1992
- actorId,
1993
- encoding,
1994
- path: fullPath
1995
- });
1996
- const ws = await driver.openWebSocket(fullPath, actorId, encoding, params);
1997
- return ws;
1998
- }
1999
-
2000
- // src/client/actor-handle.ts
2001
- var ActorHandleRaw = class {
2002
- #client;
2003
- #driver;
2004
- #encoding;
2005
- #actorQuery;
2006
- #params;
2007
- /**
2008
- * Do not call this directly.
2009
- *
2010
- * Creates an instance of ActorHandleRaw.
2011
- *
2012
- * @protected
2013
- */
2014
- constructor(client, driver, params, encoding, actorQuery) {
2015
- this.#client = client;
2016
- this.#driver = driver;
2017
- this.#encoding = encoding;
2018
- this.#actorQuery = actorQuery;
2019
- this.#params = params;
2020
- }
2021
- /**
2022
- * Call a raw action. This method sends an HTTP request to invoke the named action.
2023
- *
2024
- * @see {@link ActorHandle}
2025
- * @template Args - The type of arguments to pass to the action function.
2026
- * @template Response - The type of the response returned by the action function.
2027
- */
2028
- async action(opts) {
2029
- let actorId;
2030
- try {
2031
- const result = await queryActor(
2032
- void 0,
2033
- this.#actorQuery,
2034
- this.#driver
2035
- );
2036
- actorId = result.actorId;
2037
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({ msg: "found actor for action", actorId });
2038
- _invariant2.default.call(void 0, actorId, "Missing actor ID");
2039
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({
2040
- msg: "handling action",
2041
- name: opts.name,
2042
- encoding: this.#encoding
2043
- });
2044
- const responseData = await sendHttpRequest({
2045
- url: `http://actor/action/${encodeURIComponent(opts.name)}`,
2046
- method: "POST",
2047
- headers: {
2048
- [_chunkRZW2DNNDcjs.HEADER_ENCODING]: this.#encoding,
2049
- ...this.#params !== void 0 ? { [_chunkRZW2DNNDcjs.HEADER_CONN_PARAMS]: JSON.stringify(this.#params) } : {}
2050
- },
2051
- body: opts.args,
2052
- encoding: this.#encoding,
2053
- customFetch: this.#driver.sendRequest.bind(
2054
- this.#driver,
2055
- actorId
2056
- ),
2057
- signal: opts == null ? void 0 : opts.signal,
2058
- requestVersion: _chunkRZW2DNNDcjs.CURRENT_VERSION,
2059
- requestVersionedDataHandler: _chunkRZW2DNNDcjs.HTTP_ACTION_REQUEST_VERSIONED,
2060
- responseVersion: _chunkRZW2DNNDcjs.CURRENT_VERSION,
2061
- responseVersionedDataHandler: _chunkRZW2DNNDcjs.HTTP_ACTION_RESPONSE_VERSIONED,
2062
- requestZodSchema: _chunkRZW2DNNDcjs.HttpActionRequestSchema,
2063
- responseZodSchema: _chunkRZW2DNNDcjs.HttpActionResponseSchema,
2064
- // JSON Request: args is the raw value
2065
- requestToJson: (args) => ({
2066
- args
2067
- }),
2068
- // BARE Request: args needs to be CBOR-encoded
2069
- requestToBare: (args) => ({
2070
- args: _chunkH4TB4X25cjs.bufferToArrayBuffer.call(void 0, cbor4.encode(args))
2071
- }),
2072
- // JSON Response: output is the raw value
2073
- responseFromJson: (json) => json.output,
2074
- // BARE Response: output is ArrayBuffer that needs CBOR-decoding
2075
- responseFromBare: (bare) => cbor4.decode(new Uint8Array(bare.output))
2076
- });
2077
- return responseData;
2078
- } catch (err) {
2079
- const { group, code, message, metadata } = _chunkH4TB4X25cjs.deconstructError.call(void 0,
2080
- err,
2081
- _chunkEJVBH5VFcjs.logger.call(void 0, ),
2082
- {},
2083
- true
2084
- );
2085
- if (actorId && isSchedulingError(group, code)) {
2086
- const schedulingError = await checkForSchedulingError(
2087
- group,
2088
- code,
2089
- actorId,
2090
- this.#actorQuery,
2091
- this.#driver
2092
- );
2093
- if (schedulingError) {
2094
- throw schedulingError;
2095
- }
2096
- }
2097
- throw new ActorError(group, code, message, metadata);
2098
- }
2099
- }
2100
- /**
2101
- * Establishes a persistent connection to the actor.
2102
- *
2103
- * @template AD The actor class that this connection is for.
2104
- * @returns {ActorConn<AD>} A connection to the actor.
2105
- */
2106
- connect() {
2107
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({
2108
- msg: "establishing connection from handle",
2109
- query: this.#actorQuery
2110
- });
2111
- const conn = new ActorConnRaw(
2112
- this.#client,
2113
- this.#driver,
2114
- this.#params,
2115
- this.#encoding,
2116
- this.#actorQuery
2117
- );
2118
- return this.#client[CREATE_ACTOR_CONN_PROXY](
2119
- conn
2120
- );
2121
- }
2122
- /**
2123
- * Makes a raw HTTP request to the actor.
2124
- *
2125
- * @param input - The URL, path, or Request object
2126
- * @param init - Standard fetch RequestInit options
2127
- * @returns Promise<Response> - The raw HTTP response
2128
- */
2129
- async fetch(input, init) {
2130
- return rawHttpFetch(
2131
- this.#driver,
2132
- this.#actorQuery,
2133
- this.#params,
2134
- input,
2135
- init
2136
- );
2137
- }
2138
- /**
2139
- * Creates a raw WebSocket connection to the actor.
2140
- *
2141
- * @param path - The path for the WebSocket connection (e.g., "stream")
2142
- * @param protocols - Optional WebSocket subprotocols
2143
- * @returns WebSocket - A raw WebSocket connection
2144
- */
2145
- async websocket(path, protocols) {
2146
- return rawWebSocket(
2147
- this.#driver,
2148
- this.#actorQuery,
2149
- this.#params,
2150
- path,
2151
- protocols
2152
- );
2153
- }
2154
- /**
2155
- * Resolves the actor to get its unique actor ID.
2156
- */
2157
- async resolve({ signal } = {}) {
2158
- if ("getForKey" in this.#actorQuery || "getOrCreateForKey" in this.#actorQuery) {
2159
- let name;
2160
- if ("getForKey" in this.#actorQuery) {
2161
- name = this.#actorQuery.getForKey.name;
2162
- } else if ("getOrCreateForKey" in this.#actorQuery) {
2163
- name = this.#actorQuery.getOrCreateForKey.name;
2164
- } else {
2165
- _chunkRZW2DNNDcjs.assertUnreachable.call(void 0, this.#actorQuery);
2166
- }
2167
- const { actorId } = await queryActor(
2168
- void 0,
2169
- this.#actorQuery,
2170
- this.#driver
2171
- );
2172
- this.#actorQuery = { getForId: { actorId, name } };
2173
- return actorId;
2174
- } else if ("getForId" in this.#actorQuery) {
2175
- return this.#actorQuery.getForId.actorId;
2176
- } else if ("create" in this.#actorQuery) {
2177
- _invariant2.default.call(void 0, false, "actorQuery cannot be create");
2178
- } else {
2179
- _chunkRZW2DNNDcjs.assertUnreachable.call(void 0, this.#actorQuery);
2180
- }
2181
- }
2182
- /**
2183
- * Returns the raw URL for routing traffic to the actor.
2184
- */
2185
- async getGatewayUrl() {
2186
- const { actorId } = await queryActor(
2187
- void 0,
2188
- this.#actorQuery,
2189
- this.#driver
2190
- );
2191
- return await this.#driver.buildGatewayUrl(actorId);
2192
- }
2193
- };
2194
-
2195
- // src/client/client.ts
2196
- var ACTOR_CONNS_SYMBOL = Symbol("actorConns");
2197
- var CREATE_ACTOR_CONN_PROXY = Symbol("createActorConnProxy");
2198
- var ClientRaw = (_class2 = class {
2199
- #disposed = false;
2200
- __init2() {this[ACTOR_CONNS_SYMBOL] = /* @__PURE__ */ new Set()}
2201
- #driver;
2202
- #encodingKind;
2203
- /**
2204
- * Creates an instance of Client.
2205
- */
2206
- constructor(driver, encoding) {;_class2.prototype.__init2.call(this);
2207
- this.#driver = driver;
2208
- this.#encodingKind = _nullishCoalesce(encoding, () => ( "bare"));
2209
- }
2210
- /**
2211
- * Gets a stateless handle to a actor by its ID.
2212
- *
2213
- * @template AD The actor class that this handle is for.
2214
- * @param {string} name - The name of the actor.
2215
- * @param {string} actorId - The ID of the actor.
2216
- * @param {GetWithIdOptions} [opts] - Options for getting the actor.
2217
- * @returns {ActorHandle<AD>} - A handle to the actor.
2218
- */
2219
- getForId(name, actorId, opts) {
2220
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({
2221
- msg: "get handle to actor with id",
2222
- name,
2223
- actorId,
2224
- params: opts == null ? void 0 : opts.params
2225
- });
2226
- const actorQuery = {
2227
- getForId: {
2228
- name,
2229
- actorId
2230
- }
2231
- };
2232
- const handle = this.#createHandle(opts == null ? void 0 : opts.params, actorQuery);
2233
- return createActorProxy(handle);
2234
- }
2235
- /**
2236
- * Gets a stateless handle to a actor by its key, but does not create the actor if it doesn't exist.
2237
- *
2238
- * @template AD The actor class that this handle is for.
2239
- * @param {string} name - The name of the actor.
2240
- * @param {string | string[]} [key=[]] - The key to identify the actor. Can be a single string or an array of strings.
2241
- * @param {GetWithIdOptions} [opts] - Options for getting the actor.
2242
- * @returns {ActorHandle<AD>} - A handle to the actor.
2243
- */
2244
- get(name, key, opts) {
2245
- const keyArray = typeof key === "string" ? [key] : key || [];
2246
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({
2247
- msg: "get handle to actor",
2248
- name,
2249
- key: keyArray,
2250
- parameters: opts == null ? void 0 : opts.params
2251
- });
2252
- const actorQuery = {
2253
- getForKey: {
2254
- name,
2255
- key: keyArray
2256
- }
2257
- };
2258
- const handle = this.#createHandle(opts == null ? void 0 : opts.params, actorQuery);
2259
- return createActorProxy(handle);
2260
- }
2261
- /**
2262
- * Gets a stateless handle to a actor by its key, creating it if necessary.
2263
- *
2264
- * @template AD The actor class that this handle is for.
2265
- * @param {string} name - The name of the actor.
2266
- * @param {string | string[]} [key=[]] - The key to identify the actor. Can be a single string or an array of strings.
2267
- * @param {GetOptions} [opts] - Options for getting the actor.
2268
- * @returns {ActorHandle<AD>} - A handle to the actor.
2269
- */
2270
- getOrCreate(name, key, opts) {
2271
- const keyArray = typeof key === "string" ? [key] : key || [];
2272
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({
2273
- msg: "get or create handle to actor",
2274
- name,
2275
- key: keyArray,
2276
- parameters: opts == null ? void 0 : opts.params,
2277
- createInRegion: opts == null ? void 0 : opts.createInRegion
2278
- });
2279
- const actorQuery = {
2280
- getOrCreateForKey: {
2281
- name,
2282
- key: keyArray,
2283
- input: opts == null ? void 0 : opts.createWithInput,
2284
- region: opts == null ? void 0 : opts.createInRegion
2285
- }
2286
- };
2287
- const handle = this.#createHandle(opts == null ? void 0 : opts.params, actorQuery);
2288
- return createActorProxy(handle);
2289
- }
2290
- /**
2291
- * Creates a new actor with the provided key and returns a stateless handle to it.
2292
- * Resolves the actor ID and returns a handle with getForId query.
2293
- *
2294
- * @template AD The actor class that this handle is for.
2295
- * @param {string} name - The name of the actor.
2296
- * @param {string | string[]} key - The key to identify the actor. Can be a single string or an array of strings.
2297
- * @param {CreateOptions} [opts] - Options for creating the actor (excluding name and key).
2298
- * @returns {Promise<ActorHandle<AD>>} - A promise that resolves to a handle to the actor.
2299
- */
2300
- async create(name, key, opts) {
2301
- const keyArray = typeof key === "string" ? [key] : key || [];
2302
- const createQuery = {
2303
- create: {
2304
- ...opts,
2305
- // Do these last to override `opts`
2306
- name,
2307
- key: keyArray
2308
- }
2309
- };
2310
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({
2311
- msg: "create actor handle",
2312
- name,
2313
- key: keyArray,
2314
- parameters: opts == null ? void 0 : opts.params,
2315
- create: createQuery.create
2316
- });
2317
- const { actorId } = await queryActor(
2318
- void 0,
2319
- createQuery,
2320
- this.#driver
2321
- );
2322
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({
2323
- msg: "created actor with ID",
2324
- name,
2325
- key: keyArray,
2326
- actorId
2327
- });
2328
- const getForIdQuery = {
2329
- getForId: {
2330
- name,
2331
- actorId
2332
- }
2333
- };
2334
- const handle = this.#createHandle(opts == null ? void 0 : opts.params, getForIdQuery);
2335
- const proxy = createActorProxy(handle);
2336
- return proxy;
2337
- }
2338
- #createHandle(params, actorQuery) {
2339
- return new ActorHandleRaw(
2340
- this,
2341
- this.#driver,
2342
- params,
2343
- this.#encodingKind,
2344
- actorQuery
2345
- );
2346
- }
2347
- [CREATE_ACTOR_CONN_PROXY](conn) {
2348
- this[ACTOR_CONNS_SYMBOL].add(conn);
2349
- conn[CONNECT_SYMBOL]();
2350
- return createActorProxy(conn);
2351
- }
2352
- /**
2353
- * Disconnects from all actors.
2354
- *
2355
- * @returns {Promise<void>} A promise that resolves when all connections are closed.
2356
- */
2357
- async dispose() {
2358
- if (this.#disposed) {
2359
- _chunkEJVBH5VFcjs.logger.call(void 0, ).warn({ msg: "client already disconnected" });
2360
- return;
2361
- }
2362
- this.#disposed = true;
2363
- _chunkEJVBH5VFcjs.logger.call(void 0, ).debug({ msg: "disposing client" });
2364
- const disposePromises = [];
2365
- for (const conn of this[ACTOR_CONNS_SYMBOL].values()) {
2366
- disposePromises.push(conn.dispose());
2367
- }
2368
- await Promise.all(disposePromises);
2369
- }
2370
- }, _class2);
2371
- function createClientWithDriver(driver, config = {}) {
2372
- const client = new ClientRaw(driver, config.encoding);
2373
- return new Proxy(client, {
2374
- get: (target, prop, receiver) => {
2375
- if (typeof prop === "symbol" || prop in target) {
2376
- const value = Reflect.get(target, prop, receiver);
2377
- if (typeof value === "function") {
2378
- return value.bind(target);
2379
- }
2380
- return value;
2381
- }
2382
- if (typeof prop === "string") {
2383
- return {
2384
- // Handle methods (stateless action)
2385
- get: (key, opts) => {
2386
- return target.get(prop, key, opts);
2387
- },
2388
- getOrCreate: (key, opts) => {
2389
- return target.getOrCreate(prop, key, opts);
2390
- },
2391
- getForId: (actorId, opts) => {
2392
- return target.getForId(prop, actorId, opts);
2393
- },
2394
- create: async (key, opts = {}) => {
2395
- return await target.create(prop, key, opts);
2396
- }
2397
- };
2398
- }
2399
- return void 0;
2400
- }
2401
- });
2402
- }
2403
- function createActorProxy(handle) {
2404
- const methodCache = /* @__PURE__ */ new Map();
2405
- return new Proxy(handle, {
2406
- get(target, prop, receiver) {
2407
- if (typeof prop === "symbol") {
2408
- return Reflect.get(target, prop, receiver);
2409
- }
2410
- if (prop === "constructor" || prop in target) {
2411
- const value = Reflect.get(target, prop, target);
2412
- if (typeof value === "function") {
2413
- return value.bind(target);
2414
- }
2415
- return value;
2416
- }
2417
- if (typeof prop === "string") {
2418
- if (prop === "then") return void 0;
2419
- let method = methodCache.get(prop);
2420
- if (!method) {
2421
- method = (...args) => target.action({ name: prop, args });
2422
- methodCache.set(prop, method);
2423
- }
2424
- return method;
2425
- }
2426
- },
2427
- // Support for 'in' operator
2428
- has(target, prop) {
2429
- if (typeof prop === "string") {
2430
- return true;
2431
- }
2432
- return Reflect.has(target, prop);
2433
- },
2434
- // Support instanceof checks
2435
- getPrototypeOf(target) {
2436
- return Reflect.getPrototypeOf(target);
2437
- },
2438
- // Prevent property enumeration of non-existent action methods
2439
- ownKeys(target) {
2440
- return Reflect.ownKeys(target);
2441
- },
2442
- // Support proper property descriptors
2443
- getOwnPropertyDescriptor(target, prop) {
2444
- const targetDescriptor = Reflect.getOwnPropertyDescriptor(
2445
- target,
2446
- prop
2447
- );
2448
- if (targetDescriptor) {
2449
- return targetDescriptor;
2450
- }
2451
- if (typeof prop === "string") {
2452
- return {
2453
- configurable: true,
2454
- enumerable: false,
2455
- writable: false,
2456
- value: (...args) => target.action({ name: prop, args })
2457
- };
2458
- }
2459
- return void 0;
2460
- }
2461
- });
2462
- }
2463
-
2464
- // src/client/config.ts
2465
-
2466
- function getDefaultEndpoint() {
2467
- var _a;
2468
- if (typeof window !== "undefined" && ((_a = window.location) == null ? void 0 : _a.origin)) {
2469
- return `${window.location.origin}/api/rivet`;
2470
- }
2471
- return "http://127.0.0.1:6420";
2472
- }
2473
- var ClientConfigSchemaBase = _zod2.default.object({
2474
- /**
2475
- * Endpoint to connect to for Rivet Engine or RivetKit manager API.
2476
- *
2477
- * Supports URL auth syntax for namespace and token:
2478
- * - `https://namespace:token@api.rivet.dev`
2479
- * - `https://namespace@api.rivet.dev`
2480
- *
2481
- * Can also be set via RIVET_ENDPOINT environment variables.
2482
- *
2483
- * Defaults to current origin + /api/rivet in browser, or 127.0.0.1:6420 server-side.
2484
- */
2485
- endpoint: _zod2.default.string().optional().transform(
2486
- (val) => _nullishCoalesce(_nullishCoalesce(_nullishCoalesce(val, () => ( _chunkH4TB4X25cjs.getRivetEngine.call(void 0, ))), () => ( _chunkH4TB4X25cjs.getRivetEndpoint.call(void 0, ))), () => ( getDefaultEndpoint()))
2487
- ),
2488
- /** Token to use to authenticate with the API. */
2489
- token: _zod2.default.string().optional().transform((val) => _nullishCoalesce(val, () => ( _chunkH4TB4X25cjs.getRivetToken.call(void 0, )))),
2490
- /** Namespace to connect to. */
2491
- namespace: _zod2.default.string().optional().transform((val) => _nullishCoalesce(val, () => ( _chunkH4TB4X25cjs.getRivetNamespace.call(void 0, )))),
2492
- /** Name of the runner. This is used to group together runners in to different pools. */
2493
- runnerName: _zod2.default.string().default(() => _nullishCoalesce(_chunkH4TB4X25cjs.getRivetRunner.call(void 0, ), () => ( "default"))),
2494
- encoding: _chunkRZW2DNNDcjs.EncodingSchema.default("bare"),
2495
- headers: _zod2.default.record(_zod2.default.string(), _zod2.default.string()).optional().default(() => ({})),
2496
- // See RunConfig.getUpgradeWebSocket
2497
- //
2498
- // This is required in the client config in order to support
2499
- // `proxyWebSocket`
2500
- getUpgradeWebSocket: _zod2.default.custom().optional(),
2501
- /** Whether to automatically perform health checks when the client is created. */
2502
- disableMetadataLookup: _zod2.default.boolean().optional().default(false),
2503
- /** Whether to enable RivetKit Devtools integration. */
2504
- devtools: _zod2.default.boolean().default(
2505
- () => {
2506
- var _a, _b;
2507
- return typeof window !== "undefined" && (((_a = window == null ? void 0 : window.location) == null ? void 0 : _a.hostname) === "127.0.0.1" || ((_b = window.location) == null ? void 0 : _b.hostname) === "localhost");
2508
- }
2509
- )
2510
- });
2511
- var ClientConfigSchema = ClientConfigSchemaBase.transform(
2512
- (config, ctx) => transformClientConfig(config, ctx)
2513
- );
2514
- function transformClientConfig(config, ctx) {
2515
- const parsedEndpoint = _chunkRZW2DNNDcjs.tryParseEndpoint.call(void 0, ctx, {
2516
- endpoint: config.endpoint,
2517
- path: ["endpoint"],
2518
- namespace: config.namespace,
2519
- token: config.token
2520
- });
2521
- return {
2522
- ...config,
2523
- endpoint: parsedEndpoint == null ? void 0 : parsedEndpoint.endpoint,
2524
- namespace: _nullishCoalesce(_nullishCoalesce((parsedEndpoint == null ? void 0 : parsedEndpoint.namespace), () => ( config.namespace)), () => ( "default")),
2525
- token: _nullishCoalesce((parsedEndpoint == null ? void 0 : parsedEndpoint.token), () => ( config.token))
2526
- };
2527
- }
2528
- function convertRegistryConfigToClientConfig(config) {
2529
- var _a, _b;
2530
- return {
2531
- endpoint: config.endpoint,
2532
- token: config.token,
2533
- namespace: config.namespace,
2534
- runnerName: config.runner.runnerName,
2535
- headers: config.headers,
2536
- encoding: "bare",
2537
- getUpgradeWebSocket: void 0,
2538
- // We don't need health checks for internal clients
2539
- disableMetadataLookup: true,
2540
- devtools: typeof window !== "undefined" && (((_a = window == null ? void 0 : window.location) == null ? void 0 : _a.hostname) === "127.0.0.1" || ((_b = window == null ? void 0 : window.location) == null ? void 0 : _b.hostname) === "localhost")
2541
- };
2542
- }
2543
-
2544
- // src/actor/instance/mod.ts
2545
-
2546
-
2547
- // src/inspector/actor-inspector.ts
2548
-
2549
- var _nanoevents = require('nanoevents');
2550
- var ActorInspector = (_class3 = class {
2551
- constructor(actor) {;_class3.prototype.__init3.call(this);
2552
- this.actor = actor;
2553
- this.emitter.on("eventFired", (event) => {
2554
- const commonParams = {
2555
- id: crypto.randomUUID(),
2556
- timestamp: BigInt(Date.now())
2557
- };
2558
- this.#lastEvents.push({
2559
- ...commonParams,
2560
- ...transformEvent(event)
2561
- });
2562
- if (this.#lastEvents.length > 100) {
2563
- this.#lastEvents = this.#lastEvents.slice(-100);
2564
- }
2565
- });
2566
- }
2567
- __init3() {this.emitter = _nanoevents.createNanoEvents.call(void 0, )}
2568
- #lastEvents = [];
2569
- getLastEvents() {
2570
- return this.#lastEvents;
2571
- }
2572
- clearEvents() {
2573
- this.#lastEvents = [];
2574
- this.emitter.emit("eventsChanged");
2575
- }
2576
- // actor accessor methods
2577
- isDatabaseEnabled() {
2578
- try {
2579
- return this.actor.db !== void 0;
2580
- } catch (e2) {
2581
- return false;
2582
- }
2583
- }
2584
- isStateEnabled() {
2585
- return this.actor.stateEnabled;
2586
- }
2587
- getState() {
2588
- if (!this.actor.stateEnabled) {
2589
- throw new (0, _chunk2XQS746Mcjs.StateNotEnabled)();
2590
- }
2591
- return _chunkH4TB4X25cjs.bufferToArrayBuffer.call(void 0,
2592
- cbor5.encode(this.actor.stateManager.persistRaw.state)
2593
- );
2594
- }
2595
- getRpcs() {
2596
- return this.actor.actions;
2597
- }
2598
- getConnections() {
2599
- return Array.from(
2600
- this.actor.connectionManager.connections.entries()
2601
- ).map(([id, conn]) => {
2602
- var _a, _b;
2603
- const connStateManager = conn[_chunkRZW2DNNDcjs.CONN_STATE_MANAGER_SYMBOL];
2604
- return {
2605
- type: (_a = conn[_chunkRZW2DNNDcjs.CONN_DRIVER_SYMBOL]) == null ? void 0 : _a.type,
2606
- id,
2607
- details: _chunkH4TB4X25cjs.bufferToArrayBuffer.call(void 0,
2608
- cbor5.encode({
2609
- type: (_b = conn[_chunkRZW2DNNDcjs.CONN_DRIVER_SYMBOL]) == null ? void 0 : _b.type,
2610
- params: conn.params,
2611
- stateEnabled: connStateManager.stateEnabled,
2612
- state: connStateManager.stateEnabled ? connStateManager.state : void 0,
2613
- subscriptions: conn.subscriptions.size,
2614
- isHibernatable: conn.isHibernatable
2615
- // TODO: Include underlying hibernatable metadata +
2616
- // path + headers
2617
- })
2618
- )
2619
- };
2620
- });
2621
- }
2622
- async setState(state) {
2623
- if (!this.actor.stateEnabled) {
2624
- throw new (0, _chunk2XQS746Mcjs.StateNotEnabled)();
2625
- }
2626
- this.actor.stateManager.state = cbor5.decode(Buffer.from(state));
2627
- await this.actor.stateManager.saveState({ immediate: true });
2628
- }
2629
- async executeAction(name, params) {
2630
- const conn = await this.actor.connectionManager.prepareAndConnectConn(
2631
- _chunkRZW2DNNDcjs.createHttpDriver.call(void 0, ),
2632
- // TODO: This may cause issues
2633
- void 0,
2634
- void 0,
2635
- void 0,
2636
- void 0
2637
- );
2638
- try {
2639
- return _chunkH4TB4X25cjs.bufferToArrayBuffer.call(void 0,
2640
- cbor5.encode(
2641
- await this.actor.executeAction(
2642
- new (0, _chunkRZW2DNNDcjs.ActionContext)(this.actor, conn),
2643
- name,
2644
- cbor5.decode(Buffer.from(params))
2645
- )
2646
- )
2647
- );
2648
- } finally {
2649
- conn.disconnect();
2650
- }
2651
- }
2652
- }, _class3);
2653
- function transformEvent(event) {
2654
- if (event.type === "action") {
2655
- return {
2656
- body: {
2657
- tag: "ActionEvent",
2658
- val: {
2659
- name: event.name,
2660
- args: _chunkH4TB4X25cjs.bufferToArrayBuffer.call(void 0, cbor5.encode(event.args)),
2661
- connId: event.connId
2662
- }
2663
- }
2664
- };
2665
- } else if (event.type === "subscribe") {
2666
- return {
2667
- body: {
2668
- tag: "SubscribeEvent",
2669
- val: {
2670
- eventName: event.eventName,
2671
- connId: event.connId
2672
- }
2673
- }
2674
- };
2675
- } else if (event.type === "unsubscribe") {
2676
- return {
2677
- body: {
2678
- tag: "UnSubscribeEvent",
2679
- val: {
2680
- eventName: event.eventName,
2681
- connId: event.connId
2682
- }
2683
- }
2684
- };
2685
- } else if (event.type === "event") {
2686
- return {
2687
- body: {
2688
- tag: "FiredEvent",
2689
- val: {
2690
- eventName: event.eventName,
2691
- args: _chunkH4TB4X25cjs.bufferToArrayBuffer.call(void 0, cbor5.encode(event.args)),
2692
- connId: event.connId
2693
- }
2694
- }
2695
- };
2696
- } else if (event.type === "broadcast") {
2697
- return {
2698
- body: {
2699
- tag: "BroadcastEvent",
2700
- val: {
2701
- eventName: event.eventName,
2702
- args: _chunkH4TB4X25cjs.bufferToArrayBuffer.call(void 0, cbor5.encode(event.args))
2703
- }
2704
- }
2705
- };
2706
- } else {
2707
- _chunkH4TB4X25cjs.assertUnreachable.call(void 0, event);
2708
- }
2709
- }
2710
-
2711
- // src/actor/conn/persisted.ts
2712
-
2713
- function convertConnToBarePersistedConn(persist) {
2714
- return {
2715
- id: persist.id,
2716
- parameters: _chunkH4TB4X25cjs.bufferToArrayBuffer.call(void 0, cbor6.encode(persist.parameters)),
2717
- state: _chunkH4TB4X25cjs.bufferToArrayBuffer.call(void 0, cbor6.encode(persist.state)),
2718
- subscriptions: persist.subscriptions.map((sub) => ({
2719
- eventName: sub.eventName
2720
- })),
2721
- gatewayId: persist.gatewayId,
2722
- requestId: persist.requestId,
2723
- serverMessageIndex: persist.serverMessageIndex,
2724
- clientMessageIndex: persist.clientMessageIndex,
2725
- requestPath: persist.requestPath,
2726
- requestHeaders: new Map(Object.entries(persist.requestHeaders))
2727
- };
2728
- }
2729
- function convertConnFromBarePersistedConn(bareData) {
2730
- return {
2731
- id: bareData.id,
2732
- parameters: cbor6.decode(new Uint8Array(bareData.parameters)),
2733
- state: cbor6.decode(new Uint8Array(bareData.state)),
2734
- subscriptions: bareData.subscriptions.map((sub) => ({
2735
- eventName: sub.eventName
2736
- })),
2737
- gatewayId: bareData.gatewayId,
2738
- requestId: bareData.requestId,
2739
- serverMessageIndex: bareData.serverMessageIndex,
2740
- clientMessageIndex: bareData.clientMessageIndex,
2741
- requestPath: bareData.requestPath,
2742
- requestHeaders: Object.fromEntries(bareData.requestHeaders)
2743
- };
2744
- }
2745
-
2746
- // src/actor/schedule.ts
2747
- var Schedule = class {
2748
- #actor;
2749
- constructor(actor) {
2750
- this.#actor = actor;
2751
- }
2752
- async after(duration, fn, ...args) {
2753
- await this.#actor.scheduleEvent(Date.now() + duration, fn, args);
2754
- }
2755
- async at(timestamp, fn, ...args) {
2756
- await this.#actor.scheduleEvent(timestamp, fn, args);
2757
- }
2758
- };
2759
-
2760
- // src/actor/instance/connection-manager.ts
2761
-
2762
- var ConnectionManager = class {
2763
- #actor;
2764
- #connections = /* @__PURE__ */ new Map();
2765
- /** Connections that have had their state changed and need to be persisted. */
2766
- #connsWithPersistChanged = /* @__PURE__ */ new Set();
2767
- constructor(actor) {
2768
- this.#actor = actor;
2769
- }
2770
- get connections() {
2771
- return this.#connections;
2772
- }
2773
- getConnForId(id) {
2774
- return this.#connections.get(id);
2775
- }
2776
- get connsWithPersistChanged() {
2777
- return this.#connsWithPersistChanged;
2778
- }
2779
- clearConnWithPersistChanged() {
2780
- this.#connsWithPersistChanged.clear();
2781
- }
2782
- markConnWithPersistChanged(conn) {
2783
- _invariant2.default.call(void 0,
2784
- conn.isHibernatable,
2785
- "cannot mark non-hibernatable conn for persist"
2786
- );
2787
- this.#actor.rLog.debug({
2788
- msg: "marked connection as changed",
2789
- connId: conn.id,
2790
- totalChanged: this.#connsWithPersistChanged.size
2791
- });
2792
- this.#connsWithPersistChanged.add(conn.id);
2793
- this.#actor.stateManager.savePersistThrottled();
2794
- }
2795
- // MARK: - Connection Lifecycle
2796
- /**
2797
- * Handles pre-connection logic (i.e. auth & create state) before actually connecting the connection.
2798
- */
2799
- async prepareConn(driver, params, request, requestPath, requestHeaders, isHibernatable, isRestoringHibernatable) {
2800
- this.#actor.assertReady();
2801
- if (isRestoringHibernatable) {
2802
- return this.#reconnectHibernatableConn(driver);
2803
- }
2804
- if (this.#actor.config.onBeforeConnect) {
2805
- const ctx = new (0, _chunkRZW2DNNDcjs.BeforeConnectContext)(this.#actor, request);
2806
- await this.#actor.config.onBeforeConnect(ctx, params);
2807
- }
2808
- let connState;
2809
- if (this.#actor.connStateEnabled) {
2810
- connState = await this.#createConnState(params, request);
2811
- }
2812
- let connData;
2813
- if (isHibernatable) {
2814
- const hibernatable = driver.hibernatable;
2815
- _invariant2.default.call(void 0, hibernatable, "must have hibernatable");
2816
- _invariant2.default.call(void 0, requestPath, "missing requestPath for hibernatable ws");
2817
- _invariant2.default.call(void 0,
2818
- requestHeaders,
2819
- "missing requestHeaders for hibernatable ws"
2820
- );
2821
- connData = {
2822
- hibernatable: {
2823
- id: crypto.randomUUID(),
2824
- parameters: params,
2825
- state: connState,
2826
- subscriptions: [],
2827
- gatewayId: hibernatable.gatewayId,
2828
- requestId: hibernatable.requestId,
2829
- clientMessageIndex: 0,
2830
- // First message index will be 1, so we start at 0
2831
- serverMessageIndex: 0,
2832
- requestPath,
2833
- requestHeaders
2834
- }
2835
- };
2836
- } else {
2837
- connData = {
2838
- ephemeral: {
2839
- id: crypto.randomUUID(),
2840
- parameters: params,
2841
- state: connState
2842
- }
2843
- };
2844
- }
2845
- const conn = new (0, _chunkRZW2DNNDcjs.Conn)(this.#actor, connData);
2846
- conn[_chunkRZW2DNNDcjs.CONN_DRIVER_SYMBOL] = driver;
2847
- return conn;
2848
- }
2849
- /**
2850
- * Adds a connection form prepareConn to the actor and calls onConnect.
2851
- *
2852
- * This method is intentionally not async since it needs to be called in
2853
- * `onOpen` for WebSockets. If this is async, the order of open events will
2854
- * be messed up and cause race conditions that can drop WebSocket messages.
2855
- * So all async work in prepareConn.
2856
- */
2857
- connectConn(conn) {
2858
- _invariant2.default.call(void 0, !this.#connections.has(conn.id), "conn already connected");
2859
- this.#connections.set(conn.id, conn);
2860
- if (this.#actor.driver.onCreateConn) {
2861
- this.#actor.driver.onCreateConn(conn);
2862
- }
2863
- if (conn.isHibernatable) {
2864
- this.markConnWithPersistChanged(conn);
2865
- }
2866
- this.#callOnConnect(conn);
2867
- this.#actor.inspector.emitter.emit("connectionsUpdated");
2868
- this.#actor.resetSleepTimer();
2869
- conn[_chunkRZW2DNNDcjs.CONN_CONNECTED_SYMBOL] = true;
2870
- if (conn[_chunkRZW2DNNDcjs.CONN_SPEAKS_RIVETKIT_SYMBOL]) {
2871
- const initData = { actorId: this.#actor.id, connectionId: conn.id };
2872
- conn[_chunkRZW2DNNDcjs.CONN_SEND_MESSAGE_SYMBOL](
2873
- new (0, _chunkRZW2DNNDcjs.CachedSerializer)(
2874
- initData,
2875
- _chunkRZW2DNNDcjs.TO_CLIENT_VERSIONED,
2876
- _chunkRZW2DNNDcjs.CURRENT_VERSION,
2877
- _chunkRZW2DNNDcjs.ToClientSchema,
2878
- // JSON: identity conversion (no nested data to encode)
2879
- (value) => ({
2880
- body: {
2881
- tag: "Init",
2882
- val: value
2883
- }
2884
- }),
2885
- // BARE/CBOR: identity conversion (no nested data to encode)
2886
- (value) => ({
2887
- body: {
2888
- tag: "Init",
2889
- val: value
2890
- }
2891
- })
2892
- )
2893
- );
2894
- }
2895
- }
2896
- #reconnectHibernatableConn(driver) {
2897
- _invariant2.default.call(void 0, driver.hibernatable, "missing requestIdBuf");
2898
- const existingConn = this.findHibernatableConn(
2899
- driver.hibernatable.gatewayId,
2900
- driver.hibernatable.requestId
2901
- );
2902
- _invariant2.default.call(void 0,
2903
- existingConn,
2904
- "cannot find connection for restoring connection"
2905
- );
2906
- this.#actor.rLog.debug({
2907
- msg: "reconnecting hibernatable websocket connection",
2908
- connectionId: existingConn.id
2909
- });
2910
- if (existingConn[_chunkRZW2DNNDcjs.CONN_DRIVER_SYMBOL]) {
2911
- this.#disconnectExistingDriver(existingConn);
2912
- }
2913
- existingConn[_chunkRZW2DNNDcjs.CONN_DRIVER_SYMBOL] = driver;
2914
- this.#actor.resetSleepTimer();
2915
- existingConn[_chunkRZW2DNNDcjs.CONN_CONNECTED_SYMBOL] = true;
2916
- this.#actor.inspector.emitter.emit("connectionsUpdated");
2917
- return existingConn;
2918
- }
2919
- #disconnectExistingDriver(conn) {
2920
- const driver = conn[_chunkRZW2DNNDcjs.CONN_DRIVER_SYMBOL];
2921
- if (driver == null ? void 0 : driver.disconnect) {
2922
- driver.disconnect(
2923
- this.#actor,
2924
- conn,
2925
- "Reconnecting hibernatable websocket with new driver state"
2926
- );
2927
- }
2928
- }
2929
- /**
2930
- * Handle connection disconnection.
2931
- *
2932
- * This is called by `Conn.disconnect`. This should not call `Conn.disconnect.`
2933
- */
2934
- async connDisconnected(conn) {
2935
- this.#connections.delete(conn.id);
2936
- this.#actor.rLog.debug({ msg: "removed conn", connId: conn.id });
2937
- if (this.#actor.driver.onDestroyConn) {
2938
- this.#actor.driver.onDestroyConn(conn);
2939
- }
2940
- for (const eventName of [...conn.subscriptions.values()]) {
2941
- this.#actor.eventManager.removeSubscription(eventName, conn, true);
2942
- }
2943
- this.#actor.resetSleepTimer();
2944
- this.#actor.inspector.emitter.emit("connectionsUpdated");
2945
- if (this.#actor.config.onDisconnect) {
2946
- try {
2947
- const result = this.#actor.config.onDisconnect(
2948
- this.#actor.actorContext,
2949
- conn
2950
- );
2951
- if (result instanceof Promise) {
2952
- result.catch((error) => {
2953
- this.#actor.rLog.error({
2954
- msg: "error in `onDisconnect`",
2955
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, error)
2956
- });
2957
- });
2958
- }
2959
- } catch (error) {
2960
- this.#actor.rLog.error({
2961
- msg: "error in `onDisconnect`",
2962
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, error)
2963
- });
2964
- }
2965
- }
2966
- this.#connsWithPersistChanged.delete(conn.id);
2967
- if (conn.isHibernatable) {
2968
- const key = _chunkRZW2DNNDcjs.makeConnKey.call(void 0, conn.id);
2969
- try {
2970
- await this.#actor.driver.kvBatchDelete(this.#actor.id, [key]);
2971
- this.#actor.rLog.debug({
2972
- msg: "removed connection from KV",
2973
- connId: conn.id
2974
- });
2975
- } catch (err) {
2976
- this.#actor.rLog.error({
2977
- msg: "kvBatchDelete failed for conn",
2978
- err: _chunkH4TB4X25cjs.stringifyError.call(void 0, err)
2979
- });
2980
- }
2981
- }
2982
- }
2983
- /**
2984
- * Utilify function for call sites that don't need a separate prepare and connect phase.
2985
- */
2986
- async prepareAndConnectConn(driver, params, request, requestPath, requestHeaders) {
2987
- const conn = await this.prepareConn(
2988
- driver,
2989
- params,
2990
- request,
2991
- requestPath,
2992
- requestHeaders,
2993
- false,
2994
- false
2995
- );
2996
- this.connectConn(conn);
2997
- return conn;
2998
- }
2999
- // MARK: - Persistence
3000
- /**
3001
- * Restores connections from persisted data during actor initialization.
3002
- */
3003
- restoreConnections(connections) {
3004
- for (const connPersist of connections) {
3005
- const conn = new (0, _chunkRZW2DNNDcjs.Conn)(this.#actor, {
3006
- hibernatable: connPersist
3007
- });
3008
- this.#connections.set(conn.id, conn);
3009
- if (this.#actor.driver.onCreateConn) {
3010
- this.#actor.driver.onCreateConn(conn);
3011
- }
3012
- for (const sub of connPersist.subscriptions) {
3013
- this.#actor.eventManager.addSubscription(
3014
- sub.eventName,
3015
- conn,
3016
- true
3017
- );
3018
- }
3019
- }
3020
- }
3021
- // MARK: - Private Helpers
3022
- findHibernatableConn(gatewayIdBuf, requestIdBuf) {
3023
- return Array.from(this.#connections.values()).find((conn) => {
3024
- const connStateManager = conn[_chunkRZW2DNNDcjs.CONN_STATE_MANAGER_SYMBOL];
3025
- const h = connStateManager.hibernatableDataRaw;
3026
- return h && _chunkH4TB4X25cjs.arrayBuffersEqual.call(void 0, h.gatewayId, gatewayIdBuf) && _chunkH4TB4X25cjs.arrayBuffersEqual.call(void 0, h.requestId, requestIdBuf);
3027
- });
3028
- }
3029
- async #createConnState(params, request) {
3030
- if ("createConnState" in this.#actor.config) {
3031
- const ctx = new (0, _chunkRZW2DNNDcjs.CreateConnStateContext)(this.#actor, request);
3032
- const dataOrPromise = this.#actor.config.createConnState(
3033
- ctx,
3034
- params
3035
- );
3036
- if (dataOrPromise instanceof Promise) {
3037
- return await _chunkRZW2DNNDcjs.deadline.call(void 0,
3038
- dataOrPromise,
3039
- this.#actor.config.options.createConnStateTimeout
3040
- );
3041
- }
3042
- return dataOrPromise;
3043
- } else if ("connState" in this.#actor.config) {
3044
- return structuredClone(this.#actor.config.connState);
3045
- }
3046
- throw new Error(
3047
- "Could not create connection state from 'createConnState' or 'connState'"
3048
- );
3049
- }
3050
- #callOnConnect(conn) {
3051
- if (this.#actor.config.onConnect) {
3052
- try {
3053
- const ctx = new (0, _chunkRZW2DNNDcjs.ConnectContext)(this.#actor, conn);
3054
- const result = this.#actor.config.onConnect(ctx, conn);
3055
- if (result instanceof Promise) {
3056
- _chunkRZW2DNNDcjs.deadline.call(void 0,
3057
- result,
3058
- this.#actor.config.options.onConnectTimeout
3059
- ).catch((error) => {
3060
- this.#actor.rLog.error({
3061
- msg: "error in `onConnect`, closing socket",
3062
- error
3063
- });
3064
- conn == null ? void 0 : conn.disconnect("`onConnect` failed");
3065
- });
3066
- }
3067
- } catch (error) {
3068
- this.#actor.rLog.error({
3069
- msg: "error in `onConnect`",
3070
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, error)
3071
- });
3072
- conn == null ? void 0 : conn.disconnect("`onConnect` failed");
3073
- }
3074
- }
3075
- }
3076
- };
3077
-
3078
- // src/actor/instance/event-manager.ts
3079
-
3080
- var EventManager = class {
3081
- #actor;
3082
- #subscriptionIndex = /* @__PURE__ */ new Map();
3083
- constructor(actor) {
3084
- this.#actor = actor;
3085
- }
3086
- // MARK: - Public API
3087
- /**
3088
- * Adds a subscription for a connection to an event.
3089
- *
3090
- * @param eventName - The name of the event to subscribe to
3091
- * @param connection - The connection subscribing to the event
3092
- * @param fromPersist - Whether this subscription is being restored from persistence
3093
- */
3094
- addSubscription(eventName, connection, fromPersist) {
3095
- if (connection.subscriptions.has(eventName)) {
3096
- this.#actor.rLog.debug({
3097
- msg: "connection already has subscription",
3098
- eventName,
3099
- connId: connection.id
3100
- });
3101
- return;
3102
- }
3103
- connection.subscriptions.add(eventName);
3104
- let subscribers = this.#subscriptionIndex.get(eventName);
3105
- if (!subscribers) {
3106
- subscribers = /* @__PURE__ */ new Set();
3107
- this.#subscriptionIndex.set(eventName, subscribers);
3108
- }
3109
- subscribers.add(connection);
3110
- if (!fromPersist) {
3111
- connection[_chunkRZW2DNNDcjs.CONN_STATE_MANAGER_SYMBOL].addSubscription({
3112
- eventName
3113
- });
3114
- this.#actor.stateManager.saveState({ immediate: true });
3115
- }
3116
- this.#actor.rLog.debug({
3117
- msg: "subscription added",
3118
- eventName,
3119
- connId: connection.id,
3120
- totalSubscribers: subscribers.size
3121
- });
3122
- }
3123
- /**
3124
- * Removes a subscription for a connection from an event.
3125
- *
3126
- * @param eventName - The name of the event to unsubscribe from
3127
- * @param connection - The connection unsubscribing from the event
3128
- * @param fromRemoveConn - Whether this is being called as part of connection removal
3129
- */
3130
- removeSubscription(eventName, connection, fromRemoveConn) {
3131
- if (!connection.subscriptions.has(eventName)) {
3132
- this.#actor.rLog.warn({
3133
- msg: "connection does not have subscription",
3134
- eventName,
3135
- connId: connection.id
3136
- });
3137
- return;
3138
- }
3139
- connection.subscriptions.delete(eventName);
3140
- const subscribers = this.#subscriptionIndex.get(eventName);
3141
- if (subscribers) {
3142
- subscribers.delete(connection);
3143
- if (subscribers.size === 0) {
3144
- this.#subscriptionIndex.delete(eventName);
3145
- }
3146
- }
3147
- if (!fromRemoveConn) {
3148
- const removed = connection[_chunkRZW2DNNDcjs.CONN_STATE_MANAGER_SYMBOL].removeSubscription({ eventName });
3149
- if (!removed) {
3150
- this.#actor.rLog.warn({
3151
- msg: "subscription does not exist in persist",
3152
- eventName,
3153
- connId: connection.id
3154
- });
3155
- }
3156
- this.#actor.stateManager.saveState({ immediate: true });
3157
- }
3158
- this.#actor.rLog.debug({
3159
- msg: "subscription removed",
3160
- eventName,
3161
- connId: connection.id,
3162
- remainingSubscribers: (subscribers == null ? void 0 : subscribers.size) || 0
3163
- });
3164
- }
3165
- /**
3166
- * Broadcasts an event to all subscribed connections.
3167
- *
3168
- * @param name - The name of the event to broadcast
3169
- * @param args - The arguments to send with the event
3170
- */
3171
- broadcast(name, ...args) {
3172
- this.#actor.assertReady();
3173
- this.#actor.inspector.emitter.emit("eventFired", {
3174
- type: "broadcast",
3175
- eventName: name,
3176
- args
3177
- });
3178
- const subscribers = this.#subscriptionIndex.get(name);
3179
- if (!subscribers || subscribers.size === 0) {
3180
- this.#actor.rLog.debug({
3181
- msg: "no subscribers for event",
3182
- eventName: name
3183
- });
3184
- return;
3185
- }
3186
- const eventData = { name, args };
3187
- const toClientSerializer = new (0, _chunkRZW2DNNDcjs.CachedSerializer)(
3188
- eventData,
3189
- _chunkRZW2DNNDcjs.TO_CLIENT_VERSIONED,
3190
- _chunkRZW2DNNDcjs.CURRENT_VERSION,
3191
- _chunkRZW2DNNDcjs.ToClientSchema,
3192
- // JSON: args is the raw value (array of arguments)
3193
- (value) => ({
3194
- body: {
3195
- tag: "Event",
3196
- val: {
3197
- name: value.name,
3198
- args: value.args
3199
- }
3200
- }
3201
- }),
3202
- // BARE/CBOR: args needs to be CBOR-encoded to ArrayBuffer
3203
- (value) => ({
3204
- body: {
3205
- tag: "Event",
3206
- val: {
3207
- name: value.name,
3208
- args: _chunkH4TB4X25cjs.bufferToArrayBuffer.call(void 0, cbor7.encode(value.args))
3209
- }
3210
- }
3211
- })
3212
- );
3213
- let sentCount = 0;
3214
- for (const connection of subscribers) {
3215
- if (connection[_chunkRZW2DNNDcjs.CONN_SPEAKS_RIVETKIT_SYMBOL]) {
3216
- try {
3217
- connection[_chunkRZW2DNNDcjs.CONN_SEND_MESSAGE_SYMBOL](toClientSerializer);
3218
- sentCount++;
3219
- } catch (error) {
3220
- if (error instanceof _chunk2XQS746Mcjs.OutgoingMessageTooLong) {
3221
- throw error;
3222
- }
3223
- this.#actor.rLog.error({
3224
- msg: "failed to send event to connection",
3225
- eventName: name,
3226
- connId: connection.id,
3227
- error: error instanceof Error ? error.message : String(error)
3228
- });
3229
- }
3230
- }
3231
- }
3232
- this.#actor.rLog.debug({
3233
- msg: "event broadcasted",
3234
- eventName: name,
3235
- subscriberCount: subscribers.size,
3236
- sentCount
3237
- });
3238
- }
3239
- /**
3240
- * Gets all subscribers for a specific event.
3241
- *
3242
- * @param eventName - The name of the event
3243
- * @returns Set of connections subscribed to the event, or undefined if no subscribers
3244
- */
3245
- getSubscribers(eventName) {
3246
- return this.#subscriptionIndex.get(eventName);
3247
- }
3248
- /**
3249
- * Gets all events and their subscriber counts.
3250
- *
3251
- * @returns Map of event names to subscriber counts
3252
- */
3253
- getEventStats() {
3254
- const stats = /* @__PURE__ */ new Map();
3255
- for (const [eventName, subscribers] of this.#subscriptionIndex) {
3256
- stats.set(eventName, subscribers.size);
3257
- }
3258
- return stats;
3259
- }
3260
- /**
3261
- * Clears all subscriptions for a connection.
3262
- * Used during connection cleanup.
3263
- *
3264
- * @param connection - The connection to clear subscriptions for
3265
- */
3266
- clearConnectionSubscriptions(connection) {
3267
- for (const eventName of [...connection.subscriptions.values()]) {
3268
- this.removeSubscription(eventName, connection, true);
3269
- }
3270
- }
3271
- /**
3272
- * Gets the total number of unique events being subscribed to.
3273
- */
3274
- get eventCount() {
3275
- return this.#subscriptionIndex.size;
3276
- }
3277
- /**
3278
- * Gets the total number of subscriptions across all events.
3279
- */
3280
- get totalSubscriptionCount() {
3281
- let total = 0;
3282
- for (const subscribers of this.#subscriptionIndex.values()) {
3283
- total += subscribers.size;
3284
- }
3285
- return total;
3286
- }
3287
- /**
3288
- * Checks if an event has any subscribers.
3289
- *
3290
- * @param eventName - The name of the event to check
3291
- * @returns True if the event has at least one subscriber
3292
- */
3293
- hasSubscribers(eventName) {
3294
- const subscribers = this.#subscriptionIndex.get(eventName);
3295
- return subscribers !== void 0 && subscribers.size > 0;
3296
- }
3297
- };
3298
-
3299
- // src/actor/instance/persisted.ts
3300
-
3301
- function convertActorToBarePersisted(persist) {
3302
- return {
3303
- input: persist.input !== void 0 ? _chunkH4TB4X25cjs.bufferToArrayBuffer.call(void 0, cbor8.encode(persist.input)) : null,
3304
- hasInitialized: persist.hasInitialized,
3305
- state: _chunkH4TB4X25cjs.bufferToArrayBuffer.call(void 0, cbor8.encode(persist.state)),
3306
- scheduledEvents: persist.scheduledEvents.map((event) => ({
3307
- eventId: event.eventId,
3308
- timestamp: BigInt(event.timestamp),
3309
- action: event.action,
3310
- args: _nullishCoalesce(event.args, () => ( null))
3311
- }))
3312
- };
3313
- }
3314
- function convertActorFromBarePersisted(bareData) {
3315
- return {
3316
- input: bareData.input ? cbor8.decode(new Uint8Array(bareData.input)) : void 0,
3317
- hasInitialized: bareData.hasInitialized,
3318
- state: cbor8.decode(new Uint8Array(bareData.state)),
3319
- scheduledEvents: bareData.scheduledEvents.map((event) => ({
3320
- eventId: event.eventId,
3321
- timestamp: Number(event.timestamp),
3322
- action: event.action,
3323
- args: _nullishCoalesce(event.args, () => ( void 0))
3324
- }))
3325
- };
3326
- }
3327
-
3328
- // src/actor/instance/schedule-manager.ts
3329
-
3330
- var ScheduleManager = class {
3331
- #actor;
3332
- #actorDriver;
3333
- #alarmWriteQueue = new (0, _chunkH4TB4X25cjs.SinglePromiseQueue)();
3334
- #config;
3335
- // ActorConfig type
3336
- #persist;
3337
- // Reference to PersistedActor
3338
- constructor(actor, actorDriver, config) {
3339
- this.#actor = actor;
3340
- this.#actorDriver = actorDriver;
3341
- this.#config = config;
3342
- }
3343
- // MARK: - Public API
3344
- /**
3345
- * Sets the persist object reference.
3346
- * Called after StateManager initializes the persist proxy.
3347
- */
3348
- setPersist(persist) {
3349
- this.#persist = persist;
3350
- }
3351
- /**
3352
- * Schedules an event to be executed at a specific timestamp.
3353
- *
3354
- * @param timestamp - Unix timestamp in milliseconds when the event should fire
3355
- * @param action - The name of the action to execute
3356
- * @param args - Arguments to pass to the action
3357
- */
3358
- async scheduleEvent(timestamp, action, args) {
3359
- const newEvent = {
3360
- eventId: crypto.randomUUID(),
3361
- timestamp,
3362
- action,
3363
- args: _chunkH4TB4X25cjs.bufferToArrayBuffer.call(void 0, cbor9.encode(args))
3364
- };
3365
- await this.#scheduleEventInner(newEvent);
3366
- }
3367
- /**
3368
- * Triggers any pending alarms that are due.
3369
- * This method is idempotent and safe to call multiple times.
3370
- */
3371
- async onAlarm() {
3372
- var _a, _b, _c;
3373
- const now = Date.now();
3374
- this.#actor.log.debug({
3375
- msg: "alarm triggered",
3376
- now,
3377
- events: ((_b = (_a = this.#persist) == null ? void 0 : _a.scheduledEvents) == null ? void 0 : _b.length) || 0
3378
- });
3379
- if (!((_c = this.#persist) == null ? void 0 : _c.scheduledEvents)) {
3380
- this.#actor.rLog.debug({ msg: "no scheduled events" });
3381
- return;
3382
- }
3383
- const dueIndex = this.#persist.scheduledEvents.findIndex(
3384
- (x) => x.timestamp <= now
3385
- );
3386
- if (dueIndex === -1) {
3387
- this.#actor.rLog.debug({ msg: "no events are due yet" });
3388
- if (this.#persist.scheduledEvents.length > 0) {
3389
- const nextTs = this.#persist.scheduledEvents[0].timestamp;
3390
- this.#actor.log.debug({
3391
- msg: "alarm fired early, rescheduling for next event",
3392
- now,
3393
- nextTs,
3394
- delta: nextTs - now
3395
- });
3396
- await this.#queueSetAlarm(nextTs);
3397
- }
3398
- return;
3399
- }
3400
- const dueEvents = this.#persist.scheduledEvents.splice(0, dueIndex + 1);
3401
- this.#actor.log.debug({
3402
- msg: "running events",
3403
- count: dueEvents.length
3404
- });
3405
- if (this.#persist.scheduledEvents.length > 0) {
3406
- const nextTs = this.#persist.scheduledEvents[0].timestamp;
3407
- this.#actor.log.info({
3408
- msg: "setting next alarm",
3409
- nextTs,
3410
- remainingEvents: this.#persist.scheduledEvents.length
3411
- });
3412
- await this.#queueSetAlarm(nextTs);
3413
- }
3414
- await this.#executeDueEvents(dueEvents);
3415
- }
3416
- /**
3417
- * Initializes alarms on actor startup.
3418
- * Sets the alarm for the next scheduled event if any exist.
3419
- */
3420
- async initializeAlarms() {
3421
- var _a, _b;
3422
- if (((_b = (_a = this.#persist) == null ? void 0 : _a.scheduledEvents) == null ? void 0 : _b.length) > 0) {
3423
- await this.#queueSetAlarm(
3424
- this.#persist.scheduledEvents[0].timestamp
3425
- );
3426
- }
3427
- }
3428
- /**
3429
- * Waits for any pending alarm write operations to complete.
3430
- */
3431
- async waitForPendingAlarmWrites() {
3432
- if (this.#alarmWriteQueue.runningDrainLoop) {
3433
- await this.#alarmWriteQueue.runningDrainLoop;
3434
- }
3435
- }
3436
- /**
3437
- * Gets statistics about scheduled events.
3438
- */
3439
- getScheduleStats() {
3440
- var _a;
3441
- if (!((_a = this.#persist) == null ? void 0 : _a.scheduledEvents)) {
3442
- return {
3443
- totalEvents: 0,
3444
- nextEventTime: null,
3445
- overdueCount: 0
3446
- };
3447
- }
3448
- const now = Date.now();
3449
- const events = this.#persist.scheduledEvents;
3450
- return {
3451
- totalEvents: events.length,
3452
- nextEventTime: events.length > 0 ? events[0].timestamp : null,
3453
- overdueCount: events.filter(
3454
- (e) => e.timestamp <= now
3455
- ).length
3456
- };
3457
- }
3458
- /**
3459
- * Cancels a scheduled event by its ID.
3460
- *
3461
- * @param eventId - The ID of the event to cancel
3462
- * @returns True if the event was found and cancelled
3463
- */
3464
- async cancelEvent(eventId) {
3465
- var _a;
3466
- if (!((_a = this.#persist) == null ? void 0 : _a.scheduledEvents)) {
3467
- return false;
3468
- }
3469
- const index = this.#persist.scheduledEvents.findIndex(
3470
- (e) => e.eventId === eventId
3471
- );
3472
- if (index === -1) {
3473
- return false;
3474
- }
3475
- const wasFirst = index === 0;
3476
- this.#persist.scheduledEvents.splice(index, 1);
3477
- if (wasFirst && this.#persist.scheduledEvents.length > 0) {
3478
- await this.#queueSetAlarm(
3479
- this.#persist.scheduledEvents[0].timestamp
3480
- );
3481
- }
3482
- this.#actor.log.info({
3483
- msg: "cancelled scheduled event",
3484
- eventId,
3485
- remainingEvents: this.#persist.scheduledEvents.length
3486
- });
3487
- return true;
3488
- }
3489
- // MARK: - Private Helpers
3490
- async #scheduleEventInner(newEvent) {
3491
- var _a;
3492
- this.#actor.log.info({
3493
- msg: "scheduling event",
3494
- eventId: newEvent.eventId,
3495
- timestamp: newEvent.timestamp,
3496
- action: newEvent.action
3497
- });
3498
- if (!((_a = this.#persist) == null ? void 0 : _a.scheduledEvents)) {
3499
- throw new Error("Persist not initialized");
3500
- }
3501
- const insertIndex = this.#persist.scheduledEvents.findIndex(
3502
- (x) => x.timestamp > newEvent.timestamp
3503
- );
3504
- if (insertIndex === -1) {
3505
- this.#persist.scheduledEvents.push(newEvent);
3506
- } else {
3507
- this.#persist.scheduledEvents.splice(insertIndex, 0, newEvent);
3508
- }
3509
- if (insertIndex === 0 || this.#persist.scheduledEvents.length === 1) {
3510
- this.#actor.log.info({
3511
- msg: "setting alarm for new event",
3512
- timestamp: newEvent.timestamp,
3513
- eventCount: this.#persist.scheduledEvents.length
3514
- });
3515
- await this.#queueSetAlarm(newEvent.timestamp);
3516
- }
3517
- }
3518
- async #executeDueEvents(events) {
3519
- for (const event of events) {
3520
- try {
3521
- this.#actor.log.info({
3522
- msg: "executing scheduled event",
3523
- eventId: event.eventId,
3524
- timestamp: event.timestamp,
3525
- action: event.action
3526
- });
3527
- const actions = _nullishCoalesce(this.#config.actions, () => ( {}));
3528
- const fn = actions[event.action];
3529
- if (!fn) {
3530
- throw new Error(
3531
- `Missing action for scheduled event: ${event.action}`
3532
- );
3533
- }
3534
- if (typeof fn !== "function") {
3535
- throw new Error(
3536
- `Scheduled event action ${event.action} is not a function (got ${typeof fn})`
3537
- );
3538
- }
3539
- const args = event.args ? cbor9.decode(new Uint8Array(event.args)) : [];
3540
- const result = fn.call(
3541
- void 0,
3542
- this.#actor.actorContext,
3543
- ...args
3544
- );
3545
- if (result instanceof Promise) {
3546
- await result;
3547
- }
3548
- this.#actor.log.debug({
3549
- msg: "scheduled event completed",
3550
- eventId: event.eventId,
3551
- action: event.action
3552
- });
3553
- } catch (error) {
3554
- this.#actor.log.error({
3555
- msg: "error executing scheduled event",
3556
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, error),
3557
- eventId: event.eventId,
3558
- timestamp: event.timestamp,
3559
- action: event.action
3560
- });
3561
- }
3562
- }
3563
- }
3564
- async #queueSetAlarm(timestamp) {
3565
- await this.#alarmWriteQueue.enqueue(async () => {
3566
- await this.#actorDriver.setAlarm(this.#actor, timestamp);
3567
- });
3568
- }
3569
- /**
3570
- * Gets the next scheduled event, if any.
3571
- */
3572
- getNextEvent() {
3573
- var _a;
3574
- if (!((_a = this.#persist) == null ? void 0 : _a.scheduledEvents) || this.#persist.scheduledEvents.length === 0) {
3575
- return null;
3576
- }
3577
- return this.#persist.scheduledEvents[0];
3578
- }
3579
- /**
3580
- * Gets all scheduled events.
3581
- */
3582
- getAllEvents() {
3583
- var _a;
3584
- return ((_a = this.#persist) == null ? void 0 : _a.scheduledEvents) || [];
3585
- }
3586
- /**
3587
- * Clears all scheduled events.
3588
- * Use with caution - this removes all pending scheduled events.
3589
- */
3590
- clearAllEvents() {
3591
- var _a;
3592
- if ((_a = this.#persist) == null ? void 0 : _a.scheduledEvents) {
3593
- this.#persist.scheduledEvents = [];
3594
- this.#actor.log.warn({ msg: "cleared all scheduled events" });
3595
- }
3596
- }
3597
- };
3598
-
3599
- // src/actor/instance/state-manager.ts
3600
- var _enginerunner = require('@rivetkit/engine-runner');
3601
- var _onchange = require('@rivetkit/on-change'); var _onchange2 = _interopRequireDefault(_onchange);
3602
- var StateManager = class {
3603
- #actor;
3604
- #actorDriver;
3605
- // State tracking
3606
- #persist;
3607
- #persistRaw;
3608
- #persistChanged = false;
3609
- #isInOnStateChange = false;
3610
- // Save management
3611
- #persistWriteQueue = new (0, _chunkH4TB4X25cjs.SinglePromiseQueue)();
3612
- #lastSaveTime = 0;
3613
- #pendingSaveTimeout;
3614
- #pendingSaveScheduledTimestamp;
3615
- #onPersistSavedPromise;
3616
- // Configuration
3617
- #config;
3618
- // ActorConfig type
3619
- #stateSaveInterval;
3620
- constructor(actor, actorDriver, config) {
3621
- this.#actor = actor;
3622
- this.#actorDriver = actorDriver;
3623
- this.#config = config;
3624
- this.#stateSaveInterval = config.options.stateSaveInterval || 100;
3625
- }
3626
- // MARK: - Public API
3627
- get persist() {
3628
- return this.#persist;
3629
- }
3630
- get persistRaw() {
3631
- return this.#persistRaw;
3632
- }
3633
- get persistChanged() {
3634
- return this.#persistChanged;
3635
- }
3636
- get state() {
3637
- this.#validateStateEnabled();
3638
- return this.#persist.state;
3639
- }
3640
- set state(value) {
3641
- this.#validateStateEnabled();
3642
- this.#persist.state = value;
3643
- }
3644
- get stateEnabled() {
3645
- return "createState" in this.#config || "state" in this.#config;
3646
- }
3647
- // MARK: - Initialization
3648
- /**
3649
- * Initializes state from persisted data or creates new state.
3650
- */
3651
- async initializeState(persistData) {
3652
- if (!persistData.hasInitialized) {
3653
- let stateData;
3654
- if (this.stateEnabled) {
3655
- this.#actor.rLog.info({ msg: "actor state initializing" });
3656
- if ("createState" in this.#config) {
3657
- stateData = await this.#config.createState(
3658
- this.#actor.actorContext,
3659
- persistData.input
3660
- );
3661
- } else if ("state" in this.#config) {
3662
- stateData = structuredClone(this.#config.state);
3663
- } else {
3664
- throw new Error(
3665
- "Both 'createState' or 'state' were not defined"
3666
- );
3667
- }
3668
- } else {
3669
- this.#actor.rLog.debug({ msg: "state not enabled" });
3670
- }
3671
- persistData.state = stateData;
3672
- persistData.hasInitialized = true;
3673
- const bareData = convertActorToBarePersisted(persistData);
3674
- await this.#actorDriver.kvBatchPut(this.#actor.id, [
3675
- [
3676
- _chunkRZW2DNNDcjs.KEYS.PERSIST_DATA,
3677
- _chunkRZW2DNNDcjs.ACTOR_VERSIONED.serializeWithEmbeddedVersion(
3678
- bareData,
3679
- _chunkRZW2DNNDcjs.CURRENT_VERSION2
3680
- )
3681
- ]
3682
- ]);
3683
- }
3684
- this.initPersistProxy(persistData);
3685
- }
3686
- /**
3687
- * Creates proxy for persist object that handles automatic state change detection.
3688
- */
3689
- initPersistProxy(target) {
3690
- this.#persistRaw = target;
3691
- if (target === null || typeof target !== "object") {
3692
- let invalidPath = "";
3693
- if (!_chunkH4TB4X25cjs.isCborSerializable.call(void 0,
3694
- target,
3695
- (path) => {
3696
- invalidPath = path;
3697
- },
3698
- ""
3699
- )) {
3700
- throw new (0, _chunk2XQS746Mcjs.InvalidStateType)({ path: invalidPath });
3701
- }
3702
- return target;
3703
- }
3704
- if (this.#persist) {
3705
- _onchange2.default.unsubscribe(this.#persist);
3706
- }
3707
- this.#persist = _onchange2.default.call(void 0,
3708
- target,
3709
- (path, value, _previousValue, _applyData) => {
3710
- this.#handleStateChange(path, value);
3711
- },
3712
- { ignoreDetached: true }
3713
- );
3714
- }
3715
- // MARK: - State Persistence
3716
- /**
3717
- * Forces the state to get saved.
3718
- */
3719
- async saveState(opts) {
3720
- var _a;
3721
- this.#actor.assertReady(opts.allowStoppingState);
3722
- if (this.#persistChanged) {
3723
- if (opts.immediate) {
3724
- await this.#savePersistInner();
3725
- } else {
3726
- if (!this.#onPersistSavedPromise) {
3727
- this.#onPersistSavedPromise = _chunkH4TB4X25cjs.promiseWithResolvers.call(void 0, );
3728
- }
3729
- this.savePersistThrottled(opts.maxWait);
3730
- await ((_a = this.#onPersistSavedPromise) == null ? void 0 : _a.promise);
3731
- }
3732
- }
3733
- }
3734
- /**
3735
- * Throttled save state method. Used to write to KV at a reasonable cadence.
3736
- *
3737
- * Passing a maxWait will override the stateSaveInterval with the min
3738
- * between that and the maxWait.
3739
- */
3740
- savePersistThrottled(maxWait) {
3741
- const now = Date.now();
3742
- const timeSinceLastSave = now - this.#lastSaveTime;
3743
- let saveDelay = Math.max(
3744
- 0,
3745
- this.#stateSaveInterval - timeSinceLastSave
3746
- );
3747
- if (maxWait !== void 0) {
3748
- saveDelay = Math.min(saveDelay, maxWait);
3749
- }
3750
- if (this.#pendingSaveTimeout !== void 0 && this.#pendingSaveScheduledTimestamp !== void 0) {
3751
- const newScheduledTimestamp = now + saveDelay;
3752
- if (newScheduledTimestamp < this.#pendingSaveScheduledTimestamp) {
3753
- clearTimeout(this.#pendingSaveTimeout);
3754
- this.#pendingSaveTimeout = void 0;
3755
- this.#pendingSaveScheduledTimestamp = void 0;
3756
- } else {
3757
- return;
3758
- }
3759
- }
3760
- if (saveDelay > 0) {
3761
- this.#pendingSaveScheduledTimestamp = now + saveDelay;
3762
- this.#pendingSaveTimeout = setTimeout(() => {
3763
- this.#pendingSaveTimeout = void 0;
3764
- this.#pendingSaveScheduledTimestamp = void 0;
3765
- this.#savePersistInner().catch((error) => {
3766
- this.#actor.rLog.error({
3767
- msg: "error saving persist data in scheduled save",
3768
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, error)
3769
- });
3770
- });
3771
- }, saveDelay);
3772
- } else {
3773
- this.#savePersistInner().catch((error) => {
3774
- this.#actor.rLog.error({
3775
- msg: "error saving persist data immediately",
3776
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, error)
3777
- });
3778
- });
3779
- }
3780
- }
3781
- /**
3782
- * Clears any pending save timeout.
3783
- */
3784
- clearPendingSaveTimeout() {
3785
- if (this.#pendingSaveTimeout) {
3786
- clearTimeout(this.#pendingSaveTimeout);
3787
- this.#pendingSaveTimeout = void 0;
3788
- this.#pendingSaveScheduledTimestamp = void 0;
3789
- }
3790
- }
3791
- /**
3792
- * Waits for any pending write operations to complete.
3793
- */
3794
- async waitForPendingWrites() {
3795
- if (this.#persistWriteQueue.runningDrainLoop) {
3796
- await this.#persistWriteQueue.runningDrainLoop;
3797
- }
3798
- }
3799
- // MARK: - Private Helpers
3800
- #validateStateEnabled() {
3801
- if (!this.stateEnabled) {
3802
- throw new (0, _chunk2XQS746Mcjs.StateNotEnabled)();
3803
- }
3804
- }
3805
- #handleStateChange(path, value) {
3806
- const actorStatePath = _chunkRZW2DNNDcjs.isStatePath.call(void 0, path);
3807
- const connStatePath = _chunkRZW2DNNDcjs.isConnStatePath.call(void 0, path);
3808
- if (actorStatePath || connStatePath) {
3809
- let invalidPath = "";
3810
- if (!_chunkH4TB4X25cjs.isCborSerializable.call(void 0,
3811
- value,
3812
- (invalidPathPart) => {
3813
- invalidPath = invalidPathPart;
3814
- },
3815
- ""
3816
- )) {
3817
- throw new (0, _chunk2XQS746Mcjs.InvalidStateType)({
3818
- path: path + (invalidPath ? `.${invalidPath}` : "")
3819
- });
3820
- }
3821
- }
3822
- this.#actor.rLog.debug({
3823
- msg: "onChange triggered, setting persistChanged=true",
3824
- path
3825
- });
3826
- this.#persistChanged = true;
3827
- if (actorStatePath) {
3828
- this.#actor.inspector.emitter.emit(
3829
- "stateUpdated",
3830
- this.#persist.state
3831
- );
3832
- }
3833
- if (actorStatePath && this.#config.onStateChange && this.#actor.isReady() && !this.#isInOnStateChange) {
3834
- try {
3835
- this.#isInOnStateChange = true;
3836
- this.#config.onStateChange(
3837
- this.#actor.actorContext,
3838
- this.#persistRaw.state
3839
- );
3840
- } catch (error) {
3841
- this.#actor.rLog.error({
3842
- msg: "error in `_onStateChange`",
3843
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, error)
3844
- });
3845
- } finally {
3846
- this.#isInOnStateChange = false;
3847
- }
3848
- }
3849
- }
3850
- async #savePersistInner() {
3851
- var _a, _b;
3852
- this.#actor.rLog.info({
3853
- msg: "savePersistInner called",
3854
- persistChanged: this.#persistChanged,
3855
- connsWithPersistChangedSize: this.#actor.connectionManager.connsWithPersistChanged.size,
3856
- connsWithPersistChangedIds: Array.from(
3857
- this.#actor.connectionManager.connsWithPersistChanged
3858
- )
3859
- });
3860
- try {
3861
- this.#lastSaveTime = Date.now();
3862
- const hasChanges = this.#persistChanged || this.#actor.connectionManager.connsWithPersistChanged.size > 0;
3863
- if (hasChanges) {
3864
- await this.#persistWriteQueue.enqueue(async () => {
3865
- this.#actor.rLog.debug({
3866
- msg: "saving persist",
3867
- actorChanged: this.#persistChanged,
3868
- connectionsChanged: this.#actor.connectionManager.connsWithPersistChanged.size
3869
- });
3870
- const entries = [];
3871
- if (this.#persistChanged) {
3872
- this.#persistChanged = false;
3873
- const bareData = convertActorToBarePersisted(
3874
- this.#persistRaw
3875
- );
3876
- entries.push([
3877
- _chunkRZW2DNNDcjs.KEYS.PERSIST_DATA,
3878
- _chunkRZW2DNNDcjs.ACTOR_VERSIONED.serializeWithEmbeddedVersion(
3879
- bareData,
3880
- _chunkRZW2DNNDcjs.CURRENT_VERSION2
3881
- )
3882
- ]);
3883
- }
3884
- const connections = [];
3885
- for (const connId of this.#actor.connectionManager.connsWithPersistChanged) {
3886
- const conn = this.#actor.conns.get(connId);
3887
- if (!conn) {
3888
- this.#actor.rLog.warn({
3889
- msg: "connection not found in conns map",
3890
- connId
3891
- });
3892
- continue;
3893
- }
3894
- const connStateManager = conn[_chunkRZW2DNNDcjs.CONN_STATE_MANAGER_SYMBOL];
3895
- const hibernatableDataRaw = connStateManager.hibernatableDataRaw;
3896
- if (!hibernatableDataRaw) {
3897
- this.#actor.log.warn({
3898
- msg: "missing raw hibernatable data for conn in getChangedConnectionsData",
3899
- connId: conn.id
3900
- });
3901
- continue;
3902
- }
3903
- this.#actor.rLog.info({
3904
- msg: "persisting connection",
3905
- connId,
3906
- gatewayId: _enginerunner.idToStr.call(void 0, hibernatableDataRaw.requestId),
3907
- requestId: _enginerunner.idToStr.call(void 0, hibernatableDataRaw.requestId),
3908
- serverMessageIndex: hibernatableDataRaw.serverMessageIndex,
3909
- clientMessageIndex: hibernatableDataRaw.clientMessageIndex,
3910
- hasState: hibernatableDataRaw.state !== void 0
3911
- });
3912
- const bareData = convertConnToBarePersistedConn(
3913
- hibernatableDataRaw
3914
- );
3915
- const connData = _chunkRZW2DNNDcjs.CONN_VERSIONED.serializeWithEmbeddedVersion(
3916
- bareData,
3917
- _chunkRZW2DNNDcjs.CURRENT_VERSION2
3918
- );
3919
- entries.push([_chunkRZW2DNNDcjs.makeConnKey.call(void 0, connId), connData]);
3920
- connections.push(conn);
3921
- }
3922
- this.#actor.rLog.info({
3923
- msg: "prepared entries for kvBatchPut",
3924
- totalEntries: entries.length,
3925
- connectionEntries: connections.length,
3926
- connectionIds: connections.map((c) => c.id)
3927
- });
3928
- if (this.#actorDriver.onBeforePersistConn) {
3929
- for (const conn of connections) {
3930
- this.#actorDriver.onBeforePersistConn(conn);
3931
- }
3932
- }
3933
- this.#actor.connectionManager.clearConnWithPersistChanged();
3934
- this.#actor.rLog.info({
3935
- msg: "calling kvBatchPut",
3936
- actorId: this.#actor.id,
3937
- entriesCount: entries.length
3938
- });
3939
- await this.#actorDriver.kvBatchPut(this.#actor.id, entries);
3940
- this.#actor.rLog.info({
3941
- msg: "kvBatchPut completed successfully"
3942
- });
3943
- if (this.#actorDriver.onAfterPersistConn) {
3944
- for (const conn of connections) {
3945
- this.#actorDriver.onAfterPersistConn(conn);
3946
- }
3947
- }
3948
- this.#actor.rLog.debug({ msg: "persist saved" });
3949
- });
3950
- } else {
3951
- this.#actor.rLog.info({
3952
- msg: "savePersistInner skipped - no changes"
3953
- });
3954
- }
3955
- (_a = this.#onPersistSavedPromise) == null ? void 0 : _a.resolve();
3956
- } catch (error) {
3957
- this.#actor.rLog.error({
3958
- msg: "error saving persist",
3959
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, error)
3960
- });
3961
- (_b = this.#onPersistSavedPromise) == null ? void 0 : _b.reject(error);
3962
- throw error;
3963
- }
3964
- }
3965
- };
3966
-
3967
- // src/actor/instance/mod.ts
3968
- var CanSleep = /* @__PURE__ */ ((CanSleep2) => {
3969
- CanSleep2[CanSleep2["Yes"] = 0] = "Yes";
3970
- CanSleep2[CanSleep2["NotReady"] = 1] = "NotReady";
3971
- CanSleep2[CanSleep2["NotStarted"] = 2] = "NotStarted";
3972
- CanSleep2[CanSleep2["ActiveConns"] = 3] = "ActiveConns";
3973
- CanSleep2[CanSleep2["ActiveHonoHttpRequests"] = 4] = "ActiveHonoHttpRequests";
3974
- return CanSleep2;
3975
- })(CanSleep || {});
3976
- var ActorInstance = class {
3977
- // MARK: - Core Properties
3978
-
3979
- #config;
3980
-
3981
- #inlineClient;
3982
- #actorId;
3983
- #name;
3984
- #key;
3985
- #region;
3986
- // MARK: - Managers
3987
-
3988
-
3989
-
3990
- #scheduleManager;
3991
- // MARK: - Logging
3992
- #log;
3993
- #rLog;
3994
- // MARK: - Lifecycle State
3995
- /**
3996
- * If the core actor initiation has set up.
3997
- *
3998
- * Almost all actions on this actor will throw an error if false.
3999
- **/
4000
- #ready = false;
4001
- /**
4002
- * If the actor has fully started.
4003
- *
4004
- * The only purpose of this is to prevent sleeping until started.
4005
- */
4006
- #started = false;
4007
- #sleepCalled = false;
4008
- #destroyCalled = false;
4009
- #stopCalled = false;
4010
- #sleepTimeout;
4011
- #abortController = new AbortController();
4012
- // MARK: - Variables & Database
4013
- #vars;
4014
- #db;
4015
- // MARK: - Background Tasks
4016
- #backgroundPromises = [];
4017
- // MARK: - HTTP/WebSocket Tracking
4018
- #activeHonoHttpRequests = 0;
4019
- // MARK: - Deprecated (kept for compatibility)
4020
- #schedule;
4021
- // MARK: - Inspector
4022
- #inspectorToken;
4023
- #inspector = new ActorInspector(this);
4024
- // MARK: - Constructor
4025
- constructor(config) {
4026
- this.#config = config;
4027
- this.actorContext = new (0, _chunkRZW2DNNDcjs.ActorContext)(this);
4028
- }
4029
- // MARK: - Public Getters
4030
- get log() {
4031
- _invariant2.default.call(void 0, this.#log, "log not configured");
4032
- return this.#log;
4033
- }
4034
- get rLog() {
4035
- _invariant2.default.call(void 0, this.#rLog, "log not configured");
4036
- return this.#rLog;
4037
- }
4038
- get isStopping() {
4039
- return this.#stopCalled;
4040
- }
4041
- get id() {
4042
- return this.#actorId;
4043
- }
4044
- get name() {
4045
- return this.#name;
4046
- }
4047
- get key() {
4048
- return this.#key;
4049
- }
4050
- get region() {
4051
- return this.#region;
4052
- }
4053
- get inlineClient() {
4054
- return this.#inlineClient;
4055
- }
4056
- get inspector() {
4057
- return this.#inspector;
4058
- }
4059
- get inspectorToken() {
4060
- return this.#inspectorToken;
4061
- }
4062
- get conns() {
4063
- return this.connectionManager.connections;
4064
- }
4065
- get schedule() {
4066
- return this.#schedule;
4067
- }
4068
- get abortSignal() {
4069
- return this.#abortController.signal;
4070
- }
4071
- get actions() {
4072
- return Object.keys(_nullishCoalesce(this.#config.actions, () => ( {})));
4073
- }
4074
- get config() {
4075
- return this.#config;
4076
- }
4077
- // MARK: - State Access
4078
- get persist() {
4079
- return this.stateManager.persist;
4080
- }
4081
- get state() {
4082
- return this.stateManager.state;
4083
- }
4084
- set state(value) {
4085
- this.stateManager.state = value;
4086
- }
4087
- get stateEnabled() {
4088
- return this.stateManager.stateEnabled;
4089
- }
4090
- get connStateEnabled() {
4091
- return "createConnState" in this.#config || "connState" in this.#config;
4092
- }
4093
- // MARK: - Variables & Database
4094
- get vars() {
4095
- this.#validateVarsEnabled();
4096
- _invariant2.default.call(void 0, this.#vars !== void 0, "vars not enabled");
4097
- return this.#vars;
4098
- }
4099
- get db() {
4100
- if (!this.#db) {
4101
- throw new (0, _chunk2XQS746Mcjs.DatabaseNotEnabled)();
4102
- }
4103
- return this.#db;
4104
- }
4105
- // MARK: - Initialization
4106
- async start(actorDriver, inlineClient, actorId, name, key, region) {
4107
- var _a, _b;
4108
- this.driver = actorDriver;
4109
- this.#inlineClient = inlineClient;
4110
- this.#actorId = actorId;
4111
- this.#name = name;
4112
- this.#key = key;
4113
- this.#region = region;
4114
- this.#initializeLogging();
4115
- this.connectionManager = new ConnectionManager(this);
4116
- this.stateManager = new StateManager(this, actorDriver, this.#config);
4117
- this.eventManager = new EventManager(this);
4118
- this.#scheduleManager = new ScheduleManager(
4119
- this,
4120
- actorDriver,
4121
- this.#config
4122
- );
4123
- this.#schedule = new Schedule(this);
4124
- await this.#loadState();
4125
- await this.#initializeInspectorToken();
4126
- if (this.#varsEnabled) {
4127
- await this.#initializeVars();
4128
- }
4129
- await this.#callOnStart();
4130
- await this.#setupDatabase();
4131
- await this.#scheduleManager.initializeAlarms();
4132
- this.#ready = true;
4133
- await ((_b = (_a = this.driver).onBeforeActorStart) == null ? void 0 : _b.call(_a, this));
4134
- this.#started = true;
4135
- this.#rLog.info({ msg: "actor started" });
4136
- this.resetSleepTimer();
4137
- await this.onAlarm();
4138
- }
4139
- // MARK: - Ready Check
4140
- isReady() {
4141
- return this.#ready;
4142
- }
4143
- assertReady(allowStoppingState = false) {
4144
- if (!this.#ready) throw new (0, _chunk2XQS746Mcjs.InternalError)("Actor not ready");
4145
- if (!allowStoppingState && this.#stopCalled)
4146
- throw new (0, _chunk2XQS746Mcjs.InternalError)("Actor is stopping");
4147
- }
4148
- // MARK: - Stop
4149
- async onStop(mode) {
4150
- if (this.#stopCalled) {
4151
- this.#rLog.warn({ msg: "already stopping actor" });
4152
- return;
4153
- }
4154
- this.#stopCalled = true;
4155
- this.#rLog.info({
4156
- msg: "setting stopCalled=true",
4157
- mode
4158
- });
4159
- if (this.#sleepTimeout) {
4160
- clearTimeout(this.#sleepTimeout);
4161
- this.#sleepTimeout = void 0;
4162
- }
4163
- try {
4164
- this.#abortController.abort();
4165
- } catch (e3) {
4166
- }
4167
- if (mode === "sleep") {
4168
- await this.#callOnSleep();
4169
- } else if (mode === "destroy") {
4170
- await this.#callOnDestroy();
4171
- } else {
4172
- _chunkRZW2DNNDcjs.assertUnreachable.call(void 0, mode);
4173
- }
4174
- await this.#disconnectConnections();
4175
- await this.#waitBackgroundPromises(
4176
- this.#config.options.waitUntilTimeout
4177
- );
4178
- this.#rLog.info({ msg: "clearing pending save timeouts" });
4179
- this.stateManager.clearPendingSaveTimeout();
4180
- this.#rLog.info({ msg: "saving state immediately" });
4181
- await this.stateManager.saveState({
4182
- immediate: true,
4183
- allowStoppingState: true
4184
- });
4185
- await this.stateManager.waitForPendingWrites();
4186
- await this.#scheduleManager.waitForPendingAlarmWrites();
4187
- }
4188
- // MARK: - Sleep
4189
- startSleep() {
4190
- var _a;
4191
- if (this.#stopCalled || this.#destroyCalled) {
4192
- this.#rLog.debug({
4193
- msg: "cannot call startSleep if actor already stopping"
4194
- });
4195
- return;
4196
- }
4197
- if (this.#sleepCalled) {
4198
- this.#rLog.warn({
4199
- msg: "cannot call startSleep twice, actor already sleeping"
4200
- });
4201
- return;
4202
- }
4203
- this.#sleepCalled = true;
4204
- const sleep = (_a = this.driver.startSleep) == null ? void 0 : _a.bind(this.driver, this.#actorId);
4205
- _invariant2.default.call(void 0, this.#sleepingSupported, "sleeping not supported");
4206
- _invariant2.default.call(void 0, sleep, "no sleep on driver");
4207
- this.#rLog.info({ msg: "actor sleeping" });
4208
- setImmediate(() => {
4209
- sleep();
4210
- });
4211
- }
4212
- // MARK: - Destroy
4213
- startDestroy() {
4214
- if (this.#stopCalled || this.#sleepCalled) {
4215
- this.#rLog.debug({
4216
- msg: "cannot call startDestroy if actor already stopping or sleeping"
4217
- });
4218
- return;
4219
- }
4220
- if (this.#destroyCalled) {
4221
- this.#rLog.warn({
4222
- msg: "cannot call startDestroy twice, actor already destroying"
4223
- });
4224
- return;
4225
- }
4226
- this.#destroyCalled = true;
4227
- const destroy = this.driver.startDestroy.bind(
4228
- this.driver,
4229
- this.#actorId
4230
- );
4231
- this.#rLog.info({ msg: "actor destroying" });
4232
- setImmediate(() => {
4233
- destroy();
4234
- });
4235
- }
4236
- // MARK: - HTTP Request Tracking
4237
- beginHonoHttpRequest() {
4238
- this.#activeHonoHttpRequests++;
4239
- this.resetSleepTimer();
4240
- }
4241
- endHonoHttpRequest() {
4242
- this.#activeHonoHttpRequests--;
4243
- if (this.#activeHonoHttpRequests < 0) {
4244
- this.#activeHonoHttpRequests = 0;
4245
- this.#rLog.warn({
4246
- msg: "active hono requests went below 0, this is a RivetKit bug",
4247
- ..._chunkH4TB4X25cjs.EXTRA_ERROR_LOG
4248
- });
4249
- }
4250
- this.resetSleepTimer();
4251
- }
4252
- // MARK: - Message Processing
4253
- async processMessage(message, conn) {
4254
- await _chunkRZW2DNNDcjs.processMessage.call(void 0, message, this, conn, {
4255
- onExecuteAction: async (ctx, name, args) => {
4256
- this.inspector.emitter.emit("eventFired", {
4257
- type: "action",
4258
- name,
4259
- args,
4260
- connId: conn.id
4261
- });
4262
- return await this.executeAction(ctx, name, args);
4263
- },
4264
- onSubscribe: async (eventName, conn2) => {
4265
- this.inspector.emitter.emit("eventFired", {
4266
- type: "subscribe",
4267
- eventName,
4268
- connId: conn2.id
4269
- });
4270
- this.eventManager.addSubscription(eventName, conn2, false);
4271
- },
4272
- onUnsubscribe: async (eventName, conn2) => {
4273
- this.inspector.emitter.emit("eventFired", {
4274
- type: "unsubscribe",
4275
- eventName,
4276
- connId: conn2.id
4277
- });
4278
- this.eventManager.removeSubscription(eventName, conn2, false);
4279
- }
4280
- });
4281
- }
4282
- // MARK: - Action Execution
4283
- async executeAction(ctx, actionName, args) {
4284
- this.assertReady();
4285
- const actions = _nullishCoalesce(this.#config.actions, () => ( {}));
4286
- if (!(actionName in actions)) {
4287
- this.#rLog.warn({ msg: "action does not exist", actionName });
4288
- throw new (0, _chunk2XQS746Mcjs.ActionNotFound)(actionName);
4289
- }
4290
- const actionFunction = actions[actionName];
4291
- if (typeof actionFunction !== "function") {
4292
- this.#rLog.warn({
4293
- msg: "action is not a function",
4294
- actionName,
4295
- type: typeof actionFunction
4296
- });
4297
- throw new (0, _chunk2XQS746Mcjs.ActionNotFound)(actionName);
4298
- }
4299
- try {
4300
- this.#rLog.debug({
4301
- msg: "executing action",
4302
- actionName,
4303
- args
4304
- });
4305
- const outputOrPromise = actionFunction.call(
4306
- void 0,
4307
- ctx,
4308
- ...args
4309
- );
4310
- let output;
4311
- if (outputOrPromise instanceof Promise) {
4312
- output = await _chunkRZW2DNNDcjs.deadline.call(void 0,
4313
- outputOrPromise,
4314
- this.#config.options.actionTimeout
4315
- );
4316
- } else {
4317
- output = outputOrPromise;
4318
- }
4319
- if (this.#config.onBeforeActionResponse) {
4320
- try {
4321
- const processedOutput = this.#config.onBeforeActionResponse(
4322
- this.actorContext,
4323
- actionName,
4324
- args,
4325
- output
4326
- );
4327
- if (processedOutput instanceof Promise) {
4328
- output = await processedOutput;
4329
- } else {
4330
- output = processedOutput;
4331
- }
4332
- } catch (error) {
4333
- this.#rLog.error({
4334
- msg: "error in `onBeforeActionResponse`",
4335
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, error)
4336
- });
4337
- }
4338
- }
4339
- return output;
4340
- } catch (error) {
4341
- if (error instanceof _chunkRZW2DNNDcjs.DeadlineError) {
4342
- throw new (0, _chunk2XQS746Mcjs.ActionTimedOut)();
4343
- }
4344
- this.#rLog.error({
4345
- msg: "action error",
4346
- actionName,
4347
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, error)
4348
- });
4349
- throw error;
4350
- } finally {
4351
- this.stateManager.savePersistThrottled();
4352
- }
4353
- }
4354
- // MARK: - HTTP/WebSocket Handlers
4355
- async handleRawRequest(conn, request) {
4356
- this.assertReady();
4357
- if (!this.#config.onRequest) {
4358
- throw new (0, _chunk2XQS746Mcjs.RequestHandlerNotDefined)();
4359
- }
4360
- try {
4361
- const ctx = new (0, _chunkRZW2DNNDcjs.RequestContext)(this, conn, request);
4362
- const response = await this.#config.onRequest(ctx, request);
4363
- if (!response) {
4364
- throw new (0, _chunk2XQS746Mcjs.InvalidRequestHandlerResponse)();
4365
- }
4366
- return response;
4367
- } catch (error) {
4368
- this.#rLog.error({
4369
- msg: "onRequest error",
4370
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, error)
4371
- });
4372
- throw error;
4373
- } finally {
4374
- this.stateManager.savePersistThrottled();
4375
- }
4376
- }
4377
- handleRawWebSocket(conn, websocket, request) {
4378
- this.assertReady();
4379
- if (!this.#config.onWebSocket) {
4380
- throw new (0, _chunk2XQS746Mcjs.InternalError)("onWebSocket handler not defined");
4381
- }
4382
- try {
4383
- this.resetSleepTimer();
4384
- const ctx = new (0, _chunkRZW2DNNDcjs.WebSocketContext)(this, conn, request);
4385
- const voidOrPromise = this.#config.onWebSocket(ctx, websocket);
4386
- if (voidOrPromise instanceof Promise) {
4387
- voidOrPromise.then(() => {
4388
- this.stateManager.savePersistThrottled();
4389
- });
4390
- } else {
4391
- this.stateManager.savePersistThrottled();
4392
- }
4393
- } catch (error) {
4394
- this.#rLog.error({
4395
- msg: "onWebSocket error",
4396
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, error)
4397
- });
4398
- throw error;
4399
- }
4400
- }
4401
- // MARK: - Scheduling
4402
- async scheduleEvent(timestamp, action, args) {
4403
- await this.#scheduleManager.scheduleEvent(timestamp, action, args);
4404
- }
4405
- async onAlarm() {
4406
- this.resetSleepTimer();
4407
- await this.#scheduleManager.onAlarm();
4408
- }
4409
- // MARK: - Background Tasks
4410
- waitUntil(promise) {
4411
- this.assertReady();
4412
- const nonfailablePromise = promise.then(() => {
4413
- this.#rLog.debug({ msg: "wait until promise complete" });
4414
- }).catch((error) => {
4415
- this.#rLog.error({
4416
- msg: "wait until promise failed",
4417
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, error)
4418
- });
4419
- });
4420
- this.#backgroundPromises.push(nonfailablePromise);
4421
- }
4422
- // MARK: - Private Helper Methods
4423
- #initializeLogging() {
4424
- var _a, _b;
4425
- const logParams = {
4426
- actor: this.#name,
4427
- key: _chunkRZW2DNNDcjs.serializeActorKey.call(void 0, this.#key),
4428
- actorId: this.#actorId
4429
- };
4430
- const extraLogParams = (_b = (_a = this.driver).getExtraActorLogParams) == null ? void 0 : _b.call(_a);
4431
- if (extraLogParams) Object.assign(logParams, extraLogParams);
4432
- this.#log = _chunkH4TB4X25cjs.getBaseLogger.call(void 0, ).child(
4433
- Object.assign(
4434
- _chunkH4TB4X25cjs.getIncludeTarget.call(void 0, ) ? { target: "actor" } : {},
4435
- logParams
4436
- )
4437
- );
4438
- this.#rLog = _chunkH4TB4X25cjs.getBaseLogger.call(void 0, ).child(
4439
- Object.assign(
4440
- _chunkH4TB4X25cjs.getIncludeTarget.call(void 0, ) ? { target: "actor-runtime" } : {},
4441
- logParams
4442
- )
4443
- );
4444
- }
4445
- async #loadState() {
4446
- const [persistDataBuffer] = await this.driver.kvBatchGet(
4447
- this.#actorId,
4448
- [_chunkRZW2DNNDcjs.KEYS.PERSIST_DATA]
4449
- );
4450
- _invariant2.default.call(void 0,
4451
- persistDataBuffer !== null,
4452
- "persist data has not been set, it should be set when initialized"
4453
- );
4454
- const bareData = _chunkRZW2DNNDcjs.ACTOR_VERSIONED.deserializeWithEmbeddedVersion(persistDataBuffer);
4455
- const persistData = convertActorFromBarePersisted(bareData);
4456
- if (persistData.hasInitialized) {
4457
- await this.#restoreExistingActor(persistData);
4458
- } else {
4459
- await this.#createNewActor(persistData);
4460
- }
4461
- this.#scheduleManager.setPersist(this.stateManager.persist);
4462
- }
4463
- async #createNewActor(persistData) {
4464
- this.#rLog.info({ msg: "actor creating" });
4465
- await this.stateManager.initializeState(persistData);
4466
- if (this.#config.onCreate) {
4467
- await this.#config.onCreate(
4468
- this.actorContext,
4469
- persistData.input
4470
- );
4471
- }
4472
- }
4473
- async #restoreExistingActor(persistData) {
4474
- const connEntries = await this.driver.kvListPrefix(
4475
- this.#actorId,
4476
- _chunkRZW2DNNDcjs.KEYS.CONN_PREFIX
4477
- );
4478
- const connections = [];
4479
- for (const [_key, value] of connEntries) {
4480
- try {
4481
- const bareData = _chunkRZW2DNNDcjs.CONN_VERSIONED.deserializeWithEmbeddedVersion(
4482
- new Uint8Array(value)
4483
- );
4484
- const conn = convertConnFromBarePersistedConn(bareData);
4485
- connections.push(conn);
4486
- } catch (error) {
4487
- this.#rLog.error({
4488
- msg: "failed to decode connection",
4489
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, error)
4490
- });
4491
- }
4492
- }
4493
- this.#rLog.info({
4494
- msg: "actor restoring",
4495
- connections: connections.length
4496
- });
4497
- this.stateManager.initPersistProxy(persistData);
4498
- this.connectionManager.restoreConnections(connections);
4499
- }
4500
- async #initializeInspectorToken() {
4501
- const [tokenBuffer] = await this.driver.kvBatchGet(this.#actorId, [
4502
- _chunkRZW2DNNDcjs.KEYS.INSPECTOR_TOKEN
4503
- ]);
4504
- if (tokenBuffer !== null) {
4505
- const decoder = new TextDecoder();
4506
- this.#inspectorToken = decoder.decode(tokenBuffer);
4507
- this.#rLog.debug({ msg: "loaded existing inspector token" });
4508
- } else {
4509
- this.#inspectorToken = _chunkRZW2DNNDcjs.generateSecureToken.call(void 0, );
4510
- const tokenBytes = new TextEncoder().encode(this.#inspectorToken);
4511
- await this.driver.kvBatchPut(this.#actorId, [
4512
- [_chunkRZW2DNNDcjs.KEYS.INSPECTOR_TOKEN, tokenBytes]
4513
- ]);
4514
- this.#rLog.debug({ msg: "generated new inspector token" });
4515
- }
4516
- }
4517
- async #initializeVars() {
4518
- let vars;
4519
- if ("createVars" in this.#config) {
4520
- const dataOrPromise = this.#config.createVars(
4521
- this.actorContext,
4522
- this.driver.getContext(this.#actorId)
4523
- );
4524
- if (dataOrPromise instanceof Promise) {
4525
- vars = await _chunkRZW2DNNDcjs.deadline.call(void 0,
4526
- dataOrPromise,
4527
- this.#config.options.createVarsTimeout
4528
- );
4529
- } else {
4530
- vars = dataOrPromise;
4531
- }
4532
- } else if ("vars" in this.#config) {
4533
- vars = structuredClone(this.#config.vars);
4534
- } else {
4535
- throw new Error(
4536
- "Could not create variables from 'createVars' or 'vars'"
4537
- );
4538
- }
4539
- this.#vars = vars;
4540
- }
4541
- async #callOnStart() {
4542
- this.#rLog.info({ msg: "actor starting" });
4543
- if (this.#config.onWake) {
4544
- const result = this.#config.onWake(this.actorContext);
4545
- if (result instanceof Promise) {
4546
- await result;
4547
- }
4548
- }
4549
- }
4550
- async #callOnSleep() {
4551
- if (this.#config.onSleep) {
4552
- try {
4553
- this.#rLog.debug({ msg: "calling onSleep" });
4554
- const result = this.#config.onSleep(this.actorContext);
4555
- if (result instanceof Promise) {
4556
- await _chunkRZW2DNNDcjs.deadline.call(void 0, result, this.#config.options.onSleepTimeout);
4557
- }
4558
- this.#rLog.debug({ msg: "onSleep completed" });
4559
- } catch (error) {
4560
- if (error instanceof _chunkRZW2DNNDcjs.DeadlineError) {
4561
- this.#rLog.error({ msg: "onSleep timed out" });
4562
- } else {
4563
- this.#rLog.error({
4564
- msg: "error in onSleep",
4565
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, error)
4566
- });
4567
- }
4568
- }
4569
- }
4570
- }
4571
- async #callOnDestroy() {
4572
- if (this.#config.onDestroy) {
4573
- try {
4574
- this.#rLog.debug({ msg: "calling onDestroy" });
4575
- const result = this.#config.onDestroy(this.actorContext);
4576
- if (result instanceof Promise) {
4577
- await _chunkRZW2DNNDcjs.deadline.call(void 0,
4578
- result,
4579
- this.#config.options.onDestroyTimeout
4580
- );
4581
- }
4582
- this.#rLog.debug({ msg: "onDestroy completed" });
4583
- } catch (error) {
4584
- if (error instanceof _chunkRZW2DNNDcjs.DeadlineError) {
4585
- this.#rLog.error({ msg: "onDestroy timed out" });
4586
- } else {
4587
- this.#rLog.error({
4588
- msg: "error in onDestroy",
4589
- error: _chunkH4TB4X25cjs.stringifyError.call(void 0, error)
4590
- });
4591
- }
4592
- }
4593
- }
4594
- }
4595
- async #setupDatabase() {
4596
- var _a, _b;
4597
- if ("db" in this.#config && this.#config.db) {
4598
- const client = await this.#config.db.createClient({
4599
- getDatabase: () => this.driver.getDatabase(this.#actorId)
4600
- });
4601
- this.#rLog.info({ msg: "database migration starting" });
4602
- await ((_b = (_a = this.#config.db).onMigrate) == null ? void 0 : _b.call(_a, client));
4603
- this.#rLog.info({ msg: "database migration complete" });
4604
- this.#db = client;
4605
- }
4606
- }
4607
- async #disconnectConnections() {
4608
- const promises = [];
4609
- this.#rLog.debug({
4610
- msg: "disconnecting connections on actor stop",
4611
- totalConns: this.connectionManager.connections.size
4612
- });
4613
- for (const connection of this.connectionManager.connections.values()) {
4614
- this.#rLog.debug({
4615
- msg: "checking connection for disconnect",
4616
- connId: connection.id,
4617
- isHibernatable: connection.isHibernatable
4618
- });
4619
- if (!connection.isHibernatable) {
4620
- this.#rLog.debug({
4621
- msg: "disconnecting non-hibernatable connection on actor stop",
4622
- connId: connection.id
4623
- });
4624
- promises.push(connection.disconnect());
4625
- } else {
4626
- this.#rLog.debug({
4627
- msg: "preserving hibernatable connection on actor stop",
4628
- connId: connection.id
4629
- });
4630
- }
4631
- }
4632
- const res = await Promise.race([
4633
- Promise.all(promises).then(() => false),
4634
- new Promise(
4635
- (res2) => globalThis.setTimeout(() => res2(true), 1500)
4636
- )
4637
- ]);
4638
- if (res) {
4639
- this.#rLog.warn({
4640
- msg: "timed out waiting for connections to close, shutting down anyway"
4641
- });
4642
- }
4643
- }
4644
- async #waitBackgroundPromises(timeoutMs) {
4645
- const pending = this.#backgroundPromises;
4646
- if (pending.length === 0) {
4647
- this.#rLog.debug({ msg: "no background promises" });
4648
- return;
4649
- }
4650
- const timedOut = await Promise.race([
4651
- Promise.allSettled(pending).then(() => false),
4652
- new Promise(
4653
- (resolve) => setTimeout(() => resolve(true), timeoutMs)
4654
- )
4655
- ]);
4656
- if (timedOut) {
4657
- this.#rLog.error({
4658
- msg: "timed out waiting for background tasks",
4659
- count: pending.length,
4660
- timeoutMs
4661
- });
4662
- } else {
4663
- this.#rLog.debug({ msg: "background promises finished" });
4664
- }
4665
- }
4666
- resetSleepTimer() {
4667
- if (this.#config.options.noSleep || !this.#sleepingSupported) return;
4668
- if (this.#stopCalled) return;
4669
- const canSleep = this.#canSleep();
4670
- this.#rLog.debug({
4671
- msg: "resetting sleep timer",
4672
- canSleep: CanSleep[canSleep],
4673
- existingTimeout: !!this.#sleepTimeout,
4674
- timeout: this.#config.options.sleepTimeout
4675
- });
4676
- if (this.#sleepTimeout) {
4677
- clearTimeout(this.#sleepTimeout);
4678
- this.#sleepTimeout = void 0;
4679
- }
4680
- if (this.#sleepCalled) return;
4681
- if (canSleep === 0 /* Yes */) {
4682
- this.#sleepTimeout = setTimeout(() => {
4683
- this.startSleep();
4684
- }, this.#config.options.sleepTimeout);
4685
- }
4686
- }
4687
- #canSleep() {
4688
- if (!this.#ready) return 1 /* NotReady */;
4689
- if (!this.#started) return 1 /* NotReady */;
4690
- if (this.#activeHonoHttpRequests > 0)
4691
- return 4 /* ActiveHonoHttpRequests */;
4692
- for (const _conn of this.connectionManager.connections.values()) {
4693
- return 3 /* ActiveConns */;
4694
- }
4695
- return 0 /* Yes */;
4696
- }
4697
- get #sleepingSupported() {
4698
- return this.driver.startSleep !== void 0;
4699
- }
4700
- get #varsEnabled() {
4701
- return "createVars" in this.#config || "vars" in this.#config;
4702
- }
4703
- #validateVarsEnabled() {
4704
- if (!this.#varsEnabled) {
4705
- throw new (0, _chunk2XQS746Mcjs.VarsNotEnabled)();
4706
- }
4707
- }
4708
- };
4709
-
4710
- // src/actor/definition.ts
4711
- var ActorDefinition = class {
4712
- #config;
4713
- constructor(config) {
4714
- this.#config = config;
4715
- }
4716
- get config() {
4717
- return this.#config;
4718
- }
4719
- instantiate() {
4720
- return new ActorInstance(this.#config);
4721
- }
4722
- };
4723
- function lookupInRegistry(config, name) {
4724
- const definition = config.use[name];
4725
- if (!definition) throw new Error(`no actor in registry for name ${name}`);
4726
- return definition;
4727
- }
4728
-
4729
- // src/client/mod.ts
4730
- function createClient(endpointOrConfig) {
4731
- const configInput = endpointOrConfig === void 0 ? {} : typeof endpointOrConfig === "string" ? { endpoint: endpointOrConfig } : endpointOrConfig;
4732
- const config = ClientConfigSchema.parse(configInput);
4733
- const driver = new RemoteManagerDriver(config);
4734
- if (config.devtools) {
4735
- injectDevtools(config);
4736
- }
4737
- return createClientWithDriver(driver, config);
4738
- }
4739
-
4740
-
4741
-
4742
-
4743
-
4744
-
4745
-
4746
-
4747
-
4748
-
4749
-
4750
-
4751
-
4752
-
4753
-
4754
-
4755
-
4756
-
4757
-
4758
-
4759
-
4760
-
4761
- exports.ActorDefinition = ActorDefinition; exports.lookupInRegistry = lookupInRegistry; exports.ActorClientError = ActorClientError; exports.InternalError = InternalError2; exports.ManagerError = ManagerError; exports.MalformedResponseMessage = MalformedResponseMessage; exports.ActorError = ActorError; exports.ActorConnDisposed = ActorConnDisposed; exports.ActorConnRaw = ActorConnRaw; exports.ActorHandleRaw = ActorHandleRaw; exports.createClientWithDriver = createClientWithDriver; exports.ClientConfigSchemaBase = ClientConfigSchemaBase; exports.ClientConfigSchema = ClientConfigSchema; exports.transformClientConfig = transformClientConfig; exports.convertRegistryConfigToClientConfig = convertRegistryConfigToClientConfig; exports.getEndpoint = getEndpoint; exports.getDatacenters = getDatacenters; exports.updateRunnerConfig = updateRunnerConfig; exports.RemoteManagerDriver = RemoteManagerDriver; exports.createClient = createClient;
4762
- //# sourceMappingURL=chunk-GD7UXGOE.cjs.map