@akterjs/effect 0.0.0-stage → 0.1.0
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,78 @@
|
|
|
1
|
+
import { Akter } from "../contract/akter.service.mjs";
|
|
2
|
+
import { ActorFileClients } from "../contract/file/file-client.adapter.mjs";
|
|
3
|
+
import { BlobTransferError } from "../contract/file/blob-transfer.errors.mjs";
|
|
4
|
+
import { FileNotFoundError } from "../contract/file/file-not-found.errors.mjs";
|
|
5
|
+
import { filePathOf } from "../contract/file/file-path.pure.mjs";
|
|
6
|
+
import { fileListingOf } from "../contract/file/file-listing.pure.mjs";
|
|
7
|
+
import { filePage } from "../host/blob/reference/blob-file-page.sql.mjs";
|
|
8
|
+
import { ActorHost } from "../serve/engine/actor-host.service.mjs";
|
|
9
|
+
import { Array, Effect, Layer, Option, Stream } from "effect";
|
|
10
|
+
// src/runtime/local-file-clients.layer.ts
|
|
11
|
+
const noBytes = 0n;
|
|
12
|
+
const outsideActor = Effect.flatMap(Effect.serviceOption(Akter), (actor) => {
|
|
13
|
+
if (Option.isSome(actor)) return Effect.fail(BlobTransferError.make({
|
|
14
|
+
blob: "",
|
|
15
|
+
message: "use the file client outside actor commands and queries, and Akter.files inside them"
|
|
16
|
+
}));
|
|
17
|
+
return Effect.void;
|
|
18
|
+
});
|
|
19
|
+
const uploadWith = ({ address, host }) => Effect.fnUntraced(function* upload(source) {
|
|
20
|
+
yield* outsideActor;
|
|
21
|
+
const { home, kick, owner } = yield* host.prepareFiles(address);
|
|
22
|
+
return yield* Effect.tap(home.transfers.upload({
|
|
23
|
+
owner,
|
|
24
|
+
source
|
|
25
|
+
}), () => kick);
|
|
26
|
+
}, Effect.scoped);
|
|
27
|
+
const downloadWith = ({ address, host }, path, range) => Stream.unwrap(Effect.gen(function* download() {
|
|
28
|
+
yield* outsideActor;
|
|
29
|
+
const valid = yield* filePathOf(path);
|
|
30
|
+
const found = yield* host.currentFiles(address);
|
|
31
|
+
if (Option.isNone(found)) return yield* FileNotFoundError.make({ path: valid });
|
|
32
|
+
const { home, owner } = found.value;
|
|
33
|
+
const link = yield* owner.exclusive(owner.transaction(owner.receipts.link(valid)));
|
|
34
|
+
const file = yield* Effect.mapError(Effect.fromOption(link), () => FileNotFoundError.make({ path: valid }));
|
|
35
|
+
const opening = {
|
|
36
|
+
actor: owner.actor,
|
|
37
|
+
blob: file.blob,
|
|
38
|
+
grant: file.grant
|
|
39
|
+
};
|
|
40
|
+
return Option.match(Option.fromNullishOr(range), {
|
|
41
|
+
onNone: () => home.transfers.open(opening),
|
|
42
|
+
onSome: (requested) => home.transfers.open({
|
|
43
|
+
...opening,
|
|
44
|
+
range: requested
|
|
45
|
+
})
|
|
46
|
+
});
|
|
47
|
+
}));
|
|
48
|
+
const pageWith = ({ address, host }, listing) => Effect.gen(function* list() {
|
|
49
|
+
yield* outsideActor;
|
|
50
|
+
const valid = yield* fileListingOf(listing);
|
|
51
|
+
const found = yield* host.currentFiles(address);
|
|
52
|
+
if (Option.isNone(found)) return {
|
|
53
|
+
cursor: Option.none(),
|
|
54
|
+
entries: []
|
|
55
|
+
};
|
|
56
|
+
const { owner, sql } = found.value;
|
|
57
|
+
return yield* owner.exclusive(owner.transaction(filePage({
|
|
58
|
+
actor: owner.actor,
|
|
59
|
+
listing: valid,
|
|
60
|
+
sql
|
|
61
|
+
})));
|
|
62
|
+
}).pipe(Effect.scoped);
|
|
63
|
+
const clientWith = (binding) => ({
|
|
64
|
+
download: (path, range) => downloadWith(binding, path, range),
|
|
65
|
+
fileUsage: (listing = {}) => Effect.map(pageWith(binding, listing), (page) => ({
|
|
66
|
+
...page,
|
|
67
|
+
bytes: Array.reduce(page.entries, noBytes, (total, file) => total + BigInt(file.bytes))
|
|
68
|
+
})),
|
|
69
|
+
list: (listing = {}) => pageWith(binding, listing),
|
|
70
|
+
upload: uploadWith(binding)
|
|
71
|
+
});
|
|
72
|
+
/** The file client of one actor on this host, outside its commands and queries. */
|
|
73
|
+
const hostFileClient = clientWith;
|
|
74
|
+
const localFileClients = Layer.effect(ActorFileClients, Effect.map(ActorHost, (host) => ({ connect: (address) => clientWith({
|
|
75
|
+
address,
|
|
76
|
+
host
|
|
77
|
+
}) })));
|
|
78
|
+
export { hostFileClient, localFileClients };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ActorSecrets } from "../contract/secret/actor-secrets.adapter.mjs";
|
|
2
|
+
import { JobComputers } from "../host/computer/job-computers.service.mjs";
|
|
3
|
+
import { JobEngine } from "../host/job/job-engine.adapter.mjs";
|
|
4
|
+
import { Effect, FileSystem, Layer, Path } from "effect";
|
|
5
|
+
import { ChildProcessSpawner } from "effect/process";
|
|
6
|
+
/** What the local engine's computers run on: the disk and a process spawner. */
|
|
7
|
+
type ComputerNeeds = ChildProcessSpawner.ChildProcessSpawner | FileSystem.FileSystem | Path.Path;
|
|
8
|
+
/** What binding the computers needs: the computers to bind, and what they run on. */
|
|
9
|
+
type BinderNeeds = ComputerNeeds | JobComputers;
|
|
10
|
+
/**
|
|
11
|
+
* The local engine's job runtime, for an app layer whose job handlers need the `WorkflowEngine`. Its job activities
|
|
12
|
+
* read their declared secrets from the current `ConfigProvider`: the process environment, as Bun loads it with `.env`.
|
|
13
|
+
* With `AKTER_LOCAL_COMPUTERS` on, they reach the computers of the store `Akter.local` serves through
|
|
14
|
+
* `Actor.computer(key)`, because both hold the same `JobComputers`, as they hold the same job engine.
|
|
15
|
+
*/
|
|
16
|
+
declare const jobs: Layer.Layer<ActorSecrets | JobComputers | JobEngine | import("effect/workflow/WorkflowEngine").WorkflowEngine, never, never>;
|
|
17
|
+
/** Binds the app's job computers to local computers under each store the engine serves: its `computers` directory. */
|
|
18
|
+
declare const computersBinder: () => Effect.Effect<(store: string) => Effect.Effect<void>, never, JobComputers | ComputerNeeds>;
|
|
19
|
+
export { type BinderNeeds, type ComputerNeeds, computersBinder, jobs };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ActorSecrets } from "../contract/secret/actor-secrets.adapter.mjs";
|
|
2
|
+
import { JobComputers } from "../host/computer/job-computers.service.mjs";
|
|
3
|
+
import { LocalComputers } from "../host/computer/local-computers.adapter.mjs";
|
|
4
|
+
import { JobEngine } from "../host/job/job-engine.adapter.mjs";
|
|
5
|
+
import { Effect, Layer, Path } from "effect";
|
|
6
|
+
// src/runtime/local-job-runtime.layer.ts
|
|
7
|
+
/**
|
|
8
|
+
* The local engine's job runtime, for an app layer whose job handlers need the `WorkflowEngine`. Its job activities
|
|
9
|
+
* read their declared secrets from the current `ConfigProvider`: the process environment, as Bun loads it with `.env`.
|
|
10
|
+
* With `AKTER_LOCAL_COMPUTERS` on, they reach the computers of the store `Akter.local` serves through
|
|
11
|
+
* `Actor.computer(key)`, because both hold the same `JobComputers`, as they hold the same job engine.
|
|
12
|
+
*/
|
|
13
|
+
const jobs = Layer.mergeAll(JobEngine.layerWorkflow, ActorSecrets.fromConfig, JobComputers.layer);
|
|
14
|
+
/** Binds the app's job computers to local computers under each store the engine serves: its `computers` directory. */
|
|
15
|
+
const computersBinder = Effect.fnUntraced(function* computersBinder() {
|
|
16
|
+
const computers = yield* JobComputers;
|
|
17
|
+
const services = yield* Effect.context();
|
|
18
|
+
const path = yield* Path.Path;
|
|
19
|
+
return (store) => Effect.flatMap(LocalComputers.make(path.join(store, "computers")), computers.bind).pipe(Effect.provideContext(services));
|
|
20
|
+
});
|
|
21
|
+
export { computersBinder, jobs };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BlobTransferError } from "../../contract/file/blob-transfer.errors.mjs";
|
|
2
|
+
import "../hosted/hosted-runtime.layer.mjs";
|
|
3
|
+
import { StoreUnreadableError } from "../store/store-unreadable.errors.mjs";
|
|
4
|
+
import { Effect, FileSystem, Path } from "effect";
|
|
5
|
+
export declare const ArchivedActors: {
|
|
6
|
+
readonly adopt: (folder: string) => Effect.Effect<void, BlobTransferError | import("effect/PlatformError").PlatformError | import("effect/sql/SqlError").SqlError | StoreUnreadableError, FileSystem.FileSystem | Path.Path>;
|
|
7
|
+
readonly lineage: (folder: string) => Effect.Effect<{
|
|
8
|
+
actor: {
|
|
9
|
+
key: string;
|
|
10
|
+
type: string;
|
|
11
|
+
};
|
|
12
|
+
fork: string;
|
|
13
|
+
forkedAt: number;
|
|
14
|
+
origin: string;
|
|
15
|
+
}[], import("effect/sql/SqlError").SqlError | StoreUnreadableError, FileSystem.FileSystem | Path.Path>;
|
|
16
|
+
readonly strip: (filename: string) => Effect.Effect<void, import("effect/sql/SqlError").SqlError, never>;
|
|
17
|
+
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { adoptArchivedFiles } from "../../host/blob/export/blob-archive.sql.mjs";
|
|
2
|
+
import { lineageOf } from "../../host/fork/actor-fork.sql.mjs";
|
|
3
|
+
import { stripArchivedFiles } from "../../host/blob/reference/blob-receipts.sql.mjs";
|
|
4
|
+
import { LocalBlobHomes } from "../../host/file/local-blob-home.service.mjs";
|
|
5
|
+
import { SqliteDriver } from "../../host/sqlite/sqlite-driver.service.mjs";
|
|
6
|
+
import { blobHashing } from "../../runtime/blob-hashing.layer.mjs";
|
|
7
|
+
import { ActorLocation } from "../engine/actor-location.service.mjs";
|
|
8
|
+
import { fileIdentity } from "../engine/actor-residents.pure.mjs";
|
|
9
|
+
import { Array, Context, Effect, FileSystem, Layer, Option, Path } from "effect";
|
|
10
|
+
import { SecureRandom } from "effect/crypto";
|
|
11
|
+
// src/serve/archive/archived-actors.layer.ts
|
|
12
|
+
const filesFolder = "files";
|
|
13
|
+
/**
|
|
14
|
+
* Prepares an actor's database file for an `.akter` archive: every file grant blanked and the export holds dropped,
|
|
15
|
+
* with the file rewritten so none of them stays in its free pages. Its state, history and file paths are unchanged.
|
|
16
|
+
*/
|
|
17
|
+
const strip = Effect.fnUntraced(function* stripArchived(filename) {
|
|
18
|
+
const services = yield* Layer.build(SqliteDriver.layerNode);
|
|
19
|
+
const sql = yield* Context.get(services, SqliteDriver).open(filename);
|
|
20
|
+
yield* stripArchivedFiles(sql);
|
|
21
|
+
}, Effect.scoped);
|
|
22
|
+
const adoptActor = Effect.fnUntraced(function* adoptActorFiles({ home, location, sqlite }, address) {
|
|
23
|
+
const fileSystem = yield* FileSystem.FileSystem;
|
|
24
|
+
const path = yield* Path.Path;
|
|
25
|
+
const { database, directory } = location.locate(address);
|
|
26
|
+
const files = path.join(directory, filesFolder);
|
|
27
|
+
const sql = yield* sqlite.open(database);
|
|
28
|
+
yield* adoptArchivedFiles({
|
|
29
|
+
actor: fileIdentity(address),
|
|
30
|
+
adopt: home.transfers.adopt,
|
|
31
|
+
sql,
|
|
32
|
+
stored: (sha256) => fileSystem.stream(path.join(files, sha256))
|
|
33
|
+
});
|
|
34
|
+
yield* fileSystem.remove(files, {
|
|
35
|
+
force: true,
|
|
36
|
+
recursive: true
|
|
37
|
+
});
|
|
38
|
+
}, Effect.scoped);
|
|
39
|
+
/**
|
|
40
|
+
* Takes the files of every actor in an imported folder into the folder's own file home, `files-home`, the one
|
|
41
|
+
* `akter dev` opens: each actor's `files/<sha256>` is adopted under the actor's local identity, its database is
|
|
42
|
+
* rewritten for it, and its `files/` folder is removed. Run it before anything serves the folder.
|
|
43
|
+
*/
|
|
44
|
+
const adopt = Effect.fnUntraced(function* adoptArchived(folder) {
|
|
45
|
+
const path = yield* Path.Path;
|
|
46
|
+
const services = yield* Layer.build(Layer.mergeAll(ActorLocation.directory(folder), SqliteDriver.layerNode, blobHashing, SecureRandom.layerWebCrypto));
|
|
47
|
+
const home = yield* Effect.provide(LocalBlobHomes.open(path.join(folder, "files-home")), services);
|
|
48
|
+
const location = Context.get(services, ActorLocation);
|
|
49
|
+
const actors = yield* location.list;
|
|
50
|
+
const adopting = {
|
|
51
|
+
home,
|
|
52
|
+
location,
|
|
53
|
+
sqlite: Context.get(services, SqliteDriver)
|
|
54
|
+
};
|
|
55
|
+
yield* Effect.forEach(actors, (address) => adoptActor(adopting, address), { discard: true });
|
|
56
|
+
}, Effect.scoped);
|
|
57
|
+
const forkOf = Effect.fnUntraced(function* forkOf(sqlite, directory) {
|
|
58
|
+
const path = yield* Path.Path;
|
|
59
|
+
const sql = yield* sqlite.open(path.join(directory, "actor.db"));
|
|
60
|
+
const recorded = yield* lineageOf(sql);
|
|
61
|
+
const actor = {
|
|
62
|
+
key: path.basename(directory),
|
|
63
|
+
type: path.basename(path.dirname(directory))
|
|
64
|
+
};
|
|
65
|
+
return Option.map(recorded, ({ forkId, origin, version }) => ({
|
|
66
|
+
actor,
|
|
67
|
+
fork: forkId,
|
|
68
|
+
forkedAt: version,
|
|
69
|
+
origin
|
|
70
|
+
}));
|
|
71
|
+
}, Effect.scoped);
|
|
72
|
+
const ArchivedActors = {
|
|
73
|
+
adopt,
|
|
74
|
+
lineage: Effect.fnUntraced(function* archivedLineage(folder) {
|
|
75
|
+
const services = yield* Layer.build(Layer.merge(ActorLocation.directory(folder), SqliteDriver.layerNode));
|
|
76
|
+
const location = Context.get(services, ActorLocation);
|
|
77
|
+
const sqlite = Context.get(services, SqliteDriver);
|
|
78
|
+
const actors = yield* location.list;
|
|
79
|
+
const forks = yield* Effect.forEach(actors, (address) => forkOf(sqlite, location.locate(address).directory));
|
|
80
|
+
return Array.getSomes(forks);
|
|
81
|
+
}, Effect.scoped),
|
|
82
|
+
strip
|
|
83
|
+
};
|
|
84
|
+
export { ArchivedActors };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Effect, FileSystem, Path } from "effect";
|
|
2
|
+
/**
|
|
3
|
+
* Whether a path in a data directory, relative and with `/` separators, belongs to its environments rather than to
|
|
4
|
+
* the serving store: the record and its journal files, every snapshot and every other environment's store. No
|
|
5
|
+
* archive holds them; an archive is one environment's export.
|
|
6
|
+
*/
|
|
7
|
+
declare const isEnvironmentEntry: (relative: string) => boolean;
|
|
8
|
+
export declare const ArchivedStore: {
|
|
9
|
+
readonly isEnvironmentEntry: typeof isEnvironmentEntry;
|
|
10
|
+
readonly served: (folder: string) => Effect.Effect<string, import("effect/PlatformError").PlatformError | import("effect/sql/SqlError").SqlError, FileSystem.FileSystem | Path.Path>;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { SqliteDriver } from "../../host/sqlite/sqlite-driver.service.mjs";
|
|
2
|
+
import { environmentRow, recordFile, servingRow } from "../environment/environment-records.sql.mjs";
|
|
3
|
+
import { Array, Context, Effect, FileSystem, Layer, Option, Path, String } from "effect";
|
|
4
|
+
// src/serve/archive/archived-store.layer.ts
|
|
5
|
+
/**
|
|
6
|
+
* The store an `.akter` archive of `folder` holds: the environment its record says serves, the folder itself for
|
|
7
|
+
* `dev` or `environments/<name>` for a promoted branch. A folder with no record, such as an export's staging folder,
|
|
8
|
+
* is its own store. The record is read query-only, so a running `akter dev` is never disturbed.
|
|
9
|
+
*/
|
|
10
|
+
const served = Effect.fnUntraced(function* servedStore(folder) {
|
|
11
|
+
const fileSystem = yield* FileSystem.FileSystem;
|
|
12
|
+
const path = yield* Path.Path;
|
|
13
|
+
const record = path.join(folder, recordFile);
|
|
14
|
+
if (!(yield* fileSystem.exists(record))) return folder;
|
|
15
|
+
const services = yield* Layer.build(SqliteDriver.layerNode);
|
|
16
|
+
const sql = yield* Context.get(services, SqliteDriver).openQueryOnly(record);
|
|
17
|
+
const serving = yield* servingRow({ sql });
|
|
18
|
+
const row = yield* environmentRow({
|
|
19
|
+
name: serving.environment,
|
|
20
|
+
sql
|
|
21
|
+
});
|
|
22
|
+
return path.resolve(folder, Option.match(row, {
|
|
23
|
+
onNone: () => ".",
|
|
24
|
+
onSome: (found) => found.directory
|
|
25
|
+
}));
|
|
26
|
+
}, Effect.scoped);
|
|
27
|
+
/**
|
|
28
|
+
* Whether a path in a data directory, relative and with `/` separators, belongs to its environments rather than to
|
|
29
|
+
* the serving store: the record and its journal files, every snapshot and every other environment's store. No
|
|
30
|
+
* archive holds them; an archive is one environment's export.
|
|
31
|
+
*/
|
|
32
|
+
const isEnvironmentEntry = (relative) => {
|
|
33
|
+
const top = Option.getOrElse(Array.head(String.split("/")(relative)), () => relative);
|
|
34
|
+
return top === "environments" || top === "snapshots" || String.startsWith("environments.db")(top);
|
|
35
|
+
};
|
|
36
|
+
const ArchivedStore = {
|
|
37
|
+
isEnvironmentEntry,
|
|
38
|
+
served
|
|
39
|
+
};
|
|
40
|
+
export { ArchivedStore };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ActorJournal } from "../../contract/history/actor-journal.service.mjs";
|
|
2
|
+
import { ActorRegistry } from "../../contract/actor/actor-registry.service.mjs";
|
|
3
|
+
import { ActorHost } from "./actor-host.service.mjs";
|
|
4
|
+
import { FileSystem, Layer, Path } from "effect";
|
|
5
|
+
declare const providedHandlers: Layer.Layer<ActorRegistry, never, never>;
|
|
6
|
+
declare const actorEngine: (directory: string) => Layer.Layer<ActorHost | ActorRegistry, never, FileSystem.FileSystem | Path.Path>;
|
|
7
|
+
declare const hostJournal: Layer.Layer<ActorJournal, never, ActorHost>;
|
|
8
|
+
export { actorEngine, hostJournal, providedHandlers };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { handlersKey } from "../../contract/actor/actor-definition.pure.mjs";
|
|
2
|
+
import { ActorJournal } from "../../contract/history/actor-journal.service.mjs";
|
|
3
|
+
import { ActorRegistry } from "../../contract/actor/actor-registry.service.mjs";
|
|
4
|
+
import { ActorDatabase } from "../../host/actor/actor-database.service.mjs";
|
|
5
|
+
import { CommandRunner } from "../../host/command/command-runner.service.mjs";
|
|
6
|
+
import { ActorHost } from "./actor-host.service.mjs";
|
|
7
|
+
import { ActorLocation } from "./actor-location.service.mjs";
|
|
8
|
+
import { Context, Effect, Layer, Option } from "effect";
|
|
9
|
+
// src/serve/engine/actor-engine.layer.ts
|
|
10
|
+
const providedHandlers = Layer.effect(ActorRegistry, Effect.gen(function* findProvidedHandlers() {
|
|
11
|
+
const provided = yield* Effect.context();
|
|
12
|
+
const registered = yield* ActorRegistry.make;
|
|
13
|
+
return {
|
|
14
|
+
lookup: (name) => Option.match(Context.getOption(provided, handlersKey(name)), {
|
|
15
|
+
onNone: () => registered.lookup(name),
|
|
16
|
+
onSome: Effect.succeed
|
|
17
|
+
}),
|
|
18
|
+
register: registered.register
|
|
19
|
+
};
|
|
20
|
+
}));
|
|
21
|
+
const actorEngine = (directory) => ActorHost.layer.pipe(Layer.provideMerge(providedHandlers), Layer.provide([
|
|
22
|
+
ActorDatabase.layerNode,
|
|
23
|
+
ActorLocation.directory(directory),
|
|
24
|
+
CommandRunner.layer
|
|
25
|
+
]), Layer.fresh);
|
|
26
|
+
const hostJournal = Layer.effect(ActorJournal, ActorHost.use((host) => Effect.succeed({
|
|
27
|
+
coveredSince: host.coveredSince,
|
|
28
|
+
read: host.history
|
|
29
|
+
})));
|
|
30
|
+
export { actorEngine, hostJournal, providedHandlers };
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { ActorAlreadyExistsError } from "../../contract/actor/actor-already-exists.errors.mjs";
|
|
2
|
+
import { ActorErasedError } from "../../contract/actor/actor-erased.errors.mjs";
|
|
3
|
+
import { ActorNotCreatedError } from "../../contract/actor/actor-not-created.errors.mjs";
|
|
4
|
+
import { InvalidRequestError } from "../../contract/client/invalid-request.errors.mjs";
|
|
5
|
+
import { ForkedFiles } from "../../host/fork/actor-fork.sql.mjs";
|
|
6
|
+
import "../../contract/client/client-failure.contract.mjs";
|
|
7
|
+
import { StoreUnreadableError } from "../store/store-unreadable.errors.mjs";
|
|
8
|
+
import { ActorDatabase, OpenedActor } from "../../host/actor/actor-database.service.mjs";
|
|
9
|
+
import { LocalBlobHomes } from "../../host/file/local-blob-home.service.mjs";
|
|
10
|
+
import { ForkComputers } from "../../host/fork/fork-computers.adapter.mjs";
|
|
11
|
+
import { ActorAddress, ActorLocation, StagedFork } from "./actor-location.service.mjs";
|
|
12
|
+
import { OpenFailure, Residents } from "./actor-residents.pure.mjs";
|
|
13
|
+
import { Context, Effect, FileSystem, Option, Semaphore } from "effect";
|
|
14
|
+
interface ForkCall extends ActorAddress {
|
|
15
|
+
readonly commandId: string;
|
|
16
|
+
readonly into: string;
|
|
17
|
+
}
|
|
18
|
+
interface ForkResident {
|
|
19
|
+
readonly exclusive: <Success, Failure, Needs>(effect: Effect.Effect<Success, Failure, Needs>) => Effect.Effect<Success, Failure, Needs>;
|
|
20
|
+
readonly forking: Semaphore.Semaphore;
|
|
21
|
+
readonly opened: OpenedActor;
|
|
22
|
+
}
|
|
23
|
+
/** What the fork needs from the host that runs it. */
|
|
24
|
+
interface ForkHost<Resident extends ForkResident> {
|
|
25
|
+
readonly identity: (address: ActorAddress) => string;
|
|
26
|
+
readonly residents: Residents<Resident>;
|
|
27
|
+
readonly served: (address: ActorAddress) => Effect.Effect<OpenedActor["actor"], OpenFailure>;
|
|
28
|
+
readonly stored: (address: ActorAddress) => Effect.Effect<boolean, OpenFailure>;
|
|
29
|
+
}
|
|
30
|
+
type ForkFailure = ActorAlreadyExistsError | ActorNotCreatedError | InvalidRequestError | OpenFailure;
|
|
31
|
+
type ForkServices = ActorDatabase | ActorLocation | FileSystem.FileSystem | ForkComputers;
|
|
32
|
+
/**
|
|
33
|
+
* Forks actors on one host. Forks run one at a time, so two forks can't both find a child key free and publish into
|
|
34
|
+
* it; each holds its parent's fork gate from the cut until the child has its files, and holds the child's address
|
|
35
|
+
* from the check that it's free until the copy is renamed into place, so no command or upload creates the child
|
|
36
|
+
* meanwhile.
|
|
37
|
+
*/
|
|
38
|
+
declare const forkedBy: <Resident extends ForkResident>(host: ForkHost<Resident>) => ((call: ForkCall) => Effect.Effect<number, ForkFailure, ForkServices>);
|
|
39
|
+
/** The file fork a staged copy began, if it was quieted as this fork and its files were forked. */
|
|
40
|
+
declare const forkedIn: (args_0: StagedFork) => Effect.Effect<Option.None<ForkedFiles> | Option.Some<ForkedFiles>, import("effect/PlatformError").PlatformError | (ActorErasedError | import("effect/sql/SqlError").SqlError), ActorDatabase | FileSystem.FileSystem>;
|
|
41
|
+
type SweepFailure = Effect.Error<ReturnType<typeof forkedIn>> | Effect.Error<LocalBlobHomes["Service"]["get"]>;
|
|
42
|
+
/**
|
|
43
|
+
* Sweeps what forks that crashed before publishing left, when a host starts and before it forks or opens an actor:
|
|
44
|
+
* each staged copy, and the claims it took for a child that isn't stored and whose catalog row names the fork's
|
|
45
|
+
* parent. A retry of such a fork rebuilds it from its parent's intent.
|
|
46
|
+
*/
|
|
47
|
+
declare const sweepStaged: (identity: (address: ActorAddress) => string) => Effect.Effect<void, StoreUnreadableError | SweepFailure, ForkServices>;
|
|
48
|
+
declare const ActorForks_base: Context.ServiceClass<ActorForks, "@akterjs/effect/serve/engine/actor-fork.service/ActorForks", {
|
|
49
|
+
readonly computers: typeof ForkComputers.layer;
|
|
50
|
+
readonly forkedBy: typeof forkedBy;
|
|
51
|
+
readonly sweepStaged: typeof sweepStaged;
|
|
52
|
+
}>;
|
|
53
|
+
/**
|
|
54
|
+
* Forks a stored actor into a new key at a cut between two of its commits. `forkedBy(host)` makes the fork route of
|
|
55
|
+
* one host; the copy starts quiet and is published by one rename. `sweepStaged` clears what crashed forks left.
|
|
56
|
+
*/
|
|
57
|
+
export declare class ActorForks extends ActorForks_base {
|
|
58
|
+
static readonly forkedBy: typeof forkedBy;
|
|
59
|
+
static readonly sweepStaged: (identity: (address: ActorAddress) => string) => Effect.Effect<void, StoreUnreadableError | SweepFailure, ForkServices>;
|
|
60
|
+
/** The fork's computers, which the host provides to its fork route and its sweep. */
|
|
61
|
+
static readonly computers: import("effect/Layer").Layer<ForkComputers, never, FileSystem.FileSystem | import("effect/Path").Path>;
|
|
62
|
+
}
|
|
63
|
+
export type { ForkCall, ForkFailure, ForkResident, ForkServices };
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { ActorAlreadyExistsError } from "../../contract/actor/actor-already-exists.errors.mjs";
|
|
2
|
+
import { ActorNotCreatedError } from "../../contract/actor/actor-not-created.errors.mjs";
|
|
3
|
+
import { InvalidRequestError } from "../../contract/client/invalid-request.errors.mjs";
|
|
4
|
+
import "../../contract/client/client-failure.contract.mjs";
|
|
5
|
+
import { ActorDatabase } from "../../host/actor/actor-database.service.mjs";
|
|
6
|
+
import { LocalBlobHomes } from "../../host/file/local-blob-home.service.mjs";
|
|
7
|
+
import { ForkComputers } from "../../host/fork/fork-computers.adapter.mjs";
|
|
8
|
+
import { forkIdOf, forkedFiles, markPublished, prepareForks, quietCopy, recordIntent, recordedFork } from "../../host/fork/actor-fork.sql.mjs";
|
|
9
|
+
import { committedVersion } from "../live/live-tables.sql.mjs";
|
|
10
|
+
import { ActorLocation } from "./actor-location.service.mjs";
|
|
11
|
+
import { unavailable } from "./actor-residents.pure.mjs";
|
|
12
|
+
import { Array, Context, Effect, FileSystem, Option, Semaphore } from "effect";
|
|
13
|
+
// src/serve/engine/actor-fork.service.ts
|
|
14
|
+
const oneFork = 1;
|
|
15
|
+
const reused = ({ actor, commandId }) => InvalidRequestError.make({
|
|
16
|
+
actor,
|
|
17
|
+
message: `the fork id ${commandId} already forked this actor into another key`
|
|
18
|
+
});
|
|
19
|
+
/** The fork the parent recorded under this id, if any; the same id can't name a fork into another key. */
|
|
20
|
+
const recorded = Effect.fnUntraced(function* recorded({ call, resident }) {
|
|
21
|
+
const { sql } = resident.opened;
|
|
22
|
+
const found = yield* resident.exclusive(Effect.andThen(prepareForks(sql), recordedFork({
|
|
23
|
+
commandId: call.commandId,
|
|
24
|
+
sql
|
|
25
|
+
})));
|
|
26
|
+
if (Option.isSome(found) && found.value.child !== call.into) return yield* reused(call);
|
|
27
|
+
return found;
|
|
28
|
+
});
|
|
29
|
+
/** The fork's computers: the parent's, copied into the child under the store's computers directory. */
|
|
30
|
+
const computersOf = ({ call, child }) => ActorLocation.use((location) => Effect.succeed({
|
|
31
|
+
child,
|
|
32
|
+
fork: call.commandId,
|
|
33
|
+
parent: {
|
|
34
|
+
actor: call.actor,
|
|
35
|
+
key: call.key
|
|
36
|
+
},
|
|
37
|
+
root: location.computers
|
|
38
|
+
}));
|
|
39
|
+
/** Whether the child is already this fork's, published before a crash or a lost reply; any other child refuses. */
|
|
40
|
+
const publishedChild = Effect.fnUntraced(function* publishedChild({ call, child, host }) {
|
|
41
|
+
if (!(yield* host.stored(child))) return false;
|
|
42
|
+
const { database } = yield* ActorLocation.use((location) => Effect.succeed(location.locate(child)));
|
|
43
|
+
const databases = yield* ActorDatabase;
|
|
44
|
+
const forkId = yield* Effect.scoped(Effect.flatMap(databases.openCopy(database), forkIdOf));
|
|
45
|
+
if (Option.contains(forkId, call.commandId)) return true;
|
|
46
|
+
return yield* ActorAlreadyExistsError.make({ actor: call.actor });
|
|
47
|
+
});
|
|
48
|
+
/**
|
|
49
|
+
* Removes what an unfinished attempt of this fork left: its staged copy, and the files it claimed for the child. A
|
|
50
|
+
* child that is stored keeps its claims, and so does one whose catalog row doesn't name this parent: either is an
|
|
51
|
+
* actor of its own. Akter dev keeps every actor's files in one home, so the parent's home is the child's.
|
|
52
|
+
*/
|
|
53
|
+
const discardStaged = Effect.fnUntraced(function* discardStaged(forking) {
|
|
54
|
+
const { call, child, host, resident, staged } = forking;
|
|
55
|
+
const fileSystem = yield* FileSystem.FileSystem;
|
|
56
|
+
const files = Option.fromNullishOr(resident.opened.fileSession);
|
|
57
|
+
const stored = yield* host.stored(child);
|
|
58
|
+
if (Option.isSome(files) && !stored) yield* files.value.home.catalog.abandon({
|
|
59
|
+
actor: host.identity(child),
|
|
60
|
+
origin: host.identity(call)
|
|
61
|
+
});
|
|
62
|
+
if (!stored) {
|
|
63
|
+
const computers = yield* computersOf(forking);
|
|
64
|
+
yield* ForkComputers.use((forked) => forked.discard(computers));
|
|
65
|
+
}
|
|
66
|
+
yield* fileSystem.remove(staged.directory, {
|
|
67
|
+
force: true,
|
|
68
|
+
recursive: true
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
/** Copies the parent at one cut between two of its commands, after recording the fork's intent. */
|
|
72
|
+
const cut = Effect.fnUntraced(function* cut({ call, resident, staged }) {
|
|
73
|
+
const { sql } = resident.opened;
|
|
74
|
+
const fileSystem = yield* FileSystem.FileSystem;
|
|
75
|
+
const cutParent = Effect.gen(function* cutParent() {
|
|
76
|
+
const version = yield* committedVersion(sql);
|
|
77
|
+
yield* recordIntent({
|
|
78
|
+
commandId: call.commandId,
|
|
79
|
+
into: call.into,
|
|
80
|
+
sql,
|
|
81
|
+
version
|
|
82
|
+
});
|
|
83
|
+
yield* fileSystem.makeDirectory(staged.directory, { recursive: true });
|
|
84
|
+
yield* sql`VACUUM INTO ${staged.database}`;
|
|
85
|
+
return version;
|
|
86
|
+
});
|
|
87
|
+
return yield* resident.exclusive(cutParent);
|
|
88
|
+
});
|
|
89
|
+
const quiet = Effect.fnUntraced(function* quiet({ call, staged }, version) {
|
|
90
|
+
const databases = yield* ActorDatabase;
|
|
91
|
+
const lineage = {
|
|
92
|
+
forkId: call.commandId,
|
|
93
|
+
origin: ActorLocation.named(call),
|
|
94
|
+
version
|
|
95
|
+
};
|
|
96
|
+
yield* Effect.scoped(Effect.flatMap(databases.openCopy(staged.database), (sql) => quietCopy({
|
|
97
|
+
...lineage,
|
|
98
|
+
sql
|
|
99
|
+
})));
|
|
100
|
+
});
|
|
101
|
+
const unavailableBy = (actor) => (failure) => unavailable(actor)({ message: `the fork didn't finish: ${failure.message}` });
|
|
102
|
+
/** Inherits the parent's files at the cut into the staged child, under the child's own claims and grants. */
|
|
103
|
+
const forkFiles = Effect.fnUntraced(function* forkFiles({ call, child, host, resident, staged }) {
|
|
104
|
+
const files = Option.fromNullishOr(resident.opened.fileSession);
|
|
105
|
+
if (Option.isNone(files)) return;
|
|
106
|
+
const actor = yield* host.served(child);
|
|
107
|
+
const databases = yield* ActorDatabase;
|
|
108
|
+
const opening = {
|
|
109
|
+
actor,
|
|
110
|
+
filename: staged.database,
|
|
111
|
+
identity: host.identity(child)
|
|
112
|
+
};
|
|
113
|
+
yield* Effect.scoped(Effect.gen(function* inheritFiles() {
|
|
114
|
+
const opened = yield* Effect.mapError(databases.open(opening), unavailableBy(call.actor));
|
|
115
|
+
const target = yield* Effect.orDie(Effect.fromNullishOr(opened.fileSession));
|
|
116
|
+
const source = files.value;
|
|
117
|
+
yield* source.home.transfers.fork({
|
|
118
|
+
into: target.home,
|
|
119
|
+
operation: call.commandId,
|
|
120
|
+
source: source.owner,
|
|
121
|
+
target: target.owner
|
|
122
|
+
});
|
|
123
|
+
}));
|
|
124
|
+
});
|
|
125
|
+
const publish = Effect.fnUntraced(function* publish({ call, child, resident, staged }) {
|
|
126
|
+
const fileSystem = yield* FileSystem.FileSystem;
|
|
127
|
+
const { directory } = yield* ActorLocation.use((location) => Effect.succeed(location.locate(child)));
|
|
128
|
+
yield* fileSystem.rename(staged.directory, directory);
|
|
129
|
+
yield* resident.exclusive(markPublished({
|
|
130
|
+
commandId: call.commandId,
|
|
131
|
+
sql: resident.opened.sql
|
|
132
|
+
}));
|
|
133
|
+
});
|
|
134
|
+
const copy = Effect.fnUntraced(function* copy(forking, computers, held) {
|
|
135
|
+
const version = yield* cut(forking);
|
|
136
|
+
yield* quiet(forking, version);
|
|
137
|
+
yield* forkFiles(forking);
|
|
138
|
+
yield* ForkComputers.use((forked) => forked.copy({
|
|
139
|
+
...computers,
|
|
140
|
+
held
|
|
141
|
+
}));
|
|
142
|
+
yield* publish(forking);
|
|
143
|
+
return version;
|
|
144
|
+
});
|
|
145
|
+
/**
|
|
146
|
+
* Builds the child: holds the parent's computers, so none changes from before the cut until the child has its copy
|
|
147
|
+
* of each, cuts and copies, publishes, then lets go of them. A failure lets go of them too.
|
|
148
|
+
*/
|
|
149
|
+
const build = Effect.fnUntraced(function* build(forking) {
|
|
150
|
+
yield* discardStaged(forking);
|
|
151
|
+
const computers = yield* computersOf(forking);
|
|
152
|
+
const forked = yield* ForkComputers;
|
|
153
|
+
const held = yield* forked.hold(computers);
|
|
154
|
+
const releasing = {
|
|
155
|
+
...computers,
|
|
156
|
+
held: Option.some(held)
|
|
157
|
+
};
|
|
158
|
+
const released = Effect.ignore(forked.release(releasing));
|
|
159
|
+
const version = yield* Effect.onError(copy(forking, computers, held), () => released);
|
|
160
|
+
yield* forked.settle(releasing);
|
|
161
|
+
return version;
|
|
162
|
+
});
|
|
163
|
+
/** Lets go of the parent's computers again for a fork its parent or child shows published before a crash. */
|
|
164
|
+
const settledAgain = (forking) => Effect.flatMap(Effect.all([computersOf(forking), ForkComputers]), ([computers, forked]) => forked.settle({
|
|
165
|
+
...computers,
|
|
166
|
+
held: Option.none()
|
|
167
|
+
}));
|
|
168
|
+
/**
|
|
169
|
+
* One fork, under the parent's fork gate so no command commits between the cut and the copy of its files. A fork the
|
|
170
|
+
* parent already published answers its version again. Otherwise the child is built beside its directory and appears
|
|
171
|
+
* by one rename, so nothing reads a partial child; a failed attempt removes what it built, and a retry rebuilds it.
|
|
172
|
+
*/
|
|
173
|
+
const forkHeld = Effect.fnUntraced(function* forkHeld(forking) {
|
|
174
|
+
const found = yield* recorded(forking);
|
|
175
|
+
const settled = settledAgain(forking);
|
|
176
|
+
if (Option.isSome(found) && found.value.state === "published") {
|
|
177
|
+
yield* settled;
|
|
178
|
+
return found.value.version;
|
|
179
|
+
}
|
|
180
|
+
if (yield* publishedChild(forking)) {
|
|
181
|
+
yield* forking.resident.exclusive(markPublished({
|
|
182
|
+
commandId: forking.call.commandId,
|
|
183
|
+
sql: forking.resident.opened.sql
|
|
184
|
+
}));
|
|
185
|
+
yield* settled;
|
|
186
|
+
return yield* Effect.map(Effect.orDie(Effect.fromOption(found)), (record) => record.version);
|
|
187
|
+
}
|
|
188
|
+
return yield* build(forking).pipe(Effect.onError(() => Effect.ignore(discardStaged(forking))));
|
|
189
|
+
});
|
|
190
|
+
/** The one copy a fork makes, answered as a fork's failures: a storage or file failure is a retryable unavailable. */
|
|
191
|
+
const forkOnce = Effect.fnUntraced(function* forkOnce(forking) {
|
|
192
|
+
const unfinished = unavailableBy(forking.call.actor);
|
|
193
|
+
return yield* forkHeld(forking).pipe(Effect.catchTags({
|
|
194
|
+
BlobTransferError: (failure) => Effect.fail(unfinished(failure)),
|
|
195
|
+
PlatformError: (failure) => Effect.fail(unfinished(failure)),
|
|
196
|
+
SqlError: (failure) => Effect.fail(unfinished(failure))
|
|
197
|
+
}));
|
|
198
|
+
});
|
|
199
|
+
/**
|
|
200
|
+
* Forks actors on one host. Forks run one at a time, so two forks can't both find a child key free and publish into
|
|
201
|
+
* it; each holds its parent's fork gate from the cut until the child has its files, and holds the child's address
|
|
202
|
+
* from the check that it's free until the copy is renamed into place, so no command or upload creates the child
|
|
203
|
+
* meanwhile.
|
|
204
|
+
*/
|
|
205
|
+
const forkedBy = (host) => {
|
|
206
|
+
const serial = Semaphore.makeUnsafe(oneFork);
|
|
207
|
+
return Effect.fnUntraced(function* forkActor(call) {
|
|
208
|
+
const child = {
|
|
209
|
+
actor: call.actor,
|
|
210
|
+
key: call.into
|
|
211
|
+
};
|
|
212
|
+
if (call.into === call.key) return yield* InvalidRequestError.make({
|
|
213
|
+
actor: call.actor,
|
|
214
|
+
message: "an actor can't fork into itself"
|
|
215
|
+
});
|
|
216
|
+
if (!(yield* host.stored(call))) return yield* ActorNotCreatedError.make({ actor: call.actor });
|
|
217
|
+
const staged = yield* ActorLocation.use((location) => Effect.succeed(location.stage({
|
|
218
|
+
address: child,
|
|
219
|
+
fork: call.commandId
|
|
220
|
+
})));
|
|
221
|
+
return yield* serial.withPermits(oneFork)(host.residents.use(call, (resident) => forkOnce({
|
|
222
|
+
call,
|
|
223
|
+
child,
|
|
224
|
+
host,
|
|
225
|
+
resident,
|
|
226
|
+
staged
|
|
227
|
+
}).pipe(host.residents.holding(child), resident.forking.withPermits(oneFork))));
|
|
228
|
+
});
|
|
229
|
+
};
|
|
230
|
+
/** The file fork a staged copy began, if it was quieted as this fork and its files were forked. */
|
|
231
|
+
const forkedIn = Effect.fnUntraced(function* forkedIn({ files, fork }) {
|
|
232
|
+
const fileSystem = yield* FileSystem.FileSystem;
|
|
233
|
+
const databases = yield* ActorDatabase;
|
|
234
|
+
if (!(yield* fileSystem.exists(files.database))) return Option.none();
|
|
235
|
+
const read = Effect.flatMap(databases.openCopy(files.database), (sql) => Effect.flatMap(forkIdOf(sql), (forkId) => {
|
|
236
|
+
if (!Option.contains(forkId, fork)) return Effect.succeedNone;
|
|
237
|
+
return forkedFiles(sql);
|
|
238
|
+
}));
|
|
239
|
+
return yield* Effect.scoped(read);
|
|
240
|
+
});
|
|
241
|
+
const sweepWith = (homes, stored) => Effect.fnUntraced(function* sweepOne(staged) {
|
|
242
|
+
const fileSystem = yield* FileSystem.FileSystem;
|
|
243
|
+
const forked = yield* forkedIn(staged);
|
|
244
|
+
const claimed = Option.filter(forked, (files) => !stored.has(files.actor));
|
|
245
|
+
if (Option.isSome(claimed) && Option.isSome(homes)) yield* (yield* homes.value.get).catalog.abandon(claimed.value);
|
|
246
|
+
yield* fileSystem.remove(staged.files.directory, {
|
|
247
|
+
force: true,
|
|
248
|
+
recursive: true
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
/**
|
|
252
|
+
* Sweeps what forks that crashed before publishing left, when a host starts and before it forks or opens an actor:
|
|
253
|
+
* each staged copy, and the claims it took for a child that isn't stored and whose catalog row names the fork's
|
|
254
|
+
* parent. A retry of such a fork rebuilds it from its parent's intent.
|
|
255
|
+
*/
|
|
256
|
+
const sweepStaged = Effect.fnUntraced(function* sweepStaged(identity) {
|
|
257
|
+
const location = yield* ActorLocation;
|
|
258
|
+
const staged = yield* location.staged;
|
|
259
|
+
const named = Effect.map(location.list, (actors) => new Set(Array.map(actors, ActorLocation.named)));
|
|
260
|
+
yield* ForkComputers.use((forked) => forked.sweep(location.computers, named));
|
|
261
|
+
if (!Array.isReadonlyArrayNonEmpty(staged)) return;
|
|
262
|
+
const actors = yield* location.list;
|
|
263
|
+
const stored = new Set(Array.map(actors, identity));
|
|
264
|
+
const homes = yield* Effect.serviceOption(LocalBlobHomes);
|
|
265
|
+
yield* Effect.forEach(staged, sweepWith(homes, stored), { discard: true });
|
|
266
|
+
});
|
|
267
|
+
/**
|
|
268
|
+
* Forks a stored actor into a new key at a cut between two of its commits. `forkedBy(host)` makes the fork route of
|
|
269
|
+
* one host; the copy starts quiet and is published by one rename. `sweepStaged` clears what crashed forks left.
|
|
270
|
+
*/
|
|
271
|
+
var ActorForks = class extends Context.Service()("@akterjs/effect/serve/engine/actor-fork.service/ActorForks") {
|
|
272
|
+
static forkedBy = forkedBy;
|
|
273
|
+
static sweepStaged = sweepStaged;
|
|
274
|
+
/** The fork's computers, which the host provides to its fork route and its sweep. */
|
|
275
|
+
static computers = ForkComputers.layer;
|
|
276
|
+
};
|
|
277
|
+
export { ActorForks };
|