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,70 @@
1
+ import type { SqliteRuntimeDatabase } from "./sqlite-runtime";
2
+
3
+ // Keep these limits in sync with engine/packages/pegboard/src/actor_kv/mod.rs.
4
+ const KV_MAX_KEY_SIZE = 2 * 1024;
5
+ const KV_MAX_VALUE_SIZE = 128 * 1024;
6
+ const KV_MAX_KEYS = 128;
7
+ const KV_MAX_PUT_PAYLOAD_SIZE = 976 * 1024;
8
+ const KV_MAX_STORAGE_SIZE = 10 * 1024 * 1024 * 1024;
9
+ const KV_KEY_WRAPPER_OVERHEAD_SIZE = 2;
10
+
11
+ export function estimateKvSize(db: SqliteRuntimeDatabase): number {
12
+ const row = db.get<{ total: number | bigint | null }>(
13
+ "SELECT COALESCE(SUM(LENGTH(key) + LENGTH(value)), 0) AS total FROM kv",
14
+ );
15
+ return row ? Number(row.total ?? 0) : 0;
16
+ }
17
+
18
+ export function validateKvKey(
19
+ key: Uint8Array,
20
+ keyLabel: "key" | "prefix key" = "key",
21
+ ): void {
22
+ if (key.byteLength + KV_KEY_WRAPPER_OVERHEAD_SIZE > KV_MAX_KEY_SIZE) {
23
+ throw new Error(`${keyLabel} is too long (max 2048 bytes)`);
24
+ }
25
+ }
26
+
27
+ export function validateKvKeys(keys: Uint8Array[]): void {
28
+ if (keys.length > KV_MAX_KEYS) {
29
+ throw new Error("a maximum of 128 keys is allowed");
30
+ }
31
+
32
+ for (const key of keys) {
33
+ validateKvKey(key);
34
+ }
35
+ }
36
+
37
+ export function validateKvEntries(
38
+ entries: [Uint8Array, Uint8Array][],
39
+ totalSize: number,
40
+ ): void {
41
+ if (entries.length > KV_MAX_KEYS) {
42
+ throw new Error("A maximum of 128 key-value entries is allowed");
43
+ }
44
+
45
+ let payloadSize = 0;
46
+ for (const [key, value] of entries) {
47
+ payloadSize +=
48
+ key.byteLength + KV_KEY_WRAPPER_OVERHEAD_SIZE + value.byteLength;
49
+ }
50
+
51
+ if (payloadSize > KV_MAX_PUT_PAYLOAD_SIZE) {
52
+ throw new Error("total payload is too large (max 976 KiB)");
53
+ }
54
+
55
+ const storageRemaining = Math.max(0, KV_MAX_STORAGE_SIZE - totalSize);
56
+ if (payloadSize > storageRemaining) {
57
+ throw new Error(
58
+ `not enough space left in storage (${storageRemaining} bytes remaining, current payload is ${payloadSize} bytes)`,
59
+ );
60
+ }
61
+
62
+ for (const [key, value] of entries) {
63
+ validateKvKey(key);
64
+ if (value.byteLength > KV_MAX_VALUE_SIZE) {
65
+ throw new Error(
66
+ `value is too large (max ${KV_MAX_VALUE_SIZE / 1024} KiB)`,
67
+ );
68
+ }
69
+ }
70
+ }
@@ -0,0 +1,5 @@
1
+ import { getLogger } from "@/common/log";
2
+
3
+ export function logger() {
4
+ return getLogger("driver-fs");
5
+ }
@@ -0,0 +1,300 @@
1
+ import type { Context as HonoContext } from "hono";
2
+ import invariant from "invariant";
3
+ import { ActorStopping } from "@/actor/errors";
4
+ import { type ActorRouter, createActorRouter } from "@/actor/router";
5
+ import { routeWebSocket } from "@/actor/router-websocket-endpoints";
6
+ import { createClientWithDriver } from "@/client/client";
7
+ import { ClientConfigSchema } from "@/client/config";
8
+ import { createInlineWebSocket } from "@/common/inline-websocket-adapter";
9
+ import { noopNext } from "@/common/utils";
10
+ import type {
11
+ ActorDriver,
12
+ ActorOutput,
13
+ CreateInput,
14
+ GetForIdInput,
15
+ GetOrCreateWithKeyInput,
16
+ GetWithKeyInput,
17
+ ListActorsInput,
18
+ ManagerDriver,
19
+ } from "@/driver-helpers/mod";
20
+ import type { ManagerDisplayInformation } from "@/manager/driver";
21
+ import type { Encoding, UniversalWebSocket } from "@/mod";
22
+ import type { DriverConfig, RegistryConfig } from "@/registry/config";
23
+ import type * as schema from "@/schemas/file-system-driver/mod";
24
+ import type { GetUpgradeWebSocket } from "@/utils";
25
+ import type { FileSystemGlobalState } from "./global-state";
26
+ import { logger } from "./log";
27
+ import { generateActorId } from "./utils";
28
+
29
+ export class FileSystemManagerDriver implements ManagerDriver {
30
+ #config: RegistryConfig;
31
+ #state: FileSystemGlobalState;
32
+ #driverConfig: DriverConfig;
33
+ #getUpgradeWebSocket: GetUpgradeWebSocket | undefined;
34
+
35
+ #actorDriver: ActorDriver;
36
+ #actorRouter: ActorRouter;
37
+
38
+ constructor(
39
+ config: RegistryConfig,
40
+ state: FileSystemGlobalState,
41
+ driverConfig: DriverConfig,
42
+ ) {
43
+ this.#config = config;
44
+ this.#state = state;
45
+ this.#driverConfig = driverConfig;
46
+
47
+ // Actors run on the same node as the manager, so we create a dummy actor router that we route requests to
48
+ const inlineClient = createClientWithDriver(this);
49
+
50
+ this.#actorDriver = this.#driverConfig.actor(
51
+ config,
52
+ this,
53
+ inlineClient,
54
+ );
55
+ this.#actorRouter = createActorRouter(
56
+ this.#config,
57
+ this.#actorDriver,
58
+ undefined,
59
+ config.test.enabled,
60
+ );
61
+ }
62
+
63
+ async sendRequest(
64
+ actorId: string,
65
+ actorRequest: Request,
66
+ ): Promise<Response> {
67
+ return await this.#actorRouter.fetch(actorRequest, {
68
+ actorId,
69
+ });
70
+ }
71
+
72
+ async openWebSocket(
73
+ path: string,
74
+ actorId: string,
75
+ encoding: Encoding,
76
+ params: unknown,
77
+ ): Promise<UniversalWebSocket> {
78
+ // Normalize the path (add leading slash if needed) but preserve query params
79
+ const normalizedPath = path.startsWith("/") ? path : `/${path}`;
80
+
81
+ // Create a fake request with the full URL including query parameters
82
+ const fakeUrl = `http://inline-actor${normalizedPath}`;
83
+ const fakeRequest = new Request(fakeUrl, {
84
+ method: "GET",
85
+ });
86
+
87
+ // Extract just the pathname for routing (without query params)
88
+ const pathOnly = normalizedPath.split("?")[0];
89
+ const { gatewayId, requestId } = createHibernatableRequestMetadata();
90
+
91
+ const wsHandler = await routeWebSocket(
92
+ fakeRequest,
93
+ pathOnly,
94
+ {},
95
+ this.#config,
96
+ this.#actorDriver,
97
+ actorId,
98
+ encoding,
99
+ params,
100
+ gatewayId,
101
+ requestId,
102
+ true,
103
+ false,
104
+ );
105
+ return createInlineWebSocket(wsHandler);
106
+ }
107
+
108
+ async proxyRequest(
109
+ c: HonoContext,
110
+ actorRequest: Request,
111
+ actorId: string,
112
+ ): Promise<Response> {
113
+ return await this.#actorRouter.fetch(actorRequest, {
114
+ actorId,
115
+ });
116
+ }
117
+
118
+ async proxyWebSocket(
119
+ c: HonoContext,
120
+ path: string,
121
+ actorId: string,
122
+ encoding: Encoding,
123
+ params: unknown,
124
+ ): Promise<Response> {
125
+ const upgradeWebSocket = this.#getUpgradeWebSocket?.();
126
+ invariant(upgradeWebSocket, "missing getUpgradeWebSocket");
127
+
128
+ // Handle raw WebSocket paths
129
+ const pathOnly = path.split("?")[0];
130
+ const normalizedPath = pathOnly.startsWith("/")
131
+ ? pathOnly
132
+ : `/${pathOnly}`;
133
+ const { gatewayId, requestId } = createHibernatableRequestMetadata();
134
+ const wsHandler = await routeWebSocket(
135
+ // TODO: Create new request with new path
136
+ c.req.raw,
137
+ normalizedPath,
138
+ c.req.header(),
139
+ this.#config,
140
+ this.#actorDriver,
141
+ actorId,
142
+ encoding,
143
+ params,
144
+ gatewayId,
145
+ requestId,
146
+ true,
147
+ false,
148
+ );
149
+ return upgradeWebSocket(() => wsHandler)(c, noopNext());
150
+ }
151
+
152
+ async buildGatewayUrl(actorId: string): Promise<string> {
153
+ const port = this.#config.managerPort ?? 6420;
154
+ return `http://127.0.0.1:${port}/gateway/${encodeURIComponent(actorId)}`;
155
+ }
156
+
157
+ async getForId({
158
+ actorId,
159
+ }: GetForIdInput): Promise<ActorOutput | undefined> {
160
+ // Validate the actor exists
161
+ const actor = await this.#state.loadActor(actorId);
162
+ if (!actor.state) {
163
+ return undefined;
164
+ }
165
+ if (this.#state.isActorStopping(actorId)) {
166
+ throw new ActorStopping(actorId);
167
+ }
168
+
169
+ return actorStateToOutput(actor.state);
170
+ }
171
+
172
+ async getWithKey({
173
+ name,
174
+ key,
175
+ }: GetWithKeyInput): Promise<ActorOutput | undefined> {
176
+ // Generate the deterministic actor ID
177
+ const actorId = generateActorId(name, key);
178
+
179
+ // Check if actor exists
180
+ const actor = await this.#state.loadActor(actorId);
181
+ if (actor.state) {
182
+ return actorStateToOutput(actor.state);
183
+ }
184
+
185
+ return undefined;
186
+ }
187
+
188
+ async getOrCreateWithKey(
189
+ input: GetOrCreateWithKeyInput,
190
+ ): Promise<ActorOutput> {
191
+ // Generate the deterministic actor ID
192
+ const actorId = generateActorId(input.name, input.key);
193
+
194
+ // Use the atomic getOrCreateActor method
195
+ await this.#state.loadOrCreateActor(
196
+ actorId,
197
+ input.name,
198
+ input.key,
199
+ input.input,
200
+ );
201
+
202
+ // Start the actor immediately so timestamps are set
203
+ await this.#actorDriver.loadActor(actorId);
204
+
205
+ // Reload state to get updated timestamps
206
+ const state = await this.#state.loadActorStateOrError(actorId);
207
+ return actorStateToOutput(state);
208
+ }
209
+
210
+ async createActor({ name, key, input }: CreateInput): Promise<ActorOutput> {
211
+ // Generate the deterministic actor ID
212
+ const actorId = generateActorId(name, key);
213
+
214
+ await this.#state.createActor(actorId, name, key, input);
215
+
216
+ // Start the actor immediately so timestamps are set
217
+ await this.#actorDriver.loadActor(actorId);
218
+
219
+ // Reload state to get updated timestamps
220
+ const state = await this.#state.loadActorStateOrError(actorId);
221
+ return actorStateToOutput(state);
222
+ }
223
+
224
+ async listActors({ name }: ListActorsInput): Promise<ActorOutput[]> {
225
+ const actors: ActorOutput[] = [];
226
+ const itr = this.#state.getActorsIterator({});
227
+
228
+ for await (const actor of itr) {
229
+ if (actor.name === name) {
230
+ actors.push(actorStateToOutput(actor));
231
+ }
232
+ }
233
+
234
+ // Sort by create ts desc (most recent first)
235
+ actors.sort((a, b) => {
236
+ const aTs = a.createTs ?? 0;
237
+ const bTs = b.createTs ?? 0;
238
+ return bTs - aTs;
239
+ });
240
+
241
+ return actors;
242
+ }
243
+
244
+ async kvGet(actorId: string, key: Uint8Array): Promise<string | null> {
245
+ const response = await this.#state.kvBatchGet(actorId, [key]);
246
+ return response[0] !== null
247
+ ? new TextDecoder().decode(response[0])
248
+ : null;
249
+ }
250
+
251
+ displayInformation(): ManagerDisplayInformation {
252
+ return {
253
+ properties: {
254
+ ...(this.#state.persist
255
+ ? { Data: this.#state.storagePath }
256
+ : {}),
257
+ Instances: this.#state.actorCountOnStartup.toString(),
258
+ },
259
+ };
260
+ }
261
+
262
+ extraStartupLog() {
263
+ return {
264
+ instances: this.#state.actorCountOnStartup,
265
+ data: this.#state.storagePath,
266
+ };
267
+ }
268
+
269
+ setGetUpgradeWebSocket(getUpgradeWebSocket: GetUpgradeWebSocket): void {
270
+ this.#getUpgradeWebSocket = getUpgradeWebSocket;
271
+ }
272
+ }
273
+
274
+ function actorStateToOutput(state: schema.ActorState): ActorOutput {
275
+ return {
276
+ actorId: state.actorId,
277
+ name: state.name,
278
+ key: state.key as string[],
279
+ createTs: Number(state.createdAt),
280
+ startTs: state.startTs !== null ? Number(state.startTs) : null,
281
+ connectableTs:
282
+ state.connectableTs !== null ? Number(state.connectableTs) : null,
283
+ sleepTs: state.sleepTs !== null ? Number(state.sleepTs) : null,
284
+ destroyTs: state.destroyTs !== null ? Number(state.destroyTs) : null,
285
+ };
286
+ }
287
+
288
+ function createHibernatableRequestMetadata(): {
289
+ gatewayId: ArrayBuffer;
290
+ requestId: ArrayBuffer;
291
+ } {
292
+ const gatewayId = new Uint8Array(4);
293
+ const requestId = new Uint8Array(4);
294
+ crypto.getRandomValues(gatewayId);
295
+ crypto.getRandomValues(requestId);
296
+ return {
297
+ gatewayId: gatewayId.buffer.slice(0),
298
+ requestId: requestId.buffer.slice(0),
299
+ };
300
+ }
@@ -0,0 +1,78 @@
1
+ import { z } from "zod";
2
+ import type { DriverConfig } from "@/registry/config";
3
+ import { importNodeDependencies } from "@/utils/node";
4
+ import { FileSystemActorDriver } from "./actor";
5
+ import {
6
+ type FileSystemDriverOptions,
7
+ FileSystemGlobalState,
8
+ } from "./global-state";
9
+ import { FileSystemManagerDriver } from "./manager";
10
+
11
+ export { FileSystemActorDriver } from "./actor";
12
+ export { FileSystemGlobalState } from "./global-state";
13
+ export { FileSystemManagerDriver } from "./manager";
14
+ export { getStoragePath } from "./utils";
15
+
16
+ const CreateFileSystemDriverOptionsSchema = z.object({
17
+ /** Custom path for storage. */
18
+ path: z.string().optional(),
19
+ /** Deprecated: file-system driver KV is now always SQLite-backed. */
20
+ useNativeSqlite: z.boolean().optional(),
21
+ });
22
+
23
+ type CreateFileSystemDriverOptionsInput = z.input<
24
+ typeof CreateFileSystemDriverOptionsSchema
25
+ >;
26
+
27
+ export function createFileSystemOrMemoryDriver(
28
+ persist: boolean = true,
29
+ options?: CreateFileSystemDriverOptionsInput,
30
+ ): DriverConfig {
31
+ importNodeDependencies();
32
+
33
+ if (options?.useNativeSqlite === false) {
34
+ throw new Error(
35
+ "File-system driver no longer supports non-SQLite KV storage. Remove useNativeSqlite: false.",
36
+ );
37
+ }
38
+
39
+ const stateOptions: FileSystemDriverOptions = {
40
+ persist,
41
+ customPath: options?.path,
42
+ useNativeSqlite: true,
43
+ };
44
+ const state = new FileSystemGlobalState(stateOptions);
45
+ const driverConfig: DriverConfig = {
46
+ name: persist ? "file-system" : "memory",
47
+ displayName: persist ? "File System" : "Memory",
48
+ manager: (config) =>
49
+ new FileSystemManagerDriver(config, state, driverConfig),
50
+ actor: (config, managerDriver, inlineClient) => {
51
+ const actorDriver = new FileSystemActorDriver(
52
+ config,
53
+ managerDriver,
54
+ inlineClient,
55
+ state,
56
+ );
57
+
58
+ state.onRunnerStart(config, inlineClient, actorDriver);
59
+
60
+ return actorDriver;
61
+ },
62
+ autoStartActorDriver: true,
63
+ };
64
+ return driverConfig;
65
+ }
66
+
67
+ export function createFileSystemDriver(
68
+ opts?: CreateFileSystemDriverOptionsInput,
69
+ ): DriverConfig {
70
+ const validatedOpts = opts
71
+ ? CreateFileSystemDriverOptionsSchema.parse(opts)
72
+ : undefined;
73
+ return createFileSystemOrMemoryDriver(true, validatedOpts);
74
+ }
75
+
76
+ export function createMemoryDriver(): DriverConfig {
77
+ return createFileSystemOrMemoryDriver(false);
78
+ }
@@ -0,0 +1,210 @@
1
+ import { getRequireFn } from "@/utils/node";
2
+
3
+ type SqliteRuntimeKind = "bun" | "node" | "better-sqlite3";
4
+ type SqliteDatabaseCtor = new (path: string) => SqliteRawDatabase;
5
+
6
+ interface SqliteStatement {
7
+ run(...params: unknown[]): unknown;
8
+ get<T = Record<string, unknown>>(...params: unknown[]): T | undefined;
9
+ all<T = Record<string, unknown>>(...params: unknown[]): T[];
10
+ }
11
+
12
+ interface SqliteRawDatabase {
13
+ exec(sql: string): unknown;
14
+ close(): unknown;
15
+ prepare?(sql: string): SqliteStatement;
16
+ query?(sql: string): SqliteStatement;
17
+ }
18
+
19
+ export interface SqliteRuntimeDatabase {
20
+ exec(sql: string): void;
21
+ run(sql: string, params?: readonly unknown[]): void;
22
+ get<T = Record<string, unknown>>(
23
+ sql: string,
24
+ params?: readonly unknown[],
25
+ ): T | undefined;
26
+ all<T = Record<string, unknown>>(
27
+ sql: string,
28
+ params?: readonly unknown[],
29
+ ): T[];
30
+ close(): void;
31
+ }
32
+
33
+ export interface SqliteRuntime {
34
+ kind: SqliteRuntimeKind;
35
+ open(path: string): SqliteRuntimeDatabase;
36
+ }
37
+
38
+ function normalizeParams(params: readonly unknown[] | undefined): unknown[] {
39
+ if (!params || params.length === 0) {
40
+ return [];
41
+ }
42
+
43
+ return params.map((value) => {
44
+ if (value instanceof Uint8Array) {
45
+ return Buffer.from(value);
46
+ }
47
+ return value;
48
+ });
49
+ }
50
+
51
+ function createPreparedDatabaseAdapter(
52
+ rawDb: SqliteRawDatabase,
53
+ prepare: (sql: string) => SqliteStatement,
54
+ ): SqliteRuntimeDatabase {
55
+ return {
56
+ exec: (sql) => {
57
+ rawDb.exec(sql);
58
+ },
59
+ run: (sql, params) => {
60
+ const stmt = prepare(sql);
61
+ stmt.run(...normalizeParams(params));
62
+ },
63
+ get: <T = Record<string, unknown>>(
64
+ sql: string,
65
+ params?: readonly unknown[],
66
+ ) => {
67
+ const stmt = prepare(sql);
68
+ return stmt.get<T>(...normalizeParams(params));
69
+ },
70
+ all: <T = Record<string, unknown>>(
71
+ sql: string,
72
+ params?: readonly unknown[],
73
+ ) => {
74
+ const stmt = prepare(sql);
75
+ return stmt.all<T>(...normalizeParams(params));
76
+ },
77
+ close: () => {
78
+ rawDb.close();
79
+ },
80
+ };
81
+ }
82
+
83
+ function configureSqliteRuntimeDatabase(
84
+ rawDb: SqliteRawDatabase,
85
+ path: string,
86
+ ): void {
87
+ // Wait briefly when the database file is still being released by another
88
+ // process during restarts to reduce transient "database is locked" failures.
89
+ rawDb.exec("PRAGMA busy_timeout = 5000");
90
+
91
+ // WAL improves concurrent read/write behavior for file-backed databases.
92
+ if (path !== ":memory:") {
93
+ rawDb.exec("PRAGMA journal_mode = WAL");
94
+ }
95
+ }
96
+
97
+ export function loadSqliteRuntime(): SqliteRuntime {
98
+ const requireFn = getRequireFn();
99
+ const loadErrors: string[] = [];
100
+
101
+ try {
102
+ const bunSqlite = requireFn(/* webpackIgnore: true */ "bun:sqlite") as {
103
+ Database?: SqliteDatabaseCtor;
104
+ };
105
+ const BunDatabase = bunSqlite.Database;
106
+ if (BunDatabase) {
107
+ return {
108
+ kind: "bun",
109
+ open: (path) => {
110
+ const rawDb = new BunDatabase(path);
111
+ configureSqliteRuntimeDatabase(rawDb, path);
112
+ const query = rawDb.query?.bind(rawDb);
113
+ if (!query) throw new Error("bun:sqlite database missing query method");
114
+ return createPreparedDatabaseAdapter(rawDb, query);
115
+ },
116
+ };
117
+ }
118
+ } catch (error) {
119
+ loadErrors.push(`bun:sqlite unavailable: ${String(error)}`);
120
+ }
121
+
122
+ try {
123
+ const nodeSqlite = requireFn(/* webpackIgnore: true */ "node:sqlite") as {
124
+ DatabaseSync?: SqliteDatabaseCtor;
125
+ };
126
+ const NodeDatabaseSync = nodeSqlite.DatabaseSync;
127
+ if (NodeDatabaseSync) {
128
+ return {
129
+ kind: "node",
130
+ open: (path) => {
131
+ const rawDb = new NodeDatabaseSync(path);
132
+ configureSqliteRuntimeDatabase(rawDb, path);
133
+ const prepare = rawDb.prepare?.bind(rawDb);
134
+ if (!prepare) {
135
+ throw new Error("node:sqlite DatabaseSync missing prepare method");
136
+ }
137
+ return createPreparedDatabaseAdapter(rawDb, prepare);
138
+ },
139
+ };
140
+ }
141
+ } catch (error) {
142
+ loadErrors.push(`node:sqlite unavailable: ${String(error)}`);
143
+ }
144
+
145
+ try {
146
+ const betterSqlite3Module = requireFn(
147
+ /* webpackIgnore: true */ "better-sqlite3",
148
+ ) as SqliteDatabaseCtor | { default?: SqliteDatabaseCtor };
149
+ const BetterSqlite3 =
150
+ typeof betterSqlite3Module === "function"
151
+ ? betterSqlite3Module
152
+ : betterSqlite3Module.default;
153
+ if (BetterSqlite3) {
154
+ return {
155
+ kind: "better-sqlite3",
156
+ open: (path) => {
157
+ const rawDb = new BetterSqlite3(path);
158
+ configureSqliteRuntimeDatabase(rawDb, path);
159
+ const prepare = rawDb.prepare?.bind(rawDb);
160
+ if (!prepare) {
161
+ throw new Error("better-sqlite3 database missing prepare method");
162
+ }
163
+ return createPreparedDatabaseAdapter(rawDb, prepare);
164
+ },
165
+ };
166
+ }
167
+ } catch (error) {
168
+ loadErrors.push(`better-sqlite3 unavailable: ${String(error)}`);
169
+ throw new Error(
170
+ `No SQLite runtime available. Tried bun:sqlite, node:sqlite, and better-sqlite3. Install better-sqlite3 (e.g. "pnpm add better-sqlite3") if native runtimes are unavailable.\n${loadErrors.join("\n")}`,
171
+ );
172
+ }
173
+
174
+ throw new Error(
175
+ `No SQLite runtime available. Tried bun:sqlite, node:sqlite, and better-sqlite3.\n${loadErrors.join("\n")}`,
176
+ );
177
+ }
178
+
179
+ export function computePrefixUpperBound(
180
+ prefix: Uint8Array,
181
+ ): Uint8Array | undefined {
182
+ if (prefix.length === 0) {
183
+ return undefined;
184
+ }
185
+
186
+ const upperBound = new Uint8Array(prefix);
187
+ for (let i = upperBound.length - 1; i >= 0; i--) {
188
+ if (upperBound[i] !== 0xff) {
189
+ upperBound[i] += 1;
190
+ return upperBound.slice(0, i + 1);
191
+ }
192
+ }
193
+ return undefined;
194
+ }
195
+
196
+ export function ensureUint8Array(
197
+ value: unknown,
198
+ fieldName: string,
199
+ ): Uint8Array {
200
+ if (value instanceof Uint8Array) {
201
+ return value;
202
+ }
203
+ if (value instanceof ArrayBuffer) {
204
+ return new Uint8Array(value);
205
+ }
206
+ if (ArrayBuffer.isView(value)) {
207
+ return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
208
+ }
209
+ throw new Error(`SQLite row field "${fieldName}" is not binary data`);
210
+ }