rivetkit 2.0.2 → 2.0.4-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (403) hide show
  1. package/README.md +3 -5
  2. package/dist/browser/client.d.ts +2485 -0
  3. package/dist/browser/client.js +5182 -0
  4. package/dist/browser/client.js.map +1 -0
  5. package/dist/browser/inspector/client.d.ts +130 -0
  6. package/dist/browser/inspector/client.js +2854 -0
  7. package/dist/browser/inspector/client.js.map +1 -0
  8. package/dist/browser/v3-DnYObHH3.d.ts +279 -0
  9. package/dist/inspector.tar.gz +0 -0
  10. package/dist/schemas/actor-inspector/v1.ts +784 -0
  11. package/dist/schemas/actor-inspector/v2.ts +796 -0
  12. package/dist/schemas/actor-inspector/v3.ts +899 -0
  13. package/dist/schemas/actor-persist/v1.ts +225 -0
  14. package/dist/schemas/actor-persist/v2.ts +268 -0
  15. package/dist/schemas/actor-persist/v3.ts +280 -0
  16. package/dist/schemas/actor-persist/v4.ts +406 -0
  17. package/dist/schemas/client-protocol/v1.ts +441 -0
  18. package/dist/schemas/client-protocol/v2.ts +438 -0
  19. package/dist/schemas/client-protocol/v3.ts +554 -0
  20. package/dist/schemas/file-system-driver/v1.ts +108 -0
  21. package/dist/schemas/file-system-driver/v2.ts +142 -0
  22. package/dist/schemas/file-system-driver/v3.ts +167 -0
  23. package/dist/schemas/persist/v1.ts +781 -0
  24. package/dist/schemas/transport/v1.ts +697 -0
  25. package/dist/tsup/actor/errors.cjs +106 -0
  26. package/dist/tsup/actor/errors.cjs.map +1 -0
  27. package/dist/tsup/actor/errors.d.cts +188 -0
  28. package/dist/tsup/actor/errors.d.ts +188 -0
  29. package/dist/tsup/actor/errors.js +106 -0
  30. package/dist/tsup/actor/errors.js.map +1 -0
  31. package/dist/tsup/actor-router-consts-D29T1Z-K.d.cts +24 -0
  32. package/dist/tsup/actor-router-consts-D29T1Z-K.d.ts +24 -0
  33. package/dist/tsup/chunk-325TLXJT.js +1060 -0
  34. package/dist/tsup/chunk-325TLXJT.js.map +1 -0
  35. package/dist/tsup/chunk-424PT5DM.js +23 -0
  36. package/dist/tsup/chunk-424PT5DM.js.map +1 -0
  37. package/dist/tsup/chunk-4JVIG3SS.cjs +6289 -0
  38. package/dist/tsup/chunk-4JVIG3SS.cjs.map +1 -0
  39. package/dist/tsup/chunk-6LJAZ5R4.cjs +96 -0
  40. package/dist/tsup/chunk-6LJAZ5R4.cjs.map +1 -0
  41. package/dist/tsup/chunk-6XU3FMCB.cjs +534 -0
  42. package/dist/tsup/chunk-6XU3FMCB.cjs.map +1 -0
  43. package/dist/tsup/chunk-7HTNH26M.js +509 -0
  44. package/dist/tsup/chunk-7HTNH26M.js.map +1 -0
  45. package/dist/tsup/chunk-AUVH72RE.cjs +5977 -0
  46. package/dist/tsup/chunk-AUVH72RE.cjs.map +1 -0
  47. package/dist/tsup/chunk-D4BYUPNQ.js +645 -0
  48. package/dist/tsup/chunk-D4BYUPNQ.js.map +1 -0
  49. package/dist/tsup/chunk-HDQ2JUQT.cjs +23 -0
  50. package/dist/tsup/chunk-HDQ2JUQT.cjs.map +1 -0
  51. package/dist/tsup/chunk-HHXX2VRM.js +6289 -0
  52. package/dist/tsup/chunk-HHXX2VRM.js.map +1 -0
  53. package/dist/tsup/chunk-JEAEA2PB.js +49 -0
  54. package/dist/tsup/chunk-JEAEA2PB.js.map +1 -0
  55. package/dist/tsup/chunk-JYSEG3VF.cjs +642 -0
  56. package/dist/tsup/chunk-JYSEG3VF.cjs.map +1 -0
  57. package/dist/tsup/chunk-K6DGYILQ.js +2657 -0
  58. package/dist/tsup/chunk-K6DGYILQ.js.map +1 -0
  59. package/dist/tsup/chunk-KJSYAUOM.js +96 -0
  60. package/dist/tsup/chunk-KJSYAUOM.js.map +1 -0
  61. package/dist/tsup/chunk-L47L3ZWJ.cjs +509 -0
  62. package/dist/tsup/chunk-L47L3ZWJ.cjs.map +1 -0
  63. package/dist/tsup/chunk-LXUQ667X.js +2006 -0
  64. package/dist/tsup/chunk-LXUQ667X.js.map +1 -0
  65. package/dist/tsup/chunk-MXNPAB5W.js +5977 -0
  66. package/dist/tsup/chunk-MXNPAB5W.js.map +1 -0
  67. package/dist/tsup/chunk-N4KRDJ56.js +72 -0
  68. package/dist/tsup/chunk-N4KRDJ56.js.map +1 -0
  69. package/dist/tsup/chunk-NIYZDWMW.cjs +2006 -0
  70. package/dist/tsup/chunk-NIYZDWMW.cjs.map +1 -0
  71. package/dist/tsup/chunk-PQZHDKRW.cjs +1060 -0
  72. package/dist/tsup/chunk-PQZHDKRW.cjs.map +1 -0
  73. package/dist/tsup/chunk-PVOE6BU7.cjs +1050 -0
  74. package/dist/tsup/chunk-PVOE6BU7.cjs.map +1 -0
  75. package/dist/tsup/chunk-Q4UD2GA4.cjs +1810 -0
  76. package/dist/tsup/chunk-Q4UD2GA4.cjs.map +1 -0
  77. package/dist/tsup/chunk-QUD664YZ.js +1810 -0
  78. package/dist/tsup/chunk-QUD664YZ.js.map +1 -0
  79. package/dist/tsup/chunk-RTOCTWME.js +1050 -0
  80. package/dist/tsup/chunk-RTOCTWME.js.map +1 -0
  81. package/dist/tsup/chunk-SAZZ4SB2.cjs +2657 -0
  82. package/dist/tsup/chunk-SAZZ4SB2.cjs.map +1 -0
  83. package/dist/tsup/chunk-SR3KQE7Q.cjs +72 -0
  84. package/dist/tsup/chunk-SR3KQE7Q.cjs.map +1 -0
  85. package/dist/tsup/chunk-V2GHLYC6.cjs +49 -0
  86. package/dist/tsup/chunk-V2GHLYC6.cjs.map +1 -0
  87. package/dist/tsup/chunk-V3WG7XTW.cjs +645 -0
  88. package/dist/tsup/chunk-V3WG7XTW.cjs.map +1 -0
  89. package/dist/tsup/chunk-VKVNIQRQ.js +257 -0
  90. package/dist/tsup/chunk-VKVNIQRQ.js.map +1 -0
  91. package/dist/tsup/chunk-WMPW7JYC.js +642 -0
  92. package/dist/tsup/chunk-WMPW7JYC.js.map +1 -0
  93. package/dist/tsup/chunk-Z7HNQ2WF.js +534 -0
  94. package/dist/tsup/chunk-Z7HNQ2WF.js.map +1 -0
  95. package/dist/tsup/chunk-ZFY5J2EP.cjs +257 -0
  96. package/dist/tsup/chunk-ZFY5J2EP.cjs.map +1 -0
  97. package/dist/tsup/client/mod.cjs +33 -0
  98. package/dist/tsup/client/mod.cjs.map +1 -0
  99. package/dist/tsup/client/mod.d.cts +64 -0
  100. package/dist/tsup/client/mod.d.ts +64 -0
  101. package/dist/tsup/client/mod.js +33 -0
  102. package/dist/tsup/client/mod.js.map +1 -0
  103. package/dist/tsup/common/log.cjs +21 -0
  104. package/dist/tsup/common/log.cjs.map +1 -0
  105. package/dist/tsup/common/log.d.cts +34 -0
  106. package/dist/tsup/common/log.d.ts +34 -0
  107. package/dist/tsup/common/log.js +21 -0
  108. package/dist/tsup/common/log.js.map +1 -0
  109. package/dist/tsup/common/websocket.cjs +10 -0
  110. package/dist/tsup/common/websocket.cjs.map +1 -0
  111. package/dist/tsup/common/websocket.d.cts +3 -0
  112. package/dist/tsup/common/websocket.d.ts +3 -0
  113. package/dist/tsup/common/websocket.js +10 -0
  114. package/dist/tsup/common/websocket.js.map +1 -0
  115. package/dist/tsup/config-BiNoIHRs.d.cts +80 -0
  116. package/dist/tsup/config-BiNoIHRs.d.ts +80 -0
  117. package/dist/tsup/config-P3XujgRr.d.ts +2594 -0
  118. package/dist/tsup/config-_gfywqqI.d.cts +2594 -0
  119. package/dist/tsup/context-Bxd8Cx4H.d.cts +75 -0
  120. package/dist/tsup/context-uNA4TRn3.d.ts +75 -0
  121. package/dist/tsup/db/drizzle/mod.cjs +49 -0
  122. package/dist/tsup/db/drizzle/mod.cjs.map +1 -0
  123. package/dist/tsup/db/drizzle/mod.d.cts +17 -0
  124. package/dist/tsup/db/drizzle/mod.d.ts +17 -0
  125. package/dist/tsup/db/drizzle/mod.js +49 -0
  126. package/dist/tsup/db/drizzle/mod.js.map +1 -0
  127. package/dist/tsup/db/mod.cjs +9 -0
  128. package/dist/tsup/db/mod.cjs.map +1 -0
  129. package/dist/tsup/db/mod.d.cts +9 -0
  130. package/dist/tsup/db/mod.d.ts +9 -0
  131. package/dist/tsup/db/mod.js +9 -0
  132. package/dist/tsup/db/mod.js.map +1 -0
  133. package/dist/tsup/driver-BcLvZcKl.d.cts +13 -0
  134. package/dist/tsup/driver-CPGHKXyh.d.ts +13 -0
  135. package/dist/tsup/driver-helpers/mod.cjs +53 -0
  136. package/dist/tsup/driver-helpers/mod.cjs.map +1 -0
  137. package/dist/tsup/driver-helpers/mod.d.cts +47 -0
  138. package/dist/tsup/driver-helpers/mod.d.ts +47 -0
  139. package/dist/tsup/driver-helpers/mod.js +53 -0
  140. package/dist/tsup/driver-helpers/mod.js.map +1 -0
  141. package/dist/tsup/driver-test-suite/mod.cjs +4974 -0
  142. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -0
  143. package/dist/tsup/driver-test-suite/mod.d.cts +73 -0
  144. package/dist/tsup/driver-test-suite/mod.d.ts +73 -0
  145. package/dist/tsup/driver-test-suite/mod.js +4974 -0
  146. package/dist/tsup/driver-test-suite/mod.js.map +1 -0
  147. package/dist/tsup/inspector/mod.cjs +164 -0
  148. package/dist/tsup/inspector/mod.cjs.map +1 -0
  149. package/dist/tsup/inspector/mod.d.cts +130 -0
  150. package/dist/tsup/inspector/mod.d.ts +130 -0
  151. package/dist/tsup/inspector/mod.js +164 -0
  152. package/dist/tsup/inspector/mod.js.map +1 -0
  153. package/dist/tsup/keys-CydblqMh.d.cts +13 -0
  154. package/dist/tsup/keys-CydblqMh.d.ts +13 -0
  155. package/dist/tsup/mod.cjs +82 -0
  156. package/dist/tsup/mod.cjs.map +1 -0
  157. package/dist/tsup/mod.d.cts +126 -0
  158. package/dist/tsup/mod.d.ts +126 -0
  159. package/dist/tsup/mod.js +82 -0
  160. package/dist/tsup/mod.js.map +1 -0
  161. package/dist/tsup/serve-test-suite/mod.cjs +2601 -0
  162. package/dist/tsup/serve-test-suite/mod.cjs.map +1 -0
  163. package/dist/tsup/serve-test-suite/mod.d.cts +9 -0
  164. package/dist/tsup/serve-test-suite/mod.d.ts +9 -0
  165. package/dist/tsup/serve-test-suite/mod.js +2601 -0
  166. package/dist/tsup/serve-test-suite/mod.js.map +1 -0
  167. package/dist/tsup/test/mod.cjs +90 -0
  168. package/dist/tsup/test/mod.cjs.map +1 -0
  169. package/dist/tsup/test/mod.d.cts +26 -0
  170. package/dist/tsup/test/mod.d.ts +26 -0
  171. package/dist/tsup/test/mod.js +90 -0
  172. package/dist/tsup/test/mod.js.map +1 -0
  173. package/dist/tsup/utils-fwx3o3K9.d.cts +18 -0
  174. package/dist/tsup/utils-fwx3o3K9.d.ts +18 -0
  175. package/dist/tsup/utils.cjs +43 -0
  176. package/dist/tsup/utils.cjs.map +1 -0
  177. package/dist/tsup/utils.d.cts +148 -0
  178. package/dist/tsup/utils.d.ts +148 -0
  179. package/dist/tsup/utils.js +43 -0
  180. package/dist/tsup/utils.js.map +1 -0
  181. package/dist/tsup/v3-DnYObHH3.d.cts +279 -0
  182. package/dist/tsup/v3-DnYObHH3.d.ts +279 -0
  183. package/dist/tsup/workflow/mod.cjs +16 -0
  184. package/dist/tsup/workflow/mod.cjs.map +1 -0
  185. package/dist/tsup/workflow/mod.d.cts +25 -0
  186. package/dist/tsup/workflow/mod.d.ts +25 -0
  187. package/dist/tsup/workflow/mod.js +16 -0
  188. package/dist/tsup/workflow/mod.js.map +1 -0
  189. package/package.json +293 -5
  190. package/src/actor/config.ts +1221 -0
  191. package/src/actor/conn/driver.ts +61 -0
  192. package/src/actor/conn/drivers/http.ts +17 -0
  193. package/src/actor/conn/drivers/raw-request.ts +24 -0
  194. package/src/actor/conn/drivers/raw-websocket.ts +65 -0
  195. package/src/actor/conn/drivers/websocket.ts +144 -0
  196. package/src/actor/conn/mod.ts +288 -0
  197. package/src/actor/conn/persisted.ts +81 -0
  198. package/src/actor/conn/state-manager.ts +196 -0
  199. package/src/actor/contexts/action.ts +47 -0
  200. package/src/actor/contexts/base/actor.ts +347 -0
  201. package/src/actor/contexts/base/conn-init.ts +68 -0
  202. package/src/actor/contexts/base/conn.ts +73 -0
  203. package/src/actor/contexts/before-action-response.ts +42 -0
  204. package/src/actor/contexts/before-connect.ts +31 -0
  205. package/src/actor/contexts/connect.ts +42 -0
  206. package/src/actor/contexts/create-conn-state.ts +32 -0
  207. package/src/actor/contexts/create-vars.ts +39 -0
  208. package/src/actor/contexts/create.ts +39 -0
  209. package/src/actor/contexts/destroy.ts +42 -0
  210. package/src/actor/contexts/disconnect.ts +43 -0
  211. package/src/actor/contexts/index.ts +33 -0
  212. package/src/actor/contexts/request.ts +80 -0
  213. package/src/actor/contexts/run.ts +47 -0
  214. package/src/actor/contexts/sleep.ts +42 -0
  215. package/src/actor/contexts/state-change.ts +42 -0
  216. package/src/actor/contexts/wake.ts +42 -0
  217. package/src/actor/contexts/websocket.ts +80 -0
  218. package/src/actor/database.ts +13 -0
  219. package/src/actor/definition.ts +64 -0
  220. package/src/actor/driver.ts +114 -0
  221. package/src/actor/errors.ts +556 -0
  222. package/src/actor/instance/connection-manager.ts +574 -0
  223. package/src/actor/instance/event-manager.ts +314 -0
  224. package/src/actor/instance/keys.ts +146 -0
  225. package/src/actor/instance/kv.ts +241 -0
  226. package/src/actor/instance/mod.ts +1658 -0
  227. package/src/actor/instance/persisted.ts +67 -0
  228. package/src/actor/instance/queue-manager.ts +603 -0
  229. package/src/actor/instance/queue.ts +345 -0
  230. package/src/actor/instance/schedule-manager.ts +392 -0
  231. package/src/actor/instance/state-manager.ts +542 -0
  232. package/src/actor/instance/traces-driver.ts +128 -0
  233. package/src/actor/keys.test.ts +275 -0
  234. package/src/actor/keys.ts +89 -0
  235. package/src/actor/log.ts +6 -0
  236. package/src/actor/mod.ts +110 -0
  237. package/src/actor/protocol/old.ts +416 -0
  238. package/src/actor/protocol/serde.ts +222 -0
  239. package/src/actor/router-endpoints.ts +400 -0
  240. package/src/actor/router-websocket-endpoints.test.ts +54 -0
  241. package/src/actor/router-websocket-endpoints.ts +405 -0
  242. package/src/actor/router.ts +380 -0
  243. package/src/actor/schedule.ts +17 -0
  244. package/src/actor/schema.ts +291 -0
  245. package/src/actor/utils.test.ts +48 -0
  246. package/src/actor/utils.ts +158 -0
  247. package/src/client/actor-common.ts +32 -0
  248. package/src/client/actor-conn.ts +1262 -0
  249. package/src/client/actor-handle.ts +344 -0
  250. package/src/client/actor-query.ts +112 -0
  251. package/src/client/client.ts +558 -0
  252. package/src/client/config.ts +151 -0
  253. package/src/client/errors.ts +76 -0
  254. package/src/client/log.ts +5 -0
  255. package/src/client/mod.browser.ts +2 -0
  256. package/src/client/mod.ts +70 -0
  257. package/src/client/queue.ts +146 -0
  258. package/src/client/raw-utils.ts +149 -0
  259. package/src/client/test.ts +44 -0
  260. package/src/client/utils.ts +252 -0
  261. package/src/common/actor-router-consts.ts +59 -0
  262. package/src/common/cors.ts +57 -0
  263. package/src/common/eventsource-interface.ts +47 -0
  264. package/src/common/eventsource.ts +44 -0
  265. package/src/common/inline-websocket-adapter.ts +154 -0
  266. package/src/common/log-levels.ts +27 -0
  267. package/src/common/log.ts +229 -0
  268. package/src/common/logfmt.ts +221 -0
  269. package/src/common/network.ts +2 -0
  270. package/src/common/router.ts +174 -0
  271. package/src/common/utils.ts +339 -0
  272. package/src/common/websocket-interface.ts +7 -0
  273. package/src/common/websocket.ts +43 -0
  274. package/src/db/config.ts +100 -0
  275. package/src/db/drizzle/mod.ts +226 -0
  276. package/src/db/drizzle/sqlite-core.ts +22 -0
  277. package/src/db/mod.ts +125 -0
  278. package/src/db/shared.ts +92 -0
  279. package/src/db/sqlite-vfs.ts +12 -0
  280. package/src/devtools-loader/index.ts +33 -0
  281. package/src/devtools-loader/log.ts +5 -0
  282. package/src/driver-helpers/mod.ts +33 -0
  283. package/src/driver-helpers/utils.ts +54 -0
  284. package/src/driver-test-suite/log.ts +5 -0
  285. package/src/driver-test-suite/mod.ts +293 -0
  286. package/src/driver-test-suite/test-inline-client-driver.ts +307 -0
  287. package/src/driver-test-suite/tests/access-control.ts +218 -0
  288. package/src/driver-test-suite/tests/action-features.ts +203 -0
  289. package/src/driver-test-suite/tests/actor-conn-hibernation.ts +152 -0
  290. package/src/driver-test-suite/tests/actor-conn-state.ts +300 -0
  291. package/src/driver-test-suite/tests/actor-conn.ts +596 -0
  292. package/src/driver-test-suite/tests/actor-db-raw.ts +73 -0
  293. package/src/driver-test-suite/tests/actor-db.ts +477 -0
  294. package/src/driver-test-suite/tests/actor-destroy.ts +294 -0
  295. package/src/driver-test-suite/tests/actor-driver.ts +18 -0
  296. package/src/driver-test-suite/tests/actor-error-handling.ts +150 -0
  297. package/src/driver-test-suite/tests/actor-handle.ts +312 -0
  298. package/src/driver-test-suite/tests/actor-inline-client.ts +163 -0
  299. package/src/driver-test-suite/tests/actor-inspector.ts +264 -0
  300. package/src/driver-test-suite/tests/actor-kv.ts +65 -0
  301. package/src/driver-test-suite/tests/actor-metadata.ts +116 -0
  302. package/src/driver-test-suite/tests/actor-onstatechange.ts +95 -0
  303. package/src/driver-test-suite/tests/actor-queue.ts +325 -0
  304. package/src/driver-test-suite/tests/actor-run.ts +181 -0
  305. package/src/driver-test-suite/tests/actor-schedule.ts +97 -0
  306. package/src/driver-test-suite/tests/actor-sleep.ts +415 -0
  307. package/src/driver-test-suite/tests/actor-state.ts +54 -0
  308. package/src/driver-test-suite/tests/actor-stateless.ts +70 -0
  309. package/src/driver-test-suite/tests/actor-vars.ts +97 -0
  310. package/src/driver-test-suite/tests/actor-workflow.ts +118 -0
  311. package/src/driver-test-suite/tests/manager-driver.ts +388 -0
  312. package/src/driver-test-suite/tests/raw-http-direct-registry.ts +227 -0
  313. package/src/driver-test-suite/tests/raw-http-request-properties.ts +454 -0
  314. package/src/driver-test-suite/tests/raw-http.ts +359 -0
  315. package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +393 -0
  316. package/src/driver-test-suite/tests/raw-websocket.ts +513 -0
  317. package/src/driver-test-suite/tests/request-access.ts +240 -0
  318. package/src/driver-test-suite/utils.ts +80 -0
  319. package/src/drivers/default.ts +38 -0
  320. package/src/drivers/engine/actor-driver.ts +1027 -0
  321. package/src/drivers/engine/config.ts +43 -0
  322. package/src/drivers/engine/log.ts +5 -0
  323. package/src/drivers/engine/mod.ts +36 -0
  324. package/src/drivers/file-system/actor.ts +102 -0
  325. package/src/drivers/file-system/global-state.ts +1445 -0
  326. package/src/drivers/file-system/kv-limits.ts +70 -0
  327. package/src/drivers/file-system/log.ts +5 -0
  328. package/src/drivers/file-system/manager.ts +300 -0
  329. package/src/drivers/file-system/mod.ts +78 -0
  330. package/src/drivers/file-system/sqlite-runtime.ts +210 -0
  331. package/src/drivers/file-system/utils.ts +125 -0
  332. package/src/engine-process/constants.ts +2 -0
  333. package/src/engine-process/log.ts +5 -0
  334. package/src/engine-process/mod.ts +464 -0
  335. package/src/globals.d.ts +35 -0
  336. package/src/inspector/actor-inspector.ts +352 -0
  337. package/src/inspector/config.ts +49 -0
  338. package/src/inspector/handler.ts +273 -0
  339. package/src/inspector/log.ts +5 -0
  340. package/src/inspector/mod.browser.ts +8 -0
  341. package/src/inspector/mod.ts +4 -0
  342. package/src/inspector/serve-ui.ts +40 -0
  343. package/src/inspector/transport.ts +18 -0
  344. package/src/inspector/utils.ts +32 -0
  345. package/src/manager/driver.ts +106 -0
  346. package/src/manager/gateway.ts +668 -0
  347. package/src/manager/log.ts +5 -0
  348. package/src/manager/mod.ts +2 -0
  349. package/src/manager/protocol/mod.ts +22 -0
  350. package/src/manager/protocol/query.ts +85 -0
  351. package/src/manager/router-schema.ts +22 -0
  352. package/src/manager/router.ts +660 -0
  353. package/src/manager-api/actors.ts +83 -0
  354. package/src/manager-api/common.ts +4 -0
  355. package/src/mod.ts +24 -0
  356. package/src/registry/config/driver.ts +21 -0
  357. package/src/registry/config/index.ts +510 -0
  358. package/src/registry/config/legacy-runner.ts +157 -0
  359. package/src/registry/config/runner.ts +21 -0
  360. package/src/registry/config/serverless.ts +94 -0
  361. package/src/registry/index.ts +194 -0
  362. package/src/registry/log.ts +5 -0
  363. package/src/remote-manager-driver/actor-http-client.ts +84 -0
  364. package/src/remote-manager-driver/actor-websocket-client.ts +81 -0
  365. package/src/remote-manager-driver/api-endpoints.ts +159 -0
  366. package/src/remote-manager-driver/api-utils.ts +69 -0
  367. package/src/remote-manager-driver/log.ts +5 -0
  368. package/src/remote-manager-driver/metadata.ts +64 -0
  369. package/src/remote-manager-driver/mod.ts +414 -0
  370. package/src/remote-manager-driver/ws-proxy.ts +189 -0
  371. package/src/schemas/actor-inspector/mod.ts +1 -0
  372. package/src/schemas/actor-inspector/versioned.ts +233 -0
  373. package/src/schemas/actor-persist/mod.ts +1 -0
  374. package/src/schemas/actor-persist/versioned.ts +217 -0
  375. package/src/schemas/client-protocol/mod.ts +1 -0
  376. package/src/schemas/client-protocol/versioned.ts +330 -0
  377. package/src/schemas/client-protocol-zod/mod.ts +118 -0
  378. package/src/schemas/file-system-driver/mod.ts +1 -0
  379. package/src/schemas/file-system-driver/versioned.ts +135 -0
  380. package/src/schemas/persist/mod.ts +1 -0
  381. package/src/schemas/transport/mod.ts +1 -0
  382. package/src/serde.ts +138 -0
  383. package/src/serve-test-suite/mod.ts +148 -0
  384. package/src/serverless/configure.ts +82 -0
  385. package/src/serverless/log.ts +5 -0
  386. package/src/serverless/router.test.ts +299 -0
  387. package/src/serverless/router.ts +215 -0
  388. package/src/test/log.ts +5 -0
  389. package/src/test/mod.ts +99 -0
  390. package/src/utils/crypto.ts +24 -0
  391. package/src/utils/endpoint-parser.test.ts +202 -0
  392. package/src/utils/endpoint-parser.ts +124 -0
  393. package/src/utils/env-vars.ts +78 -0
  394. package/src/utils/node.ts +178 -0
  395. package/src/utils/router.ts +83 -0
  396. package/src/utils/serve.ts +212 -0
  397. package/src/utils.test.ts +34 -0
  398. package/src/utils.ts +437 -0
  399. package/src/workflow/constants.ts +2 -0
  400. package/src/workflow/context.ts +597 -0
  401. package/src/workflow/driver.ts +194 -0
  402. package/src/workflow/inspector.ts +268 -0
  403. package/src/workflow/mod.ts +128 -0
