rivetkit 2.0.2 → 2.0.4-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (403) hide show
  1. package/README.md +3 -5
  2. package/dist/browser/client.d.ts +2485 -0
  3. package/dist/browser/client.js +5182 -0
  4. package/dist/browser/client.js.map +1 -0
  5. package/dist/browser/inspector/client.d.ts +130 -0
  6. package/dist/browser/inspector/client.js +2854 -0
  7. package/dist/browser/inspector/client.js.map +1 -0
  8. package/dist/browser/v3-DnYObHH3.d.ts +279 -0
  9. package/dist/inspector.tar.gz +0 -0
  10. package/dist/schemas/actor-inspector/v1.ts +784 -0
  11. package/dist/schemas/actor-inspector/v2.ts +796 -0
  12. package/dist/schemas/actor-inspector/v3.ts +899 -0
  13. package/dist/schemas/actor-persist/v1.ts +225 -0
  14. package/dist/schemas/actor-persist/v2.ts +268 -0
  15. package/dist/schemas/actor-persist/v3.ts +280 -0
  16. package/dist/schemas/actor-persist/v4.ts +406 -0
  17. package/dist/schemas/client-protocol/v1.ts +441 -0
  18. package/dist/schemas/client-protocol/v2.ts +438 -0
  19. package/dist/schemas/client-protocol/v3.ts +554 -0
  20. package/dist/schemas/file-system-driver/v1.ts +108 -0
  21. package/dist/schemas/file-system-driver/v2.ts +142 -0
  22. package/dist/schemas/file-system-driver/v3.ts +167 -0
  23. package/dist/schemas/persist/v1.ts +781 -0
  24. package/dist/schemas/transport/v1.ts +697 -0
  25. package/dist/tsup/actor/errors.cjs +106 -0
  26. package/dist/tsup/actor/errors.cjs.map +1 -0
  27. package/dist/tsup/actor/errors.d.cts +188 -0
  28. package/dist/tsup/actor/errors.d.ts +188 -0
  29. package/dist/tsup/actor/errors.js +106 -0
  30. package/dist/tsup/actor/errors.js.map +1 -0
  31. package/dist/tsup/actor-router-consts-D29T1Z-K.d.cts +24 -0
  32. package/dist/tsup/actor-router-consts-D29T1Z-K.d.ts +24 -0
  33. package/dist/tsup/chunk-325TLXJT.js +1060 -0
  34. package/dist/tsup/chunk-325TLXJT.js.map +1 -0
  35. package/dist/tsup/chunk-424PT5DM.js +23 -0
  36. package/dist/tsup/chunk-424PT5DM.js.map +1 -0
  37. package/dist/tsup/chunk-4JVIG3SS.cjs +6289 -0
  38. package/dist/tsup/chunk-4JVIG3SS.cjs.map +1 -0
  39. package/dist/tsup/chunk-6LJAZ5R4.cjs +96 -0
  40. package/dist/tsup/chunk-6LJAZ5R4.cjs.map +1 -0
  41. package/dist/tsup/chunk-6XU3FMCB.cjs +534 -0
  42. package/dist/tsup/chunk-6XU3FMCB.cjs.map +1 -0
  43. package/dist/tsup/chunk-7HTNH26M.js +509 -0
  44. package/dist/tsup/chunk-7HTNH26M.js.map +1 -0
  45. package/dist/tsup/chunk-AUVH72RE.cjs +5977 -0
  46. package/dist/tsup/chunk-AUVH72RE.cjs.map +1 -0
  47. package/dist/tsup/chunk-D4BYUPNQ.js +645 -0
  48. package/dist/tsup/chunk-D4BYUPNQ.js.map +1 -0
  49. package/dist/tsup/chunk-HDQ2JUQT.cjs +23 -0
  50. package/dist/tsup/chunk-HDQ2JUQT.cjs.map +1 -0
  51. package/dist/tsup/chunk-HHXX2VRM.js +6289 -0
  52. package/dist/tsup/chunk-HHXX2VRM.js.map +1 -0
  53. package/dist/tsup/chunk-JEAEA2PB.js +49 -0
  54. package/dist/tsup/chunk-JEAEA2PB.js.map +1 -0
  55. package/dist/tsup/chunk-JYSEG3VF.cjs +642 -0
  56. package/dist/tsup/chunk-JYSEG3VF.cjs.map +1 -0
  57. package/dist/tsup/chunk-K6DGYILQ.js +2657 -0
  58. package/dist/tsup/chunk-K6DGYILQ.js.map +1 -0
  59. package/dist/tsup/chunk-KJSYAUOM.js +96 -0
  60. package/dist/tsup/chunk-KJSYAUOM.js.map +1 -0
  61. package/dist/tsup/chunk-L47L3ZWJ.cjs +509 -0
  62. package/dist/tsup/chunk-L47L3ZWJ.cjs.map +1 -0
  63. package/dist/tsup/chunk-LXUQ667X.js +2006 -0
  64. package/dist/tsup/chunk-LXUQ667X.js.map +1 -0
  65. package/dist/tsup/chunk-MXNPAB5W.js +5977 -0
  66. package/dist/tsup/chunk-MXNPAB5W.js.map +1 -0
  67. package/dist/tsup/chunk-N4KRDJ56.js +72 -0
  68. package/dist/tsup/chunk-N4KRDJ56.js.map +1 -0
  69. package/dist/tsup/chunk-NIYZDWMW.cjs +2006 -0
  70. package/dist/tsup/chunk-NIYZDWMW.cjs.map +1 -0
  71. package/dist/tsup/chunk-PQZHDKRW.cjs +1060 -0
  72. package/dist/tsup/chunk-PQZHDKRW.cjs.map +1 -0
  73. package/dist/tsup/chunk-PVOE6BU7.cjs +1050 -0
  74. package/dist/tsup/chunk-PVOE6BU7.cjs.map +1 -0
  75. package/dist/tsup/chunk-Q4UD2GA4.cjs +1810 -0
  76. package/dist/tsup/chunk-Q4UD2GA4.cjs.map +1 -0
  77. package/dist/tsup/chunk-QUD664YZ.js +1810 -0
  78. package/dist/tsup/chunk-QUD664YZ.js.map +1 -0
  79. package/dist/tsup/chunk-RTOCTWME.js +1050 -0
  80. package/dist/tsup/chunk-RTOCTWME.js.map +1 -0
  81. package/dist/tsup/chunk-SAZZ4SB2.cjs +2657 -0
  82. package/dist/tsup/chunk-SAZZ4SB2.cjs.map +1 -0
  83. package/dist/tsup/chunk-SR3KQE7Q.cjs +72 -0
  84. package/dist/tsup/chunk-SR3KQE7Q.cjs.map +1 -0
  85. package/dist/tsup/chunk-V2GHLYC6.cjs +49 -0
  86. package/dist/tsup/chunk-V2GHLYC6.cjs.map +1 -0
  87. package/dist/tsup/chunk-V3WG7XTW.cjs +645 -0
  88. package/dist/tsup/chunk-V3WG7XTW.cjs.map +1 -0
  89. package/dist/tsup/chunk-VKVNIQRQ.js +257 -0
  90. package/dist/tsup/chunk-VKVNIQRQ.js.map +1 -0
  91. package/dist/tsup/chunk-WMPW7JYC.js +642 -0
  92. package/dist/tsup/chunk-WMPW7JYC.js.map +1 -0
  93. package/dist/tsup/chunk-Z7HNQ2WF.js +534 -0
  94. package/dist/tsup/chunk-Z7HNQ2WF.js.map +1 -0
  95. package/dist/tsup/chunk-ZFY5J2EP.cjs +257 -0
  96. package/dist/tsup/chunk-ZFY5J2EP.cjs.map +1 -0
  97. package/dist/tsup/client/mod.cjs +33 -0
  98. package/dist/tsup/client/mod.cjs.map +1 -0
  99. package/dist/tsup/client/mod.d.cts +64 -0
  100. package/dist/tsup/client/mod.d.ts +64 -0
  101. package/dist/tsup/client/mod.js +33 -0
  102. package/dist/tsup/client/mod.js.map +1 -0
  103. package/dist/tsup/common/log.cjs +21 -0
  104. package/dist/tsup/common/log.cjs.map +1 -0
  105. package/dist/tsup/common/log.d.cts +34 -0
  106. package/dist/tsup/common/log.d.ts +34 -0
  107. package/dist/tsup/common/log.js +21 -0
  108. package/dist/tsup/common/log.js.map +1 -0
  109. package/dist/tsup/common/websocket.cjs +10 -0
  110. package/dist/tsup/common/websocket.cjs.map +1 -0
  111. package/dist/tsup/common/websocket.d.cts +3 -0
  112. package/dist/tsup/common/websocket.d.ts +3 -0
  113. package/dist/tsup/common/websocket.js +10 -0
  114. package/dist/tsup/common/websocket.js.map +1 -0
  115. package/dist/tsup/config-BiNoIHRs.d.cts +80 -0
  116. package/dist/tsup/config-BiNoIHRs.d.ts +80 -0
  117. package/dist/tsup/config-P3XujgRr.d.ts +2594 -0
  118. package/dist/tsup/config-_gfywqqI.d.cts +2594 -0
  119. package/dist/tsup/context-Bxd8Cx4H.d.cts +75 -0
  120. package/dist/tsup/context-uNA4TRn3.d.ts +75 -0
  121. package/dist/tsup/db/drizzle/mod.cjs +49 -0
  122. package/dist/tsup/db/drizzle/mod.cjs.map +1 -0
  123. package/dist/tsup/db/drizzle/mod.d.cts +17 -0
  124. package/dist/tsup/db/drizzle/mod.d.ts +17 -0
  125. package/dist/tsup/db/drizzle/mod.js +49 -0
  126. package/dist/tsup/db/drizzle/mod.js.map +1 -0
  127. package/dist/tsup/db/mod.cjs +9 -0
  128. package/dist/tsup/db/mod.cjs.map +1 -0
  129. package/dist/tsup/db/mod.d.cts +9 -0
  130. package/dist/tsup/db/mod.d.ts +9 -0
  131. package/dist/tsup/db/mod.js +9 -0
  132. package/dist/tsup/db/mod.js.map +1 -0
  133. package/dist/tsup/driver-BcLvZcKl.d.cts +13 -0
  134. package/dist/tsup/driver-CPGHKXyh.d.ts +13 -0
  135. package/dist/tsup/driver-helpers/mod.cjs +53 -0
  136. package/dist/tsup/driver-helpers/mod.cjs.map +1 -0
  137. package/dist/tsup/driver-helpers/mod.d.cts +47 -0
  138. package/dist/tsup/driver-helpers/mod.d.ts +47 -0
  139. package/dist/tsup/driver-helpers/mod.js +53 -0
  140. package/dist/tsup/driver-helpers/mod.js.map +1 -0
  141. package/dist/tsup/driver-test-suite/mod.cjs +4974 -0
  142. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -0
  143. package/dist/tsup/driver-test-suite/mod.d.cts +73 -0
  144. package/dist/tsup/driver-test-suite/mod.d.ts +73 -0
  145. package/dist/tsup/driver-test-suite/mod.js +4974 -0
  146. package/dist/tsup/driver-test-suite/mod.js.map +1 -0
  147. package/dist/tsup/inspector/mod.cjs +164 -0
  148. package/dist/tsup/inspector/mod.cjs.map +1 -0
  149. package/dist/tsup/inspector/mod.d.cts +130 -0
  150. package/dist/tsup/inspector/mod.d.ts +130 -0
  151. package/dist/tsup/inspector/mod.js +164 -0
  152. package/dist/tsup/inspector/mod.js.map +1 -0
  153. package/dist/tsup/keys-CydblqMh.d.cts +13 -0
  154. package/dist/tsup/keys-CydblqMh.d.ts +13 -0
  155. package/dist/tsup/mod.cjs +82 -0
  156. package/dist/tsup/mod.cjs.map +1 -0
  157. package/dist/tsup/mod.d.cts +126 -0
  158. package/dist/tsup/mod.d.ts +126 -0
  159. package/dist/tsup/mod.js +82 -0
  160. package/dist/tsup/mod.js.map +1 -0
  161. package/dist/tsup/serve-test-suite/mod.cjs +2601 -0
  162. package/dist/tsup/serve-test-suite/mod.cjs.map +1 -0
  163. package/dist/tsup/serve-test-suite/mod.d.cts +9 -0
  164. package/dist/tsup/serve-test-suite/mod.d.ts +9 -0
  165. package/dist/tsup/serve-test-suite/mod.js +2601 -0
  166. package/dist/tsup/serve-test-suite/mod.js.map +1 -0
  167. package/dist/tsup/test/mod.cjs +90 -0
  168. package/dist/tsup/test/mod.cjs.map +1 -0
  169. package/dist/tsup/test/mod.d.cts +26 -0
  170. package/dist/tsup/test/mod.d.ts +26 -0
  171. package/dist/tsup/test/mod.js +90 -0
  172. package/dist/tsup/test/mod.js.map +1 -0
  173. package/dist/tsup/utils-fwx3o3K9.d.cts +18 -0
  174. package/dist/tsup/utils-fwx3o3K9.d.ts +18 -0
  175. package/dist/tsup/utils.cjs +43 -0
  176. package/dist/tsup/utils.cjs.map +1 -0
  177. package/dist/tsup/utils.d.cts +148 -0
  178. package/dist/tsup/utils.d.ts +148 -0
  179. package/dist/tsup/utils.js +43 -0
  180. package/dist/tsup/utils.js.map +1 -0
  181. package/dist/tsup/v3-DnYObHH3.d.cts +279 -0
  182. package/dist/tsup/v3-DnYObHH3.d.ts +279 -0
  183. package/dist/tsup/workflow/mod.cjs +16 -0
  184. package/dist/tsup/workflow/mod.cjs.map +1 -0
  185. package/dist/tsup/workflow/mod.d.cts +25 -0
  186. package/dist/tsup/workflow/mod.d.ts +25 -0
  187. package/dist/tsup/workflow/mod.js +16 -0
  188. package/dist/tsup/workflow/mod.js.map +1 -0
  189. package/package.json +293 -5
  190. package/src/actor/config.ts +1221 -0
  191. package/src/actor/conn/driver.ts +61 -0
  192. package/src/actor/conn/drivers/http.ts +17 -0
  193. package/src/actor/conn/drivers/raw-request.ts +24 -0
  194. package/src/actor/conn/drivers/raw-websocket.ts +65 -0
  195. package/src/actor/conn/drivers/websocket.ts +144 -0
  196. package/src/actor/conn/mod.ts +288 -0
  197. package/src/actor/conn/persisted.ts +81 -0
  198. package/src/actor/conn/state-manager.ts +196 -0
  199. package/src/actor/contexts/action.ts +47 -0
  200. package/src/actor/contexts/base/actor.ts +347 -0
  201. package/src/actor/contexts/base/conn-init.ts +68 -0
  202. package/src/actor/contexts/base/conn.ts +73 -0
  203. package/src/actor/contexts/before-action-response.ts +42 -0
  204. package/src/actor/contexts/before-connect.ts +31 -0
  205. package/src/actor/contexts/connect.ts +42 -0
  206. package/src/actor/contexts/create-conn-state.ts +32 -0
  207. package/src/actor/contexts/create-vars.ts +39 -0
  208. package/src/actor/contexts/create.ts +39 -0
  209. package/src/actor/contexts/destroy.ts +42 -0
  210. package/src/actor/contexts/disconnect.ts +43 -0
  211. package/src/actor/contexts/index.ts +33 -0
  212. package/src/actor/contexts/request.ts +80 -0
  213. package/src/actor/contexts/run.ts +47 -0
  214. package/src/actor/contexts/sleep.ts +42 -0
  215. package/src/actor/contexts/state-change.ts +42 -0
  216. package/src/actor/contexts/wake.ts +42 -0
  217. package/src/actor/contexts/websocket.ts +80 -0
  218. package/src/actor/database.ts +13 -0
  219. package/src/actor/definition.ts +64 -0
  220. package/src/actor/driver.ts +114 -0
  221. package/src/actor/errors.ts +556 -0
  222. package/src/actor/instance/connection-manager.ts +574 -0
  223. package/src/actor/instance/event-manager.ts +314 -0
  224. package/src/actor/instance/keys.ts +146 -0
  225. package/src/actor/instance/kv.ts +241 -0
  226. package/src/actor/instance/mod.ts +1658 -0
  227. package/src/actor/instance/persisted.ts +67 -0
  228. package/src/actor/instance/queue-manager.ts +603 -0
  229. package/src/actor/instance/queue.ts +345 -0
  230. package/src/actor/instance/schedule-manager.ts +392 -0
  231. package/src/actor/instance/state-manager.ts +542 -0
  232. package/src/actor/instance/traces-driver.ts +128 -0
  233. package/src/actor/keys.test.ts +275 -0
  234. package/src/actor/keys.ts +89 -0
  235. package/src/actor/log.ts +6 -0
  236. package/src/actor/mod.ts +110 -0
  237. package/src/actor/protocol/old.ts +416 -0
  238. package/src/actor/protocol/serde.ts +222 -0
  239. package/src/actor/router-endpoints.ts +400 -0
  240. package/src/actor/router-websocket-endpoints.test.ts +54 -0
  241. package/src/actor/router-websocket-endpoints.ts +405 -0
  242. package/src/actor/router.ts +380 -0
  243. package/src/actor/schedule.ts +17 -0
  244. package/src/actor/schema.ts +291 -0
  245. package/src/actor/utils.test.ts +48 -0
  246. package/src/actor/utils.ts +158 -0
  247. package/src/client/actor-common.ts +32 -0
  248. package/src/client/actor-conn.ts +1262 -0
  249. package/src/client/actor-handle.ts +344 -0
  250. package/src/client/actor-query.ts +112 -0
  251. package/src/client/client.ts +558 -0
  252. package/src/client/config.ts +151 -0
  253. package/src/client/errors.ts +76 -0
  254. package/src/client/log.ts +5 -0
  255. package/src/client/mod.browser.ts +2 -0
  256. package/src/client/mod.ts +70 -0
  257. package/src/client/queue.ts +146 -0
  258. package/src/client/raw-utils.ts +149 -0
  259. package/src/client/test.ts +44 -0
  260. package/src/client/utils.ts +252 -0
  261. package/src/common/actor-router-consts.ts +59 -0
  262. package/src/common/cors.ts +57 -0
  263. package/src/common/eventsource-interface.ts +47 -0
  264. package/src/common/eventsource.ts +44 -0
  265. package/src/common/inline-websocket-adapter.ts +154 -0
  266. package/src/common/log-levels.ts +27 -0
  267. package/src/common/log.ts +229 -0
  268. package/src/common/logfmt.ts +221 -0
  269. package/src/common/network.ts +2 -0
  270. package/src/common/router.ts +174 -0
  271. package/src/common/utils.ts +339 -0
  272. package/src/common/websocket-interface.ts +7 -0
  273. package/src/common/websocket.ts +43 -0
  274. package/src/db/config.ts +100 -0
  275. package/src/db/drizzle/mod.ts +226 -0
  276. package/src/db/drizzle/sqlite-core.ts +22 -0
  277. package/src/db/mod.ts +125 -0
  278. package/src/db/shared.ts +92 -0
  279. package/src/db/sqlite-vfs.ts +12 -0
  280. package/src/devtools-loader/index.ts +33 -0
  281. package/src/devtools-loader/log.ts +5 -0
  282. package/src/driver-helpers/mod.ts +33 -0
  283. package/src/driver-helpers/utils.ts +54 -0
  284. package/src/driver-test-suite/log.ts +5 -0
  285. package/src/driver-test-suite/mod.ts +293 -0
  286. package/src/driver-test-suite/test-inline-client-driver.ts +307 -0
  287. package/src/driver-test-suite/tests/access-control.ts +218 -0
  288. package/src/driver-test-suite/tests/action-features.ts +203 -0
  289. package/src/driver-test-suite/tests/actor-conn-hibernation.ts +152 -0
  290. package/src/driver-test-suite/tests/actor-conn-state.ts +300 -0
  291. package/src/driver-test-suite/tests/actor-conn.ts +596 -0
  292. package/src/driver-test-suite/tests/actor-db-raw.ts +73 -0
  293. package/src/driver-test-suite/tests/actor-db.ts +477 -0
  294. package/src/driver-test-suite/tests/actor-destroy.ts +294 -0
  295. package/src/driver-test-suite/tests/actor-driver.ts +18 -0
  296. package/src/driver-test-suite/tests/actor-error-handling.ts +150 -0
  297. package/src/driver-test-suite/tests/actor-handle.ts +312 -0
  298. package/src/driver-test-suite/tests/actor-inline-client.ts +163 -0
  299. package/src/driver-test-suite/tests/actor-inspector.ts +264 -0
  300. package/src/driver-test-suite/tests/actor-kv.ts +65 -0
  301. package/src/driver-test-suite/tests/actor-metadata.ts +116 -0
  302. package/src/driver-test-suite/tests/actor-onstatechange.ts +95 -0
  303. package/src/driver-test-suite/tests/actor-queue.ts +325 -0
  304. package/src/driver-test-suite/tests/actor-run.ts +181 -0
  305. package/src/driver-test-suite/tests/actor-schedule.ts +97 -0
  306. package/src/driver-test-suite/tests/actor-sleep.ts +415 -0
  307. package/src/driver-test-suite/tests/actor-state.ts +54 -0
  308. package/src/driver-test-suite/tests/actor-stateless.ts +70 -0
  309. package/src/driver-test-suite/tests/actor-vars.ts +97 -0
  310. package/src/driver-test-suite/tests/actor-workflow.ts +118 -0
  311. package/src/driver-test-suite/tests/manager-driver.ts +388 -0
  312. package/src/driver-test-suite/tests/raw-http-direct-registry.ts +227 -0
  313. package/src/driver-test-suite/tests/raw-http-request-properties.ts +454 -0
  314. package/src/driver-test-suite/tests/raw-http.ts +359 -0
  315. package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +393 -0
  316. package/src/driver-test-suite/tests/raw-websocket.ts +513 -0
  317. package/src/driver-test-suite/tests/request-access.ts +240 -0
  318. package/src/driver-test-suite/utils.ts +80 -0
  319. package/src/drivers/default.ts +38 -0
  320. package/src/drivers/engine/actor-driver.ts +1027 -0
  321. package/src/drivers/engine/config.ts +43 -0
  322. package/src/drivers/engine/log.ts +5 -0
  323. package/src/drivers/engine/mod.ts +36 -0
  324. package/src/drivers/file-system/actor.ts +102 -0
  325. package/src/drivers/file-system/global-state.ts +1445 -0
  326. package/src/drivers/file-system/kv-limits.ts +70 -0
  327. package/src/drivers/file-system/log.ts +5 -0
  328. package/src/drivers/file-system/manager.ts +300 -0
  329. package/src/drivers/file-system/mod.ts +78 -0
  330. package/src/drivers/file-system/sqlite-runtime.ts +210 -0
  331. package/src/drivers/file-system/utils.ts +125 -0
  332. package/src/engine-process/constants.ts +2 -0
  333. package/src/engine-process/log.ts +5 -0
  334. package/src/engine-process/mod.ts +464 -0
  335. package/src/globals.d.ts +35 -0
  336. package/src/inspector/actor-inspector.ts +352 -0
  337. package/src/inspector/config.ts +49 -0
  338. package/src/inspector/handler.ts +273 -0
  339. package/src/inspector/log.ts +5 -0
  340. package/src/inspector/mod.browser.ts +8 -0
  341. package/src/inspector/mod.ts +4 -0
  342. package/src/inspector/serve-ui.ts +40 -0
  343. package/src/inspector/transport.ts +18 -0
  344. package/src/inspector/utils.ts +32 -0
  345. package/src/manager/driver.ts +106 -0
  346. package/src/manager/gateway.ts +668 -0
  347. package/src/manager/log.ts +5 -0
  348. package/src/manager/mod.ts +2 -0
  349. package/src/manager/protocol/mod.ts +22 -0
  350. package/src/manager/protocol/query.ts +85 -0
  351. package/src/manager/router-schema.ts +22 -0
  352. package/src/manager/router.ts +660 -0
  353. package/src/manager-api/actors.ts +83 -0
  354. package/src/manager-api/common.ts +4 -0
  355. package/src/mod.ts +24 -0
  356. package/src/registry/config/driver.ts +21 -0
  357. package/src/registry/config/index.ts +510 -0
  358. package/src/registry/config/legacy-runner.ts +157 -0
  359. package/src/registry/config/runner.ts +21 -0
  360. package/src/registry/config/serverless.ts +94 -0
  361. package/src/registry/index.ts +194 -0
  362. package/src/registry/log.ts +5 -0
  363. package/src/remote-manager-driver/actor-http-client.ts +84 -0
  364. package/src/remote-manager-driver/actor-websocket-client.ts +81 -0
  365. package/src/remote-manager-driver/api-endpoints.ts +159 -0
  366. package/src/remote-manager-driver/api-utils.ts +69 -0
  367. package/src/remote-manager-driver/log.ts +5 -0
  368. package/src/remote-manager-driver/metadata.ts +64 -0
  369. package/src/remote-manager-driver/mod.ts +414 -0
  370. package/src/remote-manager-driver/ws-proxy.ts +189 -0
  371. package/src/schemas/actor-inspector/mod.ts +1 -0
  372. package/src/schemas/actor-inspector/versioned.ts +233 -0
  373. package/src/schemas/actor-persist/mod.ts +1 -0
  374. package/src/schemas/actor-persist/versioned.ts +217 -0
  375. package/src/schemas/client-protocol/mod.ts +1 -0
  376. package/src/schemas/client-protocol/versioned.ts +330 -0
  377. package/src/schemas/client-protocol-zod/mod.ts +118 -0
  378. package/src/schemas/file-system-driver/mod.ts +1 -0
  379. package/src/schemas/file-system-driver/versioned.ts +135 -0
  380. package/src/schemas/persist/mod.ts +1 -0
  381. package/src/schemas/transport/mod.ts +1 -0
  382. package/src/serde.ts +138 -0
  383. package/src/serve-test-suite/mod.ts +148 -0
  384. package/src/serverless/configure.ts +82 -0
  385. package/src/serverless/log.ts +5 -0
  386. package/src/serverless/router.test.ts +299 -0
  387. package/src/serverless/router.ts +215 -0
  388. package/src/test/log.ts +5 -0
  389. package/src/test/mod.ts +99 -0
  390. package/src/utils/crypto.ts +24 -0
  391. package/src/utils/endpoint-parser.test.ts +202 -0
  392. package/src/utils/endpoint-parser.ts +124 -0
  393. package/src/utils/env-vars.ts +78 -0
  394. package/src/utils/node.ts +178 -0
  395. package/src/utils/router.ts +83 -0
  396. package/src/utils/serve.ts +212 -0
  397. package/src/utils.test.ts +34 -0
  398. package/src/utils.ts +437 -0
  399. package/src/workflow/constants.ts +2 -0
  400. package/src/workflow/context.ts +597 -0
  401. package/src/workflow/driver.ts +194 -0
  402. package/src/workflow/inspector.ts +268 -0
  403. package/src/workflow/mod.ts +128 -0
