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,2601 @@
1
+ import {
2
+ hibernationActor,
3
+ logger,
4
+ runWithEarlyExit,
5
+ runWithError,
6
+ runWithQueueConsumer,
7
+ runWithTicks,
8
+ runWithoutHandler,
9
+ sleep,
10
+ sleepWithLongRpc,
11
+ sleepWithNoSleepOption,
12
+ sleepWithRawHttp,
13
+ sleepWithRawWebSocket,
14
+ workflowAccessActor,
15
+ workflowCounterActor,
16
+ workflowQueueActor,
17
+ workflowSleepActor,
18
+ workflowStopTeardownActor
19
+ } from "../chunk-D4BYUPNQ.js";
20
+ import "../chunk-WMPW7JYC.js";
21
+ import "../chunk-Z7HNQ2WF.js";
22
+ import {
23
+ db as db2,
24
+ integer,
25
+ mod_exports,
26
+ sqliteTable,
27
+ text
28
+ } from "../chunk-VKVNIQRQ.js";
29
+ import {
30
+ actor,
31
+ event,
32
+ queue,
33
+ setup
34
+ } from "../chunk-QUD664YZ.js";
35
+ import {
36
+ createFileSystemOrMemoryDriver
37
+ } from "../chunk-MXNPAB5W.js";
38
+ import "../chunk-K6DGYILQ.js";
39
+ import "../chunk-JEAEA2PB.js";
40
+ import {
41
+ db
42
+ } from "../chunk-KJSYAUOM.js";
43
+ import "../chunk-N4KRDJ56.js";
44
+ import {
45
+ buildManagerRouter
46
+ } from "../chunk-HHXX2VRM.js";
47
+ import "../chunk-LXUQ667X.js";
48
+ import "../chunk-RTOCTWME.js";
49
+ import "../chunk-325TLXJT.js";
50
+ import {
51
+ UserError
52
+ } from "../chunk-7HTNH26M.js";
53
+ import "../chunk-424PT5DM.js";
54
+
55
+ // src/serve-test-suite/mod.ts
56
+ import { createServer } from "net";
57
+ import { fileURLToPath } from "url";
58
+ import { serve as honoServe } from "@hono/node-server";
59
+ import { createNodeWebSocket } from "@hono/node-ws";
60
+ import invariant from "invariant";
61
+
62
+ // fixtures/driver-test-suite/access-control.ts
63
+ import { Forbidden } from "rivetkit/errors";
64
+ var accessControlEvents = {
65
+ allowedEvent: event({
66
+ canSubscribe: (c) => {
67
+ c.state.lastCanSubscribeConnId = c.conn.id;
68
+ return true;
69
+ }
70
+ }),
71
+ blockedEvent: event({
72
+ canSubscribe: (c) => {
73
+ c.state.lastCanSubscribeConnId = c.conn.id;
74
+ return false;
75
+ }
76
+ })
77
+ };
78
+ var accessControlQueues = {
79
+ allowedQueue: queue({
80
+ canPublish: (c) => {
81
+ c.state.lastCanPublishConnId = c.conn.id;
82
+ return true;
83
+ }
84
+ }),
85
+ blockedQueue: queue({
86
+ canPublish: (c) => {
87
+ c.state.lastCanPublishConnId = c.conn.id;
88
+ return false;
89
+ }
90
+ })
91
+ };
92
+ var accessControlActor = actor({
93
+ state: {
94
+ lastCanPublishConnId: "",
95
+ lastCanSubscribeConnId: ""
96
+ },
97
+ events: accessControlEvents,
98
+ queues: accessControlQueues,
99
+ onBeforeConnect: (_c, params) => {
100
+ if ((params == null ? void 0 : params.allowRequest) === false || (params == null ? void 0 : params.allowWebSocket) === false) {
101
+ throw new Forbidden();
102
+ }
103
+ },
104
+ onRequest(_c, request) {
105
+ const url = new URL(request.url);
106
+ if (url.pathname === "/status") {
107
+ return Response.json({ ok: true });
108
+ }
109
+ return new Response("Not Found", { status: 404 });
110
+ },
111
+ onWebSocket(_c, websocket) {
112
+ websocket.send(JSON.stringify({ type: "welcome" }));
113
+ },
114
+ actions: {
115
+ allowedAction: (_c, value) => {
116
+ return `allowed:${value}`;
117
+ },
118
+ allowedGetLastCanPublishConnId: (c) => {
119
+ return c.state.lastCanPublishConnId;
120
+ },
121
+ allowedGetLastCanSubscribeConnId: (c) => {
122
+ return c.state.lastCanSubscribeConnId;
123
+ },
124
+ allowedReceiveQueue: async (c) => {
125
+ const message = await c.queue.tryNext({
126
+ names: ["allowedQueue"]
127
+ });
128
+ return (message == null ? void 0 : message.body) ?? null;
129
+ },
130
+ allowedReceiveAnyQueue: async (c) => {
131
+ const message = await c.queue.tryNext();
132
+ return (message == null ? void 0 : message.body) ?? null;
133
+ },
134
+ allowedBroadcastAllowedEvent: (c, value) => {
135
+ c.broadcast("allowedEvent", { value });
136
+ },
137
+ allowedBroadcastBlockedEvent: (c, value) => {
138
+ c.broadcast("blockedEvent", { value });
139
+ },
140
+ allowedBroadcastUndefinedEvent: (c, value) => {
141
+ c.broadcast("undefinedEvent", { value });
142
+ }
143
+ }
144
+ });
145
+ var accessControlNoQueuesActor = actor({
146
+ state: {},
147
+ actions: {
148
+ readAnyQueue: async (c) => {
149
+ const message = await c.queue.tryNext();
150
+ return (message == null ? void 0 : message.body) ?? null;
151
+ }
152
+ }
153
+ });
154
+
155
+ // fixtures/driver-test-suite/action-inputs.ts
156
+ var inputActor = actor({
157
+ createState: (c, input) => {
158
+ return {
159
+ initialInput: input,
160
+ onCreateInput: void 0
161
+ };
162
+ },
163
+ onCreate: (c, input) => {
164
+ c.state.onCreateInput = input;
165
+ },
166
+ actions: {
167
+ getInputs: (c) => {
168
+ return {
169
+ initialInput: c.state.initialInput,
170
+ onCreateInput: c.state.onCreateInput
171
+ };
172
+ }
173
+ }
174
+ });
175
+
176
+ // fixtures/driver-test-suite/action-timeout.ts
177
+ var shortTimeoutActor = actor({
178
+ state: { value: 0 },
179
+ options: {
180
+ actionTimeout: 50
181
+ // 50ms timeout
182
+ },
183
+ actions: {
184
+ quickAction: async (c) => {
185
+ return "quick response";
186
+ },
187
+ slowAction: async (c) => {
188
+ await new Promise((resolve) => setTimeout(resolve, 100));
189
+ return "slow response";
190
+ }
191
+ }
192
+ });
193
+ var longTimeoutActor = actor({
194
+ state: { value: 0 },
195
+ options: {
196
+ actionTimeout: 200
197
+ // 200ms timeout
198
+ },
199
+ actions: {
200
+ delayedAction: async (c) => {
201
+ await new Promise((resolve) => setTimeout(resolve, 100));
202
+ return "delayed response";
203
+ }
204
+ }
205
+ });
206
+ var defaultTimeoutActor = actor({
207
+ state: { value: 0 },
208
+ actions: {
209
+ normalAction: async (c) => {
210
+ await new Promise((resolve) => setTimeout(resolve, 50));
211
+ return "normal response";
212
+ }
213
+ }
214
+ });
215
+ var syncTimeoutActor = actor({
216
+ state: { value: 0 },
217
+ options: {
218
+ actionTimeout: 50
219
+ // 50ms timeout
220
+ },
221
+ actions: {
222
+ syncAction: (c) => {
223
+ return "sync response";
224
+ }
225
+ }
226
+ });
227
+
228
+ // fixtures/driver-test-suite/action-types.ts
229
+ var syncActionActor = actor({
230
+ state: { value: 0 },
231
+ actions: {
232
+ // Simple synchronous action that returns a value directly
233
+ increment: (c, amount = 1) => {
234
+ c.state.value += amount;
235
+ return c.state.value;
236
+ },
237
+ // Synchronous action that returns an object
238
+ getInfo: (c) => {
239
+ return {
240
+ currentValue: c.state.value,
241
+ timestamp: Date.now()
242
+ };
243
+ },
244
+ // Synchronous action with no return value (void)
245
+ reset: (c) => {
246
+ c.state.value = 0;
247
+ }
248
+ }
249
+ });
250
+ var asyncActionActor = actor({
251
+ state: { value: 0, data: null },
252
+ actions: {
253
+ // Async action with a delay
254
+ delayedIncrement: async (c, amount = 1) => {
255
+ await Promise.resolve();
256
+ c.state.value += amount;
257
+ return c.state.value;
258
+ },
259
+ // Async action that simulates an API call
260
+ fetchData: async (c, id) => {
261
+ await Promise.resolve();
262
+ const data = { id, timestamp: Date.now() };
263
+ c.state.data = data;
264
+ return data;
265
+ },
266
+ // Async action with error handling
267
+ asyncWithError: async (c, shouldError) => {
268
+ await Promise.resolve();
269
+ if (shouldError) {
270
+ throw new UserError("Intentional error");
271
+ }
272
+ return "Success";
273
+ }
274
+ }
275
+ });
276
+ var promiseActor = actor({
277
+ state: { results: [] },
278
+ actions: {
279
+ // Action that returns a resolved promise
280
+ resolvedPromise: (c) => {
281
+ return Promise.resolve("resolved value");
282
+ },
283
+ // Action that returns a promise that resolves after a delay
284
+ delayedPromise: (c) => {
285
+ return new Promise((resolve) => {
286
+ c.state.results.push("delayed");
287
+ resolve("delayed value");
288
+ });
289
+ },
290
+ // Action that returns a rejected promise
291
+ rejectedPromise: (c) => {
292
+ return Promise.reject(new UserError("promised rejection"));
293
+ },
294
+ // Action to check the collected results
295
+ getResults: (c) => {
296
+ return c.state.results;
297
+ }
298
+ }
299
+ });
300
+
301
+ // fixtures/driver-test-suite/actor-db-raw.ts
302
+ function firstRowValue(row) {
303
+ if (!row) {
304
+ return void 0;
305
+ }
306
+ const values = Object.values(row);
307
+ return values.length > 0 ? values[0] : void 0;
308
+ }
309
+ function toSafeInteger(value) {
310
+ if (typeof value === "bigint") {
311
+ return Number(value);
312
+ }
313
+ if (typeof value === "number") {
314
+ return Number.isFinite(value) ? Math.trunc(value) : 0;
315
+ }
316
+ if (typeof value === "string") {
317
+ const parsed = Number.parseInt(value, 10);
318
+ return Number.isFinite(parsed) ? parsed : 0;
319
+ }
320
+ return 0;
321
+ }
322
+ function normalizeRowIds(rowIds) {
323
+ const normalized = rowIds.map((id) => Math.trunc(id)).filter((id) => Number.isFinite(id) && id > 0);
324
+ return Array.from(new Set(normalized));
325
+ }
326
+ function makePayload(size) {
327
+ const normalizedSize = Math.max(0, Math.trunc(size));
328
+ return "x".repeat(normalizedSize);
329
+ }
330
+ var dbActorRaw = actor({
331
+ state: {
332
+ disconnectInsertEnabled: false,
333
+ disconnectInsertDelayMs: 0
334
+ },
335
+ db: db({
336
+ onMigrate: async (db3) => {
337
+ await db3.execute(`
338
+ CREATE TABLE IF NOT EXISTS test_data (
339
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
340
+ value TEXT NOT NULL,
341
+ payload TEXT NOT NULL DEFAULT '',
342
+ created_at INTEGER NOT NULL
343
+ )
344
+ `);
345
+ }
346
+ }),
347
+ onDisconnect: async (c) => {
348
+ if (!c.state.disconnectInsertEnabled) {
349
+ return;
350
+ }
351
+ if (c.state.disconnectInsertDelayMs > 0) {
352
+ await new Promise(
353
+ (resolve) => setTimeout(resolve, c.state.disconnectInsertDelayMs)
354
+ );
355
+ }
356
+ await c.db.execute(
357
+ `INSERT INTO test_data (value, payload, created_at) VALUES ('__disconnect__', '', ${Date.now()})`
358
+ );
359
+ },
360
+ actions: {
361
+ configureDisconnectInsert: (c, enabled, delayMs) => {
362
+ c.state.disconnectInsertEnabled = enabled;
363
+ c.state.disconnectInsertDelayMs = Math.max(
364
+ 0,
365
+ Math.floor(delayMs)
366
+ );
367
+ },
368
+ getDisconnectInsertCount: async (c) => {
369
+ var _a;
370
+ const results = await c.db.execute(
371
+ `SELECT COUNT(*) as count FROM test_data WHERE value = '__disconnect__'`
372
+ );
373
+ return ((_a = results[0]) == null ? void 0 : _a.count) ?? 0;
374
+ },
375
+ reset: async (c) => {
376
+ await c.db.execute(`DELETE FROM test_data`);
377
+ },
378
+ insertValue: async (c, value) => {
379
+ await c.db.execute(
380
+ `INSERT INTO test_data (value, payload, created_at) VALUES ('${value}', '', ${Date.now()})`
381
+ );
382
+ const results = await c.db.execute(
383
+ `SELECT last_insert_rowid() as id`
384
+ );
385
+ return { id: results[0].id };
386
+ },
387
+ getValues: async (c) => {
388
+ const results = await c.db.execute(
389
+ `SELECT * FROM test_data ORDER BY id`
390
+ );
391
+ return results;
392
+ },
393
+ getValue: async (c, id) => {
394
+ var _a;
395
+ const results = await c.db.execute(
396
+ `SELECT value FROM test_data WHERE id = ${id}`
397
+ );
398
+ return ((_a = results[0]) == null ? void 0 : _a.value) ?? null;
399
+ },
400
+ getCount: async (c) => {
401
+ const results = await c.db.execute(
402
+ `SELECT COUNT(*) as count FROM test_data`
403
+ );
404
+ return results[0].count;
405
+ },
406
+ rawSelectCount: async (c) => {
407
+ const results = await c.db.execute(
408
+ `SELECT COUNT(*) as count FROM test_data`
409
+ );
410
+ return results[0].count;
411
+ },
412
+ insertMany: async (c, count) => {
413
+ if (count <= 0) {
414
+ return { count: 0 };
415
+ }
416
+ const now = Date.now();
417
+ const values = [];
418
+ for (let i = 0; i < count; i++) {
419
+ values.push(`('User ${i}', '', ${now})`);
420
+ }
421
+ await c.db.execute(
422
+ `INSERT INTO test_data (value, payload, created_at) VALUES ${values.join(", ")}`
423
+ );
424
+ return { count };
425
+ },
426
+ updateValue: async (c, id, value) => {
427
+ await c.db.execute(
428
+ `UPDATE test_data SET value = '${value}' WHERE id = ${id}`
429
+ );
430
+ return { success: true };
431
+ },
432
+ deleteValue: async (c, id) => {
433
+ await c.db.execute(`DELETE FROM test_data WHERE id = ${id}`);
434
+ },
435
+ transactionCommit: async (c, value) => {
436
+ await c.db.execute(
437
+ `BEGIN; INSERT INTO test_data (value, payload, created_at) VALUES ('${value}', '', ${Date.now()}); COMMIT;`
438
+ );
439
+ },
440
+ transactionRollback: async (c, value) => {
441
+ await c.db.execute(
442
+ `BEGIN; INSERT INTO test_data (value, payload, created_at) VALUES ('${value}', '', ${Date.now()}); ROLLBACK;`
443
+ );
444
+ },
445
+ insertPayloadOfSize: async (c, size) => {
446
+ const payload = "x".repeat(size);
447
+ await c.db.execute(
448
+ `INSERT INTO test_data (value, payload, created_at) VALUES ('payload', '${payload}', ${Date.now()})`
449
+ );
450
+ const results = await c.db.execute(
451
+ `SELECT last_insert_rowid() as id`
452
+ );
453
+ return { id: results[0].id, size };
454
+ },
455
+ getPayloadSize: async (c, id) => {
456
+ var _a;
457
+ const results = await c.db.execute(
458
+ `SELECT length(payload) as size FROM test_data WHERE id = ${id}`
459
+ );
460
+ return ((_a = results[0]) == null ? void 0 : _a.size) ?? 0;
461
+ },
462
+ insertPayloadRows: async (c, count, payloadSize) => {
463
+ const normalizedCount = Math.max(0, Math.trunc(count));
464
+ if (normalizedCount === 0) {
465
+ return { count: 0 };
466
+ }
467
+ const payload = makePayload(payloadSize);
468
+ const now = Date.now();
469
+ for (let i = 0; i < normalizedCount; i++) {
470
+ await c.db.execute(
471
+ `INSERT INTO test_data (value, payload, created_at) VALUES ('bulk-${i}', '${payload}', ${now})`
472
+ );
473
+ }
474
+ return { count: normalizedCount };
475
+ },
476
+ roundRobinUpdateValues: async (c, rowIds, iterations) => {
477
+ const normalizedRowIds = normalizeRowIds(rowIds);
478
+ const normalizedIterations = Math.max(0, Math.trunc(iterations));
479
+ if (normalizedRowIds.length === 0 || normalizedIterations === 0) {
480
+ const emptyRows = [];
481
+ return emptyRows;
482
+ }
483
+ for (let i = 0; i < normalizedIterations; i++) {
484
+ const rowId = normalizedRowIds[i % normalizedRowIds.length] ?? 0;
485
+ await c.db.execute(
486
+ `UPDATE test_data SET value = 'v-${i}' WHERE id = ${rowId}`
487
+ );
488
+ }
489
+ return await c.db.execute(
490
+ `SELECT id, value FROM test_data WHERE id IN (${normalizedRowIds.join(",")}) ORDER BY id`
491
+ );
492
+ },
493
+ getPageCount: async (c) => {
494
+ const rows = await c.db.execute(
495
+ "PRAGMA page_count"
496
+ );
497
+ return toSafeInteger(firstRowValue(rows[0]));
498
+ },
499
+ vacuum: async (c) => {
500
+ await c.db.execute("VACUUM");
501
+ },
502
+ integrityCheck: async (c) => {
503
+ const rows = await c.db.execute(
504
+ "PRAGMA integrity_check"
505
+ );
506
+ const value = firstRowValue(rows[0]);
507
+ return String(value ?? "");
508
+ },
509
+ runMixedWorkload: async (c, seedCount, churnCount) => {
510
+ const normalizedSeedCount = Math.max(1, Math.trunc(seedCount));
511
+ const normalizedChurnCount = Math.max(0, Math.trunc(churnCount));
512
+ const now = Date.now();
513
+ for (let i = 0; i < normalizedSeedCount; i++) {
514
+ const payload = makePayload(1024 + i % 5 * 128);
515
+ await c.db.execute(
516
+ `INSERT OR REPLACE INTO test_data (id, value, payload, created_at) VALUES (${i + 1}, 'seed-${i}', '${payload}', ${now})`
517
+ );
518
+ }
519
+ for (let i = 0; i < normalizedChurnCount; i++) {
520
+ const id = i % normalizedSeedCount + 1;
521
+ if (i % 9 === 0) {
522
+ await c.db.execute(`DELETE FROM test_data WHERE id = ${id}`);
523
+ } else {
524
+ const payload = makePayload(768 + i % 7 * 96);
525
+ await c.db.execute(
526
+ `INSERT OR REPLACE INTO test_data (id, value, payload, created_at) VALUES (${id}, 'upd-${i}', '${payload}', ${now + i})`
527
+ );
528
+ }
529
+ }
530
+ },
531
+ repeatUpdate: async (c, id, count) => {
532
+ let value = "";
533
+ if (count <= 0) {
534
+ return { value };
535
+ }
536
+ const statements = ["BEGIN"];
537
+ for (let i = 0; i < count; i++) {
538
+ value = `Updated ${i}`;
539
+ statements.push(
540
+ `UPDATE test_data SET value = '${value}' WHERE id = ${id}`
541
+ );
542
+ }
543
+ statements.push("COMMIT");
544
+ await c.db.execute(statements.join("; "));
545
+ return { value };
546
+ },
547
+ multiStatementInsert: async (c, value) => {
548
+ var _a;
549
+ await c.db.execute(
550
+ `BEGIN; INSERT INTO test_data (value, payload, created_at) VALUES ('${value}', '', ${Date.now()}); UPDATE test_data SET value = '${value}-updated' WHERE id = last_insert_rowid(); COMMIT;`
551
+ );
552
+ const results = await c.db.execute(
553
+ `SELECT value FROM test_data ORDER BY id DESC LIMIT 1`
554
+ );
555
+ return ((_a = results[0]) == null ? void 0 : _a.value) ?? null;
556
+ },
557
+ triggerSleep: (c) => {
558
+ c.sleep();
559
+ }
560
+ },
561
+ options: {
562
+ actionTimeout: 12e4,
563
+ sleepTimeout: 100
564
+ }
565
+ });
566
+
567
+ // fixtures/driver-test-suite/db/migrations.ts
568
+ var migrations = {
569
+ journal: {
570
+ entries: [
571
+ {
572
+ idx: 0,
573
+ when: 17e11,
574
+ tag: "0000_init",
575
+ breakpoints: false
576
+ }
577
+ ]
578
+ },
579
+ migrations: {
580
+ m0000: `
581
+ CREATE TABLE IF NOT EXISTS test_data (
582
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
583
+ value TEXT NOT NULL,
584
+ payload TEXT NOT NULL DEFAULT '',
585
+ created_at INTEGER NOT NULL
586
+ );
587
+ `
588
+ }
589
+ };
590
+
591
+ // fixtures/driver-test-suite/db/schema.ts
592
+ var testData = sqliteTable("test_data", {
593
+ id: integer("id").primaryKey({ autoIncrement: true }),
594
+ value: text("value").notNull(),
595
+ payload: text("payload").notNull().default(""),
596
+ createdAt: integer("created_at").notNull()
597
+ });
598
+ var schema = {
599
+ testData
600
+ };
601
+
602
+ // fixtures/driver-test-suite/actor-db-drizzle.ts
603
+ function firstRowValue2(row) {
604
+ if (!row) {
605
+ return void 0;
606
+ }
607
+ const values = Object.values(row);
608
+ return values.length > 0 ? values[0] : void 0;
609
+ }
610
+ function toSafeInteger2(value) {
611
+ if (typeof value === "bigint") {
612
+ return Number(value);
613
+ }
614
+ if (typeof value === "number") {
615
+ return Number.isFinite(value) ? Math.trunc(value) : 0;
616
+ }
617
+ if (typeof value === "string") {
618
+ const parsed = Number.parseInt(value, 10);
619
+ return Number.isFinite(parsed) ? parsed : 0;
620
+ }
621
+ return 0;
622
+ }
623
+ function normalizeRowIds2(rowIds) {
624
+ const normalized = rowIds.map((id) => Math.trunc(id)).filter((id) => Number.isFinite(id) && id > 0);
625
+ return Array.from(new Set(normalized));
626
+ }
627
+ function makePayload2(size) {
628
+ const normalizedSize = Math.max(0, Math.trunc(size));
629
+ return "x".repeat(normalizedSize);
630
+ }
631
+ var dbActorDrizzle = actor({
632
+ state: {
633
+ disconnectInsertEnabled: false,
634
+ disconnectInsertDelayMs: 0
635
+ },
636
+ db: db2({
637
+ schema,
638
+ migrations
639
+ }),
640
+ onDisconnect: async (c) => {
641
+ if (!c.state.disconnectInsertEnabled) {
642
+ return;
643
+ }
644
+ if (c.state.disconnectInsertDelayMs > 0) {
645
+ await new Promise(
646
+ (resolve) => setTimeout(resolve, c.state.disconnectInsertDelayMs)
647
+ );
648
+ }
649
+ await c.db.execute(
650
+ `INSERT INTO test_data (value, payload, created_at) VALUES ('__disconnect__', '', ${Date.now()})`
651
+ );
652
+ },
653
+ actions: {
654
+ configureDisconnectInsert: (c, enabled, delayMs) => {
655
+ c.state.disconnectInsertEnabled = enabled;
656
+ c.state.disconnectInsertDelayMs = Math.max(
657
+ 0,
658
+ Math.floor(delayMs)
659
+ );
660
+ },
661
+ getDisconnectInsertCount: async (c) => {
662
+ var _a;
663
+ const results = await c.db.execute(
664
+ `SELECT COUNT(*) as count FROM test_data WHERE value = '__disconnect__'`
665
+ );
666
+ return ((_a = results[0]) == null ? void 0 : _a.count) ?? 0;
667
+ },
668
+ reset: async (c) => {
669
+ await c.db.execute(`DELETE FROM test_data`);
670
+ },
671
+ insertValue: async (c, value) => {
672
+ await c.db.execute(
673
+ `INSERT INTO test_data (value, payload, created_at) VALUES ('${value}', '', ${Date.now()})`
674
+ );
675
+ const results = await c.db.execute(
676
+ `SELECT last_insert_rowid() as id`
677
+ );
678
+ return { id: results[0].id };
679
+ },
680
+ getValues: async (c) => {
681
+ const results = await c.db.execute(
682
+ `SELECT * FROM test_data ORDER BY id`
683
+ );
684
+ return results;
685
+ },
686
+ getValue: async (c, id) => {
687
+ var _a;
688
+ const results = await c.db.execute(
689
+ `SELECT value FROM test_data WHERE id = ${id}`
690
+ );
691
+ return ((_a = results[0]) == null ? void 0 : _a.value) ?? null;
692
+ },
693
+ getCount: async (c) => {
694
+ const results = await c.db.execute(
695
+ `SELECT COUNT(*) as count FROM test_data`
696
+ );
697
+ return results[0].count;
698
+ },
699
+ rawSelectCount: async (c) => {
700
+ var _a;
701
+ const results = await c.db.execute(
702
+ `SELECT COUNT(*) as count FROM test_data`
703
+ );
704
+ return ((_a = results[0]) == null ? void 0 : _a.count) ?? 0;
705
+ },
706
+ insertMany: async (c, count) => {
707
+ if (count <= 0) {
708
+ return { count: 0 };
709
+ }
710
+ const now = Date.now();
711
+ const values = [];
712
+ for (let i = 0; i < count; i++) {
713
+ values.push(`('User ${i}', '', ${now})`);
714
+ }
715
+ await c.db.execute(
716
+ `INSERT INTO test_data (value, payload, created_at) VALUES ${values.join(", ")}`
717
+ );
718
+ return { count };
719
+ },
720
+ updateValue: async (c, id, value) => {
721
+ await c.db.execute(
722
+ `UPDATE test_data SET value = '${value}' WHERE id = ${id}`
723
+ );
724
+ return { success: true };
725
+ },
726
+ deleteValue: async (c, id) => {
727
+ await c.db.execute(`DELETE FROM test_data WHERE id = ${id}`);
728
+ },
729
+ transactionCommit: async (c, value) => {
730
+ await c.db.execute(
731
+ `BEGIN; INSERT INTO test_data (value, payload, created_at) VALUES ('${value}', '', ${Date.now()}); COMMIT;`
732
+ );
733
+ },
734
+ transactionRollback: async (c, value) => {
735
+ await c.db.execute(
736
+ `BEGIN; INSERT INTO test_data (value, payload, created_at) VALUES ('${value}', '', ${Date.now()}); ROLLBACK;`
737
+ );
738
+ },
739
+ insertPayloadOfSize: async (c, size) => {
740
+ const payload = "x".repeat(size);
741
+ await c.db.execute(
742
+ `INSERT INTO test_data (value, payload, created_at) VALUES ('payload', '${payload}', ${Date.now()})`
743
+ );
744
+ const results = await c.db.execute(
745
+ `SELECT last_insert_rowid() as id`
746
+ );
747
+ return { id: results[0].id, size };
748
+ },
749
+ getPayloadSize: async (c, id) => {
750
+ var _a;
751
+ const results = await c.db.execute(
752
+ `SELECT length(payload) as size FROM test_data WHERE id = ${id}`
753
+ );
754
+ return ((_a = results[0]) == null ? void 0 : _a.size) ?? 0;
755
+ },
756
+ insertPayloadRows: async (c, count, payloadSize) => {
757
+ const normalizedCount = Math.max(0, Math.trunc(count));
758
+ if (normalizedCount === 0) {
759
+ return { count: 0 };
760
+ }
761
+ const payload = makePayload2(payloadSize);
762
+ const now = Date.now();
763
+ for (let i = 0; i < normalizedCount; i++) {
764
+ await c.db.execute(
765
+ `INSERT INTO test_data (value, payload, created_at) VALUES ('bulk-${i}', '${payload}', ${now})`
766
+ );
767
+ }
768
+ return { count: normalizedCount };
769
+ },
770
+ roundRobinUpdateValues: async (c, rowIds, iterations) => {
771
+ const normalizedRowIds = normalizeRowIds2(rowIds);
772
+ const normalizedIterations = Math.max(0, Math.trunc(iterations));
773
+ if (normalizedRowIds.length === 0 || normalizedIterations === 0) {
774
+ const emptyRows = [];
775
+ return emptyRows;
776
+ }
777
+ for (let i = 0; i < normalizedIterations; i++) {
778
+ const rowId = normalizedRowIds[i % normalizedRowIds.length] ?? 0;
779
+ await c.db.execute(
780
+ `UPDATE test_data SET value = 'v-${i}' WHERE id = ${rowId}`
781
+ );
782
+ }
783
+ return await c.db.execute(
784
+ `SELECT id, value FROM test_data WHERE id IN (${normalizedRowIds.join(",")}) ORDER BY id`
785
+ );
786
+ },
787
+ getPageCount: async (c) => {
788
+ const rows = await c.db.execute(
789
+ "PRAGMA page_count"
790
+ );
791
+ return toSafeInteger2(firstRowValue2(rows[0]));
792
+ },
793
+ vacuum: async (c) => {
794
+ await c.db.execute("VACUUM");
795
+ },
796
+ integrityCheck: async (c) => {
797
+ const rows = await c.db.execute(
798
+ "PRAGMA integrity_check"
799
+ );
800
+ const value = firstRowValue2(rows[0]);
801
+ return String(value ?? "");
802
+ },
803
+ runMixedWorkload: async (c, seedCount, churnCount) => {
804
+ const normalizedSeedCount = Math.max(1, Math.trunc(seedCount));
805
+ const normalizedChurnCount = Math.max(0, Math.trunc(churnCount));
806
+ const now = Date.now();
807
+ for (let i = 0; i < normalizedSeedCount; i++) {
808
+ const payload = makePayload2(1024 + i % 5 * 128);
809
+ await c.db.execute(
810
+ `INSERT OR REPLACE INTO test_data (id, value, payload, created_at) VALUES (${i + 1}, 'seed-${i}', '${payload}', ${now})`
811
+ );
812
+ }
813
+ for (let i = 0; i < normalizedChurnCount; i++) {
814
+ const id = i % normalizedSeedCount + 1;
815
+ if (i % 9 === 0) {
816
+ await c.db.execute(`DELETE FROM test_data WHERE id = ${id}`);
817
+ } else {
818
+ const payload = makePayload2(768 + i % 7 * 96);
819
+ await c.db.execute(
820
+ `INSERT OR REPLACE INTO test_data (id, value, payload, created_at) VALUES (${id}, 'upd-${i}', '${payload}', ${now + i})`
821
+ );
822
+ }
823
+ }
824
+ },
825
+ repeatUpdate: async (c, id, count) => {
826
+ let value = "";
827
+ if (count <= 0) {
828
+ return { value };
829
+ }
830
+ const statements = ["BEGIN"];
831
+ for (let i = 0; i < count; i++) {
832
+ value = `Updated ${i}`;
833
+ statements.push(
834
+ `UPDATE test_data SET value = '${value}' WHERE id = ${id}`
835
+ );
836
+ }
837
+ statements.push("COMMIT");
838
+ await c.db.execute(statements.join("; "));
839
+ return { value };
840
+ },
841
+ multiStatementInsert: async (c, value) => {
842
+ var _a;
843
+ await c.db.execute(
844
+ `BEGIN; INSERT INTO test_data (value, payload, created_at) VALUES ('${value}', '', ${Date.now()}); UPDATE test_data SET value = '${value}-updated' WHERE id = last_insert_rowid(); COMMIT;`
845
+ );
846
+ const results = await c.db.execute(
847
+ `SELECT value FROM test_data ORDER BY id DESC LIMIT 1`
848
+ );
849
+ return ((_a = results[0]) == null ? void 0 : _a.value) ?? null;
850
+ },
851
+ triggerSleep: (c) => {
852
+ c.sleep();
853
+ }
854
+ },
855
+ options: {
856
+ actionTimeout: 12e4,
857
+ sleepTimeout: 100
858
+ }
859
+ });
860
+
861
+ // fixtures/driver-test-suite/db-lifecycle.ts
862
+ var clientActorIds = /* @__PURE__ */ new WeakMap();
863
+ var createCounts = /* @__PURE__ */ new Map();
864
+ var migrateCounts = /* @__PURE__ */ new Map();
865
+ var cleanupCounts = /* @__PURE__ */ new Map();
866
+ function increment(map, actorId) {
867
+ map.set(actorId, (map.get(actorId) ?? 0) + 1);
868
+ }
869
+ function getCounts(actorId) {
870
+ return {
871
+ create: createCounts.get(actorId) ?? 0,
872
+ migrate: migrateCounts.get(actorId) ?? 0,
873
+ cleanup: cleanupCounts.get(actorId) ?? 0
874
+ };
875
+ }
876
+ function getTotalCleanupCount() {
877
+ let total = 0;
878
+ for (const count of cleanupCounts.values()) {
879
+ total += count;
880
+ }
881
+ return total;
882
+ }
883
+ var baseProvider = db({
884
+ onMigrate: async (dbHandle) => {
885
+ await dbHandle.execute(`
886
+ CREATE TABLE IF NOT EXISTS lifecycle_data (
887
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
888
+ value TEXT NOT NULL,
889
+ created_at INTEGER NOT NULL
890
+ )
891
+ `);
892
+ }
893
+ });
894
+ var lifecycleProvider = {
895
+ createClient: async (ctx) => {
896
+ const client = await baseProvider.createClient(ctx);
897
+ clientActorIds.set(client, ctx.actorId);
898
+ increment(createCounts, ctx.actorId);
899
+ return client;
900
+ },
901
+ onMigrate: async (client) => {
902
+ const actorId = clientActorIds.get(client);
903
+ if (actorId) {
904
+ increment(migrateCounts, actorId);
905
+ }
906
+ await baseProvider.onMigrate(client);
907
+ },
908
+ onDestroy: async (client) => {
909
+ var _a;
910
+ const actorId = clientActorIds.get(client);
911
+ if (actorId) {
912
+ increment(cleanupCounts, actorId);
913
+ }
914
+ await ((_a = baseProvider.onDestroy) == null ? void 0 : _a.call(baseProvider, client));
915
+ }
916
+ };
917
+ var failingLifecycleProvider = {
918
+ createClient: async (ctx) => {
919
+ const client = await baseProvider.createClient(ctx);
920
+ clientActorIds.set(client, ctx.actorId);
921
+ increment(createCounts, ctx.actorId);
922
+ return client;
923
+ },
924
+ onMigrate: async (client) => {
925
+ const actorId = clientActorIds.get(client);
926
+ if (actorId) {
927
+ increment(migrateCounts, actorId);
928
+ }
929
+ throw new Error("forced migrate failure");
930
+ },
931
+ onDestroy: async (client) => {
932
+ var _a;
933
+ const actorId = clientActorIds.get(client);
934
+ if (actorId) {
935
+ increment(cleanupCounts, actorId);
936
+ }
937
+ await ((_a = baseProvider.onDestroy) == null ? void 0 : _a.call(baseProvider, client));
938
+ }
939
+ };
940
+ var dbLifecycle = actor({
941
+ db: lifecycleProvider,
942
+ actions: {
943
+ getActorId: (c) => c.actorId,
944
+ ping: () => "pong",
945
+ insertValue: async (c, value) => {
946
+ await c.db.execute(
947
+ "INSERT INTO lifecycle_data (value, created_at) VALUES (?, ?)",
948
+ value,
949
+ Date.now()
950
+ );
951
+ },
952
+ getCount: async (c) => {
953
+ var _a;
954
+ const results = await c.db.execute(
955
+ `SELECT COUNT(*) as count FROM lifecycle_data`
956
+ );
957
+ return ((_a = results[0]) == null ? void 0 : _a.count) ?? 0;
958
+ },
959
+ triggerSleep: (c) => {
960
+ c.sleep();
961
+ },
962
+ triggerDestroy: (c) => {
963
+ c.destroy();
964
+ }
965
+ },
966
+ options: {
967
+ sleepTimeout: 100
968
+ }
969
+ });
970
+ var dbLifecycleFailing = actor({
971
+ db: failingLifecycleProvider,
972
+ actions: {
973
+ ping: () => "pong"
974
+ }
975
+ });
976
+ var dbLifecycleObserver = actor({
977
+ actions: {
978
+ getCounts: (_c, actorId) => {
979
+ return getCounts(actorId);
980
+ },
981
+ getTotalCleanupCount: () => {
982
+ return getTotalCleanupCount();
983
+ }
984
+ }
985
+ });
986
+
987
+ // fixtures/driver-test-suite/actor-onstatechange.ts
988
+ var onStateChangeActor = actor({
989
+ state: {
990
+ value: 0,
991
+ changeCount: 0
992
+ },
993
+ actions: {
994
+ // Action that modifies state - should trigger onStateChange
995
+ setValue: (c, newValue) => {
996
+ c.state.value = newValue;
997
+ return c.state.value;
998
+ },
999
+ // Action that modifies state multiple times - should trigger onStateChange for each change
1000
+ incrementMultiple: (c, times) => {
1001
+ for (let i = 0; i < times; i++) {
1002
+ c.state.value++;
1003
+ }
1004
+ return c.state.value;
1005
+ },
1006
+ // Action that doesn't modify state - should NOT trigger onStateChange
1007
+ getValue: (c) => {
1008
+ return c.state.value;
1009
+ },
1010
+ // Action that reads and returns without modifying - should NOT trigger onStateChange
1011
+ getDoubled: (c) => {
1012
+ const doubled = c.state.value * 2;
1013
+ return doubled;
1014
+ },
1015
+ // Get the count of how many times onStateChange was called
1016
+ getChangeCount: (c) => {
1017
+ return c.state.changeCount;
1018
+ },
1019
+ // Reset change counter for testing
1020
+ resetChangeCount: (c) => {
1021
+ c.state.changeCount = 0;
1022
+ }
1023
+ },
1024
+ // Track onStateChange calls
1025
+ onStateChange: (c) => {
1026
+ c.state.changeCount++;
1027
+ }
1028
+ });
1029
+
1030
+ // fixtures/driver-test-suite/conn-params.ts
1031
+ var counterWithParams = actor({
1032
+ state: { count: 0, initializers: [] },
1033
+ createConnState: (c, params) => {
1034
+ return {
1035
+ name: params.name || "anonymous"
1036
+ };
1037
+ },
1038
+ onConnect: (c, conn) => {
1039
+ c.state.initializers.push(conn.state.name);
1040
+ },
1041
+ actions: {
1042
+ increment: (c, x) => {
1043
+ c.state.count += x;
1044
+ c.broadcast("newCount", {
1045
+ count: c.state.count,
1046
+ by: c.conn.state.name
1047
+ });
1048
+ return c.state.count;
1049
+ },
1050
+ getInitializers: (c) => {
1051
+ return c.state.initializers;
1052
+ }
1053
+ }
1054
+ });
1055
+
1056
+ // fixtures/driver-test-suite/conn-state.ts
1057
+ var connStateActor = actor({
1058
+ state: {
1059
+ sharedCounter: 0,
1060
+ disconnectionCount: 0
1061
+ },
1062
+ // Define connection state
1063
+ createConnState: (c, params) => {
1064
+ return {
1065
+ username: (params == null ? void 0 : params.username) || "anonymous",
1066
+ role: (params == null ? void 0 : params.role) || "user",
1067
+ counter: 0,
1068
+ createdAt: Date.now(),
1069
+ noCount: (params == null ? void 0 : params.noCount) ?? false
1070
+ };
1071
+ },
1072
+ // Lifecycle hook when a connection is established
1073
+ onConnect: (c, conn) => {
1074
+ c.broadcast("userConnected", {
1075
+ id: conn.id,
1076
+ username: "anonymous",
1077
+ role: "user"
1078
+ });
1079
+ },
1080
+ // Lifecycle hook when a connection is closed
1081
+ onDisconnect: (c, conn) => {
1082
+ var _a;
1083
+ if (!((_a = conn.state) == null ? void 0 : _a.noCount)) {
1084
+ c.state.disconnectionCount += 1;
1085
+ c.broadcast("userDisconnected", {
1086
+ id: conn.id
1087
+ });
1088
+ }
1089
+ },
1090
+ actions: {
1091
+ // Action to increment the connection's counter
1092
+ incrementConnCounter: (c, amount = 1) => {
1093
+ c.conn.state.counter += amount;
1094
+ },
1095
+ // Action to increment the shared counter
1096
+ incrementSharedCounter: (c, amount = 1) => {
1097
+ c.state.sharedCounter += amount;
1098
+ return c.state.sharedCounter;
1099
+ },
1100
+ // Get the connection state
1101
+ getConnectionState: (c) => {
1102
+ return { id: c.conn.id, ...c.conn.state };
1103
+ },
1104
+ // Check all active connections
1105
+ getConnectionIds: (c) => {
1106
+ return c.conns.entries().filter((c2) => {
1107
+ var _a;
1108
+ return !((_a = c2[1].state) == null ? void 0 : _a.noCount);
1109
+ }).map((x) => x[0]).toArray();
1110
+ },
1111
+ // Get disconnection count
1112
+ getDisconnectionCount: (c) => {
1113
+ return c.state.disconnectionCount;
1114
+ },
1115
+ // Get all active connection states
1116
+ getAllConnectionStates: (c) => {
1117
+ return c.conns.entries().map(([id, conn]) => ({ id, ...conn.state })).toArray();
1118
+ },
1119
+ // Send message to a specific connection with matching ID
1120
+ sendToConnection: (c, targetId, message) => {
1121
+ if (c.conns.has(targetId)) {
1122
+ c.conns.get(targetId).send("directMessage", { from: c.conn.id, message });
1123
+ return true;
1124
+ } else {
1125
+ return false;
1126
+ }
1127
+ },
1128
+ // Update connection state (simulated for tests)
1129
+ updateConnection: (c, updates) => {
1130
+ if (updates.username) c.conn.state.username = updates.username;
1131
+ if (updates.role) c.conn.state.role = updates.role;
1132
+ return c.conn.state;
1133
+ },
1134
+ disconnectSelf: (c, reason) => {
1135
+ c.conn.disconnect(reason ?? "test.disconnect");
1136
+ return true;
1137
+ }
1138
+ }
1139
+ });
1140
+
1141
+ // fixtures/driver-test-suite/counter.ts
1142
+ var counter = actor({
1143
+ state: { count: 0 },
1144
+ actions: {
1145
+ increment: (c, x) => {
1146
+ c.state.count += x;
1147
+ c.broadcast("newCount", c.state.count);
1148
+ return c.state.count;
1149
+ },
1150
+ setCount: (c, x) => {
1151
+ c.state.count = x;
1152
+ c.broadcast("newCount", x);
1153
+ return c.state.count;
1154
+ },
1155
+ getCount: (c) => {
1156
+ return c.state.count;
1157
+ },
1158
+ getKey: (c) => {
1159
+ return c.key;
1160
+ }
1161
+ }
1162
+ });
1163
+
1164
+ // fixtures/driver-test-suite/counter-conn.ts
1165
+ var counterConn = actor({
1166
+ state: {
1167
+ connectionCount: 0
1168
+ },
1169
+ connState: { count: 0 },
1170
+ onConnect: (c, conn) => {
1171
+ c.state.connectionCount += 1;
1172
+ },
1173
+ onDisconnect: (c, conn) => {
1174
+ c.state.connectionCount -= 1;
1175
+ },
1176
+ actions: {
1177
+ increment: (c, x) => {
1178
+ c.conn.state.count += x;
1179
+ c.broadcast("newCount", c.conn.state.count);
1180
+ },
1181
+ setCount: (c, x) => {
1182
+ c.conn.state.count = x;
1183
+ c.broadcast("newCount", x);
1184
+ },
1185
+ getCount: (c) => {
1186
+ return c.conn.state.count;
1187
+ },
1188
+ getConnectionCount: (c) => {
1189
+ return c.state.connectionCount;
1190
+ }
1191
+ }
1192
+ });
1193
+
1194
+ // fixtures/driver-test-suite/destroy.ts
1195
+ var destroyObserver = actor({
1196
+ state: { destroyedActors: [] },
1197
+ actions: {
1198
+ notifyDestroyed: (c, actorKey) => {
1199
+ c.state.destroyedActors.push(actorKey);
1200
+ },
1201
+ wasDestroyed: (c, actorKey) => {
1202
+ return c.state.destroyedActors.includes(actorKey);
1203
+ },
1204
+ reset: (c) => {
1205
+ c.state.destroyedActors = [];
1206
+ }
1207
+ }
1208
+ });
1209
+ var destroyActor = actor({
1210
+ state: { value: 0, key: "" },
1211
+ onWake: (c) => {
1212
+ c.state.key = c.key.join("/");
1213
+ },
1214
+ onDestroy: async (c) => {
1215
+ const client = c.client();
1216
+ const observer = client.destroyObserver.getOrCreate(["observer"]);
1217
+ await observer.notifyDestroyed(c.state.key);
1218
+ },
1219
+ actions: {
1220
+ setValue: async (c, newValue) => {
1221
+ c.state.value = newValue;
1222
+ await c.saveState({ immediate: true });
1223
+ return c.state.value;
1224
+ },
1225
+ getValue: (c) => {
1226
+ return c.state.value;
1227
+ },
1228
+ destroy: (c) => {
1229
+ c.destroy();
1230
+ }
1231
+ }
1232
+ });
1233
+
1234
+ // fixtures/driver-test-suite/error-handling.ts
1235
+ var errorHandlingActor = actor({
1236
+ state: {
1237
+ errorLog: []
1238
+ },
1239
+ actions: {
1240
+ // Action that throws a UserError with just a message
1241
+ throwSimpleError: () => {
1242
+ throw new UserError("Simple error message");
1243
+ },
1244
+ // Action that throws a UserError with code and metadata
1245
+ throwDetailedError: () => {
1246
+ throw new UserError("Detailed error message", {
1247
+ code: "detailed_error",
1248
+ metadata: {
1249
+ reason: "test",
1250
+ timestamp: Date.now()
1251
+ }
1252
+ });
1253
+ },
1254
+ // Action that throws an internal error
1255
+ throwInternalError: () => {
1256
+ throw new Error("This is an internal error");
1257
+ },
1258
+ // Action that returns successfully
1259
+ successfulAction: () => {
1260
+ return "success";
1261
+ },
1262
+ // Action that times out (simulated with a long delay)
1263
+ timeoutAction: async (c) => {
1264
+ return new Promise((resolve) => {
1265
+ setTimeout(() => {
1266
+ resolve("This should not be reached if timeout works");
1267
+ }, 1e4);
1268
+ });
1269
+ },
1270
+ // Action with configurable delay to test timeout edge cases
1271
+ delayedAction: async (c, delayMs) => {
1272
+ return new Promise((resolve) => {
1273
+ setTimeout(() => {
1274
+ resolve(`Completed after ${delayMs}ms`);
1275
+ }, delayMs);
1276
+ });
1277
+ },
1278
+ // Log an error for inspection
1279
+ logError: (c, error) => {
1280
+ c.state.errorLog.push(error);
1281
+ return c.state.errorLog;
1282
+ },
1283
+ // Get the error log
1284
+ getErrorLog: (c) => {
1285
+ return c.state.errorLog;
1286
+ },
1287
+ // Clear the error log
1288
+ clearErrorLog: (c) => {
1289
+ c.state.errorLog = [];
1290
+ return true;
1291
+ }
1292
+ },
1293
+ options: {
1294
+ actionTimeout: 500
1295
+ // 500ms timeout for actions
1296
+ }
1297
+ });
1298
+ var customTimeoutActor = actor({
1299
+ state: {},
1300
+ actions: {
1301
+ quickAction: async () => {
1302
+ await new Promise((resolve) => setTimeout(resolve, 50));
1303
+ return "Quick action completed";
1304
+ },
1305
+ slowAction: async () => {
1306
+ await new Promise((resolve) => setTimeout(resolve, 300));
1307
+ return "Slow action completed";
1308
+ }
1309
+ },
1310
+ options: {
1311
+ actionTimeout: 200
1312
+ // 200ms timeout
1313
+ }
1314
+ });
1315
+
1316
+ // fixtures/driver-test-suite/file-system-hibernation-cleanup.ts
1317
+ var fileSystemHibernationCleanupActor = actor({
1318
+ state: {
1319
+ wakeCount: 0,
1320
+ sleepCount: 0,
1321
+ disconnectWakeCounts: []
1322
+ },
1323
+ createConnState: () => ({}),
1324
+ onWake: (c) => {
1325
+ c.state.wakeCount += 1;
1326
+ },
1327
+ onSleep: (c) => {
1328
+ c.state.sleepCount += 1;
1329
+ },
1330
+ onDisconnect: (c, conn) => {
1331
+ if (conn.isHibernatable) {
1332
+ c.state.disconnectWakeCounts.push(c.state.wakeCount);
1333
+ }
1334
+ },
1335
+ actions: {
1336
+ ping: () => "pong",
1337
+ triggerSleep: (c) => {
1338
+ c.sleep();
1339
+ },
1340
+ getCounts: (c) => ({
1341
+ wakeCount: c.state.wakeCount,
1342
+ sleepCount: c.state.sleepCount
1343
+ }),
1344
+ getDisconnectWakeCounts: (c) => c.state.disconnectWakeCounts
1345
+ },
1346
+ options: {
1347
+ sleepTimeout: 500
1348
+ }
1349
+ });
1350
+
1351
+ // fixtures/driver-test-suite/inline-client.ts
1352
+ var inlineClientActor = actor({
1353
+ state: { messages: [] },
1354
+ actions: {
1355
+ // Action that uses client to call another actor (stateless)
1356
+ callCounterIncrement: async (c, amount) => {
1357
+ const client = c.client();
1358
+ const result = await client.counter.getOrCreate(["inline-test"]).increment(amount);
1359
+ c.state.messages.push(
1360
+ `Called counter.increment(${amount}), result: ${result}`
1361
+ );
1362
+ return result;
1363
+ },
1364
+ // Action that uses client to get counter state (stateless)
1365
+ getCounterState: async (c) => {
1366
+ const client = c.client();
1367
+ const count = await client.counter.getOrCreate(["inline-test"]).getCount();
1368
+ c.state.messages.push(`Got counter state: ${count}`);
1369
+ return count;
1370
+ },
1371
+ // Action that uses client with .connect() for stateful communication
1372
+ connectToCounterAndIncrement: async (c, amount) => {
1373
+ const client = c.client();
1374
+ const handle = client.counter.getOrCreate(["inline-test-stateful"]);
1375
+ const connection = handle.connect();
1376
+ const events = [];
1377
+ connection.on("newCount", (count) => {
1378
+ events.push(count);
1379
+ });
1380
+ const result1 = await connection.increment(amount);
1381
+ const result2 = await connection.increment(amount * 2);
1382
+ await connection.dispose();
1383
+ c.state.messages.push(
1384
+ `Connected to counter, incremented by ${amount} and ${amount * 2}, results: ${result1}, ${result2}, events: ${JSON.stringify(events)}`
1385
+ );
1386
+ return { result1, result2, events };
1387
+ },
1388
+ // Get all messages from this actor's state
1389
+ getMessages: (c) => {
1390
+ return c.state.messages;
1391
+ },
1392
+ // Clear messages
1393
+ clearMessages: (c) => {
1394
+ c.state.messages = [];
1395
+ }
1396
+ }
1397
+ });
1398
+
1399
+ // fixtures/driver-test-suite/kv.ts
1400
+ var kvActor = actor({
1401
+ actions: {
1402
+ putText: async (c, key, value) => {
1403
+ await c.kv.put(key, value);
1404
+ return true;
1405
+ },
1406
+ getText: async (c, key) => {
1407
+ return await c.kv.get(key);
1408
+ },
1409
+ listText: async (c, prefix) => {
1410
+ const results = await c.kv.list(prefix, { keyType: "text" });
1411
+ return results.map(([key, value]) => ({
1412
+ key,
1413
+ value
1414
+ }));
1415
+ },
1416
+ roundtripArrayBuffer: async (c, key, values) => {
1417
+ const buffer = new Uint8Array(values).buffer;
1418
+ await c.kv.put(key, buffer, { type: "arrayBuffer" });
1419
+ const result = await c.kv.get(key, { type: "arrayBuffer" });
1420
+ if (!result) {
1421
+ return null;
1422
+ }
1423
+ return Array.from(new Uint8Array(result));
1424
+ }
1425
+ }
1426
+ });
1427
+
1428
+ // fixtures/driver-test-suite/large-payloads.ts
1429
+ var largePayloadActor = actor({
1430
+ state: {},
1431
+ actions: {
1432
+ /**
1433
+ * Accepts a large request payload and returns its size
1434
+ */
1435
+ processLargeRequest: (c, data) => {
1436
+ return {
1437
+ itemCount: data.items.length,
1438
+ firstItem: data.items[0],
1439
+ lastItem: data.items[data.items.length - 1]
1440
+ };
1441
+ },
1442
+ /**
1443
+ * Returns a large response payload
1444
+ */
1445
+ getLargeResponse: (c, itemCount) => {
1446
+ const items = [];
1447
+ for (let i = 0; i < itemCount; i++) {
1448
+ items.push(`Item ${i} with some additional text to increase size`);
1449
+ }
1450
+ return { items };
1451
+ },
1452
+ /**
1453
+ * Echo back the request data
1454
+ */
1455
+ echo: (c, data) => {
1456
+ return data;
1457
+ }
1458
+ }
1459
+ });
1460
+ var largePayloadConnActor = actor({
1461
+ state: {},
1462
+ connState: {
1463
+ lastRequestSize: 0
1464
+ },
1465
+ actions: {
1466
+ /**
1467
+ * Accepts a large request payload and returns its size
1468
+ */
1469
+ processLargeRequest: (c, data) => {
1470
+ c.conn.state.lastRequestSize = data.items.length;
1471
+ return {
1472
+ itemCount: data.items.length,
1473
+ firstItem: data.items[0],
1474
+ lastItem: data.items[data.items.length - 1]
1475
+ };
1476
+ },
1477
+ /**
1478
+ * Returns a large response payload
1479
+ */
1480
+ getLargeResponse: (c, itemCount) => {
1481
+ const items = [];
1482
+ for (let i = 0; i < itemCount; i++) {
1483
+ items.push(`Item ${i} with some additional text to increase size`);
1484
+ }
1485
+ return { items };
1486
+ },
1487
+ /**
1488
+ * Echo back the request data
1489
+ */
1490
+ echo: (c, data) => {
1491
+ return data;
1492
+ },
1493
+ /**
1494
+ * Get the last request size
1495
+ */
1496
+ getLastRequestSize: (c) => {
1497
+ return c.conn.state.lastRequestSize;
1498
+ }
1499
+ }
1500
+ });
1501
+
1502
+ // fixtures/driver-test-suite/lifecycle.ts
1503
+ var counterWithLifecycle = actor({
1504
+ state: {
1505
+ count: 0,
1506
+ events: []
1507
+ },
1508
+ createConnState: (c, params) => ({
1509
+ joinTime: Date.now()
1510
+ }),
1511
+ onWake: (c) => {
1512
+ c.state.events.push("onWake");
1513
+ },
1514
+ onBeforeConnect: (c, params) => {
1515
+ if (params == null ? void 0 : params.trackLifecycle) c.state.events.push("onBeforeConnect");
1516
+ },
1517
+ onConnect: (c, conn) => {
1518
+ var _a;
1519
+ if ((_a = conn.params) == null ? void 0 : _a.trackLifecycle) c.state.events.push("onConnect");
1520
+ },
1521
+ onDisconnect: (c, conn) => {
1522
+ var _a;
1523
+ if ((_a = conn.params) == null ? void 0 : _a.trackLifecycle) c.state.events.push("onDisconnect");
1524
+ },
1525
+ actions: {
1526
+ getEvents: (c) => {
1527
+ return c.state.events;
1528
+ },
1529
+ increment: (c, x) => {
1530
+ c.state.count += x;
1531
+ return c.state.count;
1532
+ }
1533
+ }
1534
+ });
1535
+
1536
+ // fixtures/driver-test-suite/metadata.ts
1537
+ var metadataActor = actor({
1538
+ state: {
1539
+ lastMetadata: null,
1540
+ actorName: "",
1541
+ // Store tags and region in state for testing since they may not be
1542
+ // available in the context in all environments
1543
+ storedTags: {},
1544
+ storedRegion: null
1545
+ },
1546
+ onWake: (c) => {
1547
+ c.state.actorName = c.name;
1548
+ },
1549
+ actions: {
1550
+ // Set up test tags - this will be called by tests to simulate tags
1551
+ setupTestTags: (c, tags) => {
1552
+ c.state.storedTags = tags;
1553
+ return tags;
1554
+ },
1555
+ // Set up test region - this will be called by tests to simulate region
1556
+ setupTestRegion: (c, region) => {
1557
+ c.state.storedRegion = region;
1558
+ return region;
1559
+ },
1560
+ // Get all available metadata
1561
+ getMetadata: (c) => {
1562
+ const metadata = {
1563
+ name: c.name,
1564
+ tags: c.state.storedTags,
1565
+ region: c.state.storedRegion
1566
+ };
1567
+ c.state.lastMetadata = metadata;
1568
+ return metadata;
1569
+ },
1570
+ // Get the actor name
1571
+ getActorName: (c) => {
1572
+ return c.name;
1573
+ },
1574
+ // Get a specific tag by key
1575
+ getTag: (c, key) => {
1576
+ return c.state.storedTags[key] || null;
1577
+ },
1578
+ // Get all tags
1579
+ getTags: (c) => {
1580
+ return c.state.storedTags;
1581
+ },
1582
+ // Get the region
1583
+ getRegion: (c) => {
1584
+ return c.state.storedRegion;
1585
+ },
1586
+ // Get the stored actor name (from onWake)
1587
+ getStoredActorName: (c) => {
1588
+ return c.state.actorName;
1589
+ },
1590
+ // Get last retrieved metadata
1591
+ getLastMetadata: (c) => {
1592
+ return c.state.lastMetadata;
1593
+ }
1594
+ }
1595
+ });
1596
+
1597
+ // fixtures/driver-test-suite/queue.ts
1598
+ var queueSchemas = {
1599
+ greeting: queue(),
1600
+ self: queue(),
1601
+ a: queue(),
1602
+ b: queue(),
1603
+ c: queue(),
1604
+ one: queue(),
1605
+ two: queue(),
1606
+ missing: queue(),
1607
+ abort: queue(),
1608
+ tasks: queue(),
1609
+ timeout: queue(),
1610
+ nowait: queue(),
1611
+ twice: queue()
1612
+ };
1613
+ var queueActor = actor({
1614
+ state: {},
1615
+ queues: queueSchemas,
1616
+ actions: {
1617
+ receiveOne: async (c, name, opts) => {
1618
+ const message = await c.queue.next({
1619
+ names: [name],
1620
+ timeout: opts == null ? void 0 : opts.timeout
1621
+ });
1622
+ if (!message) {
1623
+ return null;
1624
+ }
1625
+ return { name: message.name, body: message.body };
1626
+ },
1627
+ receiveMany: async (c, names, opts) => {
1628
+ const messages = await c.queue.nextBatch({
1629
+ names,
1630
+ count: opts == null ? void 0 : opts.count,
1631
+ timeout: opts == null ? void 0 : opts.timeout
1632
+ });
1633
+ return messages.map((message) => ({
1634
+ name: message.name,
1635
+ body: message.body
1636
+ }));
1637
+ },
1638
+ receiveRequest: async (c, request) => {
1639
+ const messages = await c.queue.nextBatch(request);
1640
+ return messages.map((message) => ({
1641
+ name: message.name,
1642
+ body: message.body
1643
+ }));
1644
+ },
1645
+ tryReceiveMany: async (c, request) => {
1646
+ const messages = await c.queue.tryNextBatch(request);
1647
+ return messages.map((message) => ({
1648
+ name: message.name,
1649
+ body: message.body
1650
+ }));
1651
+ },
1652
+ receiveWithIterator: async (c, name) => {
1653
+ for await (const message of c.queue.iter({ names: [name] })) {
1654
+ return { name: message.name, body: message.body };
1655
+ }
1656
+ return null;
1657
+ },
1658
+ receiveWithAsyncIterator: async (c) => {
1659
+ for await (const message of c.queue.iter()) {
1660
+ return { name: message.name, body: message.body };
1661
+ }
1662
+ return null;
1663
+ },
1664
+ sendToSelf: async (c, name, body) => {
1665
+ const client = c.client();
1666
+ const handle = client.queueActor.getForId(c.actorId);
1667
+ await handle.send(name, body);
1668
+ return true;
1669
+ },
1670
+ waitForAbort: async (c) => {
1671
+ setTimeout(() => {
1672
+ c.destroy();
1673
+ }, 10);
1674
+ await c.queue.next({ names: ["abort"], timeout: 1e4 });
1675
+ return true;
1676
+ },
1677
+ waitForSignalAbort: async (c) => {
1678
+ const controller = new AbortController();
1679
+ controller.abort();
1680
+ try {
1681
+ await c.queue.next({
1682
+ names: ["abort"],
1683
+ timeout: 1e4,
1684
+ signal: controller.signal
1685
+ });
1686
+ return { ok: false };
1687
+ } catch (error) {
1688
+ const actorError = error;
1689
+ return { group: actorError.group, code: actorError.code };
1690
+ }
1691
+ },
1692
+ waitForActorAbortWithSignal: async (c) => {
1693
+ const controller = new AbortController();
1694
+ setTimeout(() => {
1695
+ c.destroy();
1696
+ }, 10);
1697
+ try {
1698
+ await c.queue.next({
1699
+ names: ["abort"],
1700
+ timeout: 1e4,
1701
+ signal: controller.signal
1702
+ });
1703
+ return { ok: false };
1704
+ } catch (error) {
1705
+ const actorError = error;
1706
+ return { group: actorError.group, code: actorError.code };
1707
+ }
1708
+ },
1709
+ iterWithSignalAbort: async (c) => {
1710
+ const controller = new AbortController();
1711
+ controller.abort();
1712
+ for await (const _message of c.queue.iter({
1713
+ names: ["abort"],
1714
+ signal: controller.signal
1715
+ })) {
1716
+ return { ok: false };
1717
+ }
1718
+ return { ok: true };
1719
+ },
1720
+ receiveAndComplete: async (c, name) => {
1721
+ const message = await c.queue.next({
1722
+ names: [name],
1723
+ completable: true
1724
+ });
1725
+ if (!message) {
1726
+ return null;
1727
+ }
1728
+ await message.complete({ echo: message.body });
1729
+ return { name: message.name, body: message.body };
1730
+ },
1731
+ receiveWithoutComplete: async (c, name) => {
1732
+ const message = await c.queue.next({
1733
+ names: [name],
1734
+ completable: true
1735
+ });
1736
+ if (!message) {
1737
+ return null;
1738
+ }
1739
+ return { name: message.name, body: message.body };
1740
+ },
1741
+ receiveManualThenNextWithoutComplete: async (c, name) => {
1742
+ const message = await c.queue.next({
1743
+ names: [name],
1744
+ completable: true
1745
+ });
1746
+ if (!message) {
1747
+ return { ok: false, reason: "no_message" };
1748
+ }
1749
+ try {
1750
+ await c.queue.next({ names: [name], timeout: 0 });
1751
+ c.destroy();
1752
+ return { ok: false, reason: "next_succeeded" };
1753
+ } catch (error) {
1754
+ c.destroy();
1755
+ const actorError = error;
1756
+ return { group: actorError.group, code: actorError.code };
1757
+ }
1758
+ },
1759
+ receiveAndCompleteTwice: async (c, name) => {
1760
+ const message = await c.queue.next({
1761
+ names: [name],
1762
+ completable: true
1763
+ });
1764
+ if (!message) {
1765
+ return null;
1766
+ }
1767
+ await message.complete({ ok: true });
1768
+ try {
1769
+ await message.complete({ ok: true });
1770
+ return { ok: false };
1771
+ } catch (error) {
1772
+ const actorError = error;
1773
+ return { group: actorError.group, code: actorError.code };
1774
+ }
1775
+ },
1776
+ receiveWithoutCompleteMethod: async (c, name) => {
1777
+ const message = await c.queue.next({
1778
+ names: [name],
1779
+ completable: true
1780
+ });
1781
+ return {
1782
+ hasComplete: message !== void 0 && typeof message.complete === "function"
1783
+ };
1784
+ }
1785
+ }
1786
+ });
1787
+ var queueLimitedActor = actor({
1788
+ state: {},
1789
+ queues: {
1790
+ message: queue(),
1791
+ oversize: queue()
1792
+ },
1793
+ actions: {},
1794
+ options: {
1795
+ maxQueueSize: 1,
1796
+ maxQueueMessageSize: 64
1797
+ }
1798
+ });
1799
+
1800
+ // fixtures/driver-test-suite/raw-http.ts
1801
+ import { Hono } from "hono";
1802
+ var rawHttpActor = actor({
1803
+ state: {
1804
+ requestCount: 0
1805
+ },
1806
+ onRequest(ctx, request) {
1807
+ const url = new URL(request.url);
1808
+ const method = request.method;
1809
+ ctx.state.requestCount++;
1810
+ if (url.pathname === "/api/hello") {
1811
+ return new Response(
1812
+ JSON.stringify({ message: "Hello from actor!" }),
1813
+ {
1814
+ headers: { "Content-Type": "application/json" }
1815
+ }
1816
+ );
1817
+ }
1818
+ if (url.pathname === "/api/echo" && method === "POST") {
1819
+ return new Response(request.body, {
1820
+ headers: request.headers
1821
+ });
1822
+ }
1823
+ if (url.pathname === "/api/state") {
1824
+ return new Response(
1825
+ JSON.stringify({
1826
+ requestCount: ctx.state.requestCount
1827
+ }),
1828
+ {
1829
+ headers: { "Content-Type": "application/json" }
1830
+ }
1831
+ );
1832
+ }
1833
+ if (url.pathname === "/api/headers") {
1834
+ const headers = {};
1835
+ request.headers.forEach((value, key) => {
1836
+ headers[key] = value;
1837
+ });
1838
+ return new Response(JSON.stringify(headers), {
1839
+ headers: { "Content-Type": "application/json" }
1840
+ });
1841
+ }
1842
+ return new Response("Not Found", { status: 404 });
1843
+ },
1844
+ actions: {}
1845
+ });
1846
+ var rawHttpNoHandlerActor = actor({
1847
+ actions: {}
1848
+ });
1849
+ var rawHttpVoidReturnActor = actor({
1850
+ onRequest(ctx, request) {
1851
+ return void 0;
1852
+ },
1853
+ actions: {}
1854
+ });
1855
+ var rawHttpHonoActor = actor({
1856
+ createVars() {
1857
+ const router = new Hono();
1858
+ router.get(
1859
+ "/",
1860
+ (c) => c.json({ message: "Welcome to Hono actor!" })
1861
+ );
1862
+ router.get(
1863
+ "/users",
1864
+ (c) => c.json([
1865
+ { id: 1, name: "Alice" },
1866
+ { id: 2, name: "Bob" }
1867
+ ])
1868
+ );
1869
+ router.get("/users/:id", (c) => {
1870
+ const id = c.req.param("id");
1871
+ return c.json({
1872
+ id: parseInt(id),
1873
+ name: id === "1" ? "Alice" : "Bob"
1874
+ });
1875
+ });
1876
+ router.post("/users", async (c) => {
1877
+ const body = await c.req.json();
1878
+ return c.json({ id: 3, ...body }, 201);
1879
+ });
1880
+ router.put("/users/:id", async (c) => {
1881
+ const id = c.req.param("id");
1882
+ const body = await c.req.json();
1883
+ return c.json({ id: parseInt(id), ...body });
1884
+ });
1885
+ router.delete("/users/:id", (c) => {
1886
+ const id = c.req.param("id");
1887
+ return c.json({ message: `User ${id} deleted` });
1888
+ });
1889
+ return { router };
1890
+ },
1891
+ onRequest(ctx, request) {
1892
+ return ctx.vars.router.fetch(request);
1893
+ },
1894
+ actions: {}
1895
+ });
1896
+
1897
+ // fixtures/driver-test-suite/raw-http-request-properties.ts
1898
+ var rawHttpRequestPropertiesActor = actor({
1899
+ actions: {},
1900
+ onRequest(ctx, request) {
1901
+ const url = new URL(request.url);
1902
+ const method = request.method;
1903
+ const headers = {};
1904
+ request.headers.forEach((value, key) => {
1905
+ headers[key] = value;
1906
+ });
1907
+ const handleBody = async () => {
1908
+ if (!request.body) {
1909
+ return null;
1910
+ }
1911
+ const contentType = request.headers.get("content-type") || "";
1912
+ try {
1913
+ if (contentType.includes("application/json")) {
1914
+ const text2 = await request.text();
1915
+ return text2 ? JSON.parse(text2) : null;
1916
+ } else {
1917
+ const text2 = await request.text();
1918
+ return text2 || null;
1919
+ }
1920
+ } catch (error) {
1921
+ return null;
1922
+ }
1923
+ };
1924
+ if (method === "HEAD") {
1925
+ return new Response(null, {
1926
+ status: 200
1927
+ });
1928
+ }
1929
+ if (method === "OPTIONS") {
1930
+ return new Response(null, {
1931
+ status: 204
1932
+ });
1933
+ }
1934
+ return handleBody().then((body) => {
1935
+ const responseData = {
1936
+ // URL properties
1937
+ url: request.url,
1938
+ pathname: url.pathname,
1939
+ search: url.search,
1940
+ searchParams: Object.fromEntries(url.searchParams.entries()),
1941
+ hash: url.hash,
1942
+ // Method
1943
+ method: request.method,
1944
+ // Headers
1945
+ headers,
1946
+ // Body
1947
+ body,
1948
+ bodyText: typeof body === "string" ? body : body === null && request.body !== null ? "" : null,
1949
+ // Additional properties that might be available
1950
+ // Note: Some properties like cache, credentials, mode, etc.
1951
+ // might not be available in all environments
1952
+ cache: request.cache || null,
1953
+ credentials: request.credentials || null,
1954
+ mode: request.mode || null,
1955
+ redirect: request.redirect || null,
1956
+ referrer: request.referrer || null
1957
+ };
1958
+ return new Response(JSON.stringify(responseData), {
1959
+ headers: { "Content-Type": "application/json" }
1960
+ });
1961
+ });
1962
+ }
1963
+ });
1964
+
1965
+ // fixtures/driver-test-suite/raw-websocket.ts
1966
+ var rawWebSocketActor = actor({
1967
+ state: {
1968
+ connectionCount: 0,
1969
+ messageCount: 0
1970
+ },
1971
+ onWebSocket(ctx, websocket) {
1972
+ ctx.state.connectionCount = ctx.state.connectionCount + 1;
1973
+ console.log(
1974
+ `[ACTOR] New connection, count: ${ctx.state.connectionCount}`
1975
+ );
1976
+ websocket.send(
1977
+ JSON.stringify({
1978
+ type: "welcome",
1979
+ connectionCount: ctx.state.connectionCount
1980
+ })
1981
+ );
1982
+ console.log("[ACTOR] Sent welcome message");
1983
+ websocket.addEventListener("message", (event2) => {
1984
+ var _a;
1985
+ ctx.state.messageCount = ctx.state.messageCount + 1;
1986
+ console.log(
1987
+ `[ACTOR] Message received, total count: ${ctx.state.messageCount}, data:`,
1988
+ event2.data
1989
+ );
1990
+ const data = event2.data;
1991
+ if (typeof data === "string") {
1992
+ try {
1993
+ const parsed = JSON.parse(data);
1994
+ if (parsed.type === "ping") {
1995
+ websocket.send(
1996
+ JSON.stringify({
1997
+ type: "pong",
1998
+ timestamp: Date.now()
1999
+ })
2000
+ );
2001
+ } else if (parsed.type === "getStats") {
2002
+ console.log(
2003
+ `[ACTOR] Sending stats - connections: ${ctx.state.connectionCount}, messages: ${ctx.state.messageCount}`
2004
+ );
2005
+ websocket.send(
2006
+ JSON.stringify({
2007
+ type: "stats",
2008
+ connectionCount: ctx.state.connectionCount,
2009
+ messageCount: ctx.state.messageCount
2010
+ })
2011
+ );
2012
+ } else if (parsed.type === "getRequestInfo") {
2013
+ const url = ((_a = ctx.request) == null ? void 0 : _a.url) || "ws://actor/websocket";
2014
+ const urlObj = new URL(url);
2015
+ websocket.send(
2016
+ JSON.stringify({
2017
+ type: "requestInfo",
2018
+ url,
2019
+ pathname: urlObj.pathname,
2020
+ search: urlObj.search
2021
+ })
2022
+ );
2023
+ } else {
2024
+ websocket.send(data);
2025
+ }
2026
+ } catch {
2027
+ websocket.send(data);
2028
+ }
2029
+ } else {
2030
+ websocket.send(data);
2031
+ }
2032
+ });
2033
+ websocket.addEventListener("close", () => {
2034
+ ctx.state.connectionCount = ctx.state.connectionCount - 1;
2035
+ console.log(
2036
+ `[ACTOR] Connection closed, count: ${ctx.state.connectionCount}`
2037
+ );
2038
+ });
2039
+ },
2040
+ actions: {
2041
+ getStats(ctx) {
2042
+ return {
2043
+ connectionCount: ctx.state.connectionCount,
2044
+ messageCount: ctx.state.messageCount
2045
+ };
2046
+ }
2047
+ }
2048
+ });
2049
+ var rawWebSocketBinaryActor = actor({
2050
+ onWebSocket(ctx, websocket) {
2051
+ websocket.addEventListener("message", (event2) => {
2052
+ const data = event2.data;
2053
+ if (data instanceof ArrayBuffer || data instanceof Uint8Array) {
2054
+ const bytes = new Uint8Array(data);
2055
+ const reversed = new Uint8Array(bytes.length);
2056
+ for (let i = 0; i < bytes.length; i++) {
2057
+ reversed[i] = bytes[bytes.length - 1 - i];
2058
+ }
2059
+ websocket.send(reversed);
2060
+ }
2061
+ });
2062
+ },
2063
+ actions: {}
2064
+ });
2065
+
2066
+ // fixtures/driver-test-suite/request-access.ts
2067
+ var requestAccessActor = actor({
2068
+ state: {
2069
+ // Track request info from different hooks
2070
+ onBeforeConnectRequest: {
2071
+ hasRequest: false,
2072
+ requestUrl: null,
2073
+ requestMethod: null,
2074
+ requestHeaders: {}
2075
+ },
2076
+ createConnStateRequest: {
2077
+ hasRequest: false,
2078
+ requestUrl: null,
2079
+ requestMethod: null,
2080
+ requestHeaders: {}
2081
+ },
2082
+ onRequestRequest: {
2083
+ hasRequest: false,
2084
+ requestUrl: null,
2085
+ requestMethod: null,
2086
+ requestHeaders: {}
2087
+ },
2088
+ onWebSocketRequest: {
2089
+ hasRequest: false,
2090
+ requestUrl: null,
2091
+ requestMethod: null,
2092
+ requestHeaders: {}
2093
+ }
2094
+ },
2095
+ createConnState: (c, params) => {
2096
+ let requestInfo = null;
2097
+ if ((params == null ? void 0 : params.trackRequest) && c.request) {
2098
+ const headers = {};
2099
+ c.request.headers.forEach((value, key) => {
2100
+ headers[key] = value;
2101
+ });
2102
+ requestInfo = {
2103
+ hasRequest: true,
2104
+ requestUrl: c.request.url,
2105
+ requestMethod: c.request.method,
2106
+ requestHeaders: headers
2107
+ };
2108
+ }
2109
+ return {
2110
+ trackRequest: (params == null ? void 0 : params.trackRequest) || false,
2111
+ requestInfo
2112
+ };
2113
+ },
2114
+ onConnect: (c, conn) => {
2115
+ if (conn.state.requestInfo) {
2116
+ c.state.createConnStateRequest = conn.state.requestInfo;
2117
+ }
2118
+ },
2119
+ onBeforeConnect: (c, params) => {
2120
+ if (params == null ? void 0 : params.trackRequest) {
2121
+ if (c.request) {
2122
+ c.state.onBeforeConnectRequest.hasRequest = true;
2123
+ c.state.onBeforeConnectRequest.requestUrl = c.request.url;
2124
+ c.state.onBeforeConnectRequest.requestMethod = c.request.method;
2125
+ const headers = {};
2126
+ c.request.headers.forEach((value, key) => {
2127
+ headers[key] = value;
2128
+ });
2129
+ c.state.onBeforeConnectRequest.requestHeaders = headers;
2130
+ } else {
2131
+ c.state.onBeforeConnectRequest.hasRequest = false;
2132
+ }
2133
+ }
2134
+ },
2135
+ onRequest: (c, request) => {
2136
+ c.state.onRequestRequest.hasRequest = true;
2137
+ c.state.onRequestRequest.requestUrl = request.url;
2138
+ c.state.onRequestRequest.requestMethod = request.method;
2139
+ const headers = {};
2140
+ request.headers.forEach((value, key) => {
2141
+ headers[key] = value;
2142
+ });
2143
+ c.state.onRequestRequest.requestHeaders = headers;
2144
+ return new Response(
2145
+ JSON.stringify({
2146
+ hasRequest: true,
2147
+ requestUrl: request.url,
2148
+ requestMethod: request.method,
2149
+ requestHeaders: headers
2150
+ }),
2151
+ {
2152
+ status: 200,
2153
+ headers: { "Content-Type": "application/json" }
2154
+ }
2155
+ );
2156
+ },
2157
+ onWebSocket: (c, websocket) => {
2158
+ if (!c.request) throw "Missing request";
2159
+ c.state.onWebSocketRequest.hasRequest = true;
2160
+ c.state.onWebSocketRequest.requestUrl = c.request.url;
2161
+ c.state.onWebSocketRequest.requestMethod = c.request.method;
2162
+ const headers = {};
2163
+ c.request.headers.forEach((value, key) => {
2164
+ headers[key] = value;
2165
+ });
2166
+ c.state.onWebSocketRequest.requestHeaders = headers;
2167
+ websocket.send(
2168
+ JSON.stringify({
2169
+ hasRequest: true,
2170
+ requestUrl: c.request.url,
2171
+ requestMethod: c.request.method,
2172
+ requestHeaders: headers
2173
+ })
2174
+ );
2175
+ websocket.addEventListener("message", (event2) => {
2176
+ websocket.send(event2.data);
2177
+ });
2178
+ },
2179
+ actions: {
2180
+ getRequestInfo: (c) => {
2181
+ return {
2182
+ onBeforeConnect: c.state.onBeforeConnectRequest,
2183
+ createConnState: c.state.createConnStateRequest,
2184
+ onRequest: c.state.onRequestRequest,
2185
+ onWebSocket: c.state.onWebSocketRequest
2186
+ };
2187
+ }
2188
+ }
2189
+ });
2190
+
2191
+ // fixtures/driver-test-suite/reject-connection.ts
2192
+ var rejectConnectionActor = actor({
2193
+ onBeforeConnect: async (_c, params) => {
2194
+ if (params == null ? void 0 : params.reject) {
2195
+ await new Promise((resolve) => setTimeout(resolve, 500));
2196
+ throw new UserError("Rejected connection", {
2197
+ code: "rejected"
2198
+ });
2199
+ }
2200
+ },
2201
+ actions: {
2202
+ ping: () => "pong"
2203
+ }
2204
+ });
2205
+
2206
+ // fixtures/driver-test-suite/scheduled.ts
2207
+ var scheduled = actor({
2208
+ state: {
2209
+ lastRun: 0,
2210
+ scheduledCount: 0,
2211
+ taskHistory: []
2212
+ },
2213
+ actions: {
2214
+ // Schedule using 'at' with specific timestamp
2215
+ scheduleTaskAt: (c, timestamp) => {
2216
+ c.schedule.at(timestamp, "onScheduledTask");
2217
+ return timestamp;
2218
+ },
2219
+ // Schedule using 'after' with delay
2220
+ scheduleTaskAfter: (c, delayMs) => {
2221
+ c.schedule.after(delayMs, "onScheduledTask");
2222
+ return Date.now() + delayMs;
2223
+ },
2224
+ // Schedule with a task ID for ordering tests
2225
+ scheduleTaskAfterWithId: (c, taskId, delayMs) => {
2226
+ c.schedule.after(delayMs, "onScheduledTaskWithId", taskId);
2227
+ return { taskId, scheduledFor: Date.now() + delayMs };
2228
+ },
2229
+ // Original method for backward compatibility
2230
+ scheduleTask: (c, delayMs) => {
2231
+ const timestamp = Date.now() + delayMs;
2232
+ c.schedule.at(timestamp, "onScheduledTask");
2233
+ return timestamp;
2234
+ },
2235
+ // Getters for state
2236
+ getLastRun: (c) => {
2237
+ return c.state.lastRun;
2238
+ },
2239
+ getScheduledCount: (c) => {
2240
+ return c.state.scheduledCount;
2241
+ },
2242
+ getTaskHistory: (c) => {
2243
+ return c.state.taskHistory;
2244
+ },
2245
+ clearHistory: (c) => {
2246
+ c.state.taskHistory = [];
2247
+ c.state.scheduledCount = 0;
2248
+ c.state.lastRun = 0;
2249
+ return true;
2250
+ },
2251
+ // Scheduled task handlers
2252
+ onScheduledTask: (c) => {
2253
+ c.state.lastRun = Date.now();
2254
+ c.state.scheduledCount++;
2255
+ c.broadcast("scheduled", {
2256
+ time: c.state.lastRun,
2257
+ count: c.state.scheduledCount
2258
+ });
2259
+ },
2260
+ onScheduledTaskWithId: (c, taskId) => {
2261
+ c.state.lastRun = Date.now();
2262
+ c.state.scheduledCount++;
2263
+ c.state.taskHistory.push(taskId);
2264
+ c.broadcast("scheduledWithId", {
2265
+ taskId,
2266
+ time: c.state.lastRun,
2267
+ count: c.state.scheduledCount
2268
+ });
2269
+ }
2270
+ }
2271
+ });
2272
+
2273
+ // fixtures/driver-test-suite/stateless.ts
2274
+ var statelessActor = actor({
2275
+ actions: {
2276
+ ping: () => "pong",
2277
+ echo: (c, message) => message,
2278
+ getActorId: (c) => c.actorId,
2279
+ // Try to access state - should throw StateNotEnabled
2280
+ tryGetState: (c) => {
2281
+ try {
2282
+ const state = c.state;
2283
+ return { success: true, state };
2284
+ } catch (error) {
2285
+ return { success: false, error: error.message };
2286
+ }
2287
+ },
2288
+ // Try to access db - should throw DatabaseNotEnabled
2289
+ tryGetDb: (c) => {
2290
+ try {
2291
+ const db3 = c.db;
2292
+ return { success: true, db: db3 };
2293
+ } catch (error) {
2294
+ return { success: false, error: error.message };
2295
+ }
2296
+ }
2297
+ }
2298
+ });
2299
+
2300
+ // fixtures/driver-test-suite/vars.ts
2301
+ var staticVarActor = actor({
2302
+ state: { value: 0 },
2303
+ connState: { hello: "world" },
2304
+ vars: { counter: 42, name: "test-actor" },
2305
+ actions: {
2306
+ getVars: (c) => {
2307
+ return c.vars;
2308
+ },
2309
+ getName: (c) => {
2310
+ return c.vars.name;
2311
+ }
2312
+ }
2313
+ });
2314
+ var nestedVarActor = actor({
2315
+ state: { value: 0 },
2316
+ connState: { hello: "world" },
2317
+ vars: {
2318
+ counter: 42,
2319
+ nested: {
2320
+ value: "original",
2321
+ array: [1, 2, 3],
2322
+ obj: { key: "value" }
2323
+ }
2324
+ },
2325
+ actions: {
2326
+ getVars: (c) => {
2327
+ return c.vars;
2328
+ },
2329
+ modifyNested: (c) => {
2330
+ c.vars.nested.value = "modified";
2331
+ c.vars.nested.array.push(4);
2332
+ c.vars.nested.obj.key = "new-value";
2333
+ return c.vars;
2334
+ }
2335
+ }
2336
+ });
2337
+ var dynamicVarActor = actor({
2338
+ state: { value: 0 },
2339
+ connState: { hello: "world" },
2340
+ createVars: () => {
2341
+ return {
2342
+ random: Math.random(),
2343
+ computed: `Actor-${Math.floor(Math.random() * 1e3)}`
2344
+ };
2345
+ },
2346
+ actions: {
2347
+ getVars: (c) => {
2348
+ return c.vars;
2349
+ }
2350
+ }
2351
+ });
2352
+ var uniqueVarActor = actor({
2353
+ state: { value: 0 },
2354
+ connState: { hello: "world" },
2355
+ createVars: () => {
2356
+ return {
2357
+ id: Math.floor(Math.random() * 1e6)
2358
+ };
2359
+ },
2360
+ actions: {
2361
+ getVars: (c) => {
2362
+ return c.vars;
2363
+ }
2364
+ }
2365
+ });
2366
+ var driverCtxActor = actor({
2367
+ state: { value: 0 },
2368
+ connState: { hello: "world" },
2369
+ createVars: (c, driverCtx) => {
2370
+ return {
2371
+ hasDriverCtx: Boolean(driverCtx == null ? void 0 : driverCtx.isTest)
2372
+ };
2373
+ },
2374
+ actions: {
2375
+ getVars: (c) => {
2376
+ return c.vars;
2377
+ }
2378
+ }
2379
+ });
2380
+
2381
+ // fixtures/driver-test-suite/registry.ts
2382
+ var registry = setup({
2383
+ use: {
2384
+ // From counter.ts
2385
+ counter,
2386
+ // From counter-conn.ts
2387
+ counterConn,
2388
+ // From lifecycle.ts
2389
+ counterWithLifecycle,
2390
+ // From scheduled.ts
2391
+ scheduled,
2392
+ // From sleep.ts
2393
+ sleep,
2394
+ sleepWithLongRpc,
2395
+ sleepWithRawHttp,
2396
+ sleepWithRawWebSocket,
2397
+ sleepWithNoSleepOption,
2398
+ // From error-handling.ts
2399
+ errorHandlingActor,
2400
+ customTimeoutActor,
2401
+ // From inline-client.ts
2402
+ inlineClientActor,
2403
+ // From kv.ts
2404
+ kvActor,
2405
+ // From queue.ts
2406
+ queueActor,
2407
+ queueLimitedActor,
2408
+ // From action-inputs.ts
2409
+ inputActor,
2410
+ // From action-timeout.ts
2411
+ shortTimeoutActor,
2412
+ longTimeoutActor,
2413
+ defaultTimeoutActor,
2414
+ syncTimeoutActor,
2415
+ // From action-types.ts
2416
+ syncActionActor,
2417
+ asyncActionActor,
2418
+ promiseActor,
2419
+ // From conn-params.ts
2420
+ counterWithParams,
2421
+ // From conn-state.ts
2422
+ connStateActor,
2423
+ // From metadata.ts
2424
+ metadataActor,
2425
+ // From vars.ts
2426
+ staticVarActor,
2427
+ nestedVarActor,
2428
+ dynamicVarActor,
2429
+ uniqueVarActor,
2430
+ driverCtxActor,
2431
+ // From raw-http.ts
2432
+ rawHttpActor,
2433
+ rawHttpNoHandlerActor,
2434
+ rawHttpVoidReturnActor,
2435
+ rawHttpHonoActor,
2436
+ // From raw-http-request-properties.ts
2437
+ rawHttpRequestPropertiesActor,
2438
+ // From raw-websocket.ts
2439
+ rawWebSocketActor,
2440
+ rawWebSocketBinaryActor,
2441
+ // From reject-connection.ts
2442
+ rejectConnectionActor,
2443
+ // From request-access.ts
2444
+ requestAccessActor,
2445
+ // From actor-onstatechange.ts
2446
+ onStateChangeActor,
2447
+ // From destroy.ts
2448
+ destroyActor,
2449
+ destroyObserver,
2450
+ // From hibernation.ts
2451
+ hibernationActor,
2452
+ // From file-system-hibernation-cleanup.ts
2453
+ fileSystemHibernationCleanupActor,
2454
+ // From large-payloads.ts
2455
+ largePayloadActor,
2456
+ largePayloadConnActor,
2457
+ // From run.ts
2458
+ runWithTicks,
2459
+ runWithQueueConsumer,
2460
+ runWithEarlyExit,
2461
+ runWithError,
2462
+ runWithoutHandler,
2463
+ // From workflow.ts
2464
+ workflowCounterActor,
2465
+ workflowQueueActor,
2466
+ workflowAccessActor,
2467
+ workflowSleepActor,
2468
+ workflowStopTeardownActor,
2469
+ // From actor-db-raw.ts
2470
+ dbActorRaw,
2471
+ // From actor-db-drizzle.ts
2472
+ dbActorDrizzle,
2473
+ // From db-lifecycle.ts
2474
+ dbLifecycle,
2475
+ dbLifecycleFailing,
2476
+ dbLifecycleObserver,
2477
+ // From stateless.ts
2478
+ statelessActor,
2479
+ // From access-control.ts
2480
+ accessControlActor,
2481
+ accessControlNoQueuesActor
2482
+ }
2483
+ });
2484
+
2485
+ // src/serve-test-suite/mod.ts
2486
+ async function getPort() {
2487
+ const MIN_PORT = 1e4;
2488
+ const MAX_PORT = 65535;
2489
+ const getRandomPort = () => Math.floor(Math.random() * (MAX_PORT - MIN_PORT + 1)) + MIN_PORT;
2490
+ let port = getRandomPort();
2491
+ let maxAttempts = 10;
2492
+ while (maxAttempts > 0) {
2493
+ try {
2494
+ const server = await new Promise((resolve, reject) => {
2495
+ const server2 = createServer();
2496
+ server2.once("error", (err) => {
2497
+ if (err.code === "EADDRINUSE") {
2498
+ reject(new Error(`Port ${port} is in use`));
2499
+ } else {
2500
+ reject(err);
2501
+ }
2502
+ });
2503
+ server2.once("listening", () => {
2504
+ resolve(server2);
2505
+ });
2506
+ server2.listen(port);
2507
+ });
2508
+ await new Promise((resolve) => {
2509
+ server.close(() => resolve());
2510
+ });
2511
+ return port;
2512
+ } catch {
2513
+ maxAttempts--;
2514
+ if (maxAttempts <= 0) {
2515
+ break;
2516
+ }
2517
+ port = getRandomPort();
2518
+ }
2519
+ }
2520
+ throw new Error("Could not find an available port after multiple attempts");
2521
+ }
2522
+ async function serveTestSuite() {
2523
+ var _a;
2524
+ registry.config.test = { ...registry.config.test, enabled: true };
2525
+ registry.config.inspector = {
2526
+ enabled: true,
2527
+ token: () => "token"
2528
+ };
2529
+ const port = await getPort();
2530
+ registry.config.managerPort = port;
2531
+ registry.config.serverless = {
2532
+ ...registry.config.serverless,
2533
+ publicEndpoint: `http://127.0.0.1:${port}`
2534
+ };
2535
+ const driver = await createFileSystemOrMemoryDriver(true, {
2536
+ path: `/tmp/rivetkit-test-suite-${crypto.randomUUID()}`
2537
+ });
2538
+ registry.config.driver = driver;
2539
+ let upgradeWebSocket;
2540
+ const parsedConfig = registry.parseConfig();
2541
+ const managerDriver = (_a = driver.manager) == null ? void 0 : _a.call(driver, parsedConfig);
2542
+ invariant(managerDriver, "missing manager driver");
2543
+ const { router } = buildManagerRouter(
2544
+ parsedConfig,
2545
+ managerDriver,
2546
+ () => upgradeWebSocket
2547
+ );
2548
+ const nodeWebSocket = createNodeWebSocket({ app: router });
2549
+ upgradeWebSocket = nodeWebSocket.upgradeWebSocket;
2550
+ managerDriver.setGetUpgradeWebSocket(() => upgradeWebSocket);
2551
+ const server = honoServe({
2552
+ fetch: router.fetch,
2553
+ hostname: "127.0.0.1",
2554
+ port
2555
+ });
2556
+ invariant(
2557
+ nodeWebSocket.injectWebSocket !== void 0,
2558
+ "should have injectWebSocket"
2559
+ );
2560
+ nodeWebSocket.injectWebSocket(server);
2561
+ const endpoint = `http://127.0.0.1:${port}`;
2562
+ logger().info({ msg: "test suite server listening", port });
2563
+ return {
2564
+ endpoint,
2565
+ namespace: "default",
2566
+ runnerName: "default",
2567
+ close: async () => {
2568
+ await new Promise(
2569
+ (resolve) => server.close(() => resolve(void 0))
2570
+ );
2571
+ }
2572
+ };
2573
+ }
2574
+ async function runCli() {
2575
+ const result = await serveTestSuite();
2576
+ process.stdout.write(
2577
+ `${JSON.stringify({
2578
+ endpoint: result.endpoint,
2579
+ namespace: result.namespace,
2580
+ runnerName: result.runnerName
2581
+ })}
2582
+ `
2583
+ );
2584
+ const shutdown = async () => {
2585
+ await result.close();
2586
+ process.exit(0);
2587
+ };
2588
+ process.on("SIGINT", shutdown);
2589
+ process.on("SIGTERM", shutdown);
2590
+ }
2591
+ var mainPath = process.argv[1];
2592
+ if (mainPath && mainPath === fileURLToPath(import.meta.url)) {
2593
+ runCli().catch((err) => {
2594
+ logger().error({ msg: "serve-test-suite failed", error: err });
2595
+ process.exit(1);
2596
+ });
2597
+ }
2598
+ export {
2599
+ serveTestSuite
2600
+ };
2601
+ //# sourceMappingURL=mod.js.map