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