@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,136 @@
|
|
|
1
|
+
import { jobAddress } from "../../contract/job/job-id.pure.mjs";
|
|
2
|
+
import { readStored, storeExit, storedExit, writeStored } from "./job-journal.sql.mjs";
|
|
3
|
+
import { resume, trackedClock } from "./job-runs.pure.mjs";
|
|
4
|
+
import { Array, Clock, Deferred, Duration, Effect, Exit, FiberMap, MutableHashMap, Option } from "effect";
|
|
5
|
+
import { WorkflowEngine } from "effect/workflow";
|
|
6
|
+
// src/host/job/job-durables.sql.ts
|
|
7
|
+
const noWait = 0;
|
|
8
|
+
const located = (engine, executionId) => Option.match(jobAddress(executionId), {
|
|
9
|
+
onNone: () => Effect.die(`${executionId} is not an Akter job id: start jobs with Akter.start in a command`),
|
|
10
|
+
onSome: (address) => Effect.flatMap(Deferred.await(engine.locator), (locate) => locate(address))
|
|
11
|
+
});
|
|
12
|
+
const storeOf = ({ engine, executionId }) => Effect.suspend(() => Option.match(MutableHashMap.get(engine.executions, executionId), {
|
|
13
|
+
onNone: () => Effect.orDie(located(engine, executionId)),
|
|
14
|
+
onSome: (running) => Effect.succeed(running.store)
|
|
15
|
+
}));
|
|
16
|
+
const executionOf = (engine) => WorkflowEngine.WorkflowInstance.use((instance) => Option.match(MutableHashMap.get(engine.executions, instance.executionId), {
|
|
17
|
+
onNone: () => Effect.die(`job ${instance.executionId} is not running here`),
|
|
18
|
+
onSome: Effect.succeed
|
|
19
|
+
}));
|
|
20
|
+
const isCurrent = (executionId) => Effect.map(Effect.serviceOption(WorkflowEngine.WorkflowInstance), (current) => Option.exists(current, (instance) => instance.executionId === executionId));
|
|
21
|
+
const wakeDeferred = (engine, { deferredName, executionId }) => Effect.gen(function* waking() {
|
|
22
|
+
const wake = Effect.andThen(engine.deferreds.deferredDone(executionId, deferredName), resume({
|
|
23
|
+
executionId,
|
|
24
|
+
mode: "automatic",
|
|
25
|
+
runs: engine
|
|
26
|
+
}));
|
|
27
|
+
if (yield* isCurrent(executionId)) return yield* Effect.asVoid(Effect.forkIn(wake, engine.scope));
|
|
28
|
+
return yield* wake;
|
|
29
|
+
});
|
|
30
|
+
const completed = (engine, store, done) => store.authority(Effect.gen(function* completeWhileOwned() {
|
|
31
|
+
const { executionId, exit } = done;
|
|
32
|
+
const entry = `deferred/${done.deferredName}`;
|
|
33
|
+
const found = yield* readStored({
|
|
34
|
+
entry,
|
|
35
|
+
executionId,
|
|
36
|
+
store
|
|
37
|
+
});
|
|
38
|
+
if (Option.isNone(found)) {
|
|
39
|
+
yield* storeExit({
|
|
40
|
+
entry,
|
|
41
|
+
executionId,
|
|
42
|
+
exit,
|
|
43
|
+
store
|
|
44
|
+
});
|
|
45
|
+
yield* wakeDeferred(engine, done);
|
|
46
|
+
}
|
|
47
|
+
}));
|
|
48
|
+
/**
|
|
49
|
+
* A signal comes from outside the job, so it locates the actor's current session and keeps it resident until the
|
|
50
|
+
* result is stored, instead of trusting the store a running execution was started with, whose session can close
|
|
51
|
+
* between the lookup and the write. `deferredDone` has no error channel, so a signal this host can't deliver dies
|
|
52
|
+
* with the locator's `ActorUnavailableError`, which names the actor and what to do.
|
|
53
|
+
*/
|
|
54
|
+
const doneDeferred = (engine) => (done) => {
|
|
55
|
+
const store = Effect.orDie(located(engine, done.executionId));
|
|
56
|
+
return Effect.scoped(Effect.flatMap(store, (found) => completed(engine, found, done)));
|
|
57
|
+
};
|
|
58
|
+
/** A clock fires inside its own session, which interrupts it on close, so it completes on that session's store. */
|
|
59
|
+
const fireClock = (engine, store, { clock, executionId }) => completed(engine, store, {
|
|
60
|
+
deferredName: clock.deferred.name,
|
|
61
|
+
executionId,
|
|
62
|
+
exit: Exit.void
|
|
63
|
+
});
|
|
64
|
+
const clockDue = (clocked, store) => Effect.gen(function* dueAt() {
|
|
65
|
+
const { clock, executionId } = clocked;
|
|
66
|
+
const now = yield* Clock.currentTimeMillis;
|
|
67
|
+
const entry = `clock/${clock.name}`;
|
|
68
|
+
const planned = String(now + Duration.toMillis(clock.duration));
|
|
69
|
+
yield* writeStored({
|
|
70
|
+
entry,
|
|
71
|
+
executionId,
|
|
72
|
+
store,
|
|
73
|
+
value: planned
|
|
74
|
+
});
|
|
75
|
+
const stored = yield* readStored({
|
|
76
|
+
entry,
|
|
77
|
+
executionId,
|
|
78
|
+
store
|
|
79
|
+
});
|
|
80
|
+
return {
|
|
81
|
+
at: Number(Option.getOrElse(stored, () => planned)),
|
|
82
|
+
now
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
const scheduleClock = (engine) => (_workflow, clocked) => Effect.gen(function* scheduling() {
|
|
86
|
+
const { clock, executionId } = clocked;
|
|
87
|
+
const store = yield* storeOf({
|
|
88
|
+
engine,
|
|
89
|
+
executionId
|
|
90
|
+
});
|
|
91
|
+
const fired = yield* readStored({
|
|
92
|
+
entry: `deferred/${clock.deferred.name}`,
|
|
93
|
+
executionId,
|
|
94
|
+
store
|
|
95
|
+
});
|
|
96
|
+
if (Option.isSome(fired)) return;
|
|
97
|
+
const { at, now } = yield* clockDue(clocked, store);
|
|
98
|
+
const delay = Duration.millis(Math.max(at - now, noWait));
|
|
99
|
+
const firing = store.authority(Effect.delay(fireClock(engine, store, clocked), delay));
|
|
100
|
+
const key = yield* trackedClock({
|
|
101
|
+
executionId,
|
|
102
|
+
name: clock.name,
|
|
103
|
+
runs: engine
|
|
104
|
+
});
|
|
105
|
+
yield* FiberMap.run(engine.clocks, key, firing, { onlyIfMissing: true });
|
|
106
|
+
}).pipe(Effect.scoped);
|
|
107
|
+
const deferredResult = (engine) => (deferred) => Effect.flatMap(executionOf(engine), (execution) => execution.store.authority(storedExit({
|
|
108
|
+
entry: `deferred/${deferred.name}`,
|
|
109
|
+
executionId: execution.executionId,
|
|
110
|
+
store: execution.store
|
|
111
|
+
})).pipe(Effect.tap((found) => Effect.sync(() => {
|
|
112
|
+
if (Option.isNone(found)) execution.waiting.add(deferred.name);
|
|
113
|
+
}))));
|
|
114
|
+
/**
|
|
115
|
+
* Wakes this store's runs that wait on a deferred a committed command has since stored a result for (`Akter.signal`
|
|
116
|
+
* writes it with the command), once the command commits. Only the deferreds a run found empty are checked.
|
|
117
|
+
*/
|
|
118
|
+
const wakeSignalled = ({ engine, store }) => Effect.suspend(() => {
|
|
119
|
+
const waiting = Array.flatMap(Array.fromIterable(engine.owned.get(store) ?? []), ({ executionId, waiting: names }) => Array.map(Array.fromIterable(names), (deferredName) => ({
|
|
120
|
+
deferredName,
|
|
121
|
+
executionId
|
|
122
|
+
})));
|
|
123
|
+
return Effect.forEach(waiting, ({ deferredName, executionId }) => Effect.flatMap(readStored({
|
|
124
|
+
entry: `deferred/${deferredName}`,
|
|
125
|
+
executionId,
|
|
126
|
+
store
|
|
127
|
+
}), (found) => {
|
|
128
|
+
if (Option.isNone(found)) return Effect.void;
|
|
129
|
+
return wakeDeferred(engine, {
|
|
130
|
+
deferredName,
|
|
131
|
+
executionId,
|
|
132
|
+
exit: Exit.void
|
|
133
|
+
});
|
|
134
|
+
}), { discard: true });
|
|
135
|
+
});
|
|
136
|
+
export { deferredResult, doneDeferred, executionOf, scheduleClock, storeOf, wakeSignalled };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { JobStore, Parked } from "./job-runs.pure.mjs";
|
|
2
|
+
import { Locate } from "./job-durables.sql.mjs";
|
|
3
|
+
import { Context, Effect, Layer, Option } from "effect";
|
|
4
|
+
import { WorkflowEngine } from "effect/workflow";
|
|
5
|
+
interface JobEngineService {
|
|
6
|
+
readonly bind: (locate: Locate) => Effect.Effect<void>;
|
|
7
|
+
/**
|
|
8
|
+
* When the oldest activity executing now in this session's jobs started; none while every job is waiting, suspended
|
|
9
|
+
* or between steps.
|
|
10
|
+
*/
|
|
11
|
+
readonly busySince: (store: JobStore) => Effect.Effect<Option.Option<number>>;
|
|
12
|
+
/** Stops and forgets the jobs running on a closing session; the next session's start replays them from the journal. */
|
|
13
|
+
readonly detach: (store: JobStore) => Effect.Effect<void>;
|
|
14
|
+
readonly drain: (store: JobStore) => Effect.Effect<boolean>;
|
|
15
|
+
readonly engine: WorkflowEngine.WorkflowEngine["Service"];
|
|
16
|
+
/**
|
|
17
|
+
* This session's jobs with nothing to run now: those that wait on a signal or a clock, until one is stored, and those
|
|
18
|
+
* whose activity executes, with no waits, until it ends. The session is busy while an activity executes.
|
|
19
|
+
*/
|
|
20
|
+
readonly parked: (store: JobStore) => Effect.Effect<readonly Parked[]>;
|
|
21
|
+
/** Jobs held in memory: those running or suspended on an open session. Finished jobs answer from the journal. */
|
|
22
|
+
readonly retained: Effect.Effect<number>;
|
|
23
|
+
readonly start: (store: JobStore) => Effect.Effect<void>;
|
|
24
|
+
}
|
|
25
|
+
declare const JobEngine_base: Context.ServiceClass<JobEngine, "@akterjs/effect/host/job/job-engine.adapter/JobEngine", JobEngineService> & {
|
|
26
|
+
readonly make: Effect.Effect<JobEngineService, never, import("effect/Scope").Scope>;
|
|
27
|
+
};
|
|
28
|
+
export declare class JobEngine extends JobEngine_base {
|
|
29
|
+
static readonly layer: Layer.Layer<JobEngine, never, never>;
|
|
30
|
+
static readonly layerShared: Layer.Layer<JobEngine, never, never>;
|
|
31
|
+
static readonly layerWorkflow: Layer.Layer<JobEngine | WorkflowEngine.WorkflowEngine, never, never>;
|
|
32
|
+
}
|
|
33
|
+
export type { JobStore, Parked };
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { completedRun, decodePayload, openJobs, storeExit, storeResult, storedExit } from "./job-journal.sql.mjs";
|
|
2
|
+
import { awaitRun, detachStore, lastExit, nameOf, parkedOn, resume, settled, startExecution } from "./job-runs.pure.mjs";
|
|
3
|
+
import { deferredResult, doneDeferred, executionOf, scheduleClock, storeOf, wakeSignalled } from "./job-durables.sql.mjs";
|
|
4
|
+
import { Array, Cause, Clock, Context, Deferred, Effect, Exit, Fiber, FiberMap, Layer, MutableHashMap, Option, Predicate, Ref } from "effect";
|
|
5
|
+
import { Workflow, WorkflowEngine } from "effect/workflow";
|
|
6
|
+
// src/host/job/job-engine.adapter.ts
|
|
7
|
+
const completed = (polling) => polling.store.authority(completedRun(polling));
|
|
8
|
+
const startStored = (engine, { job, store }) => Effect.suspend(() => {
|
|
9
|
+
const entry = MutableHashMap.get(engine.registered, job.job);
|
|
10
|
+
if (Option.isNone(entry)) {
|
|
11
|
+
MutableHashMap.set(engine.waiting, job.id, {
|
|
12
|
+
job,
|
|
13
|
+
store
|
|
14
|
+
});
|
|
15
|
+
return Effect.void;
|
|
16
|
+
}
|
|
17
|
+
const { workflow } = entry.value;
|
|
18
|
+
MutableHashMap.remove(engine.waiting, job.id);
|
|
19
|
+
return Effect.flatMap(decodePayload({
|
|
20
|
+
text: job.payload,
|
|
21
|
+
workflow
|
|
22
|
+
}), (payload) => startExecution({
|
|
23
|
+
executionId: job.id,
|
|
24
|
+
payload,
|
|
25
|
+
runs: engine,
|
|
26
|
+
store,
|
|
27
|
+
workflow
|
|
28
|
+
}));
|
|
29
|
+
});
|
|
30
|
+
const startOpen = (engine, store) => Effect.suspend(() => {
|
|
31
|
+
if (engine.detached.has(store)) return Effect.void;
|
|
32
|
+
return Clock.currentTimeMillis.pipe(Effect.flatMap((now) => store.withSql((sql) => store.exclusive(openJobs({
|
|
33
|
+
now,
|
|
34
|
+
sql
|
|
35
|
+
})))), Effect.orDie, Effect.flatMap((jobs) => Effect.forEach(Array.filter(jobs, (job) => !MutableHashMap.has(engine.executions, job.id)), (job) => startStored(engine, {
|
|
36
|
+
job,
|
|
37
|
+
store
|
|
38
|
+
}), { discard: true })), Effect.andThen(wakeSignalled({
|
|
39
|
+
engine,
|
|
40
|
+
store
|
|
41
|
+
})));
|
|
42
|
+
});
|
|
43
|
+
const register = (engine) => Effect.fnUntraced(function* registering(workflow, execute) {
|
|
44
|
+
const name = nameOf(workflow);
|
|
45
|
+
MutableHashMap.set(engine.registered, name, {
|
|
46
|
+
execute,
|
|
47
|
+
scope: yield* Effect.scope,
|
|
48
|
+
workflow
|
|
49
|
+
});
|
|
50
|
+
const waiting = Array.filter(Array.fromIterable(MutableHashMap.values(engine.waiting)), ({ job }) => job.job === name);
|
|
51
|
+
yield* Effect.forEach(waiting, (found) => startStored(engine, found), { discard: true });
|
|
52
|
+
});
|
|
53
|
+
const oneActivity = 1;
|
|
54
|
+
const isInterruptOnly = (result) => Predicate.isTagged(result, "Suspended") || Exit.isFailure(result.exit) && Cause.hasInterruptsOnly(result.exit.cause);
|
|
55
|
+
const runActivity = ({ executeEncoded }, instance) => {
|
|
56
|
+
const running = WorkflowEngine.WorkflowInstance.initial(instance.workflow, instance.executionId);
|
|
57
|
+
running.interrupted = instance.interrupted;
|
|
58
|
+
return executeEncoded.pipe(Workflow.intoResult, Effect.provideService(WorkflowEngine.WorkflowInstance, running));
|
|
59
|
+
};
|
|
60
|
+
const recordActivity = (activity, attempt, execution) => Effect.gen(function* recording() {
|
|
61
|
+
const stored = {
|
|
62
|
+
entry: `activity/${activity.name}/${attempt}`,
|
|
63
|
+
executionId: execution.executionId,
|
|
64
|
+
store: execution.store
|
|
65
|
+
};
|
|
66
|
+
const result = yield* runActivity(activity, execution.instance);
|
|
67
|
+
if (!isInterruptOnly(result) && Predicate.isTagged(result, "Complete")) yield* storeExit({
|
|
68
|
+
...stored,
|
|
69
|
+
exit: result.exit
|
|
70
|
+
});
|
|
71
|
+
return result;
|
|
72
|
+
});
|
|
73
|
+
/** Records an activity's start on its run while it executes, so the session's `busySince` reads it. */
|
|
74
|
+
const inFlight = (execution) => (effect) => Effect.acquireUseRelease(Effect.tap(Clock.currentTimeMillis, (started) => Effect.sync(() => execution.activities.push(started))), () => effect, (started) => Effect.sync(() => {
|
|
75
|
+
execution.activities.splice(execution.activities.indexOf(started), oneActivity);
|
|
76
|
+
}));
|
|
77
|
+
/** When the oldest activity executing in the session's jobs started, if any is. */
|
|
78
|
+
const busySince = (engine) => (store) => Effect.sync(() => {
|
|
79
|
+
const runs = Array.fromIterable(engine.owned.get(store) ?? []);
|
|
80
|
+
return Array.reduce(Array.flatMap(runs, (run) => run.activities), Option.none(), (oldest, started) => Option.some(Option.match(oldest, {
|
|
81
|
+
onNone: () => started,
|
|
82
|
+
onSome: (at) => Math.min(at, started)
|
|
83
|
+
})));
|
|
84
|
+
});
|
|
85
|
+
const noWaits = [];
|
|
86
|
+
/**
|
|
87
|
+
* A run whose activity executes now has nothing to run until the activity ends, and its end continues the run in
|
|
88
|
+
* memory. Counting it as due would report it due now on every kick for as long as the activity runs.
|
|
89
|
+
*/
|
|
90
|
+
const activityRunning = (run) => Option.liftPredicate(noWaits, () => Array.isReadonlyArrayNonEmpty(run.activities));
|
|
91
|
+
const parked = (engine) => (store) => Effect.sync(() => {
|
|
92
|
+
const runs = Array.fromIterable(engine.owned.get(store) ?? []);
|
|
93
|
+
return Array.getSomes(Array.map(runs, (run) => Option.map(Option.orElse(parkedOn(run), () => activityRunning(run)), (waits) => ({
|
|
94
|
+
id: run.executionId,
|
|
95
|
+
waits
|
|
96
|
+
}))));
|
|
97
|
+
});
|
|
98
|
+
const activityExecute = (engine) => (activity, attempt) => Effect.gen(function* executingActivity() {
|
|
99
|
+
const instance = yield* WorkflowEngine.WorkflowInstance;
|
|
100
|
+
const execution = yield* executionOf(engine);
|
|
101
|
+
return yield* execution.store.authority(Effect.gen(function* activityWhileOwned() {
|
|
102
|
+
const entry = `activity/${activity.name}/${attempt}`;
|
|
103
|
+
const found = yield* storedExit({
|
|
104
|
+
entry,
|
|
105
|
+
executionId: instance.executionId,
|
|
106
|
+
store: execution.store
|
|
107
|
+
});
|
|
108
|
+
if (Option.isSome(found)) return new Workflow.Complete({ exit: found.value });
|
|
109
|
+
if (execution.interrupted && !instance.interrupted) return Workflow.Suspended.make({});
|
|
110
|
+
return yield* recordActivity(activity, attempt, {
|
|
111
|
+
...execution,
|
|
112
|
+
instance
|
|
113
|
+
}).pipe(inFlight(execution));
|
|
114
|
+
}));
|
|
115
|
+
});
|
|
116
|
+
/** A finished job is no longer in memory, so starting it again answers from its journaled result instead of rerunning it. */
|
|
117
|
+
const startUnfinished = (engine, starting) => Effect.suspend(() => {
|
|
118
|
+
if (MutableHashMap.has(engine.executions, starting.executionId)) return Effect.void;
|
|
119
|
+
return Effect.flatMap(completed(starting), Option.match({
|
|
120
|
+
onNone: () => starting.store.authority(startExecution({
|
|
121
|
+
...starting,
|
|
122
|
+
runs: engine
|
|
123
|
+
})),
|
|
124
|
+
onSome: () => Effect.void
|
|
125
|
+
}));
|
|
126
|
+
});
|
|
127
|
+
const poll = (engine) => (workflow, executionId) => Effect.suspend(() => Option.match(Option.flatMap(MutableHashMap.get(engine.executions, executionId), lastExit), {
|
|
128
|
+
onNone: () => Effect.flatMap(storeOf({
|
|
129
|
+
engine,
|
|
130
|
+
executionId
|
|
131
|
+
}), (store) => completed({
|
|
132
|
+
executionId,
|
|
133
|
+
store,
|
|
134
|
+
workflow
|
|
135
|
+
})),
|
|
136
|
+
onSome: (exit) => Effect.flatMap(storeOf({
|
|
137
|
+
engine,
|
|
138
|
+
executionId
|
|
139
|
+
}), (store) => store.authority(Effect.asSome(exit)))
|
|
140
|
+
})).pipe(Effect.scoped);
|
|
141
|
+
function executeWith(engine, workflow, options) {
|
|
142
|
+
return Effect.gen(function* executing() {
|
|
143
|
+
const { discard, executionId, parent, payload } = options;
|
|
144
|
+
if (Predicate.isNotUndefined(parent)) return yield* Effect.die(`${nameOf(workflow)}: a job can't start another job; start it from a command with Akter.start`);
|
|
145
|
+
const store = yield* storeOf({
|
|
146
|
+
engine,
|
|
147
|
+
executionId
|
|
148
|
+
});
|
|
149
|
+
const journaled = completed({
|
|
150
|
+
executionId,
|
|
151
|
+
store,
|
|
152
|
+
workflow
|
|
153
|
+
});
|
|
154
|
+
yield* startUnfinished(engine, {
|
|
155
|
+
executionId,
|
|
156
|
+
payload,
|
|
157
|
+
store,
|
|
158
|
+
workflow
|
|
159
|
+
});
|
|
160
|
+
if (discard) return yield* Effect.void;
|
|
161
|
+
return yield* Option.match(MutableHashMap.get(engine.executions, executionId), {
|
|
162
|
+
onNone: () => Effect.map(journaled, Option.getOrElse(() => Workflow.Suspended.make({}))),
|
|
163
|
+
onSome: (found) => store.authority(awaitRun(found))
|
|
164
|
+
});
|
|
165
|
+
}).pipe(Effect.scoped);
|
|
166
|
+
}
|
|
167
|
+
const interruptRun = (engine, execution, unsafe) => {
|
|
168
|
+
execution.interrupted = true;
|
|
169
|
+
execution.interruptedUnsafe ||= unsafe;
|
|
170
|
+
const wake = resume({
|
|
171
|
+
executionId: execution.executionId,
|
|
172
|
+
mode: "explicit",
|
|
173
|
+
runs: engine
|
|
174
|
+
});
|
|
175
|
+
if (unsafe && Option.isSome(execution.fiber)) return Effect.andThen(Fiber.interrupt(execution.fiber.value), wake);
|
|
176
|
+
return wake;
|
|
177
|
+
};
|
|
178
|
+
const interrupt = (engine, unsafe) => (_workflow, executionId) => Effect.suspend(() => Option.match(MutableHashMap.get(engine.executions, executionId), {
|
|
179
|
+
onNone: () => Effect.void,
|
|
180
|
+
onSome: (execution) => interruptRun(engine, execution, unsafe)
|
|
181
|
+
}));
|
|
182
|
+
const awaitComplete = (engine) => (_workflow, executionId) => Effect.suspend(() => Option.match(MutableHashMap.get(engine.executions, executionId), {
|
|
183
|
+
onNone: () => Effect.never,
|
|
184
|
+
onSome: (found) => found.store.authority(Deferred.await(found.done))
|
|
185
|
+
}));
|
|
186
|
+
const drain = (engine) => (store) => Effect.gen(function* draining() {
|
|
187
|
+
yield* startOpen(engine, store);
|
|
188
|
+
const mine = Array.fromIterable(engine.owned.get(store) ?? []);
|
|
189
|
+
const waited = yield* Effect.forEach(mine, settled);
|
|
190
|
+
return Array.some(waited, Boolean);
|
|
191
|
+
});
|
|
192
|
+
const encodedOf = (engine) => ({
|
|
193
|
+
activityExecute: activityExecute(engine),
|
|
194
|
+
awaitComplete: awaitComplete(engine),
|
|
195
|
+
deferredDone: doneDeferred(engine),
|
|
196
|
+
deferredResult: deferredResult(engine),
|
|
197
|
+
execute: (workflow, options) => executeWith(engine, workflow, options),
|
|
198
|
+
interrupt: interrupt(engine, false),
|
|
199
|
+
interruptUnsafe: interrupt(engine, true),
|
|
200
|
+
poll: poll(engine),
|
|
201
|
+
register: register(engine),
|
|
202
|
+
resume: (_workflow, executionId) => resume({
|
|
203
|
+
executionId,
|
|
204
|
+
mode: "explicit",
|
|
205
|
+
runs: engine
|
|
206
|
+
}),
|
|
207
|
+
scheduleClock: scheduleClock(engine)
|
|
208
|
+
});
|
|
209
|
+
const rebinding = Effect.fnUntraced(function* rebinding(locator) {
|
|
210
|
+
const latest = yield* Ref.make(() => Effect.die("no host has bound a job locator"));
|
|
211
|
+
const current = (address) => Effect.flatMap(Ref.get(latest), (locate) => locate(address));
|
|
212
|
+
return (locate) => Effect.andThen(Ref.set(latest, locate), Effect.asVoid(Deferred.succeed(locator, current)));
|
|
213
|
+
});
|
|
214
|
+
const makeEngine = Effect.gen(function* makeEngine() {
|
|
215
|
+
const engine = {
|
|
216
|
+
clocks: yield* FiberMap.make(),
|
|
217
|
+
deferreds: WorkflowEngine.makeDeferredState(),
|
|
218
|
+
detached: /* @__PURE__ */ new WeakSet(),
|
|
219
|
+
executions: MutableHashMap.empty(),
|
|
220
|
+
locator: yield* Deferred.make(),
|
|
221
|
+
owned: /* @__PURE__ */ new Map(),
|
|
222
|
+
record: ({ executionId, store, workflow }, exit) => store.authority(storeResult({
|
|
223
|
+
executionId,
|
|
224
|
+
exit,
|
|
225
|
+
store,
|
|
226
|
+
workflow
|
|
227
|
+
})),
|
|
228
|
+
registered: MutableHashMap.empty(),
|
|
229
|
+
scope: yield* Effect.scope,
|
|
230
|
+
waiting: MutableHashMap.empty(),
|
|
231
|
+
workflowEngine: yield* Deferred.make()
|
|
232
|
+
};
|
|
233
|
+
const workflowEngine = WorkflowEngine.makeUnsafe(encodedOf(engine));
|
|
234
|
+
const bind = yield* rebinding(engine.locator);
|
|
235
|
+
yield* Deferred.succeed(engine.workflowEngine, workflowEngine);
|
|
236
|
+
return {
|
|
237
|
+
bind,
|
|
238
|
+
busySince: busySince(engine),
|
|
239
|
+
detach: (store) => detachStore({
|
|
240
|
+
runs: engine,
|
|
241
|
+
store
|
|
242
|
+
}),
|
|
243
|
+
drain: drain(engine),
|
|
244
|
+
engine: workflowEngine,
|
|
245
|
+
parked: parked(engine),
|
|
246
|
+
retained: Effect.sync(() => MutableHashMap.size(engine.executions)),
|
|
247
|
+
start: (store) => startOpen(engine, store)
|
|
248
|
+
};
|
|
249
|
+
});
|
|
250
|
+
var JobEngine = class JobEngine extends Context.Service()("@akterjs/effect/host/job/job-engine.adapter/JobEngine", { make: makeEngine }) {
|
|
251
|
+
static layer = Layer.effect(this, this.make);
|
|
252
|
+
static layerShared = Layer.effect(this, Effect.flatMap(Effect.serviceOption(this), Option.match({
|
|
253
|
+
onNone: () => this.make,
|
|
254
|
+
onSome: Effect.succeed
|
|
255
|
+
})));
|
|
256
|
+
static layerWorkflow = Layer.effect(WorkflowEngine.WorkflowEngine, JobEngine.use((jobs) => Effect.succeed(jobs.engine))).pipe(Layer.provideMerge(JobEngine.layer));
|
|
257
|
+
};
|
|
258
|
+
export { JobEngine };
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { StartedJob } from "../../contract/job/started-job.schema.mjs";
|
|
2
|
+
import { JobSignal } from "../../contract/job/job-signal.schema.mjs";
|
|
3
|
+
import { JobStore, Payload, RunResult } from "./job-runs.pure.mjs";
|
|
4
|
+
import { Effect, Exit, Option } from "effect";
|
|
5
|
+
import { Workflow } from "effect/workflow";
|
|
6
|
+
import { SqlClient, SqlError } from "effect/sql";
|
|
7
|
+
type JournalStore = Pick<JobStore, "exclusive" | "finish" | "withSql">;
|
|
8
|
+
interface EntryAddress {
|
|
9
|
+
readonly entry: string;
|
|
10
|
+
readonly executionId: string;
|
|
11
|
+
readonly sql: SqlClient.SqlClient;
|
|
12
|
+
}
|
|
13
|
+
interface EntryWrite extends EntryAddress {
|
|
14
|
+
readonly value: string;
|
|
15
|
+
}
|
|
16
|
+
interface JobsWrite {
|
|
17
|
+
readonly jobs: readonly StartedJob[];
|
|
18
|
+
readonly sql: SqlClient.SqlClient;
|
|
19
|
+
}
|
|
20
|
+
interface SignalsWrite {
|
|
21
|
+
/** Absent from the outcome of an app built before Akter.signal, which signals nothing. */
|
|
22
|
+
readonly signals: readonly JobSignal[] | undefined;
|
|
23
|
+
readonly sql: SqlClient.SqlClient;
|
|
24
|
+
}
|
|
25
|
+
interface StoredEntry {
|
|
26
|
+
readonly entry: string;
|
|
27
|
+
readonly executionId: string;
|
|
28
|
+
readonly store: JournalStore;
|
|
29
|
+
}
|
|
30
|
+
interface WritingEntry extends StoredEntry {
|
|
31
|
+
readonly value: string;
|
|
32
|
+
}
|
|
33
|
+
interface StoringEntry extends StoredEntry {
|
|
34
|
+
readonly exit: AnyExit;
|
|
35
|
+
}
|
|
36
|
+
interface StoredResult {
|
|
37
|
+
readonly executionId: string;
|
|
38
|
+
readonly store: JournalStore;
|
|
39
|
+
readonly workflow: Workflow.Any;
|
|
40
|
+
}
|
|
41
|
+
interface StoringResult extends StoredResult {
|
|
42
|
+
readonly exit: AnyExit;
|
|
43
|
+
}
|
|
44
|
+
interface StoredPayload {
|
|
45
|
+
readonly text: string;
|
|
46
|
+
readonly workflow: Workflow.Any;
|
|
47
|
+
}
|
|
48
|
+
type Sql<Value> = Effect.Effect<Value, SqlError.SqlError>;
|
|
49
|
+
type AnyExit = Exit.Exit<unknown, unknown>;
|
|
50
|
+
declare const saveJobs: ({ jobs, sql }: JobsWrite) => Sql<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Stores each signal as its job's deferred result, in the command's transaction, only while the job is open and the
|
|
53
|
+
* deferred has none yet. A signal for a job that finished, never started or already has that result does nothing.
|
|
54
|
+
*/
|
|
55
|
+
declare const saveSignals: ({ signals, sql }: SignalsWrite) => Sql<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Its result check ignores an 'open' entry an older engine left behind when it saved the result. A job whose result
|
|
58
|
+
* spent a round of retries waits for its next round (its 'undelivered' entry's `next`), so it isn't run before then.
|
|
59
|
+
*/
|
|
60
|
+
declare const openJobs: ({ now, sql }: {
|
|
61
|
+
readonly now: number;
|
|
62
|
+
readonly sql: SqlClient.SqlClient;
|
|
63
|
+
}) => Sql<readonly StartedJob[]>;
|
|
64
|
+
/** Creates the open-jobs index once, marking the jobs a journal from before it still has open. */
|
|
65
|
+
declare const prepareOpenJobs: (sql: SqlClient.SqlClient) => Sql<void>;
|
|
66
|
+
declare const readEntry: ({ entry, executionId, sql }: EntryAddress) => Sql<Option.Option<string>>;
|
|
67
|
+
declare const decodePayload: ({ text, workflow }: StoredPayload) => Effect.Effect<Payload>;
|
|
68
|
+
declare const readStored: ({ entry, executionId, store }: StoredEntry) => Effect.Effect<Option.Option<string>>;
|
|
69
|
+
declare const writeStored: ({ store, ...written }: WritingEntry) => Effect.Effect<void>;
|
|
70
|
+
declare const storedExit: (stored: StoredEntry) => Effect.Effect<Option.Option<AnyExit>>;
|
|
71
|
+
declare const storeExit: ({ exit, ...stored }: StoringEntry) => Effect.Effect<void>;
|
|
72
|
+
declare const storeResult: ({ executionId, exit, store, workflow }: StoringResult) => Effect.Effect<void>;
|
|
73
|
+
declare const saveResult: ({ executionId, sql, value }: Omit<EntryWrite, "entry">) => Sql<void>;
|
|
74
|
+
/**
|
|
75
|
+
* While a job's result can't be stored, its journal says so in an 'undelivered' entry (`undelivered-result.pure.ts`).
|
|
76
|
+
* The inspector shows it with the job's other entries, and saving the result removes it.
|
|
77
|
+
*/
|
|
78
|
+
declare const markUndelivered: ({ executionId, sql, value }: Omit<EntryWrite, "entry">) => Sql<void>;
|
|
79
|
+
declare const completedRun: (stored: StoredResult) => Effect.Effect<Option.Option<RunResult>>;
|
|
80
|
+
/**
|
|
81
|
+
* Closes every job still open in a copied database, such as a fork's (ADR 0017): each gets an interrupted result, so
|
|
82
|
+
* the copy never runs work it inherited. Its parent keeps running its own.
|
|
83
|
+
*/
|
|
84
|
+
declare const cancelOpenJobs: (sql: SqlClient.SqlClient) => Sql<void>;
|
|
85
|
+
export { type AnyExit, type StoredEntry, cancelOpenJobs, completedRun, decodePayload, markUndelivered, openJobs, prepareOpenJobs, readEntry, readStored, saveJobs, saveResult, saveSignals, storeExit, storeResult, storedExit, writeStored };
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { JobCodecsOf } from "../../contract/command/command.contract.mjs";
|
|
2
|
+
import { StoredExit } from "../../contract/job/job-signal.schema.mjs";
|
|
3
|
+
import { nameOf } from "./job-runs.pure.mjs";
|
|
4
|
+
import { Array, Context, Effect, Exit, Option, Predicate, Schema } from "effect";
|
|
5
|
+
import { Workflow } from "effect/workflow";
|
|
6
|
+
// src/host/job/job-journal.sql.ts
|
|
7
|
+
const insertEntry = ({ entry, executionId, sql, value }) => Effect.asVoid(sql`INSERT INTO akter_workflow (execution_id, entry, value) VALUES (${executionId}, ${entry}, ${value}) ON CONFLICT (execution_id, entry) DO NOTHING`);
|
|
8
|
+
/**
|
|
9
|
+
* A job's 'open' entry lives from the command that starts it to the transaction that saves its result. The partial
|
|
10
|
+
* index holds only those entries, so finding the open jobs costs the jobs still open, not every job the actor ran.
|
|
11
|
+
*/
|
|
12
|
+
const openIndex = "akter_workflow_open";
|
|
13
|
+
const saveJobs = ({ jobs, sql }) => Effect.forEach(jobs, ({ id, job, payload }) => Effect.all([
|
|
14
|
+
insertEntry({
|
|
15
|
+
entry: "job",
|
|
16
|
+
executionId: id,
|
|
17
|
+
sql,
|
|
18
|
+
value: job
|
|
19
|
+
}),
|
|
20
|
+
insertEntry({
|
|
21
|
+
entry: "payload",
|
|
22
|
+
executionId: id,
|
|
23
|
+
sql,
|
|
24
|
+
value: payload
|
|
25
|
+
}),
|
|
26
|
+
insertEntry({
|
|
27
|
+
entry: "open",
|
|
28
|
+
executionId: id,
|
|
29
|
+
sql,
|
|
30
|
+
value: ""
|
|
31
|
+
})
|
|
32
|
+
], { discard: true }), { discard: true });
|
|
33
|
+
/**
|
|
34
|
+
* Stores each signal as its job's deferred result, in the command's transaction, only while the job is open and the
|
|
35
|
+
* deferred has none yet. A signal for a job that finished, never started or already has that result does nothing.
|
|
36
|
+
*/
|
|
37
|
+
const saveSignals = ({ signals, sql }) => Effect.forEach(signals ?? [], ({ deferred, exit, id }) => sql`INSERT INTO akter_workflow (execution_id, entry, value) SELECT ${id}, ${`deferred/${deferred}`}, ${exit} WHERE EXISTS (SELECT 1 FROM akter_workflow WHERE execution_id = ${id} AND entry = 'open') AND NOT EXISTS (SELECT 1 FROM akter_workflow WHERE execution_id = ${id} AND entry = 'result') ON CONFLICT (execution_id, entry) DO NOTHING`, { discard: true });
|
|
38
|
+
/**
|
|
39
|
+
* Its result check ignores an 'open' entry an older engine left behind when it saved the result. A job whose result
|
|
40
|
+
* spent a round of retries waits for its next round (its 'undelivered' entry's `next`), so it isn't run before then.
|
|
41
|
+
*/
|
|
42
|
+
const openJobs = ({ now, sql }) => sql`SELECT open.execution_id AS id, started.value AS job, payload.value AS payload FROM akter_workflow open INDEXED BY akter_workflow_open JOIN akter_workflow started ON started.execution_id = open.execution_id AND started.entry = 'job' JOIN akter_workflow payload ON payload.execution_id = open.execution_id AND payload.entry = 'payload' WHERE open.entry = 'open' AND NOT EXISTS (SELECT 1 FROM akter_workflow result WHERE result.execution_id = open.execution_id AND result.entry = 'result') AND NOT EXISTS (SELECT 1 FROM akter_workflow stalled WHERE stalled.execution_id = open.execution_id AND stalled.entry = 'undelivered' AND json_extract(stalled.value, '$.next') > ${now}) ORDER BY started.rowid`;
|
|
43
|
+
const hasOpenIndex = (sql) => Effect.map(sql`SELECT 1 FROM sqlite_master WHERE type = 'index' AND name = ${openIndex}`, Array.isReadonlyArrayNonEmpty);
|
|
44
|
+
const indexOpenJobs = (sql) => sql.withTransaction(Effect.andThen(sql`CREATE INDEX akter_workflow_open ON akter_workflow (execution_id) WHERE entry = 'open'`, sql`INSERT OR IGNORE INTO akter_workflow (execution_id, entry, value) SELECT started.execution_id, 'open', '' FROM akter_workflow started WHERE started.entry = 'job' AND NOT EXISTS (SELECT 1 FROM akter_workflow result WHERE result.execution_id = started.execution_id AND result.entry = 'result')`));
|
|
45
|
+
/** Creates the open-jobs index once, marking the jobs a journal from before it still has open. */
|
|
46
|
+
const prepareOpenJobs = (sql) => Effect.flatMap(hasOpenIndex(sql), (indexed) => {
|
|
47
|
+
if (indexed) return Effect.void;
|
|
48
|
+
return indexOpenJobs(sql);
|
|
49
|
+
});
|
|
50
|
+
const readEntry = ({ entry, executionId, sql }) => Effect.map(sql`SELECT value FROM akter_workflow WHERE execution_id = ${executionId} AND entry = ${entry}`, (rows) => Option.map(Array.head(rows), (row) => row.value));
|
|
51
|
+
const encodedExit = StoredExit;
|
|
52
|
+
const codecsOf = (workflow) => Option.match(Context.get(workflow.annotations, JobCodecsOf), {
|
|
53
|
+
onNone: () => Effect.die(`${nameOf(workflow)} is not an Akter job: declare it in Akter.make's jobs`),
|
|
54
|
+
onSome: Effect.succeed
|
|
55
|
+
});
|
|
56
|
+
const decodePayload = ({ text, workflow }) => Effect.flatMap(codecsOf(workflow), (codecs) => codecs.decodePayload(text).pipe(Effect.filterOrFail(Predicate.isObject, () => `${nameOf(workflow)} has a payload that is not a struct`), Effect.orDie));
|
|
57
|
+
const readStored = ({ entry, executionId, store }) => Effect.orDie(store.withSql((sql) => store.exclusive(readEntry({
|
|
58
|
+
entry,
|
|
59
|
+
executionId,
|
|
60
|
+
sql
|
|
61
|
+
}))));
|
|
62
|
+
const writeStored = ({ store, ...written }) => Effect.orDie(store.withSql((sql) => store.exclusive(insertEntry({
|
|
63
|
+
...written,
|
|
64
|
+
sql
|
|
65
|
+
}))));
|
|
66
|
+
const decodedWith = (decode) => (found) => Option.map(found, decode).pipe(Effect.transposeOption, Effect.orDie);
|
|
67
|
+
const storedExit = (stored) => Effect.flatMap(readStored(stored), decodedWith(Schema.decodeEffect(encodedExit)));
|
|
68
|
+
const storeExit = ({ exit, ...stored }) => Schema.encodeEffect(encodedExit)(exit).pipe(Effect.orDie, Effect.flatMap((value) => writeStored({
|
|
69
|
+
...stored,
|
|
70
|
+
value
|
|
71
|
+
})));
|
|
72
|
+
const storeResult = ({ executionId, exit, store, workflow }) => Effect.gen(function* storingResult() {
|
|
73
|
+
const codecs = yield* codecsOf(workflow);
|
|
74
|
+
const result = yield* Effect.orDie(codecs.encodeResult(exit));
|
|
75
|
+
yield* store.finish({
|
|
76
|
+
executionId,
|
|
77
|
+
job: nameOf(workflow),
|
|
78
|
+
result
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
const saveResult = ({ executionId, sql, value }) => Effect.andThen(insertEntry({
|
|
82
|
+
entry: "result",
|
|
83
|
+
executionId,
|
|
84
|
+
sql,
|
|
85
|
+
value
|
|
86
|
+
}), sql`DELETE FROM akter_workflow WHERE execution_id = ${executionId} AND entry IN ('open', 'undelivered')`);
|
|
87
|
+
/**
|
|
88
|
+
* While a job's result can't be stored, its journal says so in an 'undelivered' entry (`undelivered-result.pure.ts`).
|
|
89
|
+
* The inspector shows it with the job's other entries, and saving the result removes it.
|
|
90
|
+
*/
|
|
91
|
+
const markUndelivered = ({ executionId, sql, value }) => Effect.asVoid(sql`INSERT INTO akter_workflow (execution_id, entry, value) VALUES (${executionId}, 'undelivered', ${value}) ON CONFLICT (execution_id, entry) DO UPDATE SET value = excluded.value`);
|
|
92
|
+
const storedResult = (stored) => Effect.gen(function* readingResult() {
|
|
93
|
+
const codecs = yield* codecsOf(stored.workflow);
|
|
94
|
+
const found = yield* readStored({
|
|
95
|
+
...stored,
|
|
96
|
+
entry: "result"
|
|
97
|
+
});
|
|
98
|
+
return yield* decodedWith(codecs.decodeResult)(found);
|
|
99
|
+
});
|
|
100
|
+
const completedRun = (stored) => Effect.map(storedResult(stored), Option.map((exit) => new Workflow.Complete({ exit })));
|
|
101
|
+
/**
|
|
102
|
+
* Closes every job still open in a copied database, such as a fork's (ADR 0017): each gets an interrupted result, so
|
|
103
|
+
* the copy never runs work it inherited. Its parent keeps running its own.
|
|
104
|
+
*/
|
|
105
|
+
const cancelOpenJobs = (sql) => Effect.gen(function* cancelInheritedJobs() {
|
|
106
|
+
yield* sql`INSERT INTO akter_workflow (execution_id, entry, value) SELECT execution_id, 'result', ${yield* Effect.orDie(Schema.encodeEffect(encodedExit)(Exit.interrupt()))} FROM akter_workflow WHERE entry = 'open' ON CONFLICT (execution_id, entry) DO NOTHING`;
|
|
107
|
+
yield* sql`DELETE FROM akter_workflow WHERE entry = 'open'`;
|
|
108
|
+
});
|
|
109
|
+
export { cancelOpenJobs, completedRun, decodePayload, markUndelivered, openJobs, prepareOpenJobs, readEntry, readStored, saveJobs, saveResult, saveSignals, storeExit, storeResult, storedExit, writeStored };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { CommandRunner } from "../command/command-runner.service.mjs";
|
|
2
|
+
import { Finishing, Guard, Stalling, Unstored } from "./undelivered-result.pure.mjs";
|
|
3
|
+
import { Context, Effect, Layer } from "effect";
|
|
4
|
+
import { SqlError } from "effect/sql";
|
|
5
|
+
declare const JobResults_base: Context.ServiceClass<JobResults, "@akterjs/effect/host/job/job-results.service/JobResults", {
|
|
6
|
+
/**
|
|
7
|
+
* Stores the result and runs its command in one transaction. Past the storage ceiling a result command that grows
|
|
8
|
+
* the database is refused, and the result rolls back with it, so a retry delivers it once the store has room.
|
|
9
|
+
*/
|
|
10
|
+
readonly deliver: (finishing: Finishing) => Effect.Effect<void, Unstored>;
|
|
11
|
+
/**
|
|
12
|
+
* Delivers with retries: a failed attempt waits out a capped backoff, and the job's journal shows it as
|
|
13
|
+
* undelivered. After the last retry the job stays open and is due again later, on a longer capped backoff.
|
|
14
|
+
*/
|
|
15
|
+
readonly settle: (finishing: Finishing, guard: Guard) => Effect.Effect<void>;
|
|
16
|
+
/** Records a run that ended before its result was stored as a spent round, so the job is due at its next. */
|
|
17
|
+
readonly stall: (stalled: Stalling, guard: Guard) => Effect.Effect<void, SqlError.SqlError>;
|
|
18
|
+
}> & {
|
|
19
|
+
readonly make: Effect.Effect<{
|
|
20
|
+
/**
|
|
21
|
+
* Stores the result and runs its command in one transaction. Past the storage ceiling a result command that grows
|
|
22
|
+
* the database is refused, and the result rolls back with it, so a retry delivers it once the store has room.
|
|
23
|
+
*/
|
|
24
|
+
readonly deliver: (finishing: Finishing) => Effect.Effect<void, Unstored>;
|
|
25
|
+
/**
|
|
26
|
+
* Delivers with retries: a failed attempt waits out a capped backoff, and the job's journal shows it as
|
|
27
|
+
* undelivered. After the last retry the job stays open and is due again later, on a longer capped backoff.
|
|
28
|
+
*/
|
|
29
|
+
readonly settle: (finishing: Finishing, guard: Guard) => Effect.Effect<void>;
|
|
30
|
+
/** Records a run that ended before its result was stored as a spent round, so the job is due at its next. */
|
|
31
|
+
readonly stall: (stalled: Stalling, guard: Guard) => Effect.Effect<void, SqlError.SqlError>;
|
|
32
|
+
}, never, CommandRunner>;
|
|
33
|
+
};
|
|
34
|
+
export declare class JobResults extends JobResults_base {
|
|
35
|
+
static readonly layer: Layer.Layer<JobResults, never, never>;
|
|
36
|
+
}
|
|
37
|
+
export {};
|