@@ -0,0 +1,1810 @@
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(); } }
2
+
3
+
4
+
5
+
6
+
7
+
8
+ var _chunkAUVH72REcjs = require('./chunk-AUVH72RE.cjs');
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+ var _chunkSAZZ4SB2cjs = require('./chunk-SAZZ4SB2.cjs');
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+ var _chunk4JVIG3SScjs = require('./chunk-4JVIG3SS.cjs');
52
+
53
+
54
+
55
+
56
+
57
+
58
+ var _chunkPVOE6BU7cjs = require('./chunk-PVOE6BU7.cjs');
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+ var _chunkPQZHDKRWcjs = require('./chunk-PQZHDKRW.cjs');
78
+
79
+
80
+
81
+
82
+
83
+ var _chunkL47L3ZWJcjs = require('./chunk-L47L3ZWJ.cjs');
84
+
85
+ // src/actor/mod.ts
86
+ function actor(input) {
87
+ const config = _chunkPVOE6BU7cjs.ActorConfigSchema.parse(input);
88
+ return new (0, _chunkAUVH72REcjs.ActorDefinition)(config);
89
+ }
90
+ var event2 = _chunkPVOE6BU7cjs.event;
91
+ var queue2 = _chunkPVOE6BU7cjs.queue;
92
+
93
+ // src/drivers/engine/actor-driver.ts
94
+ var _enginerunner = require('@rivetkit/engine-runner');
95
+ var _cborx = require('cbor-x'); var cbor = _interopRequireWildcard(_cborx);
96
+ var _streaming = require('hono/streaming');
97
+ var _ws = require('hono/ws');
98
+ var _invariant = require('invariant'); var _invariant2 = _interopRequireDefault(_invariant);
99
+
100
+ // src/drivers/engine/log.ts
101
+ function logger2() {
102
+ return _chunkPQZHDKRWcjs.getLogger.call(void 0, "driver-engine");
103
+ }
104
+
105
+ // src/drivers/engine/actor-driver.ts
106
+ var RUNNER_SSE_PING_INTERVAL = 1e3;
107
+ var RUNNER_STOP_WAIT_MS = 15e3;
108
+ var CONN_MESSAGE_ACK_DEADLINE = 5e3;
109
+ var CONN_BUFFERED_MESSAGE_SIZE_THRESHOLD = 5e5;
110
+ var EngineActorDriver = class {
111
+ #config;
112
+ #managerDriver;
113
+ #inlineClient;
114
+ #runner;
115
+ #actors = /* @__PURE__ */ new Map();
116
+ #actorRouter;
117
+ #runnerStarted = _chunkPQZHDKRWcjs.promiseWithResolvers.call(void 0, (reason) => logger2().warn({ msg: "unhandled runner started promise rejection", reason }));
118
+ #runnerStopped = _chunkPQZHDKRWcjs.promiseWithResolvers.call(void 0, (reason) => logger2().warn({ msg: "unhandled runner stopped promise rejection", reason }));
119
+ #isRunnerStopped = false;
120
+ // HACK: Track actor stop intent locally since the runner protocol doesn't
121
+ // pass the stop reason to onActorStop. This will be fixed when the runner
122
+ // protocol is updated to send the intent directly (see RVT-5284)
123
+ #actorStopIntent = /* @__PURE__ */ new Map();
124
+ // Map of conn IDs to message index waiting to be persisted before sending
125
+ // an ack
126
+ //
127
+ // serverMessageIndex is updated and pendingAck is flagged in needed in
128
+ // onBeforePersistConnect, then the HWS ack message is sent in
129
+ // onAfterPersistConn. This allows us to track what's about to be written
130
+ // to storage to prevent race conditions with the serverMessageIndex being
131
+ // updated while writing the existing state.
132
+ //
133
+ // bufferedMessageSize tracks the total bytes received since last persist
134
+ // to force a saveState when threshold is reached. This is the amount of
135
+ // data currently buffered on the gateway.
136
+ #hwsMessageIndex = /* @__PURE__ */ new Map();
137
+ constructor(config, managerDriver, inlineClient) {
138
+ this.#config = config;
139
+ this.#managerDriver = managerDriver;
140
+ this.#inlineClient = inlineClient;
141
+ const token = config.token;
142
+ this.#actorRouter = _chunkAUVH72REcjs.createActorRouter.call(void 0,
143
+ config,
144
+ this,
145
+ void 0,
146
+ config.test.enabled
147
+ );
148
+ const engineRunnerConfig = {
149
+ version: config.runner.version,
150
+ endpoint: _chunkSAZZ4SB2cjs.getEndpoint.call(void 0, config),
151
+ token,
152
+ namespace: config.namespace,
153
+ totalSlots: config.runner.totalSlots,
154
+ runnerName: config.runner.runnerName,
155
+ runnerKey: _nullishCoalesce(config.runner.runnerKey, () => ( crypto.randomUUID())),
156
+ metadata: {
157
+ rivetkit: { version: _chunkPQZHDKRWcjs.VERSION }
158
+ },
159
+ prepopulateActorNames: _chunk4JVIG3SScjs.buildActorNames.call(void 0, config),
160
+ onConnected: () => {
161
+ this.#runnerStarted.resolve(void 0);
162
+ },
163
+ onDisconnected: (_code, _reason) => {
164
+ },
165
+ onShutdown: () => {
166
+ this.#runnerStopped.resolve(void 0);
167
+ this.#isRunnerStopped = true;
168
+ },
169
+ fetch: this.#runnerFetch.bind(this),
170
+ websocket: this.#runnerWebSocket.bind(this),
171
+ hibernatableWebSocket: {
172
+ canHibernate: this.#hwsCanHibernate.bind(this)
173
+ },
174
+ onActorStart: this.#runnerOnActorStart.bind(this),
175
+ onActorStop: this.#runnerOnActorStop.bind(this),
176
+ logger: _chunkPQZHDKRWcjs.getLogger.call(void 0, "engine-runner")
177
+ };
178
+ this.#runner = new (0, _enginerunner.Runner)(engineRunnerConfig);
179
+ this.#runner.start();
180
+ logger2().debug({
181
+ msg: "engine runner started",
182
+ endpoint: config.endpoint,
183
+ namespace: config.namespace,
184
+ runnerName: config.runner.runnerName
185
+ });
186
+ }
187
+ getExtraActorLogParams() {
188
+ return { runnerId: _nullishCoalesce(this.#runner.runnerId, () => ( "-")) };
189
+ }
190
+ async #loadActorHandler(actorId) {
191
+ const handler = this.#actors.get(actorId);
192
+ if (!handler)
193
+ throw new Error(`Actor handler does not exist ${actorId}`);
194
+ if (handler.actorStartPromise) await handler.actorStartPromise.promise;
195
+ if (handler.actorStartError) throw handler.actorStartError;
196
+ if (!handler.actor) throw new Error("Actor should be loaded");
197
+ return handler;
198
+ }
199
+ getContext(actorId) {
200
+ return {};
201
+ }
202
+ async setAlarm(actor2, timestamp) {
203
+ const handler = this.#actors.get(actor2.id);
204
+ if (!handler) {
205
+ logger2().warn({
206
+ msg: "no handler for actor to set alarm"
207
+ });
208
+ return;
209
+ }
210
+ if (handler.alarmTimeout) {
211
+ handler.alarmTimeout.abort();
212
+ handler.alarmTimeout = void 0;
213
+ }
214
+ const delay = Math.max(0, timestamp - Date.now());
215
+ handler.alarmTimeout = _chunkPQZHDKRWcjs.setLongTimeout.call(void 0, () => {
216
+ actor2.onAlarm();
217
+ handler.alarmTimeout = void 0;
218
+ }, delay);
219
+ this.#runner.setAlarm(actor2.id, timestamp);
220
+ }
221
+ // No database overrides - will use KV-backed implementation from rivetkit/db
222
+ // MARK: - Batch KV operations
223
+ async kvBatchPut(actorId, entries) {
224
+ await this.#runner.kvPut(actorId, entries);
225
+ }
226
+ async kvBatchGet(actorId, keys) {
227
+ return await this.#runner.kvGet(actorId, keys);
228
+ }
229
+ async kvBatchDelete(actorId, keys) {
230
+ await this.#runner.kvDelete(actorId, keys);
231
+ }
232
+ async kvList(actorId) {
233
+ const entries = await this.#runner.kvListPrefix(
234
+ actorId,
235
+ new Uint8Array()
236
+ );
237
+ const keys = entries.map(([key]) => key);
238
+ logger2().info({
239
+ msg: "kvList called",
240
+ actorId,
241
+ keysCount: keys.length,
242
+ keys: keys.map((k) => new TextDecoder().decode(k))
243
+ });
244
+ return keys;
245
+ }
246
+ async kvListPrefix(actorId, prefix) {
247
+ const result = await this.#runner.kvListPrefix(actorId, prefix);
248
+ logger2().info({
249
+ msg: "kvListPrefix called",
250
+ actorId,
251
+ prefixStr: new TextDecoder().decode(prefix),
252
+ entriesCount: result.length,
253
+ keys: result.map(([key]) => new TextDecoder().decode(key))
254
+ });
255
+ return result;
256
+ }
257
+ /** Creates a SQLite VFS instance for creating KV-backed databases */
258
+ async createSqliteVfs() {
259
+ const specifier = "@rivetkit/sqlite-vfs";
260
+ const { SqliteVfs } = await Promise.resolve().then(() => _interopRequireWildcard(require(specifier)));
261
+ return new SqliteVfs();
262
+ }
263
+ // MARK: - Actor Lifecycle
264
+ async loadActor(actorId) {
265
+ const handler = await this.#loadActorHandler(actorId);
266
+ if (!handler.actor) throw new Error(`Actor ${actorId} failed to load`);
267
+ return handler.actor;
268
+ }
269
+ startSleep(actorId) {
270
+ this.#actorStopIntent.set(actorId, "sleep");
271
+ this.#runner.sleepActor(actorId);
272
+ }
273
+ startDestroy(actorId) {
274
+ this.#actorStopIntent.set(actorId, "destroy");
275
+ this.#runner.stopActor(actorId);
276
+ }
277
+ async shutdownRunner(immediate) {
278
+ logger2().info({ msg: "stopping engine actor driver", immediate });
279
+ logger2().debug({
280
+ msg: "stopping all actors before shutdown",
281
+ actorCount: this.#actors.size
282
+ });
283
+ const stopPromises = [];
284
+ for (const [_actorId, handler] of this.#actors.entries()) {
285
+ if (handler.actor) {
286
+ stopPromises.push(
287
+ handler.actor.onStop("sleep").catch((err) => {
288
+ var _a;
289
+ (_a = handler.actor) == null ? void 0 : _a.rLog.error({
290
+ msg: "onStop errored",
291
+ error: _chunkPQZHDKRWcjs.stringifyError.call(void 0, err)
292
+ });
293
+ })
294
+ );
295
+ }
296
+ }
297
+ await Promise.all(stopPromises);
298
+ logger2().debug({ msg: "all actors stopped" });
299
+ try {
300
+ await this.#runner.shutdown(immediate);
301
+ } catch (error) {
302
+ const message = error instanceof Error ? error.message : String(error);
303
+ if (message.includes("WebSocket connection closed during shutdown")) {
304
+ logger2().debug({
305
+ msg: "ignoring shutdown websocket close race",
306
+ error: message
307
+ });
308
+ } else {
309
+ throw error;
310
+ }
311
+ }
312
+ const stopped = await Promise.race([
313
+ this.#runnerStopped.promise.then(() => true),
314
+ new Promise(
315
+ (resolve) => setTimeout(() => resolve(false), RUNNER_STOP_WAIT_MS)
316
+ )
317
+ ]);
318
+ if (!stopped) {
319
+ logger2().warn({
320
+ msg: "timed out waiting for runner shutdown",
321
+ waitMs: RUNNER_STOP_WAIT_MS
322
+ });
323
+ }
324
+ }
325
+ async serverlessHandleStart(c) {
326
+ return _streaming.streamSSE.call(void 0, c, async (stream) => {
327
+ stream.onAbort(() => {
328
+ });
329
+ c.req.raw.signal.addEventListener("abort", () => {
330
+ logger2().debug("SSE aborted, shutting down runner");
331
+ this.shutdownRunner(false);
332
+ });
333
+ await this.#runnerStarted.promise;
334
+ const payload = this.#runner.getServerlessInitPacket();
335
+ _invariant2.default.call(void 0, payload, "runnerId not set");
336
+ await stream.writeSSE({ data: payload });
337
+ while (true) {
338
+ if (this.#isRunnerStopped) {
339
+ logger2().debug({
340
+ msg: "runner is stopped"
341
+ });
342
+ break;
343
+ }
344
+ if (stream.closed || stream.aborted) {
345
+ logger2().debug({
346
+ msg: "runner sse stream closed",
347
+ closed: stream.closed,
348
+ aborted: stream.aborted
349
+ });
350
+ break;
351
+ }
352
+ await stream.writeSSE({ event: "ping", data: "" });
353
+ await stream.sleep(RUNNER_SSE_PING_INTERVAL);
354
+ }
355
+ await this.#runnerStopped.promise;
356
+ });
357
+ }
358
+ async #runnerOnActorStart(actorId, generation, actorConfig) {
359
+ var _a;
360
+ logger2().debug({
361
+ msg: "runner actor starting",
362
+ actorId,
363
+ name: actorConfig.name,
364
+ key: actorConfig.key,
365
+ generation
366
+ });
367
+ let input;
368
+ if (actorConfig.input) {
369
+ input = cbor.decode(actorConfig.input);
370
+ }
371
+ let handler = this.#actors.get(actorId);
372
+ if (!handler) {
373
+ handler = {
374
+ actorStartPromise: _chunkPQZHDKRWcjs.promiseWithResolvers.call(void 0, (reason) => logger2().warn({ msg: "unhandled actor start promise rejection", reason }))
375
+ };
376
+ this.#actors.set(actorId, handler);
377
+ }
378
+ handler.actorStartError = void 0;
379
+ const name = actorConfig.name;
380
+ _invariant2.default.call(void 0, actorConfig.key, "actor should have a key");
381
+ const key = _chunk4JVIG3SScjs.deserializeActorKey.call(void 0, actorConfig.key);
382
+ try {
383
+ const [persistDataBuffer] = await this.#runner.kvGet(actorId, [
384
+ _chunkPVOE6BU7cjs.KEYS.PERSIST_DATA
385
+ ]);
386
+ if (persistDataBuffer === null) {
387
+ const initialKvState = _chunk4JVIG3SScjs.getInitialActorKvState.call(void 0, input);
388
+ await this.#runner.kvPut(actorId, initialKvState);
389
+ logger2().debug({
390
+ msg: "initialized persist data for new actor",
391
+ actorId
392
+ });
393
+ } else {
394
+ logger2().debug({
395
+ msg: "found existing persist data for actor",
396
+ actorId,
397
+ dataSize: persistDataBuffer.byteLength
398
+ });
399
+ }
400
+ const definition = _chunkAUVH72REcjs.lookupInRegistry.call(void 0, this.#config, actorConfig.name);
401
+ handler.actor = await definition.instantiate();
402
+ await handler.actor.start(
403
+ this,
404
+ this.#inlineClient,
405
+ actorId,
406
+ name,
407
+ key,
408
+ "unknown"
409
+ // TODO: Add regions
410
+ );
411
+ logger2().debug({ msg: "runner actor started", actorId, name, key });
412
+ } catch (innerError) {
413
+ const error = innerError instanceof Error ? new Error(
414
+ `Failed to start actor ${actorId}: ${innerError.message}`,
415
+ { cause: innerError }
416
+ ) : new Error(`Failed to start actor ${actorId}: ${String(innerError)}`);
417
+ handler.actor = void 0;
418
+ handler.actorStartError = error;
419
+ (_a = handler.actorStartPromise) == null ? void 0 : _a.reject(error);
420
+ handler.actorStartPromise = void 0;
421
+ logger2().error({
422
+ msg: "runner actor failed to start",
423
+ actorId,
424
+ name,
425
+ key,
426
+ err: _chunkPQZHDKRWcjs.stringifyError.call(void 0, error)
427
+ });
428
+ try {
429
+ this.#runner.stopActor(actorId);
430
+ } catch (stopError) {
431
+ logger2().debug({
432
+ msg: "failed to stop actor after start failure",
433
+ actorId,
434
+ err: _chunkPQZHDKRWcjs.stringifyError.call(void 0, stopError)
435
+ });
436
+ }
437
+ }
438
+ }
439
+ async #runnerOnActorStop(actorId, generation) {
440
+ logger2().debug({ msg: "runner actor stopping", actorId, generation });
441
+ const reason = _nullishCoalesce(this.#actorStopIntent.get(actorId), () => ( "sleep"));
442
+ this.#actorStopIntent.delete(actorId);
443
+ const handler = this.#actors.get(actorId);
444
+ if (handler == null ? void 0 : handler.actorStartPromise) {
445
+ const startError = _nullishCoalesce(handler.actorStartError, () => ( new Error(`Actor ${actorId} stopped before start completed`)));
446
+ handler.actorStartError = startError;
447
+ handler.actorStartPromise.reject(startError);
448
+ handler.actorStartPromise = void 0;
449
+ }
450
+ if (handler == null ? void 0 : handler.actor) {
451
+ try {
452
+ await handler.actor.onStop(reason);
453
+ } catch (err) {
454
+ logger2().error({
455
+ msg: "error in onStop, proceeding with removing actor",
456
+ err: _chunkPQZHDKRWcjs.stringifyError.call(void 0, err)
457
+ });
458
+ }
459
+ }
460
+ if (handler) this.#actors.delete(actorId);
461
+ logger2().debug({ msg: "runner actor stopped", actorId, reason });
462
+ }
463
+ // MARK: - Runner Networking
464
+ async #runnerFetch(_runner, actorId, _gatewayIdBuf, _requestIdBuf, request) {
465
+ logger2().debug({
466
+ msg: "runner fetch",
467
+ actorId,
468
+ url: request.url,
469
+ method: request.method
470
+ });
471
+ return await this.#actorRouter.fetch(request, { actorId });
472
+ }
473
+ async #runnerWebSocket(_runner, actorId, websocketRaw, gatewayIdBuf, requestIdBuf, request, requestPath, requestHeaders, isHibernatable, isRestoringHibernatable) {
474
+ var _a, _b, _c, _d;
475
+ const websocket = websocketRaw;
476
+ const wsUniqueId = `ws_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
477
+ websocket.__rivet_ws_id = wsUniqueId;
478
+ logger2().debug({
479
+ msg: "runner websocket",
480
+ actorId,
481
+ url: request.url,
482
+ isRestoringHibernatable,
483
+ websocketObjectId: websocketRaw ? Object.prototype.toString.call(websocketRaw) : "null",
484
+ websocketType: (_a = websocketRaw == null ? void 0 : websocketRaw.constructor) == null ? void 0 : _a.name,
485
+ wsUniqueId,
486
+ websocketProps: websocketRaw ? Object.keys(websocketRaw).join(", ") : "null"
487
+ });
488
+ const protocols = request.headers.get("sec-websocket-protocol");
489
+ const { encoding, connParams } = _chunk4JVIG3SScjs.parseWebSocketProtocols.call(void 0, protocols);
490
+ let wsHandler;
491
+ try {
492
+ wsHandler = await _chunk4JVIG3SScjs.routeWebSocket.call(void 0,
493
+ request,
494
+ requestPath,
495
+ requestHeaders,
496
+ this.#config,
497
+ this,
498
+ actorId,
499
+ encoding,
500
+ connParams,
501
+ gatewayIdBuf,
502
+ requestIdBuf,
503
+ isHibernatable,
504
+ isRestoringHibernatable
505
+ );
506
+ } catch (err) {
507
+ logger2().error({ msg: "building websocket handlers errored", err });
508
+ websocketRaw.close(1011, "ws.route_error");
509
+ return;
510
+ }
511
+ websocket.raw = websocket;
512
+ const wsContext = new (0, _ws.WSContext)(websocket);
513
+ const conn = wsHandler.conn;
514
+ const actor2 = wsHandler.actor;
515
+ const connStateManager = conn == null ? void 0 : conn[_chunk4JVIG3SScjs.CONN_STATE_MANAGER_SYMBOL];
516
+ logger2().debug({
517
+ msg: "attaching websocket event listeners",
518
+ actorId,
519
+ connId: conn == null ? void 0 : conn.id,
520
+ wsUniqueId: websocket.__rivet_ws_id,
521
+ isRestoringHibernatable,
522
+ websocketType: (_b = websocket == null ? void 0 : websocket.constructor) == null ? void 0 : _b.name
523
+ });
524
+ if (isRestoringHibernatable) {
525
+ (_c = wsHandler.onRestore) == null ? void 0 : _c.call(wsHandler, wsContext);
526
+ }
527
+ websocket.addEventListener("open", (event3) => {
528
+ wsHandler.onOpen(event3, wsContext);
529
+ });
530
+ websocket.addEventListener("message", (event3) => {
531
+ var _a2, _b2;
532
+ logger2().debug({
533
+ msg: "websocket message event listener triggered",
534
+ connId: conn == null ? void 0 : conn.id,
535
+ actorId: actor2 == null ? void 0 : actor2.id,
536
+ messageIndex: event3.rivetMessageIndex,
537
+ hasWsHandler: !!wsHandler,
538
+ hasOnMessage: !!(wsHandler == null ? void 0 : wsHandler.onMessage),
539
+ actorIsStopping: actor2 == null ? void 0 : actor2.isStopping,
540
+ websocketType: (_a2 = websocket == null ? void 0 : websocket.constructor) == null ? void 0 : _a2.name,
541
+ wsUniqueId: websocket.__rivet_ws_id,
542
+ eventTargetWsId: (_b2 = event3.target) == null ? void 0 : _b2.__rivet_ws_id
543
+ });
544
+ if (actor2 == null ? void 0 : actor2.isStopping) {
545
+ logger2().debug({
546
+ msg: "ignoring ws message, actor is stopping",
547
+ connId: conn == null ? void 0 : conn.id,
548
+ actorId: actor2 == null ? void 0 : actor2.id,
549
+ messageIndex: event3.rivetMessageIndex
550
+ });
551
+ return;
552
+ }
553
+ logger2().debug({
554
+ msg: "calling wsHandler.onMessage",
555
+ connId: conn == null ? void 0 : conn.id,
556
+ messageIndex: event3.rivetMessageIndex
557
+ });
558
+ wsHandler.onMessage(event3, wsContext);
559
+ const hibernate = connStateManager == null ? void 0 : connStateManager.hibernatableData;
560
+ if (hibernate && conn && actor2) {
561
+ _invariant2.default.call(void 0,
562
+ typeof event3.rivetMessageIndex === "number",
563
+ "missing event.rivetMessageIndex"
564
+ );
565
+ const previousMsgIndex = hibernate.serverMessageIndex;
566
+ hibernate.serverMessageIndex = event3.rivetMessageIndex;
567
+ logger2().info({
568
+ msg: "persisting message index",
569
+ connId: conn.id,
570
+ previousMsgIndex,
571
+ newMsgIndex: event3.rivetMessageIndex
572
+ });
573
+ const entry = this.#hwsMessageIndex.get(conn.id);
574
+ if (entry) {
575
+ const messageLength = _chunk4JVIG3SScjs.getValueLength.call(void 0, event3.data);
576
+ entry.bufferedMessageSize += messageLength;
577
+ if (entry.bufferedMessageSize >= CONN_BUFFERED_MESSAGE_SIZE_THRESHOLD) {
578
+ entry.bufferedMessageSize = 0;
579
+ entry.pendingAckFromBufferSize = true;
580
+ actor2.stateManager.saveState({
581
+ immediate: true
582
+ });
583
+ } else {
584
+ actor2.stateManager.saveState({
585
+ maxWait: CONN_MESSAGE_ACK_DEADLINE
586
+ });
587
+ }
588
+ } else {
589
+ actor2.stateManager.saveState({
590
+ maxWait: CONN_MESSAGE_ACK_DEADLINE
591
+ });
592
+ }
593
+ }
594
+ });
595
+ websocket.addEventListener("close", (event3) => {
596
+ wsHandler.onClose(event3, wsContext);
597
+ });
598
+ websocket.addEventListener("error", (event3) => {
599
+ wsHandler.onError(event3, wsContext);
600
+ });
601
+ if (isRestoringHibernatable) {
602
+ logger2().info({
603
+ msg: "event listeners attached to restored websocket",
604
+ actorId,
605
+ connId: conn == null ? void 0 : conn.id,
606
+ gatewayId: _enginerunner.idToStr.call(void 0, gatewayIdBuf),
607
+ requestId: _enginerunner.idToStr.call(void 0, requestIdBuf),
608
+ websocketType: (_d = websocket == null ? void 0 : websocket.constructor) == null ? void 0 : _d.name,
609
+ hasMessageListener: !!websocket.addEventListener
610
+ });
611
+ }
612
+ }
613
+ // MARK: - Hibernating WebSockets
614
+ #hwsCanHibernate(actorId, gatewayId, requestId, request) {
615
+ var _a;
616
+ const url = new URL(request.url);
617
+ const path = url.pathname;
618
+ const actorInstance = this.#runner.getActor(actorId);
619
+ if (!actorInstance) {
620
+ logger2().warn({
621
+ msg: "actor not found in #hwsCanHibernate",
622
+ actorId
623
+ });
624
+ return false;
625
+ }
626
+ const handler = this.#actors.get(actorId);
627
+ if (!handler) {
628
+ logger2().warn({
629
+ msg: "actor handler not found in #hwsCanHibernate",
630
+ actorId
631
+ });
632
+ return false;
633
+ }
634
+ if (!handler.actor) {
635
+ logger2().warn({
636
+ msg: "actor not found in #hwsCanHibernate",
637
+ actorId
638
+ });
639
+ return false;
640
+ }
641
+ logger2().debug({
642
+ msg: "no existing hibernatable websocket found",
643
+ gatewayId: _enginerunner.idToStr.call(void 0, gatewayId),
644
+ requestId: _enginerunner.idToStr.call(void 0, requestId)
645
+ });
646
+ if (path === _chunk4JVIG3SScjs.PATH_CONNECT) {
647
+ return true;
648
+ } else if (path === _chunk4JVIG3SScjs.PATH_WEBSOCKET_BASE || path.startsWith(_chunk4JVIG3SScjs.PATH_WEBSOCKET_PREFIX)) {
649
+ const definition = _chunkAUVH72REcjs.lookupInRegistry.call(void 0,
650
+ this.#config,
651
+ actorInstance.config.name
652
+ );
653
+ const canHibernateWebSocket = (_a = definition.config.options) == null ? void 0 : _a.canHibernateWebSocket;
654
+ if (canHibernateWebSocket === true) {
655
+ return true;
656
+ } else if (typeof canHibernateWebSocket === "function") {
657
+ try {
658
+ const newPath = _chunk4JVIG3SScjs.truncateRawWebSocketPathPrefix.call(void 0,
659
+ url.pathname
660
+ );
661
+ const truncatedRequest = new Request(
662
+ `http://actor${newPath}`,
663
+ request
664
+ );
665
+ const canHibernate = canHibernateWebSocket(truncatedRequest);
666
+ return canHibernate;
667
+ } catch (error) {
668
+ logger2().error({
669
+ msg: "error calling canHibernateWebSocket",
670
+ error
671
+ });
672
+ return false;
673
+ }
674
+ } else {
675
+ return false;
676
+ }
677
+ } else if (path === _chunk4JVIG3SScjs.PATH_INSPECTOR_CONNECT) {
678
+ return false;
679
+ } else {
680
+ logger2().warn({
681
+ msg: "unexpected path for getActorHibernationConfig",
682
+ path
683
+ });
684
+ return false;
685
+ }
686
+ }
687
+ async #hwsLoadAll(actorId) {
688
+ const actor2 = await this.loadActor(actorId);
689
+ return actor2.conns.values().map((conn) => {
690
+ const connStateManager = conn[_chunk4JVIG3SScjs.CONN_STATE_MANAGER_SYMBOL];
691
+ const hibernatable = connStateManager.hibernatableData;
692
+ if (!hibernatable) return void 0;
693
+ return {
694
+ gatewayId: hibernatable.gatewayId,
695
+ requestId: hibernatable.requestId,
696
+ serverMessageIndex: hibernatable.serverMessageIndex,
697
+ clientMessageIndex: hibernatable.clientMessageIndex,
698
+ path: hibernatable.requestPath,
699
+ headers: hibernatable.requestHeaders
700
+ };
701
+ }).filter((x) => x !== void 0).toArray();
702
+ }
703
+ async onBeforeActorStart(actor2) {
704
+ var _a;
705
+ const handler = this.#actors.get(actor2.id);
706
+ _invariant2.default.call(void 0, handler, "missing actor handler in onBeforeActorReady");
707
+ handler.actorStartError = void 0;
708
+ (_a = handler.actorStartPromise) == null ? void 0 : _a.resolve();
709
+ handler.actorStartPromise = void 0;
710
+ const metaEntries = await this.#hwsLoadAll(actor2.id);
711
+ await this.#runner.restoreHibernatingRequests(actor2.id, metaEntries);
712
+ }
713
+ onCreateConn(conn) {
714
+ const hibernatable = conn[_chunk4JVIG3SScjs.CONN_STATE_MANAGER_SYMBOL].hibernatableData;
715
+ if (!hibernatable) return;
716
+ this.#hwsMessageIndex.set(conn.id, {
717
+ serverMessageIndex: hibernatable.serverMessageIndex,
718
+ bufferedMessageSize: 0,
719
+ pendingAckFromMessageIndex: false,
720
+ pendingAckFromBufferSize: false
721
+ });
722
+ logger2().debug({
723
+ msg: "created #hwsMessageIndex entry",
724
+ connId: conn.id,
725
+ serverMessageIndex: hibernatable.serverMessageIndex
726
+ });
727
+ }
728
+ onDestroyConn(conn) {
729
+ this.#hwsMessageIndex.delete(conn.id);
730
+ logger2().debug({
731
+ msg: "removed #hwsMessageIndex entry",
732
+ connId: conn.id
733
+ });
734
+ }
735
+ onBeforePersistConn(conn) {
736
+ const stateManager = conn[_chunk4JVIG3SScjs.CONN_STATE_MANAGER_SYMBOL];
737
+ const hibernatable = stateManager.hibernatableDataOrError();
738
+ const entry = this.#hwsMessageIndex.get(conn.id);
739
+ if (!entry) {
740
+ logger2().warn({
741
+ msg: "missing EngineActorDriver.#hwsMessageIndex entry for conn",
742
+ connId: conn.id
743
+ });
744
+ return;
745
+ }
746
+ entry.pendingAckFromMessageIndex = hibernatable.serverMessageIndex > entry.serverMessageIndex;
747
+ entry.serverMessageIndex = hibernatable.serverMessageIndex;
748
+ }
749
+ onAfterPersistConn(conn) {
750
+ const stateManager = conn[_chunk4JVIG3SScjs.CONN_STATE_MANAGER_SYMBOL];
751
+ const hibernatable = stateManager.hibernatableDataOrError();
752
+ const entry = this.#hwsMessageIndex.get(conn.id);
753
+ if (!entry) {
754
+ logger2().warn({
755
+ msg: "missing EngineActorDriver.#hwsMessageIndex entry for conn",
756
+ connId: conn.id
757
+ });
758
+ return;
759
+ }
760
+ if (entry.pendingAckFromMessageIndex || entry.pendingAckFromBufferSize) {
761
+ this.#runner.sendHibernatableWebSocketMessageAck(
762
+ hibernatable.gatewayId,
763
+ hibernatable.requestId,
764
+ entry.serverMessageIndex
765
+ );
766
+ entry.pendingAckFromMessageIndex = false;
767
+ entry.pendingAckFromBufferSize = false;
768
+ entry.bufferedMessageSize = 0;
769
+ }
770
+ }
771
+ };
772
+
773
+ // src/drivers/engine/config.ts
774
+ var _v4 = require('zod/v4');
775
+ var EngineConfigSchemaBase = _chunkSAZZ4SB2cjs.ClientConfigSchemaBase.extend({
776
+ /** Unique key for this runner. Runners connecting a given key will replace any other runner connected with the same key. */
777
+ runnerKey: _v4.z.string().optional().transform((val) => _nullishCoalesce(val, () => ( _chunkPQZHDKRWcjs.getRivetRunnerKey.call(void 0, )))),
778
+ /** How many actors this runner can run. */
779
+ totalSlots: _v4.z.number().default(1e5)
780
+ });
781
+ var EngineConfigSchemaTransformed = EngineConfigSchemaBase.transform(
782
+ (config, ctx) => transformEngineConfig(config, ctx)
783
+ );
784
+ var EngineConfigSchema = EngineConfigSchemaTransformed.default(
785
+ () => EngineConfigSchemaTransformed.parse({})
786
+ );
787
+ function transformEngineConfig(config, ctx) {
788
+ return {
789
+ ..._chunkSAZZ4SB2cjs.transformClientConfig.call(void 0, config, ctx),
790
+ runnerKey: config.runnerKey
791
+ };
792
+ }
793
+
794
+ // src/drivers/engine/mod.ts
795
+ function createEngineDriver() {
796
+ return {
797
+ name: "engine",
798
+ displayName: "Engine",
799
+ manager: (config) => {
800
+ const clientConfig = _chunkSAZZ4SB2cjs.convertRegistryConfigToClientConfig.call(void 0, config);
801
+ return new (0, _chunkSAZZ4SB2cjs.RemoteManagerDriver)(clientConfig);
802
+ },
803
+ actor: (config, managerDriver, inlineClient) => {
804
+ return new EngineActorDriver(
805
+ config,
806
+ managerDriver,
807
+ inlineClient
808
+ );
809
+ },
810
+ autoStartActorDriver: true
811
+ };
812
+ }
813
+
814
+ // src/registry/config/legacy-runner.ts
815
+
816
+ var LegacyDriverConfigSchema = _v4.z.object({
817
+ /** Machine-readable name to identify this driver by. */
818
+ name: _v4.z.string(),
819
+ manager: _v4.z.custom(),
820
+ actor: _v4.z.custom()
821
+ });
822
+ var LegacyRunnerConfigSchemaUnmerged = _v4.z.object({
823
+ driver: LegacyDriverConfigSchema.optional(),
824
+ /** @experimental */
825
+ maxIncomingMessageSize: _v4.z.number().optional().default(65536),
826
+ /** @experimental */
827
+ maxOutgoingMessageSize: _v4.z.number().optional().default(1048576),
828
+ /** @experimental */
829
+ inspector: _chunk4JVIG3SScjs.InspectorConfigSchema,
830
+ /** @experimental */
831
+ disableDefaultServer: _v4.z.boolean().optional().default(false),
832
+ /** @experimental */
833
+ defaultServerPort: _v4.z.number().default(6420),
834
+ /** @experimental */
835
+ runEngine: _v4.z.boolean().optional().default(() => _chunkPQZHDKRWcjs.getRivetRunEngine.call(void 0, )),
836
+ /** @experimental */
837
+ runEngineVersion: _v4.z.string().optional().default(() => _nullishCoalesce(_chunkPQZHDKRWcjs.getRivetRunEngineVersion.call(void 0, ), () => ( _chunkPQZHDKRWcjs.VERSION))),
838
+ /** @experimental */
839
+ overrideServerAddress: _v4.z.string().optional(),
840
+ /** @experimental */
841
+ disableActorDriver: _v4.z.boolean().optional().default(false),
842
+ /**
843
+ * @experimental
844
+ *
845
+ * Whether to run runners normally or have them managed
846
+ * serverlessly (by the Rivet Engine for example).
847
+ */
848
+ runnerKind: _v4.z.enum(["serverless", "normal"]).optional().default(
849
+ () => _chunkPQZHDKRWcjs.getRivetRunnerKind.call(void 0, ) === "serverless" ? "serverless" : "normal"
850
+ ),
851
+ totalSlots: _v4.z.number().optional(),
852
+ /**
853
+ * @experimental
854
+ *
855
+ * Base path for the router. This is used to prefix all routes.
856
+ * For example, if the base path is `/api`, then the route `/actors` will be
857
+ * available at `/api/actors`.
858
+ */
859
+ basePath: _v4.z.string().optional().default("/"),
860
+ /**
861
+ * @experimental
862
+ *
863
+ * Disable welcome message.
864
+ * */
865
+ noWelcome: _v4.z.boolean().optional().default(false),
866
+ /**
867
+ * @experimental
868
+ * */
869
+ logging: _v4.z.object({
870
+ baseLogger: _v4.z.custom().optional(),
871
+ level: _chunkPQZHDKRWcjs.LogLevelSchema.optional()
872
+ }).optional().default(() => ({})),
873
+ /**
874
+ * @experimental
875
+ *
876
+ * Automatically configure serverless runners in the engine.
877
+ * Can only be used when runnerKind is "serverless".
878
+ * If true, uses default configuration. Can also provide custom configuration.
879
+ */
880
+ autoConfigureServerless: _v4.z.union([
881
+ _v4.z.boolean(),
882
+ _v4.z.object({
883
+ url: _v4.z.string().optional(),
884
+ headers: _v4.z.record(_v4.z.string(), _v4.z.string()).optional(),
885
+ maxRunners: _v4.z.number().optional(),
886
+ minRunners: _v4.z.number().optional(),
887
+ requestLifespan: _v4.z.number().optional(),
888
+ runnersMargin: _v4.z.number().optional(),
889
+ slotsPerRunner: _v4.z.number().optional(),
890
+ metadata: _v4.z.record(_v4.z.string(), _v4.z.unknown()).optional()
891
+ })
892
+ ]).optional(),
893
+ // This is a function to allow for lazy configuration of upgradeWebSocket on the
894
+ // fly. This is required since the dependencies that upgradeWebSocket
895
+ // (specifically Node.js) can sometimes only be specified after the router is
896
+ // created or must be imported async using `await import(...)`
897
+ getUpgradeWebSocket: _v4.z.custom().optional(),
898
+ /** @experimental */
899
+ token: _v4.z.string().optional().transform((v) => v || _chunkPQZHDKRWcjs.getRivetToken.call(void 0, ))
900
+ }).merge(EngineConfigSchemaBase);
901
+ var LegacyRunnerConfigSchemaTransformed = LegacyRunnerConfigSchemaUnmerged.transform((config, ctx) => ({
902
+ ...config,
903
+ ...transformEngineConfig(config, ctx)
904
+ }));
905
+ var LegacyRunnerConfigSchema = LegacyRunnerConfigSchemaTransformed.default(
906
+ () => LegacyRunnerConfigSchemaTransformed.parse({})
907
+ );
908
+
909
+ // runtime/index.ts
910
+
911
+
912
+ // src/drivers/default.ts
913
+ function chooseDefaultDriver(config) {
914
+ if (config.endpoint && config.driver) {
915
+ throw new (0, _chunkL47L3ZWJcjs.UserError)(
916
+ "Cannot specify both 'endpoint' and 'driver' in configuration"
917
+ );
918
+ }
919
+ if (config.driver) {
920
+ return config.driver;
921
+ }
922
+ if (config.endpoint || config.token) {
923
+ _chunkPVOE6BU7cjs.loggerWithoutContext.call(void 0, ).debug({
924
+ msg: "using rivet engine driver",
925
+ endpoint: config.endpoint
926
+ });
927
+ return createEngineDriver();
928
+ }
929
+ _chunkPVOE6BU7cjs.loggerWithoutContext.call(void 0, ).debug({
930
+ msg: "using default file system driver",
931
+ storagePath: config.storagePath
932
+ });
933
+ return _chunkAUVH72REcjs.createFileSystemOrMemoryDriver.call(void 0, true, {
934
+ path: config.storagePath
935
+ });
936
+ }
937
+
938
+ // src/engine-process/log.ts
939
+ function logger3() {
940
+ return _chunkPQZHDKRWcjs.getLogger.call(void 0, "engine-process");
941
+ }
942
+
943
+ // src/engine-process/mod.ts
944
+ var ENGINE_BASE_URL = "https://releases.rivet.dev/rivet";
945
+ var ENGINE_BINARY_NAME = "rivet-engine";
946
+ async function ensureEngineProcess(options) {
947
+ _chunk4JVIG3SScjs.importNodeDependencies.call(void 0, );
948
+ logger3().debug({
949
+ msg: "ensuring engine process",
950
+ version: options.version
951
+ });
952
+ const path = _chunk4JVIG3SScjs.getNodePath.call(void 0, );
953
+ const storageRoot = _chunkAUVH72REcjs.getStoragePath.call(void 0, );
954
+ const binDir = path.join(storageRoot, "bin");
955
+ const varDir = path.join(storageRoot, "var");
956
+ const logsDir = path.join(varDir, "logs", "rivet-engine");
957
+ await _chunkAUVH72REcjs.ensureDirectoryExists.call(void 0, binDir);
958
+ await _chunkAUVH72REcjs.ensureDirectoryExists.call(void 0, varDir);
959
+ await _chunkAUVH72REcjs.ensureDirectoryExists.call(void 0, logsDir);
960
+ if (await isEngineRunning()) {
961
+ try {
962
+ const health = await waitForEngineHealth();
963
+ logger3().debug({
964
+ msg: "engine already running and healthy",
965
+ version: health.version
966
+ });
967
+ return;
968
+ } catch (error) {
969
+ logger3().warn({
970
+ msg: "existing engine process not healthy, cannot restart automatically",
971
+ error
972
+ });
973
+ throw new Error(
974
+ "Engine process exists but is not healthy. Please manually stop the process on port 6420 and retry."
975
+ );
976
+ }
977
+ }
978
+ const executableName = process.platform === "win32" ? `${ENGINE_BINARY_NAME}-${options.version}.exe` : `${ENGINE_BINARY_NAME}-${options.version}`;
979
+ const binaryPath = path.join(binDir, executableName);
980
+ await downloadEngineBinaryIfNeeded(binaryPath, options.version, varDir);
981
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/:/g, "-").replace(/\./g, "-");
982
+ const stdoutLogPath = path.join(logsDir, `engine-${timestamp}-stdout.log`);
983
+ const stderrLogPath = path.join(logsDir, `engine-${timestamp}-stderr.log`);
984
+ const fsSync = _chunk4JVIG3SScjs.getNodeFsSync.call(void 0, );
985
+ const stdoutStream = fsSync.createWriteStream(stdoutLogPath, {
986
+ flags: "a"
987
+ });
988
+ const stderrStream = fsSync.createWriteStream(stderrLogPath, {
989
+ flags: "a"
990
+ });
991
+ logger3().debug({
992
+ msg: "creating engine log files",
993
+ stdout: stdoutLogPath,
994
+ stderr: stderrLogPath
995
+ });
996
+ const childProcess = _chunk4JVIG3SScjs.getNodeChildProcess.call(void 0, );
997
+ const child = childProcess.spawn(binaryPath, ["start"], {
998
+ cwd: path.dirname(binaryPath),
999
+ stdio: ["inherit", "pipe", "pipe"],
1000
+ env: {
1001
+ ...process.env,
1002
+ // Development environment overrides for Rivet Engine.
1003
+ //
1004
+ // NOTE: When modifying these env vars, also update scripts/run/dev-env.sh
1005
+ // to keep them in sync for manual engine runs.
1006
+ //
1007
+ // In development, runners can be terminated without a graceful
1008
+ // shutdown (i.e. SIGKILL instead of SIGTERM). This is treated as a
1009
+ // crash by Rivet Engine in production and implements a backoff for
1010
+ // rescheduling actors in case of a crash loop.
1011
+ //
1012
+ // This is problematic in development since this will cause actors
1013
+ // to become unresponsive if frequently killing your dev server.
1014
+ //
1015
+ // We reduce the timeouts for resetting a runner as healthy in
1016
+ // order to account for this.
1017
+ RIVET__PEGBOARD__RETRY_RESET_DURATION: "100",
1018
+ RIVET__PEGBOARD__BASE_RETRY_TIMEOUT: "100",
1019
+ // Set max exponent to 1 to have a maximum of base_retry_timeout
1020
+ RIVET__PEGBOARD__RESCHEDULE_BACKOFF_MAX_EXPONENT: "1",
1021
+ // Reduce thresholds for faster development iteration
1022
+ //
1023
+ // Default ping interval is 3s, this gives a 2s & 4s grace
1024
+ RIVET__PEGBOARD__RUNNER_ELIGIBLE_THRESHOLD: "5000",
1025
+ RIVET__PEGBOARD__RUNNER_LOST_THRESHOLD: "7000",
1026
+ // Allow faster metadata polling for hot-reload in development (in milliseconds)
1027
+ RIVET__PEGBOARD__MIN_METADATA_POLL_INTERVAL: "1000",
1028
+ // Reduce shutdown durations for faster development iteration (in seconds)
1029
+ RIVET__RUNTIME__WORKER__SHUTDOWN_DURATION: "1",
1030
+ RIVET__RUNTIME__GUARD_SHUTDOWN_DURATION: "1",
1031
+ // Force exit after this duration (must be > worker and guard shutdown durations)
1032
+ RIVET__RUNTIME__FORCE_SHUTDOWN_DURATION: "2"
1033
+ }
1034
+ });
1035
+ if (!child.pid) {
1036
+ throw new Error("failed to spawn rivet engine process");
1037
+ }
1038
+ if (child.stdout) {
1039
+ child.stdout.pipe(stdoutStream);
1040
+ }
1041
+ const stderrChunks = [];
1042
+ if (child.stderr) {
1043
+ child.stderr.on("data", (chunk) => {
1044
+ stderrChunks.push(chunk);
1045
+ });
1046
+ child.stderr.pipe(stderrStream);
1047
+ }
1048
+ logger3().debug({
1049
+ msg: "spawned engine process",
1050
+ pid: child.pid,
1051
+ cwd: path.dirname(binaryPath)
1052
+ });
1053
+ child.once("exit", (code, signal) => {
1054
+ const stderrOutput = Buffer.concat(stderrChunks).toString("utf-8");
1055
+ if (stderrOutput.includes("LOCK: Resource temporarily unavailable")) {
1056
+ logger3().error({
1057
+ msg: "another instance of rivet engine is unexpectedly running, this is an internal error",
1058
+ code,
1059
+ signal,
1060
+ stdoutLog: stdoutLogPath,
1061
+ stderrLog: stderrLogPath,
1062
+ issues: "https://github.com/rivet-dev/rivetkit/issues",
1063
+ support: "https://rivet.dev/discord"
1064
+ });
1065
+ } else if (stderrOutput.includes("Rivet Engine has been rolled back to a previous version")) {
1066
+ logger3().error({
1067
+ msg: "rivet engine version downgrade detected",
1068
+ hint: `You attempted to downgrade the RivetKit version in development. To fix this, nuke the database by running: '${binaryPath}' database nuke --yes`,
1069
+ code,
1070
+ signal,
1071
+ stdoutLog: stdoutLogPath,
1072
+ stderrLog: stderrLogPath
1073
+ });
1074
+ } else {
1075
+ logger3().warn({
1076
+ msg: "engine process exited, please report this error",
1077
+ code,
1078
+ signal,
1079
+ stdoutLog: stdoutLogPath,
1080
+ stderrLog: stderrLogPath,
1081
+ issues: "https://github.com/rivet-dev/rivetkit/issues",
1082
+ support: "https://rivet.dev/discord"
1083
+ });
1084
+ }
1085
+ stdoutStream.end();
1086
+ stderrStream.end();
1087
+ });
1088
+ child.once("error", (error) => {
1089
+ logger3().error({
1090
+ msg: "engine process failed",
1091
+ error
1092
+ });
1093
+ stdoutStream.end();
1094
+ stderrStream.end();
1095
+ });
1096
+ await waitForEngineHealth();
1097
+ logger3().info({
1098
+ msg: "engine process started",
1099
+ pid: child.pid,
1100
+ version: options.version,
1101
+ logs: {
1102
+ stdout: stdoutLogPath,
1103
+ stderr: stderrLogPath
1104
+ }
1105
+ });
1106
+ }
1107
+ async function downloadEngineBinaryIfNeeded(binaryPath, version, varDir) {
1108
+ const binaryExists = await fileExists(binaryPath);
1109
+ if (binaryExists) {
1110
+ logger3().debug({
1111
+ msg: "engine binary already cached",
1112
+ version,
1113
+ path: binaryPath
1114
+ });
1115
+ return;
1116
+ }
1117
+ const { targetTriplet, extension } = resolveTargetTriplet();
1118
+ const remoteFile = `${ENGINE_BINARY_NAME}-${targetTriplet}${extension}`;
1119
+ const downloadUrl = `${ENGINE_BASE_URL}/${version}/engine/${remoteFile}`;
1120
+ logger3().info({
1121
+ msg: "downloading engine binary",
1122
+ url: downloadUrl,
1123
+ path: binaryPath,
1124
+ version
1125
+ });
1126
+ const response = await fetch(downloadUrl);
1127
+ if (!response.ok || !response.body) {
1128
+ throw new Error(
1129
+ `failed to download rivet engine binary from ${downloadUrl}: ${response.status} ${response.statusText}`
1130
+ );
1131
+ }
1132
+ const crypto2 = _chunk4JVIG3SScjs.getNodeCrypto.call(void 0, );
1133
+ const tempPath = `${binaryPath}.${crypto2.randomUUID()}.tmp`;
1134
+ const startTime = Date.now();
1135
+ logger3().debug({
1136
+ msg: "starting binary download",
1137
+ tempPath,
1138
+ contentLength: response.headers.get("content-length")
1139
+ });
1140
+ const slowDownloadWarning = setTimeout(() => {
1141
+ logger3().warn({
1142
+ msg: "engine binary download is taking longer than expected, please be patient",
1143
+ version
1144
+ });
1145
+ }, 5e3);
1146
+ try {
1147
+ const stream = _chunk4JVIG3SScjs.getNodeStream.call(void 0, );
1148
+ const fsSync = _chunk4JVIG3SScjs.getNodeFsSync.call(void 0, );
1149
+ await stream.pipeline(
1150
+ response.body,
1151
+ fsSync.createWriteStream(tempPath)
1152
+ );
1153
+ clearTimeout(slowDownloadWarning);
1154
+ const fs = _chunk4JVIG3SScjs.getNodeFs.call(void 0, );
1155
+ const stats = await fs.stat(tempPath);
1156
+ const downloadDuration = Date.now() - startTime;
1157
+ if (process.platform !== "win32") {
1158
+ await fs.chmod(tempPath, 493);
1159
+ }
1160
+ await fs.rename(tempPath, binaryPath);
1161
+ logger3().debug({
1162
+ msg: "engine binary download complete",
1163
+ version,
1164
+ path: binaryPath,
1165
+ size: stats.size,
1166
+ durationMs: downloadDuration
1167
+ });
1168
+ logger3().info({
1169
+ msg: "engine binary downloaded",
1170
+ version,
1171
+ path: binaryPath
1172
+ });
1173
+ } catch (error) {
1174
+ clearTimeout(slowDownloadWarning);
1175
+ logger3().warn({
1176
+ msg: "engine download failed, please report this error",
1177
+ tempPath,
1178
+ error,
1179
+ issues: "https://github.com/rivet-dev/rivetkit/issues",
1180
+ support: "https://rivet.dev/discord"
1181
+ });
1182
+ try {
1183
+ const fs = _chunk4JVIG3SScjs.getNodeFs.call(void 0, );
1184
+ await fs.unlink(tempPath);
1185
+ } catch (unlinkError) {
1186
+ }
1187
+ throw error;
1188
+ }
1189
+ }
1190
+ function resolveTargetTriplet() {
1191
+ return resolveTargetTripletFor(process.platform, process.arch);
1192
+ }
1193
+ function resolveTargetTripletFor(platform, arch) {
1194
+ switch (platform) {
1195
+ case "darwin":
1196
+ if (arch === "arm64") {
1197
+ return { targetTriplet: "aarch64-apple-darwin", extension: "" };
1198
+ }
1199
+ if (arch === "x64") {
1200
+ return { targetTriplet: "x86_64-apple-darwin", extension: "" };
1201
+ }
1202
+ break;
1203
+ case "linux":
1204
+ if (arch === "x64") {
1205
+ return {
1206
+ targetTriplet: "x86_64-unknown-linux-musl",
1207
+ extension: ""
1208
+ };
1209
+ }
1210
+ break;
1211
+ case "win32":
1212
+ if (arch === "x64") {
1213
+ return {
1214
+ targetTriplet: "x86_64-pc-windows-gnu",
1215
+ extension: ".exe"
1216
+ };
1217
+ }
1218
+ break;
1219
+ }
1220
+ throw new Error(
1221
+ `unsupported platform for rivet engine binary: ${platform}/${arch}`
1222
+ );
1223
+ }
1224
+ async function isEngineRunning() {
1225
+ return await checkIfEngineAlreadyRunningOnPort(_chunk4JVIG3SScjs.ENGINE_PORT);
1226
+ }
1227
+ async function checkIfEngineAlreadyRunningOnPort(port) {
1228
+ let response;
1229
+ try {
1230
+ response = await fetch(`http://127.0.0.1:${port}/health`);
1231
+ } catch (err) {
1232
+ return false;
1233
+ }
1234
+ if (response.ok) {
1235
+ const health = await response.json();
1236
+ if (health.runtime === "engine") {
1237
+ logger3().debug({
1238
+ msg: "rivet engine already running on port",
1239
+ port
1240
+ });
1241
+ return true;
1242
+ } else if (health.runtime === "rivetkit") {
1243
+ logger3().error({
1244
+ msg: "another rivetkit process is already running on port",
1245
+ port
1246
+ });
1247
+ throw new Error(
1248
+ "RivetKit process already running on port 6420, stop that process and restart this."
1249
+ );
1250
+ } else {
1251
+ throw new Error(
1252
+ "Unknown process running on port 6420, cannot identify what it is."
1253
+ );
1254
+ }
1255
+ }
1256
+ return false;
1257
+ }
1258
+ async function fileExists(filePath) {
1259
+ try {
1260
+ const fs = _chunk4JVIG3SScjs.getNodeFs.call(void 0, );
1261
+ await fs.access(filePath);
1262
+ return true;
1263
+ } catch (e) {
1264
+ return false;
1265
+ }
1266
+ }
1267
+ var HEALTH_MAX_WAIT = 1e4;
1268
+ var HEALTH_INTERVAL = 100;
1269
+ async function waitForEngineHealth() {
1270
+ const maxRetries = Math.ceil(HEALTH_MAX_WAIT / HEALTH_INTERVAL);
1271
+ logger3().debug({ msg: "waiting for engine health check" });
1272
+ for (let i = 0; i < maxRetries; i++) {
1273
+ try {
1274
+ const response = await fetch(`${_chunk4JVIG3SScjs.ENGINE_ENDPOINT}/health`, {
1275
+ signal: AbortSignal.timeout(1e3)
1276
+ });
1277
+ if (response.ok) {
1278
+ const health = await response.json();
1279
+ logger3().debug({ msg: "engine health check passed" });
1280
+ return health;
1281
+ }
1282
+ } catch (error) {
1283
+ logger3().debug({ msg: "engine health check failed", error });
1284
+ if (i === maxRetries - 1) {
1285
+ throw new Error(
1286
+ `engine health check failed after ${maxRetries} retries: ${error}`
1287
+ );
1288
+ }
1289
+ }
1290
+ if (i < maxRetries - 1) {
1291
+ logger3().trace({
1292
+ msg: "engine not ready, retrying",
1293
+ attempt: i + 1,
1294
+ maxRetries
1295
+ });
1296
+ await new Promise(
1297
+ (resolve) => setTimeout(resolve, HEALTH_INTERVAL)
1298
+ );
1299
+ }
1300
+ }
1301
+ throw new Error(`engine health check failed after ${maxRetries} retries`);
1302
+ }
1303
+
1304
+ // src/inspector/utils.ts
1305
+ var _factory = require('hono/factory');
1306
+ function getInspectorUrl(config, managerPort) {
1307
+ if (!config.inspector.enabled) return void 0;
1308
+ const base = _nullishCoalesce(config.inspector.defaultEndpoint, () => ( `http://127.0.0.1:${managerPort}`));
1309
+ return new URL("/ui/", base).href;
1310
+ }
1311
+
1312
+ // src/serverless/log.ts
1313
+ function logger4() {
1314
+ return _chunkPQZHDKRWcjs.getLogger.call(void 0, "serverless");
1315
+ }
1316
+
1317
+ // src/serverless/configure.ts
1318
+
1319
+ async function configureServerlessRunner(config) {
1320
+ logger4().debug("configuring serverless runner");
1321
+ try {
1322
+ if (!config.namespace) {
1323
+ throw new Error(
1324
+ "namespace is required for serverless configuration"
1325
+ );
1326
+ }
1327
+ if (!config.endpoint) {
1328
+ throw new Error(
1329
+ "endpoint is required for serverless configuration"
1330
+ );
1331
+ }
1332
+ const customConfig = config.serverless.configureRunnerPool;
1333
+ _invariant2.default.call(void 0, customConfig, "configureRunnerPool should exist");
1334
+ const clientConfig = _chunkSAZZ4SB2cjs.convertRegistryConfigToClientConfig.call(void 0, config);
1335
+ logger4().debug({
1336
+ msg: "fetching datacenters",
1337
+ endpoint: config.endpoint
1338
+ });
1339
+ const dcsRes = await _chunkSAZZ4SB2cjs.getDatacenters.call(void 0, clientConfig);
1340
+ const runnerName = _nullishCoalesce(customConfig.name, () => ( "default"));
1341
+ logger4().debug({
1342
+ msg: "configuring serverless runner",
1343
+ runnerName,
1344
+ namespace: config.namespace
1345
+ });
1346
+ const serverlessConfig = {
1347
+ serverless: {
1348
+ url: customConfig.url,
1349
+ headers: _nullishCoalesce(customConfig.headers, () => ( {})),
1350
+ max_runners: _nullishCoalesce(customConfig.maxRunners, () => ( 1e3)),
1351
+ min_runners: _nullishCoalesce(customConfig.minRunners, () => ( 0)),
1352
+ request_lifespan: _nullishCoalesce(customConfig.requestLifespan, () => ( 15 * 60)),
1353
+ runners_margin: _nullishCoalesce(customConfig.runnersMargin, () => ( 0)),
1354
+ slots_per_runner: _nullishCoalesce(customConfig.slotsPerRunner, () => ( 1)),
1355
+ metadata_poll_interval: _nullishCoalesce(customConfig.metadataPollInterval, () => ( 1e3))
1356
+ },
1357
+ metadata: _nullishCoalesce(customConfig.metadata, () => ( {})),
1358
+ drain_on_version_upgrade: _nullishCoalesce(customConfig.drainOnVersionUpgrade, () => ( true)),
1359
+ metadataPollInterval: _nullishCoalesce(customConfig.metadataPollInterval, () => ( 1e3))
1360
+ };
1361
+ await _chunkSAZZ4SB2cjs.updateRunnerConfig.call(void 0, clientConfig, runnerName, {
1362
+ datacenters: Object.fromEntries(
1363
+ dcsRes.datacenters.map((dc) => [dc.name, serverlessConfig])
1364
+ )
1365
+ });
1366
+ logger4().info({
1367
+ msg: "serverless runner configured successfully",
1368
+ runnerName,
1369
+ namespace: config.namespace
1370
+ });
1371
+ } catch (error) {
1372
+ logger4().error({
1373
+ msg: "failed to configure serverless runner, validate endpoint is configured correctly then restart this process",
1374
+ error
1375
+ });
1376
+ }
1377
+ }
1378
+
1379
+ // src/serverless/router.ts
1380
+
1381
+
1382
+ // src/manager/router-schema.ts
1383
+
1384
+ var ServerlessStartHeadersSchema = _v4.z.object({
1385
+ endpoint: _v4.z.string({
1386
+ error: "x-rivet-endpoint header is required"
1387
+ }),
1388
+ token: _v4.z.string({ error: "x-rivet-token header must be a string" }).optional(),
1389
+ totalSlots: _v4.z.coerce.number({
1390
+ error: "x-rivet-total-slots header must be a number"
1391
+ }).int({ error: "x-rivet-total-slots header must be an integer" }).gte(1, { error: "x-rivet-total-slots header must be positive" }),
1392
+ runnerName: _v4.z.string({
1393
+ error: "x-rivet-runner-name header is required"
1394
+ }),
1395
+ namespace: _v4.z.string({
1396
+ error: "x-rivet-namespace-name header is required"
1397
+ })
1398
+ });
1399
+
1400
+ // src/serverless/router.ts
1401
+ function buildServerlessRouter(driverConfig, config) {
1402
+ return _chunk4JVIG3SScjs.createRouter.call(void 0, config.serverless.basePath, (router) => {
1403
+ router.get("/", (c) => {
1404
+ return c.text(
1405
+ "This is a RivetKit server.\n\nLearn more at https://rivetkit.org"
1406
+ );
1407
+ });
1408
+ router.get("/start", async (c) => {
1409
+ var _a;
1410
+ const parseResult = ServerlessStartHeadersSchema.safeParse({
1411
+ endpoint: c.req.header("x-rivet-endpoint"),
1412
+ token: _nullishCoalesce(c.req.header("x-rivet-token"), () => ( void 0)),
1413
+ totalSlots: c.req.header("x-rivet-total-slots"),
1414
+ runnerName: c.req.header("x-rivet-runner-name"),
1415
+ namespace: c.req.header("x-rivet-namespace-name")
1416
+ });
1417
+ if (!parseResult.success) {
1418
+ throw new (0, _chunkL47L3ZWJcjs.InvalidRequest)(
1419
+ _nullishCoalesce(((_a = parseResult.error.issues[0]) == null ? void 0 : _a.message), () => ( "invalid serverless start headers"))
1420
+ );
1421
+ }
1422
+ const { endpoint, token, totalSlots, runnerName, namespace } = parseResult.data;
1423
+ logger4().debug({
1424
+ msg: "received serverless runner start request",
1425
+ endpoint,
1426
+ totalSlots,
1427
+ runnerName,
1428
+ namespace
1429
+ });
1430
+ if (config.endpoint) {
1431
+ if (!endpointsMatch(endpoint, config.endpoint)) {
1432
+ throw new (0, _chunkL47L3ZWJcjs.EndpointMismatch)(config.endpoint, endpoint);
1433
+ }
1434
+ if (namespace !== config.namespace) {
1435
+ throw new (0, _chunkL47L3ZWJcjs.NamespaceMismatch)(config.namespace, namespace);
1436
+ }
1437
+ }
1438
+ const newConfig = {
1439
+ ...config,
1440
+ endpoint,
1441
+ namespace,
1442
+ token,
1443
+ runner: {
1444
+ ...config.runner,
1445
+ totalSlots,
1446
+ runnerName,
1447
+ // Not supported on serverless
1448
+ runnerKey: void 0
1449
+ }
1450
+ };
1451
+ const managerDriver = new (0, _chunkSAZZ4SB2cjs.RemoteManagerDriver)(
1452
+ _chunkSAZZ4SB2cjs.convertRegistryConfigToClientConfig.call(void 0, newConfig)
1453
+ );
1454
+ const client = _chunkSAZZ4SB2cjs.createClientWithDriver.call(void 0, managerDriver);
1455
+ const actorDriver = driverConfig.actor(
1456
+ newConfig,
1457
+ managerDriver,
1458
+ client
1459
+ );
1460
+ _invariant2.default.call(void 0,
1461
+ actorDriver.serverlessHandleStart,
1462
+ "missing serverlessHandleStart on ActorDriver"
1463
+ );
1464
+ return await actorDriver.serverlessHandleStart(c);
1465
+ });
1466
+ router.get("/health", (c) => _chunk4JVIG3SScjs.handleHealthRequest.call(void 0, c));
1467
+ router.get(
1468
+ "/metadata",
1469
+ (c) => _chunk4JVIG3SScjs.handleMetadataRequest.call(void 0,
1470
+ c,
1471
+ config,
1472
+ { serverless: {} },
1473
+ config.publicEndpoint,
1474
+ config.publicNamespace,
1475
+ config.publicToken
1476
+ )
1477
+ );
1478
+ });
1479
+ }
1480
+ function normalizeEndpointUrl(url) {
1481
+ try {
1482
+ const parsed = new URL(url);
1483
+ const pathname = parsed.pathname === "/" ? "/" : parsed.pathname.replace(/\/+$/, "");
1484
+ let hostname = isLoopbackAddress(parsed.hostname) ? "localhost" : parsed.hostname;
1485
+ hostname = normalizeRegionalHostname(hostname);
1486
+ const host = parsed.port ? `${hostname}:${parsed.port}` : hostname;
1487
+ return `${parsed.protocol}//${host}${pathname}`;
1488
+ } catch (e2) {
1489
+ return null;
1490
+ }
1491
+ }
1492
+ function normalizeRegionalHostname(hostname) {
1493
+ if (!hostname.endsWith(".rivet.dev")) {
1494
+ return hostname;
1495
+ }
1496
+ if (!hostname.startsWith("api-")) {
1497
+ return hostname;
1498
+ }
1499
+ const withoutPrefix = hostname.slice(4);
1500
+ const firstDotIndex = withoutPrefix.indexOf(".");
1501
+ if (firstDotIndex === -1) {
1502
+ return hostname;
1503
+ }
1504
+ const domain = withoutPrefix.slice(firstDotIndex + 1);
1505
+ return `api.${domain}`;
1506
+ }
1507
+ function endpointsMatch(a, b) {
1508
+ const normalizedA = normalizeEndpointUrl(a);
1509
+ const normalizedB = normalizeEndpointUrl(b);
1510
+ if (normalizedA === null || normalizedB === null) {
1511
+ return a === b;
1512
+ }
1513
+ return normalizedA === normalizedB;
1514
+ }
1515
+ function isLoopbackAddress(hostname) {
1516
+ return hostname === "127.0.0.1" || hostname === "0.0.0.0" || hostname === "::1" || hostname === "[::1]";
1517
+ }
1518
+
1519
+ // runtime/index.ts
1520
+ function logLine(label, value) {
1521
+ const padding = " ".repeat(Math.max(0, 13 - label.length));
1522
+ console.log(` - ${label}:${padding}${value}`);
1523
+ }
1524
+ var Runtime = class _Runtime {
1525
+ #registry;
1526
+ #config;
1527
+ #driver;
1528
+ #managerDriver;
1529
+ #startKind;
1530
+
1531
+ #serverlessRouter;
1532
+ get config() {
1533
+ return this.#config;
1534
+ }
1535
+ get driver() {
1536
+ return this.#driver;
1537
+ }
1538
+ get managerDriver() {
1539
+ return this.#managerDriver;
1540
+ }
1541
+ /** Use Runtime.create() instead */
1542
+ constructor(registry, config, driver, managerDriver, managerPort) {
1543
+ this.#registry = registry;
1544
+ this.#config = config;
1545
+ this.#driver = driver;
1546
+ this.#managerDriver = managerDriver;
1547
+ this.managerPort = managerPort;
1548
+ }
1549
+ static async create(registry) {
1550
+ var _a, _b, _c;
1551
+ _chunk4JVIG3SScjs.logger.call(void 0, ).info("rivetkit starting");
1552
+ const config = registry.parseConfig();
1553
+ if ((_a = config.logging) == null ? void 0 : _a.baseLogger) {
1554
+ _chunkPQZHDKRWcjs.configureBaseLogger.call(void 0, config.logging.baseLogger);
1555
+ } else {
1556
+ _chunkPQZHDKRWcjs.configureDefaultLogger.call(void 0, (_b = config.logging) == null ? void 0 : _b.level);
1557
+ }
1558
+ _invariant2.default.call(void 0,
1559
+ !(config.serverless.spawnEngine && config.serveManager),
1560
+ "cannot specify both spawnEngine and serveManager"
1561
+ );
1562
+ const driver = chooseDefaultDriver(config);
1563
+ const managerDriver = driver.manager(config);
1564
+ let managerPort;
1565
+ if (config.serverless.spawnEngine) {
1566
+ managerPort = _chunk4JVIG3SScjs.ENGINE_PORT;
1567
+ _chunk4JVIG3SScjs.logger.call(void 0, ).debug({
1568
+ msg: "spawning engine",
1569
+ version: config.serverless.engineVersion
1570
+ });
1571
+ await ensureEngineProcess({
1572
+ version: config.serverless.engineVersion
1573
+ });
1574
+ } else if (config.serveManager) {
1575
+ const configuredManagerPort = config.managerPort;
1576
+ const serveRuntime = _chunkPQZHDKRWcjs.detectRuntime.call(void 0, );
1577
+ let upgradeWebSocket;
1578
+ const getUpgradeWebSocket = () => upgradeWebSocket;
1579
+ managerDriver.setGetUpgradeWebSocket(getUpgradeWebSocket);
1580
+ const { router: managerRouter } = _chunk4JVIG3SScjs.buildManagerRouter.call(void 0,
1581
+ config,
1582
+ managerDriver,
1583
+ getUpgradeWebSocket,
1584
+ serveRuntime
1585
+ );
1586
+ managerPort = await _chunk4JVIG3SScjs.findFreePort.call(void 0, config.managerPort);
1587
+ _chunk4JVIG3SScjs.logger.call(void 0, ).debug({
1588
+ msg: "serving manager",
1589
+ port: managerPort
1590
+ });
1591
+ if (config.publicEndpoint === `http://127.0.0.1:${configuredManagerPort}`) {
1592
+ config.publicEndpoint = `http://127.0.0.1:${managerPort}`;
1593
+ config.serverless.publicEndpoint = config.publicEndpoint;
1594
+ }
1595
+ config.managerPort = managerPort;
1596
+ const out = await _chunk4JVIG3SScjs.crossPlatformServe.call(void 0,
1597
+ config,
1598
+ managerPort,
1599
+ managerRouter,
1600
+ serveRuntime
1601
+ );
1602
+ upgradeWebSocket = out.upgradeWebSocket;
1603
+ }
1604
+ const runtime = new _Runtime(
1605
+ registry,
1606
+ config,
1607
+ driver,
1608
+ managerDriver,
1609
+ managerPort
1610
+ );
1611
+ const driverLog = _nullishCoalesce(((_c = managerDriver.extraStartupLog) == null ? void 0 : _c.call(managerDriver)), () => ( {}));
1612
+ _chunk4JVIG3SScjs.logger.call(void 0, ).info({
1613
+ msg: "rivetkit ready",
1614
+ driver: driver.name,
1615
+ definitions: Object.keys(config.use).length,
1616
+ ...driverLog
1617
+ });
1618
+ return runtime;
1619
+ }
1620
+ startServerless() {
1621
+ if (this.#startKind === "serverless") return;
1622
+ _invariant2.default.call(void 0, !this.#startKind, "Runtime already started as runner");
1623
+ this.#startKind = "serverless";
1624
+ this.#serverlessRouter = buildServerlessRouter(
1625
+ this.#driver,
1626
+ this.#config
1627
+ ).router;
1628
+ this.#printWelcome();
1629
+ if (this.#config.serverless.configureRunnerPool) {
1630
+ configureServerlessRunner(this.#config);
1631
+ }
1632
+ }
1633
+ startRunner() {
1634
+ if (this.#startKind === "runner") return;
1635
+ _invariant2.default.call(void 0, !this.#startKind, "Runtime already started as serverless");
1636
+ this.#startKind = "runner";
1637
+ if (this.#config.runner && this.#driver.autoStartActorDriver) {
1638
+ _chunk4JVIG3SScjs.logger.call(void 0, ).debug("starting actor driver");
1639
+ const inlineClient = _chunkSAZZ4SB2cjs.createClientWithDriver.call(void 0,
1640
+ this.#managerDriver
1641
+ );
1642
+ this.#driver.actor(this.#config, this.#managerDriver, inlineClient);
1643
+ }
1644
+ this.#printWelcome();
1645
+ }
1646
+ #printWelcome() {
1647
+ if (this.#config.noWelcome) return;
1648
+ const inspectorUrl = this.managerPort ? getInspectorUrl(this.#config, this.managerPort) : void 0;
1649
+ console.log();
1650
+ console.log(
1651
+ ` RivetKit ${_chunkPQZHDKRWcjs.package_default.version} (${this.#driver.displayName} - ${this.#startKind === "serverless" ? "Serverless" : "Runner"})`
1652
+ );
1653
+ if (this.#config.namespace !== "default") {
1654
+ logLine("Namespace", this.#config.namespace);
1655
+ }
1656
+ if (this.#config.endpoint) {
1657
+ const endpointType = this.#config.serverless.spawnEngine ? "local native" : this.#config.serveManager ? "local manager" : "remote";
1658
+ logLine("Endpoint", `${this.#config.endpoint} (${endpointType})`);
1659
+ }
1660
+ if (this.#startKind === "serverless" && this.#config.publicEndpoint) {
1661
+ logLine("Client", this.#config.publicEndpoint);
1662
+ }
1663
+ if (inspectorUrl && this.#config.inspector.enabled) {
1664
+ logLine("Inspector", inspectorUrl);
1665
+ }
1666
+ const actorCount = Object.keys(this.#config.use).length;
1667
+ logLine("Actors", actorCount.toString());
1668
+ const displayInfo = this.#managerDriver.displayInformation();
1669
+ for (const [k, v] of Object.entries(displayInfo.properties)) {
1670
+ logLine(k, v);
1671
+ }
1672
+ console.log();
1673
+ }
1674
+ /** Handle serverless request */
1675
+ handleServerlessRequest(request) {
1676
+ _invariant2.default.call(void 0,
1677
+ this.#startKind === "serverless",
1678
+ "not started as serverless"
1679
+ );
1680
+ _invariant2.default.call(void 0, this.#serverlessRouter, "serverless router not initialized");
1681
+ return this.#serverlessRouter.fetch(request);
1682
+ }
1683
+ };
1684
+
1685
+ // src/registry/index.ts
1686
+ var Registry = class {
1687
+ #config;
1688
+ get config() {
1689
+ return this.#config;
1690
+ }
1691
+ parseConfig() {
1692
+ return _chunk4JVIG3SScjs.RegistryConfigSchema.parse(this.#config);
1693
+ }
1694
+ // Shared runtime instance
1695
+ #runtime;
1696
+ #runtimePromise;
1697
+ constructor(config) {
1698
+ this.#config = config;
1699
+ if (_chunkPQZHDKRWcjs.getNodeEnv.call(void 0, ) !== "test") {
1700
+ setTimeout(() => {
1701
+ this.#ensureRuntime();
1702
+ }, 0);
1703
+ }
1704
+ }
1705
+ /** Creates runtime if not already created. Idempotent. */
1706
+ #ensureRuntime() {
1707
+ if (!this.#runtimePromise) {
1708
+ this.#runtimePromise = Runtime.create(this);
1709
+ this.#runtimePromise.then((rt) => {
1710
+ this.#runtime = rt;
1711
+ });
1712
+ }
1713
+ return this.#runtimePromise;
1714
+ }
1715
+ /**
1716
+ * Handle an incoming HTTP request for serverless deployments.
1717
+ *
1718
+ * @example
1719
+ * ```ts
1720
+ * const app = new Hono();
1721
+ * app.all("/api/rivet/*", (c) => registry.handler(c.req.raw));
1722
+ * export default app;
1723
+ * ```
1724
+ */
1725
+ async handler(request) {
1726
+ const runtime = await this.#ensureRuntime();
1727
+ runtime.startServerless();
1728
+ return await runtime.handleServerlessRequest(request);
1729
+ }
1730
+ /**
1731
+ * Returns a fetch handler for serverless deployments.
1732
+ *
1733
+ * @example
1734
+ * ```ts
1735
+ * export default registry.serve();
1736
+ * ```
1737
+ */
1738
+ serve() {
1739
+ return { fetch: this.handler.bind(this) };
1740
+ }
1741
+ /**
1742
+ * Starts an actor runner for standalone server deployments.
1743
+ */
1744
+ startRunner() {
1745
+ this.#ensureRuntime().then((runtime) => runtime.startRunner());
1746
+ }
1747
+ // MARK: Legacy
1748
+ /**
1749
+ * Runs the registry for a server.
1750
+ *
1751
+ * @deprecated Use {@link Registry.startRunner} for long-running servers or {@link Registry.handler} for serverless deployments.
1752
+ */
1753
+ start(inputConfig) {
1754
+ const config = LegacyRunnerConfigSchema.parse(inputConfig);
1755
+ if (config.autoConfigureServerless && config.runnerKind !== "serverless") {
1756
+ throw new Error(
1757
+ "autoConfigureServerless can only be configured when runnerKind is 'serverless'"
1758
+ );
1759
+ }
1760
+ const isDevEnv = _chunkPQZHDKRWcjs.isDev.call(void 0, );
1761
+ if (isDevEnv && config.runnerKind === "serverless") {
1762
+ if ((inputConfig == null ? void 0 : inputConfig.runEngine) === void 0) config.runEngine = true;
1763
+ if ((inputConfig == null ? void 0 : inputConfig.autoConfigureServerless) === void 0)
1764
+ config.autoConfigureServerless = true;
1765
+ }
1766
+ if (config.runnerKind === "serverless") {
1767
+ return this.#legacyStartServerless(config, inputConfig);
1768
+ } else {
1769
+ return this.#legacyStartNormal(config);
1770
+ }
1771
+ }
1772
+ #legacyStartServerless(config, _inputConfig) {
1773
+ const client = _chunkSAZZ4SB2cjs.createClient.call(void 0, {
1774
+ endpoint: config.endpoint,
1775
+ token: config.token,
1776
+ namespace: config.namespace,
1777
+ headers: config.headers
1778
+ });
1779
+ return {
1780
+ client,
1781
+ fetch: this.handler.bind(this)
1782
+ };
1783
+ }
1784
+ #legacyStartNormal(config) {
1785
+ this.#ensureRuntime().then((runtime) => runtime.startRunner());
1786
+ const client = _chunkSAZZ4SB2cjs.createClient.call(void 0, {
1787
+ endpoint: config.endpoint,
1788
+ token: config.token,
1789
+ namespace: config.namespace,
1790
+ headers: config.headers
1791
+ });
1792
+ return {
1793
+ client,
1794
+ fetch: this.handler.bind(this)
1795
+ };
1796
+ }
1797
+ };
1798
+ function setup(input) {
1799
+ return new Registry(input);
1800
+ }
1801
+
1802
+
1803
+
1804
+
1805
+
1806
+
1807
+
1808
+
1809
+ exports.actor = actor; exports.event = event2; exports.queue = queue2; exports.createEngineDriver = createEngineDriver; exports.Registry = Registry; exports.setup = setup;
1810
+ //# sourceMappingURL=chunk-Q4UD2GA4.cjs.map