@akterjs/effect 0.0.0-stage → 0.1.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 (798) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +43 -2
  3. package/dist/contract/actor/actor-already-exists.errors.d.mts +8 -0
  4. package/dist/contract/actor/actor-already-exists.errors.mjs +4 -0
  5. package/dist/contract/actor/actor-definition.pure.d.mts +21 -0
  6. package/dist/contract/actor/actor-definition.pure.mjs +106 -0
  7. package/dist/contract/actor/actor-erased.errors.d.mts +8 -0
  8. package/dist/contract/actor/actor-erased.errors.mjs +4 -0
  9. package/dist/contract/actor/actor-names.pure.d.mts +11 -0
  10. package/dist/contract/actor/actor-names.pure.mjs +51 -0
  11. package/dist/contract/actor/actor-not-created.errors.d.mts +8 -0
  12. package/dist/contract/actor/actor-not-created.errors.mjs +4 -0
  13. package/dist/contract/actor/actor-not-registered.errors.d.mts +8 -0
  14. package/dist/contract/actor/actor-not-registered.errors.mjs +4 -0
  15. package/dist/contract/actor/actor-registry.service.d.mts +16 -0
  16. package/dist/contract/actor/actor-registry.service.mjs +21 -0
  17. package/dist/contract/actor/actor.contract.d.mts +238 -0
  18. package/dist/contract/actor/actor.contract.mjs +1 -0
  19. package/dist/contract/actor/host-interface.pure.d.mts +23 -0
  20. package/dist/contract/actor/host-interface.pure.mjs +39 -0
  21. package/dist/contract/actor/reserved-member.errors.d.mts +9 -0
  22. package/dist/contract/actor/reserved-member.errors.mjs +7 -0
  23. package/dist/contract/akter.service.d.mts +75 -0
  24. package/dist/contract/akter.service.mjs +134 -0
  25. package/dist/contract/caller/authentication.api.d.mts +6 -0
  26. package/dist/contract/caller/authentication.api.mjs +5 -0
  27. package/dist/contract/caller/caller-admission.pure.d.mts +27 -0
  28. package/dist/contract/caller/caller-admission.pure.mjs +59 -0
  29. package/dist/contract/caller/caller-not-allowed.errors.d.mts +16 -0
  30. package/dist/contract/caller/caller-not-allowed.errors.mjs +18 -0
  31. package/dist/contract/caller/caller.schema.d.mts +7 -0
  32. package/dist/contract/caller/caller.schema.mjs +8 -0
  33. package/dist/contract/caller/current-caller.service.d.mts +7 -0
  34. package/dist/contract/caller/current-caller.service.mjs +4 -0
  35. package/dist/contract/caller/principal.schema.d.mts +13 -0
  36. package/dist/contract/caller/principal.schema.mjs +10 -0
  37. package/dist/contract/caller/unauthenticated.errors.d.mts +8 -0
  38. package/dist/contract/caller/unauthenticated.errors.mjs +4 -0
  39. package/dist/contract/client/actor-client.adapter.d.mts +42 -0
  40. package/dist/contract/client/actor-client.adapter.mjs +90 -0
  41. package/dist/contract/client/actor-client.contract.d.mts +30 -0
  42. package/dist/contract/client/actor-client.contract.mjs +1 -0
  43. package/dist/contract/client/actor-rpc.contract.d.mts +33 -0
  44. package/dist/contract/client/actor-rpc.contract.mjs +16 -0
  45. package/dist/contract/client/actor-unavailable.errors.d.mts +9 -0
  46. package/dist/contract/client/actor-unavailable.errors.mjs +7 -0
  47. package/dist/contract/client/client-failure.contract.d.mts +28 -0
  48. package/dist/contract/client/client-failure.contract.mjs +28 -0
  49. package/dist/contract/client/invalid-request.errors.d.mts +9 -0
  50. package/dist/contract/client/invalid-request.errors.mjs +7 -0
  51. package/dist/contract/client/storage-limit.errors.d.mts +16 -0
  52. package/dist/contract/client/storage-limit.errors.mjs +14 -0
  53. package/dist/contract/command/command-id-expired.errors.d.mts +11 -0
  54. package/dist/contract/command/command-id-expired.errors.mjs +9 -0
  55. package/dist/contract/command/command-id.schema.d.mts +3 -0
  56. package/dist/contract/command/command-id.schema.mjs +4 -0
  57. package/dist/contract/command/command.contract.d.mts +117 -0
  58. package/dist/contract/command/command.contract.mjs +111 -0
  59. package/dist/contract/command/outbox-id.pure.d.mts +9 -0
  60. package/dist/contract/command/outbox-id.pure.mjs +14 -0
  61. package/dist/contract/command/outbox.schema.d.mts +9 -0
  62. package/dist/contract/command/outbox.schema.mjs +10 -0
  63. package/dist/contract/command/timer.schema.d.mts +20 -0
  64. package/dist/contract/command/timer.schema.mjs +14 -0
  65. package/dist/contract/computer/checkpoint-expired.errors.d.mts +12 -0
  66. package/dist/contract/computer/checkpoint-expired.errors.mjs +8 -0
  67. package/dist/contract/computer/computer-client-failure.contract.d.mts +16 -0
  68. package/dist/contract/computer/computer-client-failure.contract.mjs +1 -0
  69. package/dist/contract/computer/computer-client.adapter.d.mts +21 -0
  70. package/dist/contract/computer/computer-client.adapter.mjs +70 -0
  71. package/dist/contract/computer/computer-client.contract.d.mts +56 -0
  72. package/dist/contract/computer/computer-client.contract.mjs +1 -0
  73. package/dist/contract/computer/computer-held.errors.d.mts +13 -0
  74. package/dist/contract/computer/computer-held.errors.mjs +11 -0
  75. package/dist/contract/computer/computer-limit.errors.d.mts +15 -0
  76. package/dist/contract/computer/computer-limit.errors.mjs +13 -0
  77. package/dist/contract/computer/computer-lost.errors.d.mts +12 -0
  78. package/dist/contract/computer/computer-lost.errors.mjs +8 -0
  79. package/dist/contract/computer/computer-not-found.errors.d.mts +9 -0
  80. package/dist/contract/computer/computer-not-found.errors.mjs +5 -0
  81. package/dist/contract/computer/computer.schema.d.mts +122 -0
  82. package/dist/contract/computer/computer.schema.mjs +117 -0
  83. package/dist/contract/computer/computers-unavailable.errors.d.mts +9 -0
  84. package/dist/contract/computer/computers-unavailable.errors.mjs +5 -0
  85. package/dist/contract/computer/files/computer-files.schema.d.mts +28 -0
  86. package/dist/contract/computer/files/computer-files.schema.mjs +24 -0
  87. package/dist/contract/computer/rpc/computer-rpc.contract.d.mts +108 -0
  88. package/dist/contract/computer/rpc/computer-rpc.contract.mjs +117 -0
  89. package/dist/contract/computer/step/computer-step.contract.d.mts +21 -0
  90. package/dist/contract/computer/step/computer-step.contract.mjs +89 -0
  91. package/dist/contract/computer/step/computer-step.schema.d.mts +69 -0
  92. package/dist/contract/computer/step/computer-step.schema.mjs +71 -0
  93. package/dist/contract/computer/step/step-failure.schema.d.mts +13 -0
  94. package/dist/contract/computer/step/step-failure.schema.mjs +24 -0
  95. package/dist/contract/computer/step/step-not-found.errors.d.mts +9 -0
  96. package/dist/contract/computer/step/step-not-found.errors.mjs +5 -0
  97. package/dist/contract/description/published-contract.pure.d.mts +51 -0
  98. package/dist/contract/description/published-contract.pure.mjs +75 -0
  99. package/dist/contract/file/access/file-access-denied.errors.d.mts +11 -0
  100. package/dist/contract/file/access/file-access-denied.errors.mjs +9 -0
  101. package/dist/contract/file/access/file-access.contract.d.mts +35 -0
  102. package/dist/contract/file/access/file-access.contract.mjs +32 -0
  103. package/dist/contract/file/actor-files.contract.d.mts +50 -0
  104. package/dist/contract/file/actor-files.contract.mjs +1 -0
  105. package/dist/contract/file/blob-transfer.errors.d.mts +9 -0
  106. package/dist/contract/file/blob-transfer.errors.mjs +7 -0
  107. package/dist/contract/file/file-client-failure.contract.d.mts +24 -0
  108. package/dist/contract/file/file-client-failure.contract.mjs +1 -0
  109. package/dist/contract/file/file-client.adapter.d.mts +17 -0
  110. package/dist/contract/file/file-client.adapter.mjs +21 -0
  111. package/dist/contract/file/file-client.contract.d.mts +14 -0
  112. package/dist/contract/file/file-client.contract.mjs +1 -0
  113. package/dist/contract/file/file-listing.pure.d.mts +6 -0
  114. package/dist/contract/file/file-listing.pure.mjs +18 -0
  115. package/dist/contract/file/file-not-found.errors.d.mts +8 -0
  116. package/dist/contract/file/file-not-found.errors.mjs +4 -0
  117. package/dist/contract/file/file-path.pure.d.mts +4 -0
  118. package/dist/contract/file/file-path.pure.mjs +38 -0
  119. package/dist/contract/file/files-unavailable.errors.d.mts +8 -0
  120. package/dist/contract/file/files-unavailable.errors.mjs +4 -0
  121. package/dist/contract/file/invalid-file-request.errors.d.mts +9 -0
  122. package/dist/contract/file/invalid-file-request.errors.mjs +7 -0
  123. package/dist/contract/file/rpc/file-rpc.contract.d.mts +88 -0
  124. package/dist/contract/file/rpc/file-rpc.contract.mjs +117 -0
  125. package/dist/contract/file/rpc/file-too-large.errors.d.mts +13 -0
  126. package/dist/contract/file/rpc/file-too-large.errors.mjs +11 -0
  127. package/dist/contract/file/rpc/rpc-file-clients.layer.d.mts +10 -0
  128. package/dist/contract/file/rpc/rpc-file-clients.layer.mjs +95 -0
  129. package/dist/contract/fork/fork-rpc.contract.d.mts +40 -0
  130. package/dist/contract/fork/fork-rpc.contract.mjs +26 -0
  131. package/dist/contract/history/actor-journal.service.d.mts +58 -0
  132. package/dist/contract/history/actor-journal.service.mjs +67 -0
  133. package/dist/contract/history/history-entry.pure.d.mts +79 -0
  134. package/dist/contract/history/history-entry.pure.mjs +95 -0
  135. package/dist/contract/hosted/handler-failed.errors.d.mts +16 -0
  136. package/dist/contract/hosted/handler-failed.errors.mjs +14 -0
  137. package/dist/contract/hosted/handler-failure.pure.d.mts +21 -0
  138. package/dist/contract/hosted/handler-failure.pure.mjs +86 -0
  139. package/dist/contract/hosted/hosted-actor.service.d.mts +23 -0
  140. package/dist/contract/hosted/hosted-actor.service.mjs +64 -0
  141. package/dist/contract/hosted/hosted-command.service.d.mts +20 -0
  142. package/dist/contract/hosted/hosted-command.service.mjs +88 -0
  143. package/dist/contract/hosted/hosted-create.service.d.mts +17 -0
  144. package/dist/contract/hosted/hosted-create.service.mjs +67 -0
  145. package/dist/contract/hosted/hosted-error.contract.d.mts +11 -0
  146. package/dist/contract/hosted/hosted-error.contract.mjs +1 -0
  147. package/dist/contract/hosted/hosted-failure.schema.d.mts +18 -0
  148. package/dist/contract/hosted/hosted-failure.schema.mjs +31 -0
  149. package/dist/contract/hosted/hosted-outcome.contract.d.mts +18 -0
  150. package/dist/contract/hosted/hosted-outcome.contract.mjs +1 -0
  151. package/dist/contract/hosted/hosted-query.service.d.mts +16 -0
  152. package/dist/contract/hosted/hosted-query.service.mjs +42 -0
  153. package/dist/contract/hosted/hosted-request.pure.d.mts +61 -0
  154. package/dist/contract/hosted/hosted-request.pure.mjs +91 -0
  155. package/dist/contract/job/job-id.pure.d.mts +11 -0
  156. package/dist/contract/job/job-id.pure.mjs +20 -0
  157. package/dist/contract/job/job-patches.contract.d.mts +32 -0
  158. package/dist/contract/job/job-patches.contract.mjs +45 -0
  159. package/dist/contract/job/job-signal.schema.d.mts +13 -0
  160. package/dist/contract/job/job-signal.schema.mjs +16 -0
  161. package/dist/contract/job/reserved-payload-field.errors.d.mts +10 -0
  162. package/dist/contract/job/reserved-payload-field.errors.mjs +8 -0
  163. package/dist/contract/job/started-job.schema.d.mts +7 -0
  164. package/dist/contract/job/started-job.schema.mjs +8 -0
  165. package/dist/contract/json-codec.pure.d.mts +7 -0
  166. package/dist/contract/json-codec.pure.mjs +14 -0
  167. package/dist/contract/room.contract.d.mts +75 -0
  168. package/dist/contract/room.contract.mjs +36 -0
  169. package/dist/contract/secret/actor-secrets.adapter.d.mts +33 -0
  170. package/dist/contract/secret/actor-secrets.adapter.mjs +38 -0
  171. package/dist/contract/secret/invalid-secret-name.errors.d.mts +10 -0
  172. package/dist/contract/secret/invalid-secret-name.errors.mjs +8 -0
  173. package/dist/contract/secret/secret-unavailable.errors.d.mts +11 -0
  174. package/dist/contract/secret/secret-unavailable.errors.mjs +10 -0
  175. package/dist/contract/secret/secret.schema.d.mts +25 -0
  176. package/dist/contract/secret/secret.schema.mjs +34 -0
  177. package/dist/contract/spend/billing-unavailable.errors.d.mts +12 -0
  178. package/dist/contract/spend/billing-unavailable.errors.mjs +8 -0
  179. package/dist/contract/spend/spend-cap-reached.errors.d.mts +17 -0
  180. package/dist/contract/spend/spend-cap-reached.errors.mjs +15 -0
  181. package/dist/contract/state/actor-state.pure.d.mts +38 -0
  182. package/dist/contract/state/actor-state.pure.mjs +153 -0
  183. package/dist/contract/state/actor-state.service.d.mts +45 -0
  184. package/dist/contract/state/actor-state.service.mjs +18 -0
  185. package/dist/contract/state/state-migration.pure.d.mts +11 -0
  186. package/dist/contract/state/state-migration.pure.mjs +23 -0
  187. package/dist/contract/state/state-read.pure.d.mts +12 -0
  188. package/dist/contract/state/state-read.pure.mjs +22 -0
  189. package/dist/contract/state/state-unreadable.errors.d.mts +9 -0
  190. package/dist/contract/state/state-unreadable.errors.mjs +7 -0
  191. package/dist/host/actor/actor-database.service.d.mts +46 -0
  192. package/dist/host/actor/actor-database.service.mjs +112 -0
  193. package/dist/host/actor/actor-exclusive.pure.d.mts +7 -0
  194. package/dist/host/actor/actor-exclusive.pure.mjs +16 -0
  195. package/dist/host/actor/actor-records.sql.d.mts +29 -0
  196. package/dist/host/actor/actor-records.sql.mjs +26 -0
  197. package/dist/host/actor/reserved-name.errors.d.mts +10 -0
  198. package/dist/host/actor/reserved-name.errors.mjs +8 -0
  199. package/dist/host/actor/reserved-names.pure.d.mts +15 -0
  200. package/dist/host/actor/reserved-names.pure.mjs +20 -0
  201. package/dist/host/actor/room.actor.d.mts +4 -0
  202. package/dist/host/actor/room.actor.mjs +36 -0
  203. package/dist/host/blob/blob-frames.pure.d.mts +7 -0
  204. package/dist/host/blob/blob-frames.pure.mjs +28 -0
  205. package/dist/host/blob/blob-grant.schema.d.mts +14 -0
  206. package/dist/host/blob/blob-grant.schema.mjs +15 -0
  207. package/dist/host/blob/blob-grants.service.d.mts +28 -0
  208. package/dist/host/blob/blob-grants.service.mjs +129 -0
  209. package/dist/host/blob/blob-keyring.service.d.mts +18 -0
  210. package/dist/host/blob/blob-keyring.service.mjs +4 -0
  211. package/dist/host/blob/blob-range.pure.d.mts +13 -0
  212. package/dist/host/blob/blob-range.pure.mjs +23 -0
  213. package/dist/host/blob/blob-sealing.contract.d.mts +37 -0
  214. package/dist/host/blob/blob-sealing.contract.mjs +1 -0
  215. package/dist/host/blob/blob-sealing.service.d.mts +11 -0
  216. package/dist/host/blob/blob-sealing.service.mjs +16 -0
  217. package/dist/host/blob/export/blob-archive.sql.d.mts +21 -0
  218. package/dist/host/blob/export/blob-archive.sql.mjs +75 -0
  219. package/dist/host/blob/export/blob-export-holds.sql.d.mts +49 -0
  220. package/dist/host/blob/export/blob-export-holds.sql.mjs +25 -0
  221. package/dist/host/blob/plain-blob-sealing.pure.d.mts +5 -0
  222. package/dist/host/blob/plain-blob-sealing.pure.mjs +55 -0
  223. package/dist/host/blob/reference/blob-catalog.sql.d.mts +40 -0
  224. package/dist/host/blob/reference/blob-catalog.sql.mjs +145 -0
  225. package/dist/host/blob/reference/blob-coordinator.pure.d.mts +10 -0
  226. package/dist/host/blob/reference/blob-coordinator.pure.mjs +153 -0
  227. package/dist/host/blob/reference/blob-file-page.sql.d.mts +13 -0
  228. package/dist/host/blob/reference/blob-file-page.sql.mjs +21 -0
  229. package/dist/host/blob/reference/blob-forks.sql.d.mts +21 -0
  230. package/dist/host/blob/reference/blob-forks.sql.mjs +40 -0
  231. package/dist/host/blob/reference/blob-lineage.sql.d.mts +14 -0
  232. package/dist/host/blob/reference/blob-lineage.sql.mjs +24 -0
  233. package/dist/host/blob/reference/blob-reads.pure.d.mts +15 -0
  234. package/dist/host/blob/reference/blob-reads.pure.mjs +97 -0
  235. package/dist/host/blob/reference/blob-receipts.sql.d.mts +71 -0
  236. package/dist/host/blob/reference/blob-receipts.sql.mjs +176 -0
  237. package/dist/host/blob/reference/blob-transfer-adopt.pure.d.mts +21 -0
  238. package/dist/host/blob/reference/blob-transfer-adopt.pure.mjs +68 -0
  239. package/dist/host/blob/reference/blob-transfer-fork.pure.d.mts +15 -0
  240. package/dist/host/blob/reference/blob-transfer-fork.pure.mjs +125 -0
  241. package/dist/host/blob/reference/blob-transfer-upkeep.pure.d.mts +18 -0
  242. package/dist/host/blob/reference/blob-transfer-upkeep.pure.mjs +54 -0
  243. package/dist/host/blob/reference/blob-transfer.pure.d.mts +85 -0
  244. package/dist/host/blob/reference/blob-transfer.pure.mjs +1 -0
  245. package/dist/host/blob/sealed-blob-sealing.pure.d.mts +10 -0
  246. package/dist/host/blob/sealed-blob-sealing.pure.mjs +130 -0
  247. package/dist/host/blob/stream/blob-directory.pure.d.mts +18 -0
  248. package/dist/host/blob/stream/blob-directory.pure.mjs +84 -0
  249. package/dist/host/blob/stream/blob-length.pure.d.mts +9 -0
  250. package/dist/host/blob/stream/blob-length.pure.mjs +19 -0
  251. package/dist/host/blob/stream/blob-writing.pure.d.mts +8 -0
  252. package/dist/host/blob/stream/blob-writing.pure.mjs +15 -0
  253. package/dist/host/command/batch/command-batch.sql.d.mts +61 -0
  254. package/dist/host/command/batch/command-batch.sql.mjs +100 -0
  255. package/dist/host/command/command-context.adapter.d.mts +47 -0
  256. package/dist/host/command/command-context.adapter.mjs +90 -0
  257. package/dist/host/command/command-id-age.pure.d.mts +13 -0
  258. package/dist/host/command/command-id-age.pure.mjs +31 -0
  259. package/dist/host/command/command-id-reuse.pure.d.mts +28 -0
  260. package/dist/host/command/command-id-reuse.pure.mjs +38 -0
  261. package/dist/host/command/command-id-reused.errors.d.mts +13 -0
  262. package/dist/host/command/command-id-reused.errors.mjs +11 -0
  263. package/dist/host/command/command-journal.sql.d.mts +84 -0
  264. package/dist/host/command/command-journal.sql.mjs +74 -0
  265. package/dist/host/command/command-rejected.errors.d.mts +8 -0
  266. package/dist/host/command/command-rejected.errors.mjs +4 -0
  267. package/dist/host/command/command-replay.service.d.mts +62 -0
  268. package/dist/host/command/command-replay.service.mjs +140 -0
  269. package/dist/host/command/command-reply.pure.d.mts +8 -0
  270. package/dist/host/command/command-reply.pure.mjs +12 -0
  271. package/dist/host/command/command-runner.service.d.mts +68 -0
  272. package/dist/host/command/command-runner.service.mjs +215 -0
  273. package/dist/host/command/files/command-file-inputs.sql.d.mts +51 -0
  274. package/dist/host/command/files/command-file-inputs.sql.mjs +59 -0
  275. package/dist/host/command/history-pruned.errors.d.mts +10 -0
  276. package/dist/host/command/history-pruned.errors.mjs +8 -0
  277. package/dist/host/command/replay/replay-cursor-stalled.errors.d.mts +9 -0
  278. package/dist/host/command/replay/replay-cursor-stalled.errors.mjs +7 -0
  279. package/dist/host/command/replay/replay-cursor.pure.d.mts +7 -0
  280. package/dist/host/command/replay/replay-cursor.pure.mjs +12 -0
  281. package/dist/host/computer/computer-steps.sql.d.mts +14 -0
  282. package/dist/host/computer/computer-steps.sql.mjs +76 -0
  283. package/dist/host/computer/job-computers.service.d.mts +20 -0
  284. package/dist/host/computer/job-computers.service.mjs +59 -0
  285. package/dist/host/computer/local-computer-files.layer.d.mts +11 -0
  286. package/dist/host/computer/local-computer-files.layer.mjs +69 -0
  287. package/dist/host/computer/local-computer-log.layer.d.mts +23 -0
  288. package/dist/host/computer/local-computer-log.layer.mjs +64 -0
  289. package/dist/host/computer/local-computer-records.layer.d.mts +190 -0
  290. package/dist/host/computer/local-computer-records.layer.mjs +99 -0
  291. package/dist/host/computer/local-computer.schema.d.mts +69 -0
  292. package/dist/host/computer/local-computer.schema.mjs +29 -0
  293. package/dist/host/computer/local-computers.adapter.d.mts +18 -0
  294. package/dist/host/computer/local-computers.adapter.mjs +248 -0
  295. package/dist/host/computer/local-step.layer.d.mts +30 -0
  296. package/dist/host/computer/local-step.layer.mjs +119 -0
  297. package/dist/host/file/actor-file-storage.sql.d.mts +15 -0
  298. package/dist/host/file/actor-file-storage.sql.mjs +82 -0
  299. package/dist/host/file/actor-files.sql.d.mts +9 -0
  300. package/dist/host/file/actor-files.sql.mjs +3 -0
  301. package/dist/host/file/blob-home-lock.pure.d.mts +8 -0
  302. package/dist/host/file/blob-home-lock.pure.mjs +10 -0
  303. package/dist/host/file/blob-home.sql.d.mts +19 -0
  304. package/dist/host/file/blob-home.sql.mjs +30 -0
  305. package/dist/host/file/local-blob-home.service.d.mts +16 -0
  306. package/dist/host/file/local-blob-home.service.mjs +43 -0
  307. package/dist/host/file/local-blob-owner.sql.d.mts +30 -0
  308. package/dist/host/file/local-blob-owner.sql.mjs +68 -0
  309. package/dist/host/file/local-file-upkeep.pure.d.mts +12 -0
  310. package/dist/host/file/local-file-upkeep.pure.mjs +41 -0
  311. package/dist/host/file/replay-file-storage.sql.d.mts +7 -0
  312. package/dist/host/file/replay-file-storage.sql.mjs +26 -0
  313. package/dist/host/fork/actor-fork.sql.d.mts +52 -0
  314. package/dist/host/fork/actor-fork.sql.mjs +42 -0
  315. package/dist/host/fork/fork-computers.adapter.d.mts +43 -0
  316. package/dist/host/fork/fork-computers.adapter.mjs +193 -0
  317. package/dist/host/hash/blob-hashing.service.d.mts +10 -0
  318. package/dist/host/hash/blob-hashing.service.mjs +4 -0
  319. package/dist/host/job/job-durables.sql.d.mts +44 -0
  320. package/dist/host/job/job-durables.sql.mjs +136 -0
  321. package/dist/host/job/job-engine.adapter.d.mts +33 -0
  322. package/dist/host/job/job-engine.adapter.mjs +258 -0
  323. package/dist/host/job/job-journal.sql.d.mts +85 -0
  324. package/dist/host/job/job-journal.sql.mjs +109 -0
  325. package/dist/host/job/job-results.service.d.mts +37 -0
  326. package/dist/host/job/job-results.service.mjs +63 -0
  327. package/dist/host/job/job-runs.pure.d.mts +103 -0
  328. package/dist/host/job/job-runs.pure.mjs +193 -0
  329. package/dist/host/job/undelivered-result.pure.d.mts +49 -0
  330. package/dist/host/job/undelivered-result.pure.mjs +147 -0
  331. package/dist/host/layout/actor-layout.sql.d.mts +8 -0
  332. package/dist/host/layout/actor-layout.sql.mjs +33 -0
  333. package/dist/host/layout/layout-version.errors.d.mts +10 -0
  334. package/dist/host/layout/layout-version.errors.mjs +8 -0
  335. package/dist/host/layout/layout-version.pure.d.mts +10 -0
  336. package/dist/host/layout/layout-version.pure.mjs +14 -0
  337. package/dist/host/migration/actor-migrations.service.d.mts +46 -0
  338. package/dist/host/migration/actor-migrations.service.mjs +143 -0
  339. package/dist/host/migration/migration-edited.errors.d.mts +9 -0
  340. package/dist/host/migration/migration-edited.errors.mjs +7 -0
  341. package/dist/host/migration/migration-failed.errors.d.mts +12 -0
  342. package/dist/host/migration/migration-failed.errors.mjs +10 -0
  343. package/dist/host/migration/migration-failure.pure.d.mts +9 -0
  344. package/dist/host/migration/migration-failure.pure.mjs +19 -0
  345. package/dist/host/migration/migration-hasher.adapter.d.mts +15 -0
  346. package/dist/host/migration/migration-hasher.adapter.mjs +40 -0
  347. package/dist/host/migration/migration-missing.errors.d.mts +9 -0
  348. package/dist/host/migration/migration-missing.errors.mjs +7 -0
  349. package/dist/host/migration/migration-plan.pure.d.mts +20 -0
  350. package/dist/host/migration/migration-plan.pure.mjs +32 -0
  351. package/dist/host/outbox/actor-outbox.sql.d.mts +33 -0
  352. package/dist/host/outbox/actor-outbox.sql.mjs +28 -0
  353. package/dist/host/outbox/outbox-acknowledgements.sql.d.mts +12 -0
  354. package/dist/host/outbox/outbox-acknowledgements.sql.mjs +47 -0
  355. package/dist/host/outbox/outbox-runner.service.d.mts +37 -0
  356. package/dist/host/outbox/outbox-runner.service.mjs +155 -0
  357. package/dist/host/query/query-policy.pure.d.mts +15 -0
  358. package/dist/host/query/query-policy.pure.mjs +12 -0
  359. package/dist/host/query/query-runner.service.d.mts +42 -0
  360. package/dist/host/query/query-runner.service.mjs +72 -0
  361. package/dist/host/sqlite/actor-connections.pure.d.mts +26 -0
  362. package/dist/host/sqlite/actor-connections.pure.mjs +4 -0
  363. package/dist/host/sqlite/sqlite-connection.adapter.d.mts +22 -0
  364. package/dist/host/sqlite/sqlite-connection.adapter.mjs +151 -0
  365. package/dist/host/sqlite/sqlite-driver.service.d.mts +33 -0
  366. package/dist/host/sqlite/sqlite-driver.service.mjs +88 -0
  367. package/dist/host/sqlite/sqlite-parameters.pure.d.mts +5 -0
  368. package/dist/host/sqlite/sqlite-parameters.pure.mjs +21 -0
  369. package/dist/host/sqlite/sqlite-reason.pure.d.mts +8 -0
  370. package/dist/host/sqlite/sqlite-reason.pure.mjs +13 -0
  371. package/dist/host/timer/actor-timers.sql.d.mts +32 -0
  372. package/dist/host/timer/actor-timers.sql.mjs +8 -0
  373. package/dist/host/timer/timer-runner.service.d.mts +26 -0
  374. package/dist/host/timer/timer-runner.service.mjs +68 -0
  375. package/dist/host/upkeep/actor-due.sql.d.mts +26 -0
  376. package/dist/host/upkeep/actor-due.sql.mjs +43 -0
  377. package/dist/host/upkeep/actor-upkeep.service.d.mts +55 -0
  378. package/dist/host/upkeep/actor-upkeep.service.mjs +218 -0
  379. package/dist/host/upkeep/execution-authority.pure.d.mts +19 -0
  380. package/dist/host/upkeep/execution-authority.pure.mjs +10 -0
  381. package/dist/runtime/akter-local.layer.d.mts +28 -0
  382. package/dist/runtime/akter-local.layer.mjs +24 -0
  383. package/dist/runtime/akter.layer.d.mts +91 -0
  384. package/dist/runtime/akter.layer.mjs +99 -0
  385. package/dist/runtime/blob-hashing.layer.d.mts +4 -0
  386. package/dist/runtime/blob-hashing.layer.mjs +15 -0
  387. package/dist/runtime/hosted-environment.layer.d.mts +34 -0
  388. package/dist/runtime/hosted-environment.layer.mjs +40 -0
  389. package/dist/runtime/http-server.layer.d.mts +9 -0
  390. package/dist/runtime/http-server.layer.mjs +15 -0
  391. package/dist/runtime/local-actor-engine.layer.d.mts +10 -0
  392. package/dist/runtime/local-actor-engine.layer.mjs +14 -0
  393. package/dist/runtime/local-engine.layer.d.mts +15 -0
  394. package/dist/runtime/local-engine.layer.mjs +14 -0
  395. package/dist/runtime/local-environments.layer.d.mts +24 -0
  396. package/dist/runtime/local-environments.layer.mjs +159 -0
  397. package/dist/runtime/local-file-clients.layer.d.mts +13 -0
  398. package/dist/runtime/local-file-clients.layer.mjs +78 -0
  399. package/dist/runtime/local-job-runtime.layer.d.mts +19 -0
  400. package/dist/runtime/local-job-runtime.layer.mjs +21 -0
  401. package/dist/serve/archive/archived-actors.layer.d.mts +17 -0
  402. package/dist/serve/archive/archived-actors.layer.mjs +84 -0
  403. package/dist/serve/archive/archived-store.layer.d.mts +12 -0
  404. package/dist/serve/archive/archived-store.layer.mjs +40 -0
  405. package/dist/serve/engine/actor-engine.layer.d.mts +8 -0
  406. package/dist/serve/engine/actor-engine.layer.mjs +30 -0
  407. package/dist/serve/engine/actor-fork.service.d.mts +63 -0
  408. package/dist/serve/engine/actor-fork.service.mjs +277 -0
  409. package/dist/serve/engine/actor-holding.pure.d.mts +7 -0
  410. package/dist/serve/engine/actor-holding.pure.mjs +9 -0
  411. package/dist/serve/engine/actor-host.service.d.mts +66 -0
  412. package/dist/serve/engine/actor-host.service.mjs +209 -0
  413. package/dist/serve/engine/actor-location.service.d.mts +38 -0
  414. package/dist/serve/engine/actor-location.service.mjs +109 -0
  415. package/dist/serve/engine/actor-residents.pure.d.mts +92 -0
  416. package/dist/serve/engine/actor-residents.pure.mjs +201 -0
  417. package/dist/serve/engine/actor-shard.pure.d.mts +4 -0
  418. package/dist/serve/engine/actor-shard.pure.mjs +8 -0
  419. package/dist/serve/engine/actor-state.pure.d.mts +17 -0
  420. package/dist/serve/engine/actor-state.pure.mjs +20 -0
  421. package/dist/serve/engine/actors-not-hosted.errors.d.mts +9 -0
  422. package/dist/serve/engine/actors-not-hosted.errors.mjs +7 -0
  423. package/dist/serve/engine/job-runtime.layer.d.mts +6 -0
  424. package/dist/serve/engine/job-runtime.layer.mjs +5 -0
  425. package/dist/serve/environment/environment-already-exists.errors.d.mts +10 -0
  426. package/dist/serve/environment/environment-already-exists.errors.mjs +9 -0
  427. package/dist/serve/environment/environment-in-use.errors.d.mts +10 -0
  428. package/dist/serve/environment/environment-in-use.errors.mjs +14 -0
  429. package/dist/serve/environment/environment-not-found.errors.d.mts +10 -0
  430. package/dist/serve/environment/environment-not-found.errors.mjs +9 -0
  431. package/dist/serve/environment/environment-records.sql.d.mts +92 -0
  432. package/dist/serve/environment/environment-records.sql.mjs +59 -0
  433. package/dist/serve/environment/environment-store.sql.d.mts +38 -0
  434. package/dist/serve/environment/environment-store.sql.mjs +78 -0
  435. package/dist/serve/environment/local-environment.schema.d.mts +38 -0
  436. package/dist/serve/environment/local-environment.schema.mjs +43 -0
  437. package/dist/serve/environment/local-environments.service.d.mts +44 -0
  438. package/dist/serve/environment/local-environments.service.mjs +196 -0
  439. package/dist/serve/environment/promotion-notice.pure.d.mts +22 -0
  440. package/dist/serve/environment/promotion-notice.pure.mjs +30 -0
  441. package/dist/serve/environment/snapshot-operations.sql.d.mts +32 -0
  442. package/dist/serve/environment/snapshot-operations.sql.mjs +131 -0
  443. package/dist/serve/environment/store-snapshot.sql.d.mts +32 -0
  444. package/dist/serve/environment/store-snapshot.sql.mjs +74 -0
  445. package/dist/serve/erasure/local-actor-erasure.service.d.mts +26 -0
  446. package/dist/serve/erasure/local-actor-erasure.service.mjs +102 -0
  447. package/dist/serve/history/actor-host-runners.service.d.mts +23 -0
  448. package/dist/serve/history/actor-host-runners.service.mjs +35 -0
  449. package/dist/serve/hosted/hosted-app-build.errors.d.mts +13 -0
  450. package/dist/serve/hosted/hosted-app-build.errors.mjs +9 -0
  451. package/dist/serve/hosted/hosted-app-checks.layer.d.mts +15 -0
  452. package/dist/serve/hosted/hosted-app-checks.layer.mjs +32 -0
  453. package/dist/serve/hosted/hosted-file-forward.layer.d.mts +22 -0
  454. package/dist/serve/hosted/hosted-file-forward.layer.mjs +42 -0
  455. package/dist/serve/hosted/hosted-file-rpcs.layer.d.mts +25 -0
  456. package/dist/serve/hosted/hosted-file-rpcs.layer.mjs +82 -0
  457. package/dist/serve/hosted/hosted-file-server.layer.d.mts +18 -0
  458. package/dist/serve/hosted/hosted-file-server.layer.mjs +33 -0
  459. package/dist/serve/hosted/hosted-files.layer.d.mts +32 -0
  460. package/dist/serve/hosted/hosted-files.layer.mjs +55 -0
  461. package/dist/serve/hosted/hosted-runtime.layer.d.mts +42 -0
  462. package/dist/serve/hosted/hosted-runtime.layer.mjs +48 -0
  463. package/dist/serve/hosted/hosted-runtime.service.d.mts +77 -0
  464. package/dist/serve/hosted/hosted-runtime.service.mjs +74 -0
  465. package/dist/serve/hosted/hosted-secrets.layer.d.mts +10 -0
  466. package/dist/serve/hosted/hosted-secrets.layer.mjs +28 -0
  467. package/dist/serve/http/loopback-host.pure.d.mts +11 -0
  468. package/dist/serve/http/loopback-host.pure.mjs +29 -0
  469. package/dist/serve/inspect/actor-inspection.schema.d.mts +119 -0
  470. package/dist/serve/inspect/actor-inspection.schema.mjs +75 -0
  471. package/dist/serve/inspect/actor-inspection.sql.d.mts +12 -0
  472. package/dist/serve/inspect/actor-inspection.sql.mjs +43 -0
  473. package/dist/serve/inspect/inspect.service.d.mts +24 -0
  474. package/dist/serve/inspect/inspect.service.mjs +92 -0
  475. package/dist/serve/inspect/inspector-page.pure.d.mts +2 -0
  476. package/dist/serve/inspect/inspector-page.pure.mjs +155 -0
  477. package/dist/serve/inspect/inspector-wal.pure.d.mts +3 -0
  478. package/dist/serve/inspect/inspector-wal.pure.mjs +19 -0
  479. package/dist/serve/inspect/inspector.handlers.d.mts +5 -0
  480. package/dist/serve/inspect/inspector.handlers.mjs +50 -0
  481. package/dist/serve/inspect/inspector.layer.d.mts +9 -0
  482. package/dist/serve/inspect/inspector.layer.mjs +14 -0
  483. package/dist/serve/live/live-reads.service.d.mts +44 -0
  484. package/dist/serve/live/live-reads.service.mjs +152 -0
  485. package/dist/serve/live/live-tables.sql.d.mts +35 -0
  486. package/dist/serve/live/live-tables.sql.mjs +66 -0
  487. package/dist/serve/live/state-reads.pure.d.mts +11 -0
  488. package/dist/serve/live/state-reads.pure.mjs +7 -0
  489. package/dist/serve/rpc/actor-rpc.handlers.d.mts +24 -0
  490. package/dist/serve/rpc/actor-rpc.handlers.mjs +142 -0
  491. package/dist/serve/rpc/akter-server.layer.d.mts +18 -0
  492. package/dist/serve/rpc/akter-server.layer.mjs +61 -0
  493. package/dist/serve/rpc/computer/computer-copy.layer.d.mts +22 -0
  494. package/dist/serve/rpc/computer/computer-copy.layer.mjs +70 -0
  495. package/dist/serve/rpc/computer/computer-rpc-access.pure.d.mts +29 -0
  496. package/dist/serve/rpc/computer/computer-rpc-access.pure.mjs +46 -0
  497. package/dist/serve/rpc/computer/computer-rpc.layer.d.mts +39 -0
  498. package/dist/serve/rpc/computer/computer-rpc.layer.mjs +84 -0
  499. package/dist/serve/rpc/computer/step-rpc.handlers.d.mts +23 -0
  500. package/dist/serve/rpc/computer/step-rpc.handlers.mjs +43 -0
  501. package/dist/serve/rpc/development-authentication.handlers.d.mts +7 -0
  502. package/dist/serve/rpc/development-authentication.handlers.mjs +19 -0
  503. package/dist/serve/rpc/development-guard.pure.d.mts +10 -0
  504. package/dist/serve/rpc/development-guard.pure.mjs +16 -0
  505. package/dist/serve/rpc/file/file-rpc-access.pure.d.mts +55 -0
  506. package/dist/serve/rpc/file/file-rpc-access.pure.mjs +67 -0
  507. package/dist/serve/rpc/file/file-rpc.layer.d.mts +53 -0
  508. package/dist/serve/rpc/file/file-rpc.layer.mjs +143 -0
  509. package/dist/serve/rpc/file/upload-sessions.pure.d.mts +45 -0
  510. package/dist/serve/rpc/file/upload-sessions.pure.mjs +187 -0
  511. package/dist/serve/rpc/in-process-client.layer.d.mts +13 -0
  512. package/dist/serve/rpc/in-process-client.layer.mjs +34 -0
  513. package/dist/serve/rpc/listener-not-loopback.errors.d.mts +9 -0
  514. package/dist/serve/rpc/listener-not-loopback.errors.mjs +7 -0
  515. package/dist/serve/rpc/ndjson-only.pure.d.mts +5 -0
  516. package/dist/serve/rpc/ndjson-only.pure.mjs +14 -0
  517. package/dist/serve/rpc/served-rpc.layer.d.mts +6 -0
  518. package/dist/serve/rpc/served-rpc.layer.mjs +19 -0
  519. package/dist/serve/store/actor-not-migrated.errors.d.mts +10 -0
  520. package/dist/serve/store/actor-not-migrated.errors.mjs +8 -0
  521. package/dist/serve/store/store-migrations.layer.d.mts +5 -0
  522. package/dist/serve/store/store-migrations.layer.mjs +18 -0
  523. package/dist/serve/store/store-migrations.service.d.mts +26 -0
  524. package/dist/serve/store/store-migrations.service.mjs +47 -0
  525. package/dist/serve/store/store-unreadable.errors.d.mts +9 -0
  526. package/dist/serve/store/store-unreadable.errors.mjs +7 -0
  527. package/dist/serve/verify/verify.layer.d.mts +16 -0
  528. package/dist/serve/verify/verify.layer.mjs +36 -0
  529. package/dist/testing/story-driver.service.d.mts +29 -0
  530. package/dist/testing/story-driver.service.mjs +126 -0
  531. package/dist/testing/story.layer.d.mts +21 -0
  532. package/dist/testing/story.layer.mjs +42 -0
  533. package/package.json +106 -3
  534. package/src/contract/actor/actor-already-exists.errors.ts +8 -0
  535. package/src/contract/actor/actor-definition.pure.ts +157 -0
  536. package/src/contract/actor/actor-erased.errors.ts +8 -0
  537. package/src/contract/actor/actor-names.pure.ts +64 -0
  538. package/src/contract/actor/actor-not-created.errors.ts +8 -0
  539. package/src/contract/actor/actor-not-registered.errors.ts +8 -0
  540. package/src/contract/actor/actor-registry.service.ts +35 -0
  541. package/src/contract/actor/actor.contract.ts +409 -0
  542. package/src/contract/actor/host-interface.pure.ts +60 -0
  543. package/src/contract/actor/reserved-member.errors.ts +9 -0
  544. package/src/contract/akter.service.ts +233 -0
  545. package/src/contract/caller/authentication.api.ts +9 -0
  546. package/src/contract/caller/caller-admission.pure.ts +90 -0
  547. package/src/contract/caller/caller-not-allowed.errors.ts +26 -0
  548. package/src/contract/caller/caller.schema.ts +7 -0
  549. package/src/contract/caller/current-caller.service.ts +7 -0
  550. package/src/contract/caller/principal.schema.ts +13 -0
  551. package/src/contract/caller/unauthenticated.errors.ts +8 -0
  552. package/src/contract/client/actor-client.adapter.ts +217 -0
  553. package/src/contract/client/actor-client.contract.ts +53 -0
  554. package/src/contract/client/actor-rpc.contract.ts +91 -0
  555. package/src/contract/client/actor-unavailable.errors.ts +9 -0
  556. package/src/contract/client/client-failure.contract.ts +53 -0
  557. package/src/contract/client/invalid-request.errors.ts +9 -0
  558. package/src/contract/client/storage-limit.errors.ts +16 -0
  559. package/src/contract/command/command-id-expired.errors.ts +11 -0
  560. package/src/contract/command/command-id.schema.ts +5 -0
  561. package/src/contract/command/command.contract.ts +334 -0
  562. package/src/contract/command/outbox-id.pure.ts +25 -0
  563. package/src/contract/command/outbox.schema.ts +11 -0
  564. package/src/contract/command/timer.schema.ts +21 -0
  565. package/src/contract/computer/checkpoint-expired.errors.ts +12 -0
  566. package/src/contract/computer/computer-client-failure.contract.ts +27 -0
  567. package/src/contract/computer/computer-client.adapter.ts +110 -0
  568. package/src/contract/computer/computer-client.contract.ts +75 -0
  569. package/src/contract/computer/computer-held.errors.ts +10 -0
  570. package/src/contract/computer/computer-limit.errors.ts +11 -0
  571. package/src/contract/computer/computer-lost.errors.ts +10 -0
  572. package/src/contract/computer/computer-not-found.errors.ts +9 -0
  573. package/src/contract/computer/computer.schema.ts +159 -0
  574. package/src/contract/computer/computers-unavailable.errors.ts +9 -0
  575. package/src/contract/computer/files/computer-files.schema.ts +31 -0
  576. package/src/contract/computer/rpc/computer-rpc.contract.ts +140 -0
  577. package/src/contract/computer/step/computer-step.contract.ts +126 -0
  578. package/src/contract/computer/step/computer-step.schema.ts +80 -0
  579. package/src/contract/computer/step/step-failure.schema.ts +26 -0
  580. package/src/contract/computer/step/step-not-found.errors.ts +7 -0
  581. package/src/contract/description/published-contract.pure.ts +187 -0
  582. package/src/contract/file/access/file-access-denied.errors.ts +11 -0
  583. package/src/contract/file/access/file-access.contract.ts +56 -0
  584. package/src/contract/file/actor-files.contract.ts +78 -0
  585. package/src/contract/file/blob-transfer.errors.ts +6 -0
  586. package/src/contract/file/file-client-failure.contract.ts +43 -0
  587. package/src/contract/file/file-client.adapter.ts +45 -0
  588. package/src/contract/file/file-client.contract.ts +24 -0
  589. package/src/contract/file/file-listing.pure.ts +30 -0
  590. package/src/contract/file/file-not-found.errors.ts +6 -0
  591. package/src/contract/file/file-path.pure.ts +37 -0
  592. package/src/contract/file/files-unavailable.errors.ts +8 -0
  593. package/src/contract/file/invalid-file-request.errors.ts +9 -0
  594. package/src/contract/file/rpc/file-rpc.contract.ts +148 -0
  595. package/src/contract/file/rpc/file-too-large.errors.ts +10 -0
  596. package/src/contract/file/rpc/rpc-file-clients.layer.ts +184 -0
  597. package/src/contract/fork/fork-rpc.contract.ts +44 -0
  598. package/src/contract/history/actor-journal.service.ts +195 -0
  599. package/src/contract/history/history-entry.pure.ts +282 -0
  600. package/src/contract/hosted/handler-failed.errors.ts +16 -0
  601. package/src/contract/hosted/handler-failure.pure.ts +161 -0
  602. package/src/contract/hosted/hosted-actor.service.ts +97 -0
  603. package/src/contract/hosted/hosted-command.service.ts +114 -0
  604. package/src/contract/hosted/hosted-create.service.ts +95 -0
  605. package/src/contract/hosted/hosted-error.contract.ts +22 -0
  606. package/src/contract/hosted/hosted-failure.schema.ts +32 -0
  607. package/src/contract/hosted/hosted-outcome.contract.ts +21 -0
  608. package/src/contract/hosted/hosted-query.service.ts +50 -0
  609. package/src/contract/hosted/hosted-request.pure.ts +185 -0
  610. package/src/contract/job/job-id.pure.ts +37 -0
  611. package/src/contract/job/job-patches.contract.ts +86 -0
  612. package/src/contract/job/job-signal.schema.ts +23 -0
  613. package/src/contract/job/reserved-payload-field.errors.ts +10 -0
  614. package/src/contract/job/started-job.schema.ts +9 -0
  615. package/src/contract/json-codec.pure.ts +27 -0
  616. package/src/contract/room.contract.ts +31 -0
  617. package/src/contract/secret/actor-secrets.adapter.ts +87 -0
  618. package/src/contract/secret/invalid-secret-name.errors.ts +10 -0
  619. package/src/contract/secret/secret-unavailable.errors.ts +13 -0
  620. package/src/contract/secret/secret.schema.ts +43 -0
  621. package/src/contract/spend/billing-unavailable.errors.ts +12 -0
  622. package/src/contract/spend/spend-cap-reached.errors.ts +17 -0
  623. package/src/contract/state/actor-state.pure.ts +192 -0
  624. package/src/contract/state/actor-state.service.ts +69 -0
  625. package/src/contract/state/state-migration.pure.ts +57 -0
  626. package/src/contract/state/state-read.pure.ts +40 -0
  627. package/src/contract/state/state-unreadable.errors.ts +9 -0
  628. package/src/host/actor/actor-database.service.ts +145 -0
  629. package/src/host/actor/actor-exclusive.pure.ts +32 -0
  630. package/src/host/actor/actor-records.sql.ts +78 -0
  631. package/src/host/actor/reserved-name.errors.ts +10 -0
  632. package/src/host/actor/reserved-names.pure.ts +40 -0
  633. package/src/host/actor/room.actor.ts +57 -0
  634. package/src/host/blob/blob-frames.pure.ts +52 -0
  635. package/src/host/blob/blob-grant.schema.ts +22 -0
  636. package/src/host/blob/blob-grants.service.ts +197 -0
  637. package/src/host/blob/blob-keyring.service.ts +25 -0
  638. package/src/host/blob/blob-range.pure.ts +33 -0
  639. package/src/host/blob/blob-sealing.contract.ts +46 -0
  640. package/src/host/blob/blob-sealing.service.ts +25 -0
  641. package/src/host/blob/export/blob-archive.sql.ts +153 -0
  642. package/src/host/blob/export/blob-export-holds.sql.ts +91 -0
  643. package/src/host/blob/plain-blob-sealing.pure.ts +70 -0
  644. package/src/host/blob/reference/blob-catalog.sql.ts +339 -0
  645. package/src/host/blob/reference/blob-coordinator.pure.ts +217 -0
  646. package/src/host/blob/reference/blob-file-page.sql.ts +48 -0
  647. package/src/host/blob/reference/blob-forks.sql.ts +125 -0
  648. package/src/host/blob/reference/blob-lineage.sql.ts +63 -0
  649. package/src/host/blob/reference/blob-reads.pure.ts +172 -0
  650. package/src/host/blob/reference/blob-receipts.sql.ts +375 -0
  651. package/src/host/blob/reference/blob-transfer-adopt.pure.ts +127 -0
  652. package/src/host/blob/reference/blob-transfer-fork.pure.ts +174 -0
  653. package/src/host/blob/reference/blob-transfer-upkeep.pure.ts +132 -0
  654. package/src/host/blob/reference/blob-transfer.pure.ts +127 -0
  655. package/src/host/blob/sealed-blob-sealing.pure.ts +163 -0
  656. package/src/host/blob/stream/blob-directory.pure.ts +177 -0
  657. package/src/host/blob/stream/blob-length.pure.ts +40 -0
  658. package/src/host/blob/stream/blob-writing.pure.ts +49 -0
  659. package/src/host/command/batch/command-batch.sql.ts +207 -0
  660. package/src/host/command/command-context.adapter.ts +134 -0
  661. package/src/host/command/command-id-age.pure.ts +54 -0
  662. package/src/host/command/command-id-reuse.pure.ts +90 -0
  663. package/src/host/command/command-id-reused.errors.ts +13 -0
  664. package/src/host/command/command-journal.sql.ts +232 -0
  665. package/src/host/command/command-rejected.errors.ts +8 -0
  666. package/src/host/command/command-replay.service.ts +223 -0
  667. package/src/host/command/command-reply.pure.ts +21 -0
  668. package/src/host/command/command-runner.service.ts +320 -0
  669. package/src/host/command/files/command-file-inputs.sql.ts +114 -0
  670. package/src/host/command/history-pruned.errors.ts +10 -0
  671. package/src/host/command/replay/replay-cursor-stalled.errors.ts +9 -0
  672. package/src/host/command/replay/replay-cursor.pure.ts +19 -0
  673. package/src/host/computer/computer-steps.sql.ts +120 -0
  674. package/src/host/computer/job-computers.service.ts +84 -0
  675. package/src/host/computer/local-computer-files.layer.ts +103 -0
  676. package/src/host/computer/local-computer-log.layer.ts +115 -0
  677. package/src/host/computer/local-computer-records.layer.ts +205 -0
  678. package/src/host/computer/local-computer.schema.ts +36 -0
  679. package/src/host/computer/local-computers.adapter.ts +379 -0
  680. package/src/host/computer/local-step.layer.ts +174 -0
  681. package/src/host/file/actor-file-storage.sql.ts +79 -0
  682. package/src/host/file/actor-files.sql.ts +15 -0
  683. package/src/host/file/blob-home-lock.pure.ts +23 -0
  684. package/src/host/file/blob-home.sql.ts +55 -0
  685. package/src/host/file/local-blob-home.service.ts +71 -0
  686. package/src/host/file/local-blob-owner.sql.ts +89 -0
  687. package/src/host/file/local-file-upkeep.pure.ts +77 -0
  688. package/src/host/file/replay-file-storage.sql.ts +43 -0
  689. package/src/host/fork/actor-fork.sql.ts +110 -0
  690. package/src/host/fork/fork-computers.adapter.ts +366 -0
  691. package/src/host/hash/blob-hashing.service.ts +14 -0
  692. package/src/host/job/job-durables.sql.ts +214 -0
  693. package/src/host/job/job-engine.adapter.ts +420 -0
  694. package/src/host/job/job-journal.sql.ts +257 -0
  695. package/src/host/job/job-results.service.ts +111 -0
  696. package/src/host/job/job-runs.pure.ts +445 -0
  697. package/src/host/job/undelivered-result.pure.ts +265 -0
  698. package/src/host/layout/actor-layout.sql.ts +45 -0
  699. package/src/host/layout/layout-version.errors.ts +10 -0
  700. package/src/host/layout/layout-version.pure.ts +22 -0
  701. package/src/host/migration/actor-migrations.service.ts +159 -0
  702. package/src/host/migration/migration-edited.errors.ts +9 -0
  703. package/src/host/migration/migration-failed.errors.ts +12 -0
  704. package/src/host/migration/migration-failure.pure.ts +28 -0
  705. package/src/host/migration/migration-hasher.adapter.ts +70 -0
  706. package/src/host/migration/migration-missing.errors.ts +9 -0
  707. package/src/host/migration/migration-plan.pure.ts +66 -0
  708. package/src/host/outbox/actor-outbox.sql.ts +98 -0
  709. package/src/host/outbox/outbox-acknowledgements.sql.ts +93 -0
  710. package/src/host/outbox/outbox-runner.service.ts +253 -0
  711. package/src/host/query/query-policy.pure.ts +31 -0
  712. package/src/host/query/query-runner.service.ts +132 -0
  713. package/src/host/sqlite/actor-connections.pure.ts +44 -0
  714. package/src/host/sqlite/sqlite-connection.adapter.ts +260 -0
  715. package/src/host/sqlite/sqlite-driver.service.ts +151 -0
  716. package/src/host/sqlite/sqlite-parameters.pure.ts +28 -0
  717. package/src/host/sqlite/sqlite-reason.pure.ts +19 -0
  718. package/src/host/timer/actor-timers.sql.ts +67 -0
  719. package/src/host/timer/timer-runner.service.ts +117 -0
  720. package/src/host/upkeep/actor-due.sql.ts +71 -0
  721. package/src/host/upkeep/actor-upkeep.service.ts +404 -0
  722. package/src/host/upkeep/execution-authority.pure.ts +37 -0
  723. package/src/runtime/akter-local.layer.ts +49 -0
  724. package/src/runtime/akter.layer.ts +208 -0
  725. package/src/runtime/blob-hashing.layer.ts +21 -0
  726. package/src/runtime/hosted-environment.layer.ts +85 -0
  727. package/src/runtime/http-server.layer.ts +29 -0
  728. package/src/runtime/local-actor-engine.layer.ts +33 -0
  729. package/src/runtime/local-engine.layer.ts +37 -0
  730. package/src/runtime/local-environments.layer.ts +214 -0
  731. package/src/runtime/local-file-clients.layer.ts +112 -0
  732. package/src/runtime/local-job-runtime.layer.ts +38 -0
  733. package/src/serve/archive/archived-actors.layer.ts +97 -0
  734. package/src/serve/archive/archived-store.layer.ts +46 -0
  735. package/src/serve/engine/actor-engine.layer.ts +46 -0
  736. package/src/serve/engine/actor-fork.service.ts +403 -0
  737. package/src/serve/engine/actor-holding.pure.ts +28 -0
  738. package/src/serve/engine/actor-host.service.ts +454 -0
  739. package/src/serve/engine/actor-location.service.ts +219 -0
  740. package/src/serve/engine/actor-residents.pure.ts +500 -0
  741. package/src/serve/engine/actor-shard.pure.ts +13 -0
  742. package/src/serve/engine/actor-state.pure.ts +45 -0
  743. package/src/serve/engine/actors-not-hosted.errors.ts +9 -0
  744. package/src/serve/engine/job-runtime.layer.ts +13 -0
  745. package/src/serve/environment/environment-already-exists.errors.ts +9 -0
  746. package/src/serve/environment/environment-in-use.errors.ts +17 -0
  747. package/src/serve/environment/environment-not-found.errors.ts +9 -0
  748. package/src/serve/environment/environment-records.sql.ts +208 -0
  749. package/src/serve/environment/environment-store.sql.ts +116 -0
  750. package/src/serve/environment/local-environment.schema.ts +79 -0
  751. package/src/serve/environment/local-environments.service.ts +268 -0
  752. package/src/serve/environment/promotion-notice.pure.ts +63 -0
  753. package/src/serve/environment/snapshot-operations.sql.ts +210 -0
  754. package/src/serve/environment/store-snapshot.sql.ts +128 -0
  755. package/src/serve/erasure/local-actor-erasure.service.ts +170 -0
  756. package/src/serve/history/actor-host-runners.service.ts +85 -0
  757. package/src/serve/hosted/hosted-app-build.errors.ts +11 -0
  758. package/src/serve/hosted/hosted-app-checks.layer.ts +74 -0
  759. package/src/serve/hosted/hosted-file-forward.layer.ts +63 -0
  760. package/src/serve/hosted/hosted-file-rpcs.layer.ts +149 -0
  761. package/src/serve/hosted/hosted-file-server.layer.ts +75 -0
  762. package/src/serve/hosted/hosted-files.layer.ts +76 -0
  763. package/src/serve/hosted/hosted-runtime.layer.ts +145 -0
  764. package/src/serve/hosted/hosted-runtime.service.ts +128 -0
  765. package/src/serve/hosted/hosted-secrets.layer.ts +38 -0
  766. package/src/serve/http/loopback-host.pure.ts +67 -0
  767. package/src/serve/inspect/actor-inspection.schema.ts +94 -0
  768. package/src/serve/inspect/actor-inspection.sql.ts +112 -0
  769. package/src/serve/inspect/inspect.service.ts +173 -0
  770. package/src/serve/inspect/inspector-page.pure.ts +159 -0
  771. package/src/serve/inspect/inspector-wal.pure.ts +40 -0
  772. package/src/serve/inspect/inspector.handlers.ts +103 -0
  773. package/src/serve/inspect/inspector.layer.ts +26 -0
  774. package/src/serve/live/live-reads.service.ts +285 -0
  775. package/src/serve/live/live-tables.sql.ts +148 -0
  776. package/src/serve/live/state-reads.pure.ts +22 -0
  777. package/src/serve/rpc/actor-rpc.handlers.ts +242 -0
  778. package/src/serve/rpc/akter-server.layer.ts +119 -0
  779. package/src/serve/rpc/computer/computer-copy.layer.ts +95 -0
  780. package/src/serve/rpc/computer/computer-rpc-access.pure.ts +75 -0
  781. package/src/serve/rpc/computer/computer-rpc.layer.ts +143 -0
  782. package/src/serve/rpc/computer/step-rpc.handlers.ts +84 -0
  783. package/src/serve/rpc/development-authentication.handlers.ts +28 -0
  784. package/src/serve/rpc/development-guard.pure.ts +39 -0
  785. package/src/serve/rpc/file/file-rpc-access.pure.ts +119 -0
  786. package/src/serve/rpc/file/file-rpc.layer.ts +209 -0
  787. package/src/serve/rpc/file/upload-sessions.pure.ts +363 -0
  788. package/src/serve/rpc/in-process-client.layer.ts +62 -0
  789. package/src/serve/rpc/listener-not-loopback.errors.ts +9 -0
  790. package/src/serve/rpc/ndjson-only.pure.ts +33 -0
  791. package/src/serve/rpc/served-rpc.layer.ts +34 -0
  792. package/src/serve/store/actor-not-migrated.errors.ts +10 -0
  793. package/src/serve/store/store-migrations.layer.ts +35 -0
  794. package/src/serve/store/store-migrations.service.ts +76 -0
  795. package/src/serve/store/store-unreadable.errors.ts +9 -0
  796. package/src/serve/verify/verify.layer.ts +77 -0
  797. package/src/testing/story-driver.service.ts +266 -0
  798. package/src/testing/story.layer.ts +99 -0
