@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.
- package/LICENSE +201 -0
- package/README.md +43 -2
- package/dist/contract/actor/actor-already-exists.errors.d.mts +8 -0
- package/dist/contract/actor/actor-already-exists.errors.mjs +4 -0
- package/dist/contract/actor/actor-definition.pure.d.mts +21 -0
- package/dist/contract/actor/actor-definition.pure.mjs +106 -0
- package/dist/contract/actor/actor-erased.errors.d.mts +8 -0
- package/dist/contract/actor/actor-erased.errors.mjs +4 -0
- package/dist/contract/actor/actor-names.pure.d.mts +11 -0
- package/dist/contract/actor/actor-names.pure.mjs +51 -0
- package/dist/contract/actor/actor-not-created.errors.d.mts +8 -0
- package/dist/contract/actor/actor-not-created.errors.mjs +4 -0
- package/dist/contract/actor/actor-not-registered.errors.d.mts +8 -0
- package/dist/contract/actor/actor-not-registered.errors.mjs +4 -0
- package/dist/contract/actor/actor-registry.service.d.mts +16 -0
- package/dist/contract/actor/actor-registry.service.mjs +21 -0
- package/dist/contract/actor/actor.contract.d.mts +238 -0
- package/dist/contract/actor/actor.contract.mjs +1 -0
- package/dist/contract/actor/host-interface.pure.d.mts +23 -0
- package/dist/contract/actor/host-interface.pure.mjs +39 -0
- package/dist/contract/actor/reserved-member.errors.d.mts +9 -0
- package/dist/contract/actor/reserved-member.errors.mjs +7 -0
- package/dist/contract/akter.service.d.mts +75 -0
- package/dist/contract/akter.service.mjs +134 -0
- package/dist/contract/caller/authentication.api.d.mts +6 -0
- package/dist/contract/caller/authentication.api.mjs +5 -0
- package/dist/contract/caller/caller-admission.pure.d.mts +27 -0
- package/dist/contract/caller/caller-admission.pure.mjs +59 -0
- package/dist/contract/caller/caller-not-allowed.errors.d.mts +16 -0
- package/dist/contract/caller/caller-not-allowed.errors.mjs +18 -0
- package/dist/contract/caller/caller.schema.d.mts +7 -0
- package/dist/contract/caller/caller.schema.mjs +8 -0
- package/dist/contract/caller/current-caller.service.d.mts +7 -0
- package/dist/contract/caller/current-caller.service.mjs +4 -0
- package/dist/contract/caller/principal.schema.d.mts +13 -0
- package/dist/contract/caller/principal.schema.mjs +10 -0
- package/dist/contract/caller/unauthenticated.errors.d.mts +8 -0
- package/dist/contract/caller/unauthenticated.errors.mjs +4 -0
- package/dist/contract/client/actor-client.adapter.d.mts +42 -0
- package/dist/contract/client/actor-client.adapter.mjs +90 -0
- package/dist/contract/client/actor-client.contract.d.mts +30 -0
- package/dist/contract/client/actor-client.contract.mjs +1 -0
- package/dist/contract/client/actor-rpc.contract.d.mts +33 -0
- package/dist/contract/client/actor-rpc.contract.mjs +16 -0
- package/dist/contract/client/actor-unavailable.errors.d.mts +9 -0
- package/dist/contract/client/actor-unavailable.errors.mjs +7 -0
- package/dist/contract/client/client-failure.contract.d.mts +28 -0
- package/dist/contract/client/client-failure.contract.mjs +28 -0
- package/dist/contract/client/invalid-request.errors.d.mts +9 -0
- package/dist/contract/client/invalid-request.errors.mjs +7 -0
- package/dist/contract/client/storage-limit.errors.d.mts +16 -0
- package/dist/contract/client/storage-limit.errors.mjs +14 -0
- package/dist/contract/command/command-id-expired.errors.d.mts +11 -0
- package/dist/contract/command/command-id-expired.errors.mjs +9 -0
- package/dist/contract/command/command-id.schema.d.mts +3 -0
- package/dist/contract/command/command-id.schema.mjs +4 -0
- package/dist/contract/command/command.contract.d.mts +117 -0
- package/dist/contract/command/command.contract.mjs +111 -0
- package/dist/contract/command/outbox-id.pure.d.mts +9 -0
- package/dist/contract/command/outbox-id.pure.mjs +14 -0
- package/dist/contract/command/outbox.schema.d.mts +9 -0
- package/dist/contract/command/outbox.schema.mjs +10 -0
- package/dist/contract/command/timer.schema.d.mts +20 -0
- package/dist/contract/command/timer.schema.mjs +14 -0
- package/dist/contract/computer/checkpoint-expired.errors.d.mts +12 -0
- package/dist/contract/computer/checkpoint-expired.errors.mjs +8 -0
- package/dist/contract/computer/computer-client-failure.contract.d.mts +16 -0
- package/dist/contract/computer/computer-client-failure.contract.mjs +1 -0
- package/dist/contract/computer/computer-client.adapter.d.mts +21 -0
- package/dist/contract/computer/computer-client.adapter.mjs +70 -0
- package/dist/contract/computer/computer-client.contract.d.mts +56 -0
- package/dist/contract/computer/computer-client.contract.mjs +1 -0
- package/dist/contract/computer/computer-held.errors.d.mts +13 -0
- package/dist/contract/computer/computer-held.errors.mjs +11 -0
- package/dist/contract/computer/computer-limit.errors.d.mts +15 -0
- package/dist/contract/computer/computer-limit.errors.mjs +13 -0
- package/dist/contract/computer/computer-lost.errors.d.mts +12 -0
- package/dist/contract/computer/computer-lost.errors.mjs +8 -0
- package/dist/contract/computer/computer-not-found.errors.d.mts +9 -0
- package/dist/contract/computer/computer-not-found.errors.mjs +5 -0
- package/dist/contract/computer/computer.schema.d.mts +122 -0
- package/dist/contract/computer/computer.schema.mjs +117 -0
- package/dist/contract/computer/computers-unavailable.errors.d.mts +9 -0
- package/dist/contract/computer/computers-unavailable.errors.mjs +5 -0
- package/dist/contract/computer/files/computer-files.schema.d.mts +28 -0
- package/dist/contract/computer/files/computer-files.schema.mjs +24 -0
- package/dist/contract/computer/rpc/computer-rpc.contract.d.mts +108 -0
- package/dist/contract/computer/rpc/computer-rpc.contract.mjs +117 -0
- package/dist/contract/computer/step/computer-step.contract.d.mts +21 -0
- package/dist/contract/computer/step/computer-step.contract.mjs +89 -0
- package/dist/contract/computer/step/computer-step.schema.d.mts +69 -0
- package/dist/contract/computer/step/computer-step.schema.mjs +71 -0
- package/dist/contract/computer/step/step-failure.schema.d.mts +13 -0
- package/dist/contract/computer/step/step-failure.schema.mjs +24 -0
- package/dist/contract/computer/step/step-not-found.errors.d.mts +9 -0
- package/dist/contract/computer/step/step-not-found.errors.mjs +5 -0
- package/dist/contract/description/published-contract.pure.d.mts +51 -0
- package/dist/contract/description/published-contract.pure.mjs +75 -0
- package/dist/contract/file/access/file-access-denied.errors.d.mts +11 -0
- package/dist/contract/file/access/file-access-denied.errors.mjs +9 -0
- package/dist/contract/file/access/file-access.contract.d.mts +35 -0
- package/dist/contract/file/access/file-access.contract.mjs +32 -0
- package/dist/contract/file/actor-files.contract.d.mts +50 -0
- package/dist/contract/file/actor-files.contract.mjs +1 -0
- package/dist/contract/file/blob-transfer.errors.d.mts +9 -0
- package/dist/contract/file/blob-transfer.errors.mjs +7 -0
- package/dist/contract/file/file-client-failure.contract.d.mts +24 -0
- package/dist/contract/file/file-client-failure.contract.mjs +1 -0
- package/dist/contract/file/file-client.adapter.d.mts +17 -0
- package/dist/contract/file/file-client.adapter.mjs +21 -0
- package/dist/contract/file/file-client.contract.d.mts +14 -0
- package/dist/contract/file/file-client.contract.mjs +1 -0
- package/dist/contract/file/file-listing.pure.d.mts +6 -0
- package/dist/contract/file/file-listing.pure.mjs +18 -0
- package/dist/contract/file/file-not-found.errors.d.mts +8 -0
- package/dist/contract/file/file-not-found.errors.mjs +4 -0
- package/dist/contract/file/file-path.pure.d.mts +4 -0
- package/dist/contract/file/file-path.pure.mjs +38 -0
- package/dist/contract/file/files-unavailable.errors.d.mts +8 -0
- package/dist/contract/file/files-unavailable.errors.mjs +4 -0
- package/dist/contract/file/invalid-file-request.errors.d.mts +9 -0
- package/dist/contract/file/invalid-file-request.errors.mjs +7 -0
- package/dist/contract/file/rpc/file-rpc.contract.d.mts +88 -0
- package/dist/contract/file/rpc/file-rpc.contract.mjs +117 -0
- package/dist/contract/file/rpc/file-too-large.errors.d.mts +13 -0
- package/dist/contract/file/rpc/file-too-large.errors.mjs +11 -0
- package/dist/contract/file/rpc/rpc-file-clients.layer.d.mts +10 -0
- package/dist/contract/file/rpc/rpc-file-clients.layer.mjs +95 -0
- package/dist/contract/fork/fork-rpc.contract.d.mts +40 -0
- package/dist/contract/fork/fork-rpc.contract.mjs +26 -0
- package/dist/contract/history/actor-journal.service.d.mts +58 -0
- package/dist/contract/history/actor-journal.service.mjs +67 -0
- package/dist/contract/history/history-entry.pure.d.mts +79 -0
- package/dist/contract/history/history-entry.pure.mjs +95 -0
- package/dist/contract/hosted/handler-failed.errors.d.mts +16 -0
- package/dist/contract/hosted/handler-failed.errors.mjs +14 -0
- package/dist/contract/hosted/handler-failure.pure.d.mts +21 -0
- package/dist/contract/hosted/handler-failure.pure.mjs +86 -0
- package/dist/contract/hosted/hosted-actor.service.d.mts +23 -0
- package/dist/contract/hosted/hosted-actor.service.mjs +64 -0
- package/dist/contract/hosted/hosted-command.service.d.mts +20 -0
- package/dist/contract/hosted/hosted-command.service.mjs +88 -0
- package/dist/contract/hosted/hosted-create.service.d.mts +17 -0
- package/dist/contract/hosted/hosted-create.service.mjs +67 -0
- package/dist/contract/hosted/hosted-error.contract.d.mts +11 -0
- package/dist/contract/hosted/hosted-error.contract.mjs +1 -0
- package/dist/contract/hosted/hosted-failure.schema.d.mts +18 -0
- package/dist/contract/hosted/hosted-failure.schema.mjs +31 -0
- package/dist/contract/hosted/hosted-outcome.contract.d.mts +18 -0
- package/dist/contract/hosted/hosted-outcome.contract.mjs +1 -0
- package/dist/contract/hosted/hosted-query.service.d.mts +16 -0
- package/dist/contract/hosted/hosted-query.service.mjs +42 -0
- package/dist/contract/hosted/hosted-request.pure.d.mts +61 -0
- package/dist/contract/hosted/hosted-request.pure.mjs +91 -0
- package/dist/contract/job/job-id.pure.d.mts +11 -0
- package/dist/contract/job/job-id.pure.mjs +20 -0
- package/dist/contract/job/job-patches.contract.d.mts +32 -0
- package/dist/contract/job/job-patches.contract.mjs +45 -0
- package/dist/contract/job/job-signal.schema.d.mts +13 -0
- package/dist/contract/job/job-signal.schema.mjs +16 -0
- package/dist/contract/job/reserved-payload-field.errors.d.mts +10 -0
- package/dist/contract/job/reserved-payload-field.errors.mjs +8 -0
- package/dist/contract/job/started-job.schema.d.mts +7 -0
- package/dist/contract/job/started-job.schema.mjs +8 -0
- package/dist/contract/json-codec.pure.d.mts +7 -0
- package/dist/contract/json-codec.pure.mjs +14 -0
- package/dist/contract/room.contract.d.mts +75 -0
- package/dist/contract/room.contract.mjs +36 -0
- package/dist/contract/secret/actor-secrets.adapter.d.mts +33 -0
- package/dist/contract/secret/actor-secrets.adapter.mjs +38 -0
- package/dist/contract/secret/invalid-secret-name.errors.d.mts +10 -0
- package/dist/contract/secret/invalid-secret-name.errors.mjs +8 -0
- package/dist/contract/secret/secret-unavailable.errors.d.mts +11 -0
- package/dist/contract/secret/secret-unavailable.errors.mjs +10 -0
- package/dist/contract/secret/secret.schema.d.mts +25 -0
- package/dist/contract/secret/secret.schema.mjs +34 -0
- package/dist/contract/spend/billing-unavailable.errors.d.mts +12 -0
- package/dist/contract/spend/billing-unavailable.errors.mjs +8 -0
- package/dist/contract/spend/spend-cap-reached.errors.d.mts +17 -0
- package/dist/contract/spend/spend-cap-reached.errors.mjs +15 -0
- package/dist/contract/state/actor-state.pure.d.mts +38 -0
- package/dist/contract/state/actor-state.pure.mjs +153 -0
- package/dist/contract/state/actor-state.service.d.mts +45 -0
- package/dist/contract/state/actor-state.service.mjs +18 -0
- package/dist/contract/state/state-migration.pure.d.mts +11 -0
- package/dist/contract/state/state-migration.pure.mjs +23 -0
- package/dist/contract/state/state-read.pure.d.mts +12 -0
- package/dist/contract/state/state-read.pure.mjs +22 -0
- package/dist/contract/state/state-unreadable.errors.d.mts +9 -0
- package/dist/contract/state/state-unreadable.errors.mjs +7 -0
- package/dist/host/actor/actor-database.service.d.mts +46 -0
- package/dist/host/actor/actor-database.service.mjs +112 -0
- package/dist/host/actor/actor-exclusive.pure.d.mts +7 -0
- package/dist/host/actor/actor-exclusive.pure.mjs +16 -0
- package/dist/host/actor/actor-records.sql.d.mts +29 -0
- package/dist/host/actor/actor-records.sql.mjs +26 -0
- package/dist/host/actor/reserved-name.errors.d.mts +10 -0
- package/dist/host/actor/reserved-name.errors.mjs +8 -0
- package/dist/host/actor/reserved-names.pure.d.mts +15 -0
- package/dist/host/actor/reserved-names.pure.mjs +20 -0
- package/dist/host/actor/room.actor.d.mts +4 -0
- package/dist/host/actor/room.actor.mjs +36 -0
- package/dist/host/blob/blob-frames.pure.d.mts +7 -0
- package/dist/host/blob/blob-frames.pure.mjs +28 -0
- package/dist/host/blob/blob-grant.schema.d.mts +14 -0
- package/dist/host/blob/blob-grant.schema.mjs +15 -0
- package/dist/host/blob/blob-grants.service.d.mts +28 -0
- package/dist/host/blob/blob-grants.service.mjs +129 -0
- package/dist/host/blob/blob-keyring.service.d.mts +18 -0
- package/dist/host/blob/blob-keyring.service.mjs +4 -0
- package/dist/host/blob/blob-range.pure.d.mts +13 -0
- package/dist/host/blob/blob-range.pure.mjs +23 -0
- package/dist/host/blob/blob-sealing.contract.d.mts +37 -0
- package/dist/host/blob/blob-sealing.contract.mjs +1 -0
- package/dist/host/blob/blob-sealing.service.d.mts +11 -0
- package/dist/host/blob/blob-sealing.service.mjs +16 -0
- package/dist/host/blob/export/blob-archive.sql.d.mts +21 -0
- package/dist/host/blob/export/blob-archive.sql.mjs +75 -0
- package/dist/host/blob/export/blob-export-holds.sql.d.mts +49 -0
- package/dist/host/blob/export/blob-export-holds.sql.mjs +25 -0
- package/dist/host/blob/plain-blob-sealing.pure.d.mts +5 -0
- package/dist/host/blob/plain-blob-sealing.pure.mjs +55 -0
- package/dist/host/blob/reference/blob-catalog.sql.d.mts +40 -0
- package/dist/host/blob/reference/blob-catalog.sql.mjs +145 -0
- package/dist/host/blob/reference/blob-coordinator.pure.d.mts +10 -0
- package/dist/host/blob/reference/blob-coordinator.pure.mjs +153 -0
- package/dist/host/blob/reference/blob-file-page.sql.d.mts +13 -0
- package/dist/host/blob/reference/blob-file-page.sql.mjs +21 -0
- package/dist/host/blob/reference/blob-forks.sql.d.mts +21 -0
- package/dist/host/blob/reference/blob-forks.sql.mjs +40 -0
- package/dist/host/blob/reference/blob-lineage.sql.d.mts +14 -0
- package/dist/host/blob/reference/blob-lineage.sql.mjs +24 -0
- package/dist/host/blob/reference/blob-reads.pure.d.mts +15 -0
- package/dist/host/blob/reference/blob-reads.pure.mjs +97 -0
- package/dist/host/blob/reference/blob-receipts.sql.d.mts +71 -0
- package/dist/host/blob/reference/blob-receipts.sql.mjs +176 -0
- package/dist/host/blob/reference/blob-transfer-adopt.pure.d.mts +21 -0
- package/dist/host/blob/reference/blob-transfer-adopt.pure.mjs +68 -0
- package/dist/host/blob/reference/blob-transfer-fork.pure.d.mts +15 -0
- package/dist/host/blob/reference/blob-transfer-fork.pure.mjs +125 -0
- package/dist/host/blob/reference/blob-transfer-upkeep.pure.d.mts +18 -0
- package/dist/host/blob/reference/blob-transfer-upkeep.pure.mjs +54 -0
- package/dist/host/blob/reference/blob-transfer.pure.d.mts +85 -0
- package/dist/host/blob/reference/blob-transfer.pure.mjs +1 -0
- package/dist/host/blob/sealed-blob-sealing.pure.d.mts +10 -0
- package/dist/host/blob/sealed-blob-sealing.pure.mjs +130 -0
- package/dist/host/blob/stream/blob-directory.pure.d.mts +18 -0
- package/dist/host/blob/stream/blob-directory.pure.mjs +84 -0
- package/dist/host/blob/stream/blob-length.pure.d.mts +9 -0
- package/dist/host/blob/stream/blob-length.pure.mjs +19 -0
- package/dist/host/blob/stream/blob-writing.pure.d.mts +8 -0
- package/dist/host/blob/stream/blob-writing.pure.mjs +15 -0
- package/dist/host/command/batch/command-batch.sql.d.mts +61 -0
- package/dist/host/command/batch/command-batch.sql.mjs +100 -0
- package/dist/host/command/command-context.adapter.d.mts +47 -0
- package/dist/host/command/command-context.adapter.mjs +90 -0
- package/dist/host/command/command-id-age.pure.d.mts +13 -0
- package/dist/host/command/command-id-age.pure.mjs +31 -0
- package/dist/host/command/command-id-reuse.pure.d.mts +28 -0
- package/dist/host/command/command-id-reuse.pure.mjs +38 -0
- package/dist/host/command/command-id-reused.errors.d.mts +13 -0
- package/dist/host/command/command-id-reused.errors.mjs +11 -0
- package/dist/host/command/command-journal.sql.d.mts +84 -0
- package/dist/host/command/command-journal.sql.mjs +74 -0
- package/dist/host/command/command-rejected.errors.d.mts +8 -0
- package/dist/host/command/command-rejected.errors.mjs +4 -0
- package/dist/host/command/command-replay.service.d.mts +62 -0
- package/dist/host/command/command-replay.service.mjs +140 -0
- package/dist/host/command/command-reply.pure.d.mts +8 -0
- package/dist/host/command/command-reply.pure.mjs +12 -0
- package/dist/host/command/command-runner.service.d.mts +68 -0
- package/dist/host/command/command-runner.service.mjs +215 -0
- package/dist/host/command/files/command-file-inputs.sql.d.mts +51 -0
- package/dist/host/command/files/command-file-inputs.sql.mjs +59 -0
- package/dist/host/command/history-pruned.errors.d.mts +10 -0
- package/dist/host/command/history-pruned.errors.mjs +8 -0
- package/dist/host/command/replay/replay-cursor-stalled.errors.d.mts +9 -0
- package/dist/host/command/replay/replay-cursor-stalled.errors.mjs +7 -0
- package/dist/host/command/replay/replay-cursor.pure.d.mts +7 -0
- package/dist/host/command/replay/replay-cursor.pure.mjs +12 -0
- package/dist/host/computer/computer-steps.sql.d.mts +14 -0
- package/dist/host/computer/computer-steps.sql.mjs +76 -0
- package/dist/host/computer/job-computers.service.d.mts +20 -0
- package/dist/host/computer/job-computers.service.mjs +59 -0
- package/dist/host/computer/local-computer-files.layer.d.mts +11 -0
- package/dist/host/computer/local-computer-files.layer.mjs +69 -0
- package/dist/host/computer/local-computer-log.layer.d.mts +23 -0
- package/dist/host/computer/local-computer-log.layer.mjs +64 -0
- package/dist/host/computer/local-computer-records.layer.d.mts +190 -0
- package/dist/host/computer/local-computer-records.layer.mjs +99 -0
- package/dist/host/computer/local-computer.schema.d.mts +69 -0
- package/dist/host/computer/local-computer.schema.mjs +29 -0
- package/dist/host/computer/local-computers.adapter.d.mts +18 -0
- package/dist/host/computer/local-computers.adapter.mjs +248 -0
- package/dist/host/computer/local-step.layer.d.mts +30 -0
- package/dist/host/computer/local-step.layer.mjs +119 -0
- package/dist/host/file/actor-file-storage.sql.d.mts +15 -0
- package/dist/host/file/actor-file-storage.sql.mjs +82 -0
- package/dist/host/file/actor-files.sql.d.mts +9 -0
- package/dist/host/file/actor-files.sql.mjs +3 -0
- package/dist/host/file/blob-home-lock.pure.d.mts +8 -0
- package/dist/host/file/blob-home-lock.pure.mjs +10 -0
- package/dist/host/file/blob-home.sql.d.mts +19 -0
- package/dist/host/file/blob-home.sql.mjs +30 -0
- package/dist/host/file/local-blob-home.service.d.mts +16 -0
- package/dist/host/file/local-blob-home.service.mjs +43 -0
- package/dist/host/file/local-blob-owner.sql.d.mts +30 -0
- package/dist/host/file/local-blob-owner.sql.mjs +68 -0
- package/dist/host/file/local-file-upkeep.pure.d.mts +12 -0
- package/dist/host/file/local-file-upkeep.pure.mjs +41 -0
- package/dist/host/file/replay-file-storage.sql.d.mts +7 -0
- package/dist/host/file/replay-file-storage.sql.mjs +26 -0
- package/dist/host/fork/actor-fork.sql.d.mts +52 -0
- package/dist/host/fork/actor-fork.sql.mjs +42 -0
- package/dist/host/fork/fork-computers.adapter.d.mts +43 -0
- package/dist/host/fork/fork-computers.adapter.mjs +193 -0
- package/dist/host/hash/blob-hashing.service.d.mts +10 -0
- package/dist/host/hash/blob-hashing.service.mjs +4 -0
- package/dist/host/job/job-durables.sql.d.mts +44 -0
- package/dist/host/job/job-durables.sql.mjs +136 -0
- package/dist/host/job/job-engine.adapter.d.mts +33 -0
- package/dist/host/job/job-engine.adapter.mjs +258 -0
- package/dist/host/job/job-journal.sql.d.mts +85 -0
- package/dist/host/job/job-journal.sql.mjs +109 -0
- package/dist/host/job/job-results.service.d.mts +37 -0
- package/dist/host/job/job-results.service.mjs +63 -0
- package/dist/host/job/job-runs.pure.d.mts +103 -0
- package/dist/host/job/job-runs.pure.mjs +193 -0
- package/dist/host/job/undelivered-result.pure.d.mts +49 -0
- package/dist/host/job/undelivered-result.pure.mjs +147 -0
- package/dist/host/layout/actor-layout.sql.d.mts +8 -0
- package/dist/host/layout/actor-layout.sql.mjs +33 -0
- package/dist/host/layout/layout-version.errors.d.mts +10 -0
- package/dist/host/layout/layout-version.errors.mjs +8 -0
- package/dist/host/layout/layout-version.pure.d.mts +10 -0
- package/dist/host/layout/layout-version.pure.mjs +14 -0
- package/dist/host/migration/actor-migrations.service.d.mts +46 -0
- package/dist/host/migration/actor-migrations.service.mjs +143 -0
- package/dist/host/migration/migration-edited.errors.d.mts +9 -0
- package/dist/host/migration/migration-edited.errors.mjs +7 -0
- package/dist/host/migration/migration-failed.errors.d.mts +12 -0
- package/dist/host/migration/migration-failed.errors.mjs +10 -0
- package/dist/host/migration/migration-failure.pure.d.mts +9 -0
- package/dist/host/migration/migration-failure.pure.mjs +19 -0
- package/dist/host/migration/migration-hasher.adapter.d.mts +15 -0
- package/dist/host/migration/migration-hasher.adapter.mjs +40 -0
- package/dist/host/migration/migration-missing.errors.d.mts +9 -0
- package/dist/host/migration/migration-missing.errors.mjs +7 -0
- package/dist/host/migration/migration-plan.pure.d.mts +20 -0
- package/dist/host/migration/migration-plan.pure.mjs +32 -0
- package/dist/host/outbox/actor-outbox.sql.d.mts +33 -0
- package/dist/host/outbox/actor-outbox.sql.mjs +28 -0
- package/dist/host/outbox/outbox-acknowledgements.sql.d.mts +12 -0
- package/dist/host/outbox/outbox-acknowledgements.sql.mjs +47 -0
- package/dist/host/outbox/outbox-runner.service.d.mts +37 -0
- package/dist/host/outbox/outbox-runner.service.mjs +155 -0
- package/dist/host/query/query-policy.pure.d.mts +15 -0
- package/dist/host/query/query-policy.pure.mjs +12 -0
- package/dist/host/query/query-runner.service.d.mts +42 -0
- package/dist/host/query/query-runner.service.mjs +72 -0
- package/dist/host/sqlite/actor-connections.pure.d.mts +26 -0
- package/dist/host/sqlite/actor-connections.pure.mjs +4 -0
- package/dist/host/sqlite/sqlite-connection.adapter.d.mts +22 -0
- package/dist/host/sqlite/sqlite-connection.adapter.mjs +151 -0
- package/dist/host/sqlite/sqlite-driver.service.d.mts +33 -0
- package/dist/host/sqlite/sqlite-driver.service.mjs +88 -0
- package/dist/host/sqlite/sqlite-parameters.pure.d.mts +5 -0
- package/dist/host/sqlite/sqlite-parameters.pure.mjs +21 -0
- package/dist/host/sqlite/sqlite-reason.pure.d.mts +8 -0
- package/dist/host/sqlite/sqlite-reason.pure.mjs +13 -0
- package/dist/host/timer/actor-timers.sql.d.mts +32 -0
- package/dist/host/timer/actor-timers.sql.mjs +8 -0
- package/dist/host/timer/timer-runner.service.d.mts +26 -0
- package/dist/host/timer/timer-runner.service.mjs +68 -0
- package/dist/host/upkeep/actor-due.sql.d.mts +26 -0
- package/dist/host/upkeep/actor-due.sql.mjs +43 -0
- package/dist/host/upkeep/actor-upkeep.service.d.mts +55 -0
- package/dist/host/upkeep/actor-upkeep.service.mjs +218 -0
- package/dist/host/upkeep/execution-authority.pure.d.mts +19 -0
- package/dist/host/upkeep/execution-authority.pure.mjs +10 -0
- package/dist/runtime/akter-local.layer.d.mts +28 -0
- package/dist/runtime/akter-local.layer.mjs +24 -0
- package/dist/runtime/akter.layer.d.mts +91 -0
- package/dist/runtime/akter.layer.mjs +99 -0
- package/dist/runtime/blob-hashing.layer.d.mts +4 -0
- package/dist/runtime/blob-hashing.layer.mjs +15 -0
- package/dist/runtime/hosted-environment.layer.d.mts +34 -0
- package/dist/runtime/hosted-environment.layer.mjs +40 -0
- package/dist/runtime/http-server.layer.d.mts +9 -0
- package/dist/runtime/http-server.layer.mjs +15 -0
- package/dist/runtime/local-actor-engine.layer.d.mts +10 -0
- package/dist/runtime/local-actor-engine.layer.mjs +14 -0
- package/dist/runtime/local-engine.layer.d.mts +15 -0
- package/dist/runtime/local-engine.layer.mjs +14 -0
- package/dist/runtime/local-environments.layer.d.mts +24 -0
- package/dist/runtime/local-environments.layer.mjs +159 -0
- package/dist/runtime/local-file-clients.layer.d.mts +13 -0
- package/dist/runtime/local-file-clients.layer.mjs +78 -0
- package/dist/runtime/local-job-runtime.layer.d.mts +19 -0
- package/dist/runtime/local-job-runtime.layer.mjs +21 -0
- package/dist/serve/archive/archived-actors.layer.d.mts +17 -0
- package/dist/serve/archive/archived-actors.layer.mjs +84 -0
- package/dist/serve/archive/archived-store.layer.d.mts +12 -0
- package/dist/serve/archive/archived-store.layer.mjs +40 -0
- package/dist/serve/engine/actor-engine.layer.d.mts +8 -0
- package/dist/serve/engine/actor-engine.layer.mjs +30 -0
- package/dist/serve/engine/actor-fork.service.d.mts +63 -0
- package/dist/serve/engine/actor-fork.service.mjs +277 -0
- package/dist/serve/engine/actor-holding.pure.d.mts +7 -0
- package/dist/serve/engine/actor-holding.pure.mjs +9 -0
- package/dist/serve/engine/actor-host.service.d.mts +66 -0
- package/dist/serve/engine/actor-host.service.mjs +209 -0
- package/dist/serve/engine/actor-location.service.d.mts +38 -0
- package/dist/serve/engine/actor-location.service.mjs +109 -0
- package/dist/serve/engine/actor-residents.pure.d.mts +92 -0
- package/dist/serve/engine/actor-residents.pure.mjs +201 -0
- package/dist/serve/engine/actor-shard.pure.d.mts +4 -0
- package/dist/serve/engine/actor-shard.pure.mjs +8 -0
- package/dist/serve/engine/actor-state.pure.d.mts +17 -0
- package/dist/serve/engine/actor-state.pure.mjs +20 -0
- package/dist/serve/engine/actors-not-hosted.errors.d.mts +9 -0
- package/dist/serve/engine/actors-not-hosted.errors.mjs +7 -0
- package/dist/serve/engine/job-runtime.layer.d.mts +6 -0
- package/dist/serve/engine/job-runtime.layer.mjs +5 -0
- package/dist/serve/environment/environment-already-exists.errors.d.mts +10 -0
- package/dist/serve/environment/environment-already-exists.errors.mjs +9 -0
- package/dist/serve/environment/environment-in-use.errors.d.mts +10 -0
- package/dist/serve/environment/environment-in-use.errors.mjs +14 -0
- package/dist/serve/environment/environment-not-found.errors.d.mts +10 -0
- package/dist/serve/environment/environment-not-found.errors.mjs +9 -0
- package/dist/serve/environment/environment-records.sql.d.mts +92 -0
- package/dist/serve/environment/environment-records.sql.mjs +59 -0
- package/dist/serve/environment/environment-store.sql.d.mts +38 -0
- package/dist/serve/environment/environment-store.sql.mjs +78 -0
- package/dist/serve/environment/local-environment.schema.d.mts +38 -0
- package/dist/serve/environment/local-environment.schema.mjs +43 -0
- package/dist/serve/environment/local-environments.service.d.mts +44 -0
- package/dist/serve/environment/local-environments.service.mjs +196 -0
- package/dist/serve/environment/promotion-notice.pure.d.mts +22 -0
- package/dist/serve/environment/promotion-notice.pure.mjs +30 -0
- package/dist/serve/environment/snapshot-operations.sql.d.mts +32 -0
- package/dist/serve/environment/snapshot-operations.sql.mjs +131 -0
- package/dist/serve/environment/store-snapshot.sql.d.mts +32 -0
- package/dist/serve/environment/store-snapshot.sql.mjs +74 -0
- package/dist/serve/erasure/local-actor-erasure.service.d.mts +26 -0
- package/dist/serve/erasure/local-actor-erasure.service.mjs +102 -0
- package/dist/serve/history/actor-host-runners.service.d.mts +23 -0
- package/dist/serve/history/actor-host-runners.service.mjs +35 -0
- package/dist/serve/hosted/hosted-app-build.errors.d.mts +13 -0
- package/dist/serve/hosted/hosted-app-build.errors.mjs +9 -0
- package/dist/serve/hosted/hosted-app-checks.layer.d.mts +15 -0
- package/dist/serve/hosted/hosted-app-checks.layer.mjs +32 -0
- package/dist/serve/hosted/hosted-file-forward.layer.d.mts +22 -0
- package/dist/serve/hosted/hosted-file-forward.layer.mjs +42 -0
- package/dist/serve/hosted/hosted-file-rpcs.layer.d.mts +25 -0
- package/dist/serve/hosted/hosted-file-rpcs.layer.mjs +82 -0
- package/dist/serve/hosted/hosted-file-server.layer.d.mts +18 -0
- package/dist/serve/hosted/hosted-file-server.layer.mjs +33 -0
- package/dist/serve/hosted/hosted-files.layer.d.mts +32 -0
- package/dist/serve/hosted/hosted-files.layer.mjs +55 -0
- package/dist/serve/hosted/hosted-runtime.layer.d.mts +42 -0
- package/dist/serve/hosted/hosted-runtime.layer.mjs +48 -0
- package/dist/serve/hosted/hosted-runtime.service.d.mts +77 -0
- package/dist/serve/hosted/hosted-runtime.service.mjs +74 -0
- package/dist/serve/hosted/hosted-secrets.layer.d.mts +10 -0
- package/dist/serve/hosted/hosted-secrets.layer.mjs +28 -0
- package/dist/serve/http/loopback-host.pure.d.mts +11 -0
- package/dist/serve/http/loopback-host.pure.mjs +29 -0
- package/dist/serve/inspect/actor-inspection.schema.d.mts +119 -0
- package/dist/serve/inspect/actor-inspection.schema.mjs +75 -0
- package/dist/serve/inspect/actor-inspection.sql.d.mts +12 -0
- package/dist/serve/inspect/actor-inspection.sql.mjs +43 -0
- package/dist/serve/inspect/inspect.service.d.mts +24 -0
- package/dist/serve/inspect/inspect.service.mjs +92 -0
- package/dist/serve/inspect/inspector-page.pure.d.mts +2 -0
- package/dist/serve/inspect/inspector-page.pure.mjs +155 -0
- package/dist/serve/inspect/inspector-wal.pure.d.mts +3 -0
- package/dist/serve/inspect/inspector-wal.pure.mjs +19 -0
- package/dist/serve/inspect/inspector.handlers.d.mts +5 -0
- package/dist/serve/inspect/inspector.handlers.mjs +50 -0
- package/dist/serve/inspect/inspector.layer.d.mts +9 -0
- package/dist/serve/inspect/inspector.layer.mjs +14 -0
- package/dist/serve/live/live-reads.service.d.mts +44 -0
- package/dist/serve/live/live-reads.service.mjs +152 -0
- package/dist/serve/live/live-tables.sql.d.mts +35 -0
- package/dist/serve/live/live-tables.sql.mjs +66 -0
- package/dist/serve/live/state-reads.pure.d.mts +11 -0
- package/dist/serve/live/state-reads.pure.mjs +7 -0
- package/dist/serve/rpc/actor-rpc.handlers.d.mts +24 -0
- package/dist/serve/rpc/actor-rpc.handlers.mjs +142 -0
- package/dist/serve/rpc/akter-server.layer.d.mts +18 -0
- package/dist/serve/rpc/akter-server.layer.mjs +61 -0
- package/dist/serve/rpc/computer/computer-copy.layer.d.mts +22 -0
- package/dist/serve/rpc/computer/computer-copy.layer.mjs +70 -0
- package/dist/serve/rpc/computer/computer-rpc-access.pure.d.mts +29 -0
- package/dist/serve/rpc/computer/computer-rpc-access.pure.mjs +46 -0
- package/dist/serve/rpc/computer/computer-rpc.layer.d.mts +39 -0
- package/dist/serve/rpc/computer/computer-rpc.layer.mjs +84 -0
- package/dist/serve/rpc/computer/step-rpc.handlers.d.mts +23 -0
- package/dist/serve/rpc/computer/step-rpc.handlers.mjs +43 -0
- package/dist/serve/rpc/development-authentication.handlers.d.mts +7 -0
- package/dist/serve/rpc/development-authentication.handlers.mjs +19 -0
- package/dist/serve/rpc/development-guard.pure.d.mts +10 -0
- package/dist/serve/rpc/development-guard.pure.mjs +16 -0
- package/dist/serve/rpc/file/file-rpc-access.pure.d.mts +55 -0
- package/dist/serve/rpc/file/file-rpc-access.pure.mjs +67 -0
- package/dist/serve/rpc/file/file-rpc.layer.d.mts +53 -0
- package/dist/serve/rpc/file/file-rpc.layer.mjs +143 -0
- package/dist/serve/rpc/file/upload-sessions.pure.d.mts +45 -0
- package/dist/serve/rpc/file/upload-sessions.pure.mjs +187 -0
- package/dist/serve/rpc/in-process-client.layer.d.mts +13 -0
- package/dist/serve/rpc/in-process-client.layer.mjs +34 -0
- package/dist/serve/rpc/listener-not-loopback.errors.d.mts +9 -0
- package/dist/serve/rpc/listener-not-loopback.errors.mjs +7 -0
- package/dist/serve/rpc/ndjson-only.pure.d.mts +5 -0
- package/dist/serve/rpc/ndjson-only.pure.mjs +14 -0
- package/dist/serve/rpc/served-rpc.layer.d.mts +6 -0
- package/dist/serve/rpc/served-rpc.layer.mjs +19 -0
- package/dist/serve/store/actor-not-migrated.errors.d.mts +10 -0
- package/dist/serve/store/actor-not-migrated.errors.mjs +8 -0
- package/dist/serve/store/store-migrations.layer.d.mts +5 -0
- package/dist/serve/store/store-migrations.layer.mjs +18 -0
- package/dist/serve/store/store-migrations.service.d.mts +26 -0
- package/dist/serve/store/store-migrations.service.mjs +47 -0
- package/dist/serve/store/store-unreadable.errors.d.mts +9 -0
- package/dist/serve/store/store-unreadable.errors.mjs +7 -0
- package/dist/serve/verify/verify.layer.d.mts +16 -0
- package/dist/serve/verify/verify.layer.mjs +36 -0
- package/dist/testing/story-driver.service.d.mts +29 -0
- package/dist/testing/story-driver.service.mjs +126 -0
- package/dist/testing/story.layer.d.mts +21 -0
- package/dist/testing/story.layer.mjs +42 -0
- package/package.json +106 -3
- package/src/contract/actor/actor-already-exists.errors.ts +8 -0
- package/src/contract/actor/actor-definition.pure.ts +157 -0
- package/src/contract/actor/actor-erased.errors.ts +8 -0
- package/src/contract/actor/actor-names.pure.ts +64 -0
- package/src/contract/actor/actor-not-created.errors.ts +8 -0
- package/src/contract/actor/actor-not-registered.errors.ts +8 -0
- package/src/contract/actor/actor-registry.service.ts +35 -0
- package/src/contract/actor/actor.contract.ts +409 -0
- package/src/contract/actor/host-interface.pure.ts +60 -0
- package/src/contract/actor/reserved-member.errors.ts +9 -0
- package/src/contract/akter.service.ts +233 -0
- package/src/contract/caller/authentication.api.ts +9 -0
- package/src/contract/caller/caller-admission.pure.ts +90 -0
- package/src/contract/caller/caller-not-allowed.errors.ts +26 -0
- package/src/contract/caller/caller.schema.ts +7 -0
- package/src/contract/caller/current-caller.service.ts +7 -0
- package/src/contract/caller/principal.schema.ts +13 -0
- package/src/contract/caller/unauthenticated.errors.ts +8 -0
- package/src/contract/client/actor-client.adapter.ts +217 -0
- package/src/contract/client/actor-client.contract.ts +53 -0
- package/src/contract/client/actor-rpc.contract.ts +91 -0
- package/src/contract/client/actor-unavailable.errors.ts +9 -0
- package/src/contract/client/client-failure.contract.ts +53 -0
- package/src/contract/client/invalid-request.errors.ts +9 -0
- package/src/contract/client/storage-limit.errors.ts +16 -0
- package/src/contract/command/command-id-expired.errors.ts +11 -0
- package/src/contract/command/command-id.schema.ts +5 -0
- package/src/contract/command/command.contract.ts +334 -0
- package/src/contract/command/outbox-id.pure.ts +25 -0
- package/src/contract/command/outbox.schema.ts +11 -0
- package/src/contract/command/timer.schema.ts +21 -0
- package/src/contract/computer/checkpoint-expired.errors.ts +12 -0
- package/src/contract/computer/computer-client-failure.contract.ts +27 -0
- package/src/contract/computer/computer-client.adapter.ts +110 -0
- package/src/contract/computer/computer-client.contract.ts +75 -0
- package/src/contract/computer/computer-held.errors.ts +10 -0
- package/src/contract/computer/computer-limit.errors.ts +11 -0
- package/src/contract/computer/computer-lost.errors.ts +10 -0
- package/src/contract/computer/computer-not-found.errors.ts +9 -0
- package/src/contract/computer/computer.schema.ts +159 -0
- package/src/contract/computer/computers-unavailable.errors.ts +9 -0
- package/src/contract/computer/files/computer-files.schema.ts +31 -0
- package/src/contract/computer/rpc/computer-rpc.contract.ts +140 -0
- package/src/contract/computer/step/computer-step.contract.ts +126 -0
- package/src/contract/computer/step/computer-step.schema.ts +80 -0
- package/src/contract/computer/step/step-failure.schema.ts +26 -0
- package/src/contract/computer/step/step-not-found.errors.ts +7 -0
- package/src/contract/description/published-contract.pure.ts +187 -0
- package/src/contract/file/access/file-access-denied.errors.ts +11 -0
- package/src/contract/file/access/file-access.contract.ts +56 -0
- package/src/contract/file/actor-files.contract.ts +78 -0
- package/src/contract/file/blob-transfer.errors.ts +6 -0
- package/src/contract/file/file-client-failure.contract.ts +43 -0
- package/src/contract/file/file-client.adapter.ts +45 -0
- package/src/contract/file/file-client.contract.ts +24 -0
- package/src/contract/file/file-listing.pure.ts +30 -0
- package/src/contract/file/file-not-found.errors.ts +6 -0
- package/src/contract/file/file-path.pure.ts +37 -0
- package/src/contract/file/files-unavailable.errors.ts +8 -0
- package/src/contract/file/invalid-file-request.errors.ts +9 -0
- package/src/contract/file/rpc/file-rpc.contract.ts +148 -0
- package/src/contract/file/rpc/file-too-large.errors.ts +10 -0
- package/src/contract/file/rpc/rpc-file-clients.layer.ts +184 -0
- package/src/contract/fork/fork-rpc.contract.ts +44 -0
- package/src/contract/history/actor-journal.service.ts +195 -0
- package/src/contract/history/history-entry.pure.ts +282 -0
- package/src/contract/hosted/handler-failed.errors.ts +16 -0
- package/src/contract/hosted/handler-failure.pure.ts +161 -0
- package/src/contract/hosted/hosted-actor.service.ts +97 -0
- package/src/contract/hosted/hosted-command.service.ts +114 -0
- package/src/contract/hosted/hosted-create.service.ts +95 -0
- package/src/contract/hosted/hosted-error.contract.ts +22 -0
- package/src/contract/hosted/hosted-failure.schema.ts +32 -0
- package/src/contract/hosted/hosted-outcome.contract.ts +21 -0
- package/src/contract/hosted/hosted-query.service.ts +50 -0
- package/src/contract/hosted/hosted-request.pure.ts +185 -0
- package/src/contract/job/job-id.pure.ts +37 -0
- package/src/contract/job/job-patches.contract.ts +86 -0
- package/src/contract/job/job-signal.schema.ts +23 -0
- package/src/contract/job/reserved-payload-field.errors.ts +10 -0
- package/src/contract/job/started-job.schema.ts +9 -0
- package/src/contract/json-codec.pure.ts +27 -0
- package/src/contract/room.contract.ts +31 -0
- package/src/contract/secret/actor-secrets.adapter.ts +87 -0
- package/src/contract/secret/invalid-secret-name.errors.ts +10 -0
- package/src/contract/secret/secret-unavailable.errors.ts +13 -0
- package/src/contract/secret/secret.schema.ts +43 -0
- package/src/contract/spend/billing-unavailable.errors.ts +12 -0
- package/src/contract/spend/spend-cap-reached.errors.ts +17 -0
- package/src/contract/state/actor-state.pure.ts +192 -0
- package/src/contract/state/actor-state.service.ts +69 -0
- package/src/contract/state/state-migration.pure.ts +57 -0
- package/src/contract/state/state-read.pure.ts +40 -0
- package/src/contract/state/state-unreadable.errors.ts +9 -0
- package/src/host/actor/actor-database.service.ts +145 -0
- package/src/host/actor/actor-exclusive.pure.ts +32 -0
- package/src/host/actor/actor-records.sql.ts +78 -0
- package/src/host/actor/reserved-name.errors.ts +10 -0
- package/src/host/actor/reserved-names.pure.ts +40 -0
- package/src/host/actor/room.actor.ts +57 -0
- package/src/host/blob/blob-frames.pure.ts +52 -0
- package/src/host/blob/blob-grant.schema.ts +22 -0
- package/src/host/blob/blob-grants.service.ts +197 -0
- package/src/host/blob/blob-keyring.service.ts +25 -0
- package/src/host/blob/blob-range.pure.ts +33 -0
- package/src/host/blob/blob-sealing.contract.ts +46 -0
- package/src/host/blob/blob-sealing.service.ts +25 -0
- package/src/host/blob/export/blob-archive.sql.ts +153 -0
- package/src/host/blob/export/blob-export-holds.sql.ts +91 -0
- package/src/host/blob/plain-blob-sealing.pure.ts +70 -0
- package/src/host/blob/reference/blob-catalog.sql.ts +339 -0
- package/src/host/blob/reference/blob-coordinator.pure.ts +217 -0
- package/src/host/blob/reference/blob-file-page.sql.ts +48 -0
- package/src/host/blob/reference/blob-forks.sql.ts +125 -0
- package/src/host/blob/reference/blob-lineage.sql.ts +63 -0
- package/src/host/blob/reference/blob-reads.pure.ts +172 -0
- package/src/host/blob/reference/blob-receipts.sql.ts +375 -0
- package/src/host/blob/reference/blob-transfer-adopt.pure.ts +127 -0
- package/src/host/blob/reference/blob-transfer-fork.pure.ts +174 -0
- package/src/host/blob/reference/blob-transfer-upkeep.pure.ts +132 -0
- package/src/host/blob/reference/blob-transfer.pure.ts +127 -0
- package/src/host/blob/sealed-blob-sealing.pure.ts +163 -0
- package/src/host/blob/stream/blob-directory.pure.ts +177 -0
- package/src/host/blob/stream/blob-length.pure.ts +40 -0
- package/src/host/blob/stream/blob-writing.pure.ts +49 -0
- package/src/host/command/batch/command-batch.sql.ts +207 -0
- package/src/host/command/command-context.adapter.ts +134 -0
- package/src/host/command/command-id-age.pure.ts +54 -0
- package/src/host/command/command-id-reuse.pure.ts +90 -0
- package/src/host/command/command-id-reused.errors.ts +13 -0
- package/src/host/command/command-journal.sql.ts +232 -0
- package/src/host/command/command-rejected.errors.ts +8 -0
- package/src/host/command/command-replay.service.ts +223 -0
- package/src/host/command/command-reply.pure.ts +21 -0
- package/src/host/command/command-runner.service.ts +320 -0
- package/src/host/command/files/command-file-inputs.sql.ts +114 -0
- package/src/host/command/history-pruned.errors.ts +10 -0
- package/src/host/command/replay/replay-cursor-stalled.errors.ts +9 -0
- package/src/host/command/replay/replay-cursor.pure.ts +19 -0
- package/src/host/computer/computer-steps.sql.ts +120 -0
- package/src/host/computer/job-computers.service.ts +84 -0
- package/src/host/computer/local-computer-files.layer.ts +103 -0
- package/src/host/computer/local-computer-log.layer.ts +115 -0
- package/src/host/computer/local-computer-records.layer.ts +205 -0
- package/src/host/computer/local-computer.schema.ts +36 -0
- package/src/host/computer/local-computers.adapter.ts +379 -0
- package/src/host/computer/local-step.layer.ts +174 -0
- package/src/host/file/actor-file-storage.sql.ts +79 -0
- package/src/host/file/actor-files.sql.ts +15 -0
- package/src/host/file/blob-home-lock.pure.ts +23 -0
- package/src/host/file/blob-home.sql.ts +55 -0
- package/src/host/file/local-blob-home.service.ts +71 -0
- package/src/host/file/local-blob-owner.sql.ts +89 -0
- package/src/host/file/local-file-upkeep.pure.ts +77 -0
- package/src/host/file/replay-file-storage.sql.ts +43 -0
- package/src/host/fork/actor-fork.sql.ts +110 -0
- package/src/host/fork/fork-computers.adapter.ts +366 -0
- package/src/host/hash/blob-hashing.service.ts +14 -0
- package/src/host/job/job-durables.sql.ts +214 -0
- package/src/host/job/job-engine.adapter.ts +420 -0
- package/src/host/job/job-journal.sql.ts +257 -0
- package/src/host/job/job-results.service.ts +111 -0
- package/src/host/job/job-runs.pure.ts +445 -0
- package/src/host/job/undelivered-result.pure.ts +265 -0
- package/src/host/layout/actor-layout.sql.ts +45 -0
- package/src/host/layout/layout-version.errors.ts +10 -0
- package/src/host/layout/layout-version.pure.ts +22 -0
- package/src/host/migration/actor-migrations.service.ts +159 -0
- package/src/host/migration/migration-edited.errors.ts +9 -0
- package/src/host/migration/migration-failed.errors.ts +12 -0
- package/src/host/migration/migration-failure.pure.ts +28 -0
- package/src/host/migration/migration-hasher.adapter.ts +70 -0
- package/src/host/migration/migration-missing.errors.ts +9 -0
- package/src/host/migration/migration-plan.pure.ts +66 -0
- package/src/host/outbox/actor-outbox.sql.ts +98 -0
- package/src/host/outbox/outbox-acknowledgements.sql.ts +93 -0
- package/src/host/outbox/outbox-runner.service.ts +253 -0
- package/src/host/query/query-policy.pure.ts +31 -0
- package/src/host/query/query-runner.service.ts +132 -0
- package/src/host/sqlite/actor-connections.pure.ts +44 -0
- package/src/host/sqlite/sqlite-connection.adapter.ts +260 -0
- package/src/host/sqlite/sqlite-driver.service.ts +151 -0
- package/src/host/sqlite/sqlite-parameters.pure.ts +28 -0
- package/src/host/sqlite/sqlite-reason.pure.ts +19 -0
- package/src/host/timer/actor-timers.sql.ts +67 -0
- package/src/host/timer/timer-runner.service.ts +117 -0
- package/src/host/upkeep/actor-due.sql.ts +71 -0
- package/src/host/upkeep/actor-upkeep.service.ts +404 -0
- package/src/host/upkeep/execution-authority.pure.ts +37 -0
- package/src/runtime/akter-local.layer.ts +49 -0
- package/src/runtime/akter.layer.ts +208 -0
- package/src/runtime/blob-hashing.layer.ts +21 -0
- package/src/runtime/hosted-environment.layer.ts +85 -0
- package/src/runtime/http-server.layer.ts +29 -0
- package/src/runtime/local-actor-engine.layer.ts +33 -0
- package/src/runtime/local-engine.layer.ts +37 -0
- package/src/runtime/local-environments.layer.ts +214 -0
- package/src/runtime/local-file-clients.layer.ts +112 -0
- package/src/runtime/local-job-runtime.layer.ts +38 -0
- package/src/serve/archive/archived-actors.layer.ts +97 -0
- package/src/serve/archive/archived-store.layer.ts +46 -0
- package/src/serve/engine/actor-engine.layer.ts +46 -0
- package/src/serve/engine/actor-fork.service.ts +403 -0
- package/src/serve/engine/actor-holding.pure.ts +28 -0
- package/src/serve/engine/actor-host.service.ts +454 -0
- package/src/serve/engine/actor-location.service.ts +219 -0
- package/src/serve/engine/actor-residents.pure.ts +500 -0
- package/src/serve/engine/actor-shard.pure.ts +13 -0
- package/src/serve/engine/actor-state.pure.ts +45 -0
- package/src/serve/engine/actors-not-hosted.errors.ts +9 -0
- package/src/serve/engine/job-runtime.layer.ts +13 -0
- package/src/serve/environment/environment-already-exists.errors.ts +9 -0
- package/src/serve/environment/environment-in-use.errors.ts +17 -0
- package/src/serve/environment/environment-not-found.errors.ts +9 -0
- package/src/serve/environment/environment-records.sql.ts +208 -0
- package/src/serve/environment/environment-store.sql.ts +116 -0
- package/src/serve/environment/local-environment.schema.ts +79 -0
- package/src/serve/environment/local-environments.service.ts +268 -0
- package/src/serve/environment/promotion-notice.pure.ts +63 -0
- package/src/serve/environment/snapshot-operations.sql.ts +210 -0
- package/src/serve/environment/store-snapshot.sql.ts +128 -0
- package/src/serve/erasure/local-actor-erasure.service.ts +170 -0
- package/src/serve/history/actor-host-runners.service.ts +85 -0
- package/src/serve/hosted/hosted-app-build.errors.ts +11 -0
- package/src/serve/hosted/hosted-app-checks.layer.ts +74 -0
- package/src/serve/hosted/hosted-file-forward.layer.ts +63 -0
- package/src/serve/hosted/hosted-file-rpcs.layer.ts +149 -0
- package/src/serve/hosted/hosted-file-server.layer.ts +75 -0
- package/src/serve/hosted/hosted-files.layer.ts +76 -0
- package/src/serve/hosted/hosted-runtime.layer.ts +145 -0
- package/src/serve/hosted/hosted-runtime.service.ts +128 -0
- package/src/serve/hosted/hosted-secrets.layer.ts +38 -0
- package/src/serve/http/loopback-host.pure.ts +67 -0
- package/src/serve/inspect/actor-inspection.schema.ts +94 -0
- package/src/serve/inspect/actor-inspection.sql.ts +112 -0
- package/src/serve/inspect/inspect.service.ts +173 -0
- package/src/serve/inspect/inspector-page.pure.ts +159 -0
- package/src/serve/inspect/inspector-wal.pure.ts +40 -0
- package/src/serve/inspect/inspector.handlers.ts +103 -0
- package/src/serve/inspect/inspector.layer.ts +26 -0
- package/src/serve/live/live-reads.service.ts +285 -0
- package/src/serve/live/live-tables.sql.ts +148 -0
- package/src/serve/live/state-reads.pure.ts +22 -0
- package/src/serve/rpc/actor-rpc.handlers.ts +242 -0
- package/src/serve/rpc/akter-server.layer.ts +119 -0
- package/src/serve/rpc/computer/computer-copy.layer.ts +95 -0
- package/src/serve/rpc/computer/computer-rpc-access.pure.ts +75 -0
- package/src/serve/rpc/computer/computer-rpc.layer.ts +143 -0
- package/src/serve/rpc/computer/step-rpc.handlers.ts +84 -0
- package/src/serve/rpc/development-authentication.handlers.ts +28 -0
- package/src/serve/rpc/development-guard.pure.ts +39 -0
- package/src/serve/rpc/file/file-rpc-access.pure.ts +119 -0
- package/src/serve/rpc/file/file-rpc.layer.ts +209 -0
- package/src/serve/rpc/file/upload-sessions.pure.ts +363 -0
- package/src/serve/rpc/in-process-client.layer.ts +62 -0
- package/src/serve/rpc/listener-not-loopback.errors.ts +9 -0
- package/src/serve/rpc/ndjson-only.pure.ts +33 -0
- package/src/serve/rpc/served-rpc.layer.ts +34 -0
- package/src/serve/store/actor-not-migrated.errors.ts +10 -0
- package/src/serve/store/store-migrations.layer.ts +35 -0
- package/src/serve/store/store-migrations.service.ts +76 -0
- package/src/serve/store/store-unreadable.errors.ts +9 -0
- package/src/serve/verify/verify.layer.ts +77 -0
- package/src/testing/story-driver.service.ts +266 -0
- 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 };
|