@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,208 @@
|
|
|
1
|
+
import { Array as Arr, Effect, Option } from "effect";
|
|
2
|
+
import type { SqlClient, SqlError } from "effect/sql";
|
|
3
|
+
|
|
4
|
+
type Sql<Value> = Effect.Effect<Value, SqlError.SqlError>;
|
|
5
|
+
|
|
6
|
+
/** The environment every data directory starts with, whose store is the data directory itself. */
|
|
7
|
+
const firstEnvironment = "dev";
|
|
8
|
+
|
|
9
|
+
const firstSnapshot = 0;
|
|
10
|
+
|
|
11
|
+
/** Where the first environment's store is, relative to the data directory. */
|
|
12
|
+
const ownDirectory = ".";
|
|
13
|
+
|
|
14
|
+
/** The record of a data directory's environments and snapshots, at the top of the data directory. */
|
|
15
|
+
const recordFile = "environments.db";
|
|
16
|
+
|
|
17
|
+
/** Where a data directory keeps each branch's store, as `environments/<name>`. */
|
|
18
|
+
const environmentsFolder = "environments";
|
|
19
|
+
|
|
20
|
+
/** Where a data directory keeps each snapshot's copy, as `snapshots/<id>`. */
|
|
21
|
+
const snapshotsFolder = "snapshots";
|
|
22
|
+
|
|
23
|
+
interface EnvironmentRow {
|
|
24
|
+
readonly created_at: number;
|
|
25
|
+
readonly directory: string;
|
|
26
|
+
readonly name: string;
|
|
27
|
+
readonly quiet: number;
|
|
28
|
+
readonly served: number;
|
|
29
|
+
readonly source: string | null;
|
|
30
|
+
readonly status: "Ready" | "Retired";
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
interface SnapshotRow {
|
|
34
|
+
readonly created_at: number;
|
|
35
|
+
readonly environment: string;
|
|
36
|
+
readonly id: string;
|
|
37
|
+
readonly name: string;
|
|
38
|
+
readonly reason: string | null;
|
|
39
|
+
readonly size_bytes: number | null;
|
|
40
|
+
readonly status: "Pending" | "Ready" | "Failed" | "Retired";
|
|
41
|
+
readonly taken_at: number | null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Which environment serves, and the promote that made it serve, kept so a repeated promote answers the same. */
|
|
45
|
+
interface ServingRow {
|
|
46
|
+
readonly environment: string;
|
|
47
|
+
readonly notice: string | null;
|
|
48
|
+
readonly previous: string | null;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
interface Records {
|
|
52
|
+
readonly sql: SqlClient.SqlClient;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
interface Stamped extends Records {
|
|
56
|
+
readonly now: number;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
interface Named extends Records {
|
|
60
|
+
readonly name: string;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const tables = [
|
|
64
|
+
"CREATE TABLE IF NOT EXISTS akter_environments (name TEXT PRIMARY KEY, directory TEXT NOT NULL, status TEXT NOT NULL CHECK (status IN ('Ready', 'Retired')), quiet INTEGER NOT NULL CHECK (quiet IN (0, 1)), served INTEGER NOT NULL CHECK (served IN (0, 1)), source TEXT, created_at INTEGER NOT NULL) STRICT",
|
|
65
|
+
"CREATE TABLE IF NOT EXISTS akter_snapshots (id TEXT PRIMARY KEY, name TEXT NOT NULL, environment TEXT NOT NULL, status TEXT NOT NULL CHECK (status IN ('Pending', 'Ready', 'Failed', 'Retired')), claimed INTEGER NOT NULL DEFAULT 0, created_at INTEGER NOT NULL, taken_at INTEGER, size_bytes INTEGER, reason TEXT) STRICT",
|
|
66
|
+
"CREATE TABLE IF NOT EXISTS akter_serving (slot INTEGER PRIMARY KEY CHECK (slot = 1), environment TEXT NOT NULL, previous TEXT, notice TEXT) STRICT",
|
|
67
|
+
"CREATE TABLE IF NOT EXISTS akter_snapshot_sequence (slot INTEGER PRIMARY KEY CHECK (slot = 1), next INTEGER NOT NULL) STRICT",
|
|
68
|
+
];
|
|
69
|
+
|
|
70
|
+
/** Creates the record's tables, and the first environment serving, not quiet, unless they exist. */
|
|
71
|
+
const prepareRecords = ({ now, sql }: Stamped): Sql<void> =>
|
|
72
|
+
sql.withTransaction(
|
|
73
|
+
Effect.gen(function* preparingRecords() {
|
|
74
|
+
yield* Effect.forEach(tables, (statement) => sql.unsafe(statement), { discard: true });
|
|
75
|
+
yield* sql`INSERT OR IGNORE INTO akter_environments (name, directory, status, quiet, served, created_at) VALUES (${firstEnvironment}, ${ownDirectory}, 'Ready', 0, 1, ${now})`;
|
|
76
|
+
yield* sql`INSERT OR IGNORE INTO akter_serving (slot, environment) VALUES (1, ${firstEnvironment})`;
|
|
77
|
+
yield* sql`INSERT OR IGNORE INTO akter_snapshot_sequence (slot, next) VALUES (1, 0)`;
|
|
78
|
+
}),
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
const environmentRows = ({ sql }: Records): Sql<readonly EnvironmentRow[]> =>
|
|
82
|
+
sql<EnvironmentRow>`SELECT name, directory, status, quiet, served, source, created_at FROM akter_environments ORDER BY name`;
|
|
83
|
+
|
|
84
|
+
const environmentRow = ({ name, sql }: Named): Sql<Option.Option<EnvironmentRow>> =>
|
|
85
|
+
Effect.map(
|
|
86
|
+
sql<EnvironmentRow>`SELECT name, directory, status, quiet, served, source, created_at FROM akter_environments WHERE name = ${name}`,
|
|
87
|
+
Arr.head,
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
const servingRow = ({ sql }: Records): Sql<ServingRow> =>
|
|
91
|
+
Effect.flatMap(sql<ServingRow>`SELECT environment, previous, notice FROM akter_serving`, (rows) =>
|
|
92
|
+
Effect.orDie(Effect.fromOption(Arr.head(rows))),
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
interface Branching extends Named, Stamped {
|
|
96
|
+
readonly directory: string;
|
|
97
|
+
readonly source: string;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** A branch starts quiet, and has never served. */
|
|
101
|
+
const insertBranch = ({ directory, name, now, source, sql }: Branching): Sql<void> =>
|
|
102
|
+
Effect.asVoid(
|
|
103
|
+
sql`INSERT INTO akter_environments (name, directory, status, quiet, served, source, created_at) VALUES (${name}, ${directory}, 'Ready', 1, 0, ${source}, ${now})`,
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
interface Promoting extends Records {
|
|
107
|
+
readonly environment: string;
|
|
108
|
+
readonly notice: string;
|
|
109
|
+
readonly previous: string;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** The promoted environment serves and stops being quiet; the one it replaces turns quiet and keeps its data. */
|
|
113
|
+
const markPromoted = ({ environment, notice, previous, sql }: Promoting): Sql<void> =>
|
|
114
|
+
Effect.gen(function* markingPromoted() {
|
|
115
|
+
yield* sql`UPDATE akter_environments SET quiet = 1 WHERE name = ${previous}`;
|
|
116
|
+
yield* sql`UPDATE akter_environments SET quiet = 0, served = 1 WHERE name = ${environment}`;
|
|
117
|
+
yield* sql`UPDATE akter_serving SET environment = ${environment}, previous = ${previous}, notice = ${notice}`;
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
const retireEnvironment = ({ name, sql }: Named): Sql<void> =>
|
|
121
|
+
Effect.asVoid(sql`UPDATE akter_environments SET status = 'Retired', quiet = 1 WHERE name = ${name}`);
|
|
122
|
+
|
|
123
|
+
const snapshotColumns = "id, name, environment, status, created_at, taken_at, size_bytes, reason";
|
|
124
|
+
|
|
125
|
+
interface OfEnvironment extends Records {
|
|
126
|
+
readonly environment: string;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** The environment's live snapshots, by name; a retired snapshot is no longer listed. */
|
|
130
|
+
const liveSnapshots = ({ environment, sql }: OfEnvironment): Sql<readonly SnapshotRow[]> =>
|
|
131
|
+
sql<SnapshotRow>`SELECT ${sql.literal(snapshotColumns)} FROM akter_snapshots WHERE environment = ${environment} AND status != 'Retired' ORDER BY name`;
|
|
132
|
+
|
|
133
|
+
const liveSnapshot = ({ environment, name, sql }: OfEnvironment & Named): Sql<Option.Option<SnapshotRow>> =>
|
|
134
|
+
Effect.map(
|
|
135
|
+
sql<SnapshotRow>`SELECT ${sql.literal(snapshotColumns)} FROM akter_snapshots WHERE environment = ${environment} AND name = ${name} AND status != 'Retired'`,
|
|
136
|
+
Arr.head,
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
interface Identified extends Records {
|
|
140
|
+
readonly id: string;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const snapshotById = ({ id, sql }: Identified): Sql<Option.Option<SnapshotRow>> =>
|
|
144
|
+
Effect.map(sql<SnapshotRow>`SELECT ${sql.literal(snapshotColumns)} FROM akter_snapshots WHERE id = ${id}`, Arr.head);
|
|
145
|
+
|
|
146
|
+
/** Takes the next snapshot id, snapshot-<n>; ids only ever grow, so a deleted snapshot's id is never reused. */
|
|
147
|
+
const nextSnapshotId = ({ sql }: Records): Sql<string> =>
|
|
148
|
+
Effect.map(
|
|
149
|
+
sql<{ readonly taken: number }>`UPDATE akter_snapshot_sequence SET next = next + 1 RETURNING next - 1 AS taken`,
|
|
150
|
+
(rows) => `snapshot-${Arr.reduce(rows, firstSnapshot, (_last, row) => row.taken)}`,
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
const insertSnapshot = ({ environment, id, name, now, sql }: Identified & Named & OfEnvironment & Stamped): Sql<void> =>
|
|
154
|
+
Effect.asVoid(
|
|
155
|
+
sql`INSERT INTO akter_snapshots (id, name, environment, status, created_at) VALUES (${id}, ${name}, ${environment}, 'Pending', ${now})`,
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
/** Claims the environment's pending snapshots that no engine claimed yet, so only one engine takes each. */
|
|
159
|
+
const claimPending = ({ environment, sql }: OfEnvironment): Sql<readonly SnapshotRow[]> =>
|
|
160
|
+
sql<SnapshotRow>`UPDATE akter_snapshots SET claimed = 1 WHERE environment = ${environment} AND status = 'Pending' AND claimed = 0 RETURNING ${sql.literal(snapshotColumns)}`;
|
|
161
|
+
|
|
162
|
+
/** How a claimed snapshot ended: Ready with its size and time, or Failed with the reason. */
|
|
163
|
+
interface Outcome {
|
|
164
|
+
readonly reason: Option.Option<string>;
|
|
165
|
+
readonly sizeBytes: Option.Option<number>;
|
|
166
|
+
readonly status: "Ready" | "Failed";
|
|
167
|
+
readonly takenAt: Option.Option<number>;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/** Settles a pending snapshot; false when it was deleted meanwhile, so its taker removes what it took. */
|
|
171
|
+
const settleSnapshot = ({ id, reason, sizeBytes, sql, status, takenAt }: Identified & Outcome): Sql<boolean> => {
|
|
172
|
+
const [taken, size, why] = [Option.getOrNull(takenAt), Option.getOrNull(sizeBytes), Option.getOrNull(reason)];
|
|
173
|
+
|
|
174
|
+
return Effect.map(
|
|
175
|
+
sql<{
|
|
176
|
+
readonly id: string;
|
|
177
|
+
}>`UPDATE akter_snapshots SET status = ${status}, taken_at = ${taken}, size_bytes = ${size}, reason = ${why} WHERE id = ${id} AND status = 'Pending' RETURNING id`,
|
|
178
|
+
Arr.isReadonlyArrayNonEmpty,
|
|
179
|
+
);
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
const retireSnapshot = ({ id, sql }: Identified): Sql<void> =>
|
|
183
|
+
Effect.asVoid(sql`UPDATE akter_snapshots SET status = 'Retired' WHERE id = ${id}`);
|
|
184
|
+
|
|
185
|
+
export {
|
|
186
|
+
claimPending,
|
|
187
|
+
environmentRow,
|
|
188
|
+
environmentRows,
|
|
189
|
+
firstEnvironment,
|
|
190
|
+
insertBranch,
|
|
191
|
+
insertSnapshot,
|
|
192
|
+
liveSnapshot,
|
|
193
|
+
liveSnapshots,
|
|
194
|
+
markPromoted,
|
|
195
|
+
nextSnapshotId,
|
|
196
|
+
environmentsFolder,
|
|
197
|
+
ownDirectory,
|
|
198
|
+
prepareRecords,
|
|
199
|
+
recordFile,
|
|
200
|
+
retireEnvironment,
|
|
201
|
+
retireSnapshot,
|
|
202
|
+
servingRow,
|
|
203
|
+
settleSnapshot,
|
|
204
|
+
snapshotById,
|
|
205
|
+
snapshotsFolder,
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
export type { EnvironmentRow, Outcome, ServingRow, SnapshotRow };
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { DateTime, Effect, Option } from "effect";
|
|
2
|
+
import type { Duration, FileSystem, Path } from "effect";
|
|
3
|
+
import type { SqlClient, SqlError } from "effect/sql";
|
|
4
|
+
|
|
5
|
+
import { StoreUnreadableError } from "#src/serve/store/store-unreadable.errors";
|
|
6
|
+
import { environmentRow, servingRow } from "./environment-records.sql.js";
|
|
7
|
+
import type { EnvironmentRow, SnapshotRow } from "./environment-records.sql.js";
|
|
8
|
+
import type { AlreadyExistsError } from "./environment-already-exists.errors.js";
|
|
9
|
+
import { InUseError } from "./environment-in-use.errors.js";
|
|
10
|
+
import { NotFoundError } from "./environment-not-found.errors.js";
|
|
11
|
+
import { EnvironmentName, SnapshotName } from "./local-environment.schema.js";
|
|
12
|
+
import type { LocalEnvironment, LocalSnapshot } from "./local-environment.schema.js";
|
|
13
|
+
|
|
14
|
+
/** What applies a data directory's record: the engine serving it, or nothing when none runs in this process. */
|
|
15
|
+
interface Hosting {
|
|
16
|
+
/** Applies the record now: an engine switches to the environment that serves and takes its pending snapshots. */
|
|
17
|
+
readonly apply: Effect.Effect<void>;
|
|
18
|
+
/** How long a new snapshot is waited for while it is Pending, for an engine in another process to take it. */
|
|
19
|
+
readonly settleWithin: Duration.Duration;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** A data directory's environments: its record, on `sql`, and the folders beside it. */
|
|
23
|
+
interface Store {
|
|
24
|
+
readonly directory: string;
|
|
25
|
+
readonly fileSystem: FileSystem.FileSystem;
|
|
26
|
+
readonly hosting: Hosting;
|
|
27
|
+
readonly path: Path.Path;
|
|
28
|
+
readonly sql: SqlClient.SqlClient;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
type Storage = SqlError.SqlError | Effect.Error<ReturnType<FileSystem.FileSystem["remove"]>>;
|
|
32
|
+
|
|
33
|
+
/** What an operation on a data directory's environments can fail with. */
|
|
34
|
+
type Failure = AlreadyExistsError | InUseError | NotFoundError | StoreUnreadableError;
|
|
35
|
+
|
|
36
|
+
/** A failure to read or write the record or a folder, answered as the data directory being unreadable. */
|
|
37
|
+
const stored =
|
|
38
|
+
({ directory }: Pick<Store, "directory">) =>
|
|
39
|
+
<Value>(effect: Effect.Effect<Value, Failure | Storage>): Effect.Effect<Value, Failure> => {
|
|
40
|
+
const unreadable = (failure: Storage): Effect.Effect<never, StoreUnreadableError> =>
|
|
41
|
+
Effect.fail(StoreUnreadableError.make({ directory, message: failure.message }));
|
|
42
|
+
|
|
43
|
+
return Effect.catchTags(effect, { PlatformError: unreadable, SqlError: unreadable });
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const quietFlag = 1;
|
|
47
|
+
|
|
48
|
+
interface Describing extends Pick<Store, "directory" | "path"> {
|
|
49
|
+
readonly serving: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const sourceOf = (row: EnvironmentRow): Pick<LocalEnvironment, "source"> =>
|
|
53
|
+
Option.match(Option.fromNullishOr(row.source), { onNone: () => ({}), onSome: (source) => ({ source }) });
|
|
54
|
+
|
|
55
|
+
const environmentOf =
|
|
56
|
+
({ directory, path, serving }: Describing) =>
|
|
57
|
+
(row: EnvironmentRow): LocalEnvironment => ({
|
|
58
|
+
createdAt: DateTime.makeUnsafe(row.created_at),
|
|
59
|
+
directory: path.resolve(directory, row.directory),
|
|
60
|
+
name: EnvironmentName.make(row.name),
|
|
61
|
+
quiet: row.quiet === quietFlag,
|
|
62
|
+
serving: row.name === serving,
|
|
63
|
+
status: row.status,
|
|
64
|
+
...sourceOf(row),
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
const takenOf = (row: SnapshotRow): Pick<LocalSnapshot, "takenAt"> =>
|
|
68
|
+
Option.match(Option.fromNullishOr(row.taken_at), {
|
|
69
|
+
onNone: () => ({}),
|
|
70
|
+
onSome: (millis) => ({ takenAt: DateTime.makeUnsafe(millis) }),
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
const sizeOf = (row: SnapshotRow): Pick<LocalSnapshot, "sizeBytes"> =>
|
|
74
|
+
Option.match(Option.fromNullishOr(row.size_bytes), { onNone: () => ({}), onSome: (sizeBytes) => ({ sizeBytes }) });
|
|
75
|
+
|
|
76
|
+
const reasonOf = (row: SnapshotRow): Pick<LocalSnapshot, "reason"> =>
|
|
77
|
+
Option.match(Option.fromNullishOr(row.reason), { onNone: () => ({}), onSome: (reason) => ({ reason }) });
|
|
78
|
+
|
|
79
|
+
const snapshotOf = (row: SnapshotRow): LocalSnapshot => ({
|
|
80
|
+
createdAt: DateTime.makeUnsafe(row.created_at),
|
|
81
|
+
environment: EnvironmentName.make(row.environment),
|
|
82
|
+
id: row.id,
|
|
83
|
+
name: SnapshotName.make(row.name),
|
|
84
|
+
status: row.status,
|
|
85
|
+
...reasonOf(row),
|
|
86
|
+
...sizeOf(row),
|
|
87
|
+
...takenOf(row),
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
/** The named environment, or the one that serves when no name is given, as it is recorded. */
|
|
91
|
+
const recordedEnvironment = Effect.fnUntraced(function* recordedEnvironment(
|
|
92
|
+
store: Store,
|
|
93
|
+
name: EnvironmentName | undefined,
|
|
94
|
+
) {
|
|
95
|
+
const serving = yield* servingRow(store);
|
|
96
|
+
const wanted = name ?? serving.environment;
|
|
97
|
+
const row = yield* environmentRow({ name: wanted, sql: store.sql });
|
|
98
|
+
const notFound = (): NotFoundError => NotFoundError.make({ key: wanted, resource: "environment" });
|
|
99
|
+
|
|
100
|
+
return yield* Effect.mapError(Effect.fromOption(row), notFound);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
/** The environment, which must be Ready: a retired one keeps its name but holds nothing. */
|
|
104
|
+
const readyEnvironment = Effect.fnUntraced(function* readyEnvironment(store: Store, name: EnvironmentName | undefined) {
|
|
105
|
+
const row = yield* recordedEnvironment(store, name);
|
|
106
|
+
|
|
107
|
+
if (row.status === "Retired") {
|
|
108
|
+
return yield* InUseError.make({ key: row.name, reason: "environmentRetired" });
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return row;
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
export { environmentOf, readyEnvironment, recordedEnvironment, snapshotOf, stored };
|
|
115
|
+
|
|
116
|
+
export type { Failure, Hosting, Store };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
|
|
3
|
+
// The rule Akter Cloud names environments and snapshots by, so a name that works on one works on the other.
|
|
4
|
+
const nameSource = "[a-z](?:-?[a-z0-9])*";
|
|
5
|
+
|
|
6
|
+
const longestName = 63;
|
|
7
|
+
|
|
8
|
+
const isName = [Schema.isPattern(new RegExp(`^${nameSource}$`, "u")), Schema.isMaxLength(longestName)] as const;
|
|
9
|
+
|
|
10
|
+
const nameRule =
|
|
11
|
+
"1 to 63 characters: a lowercase letter, then lowercase letters, digits or single hyphens, ending in a letter or digit.";
|
|
12
|
+
|
|
13
|
+
const EnvironmentName = Schema.String.check(...isName)
|
|
14
|
+
.pipe(Schema.brand("EnvironmentName"))
|
|
15
|
+
.annotate({ description: `An environment's name, unique in its data directory. ${nameRule}` });
|
|
16
|
+
|
|
17
|
+
type EnvironmentName = typeof EnvironmentName.Type;
|
|
18
|
+
|
|
19
|
+
const SnapshotName = Schema.String.check(...isName)
|
|
20
|
+
.pipe(Schema.brand("SnapshotName"))
|
|
21
|
+
.annotate({ description: `A snapshot's name, unique among its environment's live snapshots. ${nameRule}` });
|
|
22
|
+
|
|
23
|
+
type SnapshotName = typeof SnapshotName.Type;
|
|
24
|
+
|
|
25
|
+
const SnapshotId = Schema.String.check(Schema.isPattern(/^snapshot-\d+$/u)).annotate({
|
|
26
|
+
description: "snapshot-<n>, numbered in the order snapshots were asked for; a deleted snapshot's id is never reused.",
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
const EnvironmentStatus = Schema.Literals(["Ready", "Retired"]).annotate({
|
|
30
|
+
description: "Ready: it can serve. Retired: it was deleted; its data is gone and it keeps its name.",
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
/** One local environment: a store of its own, a directory in the data directory. */
|
|
34
|
+
const LocalEnvironment = Schema.Struct({
|
|
35
|
+
createdAt: Schema.DateTimeUtcFromString,
|
|
36
|
+
directory: Schema.String.annotate({ description: "The environment's store, the folder its shards live in." }),
|
|
37
|
+
name: EnvironmentName,
|
|
38
|
+
quiet: Schema.Boolean.annotate({
|
|
39
|
+
description:
|
|
40
|
+
"No timer fires, no outbox message is delivered and no job runs while it is quiet; they are held until it is promoted.",
|
|
41
|
+
}),
|
|
42
|
+
serving: Schema.Boolean.annotate({ description: "Whether akter dev serves it at /rpc." }),
|
|
43
|
+
source: Schema.optionalKey(SnapshotId.annotate({ description: "The snapshot it was branched from." })),
|
|
44
|
+
status: EnvironmentStatus,
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
type LocalEnvironment = typeof LocalEnvironment.Type;
|
|
48
|
+
|
|
49
|
+
const SnapshotStatus = Schema.Literals(["Pending", "Ready", "Failed", "Retired"]).annotate({
|
|
50
|
+
description:
|
|
51
|
+
"Pending: akter dev serving the environment takes it next. Ready: it holds the environment's data as of takenAt. Failed: reason says why. Retired: it was deleted.",
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
/** A named snapshot of one local environment: each actor's database and the environment's files. */
|
|
55
|
+
const LocalSnapshot = Schema.Struct({
|
|
56
|
+
createdAt: Schema.DateTimeUtcFromString,
|
|
57
|
+
environment: EnvironmentName,
|
|
58
|
+
id: SnapshotId,
|
|
59
|
+
name: SnapshotName,
|
|
60
|
+
reason: Schema.optionalKey(Schema.String),
|
|
61
|
+
sizeBytes: Schema.optionalKey(Schema.Int),
|
|
62
|
+
status: SnapshotStatus,
|
|
63
|
+
takenAt: Schema.optionalKey(Schema.DateTimeUtcFromString),
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
type LocalSnapshot = typeof LocalSnapshot.Type;
|
|
67
|
+
|
|
68
|
+
const LocalResource = Schema.Literals(["environment", "snapshot"]);
|
|
69
|
+
|
|
70
|
+
/** What a promote did: which environment serves now, which served before, and what that leaves behind. */
|
|
71
|
+
const Promotion = Schema.Struct({
|
|
72
|
+
environment: EnvironmentName,
|
|
73
|
+
notice: Schema.String,
|
|
74
|
+
previous: Schema.optionalKey(EnvironmentName),
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
type Promotion = typeof Promotion.Type;
|
|
78
|
+
|
|
79
|
+
export { EnvironmentName, LocalEnvironment, LocalResource, LocalSnapshot, Promotion, SnapshotId, SnapshotName };
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { Array as Arr, Clock, Context, Effect, FileSystem, Option, Path } from "effect";
|
|
2
|
+
import type { Scope } from "effect";
|
|
3
|
+
import type { SqlClient, SqlError } from "effect/sql";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
environmentRow,
|
|
7
|
+
environmentRows,
|
|
8
|
+
environmentsFolder,
|
|
9
|
+
firstEnvironment,
|
|
10
|
+
insertBranch,
|
|
11
|
+
markPromoted,
|
|
12
|
+
prepareRecords,
|
|
13
|
+
recordFile,
|
|
14
|
+
retireEnvironment,
|
|
15
|
+
servingRow,
|
|
16
|
+
snapshotById,
|
|
17
|
+
} from "./environment-records.sql.js";
|
|
18
|
+
import type { EnvironmentRow } from "./environment-records.sql.js";
|
|
19
|
+
import { AlreadyExistsError } from "./environment-already-exists.errors.js";
|
|
20
|
+
import { InUseError } from "./environment-in-use.errors.js";
|
|
21
|
+
import { environmentOf, readyEnvironment, recordedEnvironment, stored } from "./environment-store.sql.js";
|
|
22
|
+
import type { Failure, Hosting, Store } from "./environment-store.sql.js";
|
|
23
|
+
import { EnvironmentName } from "./local-environment.schema.js";
|
|
24
|
+
import type { LocalEnvironment, Promotion, SnapshotName } from "./local-environment.schema.js";
|
|
25
|
+
import { alreadyServing, promotionNotice } from "./promotion-notice.pure.js";
|
|
26
|
+
import {
|
|
27
|
+
createSnapshot,
|
|
28
|
+
deleteSnapshot,
|
|
29
|
+
getSnapshot,
|
|
30
|
+
listSnapshots,
|
|
31
|
+
snapshotDirectory,
|
|
32
|
+
} from "./snapshot-operations.sql.js";
|
|
33
|
+
|
|
34
|
+
interface Branching {
|
|
35
|
+
/** The environment the snapshot is of; the serving one when missing. */
|
|
36
|
+
readonly from?: EnvironmentName | undefined;
|
|
37
|
+
readonly name: EnvironmentName;
|
|
38
|
+
readonly snapshot: SnapshotName;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
type Operation<Input, Value> = (input: Input) => Effect.Effect<Value, Failure>;
|
|
42
|
+
|
|
43
|
+
const partial = ".partial";
|
|
44
|
+
|
|
45
|
+
const neverServed = 0;
|
|
46
|
+
|
|
47
|
+
const removal = { force: true, recursive: true } as const;
|
|
48
|
+
|
|
49
|
+
const describedBy = (store: Store): ((row: EnvironmentRow) => Effect.Effect<LocalEnvironment, SqlError.SqlError>) =>
|
|
50
|
+
Effect.fnUntraced(function* described(row: EnvironmentRow) {
|
|
51
|
+
const serving = yield* servingRow(store);
|
|
52
|
+
|
|
53
|
+
return environmentOf({ ...store, serving: serving.environment })(row);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
const listEnvironments = (store: Store): Effect.Effect<readonly LocalEnvironment[], Failure> =>
|
|
57
|
+
stored(store)(
|
|
58
|
+
Effect.gen(function* listingEnvironments() {
|
|
59
|
+
const serving = yield* servingRow(store);
|
|
60
|
+
const rows = yield* environmentRows(store);
|
|
61
|
+
|
|
62
|
+
return Arr.map(rows, environmentOf({ ...store, serving: serving.environment }));
|
|
63
|
+
}),
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
const getEnvironment =
|
|
67
|
+
(store: Store): Operation<EnvironmentName, LocalEnvironment> =>
|
|
68
|
+
(name) =>
|
|
69
|
+
stored(store)(Effect.flatMap(recordedEnvironment(store, name), describedBy(store)));
|
|
70
|
+
|
|
71
|
+
const unusedName = Effect.fnUntraced(function* unusedName(store: Store, name: EnvironmentName) {
|
|
72
|
+
const taken = yield* environmentRow({ name, sql: store.sql });
|
|
73
|
+
|
|
74
|
+
if (Option.isSome(taken)) {
|
|
75
|
+
return yield* AlreadyExistsError.make({ key: name, resource: "environment" });
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return name;
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// The Ready snapshot a branch copies.
|
|
82
|
+
const branchSource = Effect.fnUntraced(function* branchSource(store: Store, { from, name, snapshot }: Branching) {
|
|
83
|
+
yield* unusedName(store, name);
|
|
84
|
+
|
|
85
|
+
const found = yield* getSnapshot(store)({ environment: from, name: snapshot });
|
|
86
|
+
|
|
87
|
+
if (found.status !== "Ready") {
|
|
88
|
+
return yield* InUseError.make({ key: snapshot, reason: "snapshotNotReady" });
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return found;
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
// Copies the snapshot beside the branch's directory, then renames it into place.
|
|
95
|
+
const copied = Effect.fnUntraced(function* copied(store: Store, source: string, target: string) {
|
|
96
|
+
const staging = `${target}${partial}`;
|
|
97
|
+
|
|
98
|
+
yield* store.fileSystem.remove(staging, removal);
|
|
99
|
+
yield* store.fileSystem.copy(source, staging);
|
|
100
|
+
yield* store.fileSystem.rename(staging, target);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Branches a new environment from a snapshot: a copy of the snapshot's store in a directory of its own, quiet until
|
|
105
|
+
* it is promoted, so it serves calls but fires no timer, delivers no message and runs no job. Its copy appears by one
|
|
106
|
+
* rename, so nothing reads a partial branch.
|
|
107
|
+
*/
|
|
108
|
+
const branch =
|
|
109
|
+
(store: Store): Operation<Branching, LocalEnvironment> =>
|
|
110
|
+
(branching) =>
|
|
111
|
+
stored(store)(
|
|
112
|
+
Effect.gen(function* branchingEnvironment() {
|
|
113
|
+
const source = yield* branchSource(store, branching);
|
|
114
|
+
const relative = store.path.join(environmentsFolder, branching.name);
|
|
115
|
+
const target = store.path.join(store.directory, relative);
|
|
116
|
+
|
|
117
|
+
yield* copied(store, snapshotDirectory(store)(source.id), target);
|
|
118
|
+
|
|
119
|
+
const now = yield* Clock.currentTimeMillis;
|
|
120
|
+
const recorded = { directory: relative, name: branching.name, now, source: source.id, sql: store.sql };
|
|
121
|
+
const insert = Effect.andThen(unusedName(store, branching.name), insertBranch(recorded));
|
|
122
|
+
|
|
123
|
+
yield* Effect.tapError(store.sql.withTransaction(insert), () => store.fileSystem.remove(target, removal));
|
|
124
|
+
|
|
125
|
+
return yield* getEnvironment(store)(branching.name);
|
|
126
|
+
}),
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
// The snapshot a never-served branch came from, as its promote names it.
|
|
130
|
+
const originOf = Effect.fnUntraced(function* originOf(store: Store, row: EnvironmentRow) {
|
|
131
|
+
const source = Option.filter(Option.fromNullishOr(row.source), () => row.served === neverServed);
|
|
132
|
+
const found = yield* Effect.forEach(Option.toArray(source), (id) => snapshotById({ id, sql: store.sql }));
|
|
133
|
+
|
|
134
|
+
return Option.map(Option.flatten(Arr.head(found)), (snapshot) => ({
|
|
135
|
+
environment: snapshot.environment,
|
|
136
|
+
id: snapshot.id,
|
|
137
|
+
name: snapshot.name,
|
|
138
|
+
takenAt: Option.fromNullishOr(snapshot.taken_at),
|
|
139
|
+
}));
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
const promotionOf = (environment: EnvironmentName, notice: string, previous: Option.Option<string>): Promotion =>
|
|
143
|
+
Option.match(previous, {
|
|
144
|
+
onNone: () => ({ environment, notice }),
|
|
145
|
+
onSome: (before) => ({ environment, notice, previous: EnvironmentName.make(before) }),
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
const promoted = Effect.fnUntraced(function* promoted(store: Store, name: EnvironmentName) {
|
|
149
|
+
const row = yield* readyEnvironment(store, name);
|
|
150
|
+
const serving = yield* servingRow(store);
|
|
151
|
+
const previous = Option.fromNullishOr(serving.previous);
|
|
152
|
+
|
|
153
|
+
if (serving.environment === row.name) {
|
|
154
|
+
return promotionOf(name, serving.notice ?? alreadyServing(name), previous);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const origin = yield* originOf(store, row);
|
|
158
|
+
const notice = promotionNotice({ environment: name, origin, previous: serving.environment });
|
|
159
|
+
|
|
160
|
+
yield* markPromoted({ environment: name, notice, previous: serving.environment, sql: store.sql });
|
|
161
|
+
|
|
162
|
+
return promotionOf(name, notice, Option.some(serving.environment));
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Promotes an environment: akter dev serves it in place of the one that served, which turns quiet and is kept as it
|
|
167
|
+
* was. Its held work runs: jobs resume from its journal and due timers fire. Promoting the environment that already
|
|
168
|
+
* serves changes nothing and answers what its promote answered.
|
|
169
|
+
*/
|
|
170
|
+
const promote =
|
|
171
|
+
(store: Store): Operation<EnvironmentName, Promotion> =>
|
|
172
|
+
(name) =>
|
|
173
|
+
stored(store)(
|
|
174
|
+
Effect.gen(function* promoting() {
|
|
175
|
+
const promotion = yield* store.sql.withTransaction(promoted(store, name));
|
|
176
|
+
|
|
177
|
+
yield* store.hosting.apply;
|
|
178
|
+
|
|
179
|
+
return promotion;
|
|
180
|
+
}),
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
const deletable = Effect.fnUntraced(function* deletable(store: Store, name: EnvironmentName) {
|
|
184
|
+
const row = yield* readyEnvironment(store, name);
|
|
185
|
+
const serving = yield* servingRow(store);
|
|
186
|
+
|
|
187
|
+
if (row.name === firstEnvironment) {
|
|
188
|
+
return yield* InUseError.make({ key: name, reason: "environmentIsTheDataDirectory" });
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (row.name === serving.environment) {
|
|
192
|
+
return yield* InUseError.make({ key: name, reason: "environmentServing" });
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
return row;
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
/** Deletes an environment that doesn't serve: its store is removed, and it is kept as Retired, holding its name. */
|
|
199
|
+
const deleteEnvironment =
|
|
200
|
+
(store: Store): Operation<EnvironmentName, LocalEnvironment> =>
|
|
201
|
+
(name) =>
|
|
202
|
+
stored(store)(
|
|
203
|
+
Effect.gen(function* deletingEnvironment() {
|
|
204
|
+
const retire = Effect.tap(deletable(store, name), () => retireEnvironment({ name, sql: store.sql }));
|
|
205
|
+
const row = yield* store.sql.withTransaction(retire);
|
|
206
|
+
|
|
207
|
+
yield* store.fileSystem.remove(store.path.resolve(store.directory, row.directory), removal);
|
|
208
|
+
|
|
209
|
+
return yield* getEnvironment(store)(name);
|
|
210
|
+
}),
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
interface StoreOpening {
|
|
214
|
+
readonly directory: string;
|
|
215
|
+
readonly hosting: Hosting;
|
|
216
|
+
readonly open: (filename: string) => Effect.Effect<SqlClient.SqlClient, SqlError.SqlError, Scope.Scope>;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/** Opens a data directory's environments on its record, `environments.db`, which it creates when missing. */
|
|
220
|
+
const openStore = Effect.fnUntraced(function* openStore({ directory, hosting, open }: StoreOpening) {
|
|
221
|
+
const fileSystem = yield* FileSystem.FileSystem;
|
|
222
|
+
const path = yield* Path.Path;
|
|
223
|
+
|
|
224
|
+
yield* fileSystem.makeDirectory(directory, { recursive: true });
|
|
225
|
+
|
|
226
|
+
const sql = yield* open(path.join(directory, recordFile));
|
|
227
|
+
const now = yield* Clock.currentTimeMillis;
|
|
228
|
+
|
|
229
|
+
yield* prepareRecords({ now, sql });
|
|
230
|
+
|
|
231
|
+
return { directory, fileSystem, hosting, path, sql };
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
interface Operations {
|
|
235
|
+
readonly branch: Operation<Branching, LocalEnvironment>;
|
|
236
|
+
readonly createSnapshot: ReturnType<typeof createSnapshot>;
|
|
237
|
+
readonly deleteEnvironment: Operation<EnvironmentName, LocalEnvironment>;
|
|
238
|
+
readonly deleteSnapshot: ReturnType<typeof deleteSnapshot>;
|
|
239
|
+
readonly environment: Operation<EnvironmentName, LocalEnvironment>;
|
|
240
|
+
readonly environments: Effect.Effect<readonly LocalEnvironment[], Failure>;
|
|
241
|
+
readonly promote: Operation<EnvironmentName, Promotion>;
|
|
242
|
+
readonly snapshot: ReturnType<typeof getSnapshot>;
|
|
243
|
+
readonly snapshots: ReturnType<typeof listSnapshots>;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* The environments and snapshots of one data directory, named as Akter Cloud's environments and snapshots groups:
|
|
248
|
+
* snapshot an environment, branch a quiet environment from a snapshot, promote it to serve, and promote back.
|
|
249
|
+
*/
|
|
250
|
+
export class LocalEnvironments extends Context.Service<LocalEnvironments, Operations>()(
|
|
251
|
+
"@akterjs/effect/serve/environment/local-environments.service/LocalEnvironments",
|
|
252
|
+
) {
|
|
253
|
+
public static readonly openStore = openStore;
|
|
254
|
+
|
|
255
|
+
public static readonly on = (store: Store): Operations => ({
|
|
256
|
+
branch: branch(store),
|
|
257
|
+
createSnapshot: createSnapshot(store),
|
|
258
|
+
deleteEnvironment: deleteEnvironment(store),
|
|
259
|
+
deleteSnapshot: deleteSnapshot(store),
|
|
260
|
+
environment: getEnvironment(store),
|
|
261
|
+
environments: listEnvironments(store),
|
|
262
|
+
promote: promote(store),
|
|
263
|
+
snapshot: getSnapshot(store),
|
|
264
|
+
snapshots: listSnapshots(store),
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
export type { Branching };
|