@@ -0,0 +1,15 @@
1
+ import { BlobTransfers, TransferEffect, TransferHome } from "./blob-transfer.pure.mjs";
2
+ import { Effect } from "effect";
3
+ import { SecureRandom } from "effect/crypto";
4
+ interface ReadSource {
5
+ readonly home: TransferHome;
6
+ readonly random: SecureRandom.SecureRandom["Service"];
7
+ }
8
+ interface BlobReads {
9
+ readonly close: Effect.Effect<void>;
10
+ readonly download: BlobTransfers["download"];
11
+ readonly open: BlobTransfers["open"];
12
+ readonly recover: TransferEffect<void>;
13
+ }
14
+ declare const blobReads: ({ home, random }: ReadSource) => Effect.Effect<BlobReads>;
15
+ export { type BlobReads, blobReads };
@@ -0,0 +1,97 @@
1
+ import { BlobTransferError } from "../../../contract/file/blob-transfer.errors.mjs";
2
+ import { Array, Deferred, Effect, Option, Ref, Semaphore, Stream } from "effect";
3
+ // src/host/blob/reference/blob-reads.pure.ts
4
+ const oneRegistryOperation = 1;
5
+ const noReaders = 0;
6
+ const pinWith = (state, opening) => state.guard.withPermits(oneRegistryOperation)(Effect.gen(function* acquireRead() {
7
+ if (yield* Ref.get(state.closed)) return yield* BlobTransferError.make({
8
+ blob: "",
9
+ message: "the file home is closed"
10
+ });
11
+ const claim = yield* state.random.uuidV4();
12
+ const lease = {
13
+ actor: opening.actor,
14
+ blob: opening.blob,
15
+ claim,
16
+ grant: opening.grant
17
+ };
18
+ yield* state.home.catalog.pin(lease);
19
+ yield* Ref.update(state.active, (active) => new Set(active).add(claim));
20
+ return lease;
21
+ }));
22
+ const lookupWith = ({ owner, path }) => Effect.gen(function* lookupDownload() {
23
+ const lookup = Effect.andThen(owner.receipts.active, owner.receipts.link(path));
24
+ const found = yield* owner.exclusive(owner.transaction(lookup));
25
+ const linked = yield* Effect.fromOption(found).pipe(Effect.mapError(() => BlobTransferError.make({
26
+ blob: "",
27
+ message: "the actor file does not exist"
28
+ })));
29
+ return {
30
+ actor: owner.actor,
31
+ blob: linked.blob,
32
+ grant: linked.grant
33
+ };
34
+ });
35
+ const forgetWith = (state, claim) => Effect.gen(function* forgetRead() {
36
+ const remaining = yield* Ref.modify(state.active, (active) => {
37
+ const next = new Set(active);
38
+ next.delete(claim);
39
+ return [next.size, next];
40
+ });
41
+ if ((yield* Ref.get(state.closed)) && remaining === noReaders) yield* Deferred.succeed(state.drained, true);
42
+ });
43
+ const releaseWith = (state, lease) => {
44
+ const released = state.home.catalog.release(lease).pipe(Effect.ensuring(forgetWith(state, lease.claim)));
45
+ return state.guard.withPermits(oneRegistryOperation)(released);
46
+ };
47
+ const readWith = (state, acquire, range) => Stream.unwrap(Effect.gen(function* openDownload() {
48
+ const lease = yield* Effect.acquireRelease(acquire, (held) => Effect.orDie(releaseWith(state, held)));
49
+ const opening = {
50
+ actor: lease.actor,
51
+ blob: lease.blob,
52
+ grant: lease.grant
53
+ };
54
+ return Option.match(Option.fromNullishOr(range), {
55
+ onNone: () => state.home.directory.open(opening),
56
+ onSome: (requested) => state.home.directory.open({
57
+ ...opening,
58
+ range: requested
59
+ })
60
+ });
61
+ }));
62
+ const closeWith = (state) => Effect.gen(function* closeReads() {
63
+ yield* state.guard.withPermits(oneRegistryOperation)(Effect.gen(function* refuseReads() {
64
+ yield* Ref.set(state.closed, true);
65
+ if ((yield* Ref.get(state.active)).size === noReaders) yield* Deferred.succeed(state.drained, true);
66
+ }));
67
+ yield* Deferred.await(state.drained);
68
+ });
69
+ const recoverWith = (state) => state.guard.withPermits(oneRegistryOperation)(Effect.gen(function* recoverReads() {
70
+ let after = "";
71
+ for (;;) {
72
+ const readers = yield* state.home.catalog.readers(after);
73
+ if (!Array.isReadonlyArrayNonEmpty(readers)) return;
74
+ const active = yield* Ref.get(state.active);
75
+ yield* Effect.forEach(Array.filter(readers, (reader) => !active.has(reader.claim)), (reader) => state.home.catalog.release(reader), { discard: true });
76
+ after = Array.lastNonEmpty(readers).claim;
77
+ }
78
+ }));
79
+ const blobReads = ({ home, random }) => Effect.gen(function* makeBlobReads() {
80
+ const state = {
81
+ ...yield* Effect.all({
82
+ active: Ref.make(/* @__PURE__ */ new Set()),
83
+ closed: Ref.make(false),
84
+ drained: Deferred.make(),
85
+ guard: Semaphore.make(oneRegistryOperation)
86
+ }),
87
+ home,
88
+ random
89
+ };
90
+ return {
91
+ close: closeWith(state),
92
+ download: (request) => readWith(state, Effect.flatMap(lookupWith(request), (opening) => pinWith(state, opening)), request.range),
93
+ open: (opening) => readWith(state, pinWith(state, opening), opening.range),
94
+ recover: recoverWith(state)
95
+ };
96
+ });
97
+ export { blobReads };
@@ -0,0 +1,71 @@
1
+ import { SealedBlob } from "../blob-sealing.contract.mjs";
2
+ import { BlobClaim, CatalogEffect } from "./blob-catalog.sql.mjs";
3
+ import { Effect, Option } from "effect";
4
+ import { SqlClient, SqlError } from "effect/sql";
5
+ interface UploadReservation extends BlobClaim {
6
+ readonly expiresAt: number;
7
+ readonly receipt: string;
8
+ }
9
+ interface PreparedReceipt extends UploadReservation, SealedBlob {}
10
+ interface ReceiptRow extends PreparedReceipt {
11
+ readonly state: string;
12
+ }
13
+ interface BlobLink extends BlobClaim, SealedBlob {
14
+ readonly path: string;
15
+ readonly writtenAt: number;
16
+ }
17
+ interface Attaching {
18
+ readonly actor: string;
19
+ readonly now: number;
20
+ readonly path: string;
21
+ readonly receipt: string;
22
+ }
23
+ interface Preparing {
24
+ readonly actor: string;
25
+ readonly expiresAt?: number;
26
+ readonly receipt: string;
27
+ readonly sealed: SealedBlob;
28
+ }
29
+ /** What a new upload is admitted against: the time, and how many unattached uploads one actor may hold. */
30
+ interface UploadAdmission {
31
+ readonly now: number;
32
+ readonly unattached: number;
33
+ }
34
+ interface ReceiptStorage {
35
+ readonly actor: string;
36
+ readonly sql: SqlClient.SqlClient;
37
+ }
38
+ interface BlobReceipts {
39
+ readonly acknowledge: (claim: string) => Effect.Effect<void, SqlError.SqlError>;
40
+ readonly active: CatalogEffect<void>;
41
+ readonly attach: (attaching: Omit<Attaching, "actor">) => CatalogEffect<BlobLink>;
42
+ readonly cancel: (reservation: Pick<UploadReservation, "claim" | "receipt">) => Effect.Effect<void, SqlError.SqlError>;
43
+ readonly complete: (preparing: Omit<Preparing, "actor">) => CatalogEffect<void>;
44
+ readonly erase: Effect.Effect<void, SqlError.SqlError>;
45
+ readonly erased: Effect.Effect<boolean, SqlError.SqlError>;
46
+ readonly expire: (now: number) => CatalogEffect<void>;
47
+ readonly link: (path: string) => Effect.Effect<Option.Option<BlobLink>, SqlError.SqlError>;
48
+ readonly inspect: (claim: string) => Effect.Effect<Option.Option<ReceiptRow>, SqlError.SqlError>;
49
+ readonly register: CatalogEffect<void>;
50
+ /** Released claims ready to drop from the catalog at `now`: none still in use, and none under an unexpired hold. */
51
+ readonly releases: (now: number) => Effect.Effect<readonly BlobClaim[], SqlError.SqlError>;
52
+ readonly resume: CatalogEffect<void>;
53
+ /** Records a new upload, refused while the actor holds `admission.unattached` receipts still unattached. */
54
+ readonly reserve: (reservation: Omit<UploadReservation, "actor">, admission: UploadAdmission) => CatalogEffect<void>;
55
+ readonly remove: (path: string) => CatalogEffect<void>;
56
+ }
57
+ declare const prepareReceipts: (sql: SqlClient.SqlClient) => Effect.Effect<void, SqlError.SqlError>;
58
+ /**
59
+ * Empties the file tables of a database copied from another actor, such as a fork's staged copy, before anything
60
+ * opens it as a blob owner. Their rows name the source actor, its claims and its grants; the fork then inherits the
61
+ * files under the copy's own claims and grants.
62
+ */
63
+ declare const clearCopiedFiles: (sql: SqlClient.SqlClient) => Effect.Effect<void, SqlError.SqlError>;
64
+ /**
65
+ * Blanks every grant of a database that leaves its engine in an archive and drops its export holds, then rewrites the
66
+ * file, so no wrapped file key stays in it, not even in free pages. A grant only opens its blob in the engine that
67
+ * wrapped it; the importing engine adopts the files under its own.
68
+ */
69
+ declare const stripArchivedFiles: (sql: SqlClient.SqlClient) => Effect.Effect<void, SqlError.SqlError>;
70
+ declare const blobReceipts: ({ actor, sql }: ReceiptStorage) => BlobReceipts;
71
+ export { type BlobLink, type BlobReceipts, type PreparedReceipt, type ReceiptRow, type UploadAdmission, type UploadReservation, blobReceipts, clearCopiedFiles, prepareReceipts, stripArchivedFiles };
@@ -0,0 +1,176 @@
1
+ import { BlobTransferError } from "../../../contract/file/blob-transfer.errors.mjs";
2
+ import { Array, Effect, Option } from "effect";
3
+ // src/host/blob/reference/blob-receipts.sql.ts
4
+ const unavailable = (blob) => BlobTransferError.make({
5
+ blob,
6
+ message: "the upload receipt is unavailable, expired, or already attached"
7
+ });
8
+ const cleanupPageSize = 100;
9
+ /**
10
+ * The tables that keep files past their links: command history, a fork's ancestry, and an export snapshot's holds.
11
+ * A hold keeps a claim from being released until `expires_at`, so a file removed after a snapshot is still there to
12
+ * download; it never outlives its expiry, and erasing the actor drops it.
13
+ */
14
+ const prepareRetention = (sql) => Effect.gen(function* createRetentionTables() {
15
+ yield* sql`CREATE TABLE IF NOT EXISTS akter_blob_history (command_id TEXT NOT NULL, claim TEXT NOT NULL, actor TEXT NOT NULL, blob TEXT NOT NULL, PRIMARY KEY (command_id, claim)) STRICT`;
16
+ yield* sql`CREATE INDEX IF NOT EXISTS akter_blob_history_claim ON akter_blob_history (claim)`;
17
+ yield* sql`CREATE TABLE IF NOT EXISTS akter_blob_ancestry (claim TEXT PRIMARY KEY, actor TEXT NOT NULL, blob TEXT NOT NULL, bytes INTEGER NOT NULL, sha256 TEXT NOT NULL, grant TEXT NOT NULL) STRICT`;
18
+ yield* sql`CREATE INDEX IF NOT EXISTS akter_blob_ancestry_actor ON akter_blob_ancestry (actor, claim)`;
19
+ yield* sql`CREATE TABLE IF NOT EXISTS akter_blob_export_holds (snapshot TEXT NOT NULL, claim TEXT NOT NULL, actor TEXT NOT NULL, blob TEXT NOT NULL, bytes INTEGER NOT NULL, sha256 TEXT NOT NULL, grant TEXT NOT NULL, expires_at INTEGER NOT NULL, PRIMARY KEY (snapshot, claim)) STRICT`;
20
+ yield* sql`CREATE INDEX IF NOT EXISTS akter_blob_export_holds_claim ON akter_blob_export_holds (claim, expires_at)`;
21
+ yield* sql`CREATE INDEX IF NOT EXISTS akter_blob_export_holds_file ON akter_blob_export_holds (snapshot, sha256)`;
22
+ });
23
+ const prepareReceipts = (sql) => sql.withTransaction(Effect.gen(function* createReceiptTables() {
24
+ yield* sql`CREATE TABLE IF NOT EXISTS akter_blob_owners (id INTEGER PRIMARY KEY CHECK (id = 1), actor TEXT NOT NULL UNIQUE, state TEXT NOT NULL CHECK (state IN ('preparing', 'active', 'erased'))) STRICT`;
25
+ yield* sql`CREATE TABLE IF NOT EXISTS akter_blob_fork (id INTEGER PRIMARY KEY CHECK (id = 1), origin TEXT NOT NULL, operation TEXT NOT NULL, state TEXT NOT NULL CHECK (state IN ('preparing', 'active', 'aborted'))) STRICT`;
26
+ yield* sql`CREATE TABLE IF NOT EXISTS akter_blob_receipts (receipt TEXT PRIMARY KEY, actor TEXT NOT NULL, blob TEXT NOT NULL, claim TEXT NOT NULL UNIQUE, expires_at INTEGER NOT NULL, bytes INTEGER NOT NULL DEFAULT 0, sha256 TEXT NOT NULL DEFAULT '', grant TEXT NOT NULL DEFAULT '', state TEXT NOT NULL CHECK (state IN ('uploading', 'prepared', 'consumed', 'canceled'))) STRICT`;
27
+ yield* sql`CREATE INDEX IF NOT EXISTS akter_blob_receipts_expiry ON akter_blob_receipts (actor, expires_at, receipt) WHERE state IN ('uploading', 'prepared')`;
28
+ yield* sql`CREATE TABLE IF NOT EXISTS akter_blob_links (path TEXT PRIMARY KEY, actor TEXT NOT NULL, blob TEXT NOT NULL, claim TEXT NOT NULL UNIQUE, bytes INTEGER NOT NULL, sha256 TEXT NOT NULL, grant TEXT NOT NULL, written_at INTEGER NOT NULL) STRICT`;
29
+ yield* sql`CREATE TABLE IF NOT EXISTS akter_blob_releases (claim TEXT PRIMARY KEY, actor TEXT NOT NULL, blob TEXT NOT NULL) STRICT`;
30
+ yield* prepareRetention(sql);
31
+ }));
32
+ const copiedFileTables = [
33
+ "akter_blob_owners",
34
+ "akter_blob_fork",
35
+ "akter_blob_receipts",
36
+ "akter_blob_links",
37
+ "akter_blob_releases",
38
+ "akter_blob_history",
39
+ "akter_blob_ancestry",
40
+ "akter_blob_export_holds"
41
+ ];
42
+ /**
43
+ * Empties the file tables of a database copied from another actor, such as a fork's staged copy, before anything
44
+ * opens it as a blob owner. Their rows name the source actor, its claims and its grants; the fork then inherits the
45
+ * files under the copy's own claims and grants.
46
+ */
47
+ const clearCopiedFiles = (sql) => sql.withTransaction(Effect.andThen(prepareReceipts(sql), Effect.forEach(copiedFileTables, (table) => sql.unsafe(`DELETE FROM ${table}`), { discard: true })));
48
+ /**
49
+ * Blanks every grant of a database that leaves its engine in an archive and drops its export holds, then rewrites the
50
+ * file, so no wrapped file key stays in it, not even in free pages. A grant only opens its blob in the engine that
51
+ * wrapped it; the importing engine adopts the files under its own.
52
+ */
53
+ const stripArchivedFiles = (sql) => Effect.andThen(sql.withTransaction(Effect.gen(function* blankGrants() {
54
+ yield* prepareReceipts(sql);
55
+ yield* sql`UPDATE akter_blob_links SET grant = ''`;
56
+ yield* sql`UPDATE akter_blob_ancestry SET grant = ''`;
57
+ yield* sql`UPDATE akter_blob_receipts SET grant = ''`;
58
+ yield* sql`DELETE FROM akter_blob_export_holds`;
59
+ })), sql`VACUUM`);
60
+ const activeOwner = (sql, actor) => Effect.flatMap(sql`SELECT actor FROM akter_blob_owners WHERE actor = ${actor} AND state = 'active'`, (rows) => {
61
+ if (Array.isReadonlyArrayNonEmpty(rows)) return Effect.void;
62
+ return Effect.fail(unavailable(""));
63
+ });
64
+ const registerOwner = (sql, actor) => sql.withTransaction(Effect.gen(function* registerActor() {
65
+ yield* sql`INSERT INTO akter_blob_owners (id, actor, state) VALUES (1, ${actor}, 'active') ON CONFLICT DO NOTHING`;
66
+ yield* activeOwner(sql, actor);
67
+ }));
68
+ const erasedOwner = (sql, actor) => Effect.map(sql`SELECT actor FROM akter_blob_owners WHERE actor = ${actor} AND state = 'erased'`, Array.isReadonlyArrayNonEmpty);
69
+ const resumeOwner = (sql, actor) => sql.withTransaction(Effect.gen(function* resumeActor() {
70
+ yield* sql`INSERT INTO akter_blob_owners (id, actor, state) VALUES (1, ${actor}, 'active') ON CONFLICT DO NOTHING`;
71
+ const existing = yield* sql`SELECT actor FROM akter_blob_owners WHERE id = 1 AND actor = ${actor}`;
72
+ if (Array.isReadonlyArrayNonEmpty(existing)) return yield* Effect.void;
73
+ return yield* unavailable("");
74
+ }));
75
+ const receiptRow = (sql, actor, receipt) => sql`SELECT actor, blob, claim, receipt, expires_at AS expiresAt, bytes, sha256, grant, state FROM akter_blob_receipts WHERE actor = ${actor} AND receipt = ${receipt}`.pipe(Effect.map(Array.head), Effect.flatMap(Option.match({
76
+ onNone: () => Effect.fail(unavailable("")),
77
+ onSome: Effect.succeed
78
+ })));
79
+ const tooManyUnattached = (blob, unattached) => BlobTransferError.make({
80
+ blob,
81
+ message: `the actor already holds ${String(unattached)} uploads no command has attached; attach one, or wait for one to expire`
82
+ });
83
+ /** Refuses a new upload while the actor holds `unattached` receipts that are unexpired and not yet attached. */
84
+ const admitUpload = (sql, { blob, actor }, { now, unattached }) => Effect.flatMap(sql`SELECT receipt FROM akter_blob_receipts WHERE actor = ${actor} AND state IN ('uploading', 'prepared') AND expires_at > ${now} LIMIT ${unattached}`, (held) => {
85
+ if (held.length < unattached) return Effect.void;
86
+ return Effect.fail(tooManyUnattached(blob, unattached));
87
+ });
88
+ const reserveReceipt = (sql, reservation, admission) => sql.withTransaction(Effect.gen(function* reserveUpload() {
89
+ yield* activeOwner(sql, reservation.actor);
90
+ yield* admitUpload(sql, reservation, admission);
91
+ yield* sql`INSERT INTO akter_blob_receipts (receipt, actor, blob, claim, expires_at, state) VALUES (${reservation.receipt}, ${reservation.actor}, ${reservation.blob}, ${reservation.claim}, ${reservation.expiresAt}, 'uploading')`;
92
+ }));
93
+ const completeReceipt = (sql, { actor, expiresAt, receipt, sealed }) => sql.withTransaction(Effect.gen(function* completeUpload() {
94
+ yield* activeOwner(sql, actor);
95
+ const stored = yield* receiptRow(sql, actor, receipt);
96
+ if (stored.state !== "uploading") return yield* unavailable(stored.blob);
97
+ return yield* Effect.asVoid(sql`UPDATE akter_blob_receipts SET bytes = ${sealed.bytes}, sha256 = ${sealed.sha256}, grant = ${sealed.grant}, expires_at = ${expiresAt ?? stored.expiresAt}, state = 'prepared' WHERE receipt = ${receipt}`);
98
+ }));
99
+ const cancelReceipt = (sql, actor, { claim, receipt }) => sql.withTransaction(Effect.gen(function* cancelUpload() {
100
+ yield* sql`INSERT INTO akter_blob_releases (claim, actor, blob) SELECT claim, actor, blob FROM akter_blob_receipts WHERE actor = ${actor} AND receipt = ${receipt} AND claim = ${claim} AND state IN ('uploading', 'prepared') ON CONFLICT (claim) DO NOTHING`;
101
+ yield* sql`UPDATE akter_blob_receipts SET state = 'canceled' WHERE actor = ${actor} AND receipt = ${receipt} AND claim = ${claim} AND state IN ('uploading', 'prepared')`;
102
+ }));
103
+ const inspectClaim = (sql, actor, claim) => Effect.map(sql`SELECT actor, blob, claim, receipt, expires_at AS expiresAt, bytes, sha256, grant, state FROM akter_blob_receipts WHERE actor = ${actor} AND claim = ${claim}`, Array.head);
104
+ const linkAt = (sql, actor, path) => Effect.map(sql`SELECT actor, blob, claim, bytes, sha256, grant, path, written_at AS writtenAt FROM akter_blob_links WHERE actor = ${actor} AND path = ${path} AND EXISTS (SELECT 1 FROM akter_blob_owners WHERE actor = ${actor} AND state = 'active')`, Array.head);
105
+ const attachReceipt = (sql, { actor, now, path, receipt }) => sql.withTransaction(Effect.gen(function* attachUpload() {
106
+ yield* activeOwner(sql, actor);
107
+ const stored = yield* receiptRow(sql, actor, receipt);
108
+ if (stored.state !== "prepared" || stored.expiresAt <= now) return yield* unavailable(stored.blob);
109
+ yield* sql`INSERT INTO akter_blob_releases (claim, actor, blob) SELECT claim, actor, blob FROM akter_blob_links AS link WHERE actor = ${actor} AND path = ${path} AND NOT EXISTS (SELECT 1 FROM akter_blob_history WHERE claim = link.claim) ON CONFLICT (claim) DO NOTHING`;
110
+ yield* sql`INSERT INTO akter_blob_links (path, actor, blob, claim, bytes, sha256, grant, written_at) VALUES (${path}, ${actor}, ${stored.blob}, ${stored.claim}, ${stored.bytes}, ${stored.sha256}, ${stored.grant}, ${now}) ON CONFLICT (path) DO UPDATE SET actor = excluded.actor, blob = excluded.blob, claim = excluded.claim, bytes = excluded.bytes, sha256 = excluded.sha256, grant = excluded.grant, written_at = excluded.written_at`;
111
+ yield* sql`UPDATE akter_blob_receipts SET state = 'consumed' WHERE receipt = ${receipt}`;
112
+ return {
113
+ actor,
114
+ blob: stored.blob,
115
+ bytes: stored.bytes,
116
+ claim: stored.claim,
117
+ grant: stored.grant,
118
+ path,
119
+ sha256: stored.sha256,
120
+ writtenAt: now
121
+ };
122
+ }));
123
+ const removeLink = (sql, actor, path) => sql.withTransaction(Effect.gen(function* removeFile() {
124
+ yield* activeOwner(sql, actor);
125
+ yield* sql`INSERT INTO akter_blob_releases (claim, actor, blob) SELECT claim, actor, blob FROM akter_blob_links AS link WHERE actor = ${actor} AND path = ${path} AND NOT EXISTS (SELECT 1 FROM akter_blob_history WHERE claim = link.claim) ON CONFLICT (claim) DO NOTHING`;
126
+ yield* sql`DELETE FROM akter_blob_links WHERE actor = ${actor} AND path = ${path}`;
127
+ }));
128
+ const cancelExpired = (sql, actor, now) => sql.withTransaction(Effect.gen(function* expireUploads() {
129
+ yield* activeOwner(sql, actor);
130
+ yield* sql`INSERT INTO akter_blob_releases (claim, actor, blob) SELECT claim, actor, blob FROM akter_blob_receipts WHERE receipt IN (SELECT receipt FROM akter_blob_receipts WHERE actor = ${actor} AND state IN ('uploading', 'prepared') AND expires_at <= ${now} ORDER BY expires_at, receipt LIMIT ${cleanupPageSize}) ON CONFLICT (claim) DO NOTHING`;
131
+ yield* sql`UPDATE akter_blob_receipts SET state = 'canceled' WHERE receipt IN (SELECT receipt FROM akter_blob_receipts WHERE actor = ${actor} AND state IN ('uploading', 'prepared') AND expires_at <= ${now} ORDER BY expires_at, receipt LIMIT ${cleanupPageSize})`;
132
+ }));
133
+ const eraseOwner = (sql, actor) => sql.withTransaction(Effect.gen(function* eraseActorFiles() {
134
+ yield* sql`INSERT INTO akter_blob_owners (id, actor, state) VALUES (1, ${actor}, 'erased') ON CONFLICT (actor) DO UPDATE SET state = 'erased'`;
135
+ yield* sql`INSERT INTO akter_blob_releases (claim, actor, blob) SELECT claim, actor, blob FROM akter_blob_receipts WHERE actor = ${actor} ON CONFLICT (claim) DO NOTHING`;
136
+ yield* sql`INSERT INTO akter_blob_releases (claim, actor, blob) SELECT claim, actor, blob FROM akter_blob_links WHERE actor = ${actor} ON CONFLICT (claim) DO NOTHING`;
137
+ yield* sql`INSERT INTO akter_blob_releases (claim, actor, blob) SELECT claim, actor, blob FROM akter_blob_ancestry WHERE actor = ${actor} ON CONFLICT (claim) DO NOTHING`;
138
+ yield* sql`UPDATE akter_blob_receipts SET state = 'canceled' WHERE actor = ${actor}`;
139
+ yield* sql`DELETE FROM akter_blob_links WHERE actor = ${actor}`;
140
+ yield* sql`DELETE FROM akter_blob_history WHERE actor = ${actor}`;
141
+ yield* sql`DELETE FROM akter_blob_ancestry WHERE actor = ${actor}`;
142
+ yield* sql`DELETE FROM akter_blob_export_holds`;
143
+ yield* sql`UPDATE akter_blob_fork SET state = 'aborted'`;
144
+ }));
145
+ const pendingReleases = (sql, actor, now) => sql`SELECT actor, blob, claim FROM akter_blob_releases AS pending WHERE actor = ${actor} AND NOT EXISTS (SELECT 1 FROM akter_blob_history WHERE claim = pending.claim) AND NOT EXISTS (SELECT 1 FROM akter_blob_links WHERE claim = pending.claim) AND NOT EXISTS (SELECT 1 FROM akter_blob_ancestry WHERE claim = pending.claim) AND NOT EXISTS (SELECT 1 FROM akter_blob_receipts WHERE claim = pending.claim AND state IN ('uploading', 'prepared')) AND NOT EXISTS (SELECT 1 FROM akter_blob_export_holds WHERE claim = pending.claim AND expires_at > ${now}) ORDER BY claim LIMIT ${cleanupPageSize}`;
146
+ const acknowledgeRelease = (sql, { actor, claim }) => Effect.asVoid(sql`DELETE FROM akter_blob_releases WHERE actor = ${actor} AND claim = ${claim}`);
147
+ const blobReceipts = ({ actor, sql }) => ({
148
+ acknowledge: (claim) => acknowledgeRelease(sql, {
149
+ actor,
150
+ claim
151
+ }),
152
+ active: activeOwner(sql, actor),
153
+ attach: (attaching) => attachReceipt(sql, {
154
+ ...attaching,
155
+ actor
156
+ }),
157
+ cancel: (reservation) => cancelReceipt(sql, actor, reservation),
158
+ complete: (preparing) => completeReceipt(sql, {
159
+ ...preparing,
160
+ actor
161
+ }),
162
+ erase: eraseOwner(sql, actor),
163
+ erased: erasedOwner(sql, actor),
164
+ expire: (now) => cancelExpired(sql, actor, now),
165
+ inspect: (claim) => inspectClaim(sql, actor, claim),
166
+ link: (path) => linkAt(sql, actor, path),
167
+ register: registerOwner(sql, actor),
168
+ releases: (now) => pendingReleases(sql, actor, now),
169
+ remove: (path) => removeLink(sql, actor, path),
170
+ reserve: (reservation, admission) => reserveReceipt(sql, {
171
+ ...reservation,
172
+ actor
173
+ }, admission),
174
+ resume: resumeOwner(sql, actor)
175
+ });
176
+ export { blobReceipts, clearCopiedFiles, prepareReceipts, stripArchivedFiles };
@@ -0,0 +1,21 @@
1
+ import { BlobSealing } from "../blob-sealing.service.mjs";
2
+ import { BlobHashing } from "../../hash/blob-hashing.service.mjs";
3
+ import { BlobTransfers, FileOperation, TransferHome } from "./blob-transfer.pure.mjs";
4
+ import { Ref } from "effect";
5
+ interface AdoptionHome extends TransferHome {
6
+ readonly hashing: BlobHashing["Service"];
7
+ readonly run: FileOperation;
8
+ readonly sealing: BlobSealing["Service"];
9
+ readonly uploads: Ref.Ref<Set<string>>;
10
+ }
11
+ /**
12
+ * Takes a blob another home stores into this one under `adoption.claim`, and answers the grant that opens it for the
13
+ * claim's actor. The grant is rewrapped from `origin` first. A blob this home already has ready gains a reference
14
+ * claim and `stored` is never read; otherwise its bytes are placed as they are, read back through the new grant and
15
+ * checked against the file's size and SHA-256 before the blob is ready. Adopting the same claim again does the same
16
+ * thing again, so a retry after a crash finishes or repeats the copy. A copy that fails releases its upload claim and
17
+ * removes its file; one cut short by a crash is released by upload recovery when the actor's files next open. Nothing
18
+ * is written to the actor's own database: the caller records the returned grant with the file.
19
+ */
20
+ declare const adoptWith: (home: AdoptionHome) => BlobTransfers["adopt"];
21
+ export { type AdoptionHome, adoptWith };
@@ -0,0 +1,68 @@
1
+ import { BlobTransferError } from "../../../contract/file/blob-transfer.errors.mjs";
2
+ import { Effect, Exit, Ref, Stream } from "effect";
3
+ // src/host/blob/reference/blob-transfer-adopt.pure.ts
4
+ const noBytes = 0;
5
+ const mismatched = (blob) => BlobTransferError.make({
6
+ blob,
7
+ message: "the adopted bytes do not match the file's size and SHA-256"
8
+ });
9
+ /** Reads the placed blob back as its new holder, so a wrong grant, blob id or byte fails before the blob is ready. */
10
+ const verified = Effect.fnUntraced(function* verified(home, { claim, file, grant }) {
11
+ const hash = yield* home.hashing.sha256;
12
+ const counted = yield* Ref.make(noBytes);
13
+ const read = home.directory.open({
14
+ actor: claim.actor,
15
+ blob: claim.blob,
16
+ grant
17
+ });
18
+ yield* Stream.runForEach(read, (chunk) => Effect.andThen(Ref.update(counted, (bytes) => bytes + chunk.byteLength), hash.update(chunk)));
19
+ const bytes = yield* Ref.get(counted);
20
+ const sha256 = yield* hash.digest;
21
+ if (bytes !== file.bytes || sha256 !== file.sha256) return yield* mismatched(claim.blob);
22
+ return yield* Effect.void;
23
+ });
24
+ /** Releases the upload claim of a copy that failed and removes what it placed; the blob was this claim's alone. */
25
+ const discarded = (home, claim) => home.run(Effect.andThen(home.catalog.release(claim), home.directory.remove(claim.blob)));
26
+ const copied = (home, { claim, file, stored }, grant) => Effect.gen(function* copyBlob() {
27
+ yield* home.directory.place({
28
+ blob: claim.blob,
29
+ source: stored
30
+ });
31
+ yield* verified(home, {
32
+ claim,
33
+ file,
34
+ grant
35
+ });
36
+ yield* home.run(home.catalog.complete(claim));
37
+ }).pipe(Effect.onExit((exit) => {
38
+ if (Exit.isSuccess(exit)) return Effect.void;
39
+ return discarded(home, claim);
40
+ }));
41
+ /** Keeps the claim out of upload recovery while this adoption runs, as an upload in flight is. */
42
+ const tracked = (home, claim, effect) => Effect.andThen(Ref.update(home.uploads, (uploads) => new Set(uploads).add(claim)), effect).pipe(Effect.ensuring(Ref.update(home.uploads, (uploads) => {
43
+ const remaining = new Set(uploads);
44
+ remaining.delete(claim);
45
+ return remaining;
46
+ })));
47
+ const adopted = (home, adoption) => Effect.gen(function* adoptBlob() {
48
+ const { claim, file, origin } = adoption;
49
+ const grant = yield* home.sealing.rewrap({
50
+ blob: claim.blob,
51
+ from: origin,
52
+ grant: file.grant,
53
+ to: claim.actor
54
+ });
55
+ if ((yield* home.run(home.catalog.adopt(claim))) === "copy") yield* copied(home, adoption, grant);
56
+ return grant;
57
+ });
58
+ /**
59
+ * Takes a blob another home stores into this one under `adoption.claim`, and answers the grant that opens it for the
60
+ * claim's actor. The grant is rewrapped from `origin` first. A blob this home already has ready gains a reference
61
+ * claim and `stored` is never read; otherwise its bytes are placed as they are, read back through the new grant and
62
+ * checked against the file's size and SHA-256 before the blob is ready. Adopting the same claim again does the same
63
+ * thing again, so a retry after a crash finishes or repeats the copy. A copy that fails releases its upload claim and
64
+ * removes its file; one cut short by a crash is released by upload recovery when the actor's files next open. Nothing
65
+ * is written to the actor's own database: the caller records the returned grant with the file.
66
+ */
67
+ const adoptWith = (home) => (adoption) => tracked(home, adoption.claim.claim, adopted(home, adoption));
68
+ export { adoptWith };
@@ -0,0 +1,15 @@
1
+ import { BlobSealing } from "../blob-sealing.service.mjs";
2
+ import { BlobTransfers, TransferHome } from "./blob-transfer.pure.mjs";
3
+ import { SecureRandom } from "effect/crypto";
4
+ interface ForkServices {
5
+ readonly home: TransferHome;
6
+ readonly random: SecureRandom.SecureRandom["Service"];
7
+ readonly sealing: BlobSealing["Service"];
8
+ }
9
+ /**
10
+ * Forks the source's files into the target, in the target's home. The source's catalog refuses a fork from an erased
11
+ * actor, the target's refuses one into an erased or already bound actor, and the target's catalog records the
12
+ * lineage. A fork that fails partway gives the target's claims back.
13
+ */
14
+ declare const forkWith: (services: ForkServices) => BlobTransfers["fork"];
15
+ export { forkWith };
@@ -0,0 +1,125 @@
1
+ import { BlobTransferError } from "../../../contract/file/blob-transfer.errors.mjs";
2
+ import { Array, Effect, Exit, Ref } from "effect";
3
+ // src/host/blob/reference/blob-transfer-fork.pure.ts
4
+ const familyOf = ({ source, target }) => ({
5
+ actor: target.actor,
6
+ origin: source.actor
7
+ });
8
+ /** Within one home the blob is shared: its grant is rewrapped from the source to the target, and the target claims it. */
9
+ const withinHome = ({ home, random, sealing }, fork) => ({
10
+ catalog: home.catalog,
11
+ checkLineage: home.catalog.checkFork(familyOf(fork)),
12
+ claim: Effect.fnUntraced(function* claimWithinHome(file) {
13
+ const claim = yield* random.uuidV4();
14
+ const { source, target } = fork;
15
+ const grant = yield* sealing.rewrap({
16
+ blob: file.blob,
17
+ from: source.actor,
18
+ grant: file.grant,
19
+ to: target.actor
20
+ });
21
+ yield* home.catalog.acquire({
22
+ actor: target.actor,
23
+ blob: file.blob,
24
+ claim
25
+ });
26
+ return {
27
+ claim,
28
+ grant
29
+ };
30
+ })
31
+ });
32
+ /**
33
+ * Into another home the source's sealed blob is adopted there, its bytes copied unchanged under the same blob id, and
34
+ * the target claims it in that home; the frames are never re-encrypted.
35
+ */
36
+ const intoHome = ({ home, random }, fork) => ({
37
+ catalog: fork.into.catalog,
38
+ checkLineage: Effect.andThen(home.catalog.checkFork(familyOf(fork)), fork.into.catalog.checkFork(familyOf(fork))),
39
+ claim: Effect.fnUntraced(function* claimIntoHome(file) {
40
+ const { into, source, target } = fork;
41
+ const claim = yield* random.uuidV4();
42
+ return {
43
+ claim,
44
+ grant: yield* into.transfers.adopt({
45
+ claim: {
46
+ actor: target.actor,
47
+ blob: file.blob,
48
+ claim
49
+ },
50
+ file,
51
+ origin: source.actor,
52
+ stored: home.directory.stored(file.blob)
53
+ })
54
+ };
55
+ })
56
+ });
57
+ const inheritWith = (claims, fork) => Effect.fnUntraced(function* inheritFile(file) {
58
+ const { claim, grant } = yield* claims.claim(file);
59
+ yield* fork.target.transaction(fork.target.forks.inherit({
60
+ ...file,
61
+ claim,
62
+ grant
63
+ }));
64
+ });
65
+ const copyPaths = Effect.fnUntraced(function* copyPaths(claims, fork) {
66
+ let after = "";
67
+ for (;;) {
68
+ const files = yield* fork.source.transaction(fork.source.forks.entries(after));
69
+ if (!Array.isReadonlyArrayNonEmpty(files)) return;
70
+ yield* Effect.forEach(files, inheritWith(claims, fork), { discard: true });
71
+ after = Array.lastNonEmpty(files).path;
72
+ }
73
+ });
74
+ const checkTarget = Effect.fnUntraced(function* checkTarget(claims, fork) {
75
+ if (!(yield* fork.target.forks.begin({
76
+ operation: fork.operation,
77
+ origin: fork.source.actor
78
+ }))) return false;
79
+ yield* claims.checkLineage;
80
+ return true;
81
+ });
82
+ /**
83
+ * Undoes an unfinished fork into the target: its claims are released and its catalog entry removed, so a retry can
84
+ * fork into the same actor. A target whose fork already finished is left alone; erasing it is `erase`.
85
+ */
86
+ const abandonWith = (catalog, fork) => Effect.flatMap(fork.target.transaction(fork.target.forks.pending), (preparing) => {
87
+ if (!preparing) return Effect.void;
88
+ return Effect.andThen(fork.target.transaction(fork.target.receipts.erase), catalog.abandon(familyOf(fork)));
89
+ });
90
+ const claimsFor = (services, fork) => {
91
+ if (fork.into.root === services.home.root) return withinHome(services, fork);
92
+ return intoHome(services, fork);
93
+ };
94
+ /**
95
+ * Forks the source's files into the target, in the target's home. The source's catalog refuses a fork from an erased
96
+ * actor, the target's refuses one into an erased or already bound actor, and the target's catalog records the
97
+ * lineage. A fork that fails partway gives the target's claims back.
98
+ */
99
+ const forkWith = (services) => Effect.fnUntraced(function* forkFiles(fork) {
100
+ if (fork.source.actor === fork.target.actor) return yield* BlobTransferError.make({
101
+ blob: "",
102
+ message: "an actor cannot fork its files into itself"
103
+ });
104
+ const claims = claimsFor(services, fork);
105
+ const started = yield* Ref.make(false);
106
+ const identity = {
107
+ operation: fork.operation,
108
+ origin: fork.source.actor
109
+ };
110
+ const prepare = Effect.gen(function* activateInheritedFiles() {
111
+ if (!(yield* fork.target.transaction(checkTarget(claims, fork)))) return;
112
+ yield* Ref.set(started, true);
113
+ yield* claims.catalog.recordFork(familyOf(fork));
114
+ yield* fork.source.exclusive(Effect.andThen(fork.source.receipts.active, copyPaths(claims, fork)));
115
+ yield* fork.target.transaction(fork.target.forks.activate(identity));
116
+ });
117
+ return yield* fork.target.exclusive(prepare).pipe(Effect.onExit((exit) => {
118
+ if (Exit.isSuccess(exit)) return Effect.void;
119
+ return Effect.flatMap(Ref.get(started), (created) => {
120
+ if (!created) return Effect.void;
121
+ return fork.target.exclusive(abandonWith(claims.catalog, fork));
122
+ });
123
+ }));
124
+ });
125
+ export { forkWith };
@@ -0,0 +1,18 @@
1
+ import { BlobClaim } from "./blob-catalog.sql.mjs";
2
+ import { BlobOwner, FileOperation, TransferEffect, TransferHome } from "./blob-transfer.pure.mjs";
3
+ import { Ref } from "effect";
4
+ interface UpkeepHome extends TransferHome {
5
+ readonly run: FileOperation;
6
+ readonly uploads: Ref.Ref<Set<string>>;
7
+ }
8
+ interface TransferUpkeep {
9
+ readonly cancel: (owner: BlobOwner, claim: BlobClaim & {
10
+ readonly receipt: string;
11
+ }) => TransferEffect<void>;
12
+ readonly collect: TransferEffect<readonly string[]>;
13
+ readonly erase: (owner: BlobOwner) => TransferEffect<void>;
14
+ readonly recover: (owner: BlobOwner) => TransferEffect<void>;
15
+ readonly settle: (owner: BlobOwner) => TransferEffect<void>;
16
+ }
17
+ declare const transferUpkeep: (home: UpkeepHome) => TransferUpkeep;
18
+ export { type TransferUpkeep, transferUpkeep };