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,513 @@
1
+ import { describe, expect, test } from "vitest";
2
+ import type { DriverTestConfig } from "../mod";
3
+ import { setupDriverTest } from "../utils";
4
+
5
+ export function runRawWebSocketTests(driverTestConfig: DriverTestConfig) {
6
+ describe("raw websocket", () => {
7
+ test("should establish raw WebSocket connection", async (c) => {
8
+ const { client } = await setupDriverTest(c, driverTestConfig);
9
+ const actor = client.rawWebSocketActor.getOrCreate(["basic"]);
10
+
11
+ const ws = await actor.webSocket();
12
+
13
+ // The WebSocket should already be open since openWebSocket waits for openPromise
14
+ // But we still need to ensure any buffered events are processed
15
+ await new Promise<void>((resolve) => {
16
+ // If already open, resolve immediately
17
+ if (ws.readyState === WebSocket.OPEN) {
18
+ resolve();
19
+ } else {
20
+ // Otherwise wait for open event
21
+ ws.addEventListener(
22
+ "open",
23
+ () => {
24
+ resolve();
25
+ },
26
+ { once: true },
27
+ );
28
+ }
29
+ });
30
+
31
+ // Should receive welcome message
32
+ const welcomeMessage = await new Promise<any>((resolve, reject) => {
33
+ ws.addEventListener(
34
+ "message",
35
+ (event: any) => {
36
+ resolve(JSON.parse(event.data as string));
37
+ },
38
+ { once: true },
39
+ );
40
+ ws.addEventListener("close", reject);
41
+ });
42
+
43
+ expect(welcomeMessage.type).toBe("welcome");
44
+ expect(welcomeMessage.connectionCount).toBe(1);
45
+
46
+ ws.close();
47
+ });
48
+
49
+ test("should echo messages", async (c) => {
50
+ const { client } = await setupDriverTest(c, driverTestConfig);
51
+ const actor = client.rawWebSocketActor.getOrCreate(["echo"]);
52
+
53
+ const ws = await actor.webSocket();
54
+
55
+ // Check if WebSocket is already open
56
+ if (ws.readyState !== WebSocket.OPEN) {
57
+ await new Promise<void>((resolve, reject) => {
58
+ ws.addEventListener("open", () => resolve(), {
59
+ once: true,
60
+ });
61
+ ws.addEventListener("close", reject);
62
+ });
63
+ }
64
+
65
+ // Skip welcome message
66
+ await new Promise<void>((resolve, reject) => {
67
+ ws.addEventListener("message", () => resolve(), { once: true });
68
+ ws.addEventListener("close", reject);
69
+ });
70
+
71
+ // Send and receive echo
72
+ const testMessage = { test: "data", timestamp: Date.now() };
73
+ ws.send(JSON.stringify(testMessage));
74
+
75
+ const echoMessage = await new Promise<any>((resolve, reject) => {
76
+ ws.addEventListener(
77
+ "message",
78
+ (event: any) => {
79
+ resolve(JSON.parse(event.data as string));
80
+ },
81
+ { once: true },
82
+ );
83
+ ws.addEventListener("close", reject);
84
+ });
85
+
86
+ expect(echoMessage).toEqual(testMessage);
87
+
88
+ ws.close();
89
+ });
90
+
91
+ test("should handle ping/pong protocol", async (c) => {
92
+ const { client } = await setupDriverTest(c, driverTestConfig);
93
+ const actor = client.rawWebSocketActor.getOrCreate(["ping"]);
94
+
95
+ const ws = await actor.webSocket();
96
+
97
+ // Check if WebSocket is already open
98
+ if (ws.readyState !== WebSocket.OPEN) {
99
+ await new Promise<void>((resolve, reject) => {
100
+ ws.addEventListener("open", () => resolve(), {
101
+ once: true,
102
+ });
103
+ ws.addEventListener("close", reject);
104
+ });
105
+ }
106
+
107
+ // Skip welcome message
108
+ await new Promise<void>((resolve, reject) => {
109
+ ws.addEventListener("message", () => resolve(), { once: true });
110
+ ws.addEventListener("close", reject);
111
+ });
112
+
113
+ // Send ping
114
+ ws.send(JSON.stringify({ type: "ping" }));
115
+
116
+ const pongMessage = await new Promise<any>((resolve, reject) => {
117
+ ws.addEventListener("message", (event: any) => {
118
+ const data = JSON.parse(event.data as string);
119
+ if (data.type === "pong") {
120
+ resolve(data);
121
+ }
122
+ });
123
+ ws.addEventListener("close", reject);
124
+ });
125
+
126
+ expect(pongMessage.type).toBe("pong");
127
+ expect(pongMessage.timestamp).toBeDefined();
128
+
129
+ ws.close();
130
+ });
131
+
132
+ test("should track stats across connections", async (c) => {
133
+ const { client } = await setupDriverTest(c, driverTestConfig);
134
+ const actor1 = client.rawWebSocketActor.getOrCreate(["stats"]);
135
+
136
+ // Create first connection to ensure actor exists
137
+ const ws1 = await actor1.webSocket();
138
+ const ws1MessagePromise = new Promise<void>((resolve, reject) => {
139
+ ws1.addEventListener("message", () => resolve(), {
140
+ once: true,
141
+ });
142
+ ws1.addEventListener("close", reject);
143
+ });
144
+
145
+ // Wait for first connection to establish before getting the actor
146
+ await ws1MessagePromise;
147
+
148
+ // Now get reference to same actor
149
+ const actor2 = client.rawWebSocketActor.get(["stats"]);
150
+ const ws2 = await actor2.webSocket();
151
+ const ws2MessagePromise = new Promise<void>((resolve, reject) => {
152
+ ws2.addEventListener("message", () => resolve(), {
153
+ once: true,
154
+ });
155
+ ws2.addEventListener("close", reject);
156
+ });
157
+
158
+ // Wait for welcome messages
159
+ await Promise.all([ws1MessagePromise, ws2MessagePromise]);
160
+
161
+ // Send some messages
162
+ const pingPromise = new Promise<any>((resolve, reject) => {
163
+ ws2.addEventListener("message", (event: any) => {
164
+ const data = JSON.parse(event.data as string);
165
+ if (data.type === "pong") {
166
+ resolve(undefined);
167
+ }
168
+ });
169
+ ws2.addEventListener("close", reject);
170
+ });
171
+ ws1.send(JSON.stringify({ data: "test1" }));
172
+ ws1.send(JSON.stringify({ data: "test3" }));
173
+ ws2.send(JSON.stringify({ type: "ping" }));
174
+ await pingPromise;
175
+
176
+ // Get stats
177
+ const statsPromise = new Promise<any>((resolve, reject) => {
178
+ ws1.addEventListener("message", (event: any) => {
179
+ const data = JSON.parse(event.data as string);
180
+ if (data.type === "stats") {
181
+ resolve(data);
182
+ }
183
+ });
184
+ ws1.addEventListener("close", reject);
185
+ });
186
+ ws1.send(JSON.stringify({ type: "getStats" }));
187
+ const stats = await statsPromise;
188
+ expect(stats.connectionCount).toBe(2);
189
+ expect(stats.messageCount).toBe(4);
190
+
191
+ // Verify via action
192
+ const actionStats = await actor1.getStats();
193
+ expect(actionStats.connectionCount).toBe(2);
194
+ expect(actionStats.messageCount).toBe(4);
195
+
196
+ ws1.close();
197
+ ws2.close();
198
+ });
199
+
200
+ test("should handle binary data", async (c) => {
201
+ const { client } = await setupDriverTest(c, driverTestConfig);
202
+ const actor = client.rawWebSocketBinaryActor.getOrCreate([
203
+ "binary",
204
+ ]);
205
+
206
+ const ws = await actor.webSocket();
207
+
208
+ // Check if WebSocket is already open
209
+ if (ws.readyState !== WebSocket.OPEN) {
210
+ await new Promise<void>((resolve, reject) => {
211
+ ws.addEventListener("open", () => resolve(), {
212
+ once: true,
213
+ });
214
+ ws.addEventListener("close", reject);
215
+ });
216
+ }
217
+
218
+ // Helper to receive and convert binary message
219
+ const receiveBinaryMessage = async (): Promise<Uint8Array> => {
220
+ const response = await new Promise<ArrayBuffer | Blob>(
221
+ (resolve, reject) => {
222
+ ws.addEventListener(
223
+ "message",
224
+ (event: any) => {
225
+ resolve(event.data);
226
+ },
227
+ { once: true },
228
+ );
229
+ ws.addEventListener("close", reject);
230
+ },
231
+ );
232
+
233
+ // Convert Blob to ArrayBuffer if needed
234
+ const buffer =
235
+ response instanceof Blob
236
+ ? await response.arrayBuffer()
237
+ : response;
238
+
239
+ return new Uint8Array(buffer);
240
+ };
241
+
242
+ // Test 1: Small binary data
243
+ const smallData = new Uint8Array([1, 2, 3, 4, 5]);
244
+ ws.send(smallData);
245
+ const smallReversed = await receiveBinaryMessage();
246
+ expect(Array.from(smallReversed)).toEqual([5, 4, 3, 2, 1]);
247
+
248
+ // Test 2: Large binary data (1KB)
249
+ const largeData = new Uint8Array(1024);
250
+ for (let i = 0; i < largeData.length; i++) {
251
+ largeData[i] = i % 256;
252
+ }
253
+ ws.send(largeData);
254
+ const largeReversed = await receiveBinaryMessage();
255
+
256
+ // Verify it's reversed correctly
257
+ for (let i = 0; i < largeData.length; i++) {
258
+ expect(largeReversed[i]).toBe(
259
+ largeData[largeData.length - 1 - i],
260
+ );
261
+ }
262
+
263
+ ws.close();
264
+ });
265
+
266
+ test("should work with custom paths", async (c) => {
267
+ const { client } = await setupDriverTest(c, driverTestConfig);
268
+ const actor = client.rawWebSocketActor.getOrCreate(["paths"]);
269
+
270
+ const ws = await actor.webSocket("custom/path");
271
+
272
+ await new Promise<void>((resolve, reject) => {
273
+ ws.addEventListener("open", () => {
274
+ resolve();
275
+ });
276
+ ws.addEventListener("error", reject);
277
+ ws.addEventListener("close", reject);
278
+ });
279
+
280
+ // Should still work
281
+ const welcomeMessage = await new Promise<any>((resolve) => {
282
+ ws.addEventListener(
283
+ "message",
284
+ (event: any) => {
285
+ resolve(JSON.parse(event.data as string));
286
+ },
287
+ { once: true },
288
+ );
289
+ });
290
+
291
+ expect(welcomeMessage.type).toBe("welcome");
292
+
293
+ ws.close();
294
+ });
295
+
296
+ test("should handle connection close properly", async (c) => {
297
+ const { client } = await setupDriverTest(c, driverTestConfig);
298
+ const actor = client.rawWebSocketActor.getOrCreate(["close-test"]);
299
+
300
+ const ws = await actor.webSocket();
301
+
302
+ // Check if WebSocket is already open
303
+ if (ws.readyState !== WebSocket.OPEN) {
304
+ await new Promise<void>((resolve, reject) => {
305
+ ws.addEventListener("open", () => resolve(), {
306
+ once: true,
307
+ });
308
+ ws.addEventListener("close", reject);
309
+ });
310
+ }
311
+
312
+ // Get initial stats
313
+ const initialStats = await actor.getStats();
314
+ expect(initialStats.connectionCount).toBe(1);
315
+
316
+ // Wait for close event on client side
317
+ const closePromise = new Promise<void>((resolve) => {
318
+ ws.addEventListener("close", () => resolve(), { once: true });
319
+ });
320
+
321
+ // Close connection
322
+ ws.close();
323
+ await closePromise;
324
+
325
+ // Poll getStats until connection count is 0
326
+ let finalStats: any;
327
+ for (let i = 0; i < 20; i++) {
328
+ finalStats = await actor.getStats();
329
+ if (finalStats.connectionCount === 0) {
330
+ break;
331
+ }
332
+ await new Promise((resolve) => setTimeout(resolve, 50));
333
+ }
334
+
335
+ // Check stats after close
336
+ expect(finalStats?.connectionCount).toBe(0);
337
+ });
338
+
339
+ test("should properly handle onWebSocket open and close events", async (c) => {
340
+ const { client } = await setupDriverTest(c, driverTestConfig);
341
+ const actor = client.rawWebSocketActor.getOrCreate([
342
+ "open-close-test",
343
+ ]);
344
+
345
+ // Create first connection
346
+ const ws1 = await actor.webSocket();
347
+
348
+ // Wait for open event
349
+ await new Promise<void>((resolve, reject) => {
350
+ ws1.addEventListener("open", () => resolve(), { once: true });
351
+ ws1.addEventListener("close", reject);
352
+ });
353
+
354
+ // Wait for welcome message which confirms onWebSocket was called
355
+ const welcome1 = await new Promise<any>((resolve, reject) => {
356
+ ws1.addEventListener(
357
+ "message",
358
+ (event: any) => {
359
+ resolve(JSON.parse(event.data as string));
360
+ },
361
+ { once: true },
362
+ );
363
+ ws1.addEventListener("close", reject);
364
+ });
365
+
366
+ expect(welcome1.type).toBe("welcome");
367
+ expect(welcome1.connectionCount).toBe(1);
368
+
369
+ // Create second connection to same actor
370
+ const ws2 = await actor.webSocket();
371
+
372
+ await new Promise<void>((resolve, reject) => {
373
+ ws2.addEventListener("open", () => resolve(), { once: true });
374
+ ws2.addEventListener("close", reject);
375
+ });
376
+
377
+ const welcome2 = await new Promise<any>((resolve, reject) => {
378
+ ws2.addEventListener(
379
+ "message",
380
+ (event: any) => {
381
+ resolve(JSON.parse(event.data as string));
382
+ },
383
+ { once: true },
384
+ );
385
+ ws2.addEventListener("close", reject);
386
+ });
387
+
388
+ expect(welcome2.type).toBe("welcome");
389
+ expect(welcome2.connectionCount).toBe(2);
390
+
391
+ // Verify stats
392
+ const midStats = await actor.getStats();
393
+ expect(midStats.connectionCount).toBe(2);
394
+
395
+ // Close first connection
396
+ ws1.close();
397
+ await new Promise<void>((resolve) => {
398
+ ws1.addEventListener("close", () => resolve(), { once: true });
399
+ });
400
+
401
+ // Poll getStats until connection count decreases to 1
402
+ let afterFirstClose: any;
403
+ for (let i = 0; i < 20; i++) {
404
+ afterFirstClose = await actor.getStats();
405
+ if (afterFirstClose.connectionCount === 1) {
406
+ break;
407
+ }
408
+ await new Promise((resolve) => setTimeout(resolve, 50));
409
+ }
410
+
411
+ // Verify connection count decreased
412
+ expect(afterFirstClose?.connectionCount).toBe(1);
413
+
414
+ // Close second connection
415
+ ws2.close();
416
+ await new Promise<void>((resolve) => {
417
+ ws2.addEventListener("close", () => resolve(), { once: true });
418
+ });
419
+
420
+ // Poll getStats until connection count is 0
421
+ let finalStats: any;
422
+ for (let i = 0; i < 20; i++) {
423
+ finalStats = await actor.getStats();
424
+ if (finalStats.connectionCount === 0) {
425
+ break;
426
+ }
427
+ await new Promise((resolve) => setTimeout(resolve, 50));
428
+ }
429
+
430
+ // Verify final state
431
+ expect(finalStats?.connectionCount).toBe(0);
432
+ });
433
+
434
+ test("should handle query parameters in websocket paths", async (c) => {
435
+ const { client } = await setupDriverTest(c, driverTestConfig);
436
+ const actor = client.rawWebSocketActor.getOrCreate([
437
+ "query-params",
438
+ ]);
439
+
440
+ // Test WebSocket with query parameters
441
+ const ws = await actor.webSocket(
442
+ "api/v1/stream?token=abc123&user=test",
443
+ );
444
+
445
+ await new Promise<void>((resolve, reject) => {
446
+ ws.addEventListener("open", () => resolve(), { once: true });
447
+ ws.addEventListener("error", reject);
448
+ });
449
+
450
+ const requestInfoPromise = new Promise<any>((resolve, reject) => {
451
+ ws.addEventListener("message", (event: any) => {
452
+ const data = JSON.parse(event.data as string);
453
+ if (data.type === "requestInfo") {
454
+ resolve(data);
455
+ }
456
+ });
457
+ ws.addEventListener("close", reject);
458
+ });
459
+
460
+ // Send request to get the request info
461
+ ws.send(JSON.stringify({ type: "getRequestInfo" }));
462
+
463
+ const requestInfo = await requestInfoPromise;
464
+
465
+ // Verify the path and query parameters were preserved
466
+ expect(requestInfo.url).toContain("api/v1/stream");
467
+ expect(requestInfo.url).toContain("token=abc123");
468
+ expect(requestInfo.url).toContain("user=test");
469
+
470
+ ws.close();
471
+ });
472
+
473
+ test("should handle query parameters on base websocket path (no subpath)", async (c) => {
474
+ const { client } = await setupDriverTest(c, driverTestConfig);
475
+ const actor = client.rawWebSocketActor.getOrCreate([
476
+ "base-path-query-params",
477
+ ]);
478
+
479
+ // Test WebSocket with ONLY query parameters on the base path
480
+ // This tests the case where path is "/websocket?foo=bar" without trailing slash
481
+ const ws = await actor.webSocket("?token=secret&session=123");
482
+
483
+ await new Promise<void>((resolve, reject) => {
484
+ ws.addEventListener("open", () => resolve(), { once: true });
485
+ ws.addEventListener("error", reject);
486
+ ws.addEventListener("close", (evt: any) => {
487
+ reject(new Error(`WebSocket closed: code=${evt.code} reason=${evt.reason}`));
488
+ });
489
+ });
490
+
491
+ const requestInfoPromise = new Promise<any>((resolve, reject) => {
492
+ ws.addEventListener("message", (event: any) => {
493
+ const data = JSON.parse(event.data as string);
494
+ if (data.type === "requestInfo") {
495
+ resolve(data);
496
+ }
497
+ });
498
+ ws.addEventListener("close", reject);
499
+ });
500
+
501
+ // Send request to get the request info
502
+ ws.send(JSON.stringify({ type: "getRequestInfo" }));
503
+
504
+ const requestInfo = await requestInfoPromise;
505
+
506
+ // Verify query parameters were preserved even on base websocket path
507
+ expect(requestInfo.url).toContain("token=secret");
508
+ expect(requestInfo.url).toContain("session=123");
509
+
510
+ ws.close();
511
+ });
512
+ });
513
+ }