@@ -0,0 +1,2657 @@
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;
2
+
3
+
4
+ var _chunkV2GHLYC6cjs = require('./chunk-V2GHLYC6.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
+ var _chunk4JVIG3SScjs = require('./chunk-4JVIG3SS.cjs');
40
+
41
+
42
+ var _chunkPVOE6BU7cjs = require('./chunk-PVOE6BU7.cjs');
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+ var _chunkPQZHDKRWcjs = require('./chunk-PQZHDKRW.cjs');
62
+
63
+
64
+
65
+ var _chunkL47L3ZWJcjs = require('./chunk-L47L3ZWJ.cjs');
66
+
67
+ // src/devtools-loader/log.ts
68
+ function logger2() {
69
+ return _chunkPQZHDKRWcjs.getLogger.call(void 0, "devtools");
70
+ }
71
+
72
+ // src/devtools-loader/index.ts
73
+ var DEFAULT_DEVTOOLS_URL = (version = _chunkPQZHDKRWcjs.VERSION) => `https://releases.rivet.dev/rivet/latest/devtools/mod.js?v=${version}`;
74
+ var scriptId = "rivetkit-devtools-script";
75
+ function injectDevtools(config) {
76
+ if (!window) {
77
+ logger2().warn("devtools not available outside browser environment");
78
+ return;
79
+ }
80
+ if (!document.getElementById(scriptId)) {
81
+ const script = document.createElement("script");
82
+ script.id = scriptId;
83
+ script.src = DEFAULT_DEVTOOLS_URL();
84
+ script.async = true;
85
+ document.head.appendChild(script);
86
+ }
87
+ window.__rivetkit = window.__rivetkit || [];
88
+ window.__rivetkit.push(config);
89
+ }
90
+
91
+ // src/remote-manager-driver/mod.ts
92
+ var _cborx = require('cbor-x'); var cbor2 = _interopRequireWildcard(_cborx); var cbor = _interopRequireWildcard(_cborx); var cbor4 = _interopRequireWildcard(_cborx); var cbor3 = _interopRequireWildcard(_cborx); var cbor5 = _interopRequireWildcard(_cborx);
93
+ var _invariant = require('invariant'); var _invariant2 = _interopRequireDefault(_invariant);
94
+
95
+ // src/remote-manager-driver/api-utils.ts
96
+ var _v4 = require('zod/v4'); var _v42 = _interopRequireDefault(_v4);
97
+
98
+ // src/client/utils.ts
99
+
100
+
101
+
102
+ // src/client/errors.ts
103
+ var ActorClientError = class extends Error {
104
+ };
105
+ var InternalError = class extends ActorClientError {
106
+ };
107
+ var ManagerError = class extends ActorClientError {
108
+ constructor(error, opts) {
109
+ super(`Manager error: ${error}`, opts);
110
+ }
111
+ };
112
+ var MalformedResponseMessage = class extends ActorClientError {
113
+ constructor(cause) {
114
+ super(`Malformed response message: ${cause}`, { cause });
115
+ }
116
+ };
117
+ var ActorError = (_class = class extends ActorClientError {
118
+ constructor(group, code, message, metadata) {
119
+ super(message);_class.prototype.__init.call(this);;
120
+ this.group = group;
121
+ this.code = code;
122
+ this.metadata = metadata;
123
+ }
124
+ __init() {this.__type = "ActorError"}
125
+ }, _class);
126
+ var HttpRequestError = class extends ActorClientError {
127
+ constructor(message, opts) {
128
+ super(`HTTP request error: ${message}`, { cause: opts == null ? void 0 : opts.cause });
129
+ }
130
+ };
131
+ var ActorConnDisposed = class extends ActorClientError {
132
+ constructor() {
133
+ super("Attempting to interact with a disposed actor connection.");
134
+ }
135
+ };
136
+ function isSchedulingError(group, code) {
137
+ return group === "guard" && (code === "actor_ready_timeout" || code === "actor_runner_failed");
138
+ }
139
+ var ActorSchedulingError = class extends ActorError {
140
+
141
+
142
+ constructor(group, code, actorId, details) {
143
+ super(
144
+ group,
145
+ code,
146
+ `Actor failed to start (${actorId}): ${JSON.stringify(details)}`,
147
+ { actorId, details }
148
+ );
149
+ this.name = "ActorSchedulingError";
150
+ this.actorId = actorId;
151
+ this.details = details;
152
+ }
153
+ };
154
+
155
+ // src/client/utils.ts
156
+ function parseWebSocketCloseReason(reason) {
157
+ const [mainPart, rayId] = reason.split("#");
158
+ const [group, code] = mainPart.split(".");
159
+ if (!group || !code) {
160
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).warn({ msg: "failed to parse close reason", reason });
161
+ return void 0;
162
+ }
163
+ return {
164
+ group,
165
+ code,
166
+ rayId
167
+ };
168
+ }
169
+ function messageLength(message) {
170
+ if (message instanceof Blob) {
171
+ return message.size;
172
+ }
173
+ if (message instanceof ArrayBuffer) {
174
+ return message.byteLength;
175
+ }
176
+ if (message instanceof Uint8Array) {
177
+ return message.byteLength;
178
+ }
179
+ if (typeof message === "string") {
180
+ return message.length;
181
+ }
182
+ _chunkPQZHDKRWcjs.assertUnreachable.call(void 0, message);
183
+ }
184
+ async function sendHttpRequest(opts) {
185
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
186
+ msg: "sending http request",
187
+ url: opts.url,
188
+ encoding: opts.encoding
189
+ });
190
+ let contentType;
191
+ let bodyData;
192
+ if (opts.method === "POST" || opts.method === "PUT") {
193
+ _invariant2.default.call(void 0, opts.body !== void 0, "missing body");
194
+ contentType = _chunk4JVIG3SScjs.contentTypeForEncoding.call(void 0, opts.encoding);
195
+ bodyData = _chunk4JVIG3SScjs.serializeWithEncoding.call(void 0,
196
+ opts.encoding,
197
+ opts.body,
198
+ opts.requestVersionedDataHandler,
199
+ opts.requestVersion,
200
+ opts.requestZodSchema,
201
+ opts.requestToJson,
202
+ opts.requestToBare
203
+ );
204
+ }
205
+ let response;
206
+ try {
207
+ response = await (_nullishCoalesce(opts.customFetch, () => ( fetch)))(
208
+ new globalThis.Request(opts.url, {
209
+ method: opts.method,
210
+ headers: {
211
+ ...opts.headers,
212
+ ...contentType ? {
213
+ "Content-Type": contentType
214
+ } : {},
215
+ "User-Agent": _chunkPQZHDKRWcjs.httpUserAgent.call(void 0, )
216
+ },
217
+ body: bodyData,
218
+ credentials: "include",
219
+ signal: opts.signal
220
+ })
221
+ );
222
+ } catch (error) {
223
+ throw new HttpRequestError(`Request failed: ${error}`, {
224
+ cause: error
225
+ });
226
+ }
227
+ if (!response.ok) {
228
+ const bufferResponse = await response.arrayBuffer();
229
+ const contentType2 = response.headers.get("content-type");
230
+ const rayId = response.headers.get("x-rivet-ray-id");
231
+ const encoding = (contentType2 == null ? void 0 : contentType2.includes("application/json")) ? "json" : opts.encoding;
232
+ try {
233
+ const responseData = _chunk4JVIG3SScjs.deserializeWithEncoding.call(void 0,
234
+ encoding,
235
+ new Uint8Array(bufferResponse),
236
+ _chunk4JVIG3SScjs.HTTP_RESPONSE_ERROR_VERSIONED,
237
+ _chunk4JVIG3SScjs.HttpResponseErrorSchema,
238
+ // JSON: metadata is already unknown
239
+ (json) => json,
240
+ // BARE: decode ArrayBuffer metadata to unknown
241
+ (bare) => ({
242
+ group: bare.group,
243
+ code: bare.code,
244
+ message: bare.message,
245
+ metadata: bare.metadata ? cbor.decode(new Uint8Array(bare.metadata)) : void 0
246
+ })
247
+ );
248
+ throw new ActorError(
249
+ responseData.group,
250
+ responseData.code,
251
+ responseData.message,
252
+ responseData.metadata
253
+ );
254
+ } catch (error) {
255
+ if (error instanceof ActorError) {
256
+ throw error;
257
+ }
258
+ const textResponse = new TextDecoder("utf-8", {
259
+ fatal: false
260
+ }).decode(bufferResponse);
261
+ if (rayId) {
262
+ throw new HttpRequestError(
263
+ `${response.statusText} (${response.status}) (Ray ID: ${rayId}):
264
+ ${textResponse}`
265
+ );
266
+ } else {
267
+ throw new HttpRequestError(
268
+ `${response.statusText} (${response.status}):
269
+ ${textResponse}`
270
+ );
271
+ }
272
+ }
273
+ }
274
+ if (opts.skipParseResponse) {
275
+ return void 0;
276
+ }
277
+ try {
278
+ const buffer = new Uint8Array(await response.arrayBuffer());
279
+ return _chunk4JVIG3SScjs.deserializeWithEncoding.call(void 0,
280
+ opts.encoding,
281
+ buffer,
282
+ opts.responseVersionedDataHandler,
283
+ opts.responseZodSchema,
284
+ opts.responseFromJson,
285
+ opts.responseFromBare
286
+ );
287
+ } catch (error) {
288
+ throw new HttpRequestError(`Failed to parse response: ${error}`, {
289
+ cause: error
290
+ });
291
+ }
292
+ }
293
+
294
+ // src/remote-manager-driver/log.ts
295
+ function logger3() {
296
+ return _chunkPQZHDKRWcjs.getLogger.call(void 0, "remote-manager-driver");
297
+ }
298
+
299
+ // src/remote-manager-driver/api-utils.ts
300
+ var EngineApiError = class extends Error {
301
+ constructor(group, code, message) {
302
+ super(message || `Engine API error: ${group}/${code}`);
303
+ this.group = group;
304
+ this.code = code;
305
+ this.name = "EngineApiError";
306
+ }
307
+ };
308
+ function getEndpoint(config) {
309
+ return _nullishCoalesce(config.endpoint, () => ( "http://127.0.0.1:6420"));
310
+ }
311
+ async function apiCall(config, method, path, body) {
312
+ const endpoint = getEndpoint(config);
313
+ const url = _chunkPQZHDKRWcjs.combineUrlPath.call(void 0, endpoint, path, {
314
+ namespace: config.namespace
315
+ });
316
+ logger3().debug({ msg: "making api call", method, url });
317
+ const headers = {
318
+ ...config.headers
319
+ };
320
+ if (config.token) {
321
+ headers.Authorization = `Bearer ${config.token}`;
322
+ }
323
+ return await sendHttpRequest({
324
+ method,
325
+ url,
326
+ headers,
327
+ body,
328
+ encoding: "json",
329
+ skipParseResponse: false,
330
+ requestVersionedDataHandler: void 0,
331
+ requestVersion: void 0,
332
+ responseVersionedDataHandler: void 0,
333
+ responseVersion: void 0,
334
+ requestZodSchema: _v4.z.any(),
335
+ responseZodSchema: _v4.z.any(),
336
+ // Identity conversions (passthrough for generic API calls)
337
+ requestToJson: (value) => value,
338
+ requestToBare: (value) => value,
339
+ responseFromJson: (value) => value,
340
+ responseFromBare: (value) => value
341
+ });
342
+ }
343
+
344
+ // src/remote-manager-driver/actor-websocket-client.ts
345
+ function buildActorGatewayUrl(endpoint, actorId, token, path = "") {
346
+ const tokenSegment = token !== void 0 ? `@${encodeURIComponent(token)}` : "";
347
+ const gatewayPath = `/gateway/${encodeURIComponent(actorId)}${tokenSegment}${path}`;
348
+ return _chunkPQZHDKRWcjs.combineUrlPath.call(void 0, endpoint, gatewayPath);
349
+ }
350
+ async function openWebSocketToActor(runConfig, path, actorId, encoding, params) {
351
+ const WebSocket2 = await _chunkV2GHLYC6cjs.importWebSocket.call(void 0, );
352
+ const endpoint = getEndpoint(runConfig);
353
+ const guardUrl = buildActorGatewayUrl(
354
+ endpoint,
355
+ actorId,
356
+ runConfig.token,
357
+ path
358
+ );
359
+ logger3().debug({
360
+ msg: "opening websocket to actor via guard",
361
+ actorId,
362
+ path,
363
+ guardUrl
364
+ });
365
+ const ws = new WebSocket2(
366
+ guardUrl,
367
+ buildWebSocketProtocols(runConfig, encoding, params)
368
+ );
369
+ ws.binaryType = "arraybuffer";
370
+ logger3().debug({ msg: "websocket connection opened", actorId });
371
+ return ws;
372
+ }
373
+ function buildWebSocketProtocols(runConfig, encoding, params) {
374
+ const protocols = [];
375
+ protocols.push(_chunk4JVIG3SScjs.WS_PROTOCOL_STANDARD);
376
+ protocols.push(`${_chunk4JVIG3SScjs.WS_PROTOCOL_ENCODING}${encoding}`);
377
+ if (params) {
378
+ protocols.push(
379
+ `${_chunk4JVIG3SScjs.WS_PROTOCOL_CONN_PARAMS}${encodeURIComponent(JSON.stringify(params))}`
380
+ );
381
+ }
382
+ return protocols;
383
+ }
384
+
385
+ // src/remote-manager-driver/actor-http-client.ts
386
+ async function sendHttpRequestToActor(runConfig, actorId, actorRequest) {
387
+ const url = new URL(actorRequest.url);
388
+ const endpoint = getEndpoint(runConfig);
389
+ const guardUrl = buildActorGatewayUrl(
390
+ endpoint,
391
+ actorId,
392
+ runConfig.token,
393
+ `${url.pathname}${url.search}`
394
+ );
395
+ let bodyToSend = null;
396
+ const guardHeaders = buildGuardHeadersForHttp(
397
+ runConfig,
398
+ actorRequest,
399
+ actorId
400
+ );
401
+ if (actorRequest.method !== "GET" && actorRequest.method !== "HEAD") {
402
+ if (actorRequest.bodyUsed) {
403
+ throw new Error("Request body has already been consumed");
404
+ }
405
+ const reqBody = await actorRequest.arrayBuffer();
406
+ if (reqBody.byteLength !== 0) {
407
+ bodyToSend = reqBody;
408
+ guardHeaders.delete("transfer-encoding");
409
+ guardHeaders.set("content-length", String(bodyToSend.byteLength));
410
+ }
411
+ }
412
+ const guardRequest = new Request(guardUrl, {
413
+ method: actorRequest.method,
414
+ headers: guardHeaders,
415
+ body: bodyToSend,
416
+ signal: actorRequest.signal
417
+ });
418
+ return mutableResponse(await fetch(guardRequest));
419
+ }
420
+ function mutableResponse(fetchRes) {
421
+ return new Response(fetchRes.body, fetchRes);
422
+ }
423
+ function buildGuardHeadersForHttp(runConfig, actorRequest, actorId) {
424
+ const headers = new Headers();
425
+ actorRequest.headers.forEach((value, key) => {
426
+ headers.set(key, value);
427
+ });
428
+ for (const [key, value] of Object.entries(runConfig.headers)) {
429
+ headers.set(key, value);
430
+ }
431
+ if (runConfig.token) {
432
+ headers.set(_chunk4JVIG3SScjs.HEADER_RIVET_TOKEN, runConfig.token);
433
+ }
434
+ return headers;
435
+ }
436
+
437
+ // src/remote-manager-driver/api-endpoints.ts
438
+ async function getActor(config, _, actorId) {
439
+ return apiCall(
440
+ config,
441
+ "GET",
442
+ `/actors?actor_ids=${encodeURIComponent(actorId)}`
443
+ );
444
+ }
445
+ async function getActorByKey(config, name, key) {
446
+ const serializedKey = _chunk4JVIG3SScjs.serializeActorKey.call(void 0, key);
447
+ return apiCall(
448
+ config,
449
+ "GET",
450
+ `/actors?name=${encodeURIComponent(name)}&key=${encodeURIComponent(serializedKey)}`
451
+ );
452
+ }
453
+ async function listActorsByName(config, name) {
454
+ return apiCall(
455
+ config,
456
+ "GET",
457
+ `/actors?name=${encodeURIComponent(name)}`
458
+ );
459
+ }
460
+ async function getOrCreateActor(config, request) {
461
+ return apiCall(
462
+ config,
463
+ "PUT",
464
+ `/actors`,
465
+ request
466
+ );
467
+ }
468
+ async function createActor(config, request) {
469
+ return apiCall(
470
+ config,
471
+ "POST",
472
+ `/actors`,
473
+ request
474
+ );
475
+ }
476
+ async function destroyActor(config, actorId) {
477
+ return apiCall(
478
+ config,
479
+ "DELETE",
480
+ `/actors/${encodeURIComponent(actorId)}`
481
+ );
482
+ }
483
+ async function getMetadata(config) {
484
+ return apiCall(config, "GET", `/metadata`);
485
+ }
486
+ async function getDatacenters(config) {
487
+ return apiCall(config, "GET", `/datacenters`);
488
+ }
489
+ async function updateRunnerConfig(config, runnerName, request) {
490
+ return apiCall(
491
+ config,
492
+ "PUT",
493
+ `/runner-configs/${runnerName}`,
494
+ request
495
+ );
496
+ }
497
+ async function kvGet(config, actorId, key) {
498
+ return apiCall(
499
+ config,
500
+ "GET",
501
+ `/actors/${encodeURIComponent(actorId)}/kv/keys/${encodeURIComponent(key)}`
502
+ );
503
+ }
504
+
505
+ // src/remote-manager-driver/metadata.ts
506
+ var _pretry = require('p-retry'); var _pretry2 = _interopRequireDefault(_pretry);
507
+ var metadataLookupCache = /* @__PURE__ */ new Map();
508
+ async function lookupMetadataCached(config) {
509
+ const endpoint = getEndpoint(config);
510
+ const existingPromise = metadataLookupCache.get(endpoint);
511
+ if (existingPromise) {
512
+ return existingPromise;
513
+ }
514
+ const metadataLookupPromise = _pretry2.default.call(void 0,
515
+ async () => {
516
+ logger3().debug({
517
+ msg: "fetching metadata",
518
+ endpoint
519
+ });
520
+ const metadataData = await getMetadata(config);
521
+ logger3().debug({
522
+ msg: "received metadata",
523
+ endpoint,
524
+ clientEndpoint: metadataData.clientEndpoint
525
+ });
526
+ return metadataData;
527
+ },
528
+ {
529
+ forever: true,
530
+ minTimeout: 500,
531
+ maxTimeout: 15e3,
532
+ onFailedAttempt: (error) => {
533
+ if (error.attemptNumber > 1) {
534
+ logger3().warn({
535
+ msg: "failed to fetch metadata, retrying",
536
+ endpoint,
537
+ attempt: error.attemptNumber,
538
+ error: _chunkPQZHDKRWcjs.stringifyError.call(void 0, error)
539
+ });
540
+ }
541
+ }
542
+ }
543
+ );
544
+ metadataLookupCache.set(endpoint, metadataLookupPromise);
545
+ return metadataLookupPromise;
546
+ }
547
+
548
+ // src/remote-manager-driver/ws-proxy.ts
549
+ async function createWebSocketProxy(c, targetUrl, protocols) {
550
+ const WebSocket2 = await _chunkV2GHLYC6cjs.importWebSocket.call(void 0, );
551
+ const state = {};
552
+ return {
553
+ onOpen: async (event, clientWs) => {
554
+ logger3().debug({ msg: "client websocket connected", targetUrl });
555
+ if (clientWs.readyState !== 1) {
556
+ logger3().warn({
557
+ msg: "client websocket not open on connection",
558
+ targetUrl,
559
+ readyState: clientWs.readyState
560
+ });
561
+ return;
562
+ }
563
+ const targetWs = new WebSocket2(targetUrl, protocols);
564
+ state.targetWs = targetWs;
565
+ state.connectPromise = new Promise((resolve, reject) => {
566
+ targetWs.addEventListener("open", () => {
567
+ logger3().debug({
568
+ msg: "target websocket connected",
569
+ targetUrl
570
+ });
571
+ if (clientWs.readyState !== 1) {
572
+ logger3().warn({
573
+ msg: "client websocket closed before target connected",
574
+ targetUrl,
575
+ clientReadyState: clientWs.readyState
576
+ });
577
+ targetWs.close(1001, "Client disconnected");
578
+ reject(new Error("Client disconnected"));
579
+ return;
580
+ }
581
+ resolve();
582
+ });
583
+ targetWs.addEventListener("error", (error) => {
584
+ logger3().warn({
585
+ msg: "target websocket error during connection",
586
+ targetUrl
587
+ });
588
+ reject(error);
589
+ });
590
+ });
591
+ state.targetWs.addEventListener("message", (event2) => {
592
+ if (typeof event2.data === "string" || event2.data instanceof ArrayBuffer) {
593
+ clientWs.send(event2.data);
594
+ } else if (event2.data instanceof Blob) {
595
+ event2.data.arrayBuffer().then((buffer) => {
596
+ clientWs.send(buffer);
597
+ });
598
+ }
599
+ });
600
+ state.targetWs.addEventListener("close", (event2) => {
601
+ logger3().debug({
602
+ msg: "target websocket closed",
603
+ targetUrl,
604
+ code: event2.code,
605
+ reason: event2.reason
606
+ });
607
+ closeWebSocketIfOpen(clientWs, event2.code, event2.reason);
608
+ });
609
+ state.targetWs.addEventListener("error", (error) => {
610
+ logger3().error({
611
+ msg: "target websocket error",
612
+ targetUrl,
613
+ error: _chunkPQZHDKRWcjs.stringifyError.call(void 0, error)
614
+ });
615
+ closeWebSocketIfOpen(clientWs, 1011, "Target WebSocket error");
616
+ });
617
+ },
618
+ onMessage: async (event, clientWs) => {
619
+ if (!state.targetWs || !state.connectPromise) {
620
+ logger3().error({
621
+ msg: "websocket state not initialized",
622
+ targetUrl
623
+ });
624
+ return;
625
+ }
626
+ try {
627
+ await state.connectPromise;
628
+ if (state.targetWs.readyState === WebSocket2.OPEN) {
629
+ state.targetWs.send(event.data);
630
+ } else {
631
+ logger3().warn({
632
+ msg: "target websocket not open",
633
+ targetUrl,
634
+ readyState: state.targetWs.readyState
635
+ });
636
+ }
637
+ } catch (error) {
638
+ logger3().error({
639
+ msg: "failed to connect to target websocket",
640
+ targetUrl,
641
+ error
642
+ });
643
+ closeWebSocketIfOpen(
644
+ clientWs,
645
+ 1011,
646
+ "Failed to connect to target"
647
+ );
648
+ }
649
+ },
650
+ onClose: (event, clientWs) => {
651
+ logger3().debug({
652
+ msg: "client websocket closed",
653
+ targetUrl,
654
+ code: event.code,
655
+ reason: event.reason,
656
+ wasClean: event.wasClean
657
+ });
658
+ if (state.targetWs) {
659
+ if (state.targetWs.readyState === WebSocket2.OPEN || state.targetWs.readyState === WebSocket2.CONNECTING) {
660
+ state.targetWs.close(
661
+ 1e3,
662
+ event.reason || "Client disconnected"
663
+ );
664
+ }
665
+ }
666
+ },
667
+ onError: (event, clientWs) => {
668
+ logger3().error({ msg: "client websocket error", targetUrl, event });
669
+ if (state.targetWs) {
670
+ if (state.targetWs.readyState === WebSocket2.OPEN) {
671
+ state.targetWs.close(1011, "Client WebSocket error");
672
+ } else if (state.targetWs.readyState === WebSocket2.CONNECTING) {
673
+ state.targetWs.close();
674
+ }
675
+ }
676
+ }
677
+ };
678
+ }
679
+ function closeWebSocketIfOpen(ws, code, reason) {
680
+ if (ws.readyState === 1) {
681
+ ws.close(code, reason);
682
+ } else if ("close" in ws && ws.readyState === WebSocket.OPEN) {
683
+ ws.close(code, reason);
684
+ }
685
+ }
686
+
687
+ // src/remote-manager-driver/mod.ts
688
+ var RemoteManagerDriver = class {
689
+ #config;
690
+ #metadataPromise;
691
+ constructor(runConfig) {
692
+ if (_chunkPQZHDKRWcjs.getNextPhase.call(void 0, ) === "phase-production-build") {
693
+ logger3().info(
694
+ "detected next.js build phase, disabling health check"
695
+ );
696
+ runConfig.disableMetadataLookup = true;
697
+ }
698
+ this.#config = { ...runConfig };
699
+ if (!runConfig.disableMetadataLookup) {
700
+ this.#metadataPromise = lookupMetadataCached(this.#config).then(
701
+ (metadataData) => {
702
+ if (metadataData.clientEndpoint) {
703
+ this.#config.endpoint = metadataData.clientEndpoint;
704
+ if (metadataData.clientNamespace) {
705
+ this.#config.namespace = metadataData.clientNamespace;
706
+ }
707
+ if (metadataData.clientToken) {
708
+ this.#config.token = metadataData.clientToken;
709
+ }
710
+ logger3().info({
711
+ msg: "overriding client endpoint",
712
+ endpoint: metadataData.clientEndpoint,
713
+ namespace: metadataData.clientNamespace,
714
+ token: metadataData.clientToken
715
+ });
716
+ }
717
+ logger3().info({
718
+ msg: "connected to rivetkit manager",
719
+ runtime: metadataData.runtime,
720
+ version: metadataData.version,
721
+ runner: metadataData.runner
722
+ });
723
+ }
724
+ );
725
+ }
726
+ }
727
+ async getForId({
728
+ c,
729
+ name,
730
+ actorId
731
+ }) {
732
+ if (this.#metadataPromise) {
733
+ await this.#metadataPromise;
734
+ }
735
+ const response = await getActor(this.#config, name, actorId);
736
+ const actor = response.actors[0];
737
+ if (!actor) return void 0;
738
+ if (actor.name !== name) {
739
+ logger3().debug({
740
+ msg: "actor name mismatch from api",
741
+ actorId,
742
+ apiName: actor.name,
743
+ requestedName: name
744
+ });
745
+ return void 0;
746
+ }
747
+ return apiActorToOutput(actor);
748
+ }
749
+ async getWithKey({
750
+ c,
751
+ name,
752
+ key
753
+ }) {
754
+ if (this.#metadataPromise) {
755
+ await this.#metadataPromise;
756
+ }
757
+ logger3().debug({ msg: "getWithKey: searching for actor", name, key });
758
+ try {
759
+ const response = await getActorByKey(this.#config, name, key);
760
+ const actor = response.actors[0];
761
+ if (!actor) return void 0;
762
+ logger3().debug({
763
+ msg: "getWithKey: found actor via api",
764
+ actorId: actor.actor_id,
765
+ name,
766
+ key
767
+ });
768
+ return apiActorToOutput(actor);
769
+ } catch (error) {
770
+ if (error instanceof EngineApiError && error.group === "actor" && error.code === "not_found") {
771
+ return void 0;
772
+ }
773
+ throw error;
774
+ }
775
+ }
776
+ async getOrCreateWithKey(input) {
777
+ if (this.#metadataPromise) {
778
+ await this.#metadataPromise;
779
+ }
780
+ const { c, name, key, input: actorInput, region } = input;
781
+ logger3().info({
782
+ msg: "getOrCreateWithKey: getting or creating actor via engine api",
783
+ name,
784
+ key
785
+ });
786
+ const { actor, created } = await getOrCreateActor(this.#config, {
787
+ datacenter: region,
788
+ name,
789
+ key: _chunk4JVIG3SScjs.serializeActorKey.call(void 0, key),
790
+ runner_name_selector: this.#config.runnerName,
791
+ input: actorInput ? _chunk4JVIG3SScjs.uint8ArrayToBase64.call(void 0, cbor2.encode(actorInput)) : void 0,
792
+ crash_policy: "sleep"
793
+ });
794
+ logger3().info({
795
+ msg: "getOrCreateWithKey: actor ready",
796
+ actorId: actor.actor_id,
797
+ name,
798
+ key,
799
+ created
800
+ });
801
+ return apiActorToOutput(actor);
802
+ }
803
+ async createActor({
804
+ c,
805
+ name,
806
+ key,
807
+ input,
808
+ region
809
+ }) {
810
+ if (this.#metadataPromise) {
811
+ await this.#metadataPromise;
812
+ }
813
+ logger3().info({ msg: "creating actor via engine api", name, key });
814
+ const result = await createActor(this.#config, {
815
+ datacenter: region,
816
+ name,
817
+ runner_name_selector: this.#config.runnerName,
818
+ key: _chunk4JVIG3SScjs.serializeActorKey.call(void 0, key),
819
+ input: input ? _chunk4JVIG3SScjs.uint8ArrayToBase64.call(void 0, cbor2.encode(input)) : void 0,
820
+ crash_policy: "sleep"
821
+ });
822
+ logger3().info({
823
+ msg: "actor created",
824
+ actorId: result.actor.actor_id,
825
+ name,
826
+ key
827
+ });
828
+ return apiActorToOutput(result.actor);
829
+ }
830
+ async listActors({ c, name }) {
831
+ if (this.#metadataPromise) {
832
+ await this.#metadataPromise;
833
+ }
834
+ logger3().debug({ msg: "listing actors via engine api", name });
835
+ const response = await listActorsByName(this.#config, name);
836
+ return response.actors.map(apiActorToOutput);
837
+ }
838
+ async destroyActor(actorId) {
839
+ if (this.#metadataPromise) {
840
+ await this.#metadataPromise;
841
+ }
842
+ logger3().info({ msg: "destroying actor via engine api", actorId });
843
+ await destroyActor(this.#config, actorId);
844
+ logger3().info({ msg: "actor destroyed", actorId });
845
+ }
846
+ async sendRequest(actorId, actorRequest) {
847
+ if (this.#metadataPromise) {
848
+ await this.#metadataPromise;
849
+ }
850
+ return await sendHttpRequestToActor(
851
+ this.#config,
852
+ actorId,
853
+ actorRequest
854
+ );
855
+ }
856
+ async openWebSocket(path, actorId, encoding, params) {
857
+ if (this.#metadataPromise) {
858
+ await this.#metadataPromise;
859
+ }
860
+ return await openWebSocketToActor(
861
+ this.#config,
862
+ path,
863
+ actorId,
864
+ encoding,
865
+ params
866
+ );
867
+ }
868
+ async buildGatewayUrl(actorId) {
869
+ if (this.#metadataPromise) {
870
+ await this.#metadataPromise;
871
+ }
872
+ const endpoint = getEndpoint(this.#config);
873
+ return buildActorGatewayUrl(endpoint, actorId, this.#config.token);
874
+ }
875
+ async proxyRequest(_c, actorRequest, actorId) {
876
+ if (this.#metadataPromise) {
877
+ await this.#metadataPromise;
878
+ }
879
+ return await sendHttpRequestToActor(
880
+ this.#config,
881
+ actorId,
882
+ actorRequest
883
+ );
884
+ }
885
+ async proxyWebSocket(c, path, actorId, encoding, params) {
886
+ var _a, _b;
887
+ if (this.#metadataPromise) {
888
+ await this.#metadataPromise;
889
+ }
890
+ const upgradeWebSocket = (_b = (_a = this.#config).getUpgradeWebSocket) == null ? void 0 : _b.call(_a);
891
+ _invariant2.default.call(void 0, upgradeWebSocket, "missing getUpgradeWebSocket");
892
+ const endpoint = getEndpoint(this.#config);
893
+ const guardUrl = _chunkPQZHDKRWcjs.combineUrlPath.call(void 0, endpoint, path);
894
+ const wsGuardUrl = guardUrl.replace("http://", "ws://");
895
+ logger3().debug({
896
+ msg: "forwarding websocket to actor via guard",
897
+ actorId,
898
+ path,
899
+ guardUrl
900
+ });
901
+ const protocols = buildWebSocketProtocols(
902
+ this.#config,
903
+ encoding,
904
+ params
905
+ );
906
+ const args = await createWebSocketProxy(c, wsGuardUrl, protocols);
907
+ return await upgradeWebSocket(() => args)(c, _chunkPQZHDKRWcjs.noopNext.call(void 0, ));
908
+ }
909
+ async kvGet(actorId, key) {
910
+ if (this.#metadataPromise) {
911
+ await this.#metadataPromise;
912
+ }
913
+ logger3().debug({ msg: "getting kv value via engine api", key });
914
+ const response = await kvGet(
915
+ this.#config,
916
+ actorId,
917
+ new TextDecoder("utf8").decode(key)
918
+ );
919
+ return response.value;
920
+ }
921
+ displayInformation() {
922
+ return { properties: {} };
923
+ }
924
+ setGetUpgradeWebSocket(getUpgradeWebSocket) {
925
+ this.#config.getUpgradeWebSocket = getUpgradeWebSocket;
926
+ }
927
+ };
928
+ function apiActorToOutput(actor) {
929
+ return {
930
+ actorId: actor.actor_id,
931
+ name: actor.name,
932
+ key: _chunk4JVIG3SScjs.deserializeActorKey.call(void 0, actor.key),
933
+ createTs: actor.create_ts,
934
+ startTs: _nullishCoalesce(actor.start_ts, () => ( null)),
935
+ connectableTs: _nullishCoalesce(actor.connectable_ts, () => ( null)),
936
+ sleepTs: _nullishCoalesce(actor.sleep_ts, () => ( null)),
937
+ destroyTs: _nullishCoalesce(actor.destroy_ts, () => ( null)),
938
+ error: _nullishCoalesce(actor.error, () => ( void 0))
939
+ };
940
+ }
941
+
942
+ // src/client/actor-conn.ts
943
+
944
+
945
+
946
+
947
+ // src/client/actor-query.ts
948
+ async function queryActor(c, query, managerDriver) {
949
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({ msg: "querying actor", query: JSON.stringify(query) });
950
+ let actorOutput;
951
+ if ("getForId" in query) {
952
+ const output = await managerDriver.getForId({
953
+ c,
954
+ name: query.getForId.name,
955
+ actorId: query.getForId.actorId
956
+ });
957
+ if (!output) throw new (0, _chunkL47L3ZWJcjs.ActorNotFound)(query.getForId.actorId);
958
+ actorOutput = output;
959
+ } else if ("getForKey" in query) {
960
+ const existingActor = await managerDriver.getWithKey({
961
+ c,
962
+ name: query.getForKey.name,
963
+ key: query.getForKey.key
964
+ });
965
+ if (!existingActor) {
966
+ throw new (0, _chunkL47L3ZWJcjs.ActorNotFound)(
967
+ `${query.getForKey.name}:${JSON.stringify(query.getForKey.key)}`
968
+ );
969
+ }
970
+ actorOutput = existingActor;
971
+ } else if ("getOrCreateForKey" in query) {
972
+ const getOrCreateOutput = await managerDriver.getOrCreateWithKey({
973
+ c,
974
+ name: query.getOrCreateForKey.name,
975
+ key: query.getOrCreateForKey.key,
976
+ input: query.getOrCreateForKey.input,
977
+ region: query.getOrCreateForKey.region
978
+ });
979
+ actorOutput = {
980
+ actorId: getOrCreateOutput.actorId
981
+ };
982
+ } else if ("create" in query) {
983
+ const createOutput = await managerDriver.createActor({
984
+ c,
985
+ name: query.create.name,
986
+ key: query.create.key,
987
+ input: query.create.input,
988
+ region: query.create.region
989
+ });
990
+ actorOutput = {
991
+ actorId: createOutput.actorId
992
+ };
993
+ } else {
994
+ throw new (0, _chunkL47L3ZWJcjs.InvalidRequest)("Invalid query format");
995
+ }
996
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({ msg: "actor query result", actorId: actorOutput.actorId });
997
+ return { actorId: actorOutput.actorId };
998
+ }
999
+ function getActorNameFromQuery(query) {
1000
+ if ("getForId" in query) return query.getForId.name;
1001
+ if ("getForKey" in query) return query.getForKey.name;
1002
+ if ("getOrCreateForKey" in query) return query.getOrCreateForKey.name;
1003
+ if ("create" in query) return query.create.name;
1004
+ throw new (0, _chunkL47L3ZWJcjs.InvalidRequest)("Invalid query format");
1005
+ }
1006
+ async function checkForSchedulingError(group, code, actorId, query, driver) {
1007
+ const name = getActorNameFromQuery(query);
1008
+ try {
1009
+ const actor = await driver.getForId({ name, actorId });
1010
+ if (actor == null ? void 0 : actor.error) {
1011
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).info({
1012
+ msg: "found actor scheduling error",
1013
+ actorId,
1014
+ error: actor.error
1015
+ });
1016
+ return new ActorSchedulingError(group, code, actorId, actor.error);
1017
+ }
1018
+ } catch (err) {
1019
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).warn({
1020
+ msg: "failed to fetch actor details for scheduling error check",
1021
+ actorId,
1022
+ error: _chunkPQZHDKRWcjs.stringifyError.call(void 0, err)
1023
+ });
1024
+ }
1025
+ return null;
1026
+ }
1027
+
1028
+ // src/client/queue.ts
1029
+
1030
+ function createQueueSender(senderOptions) {
1031
+ async function send(name, body, options) {
1032
+ const wait = _nullishCoalesce((options == null ? void 0 : options.wait), () => ( false));
1033
+ const timeout = options == null ? void 0 : options.timeout;
1034
+ const result = await sendHttpRequest({
1035
+ url: `http://actor/queue/${encodeURIComponent(name)}`,
1036
+ method: "POST",
1037
+ headers: {
1038
+ [_chunk4JVIG3SScjs.HEADER_ENCODING]: senderOptions.encoding,
1039
+ ...senderOptions.params !== void 0 ? {
1040
+ [_chunk4JVIG3SScjs.HEADER_CONN_PARAMS]: JSON.stringify(
1041
+ senderOptions.params
1042
+ )
1043
+ } : {}
1044
+ },
1045
+ body: { body, wait, timeout },
1046
+ encoding: senderOptions.encoding,
1047
+ customFetch: senderOptions.customFetch,
1048
+ signal: options == null ? void 0 : options.signal,
1049
+ requestVersion: _chunk4JVIG3SScjs.CURRENT_VERSION,
1050
+ requestVersionedDataHandler: _chunk4JVIG3SScjs.HTTP_QUEUE_SEND_REQUEST_VERSIONED,
1051
+ responseVersion: _chunk4JVIG3SScjs.CURRENT_VERSION,
1052
+ responseVersionedDataHandler: _chunk4JVIG3SScjs.HTTP_QUEUE_SEND_RESPONSE_VERSIONED,
1053
+ requestZodSchema: _chunk4JVIG3SScjs.HttpQueueSendRequestSchema,
1054
+ responseZodSchema: _chunk4JVIG3SScjs.HttpQueueSendResponseSchema,
1055
+ requestToJson: (value) => ({
1056
+ ...value,
1057
+ name
1058
+ }),
1059
+ requestToBare: (value) => ({
1060
+ name: _nullishCoalesce(value.name, () => ( name)),
1061
+ body: _chunkPQZHDKRWcjs.bufferToArrayBuffer.call(void 0, cbor3.encode(value.body)),
1062
+ wait: _nullishCoalesce(value.wait, () => ( false)),
1063
+ timeout: value.timeout !== void 0 ? BigInt(value.timeout) : null
1064
+ }),
1065
+ responseFromJson: (json) => {
1066
+ if (json.response === void 0) {
1067
+ return { status: json.status };
1068
+ }
1069
+ return {
1070
+ status: json.status,
1071
+ response: json.response
1072
+ };
1073
+ },
1074
+ responseFromBare: (bare) => {
1075
+ if (bare.response === null || bare.response === void 0) {
1076
+ return { status: bare.status };
1077
+ }
1078
+ return {
1079
+ status: bare.status,
1080
+ response: cbor3.decode(new Uint8Array(bare.response))
1081
+ };
1082
+ }
1083
+ });
1084
+ if (wait) {
1085
+ return result;
1086
+ }
1087
+ return;
1088
+ }
1089
+ return {
1090
+ send
1091
+ };
1092
+ }
1093
+
1094
+ // src/client/actor-conn.ts
1095
+ var CONNECT_SYMBOL = /* @__PURE__ */ Symbol("connect");
1096
+ var ActorConnRaw = class {
1097
+ #disposed = false;
1098
+ /* Will be aborted on dispose. */
1099
+ #abortController = new AbortController();
1100
+ #connStatus = "idle";
1101
+ #actorId;
1102
+ #connId;
1103
+ #messageQueue = [];
1104
+ #actionsInFlight = /* @__PURE__ */ new Map();
1105
+ // biome-ignore lint/suspicious/noExplicitAny: Unknown subscription type
1106
+ #eventSubscriptions = /* @__PURE__ */ new Map();
1107
+ #errorHandlers = /* @__PURE__ */ new Set();
1108
+ #openHandlers = /* @__PURE__ */ new Set();
1109
+ #openScheduled = false;
1110
+ #closeHandlers = /* @__PURE__ */ new Set();
1111
+ #statusChangeHandlers = /* @__PURE__ */ new Set();
1112
+ #actionIdCounter = 0;
1113
+ #queueSender;
1114
+ /**
1115
+ * Interval that keeps the NodeJS process alive if this is the only thing running.
1116
+ *
1117
+ * See ttps://github.com/nodejs/node/issues/22088
1118
+ */
1119
+ #keepNodeAliveInterval;
1120
+ /** Promise used to indicate the socket has connected successfully. This will be rejected if the connection fails. */
1121
+ #onOpenPromise;
1122
+ #websocket;
1123
+ #client;
1124
+ #driver;
1125
+ #params;
1126
+ #encoding;
1127
+ #actorQuery;
1128
+ // TODO: ws message queue
1129
+ /**
1130
+ * Do not call this directly.
1131
+ *
1132
+ * Creates an instance of ActorConnRaw.
1133
+ *
1134
+ * @protected
1135
+ */
1136
+ constructor(client, driver, params, encoding, actorQuery) {
1137
+ this.#client = client;
1138
+ this.#driver = driver;
1139
+ this.#params = params;
1140
+ this.#encoding = encoding;
1141
+ this.#actorQuery = actorQuery;
1142
+ this.#queueSender = createQueueSender({
1143
+ encoding: this.#encoding,
1144
+ params: this.#params,
1145
+ customFetch: async (request) => {
1146
+ if (!this.#actorId) {
1147
+ const { actorId } = await queryActor(
1148
+ void 0,
1149
+ this.#actorQuery,
1150
+ this.#driver
1151
+ );
1152
+ this.#actorId = actorId;
1153
+ }
1154
+ return this.#driver.sendRequest(this.#actorId, request);
1155
+ }
1156
+ });
1157
+ this.#keepNodeAliveInterval = setInterval(() => 6e4);
1158
+ }
1159
+ send(name, body, options) {
1160
+ return this.#queueSender.send(name, body, options);
1161
+ }
1162
+ /**
1163
+ * Call a raw action connection. See {@link ActorConn} for type-safe action calls.
1164
+ *
1165
+ * @see {@link ActorConn}
1166
+ * @template Args - The type of arguments to pass to the action function.
1167
+ * @template Response - The type of the response returned by the action function.
1168
+ * @param {string} name - The name of the action function to call.
1169
+ * @param {...Args} args - The arguments to pass to the action function.
1170
+ * @returns {Promise<Response>} - A promise that resolves to the response of the action function.
1171
+ */
1172
+ async action(opts) {
1173
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({ msg: "action", name: opts.name, args: opts.args });
1174
+ const actionId = this.#actionIdCounter;
1175
+ this.#actionIdCounter += 1;
1176
+ const { promise, resolve, reject } = _chunkPQZHDKRWcjs.promiseWithResolvers.call(void 0, (reason) => _chunkV2GHLYC6cjs.logger.call(void 0, ).warn({ msg: "unhandled action promise rejection", reason }));
1177
+ this.#actionsInFlight.set(actionId, {
1178
+ name: opts.name,
1179
+ resolve,
1180
+ reject
1181
+ });
1182
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
1183
+ msg: "added action to in-flight map",
1184
+ actionId,
1185
+ actionName: opts.name,
1186
+ inFlightCount: this.#actionsInFlight.size
1187
+ });
1188
+ this.#sendMessage({
1189
+ body: {
1190
+ tag: "ActionRequest",
1191
+ val: {
1192
+ id: BigInt(actionId),
1193
+ name: opts.name,
1194
+ args: opts.args
1195
+ }
1196
+ }
1197
+ });
1198
+ const { id: responseId, output } = await promise;
1199
+ if (responseId !== BigInt(actionId))
1200
+ throw new Error(
1201
+ `Request ID ${actionId} does not match response ID ${responseId}`
1202
+ );
1203
+ return output;
1204
+ }
1205
+ /**
1206
+ * Do not call this directly.
1207
+ * Establishes a connection to the server using the specified endpoint & encoding & driver.
1208
+ *
1209
+ * @protected
1210
+ */
1211
+ [CONNECT_SYMBOL]() {
1212
+ this.#connectWithRetry();
1213
+ }
1214
+ #setConnStatus(status) {
1215
+ const prevStatus = this.#connStatus;
1216
+ if (prevStatus === status) return;
1217
+ this.#connStatus = status;
1218
+ for (const handler of [...this.#statusChangeHandlers]) {
1219
+ try {
1220
+ handler(status);
1221
+ } catch (err) {
1222
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).error({
1223
+ msg: "error in status change handler",
1224
+ error: _chunkPQZHDKRWcjs.stringifyError.call(void 0, err)
1225
+ });
1226
+ }
1227
+ }
1228
+ if (status === "connected") {
1229
+ for (const handler of [...this.#openHandlers]) {
1230
+ try {
1231
+ handler();
1232
+ } catch (err) {
1233
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).error({
1234
+ msg: "error in open handler",
1235
+ error: _chunkPQZHDKRWcjs.stringifyError.call(void 0, err)
1236
+ });
1237
+ }
1238
+ }
1239
+ }
1240
+ if ((status === "disconnected" || status === "idle") && prevStatus === "connected") {
1241
+ for (const handler of [...this.#closeHandlers]) {
1242
+ try {
1243
+ handler();
1244
+ } catch (err) {
1245
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).error({
1246
+ msg: "error in close handler",
1247
+ error: _chunkPQZHDKRWcjs.stringifyError.call(void 0, err)
1248
+ });
1249
+ }
1250
+ }
1251
+ }
1252
+ }
1253
+ #connectWithRetry() {
1254
+ this.#setConnStatus("connecting");
1255
+ _pretry2.default.call(void 0, this.#connectAndWait.bind(this), {
1256
+ forever: true,
1257
+ minTimeout: 250,
1258
+ maxTimeout: 3e4,
1259
+ onFailedAttempt: (error) => {
1260
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).warn({
1261
+ msg: "failed to reconnect",
1262
+ attempt: error.attemptNumber,
1263
+ error: _chunkPQZHDKRWcjs.stringifyError.call(void 0, error)
1264
+ });
1265
+ },
1266
+ // Cancel retry if aborted
1267
+ signal: this.#abortController.signal
1268
+ }).catch((err) => {
1269
+ if (err.name === "AbortError") {
1270
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).info({ msg: "connection retry aborted" });
1271
+ } else {
1272
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).error({
1273
+ msg: "unexpected error in connection retry",
1274
+ error: _chunkPQZHDKRWcjs.stringifyError.call(void 0, err)
1275
+ });
1276
+ }
1277
+ });
1278
+ }
1279
+ async #connectAndWait() {
1280
+ try {
1281
+ if (this.#onOpenPromise)
1282
+ throw new Error("#onOpenPromise already defined");
1283
+ this.#onOpenPromise = _chunkPQZHDKRWcjs.promiseWithResolvers.call(void 0, (reason) => _chunkV2GHLYC6cjs.logger.call(void 0, ).warn({ msg: "unhandled open promise rejection", reason }));
1284
+ await this.#connectWebSocket();
1285
+ await this.#onOpenPromise.promise;
1286
+ } finally {
1287
+ this.#onOpenPromise = void 0;
1288
+ }
1289
+ }
1290
+ async #connectWebSocket() {
1291
+ const { actorId } = await queryActor(
1292
+ void 0,
1293
+ this.#actorQuery,
1294
+ this.#driver
1295
+ );
1296
+ this.#actorId = actorId;
1297
+ const ws = await this.#driver.openWebSocket(
1298
+ _chunk4JVIG3SScjs.PATH_CONNECT,
1299
+ actorId,
1300
+ this.#encoding,
1301
+ this.#params
1302
+ );
1303
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
1304
+ msg: "opened websocket",
1305
+ connId: this.#connId,
1306
+ readyState: ws.readyState,
1307
+ messageQueueLength: this.#messageQueue.length
1308
+ });
1309
+ this.#websocket = ws;
1310
+ ws.addEventListener("open", () => {
1311
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
1312
+ msg: "client websocket open",
1313
+ connId: this.#connId
1314
+ });
1315
+ });
1316
+ ws.addEventListener("message", async (ev) => {
1317
+ try {
1318
+ await this.#handleOnMessage(ev.data);
1319
+ } catch (err) {
1320
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).error({
1321
+ msg: "error in websocket message handler",
1322
+ error: _chunkPQZHDKRWcjs.stringifyError.call(void 0, err)
1323
+ });
1324
+ }
1325
+ });
1326
+ ws.addEventListener("close", async (ev) => {
1327
+ try {
1328
+ await this.#handleOnClose(ev);
1329
+ } catch (err) {
1330
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).error({
1331
+ msg: "error in websocket close handler",
1332
+ error: _chunkPQZHDKRWcjs.stringifyError.call(void 0, err)
1333
+ });
1334
+ }
1335
+ });
1336
+ ws.addEventListener("error", (_ev) => {
1337
+ try {
1338
+ this.#handleOnError();
1339
+ } catch (err) {
1340
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).error({
1341
+ msg: "error in websocket error handler",
1342
+ error: _chunkPQZHDKRWcjs.stringifyError.call(void 0, err)
1343
+ });
1344
+ }
1345
+ });
1346
+ }
1347
+ /** Called by the onopen event from drivers. */
1348
+ #handleOnOpen() {
1349
+ if (this.#disposed) {
1350
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
1351
+ msg: "handleOnOpen called after dispose, closing websocket"
1352
+ });
1353
+ if (this.#websocket) {
1354
+ this.#websocket.close(1e3, "Disposed");
1355
+ this.#websocket = void 0;
1356
+ }
1357
+ return;
1358
+ }
1359
+ if (this.#connStatus === "connected" || this.#openScheduled) {
1360
+ return;
1361
+ }
1362
+ this.#openScheduled = true;
1363
+ queueMicrotask(() => {
1364
+ this.#openScheduled = false;
1365
+ if (this.#disposed) {
1366
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
1367
+ msg: "handleOnOpen scheduled after dispose, closing websocket"
1368
+ });
1369
+ if (this.#websocket) {
1370
+ this.#websocket.close(1e3, "Disposed");
1371
+ this.#websocket = void 0;
1372
+ }
1373
+ return;
1374
+ }
1375
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
1376
+ msg: "socket open",
1377
+ messageQueueLength: this.#messageQueue.length,
1378
+ connId: this.#connId
1379
+ });
1380
+ this.#setConnStatus("connected");
1381
+ if (this.#onOpenPromise) {
1382
+ this.#onOpenPromise.resolve(void 0);
1383
+ } else {
1384
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).warn({ msg: "#onOpenPromise is undefined" });
1385
+ }
1386
+ for (const eventName of this.#eventSubscriptions.keys()) {
1387
+ this.#sendSubscription(eventName, true);
1388
+ }
1389
+ const queue = this.#messageQueue;
1390
+ this.#messageQueue = [];
1391
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
1392
+ msg: "flushing message queue",
1393
+ queueLength: queue.length
1394
+ });
1395
+ for (const msg of queue) {
1396
+ this.#sendMessage(msg);
1397
+ }
1398
+ });
1399
+ }
1400
+ /** Called by the onmessage event from drivers. */
1401
+ async #handleOnMessage(data) {
1402
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).trace({
1403
+ msg: "received message",
1404
+ dataType: typeof data,
1405
+ isBlob: data instanceof Blob,
1406
+ isArrayBuffer: data instanceof ArrayBuffer
1407
+ });
1408
+ const response = await this.#parseMessage(data);
1409
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).trace(
1410
+ _chunkPQZHDKRWcjs.getLogMessage.call(void 0, ) ? {
1411
+ msg: "parsed message",
1412
+ message: _chunk4JVIG3SScjs.jsonStringifyCompat.call(void 0, response).substring(0, 100) + "..."
1413
+ } : { msg: "parsed message" }
1414
+ );
1415
+ if (response.body.tag === "Init") {
1416
+ this.#actorId = response.body.val.actorId;
1417
+ this.#connId = response.body.val.connectionId;
1418
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).trace({
1419
+ msg: "received init message",
1420
+ actorId: this.#actorId,
1421
+ connId: this.#connId
1422
+ });
1423
+ this.#handleOnOpen();
1424
+ } else if (response.body.tag === "Error") {
1425
+ const { group, code, message, metadata, actionId } = response.body.val;
1426
+ if (actionId) {
1427
+ const inFlight = this.#takeActionInFlight(Number(actionId));
1428
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).warn({
1429
+ msg: "action error",
1430
+ actionId,
1431
+ actionName: inFlight == null ? void 0 : inFlight.name,
1432
+ group,
1433
+ code,
1434
+ message,
1435
+ metadata
1436
+ });
1437
+ inFlight.reject(
1438
+ new ActorError(group, code, message, metadata)
1439
+ );
1440
+ } else {
1441
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).warn({
1442
+ msg: "connection error",
1443
+ group,
1444
+ code,
1445
+ message,
1446
+ metadata
1447
+ });
1448
+ let errorToThrow = new ActorError(
1449
+ group,
1450
+ code,
1451
+ message,
1452
+ metadata
1453
+ );
1454
+ if (isSchedulingError(group, code) && this.#actorId) {
1455
+ const schedulingError = await checkForSchedulingError(
1456
+ group,
1457
+ code,
1458
+ this.#actorId,
1459
+ this.#actorQuery,
1460
+ this.#driver
1461
+ );
1462
+ if (schedulingError) {
1463
+ errorToThrow = schedulingError;
1464
+ }
1465
+ }
1466
+ if (this.#onOpenPromise) {
1467
+ this.#onOpenPromise.reject(errorToThrow);
1468
+ }
1469
+ for (const [id, inFlight] of this.#actionsInFlight.entries()) {
1470
+ inFlight.reject(errorToThrow);
1471
+ this.#actionsInFlight.delete(id);
1472
+ }
1473
+ this.#dispatchActorError(errorToThrow);
1474
+ }
1475
+ } else if (response.body.tag === "ActionResponse") {
1476
+ const { id: actionId } = response.body.val;
1477
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
1478
+ msg: "received action response",
1479
+ actionId: Number(actionId),
1480
+ inFlightCount: this.#actionsInFlight.size,
1481
+ inFlightIds: Array.from(this.#actionsInFlight.keys())
1482
+ });
1483
+ const inFlight = this.#takeActionInFlight(Number(actionId));
1484
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).trace({
1485
+ msg: "resolving action promise",
1486
+ actionId,
1487
+ actionName: inFlight == null ? void 0 : inFlight.name
1488
+ });
1489
+ inFlight.resolve(response.body.val);
1490
+ } else if (response.body.tag === "Event") {
1491
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).trace({
1492
+ msg: "received event",
1493
+ name: response.body.val.name
1494
+ });
1495
+ this.#dispatchEvent(response.body.val);
1496
+ } else {
1497
+ _chunkPQZHDKRWcjs.assertUnreachable.call(void 0, response.body);
1498
+ }
1499
+ }
1500
+ /** Called by the onclose event from drivers. */
1501
+ async #handleOnClose(event) {
1502
+ const closeEvent = event;
1503
+ const wasClean = closeEvent.wasClean;
1504
+ const wasConnected = this.#connStatus === "connected";
1505
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).info({
1506
+ msg: "socket closed",
1507
+ code: closeEvent.code,
1508
+ reason: closeEvent.reason,
1509
+ wasClean,
1510
+ disposed: this.#disposed,
1511
+ connId: this.#connId
1512
+ });
1513
+ this.#websocket = void 0;
1514
+ if (this.#disposed) {
1515
+ this.#rejectPendingPromises(new ActorConnDisposed(), true);
1516
+ } else {
1517
+ this.#setConnStatus("disconnected");
1518
+ let error;
1519
+ const reason = closeEvent.reason || "";
1520
+ const parsed = parseWebSocketCloseReason(reason);
1521
+ if (parsed) {
1522
+ const { group, code } = parsed;
1523
+ if (isSchedulingError(group, code) && this.#actorId) {
1524
+ const schedulingError = await checkForSchedulingError(
1525
+ group,
1526
+ code,
1527
+ this.#actorId,
1528
+ this.#actorQuery,
1529
+ this.#driver
1530
+ );
1531
+ if (schedulingError) {
1532
+ error = schedulingError;
1533
+ } else {
1534
+ error = new ActorError(
1535
+ group,
1536
+ code,
1537
+ `Connection closed: ${reason}`,
1538
+ void 0
1539
+ );
1540
+ }
1541
+ } else {
1542
+ error = new ActorError(
1543
+ group,
1544
+ code,
1545
+ `Connection closed: ${reason}`,
1546
+ void 0
1547
+ );
1548
+ }
1549
+ } else {
1550
+ error = new Error(
1551
+ `${wasClean ? "Connection closed" : "Connection lost"} (code: ${closeEvent.code}, reason: ${reason})`
1552
+ );
1553
+ }
1554
+ this.#rejectPendingPromises(error, false);
1555
+ if (error instanceof ActorError) {
1556
+ this.#dispatchActorError(error);
1557
+ }
1558
+ if (wasConnected) {
1559
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
1560
+ msg: "triggering reconnect",
1561
+ connId: this.#connId
1562
+ });
1563
+ this.#connectWithRetry();
1564
+ }
1565
+ }
1566
+ }
1567
+ #rejectPendingPromises(error, suppressUnhandled) {
1568
+ if (this.#onOpenPromise) {
1569
+ if (suppressUnhandled) {
1570
+ this.#onOpenPromise.promise.catch(() => {
1571
+ });
1572
+ }
1573
+ this.#onOpenPromise.reject(error);
1574
+ }
1575
+ for (const actionInfo of this.#actionsInFlight.values()) {
1576
+ actionInfo.reject(error);
1577
+ }
1578
+ this.#actionsInFlight.clear();
1579
+ }
1580
+ /** Called by the onerror event from drivers. */
1581
+ #handleOnError() {
1582
+ if (this.#disposed) return;
1583
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).warn("socket error");
1584
+ }
1585
+ #takeActionInFlight(id) {
1586
+ const inFlight = this.#actionsInFlight.get(id);
1587
+ if (!inFlight) {
1588
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).error({
1589
+ msg: "action not found in in-flight map",
1590
+ lookupId: id,
1591
+ inFlightCount: this.#actionsInFlight.size,
1592
+ inFlightIds: Array.from(this.#actionsInFlight.keys()),
1593
+ inFlightActions: Array.from(
1594
+ this.#actionsInFlight.entries()
1595
+ ).map(([id2, action]) => ({
1596
+ id: id2,
1597
+ name: action.name
1598
+ }))
1599
+ });
1600
+ throw new InternalError(`No in flight response for ${id}`);
1601
+ }
1602
+ this.#actionsInFlight.delete(id);
1603
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
1604
+ msg: "removed action from in-flight map",
1605
+ actionId: id,
1606
+ actionName: inFlight.name,
1607
+ inFlightCount: this.#actionsInFlight.size
1608
+ });
1609
+ return inFlight;
1610
+ }
1611
+ #dispatchEvent(event) {
1612
+ const { name, args } = event;
1613
+ const listeners = this.#eventSubscriptions.get(name);
1614
+ if (!listeners) return;
1615
+ for (const listener of [...listeners]) {
1616
+ listener.callback(...args);
1617
+ if (listener.once) {
1618
+ listeners.delete(listener);
1619
+ }
1620
+ }
1621
+ if (listeners.size === 0) {
1622
+ this.#eventSubscriptions.delete(name);
1623
+ }
1624
+ }
1625
+ #dispatchActorError(error) {
1626
+ for (const handler of [...this.#errorHandlers]) {
1627
+ try {
1628
+ handler(error);
1629
+ } catch (err) {
1630
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).error({
1631
+ msg: "error in connection error handler",
1632
+ error: _chunkPQZHDKRWcjs.stringifyError.call(void 0, err)
1633
+ });
1634
+ }
1635
+ }
1636
+ }
1637
+ #addEventSubscription(eventName, callback, once) {
1638
+ const listener = {
1639
+ callback,
1640
+ once
1641
+ };
1642
+ let subscriptionSet = this.#eventSubscriptions.get(eventName);
1643
+ if (subscriptionSet === void 0) {
1644
+ subscriptionSet = /* @__PURE__ */ new Set();
1645
+ this.#eventSubscriptions.set(eventName, subscriptionSet);
1646
+ this.#sendSubscription(eventName, true);
1647
+ }
1648
+ subscriptionSet.add(listener);
1649
+ return () => {
1650
+ const listeners = this.#eventSubscriptions.get(eventName);
1651
+ if (listeners) {
1652
+ listeners.delete(listener);
1653
+ if (listeners.size === 0) {
1654
+ this.#eventSubscriptions.delete(eventName);
1655
+ this.#sendSubscription(eventName, false);
1656
+ }
1657
+ }
1658
+ };
1659
+ }
1660
+ /**
1661
+ * Subscribes to an event that will happen repeatedly.
1662
+ *
1663
+ * @template Args - The type of arguments the event callback will receive.
1664
+ * @param {string} eventName - The name of the event to subscribe to.
1665
+ * @param {(...args: Args) => void} callback - The callback function to execute when the event is triggered.
1666
+ * @returns {EventUnsubscribe} - A function to unsubscribe from the event.
1667
+ * @see {@link https://rivet.dev/docs/events|Events Documentation}
1668
+ */
1669
+ on(eventName, callback) {
1670
+ return this.#addEventSubscription(eventName, callback, false);
1671
+ }
1672
+ /**
1673
+ * Subscribes to an event that will be triggered only once.
1674
+ *
1675
+ * @template Args - The type of arguments the event callback will receive.
1676
+ * @param {string} eventName - The name of the event to subscribe to.
1677
+ * @param {(...args: Args) => void} callback - The callback function to execute when the event is triggered.
1678
+ * @returns {EventUnsubscribe} - A function to unsubscribe from the event.
1679
+ * @see {@link https://rivet.dev/docs/events|Events Documentation}
1680
+ */
1681
+ once(eventName, callback) {
1682
+ return this.#addEventSubscription(eventName, callback, true);
1683
+ }
1684
+ /**
1685
+ * Subscribes to connection errors.
1686
+ *
1687
+ * @param {ActorErrorCallback} callback - The callback function to execute when a connection error occurs.
1688
+ * @returns {() => void} - A function to unsubscribe from the error handler.
1689
+ */
1690
+ onError(callback) {
1691
+ this.#errorHandlers.add(callback);
1692
+ return () => {
1693
+ this.#errorHandlers.delete(callback);
1694
+ };
1695
+ }
1696
+ /**
1697
+ * Returns the current connection status.
1698
+ *
1699
+ * @returns {ActorConnStatus} - The current connection status.
1700
+ */
1701
+ get connStatus() {
1702
+ return this.#connStatus;
1703
+ }
1704
+ /**
1705
+ * Returns whether the connection is currently open.
1706
+ *
1707
+ * @deprecated Use `connStatus` instead.
1708
+ * @returns {boolean} - True if the connection is open, false otherwise.
1709
+ */
1710
+ get isConnected() {
1711
+ return this.#connStatus === "connected";
1712
+ }
1713
+ /**
1714
+ * Subscribes to connection open events.
1715
+ *
1716
+ * This is called when the WebSocket connection is established and the Init message is received.
1717
+ *
1718
+ * @param {ConnectionStateCallback} callback - The callback function to execute when the connection opens.
1719
+ * @returns {() => void} - A function to unsubscribe from the open handler.
1720
+ */
1721
+ onOpen(callback) {
1722
+ this.#openHandlers.add(callback);
1723
+ return () => {
1724
+ this.#openHandlers.delete(callback);
1725
+ };
1726
+ }
1727
+ /**
1728
+ * Subscribes to connection close events.
1729
+ *
1730
+ * This is called when the WebSocket connection is closed. The connection will automatically
1731
+ * attempt to reconnect unless disposed.
1732
+ *
1733
+ * @param {ConnectionStateCallback} callback - The callback function to execute when the connection closes.
1734
+ * @returns {() => void} - A function to unsubscribe from the close handler.
1735
+ */
1736
+ onClose(callback) {
1737
+ this.#closeHandlers.add(callback);
1738
+ return () => {
1739
+ this.#closeHandlers.delete(callback);
1740
+ };
1741
+ }
1742
+ /**
1743
+ * Subscribes to connection status changes.
1744
+ *
1745
+ * This is called whenever the connection status changes between Disconnected, Connecting, and Connected.
1746
+ *
1747
+ * @param {StatusChangeCallback} callback - The callback function to execute when the status changes.
1748
+ * @returns {() => void} - A function to unsubscribe from the status change handler.
1749
+ */
1750
+ onStatusChange(callback) {
1751
+ this.#statusChangeHandlers.add(callback);
1752
+ return () => {
1753
+ this.#statusChangeHandlers.delete(callback);
1754
+ };
1755
+ }
1756
+ #sendMessage(message, opts) {
1757
+ var _a, _b;
1758
+ if (this.#disposed) {
1759
+ if (opts == null ? void 0 : opts.ephemeral) {
1760
+ return;
1761
+ } else {
1762
+ throw new ActorConnDisposed();
1763
+ }
1764
+ }
1765
+ let queueMessage = false;
1766
+ if (this.#websocket) {
1767
+ const readyState = this.#websocket.readyState;
1768
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
1769
+ msg: "websocket send attempt",
1770
+ readyState,
1771
+ readyStateString: readyState === 0 ? "CONNECTING" : readyState === 1 ? "OPEN" : readyState === 2 ? "CLOSING" : "CLOSED",
1772
+ connId: this.#connId,
1773
+ messageType: message.body.tag,
1774
+ actionName: (_a = message.body.val) == null ? void 0 : _a.name
1775
+ });
1776
+ if (this.#connStatus !== "connected") {
1777
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
1778
+ msg: "websocket init pending, queueing message",
1779
+ connStatus: this.#connStatus,
1780
+ messageType: message.body.tag
1781
+ });
1782
+ queueMessage = true;
1783
+ } else if (readyState === 1) {
1784
+ try {
1785
+ const messageSerialized = _chunk4JVIG3SScjs.serializeWithEncoding.call(void 0,
1786
+ this.#encoding,
1787
+ message,
1788
+ _chunk4JVIG3SScjs.TO_SERVER_VERSIONED,
1789
+ _chunk4JVIG3SScjs.CURRENT_VERSION,
1790
+ _chunk4JVIG3SScjs.ToServerSchema,
1791
+ // JSON: args is the raw value
1792
+ (msg) => msg,
1793
+ // BARE: args needs to be CBOR-encoded to ArrayBuffer
1794
+ (msg) => {
1795
+ if (msg.body.tag === "ActionRequest") {
1796
+ return {
1797
+ body: {
1798
+ tag: "ActionRequest",
1799
+ val: {
1800
+ id: msg.body.val.id,
1801
+ name: msg.body.val.name,
1802
+ args: _chunkPQZHDKRWcjs.bufferToArrayBuffer.call(void 0,
1803
+ cbor4.encode(msg.body.val.args)
1804
+ )
1805
+ }
1806
+ }
1807
+ };
1808
+ } else {
1809
+ return msg;
1810
+ }
1811
+ }
1812
+ );
1813
+ this.#websocket.send(messageSerialized);
1814
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).trace({
1815
+ msg: "sent websocket message",
1816
+ len: messageLength(messageSerialized)
1817
+ });
1818
+ } catch (error) {
1819
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).warn({
1820
+ msg: "failed to send message, added to queue",
1821
+ error,
1822
+ connId: this.#connId
1823
+ });
1824
+ queueMessage = true;
1825
+ }
1826
+ } else {
1827
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
1828
+ msg: "websocket not open, queueing message",
1829
+ readyState
1830
+ });
1831
+ queueMessage = true;
1832
+ }
1833
+ } else {
1834
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({ msg: "no websocket, queueing message" });
1835
+ queueMessage = true;
1836
+ }
1837
+ if (!(opts == null ? void 0 : opts.ephemeral) && queueMessage) {
1838
+ this.#messageQueue.push(message);
1839
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
1840
+ msg: "queued connection message",
1841
+ queueLength: this.#messageQueue.length,
1842
+ connId: this.#connId,
1843
+ messageType: message.body.tag,
1844
+ actionName: (_b = message.body.val) == null ? void 0 : _b.name
1845
+ });
1846
+ }
1847
+ }
1848
+ async #parseMessage(data) {
1849
+ _invariant2.default.call(void 0, this.#websocket, "websocket must be defined");
1850
+ const buffer = await _chunk4JVIG3SScjs.inputDataToBuffer.call(void 0, data);
1851
+ return _chunk4JVIG3SScjs.deserializeWithEncoding.call(void 0,
1852
+ this.#encoding,
1853
+ buffer,
1854
+ _chunk4JVIG3SScjs.TO_CLIENT_VERSIONED,
1855
+ _chunk4JVIG3SScjs.ToClientSchema,
1856
+ // JSON: values are already the correct type
1857
+ (msg) => msg,
1858
+ // BARE: need to decode ArrayBuffer fields back to unknown
1859
+ (msg) => {
1860
+ if (msg.body.tag === "Error") {
1861
+ return {
1862
+ body: {
1863
+ tag: "Error",
1864
+ val: {
1865
+ group: msg.body.val.group,
1866
+ code: msg.body.val.code,
1867
+ message: msg.body.val.message,
1868
+ metadata: msg.body.val.metadata ? cbor4.decode(
1869
+ new Uint8Array(
1870
+ msg.body.val.metadata
1871
+ )
1872
+ ) : null,
1873
+ actionId: msg.body.val.actionId
1874
+ }
1875
+ }
1876
+ };
1877
+ } else if (msg.body.tag === "ActionResponse") {
1878
+ return {
1879
+ body: {
1880
+ tag: "ActionResponse",
1881
+ val: {
1882
+ id: msg.body.val.id,
1883
+ output: cbor4.decode(
1884
+ new Uint8Array(msg.body.val.output)
1885
+ )
1886
+ }
1887
+ }
1888
+ };
1889
+ } else if (msg.body.tag === "Event") {
1890
+ return {
1891
+ body: {
1892
+ tag: "Event",
1893
+ val: {
1894
+ name: msg.body.val.name,
1895
+ args: cbor4.decode(
1896
+ new Uint8Array(msg.body.val.args)
1897
+ )
1898
+ }
1899
+ }
1900
+ };
1901
+ } else {
1902
+ return msg;
1903
+ }
1904
+ }
1905
+ );
1906
+ }
1907
+ /**
1908
+ * Get the actor ID (for testing purposes).
1909
+ * @internal
1910
+ */
1911
+ get actorId() {
1912
+ return this.#actorId;
1913
+ }
1914
+ /**
1915
+ * Get the connection ID (for testing purposes).
1916
+ * @internal
1917
+ */
1918
+ get connId() {
1919
+ return this.#connId;
1920
+ }
1921
+ /**
1922
+ * Get the connection ID (for testing purposes).
1923
+ * @internal
1924
+ * @deprecated Use `connId` instead.
1925
+ */
1926
+ get connectionId() {
1927
+ return this.#connId;
1928
+ }
1929
+ /**
1930
+ * Disconnects from the actor.
1931
+ *
1932
+ * @returns {Promise<void>} A promise that resolves when the socket is gracefully closed.
1933
+ */
1934
+ async dispose() {
1935
+ if (this.#disposed) {
1936
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).warn({ msg: "connection already disconnected" });
1937
+ return;
1938
+ }
1939
+ this.#disposed = true;
1940
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({ msg: "disposing actor conn" });
1941
+ this.#setConnStatus("idle");
1942
+ clearInterval(this.#keepNodeAliveInterval);
1943
+ this.#abortController.abort();
1944
+ this.#client[ACTOR_CONNS_SYMBOL].delete(this);
1945
+ if (this.#websocket) {
1946
+ const ws = this.#websocket;
1947
+ if (ws.readyState !== 2 && ws.readyState !== 3) {
1948
+ const { promise, resolve } = _chunkPQZHDKRWcjs.promiseWithResolvers.call(void 0, (reason) => _chunkV2GHLYC6cjs.logger.call(void 0, ).warn({ msg: "unhandled websocket close promise rejection", reason }));
1949
+ ws.addEventListener("close", () => resolve(void 0));
1950
+ ws.close(1e3, "Disposed");
1951
+ await promise;
1952
+ }
1953
+ } else {
1954
+ this.#rejectPendingPromises(new ActorConnDisposed(), true);
1955
+ }
1956
+ this.#websocket = void 0;
1957
+ }
1958
+ #sendSubscription(eventName, subscribe) {
1959
+ this.#sendMessage(
1960
+ {
1961
+ body: {
1962
+ tag: "SubscriptionRequest",
1963
+ val: {
1964
+ eventName,
1965
+ subscribe
1966
+ }
1967
+ }
1968
+ },
1969
+ { ephemeral: true }
1970
+ );
1971
+ }
1972
+ };
1973
+
1974
+ // src/client/actor-handle.ts
1975
+
1976
+
1977
+
1978
+ // src/client/raw-utils.ts
1979
+
1980
+ async function rawHttpFetch(driver, actorQuery, params, input, init) {
1981
+ let path;
1982
+ let mergedInit = init || {};
1983
+ if (typeof input === "string") {
1984
+ path = input;
1985
+ } else if (input instanceof URL) {
1986
+ path = input.pathname + input.search;
1987
+ } else if (input instanceof Request) {
1988
+ const url = new URL(input.url);
1989
+ path = url.pathname + url.search;
1990
+ const requestHeaders = new Headers(input.headers);
1991
+ const initHeaders = new Headers((init == null ? void 0 : init.headers) || {});
1992
+ const mergedHeaders = new Headers(requestHeaders);
1993
+ initHeaders.forEach((value, key) => {
1994
+ mergedHeaders.set(key, value);
1995
+ });
1996
+ mergedInit = {
1997
+ method: input.method,
1998
+ body: input.body,
1999
+ mode: input.mode,
2000
+ credentials: input.credentials,
2001
+ redirect: input.redirect,
2002
+ referrer: input.referrer,
2003
+ referrerPolicy: input.referrerPolicy,
2004
+ integrity: input.integrity,
2005
+ keepalive: input.keepalive,
2006
+ signal: input.signal,
2007
+ ...mergedInit,
2008
+ // init overrides Request properties
2009
+ headers: mergedHeaders
2010
+ // headers must be set after spread to ensure proper merge
2011
+ };
2012
+ if (mergedInit.body) {
2013
+ mergedInit.duplex = "half";
2014
+ }
2015
+ } else {
2016
+ throw new TypeError("Invalid input type for fetch");
2017
+ }
2018
+ try {
2019
+ const { actorId } = await queryActor(void 0, actorQuery, driver);
2020
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({ msg: "found actor for raw http", actorId });
2021
+ _invariant2.default.call(void 0, actorId, "Missing actor ID");
2022
+ const normalizedPath = path.startsWith("/") ? path.slice(1) : path;
2023
+ const url = new URL(`http://actor/request/${normalizedPath}`);
2024
+ const proxyRequestHeaders = new Headers(mergedInit.headers);
2025
+ if (params) {
2026
+ proxyRequestHeaders.set(_chunk4JVIG3SScjs.HEADER_CONN_PARAMS, JSON.stringify(params));
2027
+ }
2028
+ const proxyRequest = new Request(url, {
2029
+ ...mergedInit,
2030
+ headers: proxyRequestHeaders
2031
+ });
2032
+ return driver.sendRequest(actorId, proxyRequest);
2033
+ } catch (err) {
2034
+ const { group, code, message, metadata } = _chunkPQZHDKRWcjs.deconstructError.call(void 0,
2035
+ err,
2036
+ _chunkV2GHLYC6cjs.logger.call(void 0, ),
2037
+ {},
2038
+ true
2039
+ );
2040
+ throw new ActorError(group, code, message, metadata);
2041
+ }
2042
+ }
2043
+ async function rawWebSocket(driver, actorQuery, params, path, protocols) {
2044
+ const encoding = "bare";
2045
+ const { actorId } = await queryActor(void 0, actorQuery, driver);
2046
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({ msg: "found actor for action", actorId });
2047
+ _invariant2.default.call(void 0, actorId, "Missing actor ID");
2048
+ let pathPortion = "";
2049
+ let queryPortion = "";
2050
+ if (path) {
2051
+ const queryIndex = path.indexOf("?");
2052
+ if (queryIndex !== -1) {
2053
+ pathPortion = path.substring(0, queryIndex);
2054
+ queryPortion = path.substring(queryIndex);
2055
+ } else {
2056
+ pathPortion = path;
2057
+ }
2058
+ if (pathPortion.startsWith("/")) {
2059
+ pathPortion = pathPortion.slice(1);
2060
+ }
2061
+ }
2062
+ const fullPath = `${_chunk4JVIG3SScjs.PATH_WEBSOCKET_PREFIX}${pathPortion}${queryPortion}`;
2063
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
2064
+ msg: "opening websocket",
2065
+ actorId,
2066
+ encoding,
2067
+ path: fullPath
2068
+ });
2069
+ const ws = await driver.openWebSocket(fullPath, actorId, encoding, params);
2070
+ return ws;
2071
+ }
2072
+
2073
+ // src/client/actor-handle.ts
2074
+ var ActorHandleRaw = class {
2075
+ #client;
2076
+ #driver;
2077
+ #encoding;
2078
+ #actorQuery;
2079
+ #params;
2080
+ #queueSender;
2081
+ /**
2082
+ * Do not call this directly.
2083
+ *
2084
+ * Creates an instance of ActorHandleRaw.
2085
+ *
2086
+ * @protected
2087
+ */
2088
+ constructor(client, driver, params, encoding, actorQuery) {
2089
+ this.#client = client;
2090
+ this.#driver = driver;
2091
+ this.#encoding = encoding;
2092
+ this.#actorQuery = actorQuery;
2093
+ this.#params = params;
2094
+ this.#queueSender = createQueueSender({
2095
+ encoding: this.#encoding,
2096
+ params: this.#params,
2097
+ customFetch: async (request) => {
2098
+ const { actorId } = await queryActor(
2099
+ void 0,
2100
+ this.#actorQuery,
2101
+ this.#driver
2102
+ );
2103
+ return this.#driver.sendRequest(actorId, request);
2104
+ }
2105
+ });
2106
+ }
2107
+ send(name, body, options) {
2108
+ return this.#queueSender.send(name, body, options);
2109
+ }
2110
+ /**
2111
+ * Call a raw action. This method sends an HTTP request to invoke the named action.
2112
+ *
2113
+ * @see {@link ActorHandle}
2114
+ * @template Args - The type of arguments to pass to the action function.
2115
+ * @template Response - The type of the response returned by the action function.
2116
+ */
2117
+ async action(opts) {
2118
+ let actorId;
2119
+ try {
2120
+ const result = await queryActor(
2121
+ void 0,
2122
+ this.#actorQuery,
2123
+ this.#driver
2124
+ );
2125
+ actorId = result.actorId;
2126
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({ msg: "found actor for action", actorId });
2127
+ _invariant2.default.call(void 0, actorId, "Missing actor ID");
2128
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
2129
+ msg: "handling action",
2130
+ name: opts.name,
2131
+ encoding: this.#encoding
2132
+ });
2133
+ const responseData = await sendHttpRequest({
2134
+ url: `http://actor/action/${encodeURIComponent(opts.name)}`,
2135
+ method: "POST",
2136
+ headers: {
2137
+ [_chunk4JVIG3SScjs.HEADER_ENCODING]: this.#encoding,
2138
+ ...this.#params !== void 0 ? { [_chunk4JVIG3SScjs.HEADER_CONN_PARAMS]: JSON.stringify(this.#params) } : {}
2139
+ },
2140
+ body: opts.args,
2141
+ encoding: this.#encoding,
2142
+ customFetch: this.#driver.sendRequest.bind(
2143
+ this.#driver,
2144
+ actorId
2145
+ ),
2146
+ signal: opts == null ? void 0 : opts.signal,
2147
+ requestVersion: _chunk4JVIG3SScjs.CURRENT_VERSION,
2148
+ requestVersionedDataHandler: _chunk4JVIG3SScjs.HTTP_ACTION_REQUEST_VERSIONED,
2149
+ responseVersion: _chunk4JVIG3SScjs.CURRENT_VERSION,
2150
+ responseVersionedDataHandler: _chunk4JVIG3SScjs.HTTP_ACTION_RESPONSE_VERSIONED,
2151
+ requestZodSchema: _chunk4JVIG3SScjs.HttpActionRequestSchema,
2152
+ responseZodSchema: _chunk4JVIG3SScjs.HttpActionResponseSchema,
2153
+ // JSON Request: args is the raw value
2154
+ requestToJson: (args) => ({
2155
+ args
2156
+ }),
2157
+ // BARE Request: args needs to be CBOR-encoded
2158
+ requestToBare: (args) => ({
2159
+ args: _chunkPQZHDKRWcjs.bufferToArrayBuffer.call(void 0, cbor5.encode(args))
2160
+ }),
2161
+ // JSON Response: output is the raw value
2162
+ responseFromJson: (json) => json.output,
2163
+ // BARE Response: output is ArrayBuffer that needs CBOR-decoding
2164
+ responseFromBare: (bare) => cbor5.decode(new Uint8Array(bare.output))
2165
+ });
2166
+ return responseData;
2167
+ } catch (err) {
2168
+ const { group, code, message, metadata } = _chunkPQZHDKRWcjs.deconstructError.call(void 0,
2169
+ err,
2170
+ _chunkV2GHLYC6cjs.logger.call(void 0, ),
2171
+ {},
2172
+ true
2173
+ );
2174
+ if (actorId && isSchedulingError(group, code)) {
2175
+ const schedulingError = await checkForSchedulingError(
2176
+ group,
2177
+ code,
2178
+ actorId,
2179
+ this.#actorQuery,
2180
+ this.#driver
2181
+ );
2182
+ if (schedulingError) {
2183
+ throw schedulingError;
2184
+ }
2185
+ }
2186
+ throw new ActorError(group, code, message, metadata);
2187
+ }
2188
+ }
2189
+ /**
2190
+ * Establishes a persistent connection to the actor.
2191
+ *
2192
+ * @template AD The actor class that this connection is for.
2193
+ * @returns {ActorConn<AD>} A connection to the actor.
2194
+ */
2195
+ connect() {
2196
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
2197
+ msg: "establishing connection from handle",
2198
+ query: this.#actorQuery
2199
+ });
2200
+ const conn = new ActorConnRaw(
2201
+ this.#client,
2202
+ this.#driver,
2203
+ this.#params,
2204
+ this.#encoding,
2205
+ this.#actorQuery
2206
+ );
2207
+ return this.#client[CREATE_ACTOR_CONN_PROXY](
2208
+ conn
2209
+ );
2210
+ }
2211
+ /**
2212
+ * Fetches a resource from this actor via the /request endpoint. This is a
2213
+ * convenience wrapper around the raw HTTP API.
2214
+ */
2215
+ fetch(input, init) {
2216
+ return rawHttpFetch(
2217
+ this.#driver,
2218
+ this.#actorQuery,
2219
+ this.#params,
2220
+ input,
2221
+ init
2222
+ );
2223
+ }
2224
+ /**
2225
+ * Opens a raw WebSocket connection to this actor.
2226
+ */
2227
+ webSocket(path, protocols) {
2228
+ return rawWebSocket(
2229
+ this.#driver,
2230
+ this.#actorQuery,
2231
+ this.#params,
2232
+ path,
2233
+ protocols
2234
+ );
2235
+ }
2236
+ /**
2237
+ * Resolves the actor to get its unique actor ID.
2238
+ */
2239
+ async resolve() {
2240
+ if ("getForKey" in this.#actorQuery) {
2241
+ const name = this.#actorQuery.getForKey.name;
2242
+ const { actorId } = await queryActor(
2243
+ void 0,
2244
+ this.#actorQuery,
2245
+ this.#driver
2246
+ );
2247
+ this.#actorQuery = { getForId: { actorId, name } };
2248
+ return actorId;
2249
+ } else if ("getOrCreateForKey" in this.#actorQuery) {
2250
+ const name = this.#actorQuery.getOrCreateForKey.name;
2251
+ const { actorId } = await queryActor(
2252
+ void 0,
2253
+ this.#actorQuery,
2254
+ this.#driver
2255
+ );
2256
+ this.#actorQuery = { getForId: { actorId, name } };
2257
+ return actorId;
2258
+ } else if ("getForId" in this.#actorQuery) {
2259
+ return this.#actorQuery.getForId.actorId;
2260
+ } else if ("create" in this.#actorQuery) {
2261
+ _invariant2.default.call(void 0, false, "actorQuery cannot be create");
2262
+ } else {
2263
+ _chunkPVOE6BU7cjs.assertUnreachable.call(void 0, this.#actorQuery);
2264
+ }
2265
+ }
2266
+ /**
2267
+ * Returns the raw URL for routing traffic to the actor.
2268
+ */
2269
+ async getGatewayUrl() {
2270
+ const { actorId } = await queryActor(
2271
+ void 0,
2272
+ this.#actorQuery,
2273
+ this.#driver
2274
+ );
2275
+ return await this.#driver.buildGatewayUrl(actorId);
2276
+ }
2277
+ };
2278
+
2279
+ // src/client/client.ts
2280
+ var ACTOR_CONNS_SYMBOL = /* @__PURE__ */ Symbol("actorConns");
2281
+ var CREATE_ACTOR_CONN_PROXY = /* @__PURE__ */ Symbol("createActorConnProxy");
2282
+ var ClientRaw = (_class2 = class {
2283
+ #disposed = false;
2284
+ __init2() {this[ACTOR_CONNS_SYMBOL] = /* @__PURE__ */ new Set()}
2285
+ #driver;
2286
+ #encodingKind;
2287
+ /**
2288
+ * Creates an instance of Client.
2289
+ */
2290
+ constructor(driver, encoding) {;_class2.prototype.__init2.call(this);
2291
+ this.#driver = driver;
2292
+ this.#encodingKind = _nullishCoalesce(encoding, () => ( "bare"));
2293
+ }
2294
+ /**
2295
+ * Gets a stateless handle to a actor by its ID.
2296
+ *
2297
+ * @template AD The actor class that this handle is for.
2298
+ * @param {string} name - The name of the actor.
2299
+ * @param {string} actorId - The ID of the actor.
2300
+ * @param {GetWithIdOptions} [opts] - Options for getting the actor.
2301
+ * @returns {ActorHandle<AD>} - A handle to the actor.
2302
+ */
2303
+ getForId(name, actorId, opts) {
2304
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
2305
+ msg: "get handle to actor with id",
2306
+ name,
2307
+ actorId,
2308
+ params: opts == null ? void 0 : opts.params
2309
+ });
2310
+ const actorQuery = {
2311
+ getForId: {
2312
+ name,
2313
+ actorId
2314
+ }
2315
+ };
2316
+ const handle = this.#createHandle(opts == null ? void 0 : opts.params, actorQuery);
2317
+ return createActorProxy(handle);
2318
+ }
2319
+ /**
2320
+ * Gets a stateless handle to a actor by its key, but does not create the actor if it doesn't exist.
2321
+ *
2322
+ * @template AD The actor class that this handle is for.
2323
+ * @param {string} name - The name of the actor.
2324
+ * @param {string | string[]} [key=[]] - The key to identify the actor. Can be a single string or an array of strings.
2325
+ * @param {GetWithIdOptions} [opts] - Options for getting the actor.
2326
+ * @returns {ActorHandle<AD>} - A handle to the actor.
2327
+ */
2328
+ get(name, key, opts) {
2329
+ const keyArray = typeof key === "string" ? [key] : key || [];
2330
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
2331
+ msg: "get handle to actor",
2332
+ name,
2333
+ key: keyArray,
2334
+ parameters: opts == null ? void 0 : opts.params
2335
+ });
2336
+ const actorQuery = {
2337
+ getForKey: {
2338
+ name,
2339
+ key: keyArray
2340
+ }
2341
+ };
2342
+ const handle = this.#createHandle(opts == null ? void 0 : opts.params, actorQuery);
2343
+ return createActorProxy(handle);
2344
+ }
2345
+ /**
2346
+ * Gets a stateless handle to a actor by its key, creating it if necessary.
2347
+ *
2348
+ * @template AD The actor class that this handle is for.
2349
+ * @param {string} name - The name of the actor.
2350
+ * @param {string | string[]} [key=[]] - The key to identify the actor. Can be a single string or an array of strings.
2351
+ * @param {GetOptions} [opts] - Options for getting the actor.
2352
+ * @returns {ActorHandle<AD>} - A handle to the actor.
2353
+ */
2354
+ getOrCreate(name, key, opts) {
2355
+ const keyArray = typeof key === "string" ? [key] : key || [];
2356
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
2357
+ msg: "get or create handle to actor",
2358
+ name,
2359
+ key: keyArray,
2360
+ parameters: opts == null ? void 0 : opts.params,
2361
+ createInRegion: opts == null ? void 0 : opts.createInRegion
2362
+ });
2363
+ const actorQuery = {
2364
+ getOrCreateForKey: {
2365
+ name,
2366
+ key: keyArray,
2367
+ input: opts == null ? void 0 : opts.createWithInput,
2368
+ region: opts == null ? void 0 : opts.createInRegion
2369
+ }
2370
+ };
2371
+ const handle = this.#createHandle(opts == null ? void 0 : opts.params, actorQuery);
2372
+ return createActorProxy(handle);
2373
+ }
2374
+ /**
2375
+ * Creates a new actor with the provided key and returns a stateless handle to it.
2376
+ * Resolves the actor ID and returns a handle with getForId query.
2377
+ *
2378
+ * @template AD The actor class that this handle is for.
2379
+ * @param {string} name - The name of the actor.
2380
+ * @param {string | string[]} key - The key to identify the actor. Can be a single string or an array of strings.
2381
+ * @param {CreateOptions} [opts] - Options for creating the actor (excluding name and key).
2382
+ * @returns {Promise<ActorHandle<AD>>} - A promise that resolves to a handle to the actor.
2383
+ */
2384
+ async create(name, key, opts) {
2385
+ const keyArray = typeof key === "string" ? [key] : key || [];
2386
+ const createQuery = {
2387
+ create: {
2388
+ ...opts,
2389
+ // Do these last to override `opts`
2390
+ name,
2391
+ key: keyArray
2392
+ }
2393
+ };
2394
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
2395
+ msg: "create actor handle",
2396
+ name,
2397
+ key: keyArray,
2398
+ parameters: opts == null ? void 0 : opts.params,
2399
+ create: createQuery.create
2400
+ });
2401
+ const { actorId } = await queryActor(
2402
+ void 0,
2403
+ createQuery,
2404
+ this.#driver
2405
+ );
2406
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({
2407
+ msg: "created actor with ID",
2408
+ name,
2409
+ key: keyArray,
2410
+ actorId
2411
+ });
2412
+ const getForIdQuery = {
2413
+ getForId: {
2414
+ name,
2415
+ actorId
2416
+ }
2417
+ };
2418
+ const handle = this.#createHandle(opts == null ? void 0 : opts.params, getForIdQuery);
2419
+ const proxy = createActorProxy(handle);
2420
+ return proxy;
2421
+ }
2422
+ #createHandle(params, actorQuery) {
2423
+ return new ActorHandleRaw(
2424
+ this,
2425
+ this.#driver,
2426
+ params,
2427
+ this.#encodingKind,
2428
+ actorQuery
2429
+ );
2430
+ }
2431
+ [CREATE_ACTOR_CONN_PROXY](conn) {
2432
+ this[ACTOR_CONNS_SYMBOL].add(conn);
2433
+ conn[CONNECT_SYMBOL]();
2434
+ return createActorProxy(conn);
2435
+ }
2436
+ /**
2437
+ * Disconnects from all actors.
2438
+ *
2439
+ * @returns {Promise<void>} A promise that resolves when all connections are closed.
2440
+ */
2441
+ async dispose() {
2442
+ if (this.#disposed) {
2443
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).warn({ msg: "client already disconnected" });
2444
+ return;
2445
+ }
2446
+ this.#disposed = true;
2447
+ _chunkV2GHLYC6cjs.logger.call(void 0, ).debug({ msg: "disposing client" });
2448
+ const disposePromises = [];
2449
+ for (const conn of this[ACTOR_CONNS_SYMBOL].values()) {
2450
+ disposePromises.push(conn.dispose());
2451
+ }
2452
+ await Promise.all(disposePromises);
2453
+ }
2454
+ }, _class2);
2455
+ function createClientWithDriver(driver, config = {}) {
2456
+ const client = new ClientRaw(driver, config.encoding);
2457
+ return new Proxy(client, {
2458
+ get: (target, prop, receiver) => {
2459
+ if (typeof prop === "symbol" || prop in target) {
2460
+ const value = Reflect.get(target, prop, receiver);
2461
+ if (typeof value === "function") {
2462
+ return value.bind(target);
2463
+ }
2464
+ return value;
2465
+ }
2466
+ if (typeof prop === "string") {
2467
+ return {
2468
+ // Handle methods (stateless action)
2469
+ get: (key, opts) => {
2470
+ return target.get(prop, key, opts);
2471
+ },
2472
+ getOrCreate: (key, opts) => {
2473
+ return target.getOrCreate(prop, key, opts);
2474
+ },
2475
+ getForId: (actorId, opts) => {
2476
+ return target.getForId(prop, actorId, opts);
2477
+ },
2478
+ create: async (key, opts = {}) => {
2479
+ return await target.create(prop, key, opts);
2480
+ }
2481
+ };
2482
+ }
2483
+ return void 0;
2484
+ }
2485
+ });
2486
+ }
2487
+ function createActorProxy(handle) {
2488
+ const methodCache = /* @__PURE__ */ new Map();
2489
+ return new Proxy(handle, {
2490
+ get(target, prop, receiver) {
2491
+ if (typeof prop === "symbol") {
2492
+ return Reflect.get(target, prop, receiver);
2493
+ }
2494
+ if (prop === "constructor" || prop in target) {
2495
+ const value = Reflect.get(target, prop, target);
2496
+ if (typeof value === "function") {
2497
+ return value.bind(target);
2498
+ }
2499
+ return value;
2500
+ }
2501
+ if (typeof prop === "string") {
2502
+ if (prop === "then") return void 0;
2503
+ let method = methodCache.get(prop);
2504
+ if (!method) {
2505
+ method = (...args) => target.action({ name: prop, args });
2506
+ methodCache.set(prop, method);
2507
+ }
2508
+ return method;
2509
+ }
2510
+ },
2511
+ // Support for 'in' operator
2512
+ has(target, prop) {
2513
+ if (typeof prop === "string") return true;
2514
+ return Reflect.has(target, prop);
2515
+ },
2516
+ // Support instanceof checks
2517
+ getPrototypeOf(target) {
2518
+ return Reflect.getPrototypeOf(target);
2519
+ },
2520
+ // Prevent property enumeration of non-existent action methods
2521
+ ownKeys(target) {
2522
+ return Reflect.ownKeys(target);
2523
+ },
2524
+ // Support proper property descriptors
2525
+ getOwnPropertyDescriptor(target, prop) {
2526
+ const targetDescriptor = Reflect.getOwnPropertyDescriptor(
2527
+ target,
2528
+ prop
2529
+ );
2530
+ if (targetDescriptor) {
2531
+ return targetDescriptor;
2532
+ }
2533
+ if (typeof prop === "string") {
2534
+ return {
2535
+ configurable: true,
2536
+ enumerable: false,
2537
+ writable: false,
2538
+ value: (...args) => target.action({ name: prop, args })
2539
+ };
2540
+ }
2541
+ return void 0;
2542
+ }
2543
+ });
2544
+ }
2545
+
2546
+ // src/client/config.ts
2547
+
2548
+ function getDefaultEndpoint() {
2549
+ var _a;
2550
+ if (typeof window !== "undefined" && ((_a = window.location) == null ? void 0 : _a.origin)) {
2551
+ return `${window.location.origin}/api/rivet`;
2552
+ }
2553
+ return "http://127.0.0.1:6420";
2554
+ }
2555
+ var ClientConfigSchemaBase = _v42.default.object({
2556
+ /**
2557
+ * Endpoint to connect to for Rivet Engine or RivetKit manager API.
2558
+ *
2559
+ * Supports URL auth syntax for namespace and token:
2560
+ * - `https://namespace:token@api.rivet.dev`
2561
+ * - `https://namespace@api.rivet.dev`
2562
+ *
2563
+ * Can also be set via RIVET_ENDPOINT environment variables.
2564
+ *
2565
+ * Defaults to current origin + /api/rivet in browser, or 127.0.0.1:6420 server-side.
2566
+ */
2567
+ endpoint: _v42.default.string().optional().transform(
2568
+ (val) => _nullishCoalesce(_nullishCoalesce(_nullishCoalesce(val, () => ( _chunkPQZHDKRWcjs.getRivetEngine.call(void 0, ))), () => ( _chunkPQZHDKRWcjs.getRivetEndpoint.call(void 0, ))), () => ( getDefaultEndpoint()))
2569
+ ),
2570
+ /** Token to use to authenticate with the API. */
2571
+ token: _v42.default.string().optional().transform((val) => _nullishCoalesce(val, () => ( _chunkPQZHDKRWcjs.getRivetToken.call(void 0, )))),
2572
+ /** Namespace to connect to. */
2573
+ namespace: _v42.default.string().optional().transform((val) => _nullishCoalesce(val, () => ( _chunkPQZHDKRWcjs.getRivetNamespace.call(void 0, )))),
2574
+ /** Name of the runner. This is used to group together runners in to different pools. */
2575
+ runnerName: _v42.default.string().default(() => _nullishCoalesce(_chunkPQZHDKRWcjs.getRivetRunner.call(void 0, ), () => ( "default"))),
2576
+ encoding: _chunk4JVIG3SScjs.EncodingSchema.default("bare"),
2577
+ headers: _v42.default.record(_v42.default.string(), _v42.default.string()).optional().default(() => ({})),
2578
+ // See RunConfig.getUpgradeWebSocket
2579
+ //
2580
+ // This is required in the client config in order to support
2581
+ // `proxyWebSocket`
2582
+ getUpgradeWebSocket: _v42.default.custom().optional(),
2583
+ /** Whether to automatically perform health checks when the client is created. */
2584
+ disableMetadataLookup: _v42.default.boolean().optional().default(false),
2585
+ /** Whether to enable RivetKit Devtools integration. */
2586
+ devtools: _v42.default.boolean().default(
2587
+ () => {
2588
+ var _a, _b;
2589
+ 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");
2590
+ }
2591
+ )
2592
+ });
2593
+ var ClientConfigSchema = ClientConfigSchemaBase.transform(
2594
+ (config, ctx) => transformClientConfig(config, ctx)
2595
+ );
2596
+ function transformClientConfig(config, ctx) {
2597
+ const parsedEndpoint = _chunk4JVIG3SScjs.tryParseEndpoint.call(void 0, ctx, {
2598
+ endpoint: config.endpoint,
2599
+ path: ["endpoint"],
2600
+ namespace: config.namespace,
2601
+ token: config.token
2602
+ });
2603
+ return {
2604
+ ...config,
2605
+ endpoint: parsedEndpoint == null ? void 0 : parsedEndpoint.endpoint,
2606
+ namespace: _nullishCoalesce(_nullishCoalesce((parsedEndpoint == null ? void 0 : parsedEndpoint.namespace), () => ( config.namespace)), () => ( "default")),
2607
+ token: _nullishCoalesce((parsedEndpoint == null ? void 0 : parsedEndpoint.token), () => ( config.token))
2608
+ };
2609
+ }
2610
+ function convertRegistryConfigToClientConfig(config) {
2611
+ var _a, _b;
2612
+ return {
2613
+ endpoint: config.endpoint,
2614
+ token: config.token,
2615
+ namespace: config.namespace,
2616
+ runnerName: config.runner.runnerName,
2617
+ headers: config.headers,
2618
+ encoding: "bare",
2619
+ getUpgradeWebSocket: void 0,
2620
+ // We don't need health checks for internal clients
2621
+ disableMetadataLookup: true,
2622
+ 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")
2623
+ };
2624
+ }
2625
+
2626
+ // src/client/mod.ts
2627
+ function createClient(endpointOrConfig) {
2628
+ const configInput = endpointOrConfig === void 0 ? {} : typeof endpointOrConfig === "string" ? { endpoint: endpointOrConfig } : endpointOrConfig;
2629
+ const config = ClientConfigSchema.parse(configInput);
2630
+ const driver = new RemoteManagerDriver(config);
2631
+ if (config.devtools) {
2632
+ injectDevtools(config);
2633
+ }
2634
+ return createClientWithDriver(driver, config);
2635
+ }
2636
+
2637
+
2638
+
2639
+
2640
+
2641
+
2642
+
2643
+
2644
+
2645
+
2646
+
2647
+
2648
+
2649
+
2650
+
2651
+
2652
+
2653
+
2654
+
2655
+
2656
+ exports.ActorClientError = ActorClientError; exports.InternalError = InternalError; 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;
2657
+ //# sourceMappingURL=chunk-SAZZ4SB2.cjs.map