@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,55 @@
|
|
|
1
|
+
import { KeySchema } from "../../../contract/actor/actor.contract.mjs";
|
|
2
|
+
import { FileClientFailure } from "../../../contract/file/file-client-failure.contract.mjs";
|
|
3
|
+
import { admit } from "../../../contract/caller/caller-admission.pure.mjs";
|
|
4
|
+
import { CurrentCaller } from "../../../contract/caller/current-caller.service.mjs";
|
|
5
|
+
import { FileAccessRequest } from "../../../contract/file/access/file-access.contract.mjs";
|
|
6
|
+
import "../../../contract/file/file-client.contract.mjs";
|
|
7
|
+
import { HostFailure } from "../../live/live-reads.service.mjs";
|
|
8
|
+
import { ActorHost } from "../../engine/actor-host.service.mjs";
|
|
9
|
+
import { UploadOwner } from "./upload-sessions.pure.mjs";
|
|
10
|
+
import { Effect, Option } from "effect";
|
|
11
|
+
interface FileActor {
|
|
12
|
+
/** Whether the actor declares file calls (`Akter.fileAccess`); the host runs the declaration as `akter.files`. */
|
|
13
|
+
readonly fileAccess: Option.Option<unknown>;
|
|
14
|
+
readonly key: KeySchema;
|
|
15
|
+
readonly name: string;
|
|
16
|
+
}
|
|
17
|
+
interface Keyed {
|
|
18
|
+
readonly key: string;
|
|
19
|
+
}
|
|
20
|
+
type Admitted = Effect.Error<ReturnType<typeof admit>>;
|
|
21
|
+
/** The failures a file RPC answers, which its schema carries; `served` folds the rest. */
|
|
22
|
+
type Served = Exclude<FileClientFailure | Admitted, {
|
|
23
|
+
readonly _tag: "ActorAlreadyExistsError" | "SqlError" | "UnauthenticatedError";
|
|
24
|
+
}>;
|
|
25
|
+
/**
|
|
26
|
+
* What a file RPC answers for a failure. A storage failure answers that the actor is unavailable, which a client
|
|
27
|
+
* retries; its SQL detail stays on the host.
|
|
28
|
+
*/
|
|
29
|
+
declare const served: (actor: string) => (failure: FileClientFailure | HostFailure) => Served;
|
|
30
|
+
/** Which file call is asked for, and of what: the file's path, a listing's prefix, or empty for an upload. */
|
|
31
|
+
interface Asked {
|
|
32
|
+
readonly access: (typeof FileAccessRequest)["Type"]["access"];
|
|
33
|
+
readonly path: string;
|
|
34
|
+
}
|
|
35
|
+
interface Admitting extends Keyed {
|
|
36
|
+
readonly actor: FileActor;
|
|
37
|
+
readonly caller: CurrentCaller["Service"];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Who is calling which actor's files, without asking the actor's rule: the actor must declare files, and the key must
|
|
41
|
+
* decode with its key schema before any file is touched, so one actor's request can't name another's files. An upload's
|
|
42
|
+
* append and close use this alone: its session was authorized when it opened, and only the same caller may continue it.
|
|
43
|
+
*/
|
|
44
|
+
declare const callerOf: (args_0: Admitting) => Effect.Effect<UploadOwner, Served, never>;
|
|
45
|
+
/**
|
|
46
|
+
* Admits the caller to the actor's files (`callerOf`), then runs the actor's `files.authorize` rule as the reserved
|
|
47
|
+
* `akter.files` query, under the verified caller: the engine admits only the kinds `Akter.fileAccess` declared, never
|
|
48
|
+
* the engine's own actor caller, and the rule reads the state and `Actor.principal`, never the request. The call is
|
|
49
|
+
* refused unless the rule succeeds.
|
|
50
|
+
*/
|
|
51
|
+
declare const ownerOf: (args_0: Admitting & {
|
|
52
|
+
readonly asked: Asked;
|
|
53
|
+
readonly host: ActorHost["Service"];
|
|
54
|
+
}) => Effect.Effect<UploadOwner, Served, never>;
|
|
55
|
+
export { type Asked, type FileActor, type Keyed, type Served, callerOf, ownerOf, served };
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { clientPrincipal } from "../../../contract/caller/caller-admission.pure.mjs";
|
|
2
|
+
import { ActorUnavailableError } from "../../../contract/client/actor-unavailable.errors.mjs";
|
|
3
|
+
import { InvalidRequestError } from "../../../contract/client/invalid-request.errors.mjs";
|
|
4
|
+
import { fileAccessMember, fileAccessPayload, fileAccessReply } from "../../../contract/file/access/file-access.contract.mjs";
|
|
5
|
+
import { Effect, Match, Schema } from "effect";
|
|
6
|
+
// src/serve/rpc/file/file-rpc-access.pure.ts
|
|
7
|
+
/**
|
|
8
|
+
* What a file RPC answers for a failure. A storage failure answers that the actor is unavailable, which a client
|
|
9
|
+
* retries; its SQL detail stays on the host.
|
|
10
|
+
*/
|
|
11
|
+
const served = (actor) => (failure) => Match.value(failure).pipe(Match.tag("SqlError", () => ActorUnavailableError.make({
|
|
12
|
+
actor,
|
|
13
|
+
message: "the actor's files are unavailable. Retry shortly."
|
|
14
|
+
})), Match.tag("UnauthenticatedError", () => ActorUnavailableError.make({
|
|
15
|
+
actor,
|
|
16
|
+
message: "the caller wasn't authenticated before its files were read"
|
|
17
|
+
})), Match.tag("ActorAlreadyExistsError", () => InvalidRequestError.make({
|
|
18
|
+
actor,
|
|
19
|
+
message: "a file request can't create an actor"
|
|
20
|
+
})), Match.orElse((other) => other));
|
|
21
|
+
const denied = (actor) => InvalidRequestError.make({
|
|
22
|
+
actor,
|
|
23
|
+
message: `${actor} declares no file calls. To use files, declare them with files: Akter.fileAccess({ callers: [...] }), decide each in files.authorize, and deploy again.`
|
|
24
|
+
});
|
|
25
|
+
/**
|
|
26
|
+
* Who is calling which actor's files, without asking the actor's rule: the actor must declare files, and the key must
|
|
27
|
+
* decode with its key schema before any file is touched, so one actor's request can't name another's files. An upload's
|
|
28
|
+
* append and close use this alone: its session was authorized when it opened, and only the same caller may continue it.
|
|
29
|
+
*/
|
|
30
|
+
const callerOf = Effect.fnUntraced(function* callerOf({ actor, caller, key }) {
|
|
31
|
+
const principal = yield* clientPrincipal({
|
|
32
|
+
actor: actor.name,
|
|
33
|
+
caller
|
|
34
|
+
});
|
|
35
|
+
yield* Effect.mapError(Effect.fromOption(actor.fileAccess), () => denied(actor.name));
|
|
36
|
+
yield* Effect.mapError(Schema.decodeEffect(actor.key)(key), () => InvalidRequestError.make({
|
|
37
|
+
actor: actor.name,
|
|
38
|
+
message: "the actor key is invalid"
|
|
39
|
+
}));
|
|
40
|
+
return {
|
|
41
|
+
address: {
|
|
42
|
+
actor: actor.name,
|
|
43
|
+
key
|
|
44
|
+
},
|
|
45
|
+
principal
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
/**
|
|
49
|
+
* Admits the caller to the actor's files (`callerOf`), then runs the actor's `files.authorize` rule as the reserved
|
|
50
|
+
* `akter.files` query, under the verified caller: the engine admits only the kinds `Akter.fileAccess` declared, never
|
|
51
|
+
* the engine's own actor caller, and the rule reads the state and `Actor.principal`, never the request. The call is
|
|
52
|
+
* refused unless the rule succeeds.
|
|
53
|
+
*/
|
|
54
|
+
const ownerOf = Effect.fnUntraced(function* ownerOf({ asked, host, ...admitting }) {
|
|
55
|
+
const owner = yield* callerOf(admitting);
|
|
56
|
+
const payload = yield* Effect.orDie(Schema.encodeEffect(fileAccessPayload)(asked));
|
|
57
|
+
const call = {
|
|
58
|
+
...owner.address,
|
|
59
|
+
member: fileAccessMember,
|
|
60
|
+
payload,
|
|
61
|
+
principal: owner.principal
|
|
62
|
+
};
|
|
63
|
+
const reply = yield* Effect.mapError(host.query(call), served(owner.address.actor));
|
|
64
|
+
yield* yield* Effect.orDie(Schema.decodeEffect(fileAccessReply)(reply));
|
|
65
|
+
return owner;
|
|
66
|
+
});
|
|
67
|
+
export { callerOf, ownerOf, served };
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { CurrentCaller } from "../../../contract/caller/current-caller.service.mjs";
|
|
2
|
+
import { FilePage, FileUsagePage } from "../../../contract/file/actor-files.contract.mjs";
|
|
3
|
+
import "../../../contract/file/file-client.contract.mjs";
|
|
4
|
+
import { ActorHost } from "../../engine/actor-host.service.mjs";
|
|
5
|
+
import { FileActor, Keyed, Served } from "./file-rpc-access.pure.mjs";
|
|
6
|
+
import { UploadLimits, UploadSessions } from "./upload-sessions.pure.mjs";
|
|
7
|
+
import { Effect, Scope, Stream } from "effect";
|
|
8
|
+
interface Listed extends Keyed {
|
|
9
|
+
readonly cursor?: string;
|
|
10
|
+
readonly limit?: number;
|
|
11
|
+
readonly prefix?: string;
|
|
12
|
+
}
|
|
13
|
+
interface Downloaded extends Keyed {
|
|
14
|
+
readonly length?: number;
|
|
15
|
+
readonly offset?: number;
|
|
16
|
+
readonly path: string;
|
|
17
|
+
}
|
|
18
|
+
interface Appended extends Keyed {
|
|
19
|
+
readonly bytes: Uint8Array;
|
|
20
|
+
readonly offset: number;
|
|
21
|
+
readonly upload: string;
|
|
22
|
+
}
|
|
23
|
+
interface Closed extends Keyed {
|
|
24
|
+
readonly bytes: number;
|
|
25
|
+
readonly upload: string;
|
|
26
|
+
}
|
|
27
|
+
interface Serving {
|
|
28
|
+
readonly actor: FileActor;
|
|
29
|
+
readonly host: ActorHost["Service"];
|
|
30
|
+
readonly uploads: UploadSessions;
|
|
31
|
+
}
|
|
32
|
+
type Answer<Value> = Effect.Effect<Value, Served, CurrentCaller>;
|
|
33
|
+
type FileHandler = ((request: Appended) => Answer<{
|
|
34
|
+
readonly received: number;
|
|
35
|
+
}>) | ((request: Closed) => Answer<{
|
|
36
|
+
readonly receipt: string;
|
|
37
|
+
}>) | ((request: Downloaded) => Stream.Stream<Uint8Array, Served, CurrentCaller>) | ((request: Keyed) => Answer<{
|
|
38
|
+
readonly upload: string;
|
|
39
|
+
}>) | ((request: Listed) => Answer<FilePage>) | ((request: Listed) => Answer<FileUsagePage>);
|
|
40
|
+
type FileHandlers = Readonly<Record<string, FileHandler>>;
|
|
41
|
+
/**
|
|
42
|
+
* The `<Actor>/files/<operation>` handlers of every served actor that declares files. A download, a listing, the
|
|
43
|
+
* usage and an upload's open run the actor's `files.authorize` rule first (`ownerOf`), then serve the actor's files from
|
|
44
|
+
* this host with the same client its own code uses outside commands. Uploads are sessions of this server
|
|
45
|
+
* (`upload-sessions.pure.ts`), bound to the caller that opened them and held to `limits` over `defaultUploadLimits`.
|
|
46
|
+
*/
|
|
47
|
+
declare const fileRpcHandlers: ({ actors, limits }: {
|
|
48
|
+
readonly actors: readonly FileActor[];
|
|
49
|
+
readonly limits?: Partial<UploadLimits>;
|
|
50
|
+
}) => Effect.Effect<FileHandlers, never, ActorHost | Scope.Scope>;
|
|
51
|
+
/** One actor's file handlers, by tag, sharing `uploads` with every other actor the host serves. */
|
|
52
|
+
declare const fileHandlersFor: (serving: Serving) => FileHandlers;
|
|
53
|
+
export { type FileHandler, type FileHandlers, type Serving as FileServing, fileHandlersFor, fileRpcHandlers };
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { CurrentCaller } from "../../../contract/caller/current-caller.service.mjs";
|
|
2
|
+
import { fileChunkBytes, fileTag } from "../../../contract/file/rpc/file-rpc.contract.mjs";
|
|
3
|
+
import { filePathOf } from "../../../contract/file/file-path.pure.mjs";
|
|
4
|
+
import { InvalidFileRequestError } from "../../../contract/file/invalid-file-request.errors.mjs";
|
|
5
|
+
import { ActorHost } from "../../engine/actor-host.service.mjs";
|
|
6
|
+
import { hostFileClient } from "../../../runtime/local-file-clients.layer.mjs";
|
|
7
|
+
import { callerOf, ownerOf, served } from "./file-rpc-access.pure.mjs";
|
|
8
|
+
import { uploadSessionsWith } from "./upload-sessions.pure.mjs";
|
|
9
|
+
import { Array, Effect, Option, Record, Stream } from "effect";
|
|
10
|
+
// src/serve/rpc/file/file-rpc.layer.ts
|
|
11
|
+
const oneChunk = 1;
|
|
12
|
+
/** Admits the current caller to the actor's files under the request's key, if the actor's rule allows `asked`. */
|
|
13
|
+
const ownerFor = ({ actor, host }, { key }, asked) => Effect.flatMap(Effect.service(CurrentCaller), (caller) => ownerOf({
|
|
14
|
+
actor,
|
|
15
|
+
asked,
|
|
16
|
+
caller,
|
|
17
|
+
host,
|
|
18
|
+
key
|
|
19
|
+
}));
|
|
20
|
+
/** The current caller of an open upload, which the session checks is the caller that opened it. */
|
|
21
|
+
const uploaderFor = ({ actor }, { key }) => Effect.flatMap(Effect.service(CurrentCaller), (caller) => callerOf({
|
|
22
|
+
actor,
|
|
23
|
+
caller,
|
|
24
|
+
key
|
|
25
|
+
}));
|
|
26
|
+
const reading = (path) => ({
|
|
27
|
+
access: "read",
|
|
28
|
+
path: path ?? ""
|
|
29
|
+
});
|
|
30
|
+
const writing = {
|
|
31
|
+
access: "write",
|
|
32
|
+
path: ""
|
|
33
|
+
};
|
|
34
|
+
const clientOf = (serving, request, asked) => Effect.map(ownerFor(serving, request, asked), ({ address }) => hostFileClient({
|
|
35
|
+
address,
|
|
36
|
+
host: serving.host
|
|
37
|
+
}));
|
|
38
|
+
const listingOf = ({ cursor, limit, prefix }) => ({
|
|
39
|
+
...Record.getSomes({
|
|
40
|
+
cursor: Option.fromNullishOr(cursor),
|
|
41
|
+
prefix: Option.fromNullishOr(prefix)
|
|
42
|
+
}),
|
|
43
|
+
...Record.getSomes({ limit: Option.fromNullishOr(limit) })
|
|
44
|
+
});
|
|
45
|
+
const rangeOf = ({ length, offset, path }) => {
|
|
46
|
+
const bounds = {
|
|
47
|
+
length: Option.fromNullishOr(length),
|
|
48
|
+
offset: Option.fromNullishOr(offset)
|
|
49
|
+
};
|
|
50
|
+
if (Option.isSome(bounds.length) !== Option.isSome(bounds.offset)) return Effect.fail(InvalidFileRequestError.make({
|
|
51
|
+
message: "a range needs both offset and length",
|
|
52
|
+
path
|
|
53
|
+
}));
|
|
54
|
+
return Effect.succeed(Option.all(bounds));
|
|
55
|
+
};
|
|
56
|
+
const slices = (bytes) => Array.makeBy(Math.max(oneChunk, Math.ceil(bytes.length / fileChunkBytes)), (index) => bytes.subarray(index * fileChunkBytes, (index + oneChunk) * fileChunkBytes));
|
|
57
|
+
const download = (serving) => (request) => {
|
|
58
|
+
const opened = Effect.gen(function* opened() {
|
|
59
|
+
const path = yield* filePathOf(request.path);
|
|
60
|
+
const client = yield* clientOf(serving, request, reading(path));
|
|
61
|
+
const range = yield* rangeOf(request);
|
|
62
|
+
return Option.match(range, {
|
|
63
|
+
onNone: () => client.download(path),
|
|
64
|
+
onSome: (requested) => client.download(path, requested)
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
return Stream.unwrap(opened).pipe(Stream.flatMap((chunk) => Stream.fromIterable(slices(chunk))), Stream.mapError(served(serving.actor.name)));
|
|
68
|
+
};
|
|
69
|
+
const listed = (serving) => (request) => clientOf(serving, request, reading(request.prefix)).pipe(Effect.flatMap((client) => client.list(listingOf(request))), Effect.mapError(served(serving.actor.name)));
|
|
70
|
+
const usage = (serving) => (request) => clientOf(serving, request, reading(request.prefix)).pipe(Effect.flatMap((client) => client.fileUsage(listingOf(request))), Effect.mapError(served(serving.actor.name)));
|
|
71
|
+
const opened = (serving) => (request) => Effect.flatMap(ownerFor(serving, request, writing), (owner) => {
|
|
72
|
+
const { actor, host, uploads: sessions } = serving;
|
|
73
|
+
const client = hostFileClient({
|
|
74
|
+
address: owner.address,
|
|
75
|
+
host
|
|
76
|
+
});
|
|
77
|
+
const upload = Effect.map(sessions.open(owner, client), (id) => ({ upload: id }));
|
|
78
|
+
return Effect.mapError(upload, served(actor.name));
|
|
79
|
+
});
|
|
80
|
+
const appended = (serving) => (request) => Effect.flatMap(uploaderFor(serving, request), (owner) => {
|
|
81
|
+
const { actor, uploads: sessions } = serving;
|
|
82
|
+
const received = Effect.map(sessions.append({
|
|
83
|
+
...owner,
|
|
84
|
+
...request
|
|
85
|
+
}), (bytes) => ({ received: bytes }));
|
|
86
|
+
return Effect.mapError(received, served(actor.name));
|
|
87
|
+
});
|
|
88
|
+
const closed = (serving) => (request) => Effect.flatMap(uploaderFor(serving, request), (owner) => {
|
|
89
|
+
const { actor, uploads: sessions } = serving;
|
|
90
|
+
const receipt = Effect.map(sessions.close({
|
|
91
|
+
...owner,
|
|
92
|
+
...request
|
|
93
|
+
}), (sealed) => ({ receipt: sealed }));
|
|
94
|
+
return Effect.mapError(receipt, served(actor.name));
|
|
95
|
+
});
|
|
96
|
+
const entriesOf = (serving) => {
|
|
97
|
+
const actor = serving.actor.name;
|
|
98
|
+
return [
|
|
99
|
+
[fileTag({
|
|
100
|
+
actor,
|
|
101
|
+
operation: "download"
|
|
102
|
+
}), download(serving)],
|
|
103
|
+
[fileTag({
|
|
104
|
+
actor,
|
|
105
|
+
operation: "list"
|
|
106
|
+
}), listed(serving)],
|
|
107
|
+
[fileTag({
|
|
108
|
+
actor,
|
|
109
|
+
operation: "usage"
|
|
110
|
+
}), usage(serving)],
|
|
111
|
+
[fileTag({
|
|
112
|
+
actor,
|
|
113
|
+
operation: "upload/open"
|
|
114
|
+
}), opened(serving)],
|
|
115
|
+
[fileTag({
|
|
116
|
+
actor,
|
|
117
|
+
operation: "upload/append"
|
|
118
|
+
}), appended(serving)],
|
|
119
|
+
[fileTag({
|
|
120
|
+
actor,
|
|
121
|
+
operation: "upload/close"
|
|
122
|
+
}), closed(serving)]
|
|
123
|
+
];
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* The `<Actor>/files/<operation>` handlers of every served actor that declares files. A download, a listing, the
|
|
127
|
+
* usage and an upload's open run the actor's `files.authorize` rule first (`ownerOf`), then serve the actor's files from
|
|
128
|
+
* this host with the same client its own code uses outside commands. Uploads are sessions of this server
|
|
129
|
+
* (`upload-sessions.pure.ts`), bound to the caller that opened them and held to `limits` over `defaultUploadLimits`.
|
|
130
|
+
*/
|
|
131
|
+
const fileRpcHandlers = ({ actors, limits = {} }) => Effect.gen(function* makeFileRpcHandlers() {
|
|
132
|
+
const host = yield* ActorHost;
|
|
133
|
+
const sessions = yield* uploadSessionsWith(limits);
|
|
134
|
+
const declaring = Array.filter(actors, (actor) => Option.isSome(actor.fileAccess));
|
|
135
|
+
return Record.fromEntries(Array.flatMap(declaring, (actor) => entriesOf({
|
|
136
|
+
actor,
|
|
137
|
+
host,
|
|
138
|
+
uploads: sessions
|
|
139
|
+
})));
|
|
140
|
+
});
|
|
141
|
+
/** One actor's file handlers, by tag, sharing `uploads` with every other actor the host serves. */
|
|
142
|
+
const fileHandlersFor = (serving) => Record.fromEntries(entriesOf(serving));
|
|
143
|
+
export { fileHandlersFor, fileRpcHandlers };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { FileClientFailure } from "../../../contract/file/file-client-failure.contract.mjs";
|
|
2
|
+
import { FileAddress, FileClient } from "../../../contract/file/file-client.contract.mjs";
|
|
3
|
+
import { Effect, Scope } from "effect";
|
|
4
|
+
/** What one server's upload sessions may hold. Targets, not measured; a host passes its own to the file RPC layer. */
|
|
5
|
+
interface UploadLimits {
|
|
6
|
+
/** The largest file one upload may carry; a chunk that would pass it fails with `FileTooLargeError`. */
|
|
7
|
+
readonly maximumFileBytes: number;
|
|
8
|
+
/** Sessions open at once for one actor, by type and key. */
|
|
9
|
+
readonly perActor: number;
|
|
10
|
+
/** Sessions one caller holds open at once, across every actor. */
|
|
11
|
+
readonly perCaller: number;
|
|
12
|
+
/** Sessions open at once on the whole server. */
|
|
13
|
+
readonly perServer: number;
|
|
14
|
+
}
|
|
15
|
+
declare const defaultUploadLimits: UploadLimits;
|
|
16
|
+
interface UploadOwner {
|
|
17
|
+
readonly address: FileAddress;
|
|
18
|
+
readonly principal: string;
|
|
19
|
+
}
|
|
20
|
+
interface Appending extends UploadOwner {
|
|
21
|
+
readonly bytes: Uint8Array;
|
|
22
|
+
readonly offset: number;
|
|
23
|
+
readonly upload: string;
|
|
24
|
+
}
|
|
25
|
+
interface Closing extends UploadOwner {
|
|
26
|
+
readonly bytes: number;
|
|
27
|
+
readonly upload: string;
|
|
28
|
+
}
|
|
29
|
+
interface UploadSessions {
|
|
30
|
+
readonly append: (appending: Appending) => Effect.Effect<number, FileClientFailure>;
|
|
31
|
+
readonly close: (closing: Closing) => Effect.Effect<string, FileClientFailure>;
|
|
32
|
+
readonly open: (owner: UploadOwner, client: FileClient) => Effect.Effect<string, FileClientFailure>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Upload sessions of one RPC server. Effect RPC has no client streams, so a network upload is `open`, ordered
|
|
36
|
+
* `append`s and `close`. Each session feeds one sealing upload through a short queue, so a fast client waits for the
|
|
37
|
+
* seal instead of filling memory. Appends are idempotent by offset, so a client may resend a chunk whose reply it
|
|
38
|
+
* lost; a gap or an oversized chunk is refused, and a chunk that would take the file past `maximumFileBytes` fails
|
|
39
|
+
* with `FileTooLargeError` and drops the session. A session is bound to the actor, key and caller that opened it, so
|
|
40
|
+
* its id needs no secrecy. The server holds at most `perServer` sessions, `perCaller` for one caller and `perActor`
|
|
41
|
+
* for one actor (`defaultUploadLimits` unless the host passes its own), and drops one idle for a minute with its
|
|
42
|
+
* partial upload, which is never attached and which the blob store collects as it does any upload no command attached.
|
|
43
|
+
*/
|
|
44
|
+
declare const uploadSessionsWith: (limits?: Partial<UploadLimits>) => Effect.Effect<UploadSessions, never, Scope.Scope>;
|
|
45
|
+
export { type UploadLimits, type UploadOwner, type UploadSessions, defaultUploadLimits, uploadSessionsWith };
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { ActorUnavailableError } from "../../../contract/client/actor-unavailable.errors.mjs";
|
|
2
|
+
import { uploadChunkBytes } from "../../../contract/file/rpc/file-rpc.contract.mjs";
|
|
3
|
+
import { FileTooLargeError } from "../../../contract/file/rpc/file-too-large.errors.mjs";
|
|
4
|
+
import { InvalidFileRequestError } from "../../../contract/file/invalid-file-request.errors.mjs";
|
|
5
|
+
import { Array, Clock, Effect, Exit, Fiber, Latch, MutableHashMap, Option, Queue, Semaphore, Stream } from "effect";
|
|
6
|
+
// src/serve/rpc/file/upload-sessions.pure.ts
|
|
7
|
+
const defaultUploadLimits = {
|
|
8
|
+
maximumFileBytes: 1073741824,
|
|
9
|
+
perActor: 8,
|
|
10
|
+
perCaller: 8,
|
|
11
|
+
perServer: 64
|
|
12
|
+
};
|
|
13
|
+
/** How long an upload session may sit without an append or close before it is dropped with its partial upload. */
|
|
14
|
+
const idleMillis = 6e4;
|
|
15
|
+
const reapEvery = "10 seconds";
|
|
16
|
+
/** Chunks queued ahead of the sealing upload, so a fast client waits instead of buffering a whole file. */
|
|
17
|
+
const queuedChunks = 4;
|
|
18
|
+
const none = 0;
|
|
19
|
+
const one = 1;
|
|
20
|
+
const refused = (message) => InvalidFileRequestError.make({
|
|
21
|
+
message,
|
|
22
|
+
path: ""
|
|
23
|
+
});
|
|
24
|
+
const sameOwner = (session, owner) => session.principal === owner.principal && session.address.actor === owner.address.actor && session.address.key === owner.address.key;
|
|
25
|
+
const actorOf = ({ address }) => `${String(address.actor.length)}:${address.actor}${address.key}`;
|
|
26
|
+
const countIn = (counts, name) => Option.getOrElse(MutableHashMap.get(counts, name), () => none);
|
|
27
|
+
const adjust = (counts, name, by) => {
|
|
28
|
+
const next = countIn(counts, name) + by;
|
|
29
|
+
if (next === none) {
|
|
30
|
+
MutableHashMap.remove(counts, name);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
MutableHashMap.set(counts, name, next);
|
|
34
|
+
};
|
|
35
|
+
const busy = (owner, what) => ActorUnavailableError.make({
|
|
36
|
+
actor: owner.address.actor,
|
|
37
|
+
message: `too many uploads are open ${what}. Retry shortly.`
|
|
38
|
+
});
|
|
39
|
+
/** The refusal for a new session, if one of the limits is reached; none, after taking its slot, when all have room. */
|
|
40
|
+
const takeSlot = ({ limits, slots }, owner) => {
|
|
41
|
+
if (slots.server >= limits.perServer) return Option.some(busy(owner, "on this host"));
|
|
42
|
+
if (countIn(slots.byCaller, owner.principal) >= limits.perCaller) return Option.some(busy(owner, "for this caller"));
|
|
43
|
+
if (countIn(slots.byActor, actorOf(owner)) >= limits.perActor) return Option.some(busy(owner, "for this actor"));
|
|
44
|
+
slots.server += one;
|
|
45
|
+
adjust(slots.byCaller, owner.principal, one);
|
|
46
|
+
adjust(slots.byActor, actorOf(owner), one);
|
|
47
|
+
return Option.none();
|
|
48
|
+
};
|
|
49
|
+
const giveBack = ({ slots }, owner) => {
|
|
50
|
+
slots.server -= one;
|
|
51
|
+
adjust(slots.byCaller, owner.principal, -1);
|
|
52
|
+
adjust(slots.byActor, actorOf(owner), -1);
|
|
53
|
+
};
|
|
54
|
+
/** Removes the session `upload` and gives its slot back, once however many paths end it. */
|
|
55
|
+
const forget = (sessions, upload) => {
|
|
56
|
+
const found = MutableHashMap.get(sessions.held, upload);
|
|
57
|
+
if (Option.isSome(found)) {
|
|
58
|
+
MutableHashMap.remove(sessions.held, upload);
|
|
59
|
+
giveBack(sessions, found.value);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const drop = (sessions, [upload, session]) => Effect.andThen(Effect.sync(() => {
|
|
63
|
+
forget(sessions, upload);
|
|
64
|
+
}), Effect.andThen(Queue.shutdown(session.chunks), Fiber.interrupt(session.sealing)));
|
|
65
|
+
const reap = (sessions) => Effect.flatMap(Clock.currentTimeMillis, (now) => {
|
|
66
|
+
const idle = Array.filter([...sessions.held], ([, session]) => now - session.touched > idleMillis);
|
|
67
|
+
return Effect.forEach(idle, (entry) => drop(sessions, entry), { discard: true });
|
|
68
|
+
});
|
|
69
|
+
/** Finds the session `upload` and marks it used; only the actor, key and caller that opened it may use it. */
|
|
70
|
+
const owned = (sessions, upload, owner) => {
|
|
71
|
+
const found = Option.filter(MutableHashMap.get(sessions.held, upload), (session) => sameOwner(session, owner));
|
|
72
|
+
return Effect.mapError(Effect.fromOption(found), () => refused(`no open upload ${upload} for this caller`)).pipe(Effect.tap((session) => Effect.map(Clock.currentTimeMillis, (now) => {
|
|
73
|
+
session.touched = now;
|
|
74
|
+
})));
|
|
75
|
+
};
|
|
76
|
+
/** Fails with the sealing upload's failure, or refuses when it ended without its last chunk. */
|
|
77
|
+
const ended = (sealing) => Effect.flatMap(Fiber.await(sealing), (exit) => Exit.match(exit, {
|
|
78
|
+
onFailure: Effect.failCause,
|
|
79
|
+
onSuccess: () => Effect.fail(refused("the upload ended before its last chunk"))
|
|
80
|
+
}));
|
|
81
|
+
/**
|
|
82
|
+
* Forks the sealing upload and waits until it reads its first chunk, so an upload the host refuses, such as one past
|
|
83
|
+
* the actor's unattached uploads, fails the open itself. A failed or interrupted start stops the sealing upload.
|
|
84
|
+
*/
|
|
85
|
+
const sealingUpload = ({ chunks, client, scope }) => Effect.uninterruptibleMask((restore) => Effect.gen(function* startSealing() {
|
|
86
|
+
const reading = yield* Latch.make();
|
|
87
|
+
const source = Stream.unwrap(Effect.as(reading.open, Stream.fromQueue(chunks)));
|
|
88
|
+
const sealing = yield* Effect.forkIn(client.upload(source), scope);
|
|
89
|
+
yield* restore(Effect.raceFirst(reading.await, ended(sealing))).pipe(Effect.onError(() => Effect.andThen(Queue.shutdown(chunks), Fiber.interrupt(sealing))));
|
|
90
|
+
return sealing;
|
|
91
|
+
}));
|
|
92
|
+
const started = Effect.fnUntraced(function* started(sessions, owner, client) {
|
|
93
|
+
const chunks = yield* Queue.bounded(queuedChunks);
|
|
94
|
+
const sealing = yield* sealingUpload({
|
|
95
|
+
chunks,
|
|
96
|
+
client,
|
|
97
|
+
scope: sessions.scope
|
|
98
|
+
});
|
|
99
|
+
const touched = yield* Clock.currentTimeMillis;
|
|
100
|
+
const lock = yield* Semaphore.make(one);
|
|
101
|
+
sessions.opened += one;
|
|
102
|
+
const upload = `upload-${String(sessions.opened)}`;
|
|
103
|
+
MutableHashMap.set(sessions.held, upload, {
|
|
104
|
+
...owner,
|
|
105
|
+
chunks,
|
|
106
|
+
lock,
|
|
107
|
+
received: none,
|
|
108
|
+
sealing,
|
|
109
|
+
touched
|
|
110
|
+
});
|
|
111
|
+
return upload;
|
|
112
|
+
});
|
|
113
|
+
/**
|
|
114
|
+
* Opens a session. Its slot is taken before the first yield, so concurrent opens can't all pass the same check, and
|
|
115
|
+
* given back if the open fails or is interrupted; a session that opens keeps it until it closes or is dropped.
|
|
116
|
+
*/
|
|
117
|
+
const open = (sessions) => (owner, client) => Effect.acquireUseRelease(Effect.suspend(() => Option.match(takeSlot(sessions, owner), {
|
|
118
|
+
onNone: () => Effect.void,
|
|
119
|
+
onSome: Effect.fail
|
|
120
|
+
})), () => started(sessions, owner, client), (_slot, exit) => Effect.sync(() => {
|
|
121
|
+
if (Exit.isFailure(exit)) giveBack(sessions, owner);
|
|
122
|
+
}));
|
|
123
|
+
const tooLarge = (session, maximumBytes) => FileTooLargeError.make({
|
|
124
|
+
actor: session.address.actor,
|
|
125
|
+
maximumBytes
|
|
126
|
+
});
|
|
127
|
+
/** Refuses a chunk that would take the file past `maximumFileBytes`, and drops its session with the partial upload. */
|
|
128
|
+
const withinMaximum = (sessions, session, { bytes, upload }) => {
|
|
129
|
+
const { maximumFileBytes } = sessions.limits;
|
|
130
|
+
if (session.received + bytes.length <= maximumFileBytes) return Effect.void;
|
|
131
|
+
return Effect.andThen(drop(sessions, [upload, session]), Effect.fail(tooLarge(session, maximumFileBytes)));
|
|
132
|
+
};
|
|
133
|
+
const appendTo = Effect.fnUntraced(function* appendTo(sessions, session, request) {
|
|
134
|
+
const { bytes, offset } = request;
|
|
135
|
+
if (offset < session.received && offset + bytes.length <= session.received) return session.received;
|
|
136
|
+
if (offset !== session.received) return yield* refused(`the chunk starts at byte ${String(offset)}, but the upload has ${String(session.received)}`);
|
|
137
|
+
yield* withinMaximum(sessions, session, request);
|
|
138
|
+
yield* Effect.raceFirst(Queue.offer(session.chunks, bytes), ended(session.sealing));
|
|
139
|
+
session.received += bytes.length;
|
|
140
|
+
return session.received;
|
|
141
|
+
});
|
|
142
|
+
const append = (sessions) => Effect.fnUntraced(function* appending(request) {
|
|
143
|
+
if (request.bytes.length > 1048576) return yield* refused(`a chunk holds at most ${String(uploadChunkBytes)} bytes`);
|
|
144
|
+
const session = yield* owned(sessions, request.upload, request);
|
|
145
|
+
return yield* session.lock.withPermit(appendTo(sessions, session, request));
|
|
146
|
+
});
|
|
147
|
+
const finish = (sessions, session, { bytes, upload }) => {
|
|
148
|
+
if (bytes !== session.received) return Effect.fail(refused(`the upload has ${String(session.received)} bytes, not ${String(bytes)}`));
|
|
149
|
+
return Effect.andThen(Queue.end(session.chunks), Effect.ensuring(Fiber.join(session.sealing), Effect.sync(() => {
|
|
150
|
+
forget(sessions, upload);
|
|
151
|
+
})));
|
|
152
|
+
};
|
|
153
|
+
const close = (sessions) => (closing) => Effect.flatMap(owned(sessions, closing.upload, closing), (session) => session.lock.withPermit(finish(sessions, session, closing)));
|
|
154
|
+
/**
|
|
155
|
+
* Upload sessions of one RPC server. Effect RPC has no client streams, so a network upload is `open`, ordered
|
|
156
|
+
* `append`s and `close`. Each session feeds one sealing upload through a short queue, so a fast client waits for the
|
|
157
|
+
* seal instead of filling memory. Appends are idempotent by offset, so a client may resend a chunk whose reply it
|
|
158
|
+
* lost; a gap or an oversized chunk is refused, and a chunk that would take the file past `maximumFileBytes` fails
|
|
159
|
+
* with `FileTooLargeError` and drops the session. A session is bound to the actor, key and caller that opened it, so
|
|
160
|
+
* its id needs no secrecy. The server holds at most `perServer` sessions, `perCaller` for one caller and `perActor`
|
|
161
|
+
* for one actor (`defaultUploadLimits` unless the host passes its own), and drops one idle for a minute with its
|
|
162
|
+
* partial upload, which is never attached and which the blob store collects as it does any upload no command attached.
|
|
163
|
+
*/
|
|
164
|
+
const uploadSessionsWith = (limits = {}) => Effect.gen(function* makeUploadSessions() {
|
|
165
|
+
const sessions = {
|
|
166
|
+
held: MutableHashMap.empty(),
|
|
167
|
+
limits: {
|
|
168
|
+
...defaultUploadLimits,
|
|
169
|
+
...limits
|
|
170
|
+
},
|
|
171
|
+
opened: none,
|
|
172
|
+
scope: yield* Effect.scope,
|
|
173
|
+
slots: {
|
|
174
|
+
byActor: MutableHashMap.empty(),
|
|
175
|
+
byCaller: MutableHashMap.empty(),
|
|
176
|
+
server: none
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
const reaping = Effect.andThen(Effect.sleep(reapEvery), reap(sessions));
|
|
180
|
+
yield* Effect.forkScoped(Effect.forever(reaping));
|
|
181
|
+
return {
|
|
182
|
+
append: append(sessions),
|
|
183
|
+
close: close(sessions),
|
|
184
|
+
open: open(sessions)
|
|
185
|
+
};
|
|
186
|
+
});
|
|
187
|
+
export { defaultUploadLimits, uploadSessionsWith };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ActorClients } from "../../contract/client/actor-client.adapter.mjs";
|
|
2
|
+
import { ActorFileClients } from "../../contract/file/file-client.adapter.mjs";
|
|
3
|
+
import { ActorHost } from "../engine/actor-host.service.mjs";
|
|
4
|
+
import { ActorsNotHostedError } from "../engine/actors-not-hosted.errors.mjs";
|
|
5
|
+
import { ServedActor } from "./actor-rpc.handlers.mjs";
|
|
6
|
+
import "./akter-server.layer.mjs";
|
|
7
|
+
import { Layer } from "effect";
|
|
8
|
+
import { RpcClient } from "effect/rpc";
|
|
9
|
+
interface InProcessOptions<Actors extends readonly ServedActor[]> {
|
|
10
|
+
readonly actors: Actors;
|
|
11
|
+
}
|
|
12
|
+
declare const localClient: (options: InProcessOptions<readonly ServedActor[]>) => Layer.Layer<ActorClients | ActorFileClients | RpcClient.Protocol, ActorsNotHostedError, ActorHost>;
|
|
13
|
+
export { type InProcessOptions, localClient };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ActorClients } from "../../contract/client/actor-client.adapter.mjs";
|
|
2
|
+
import { rpcFileClients } from "../../contract/file/rpc/rpc-file-clients.layer.mjs";
|
|
3
|
+
import { rpcPath, rpcRoutes } from "./akter-server.layer.mjs";
|
|
4
|
+
import { Effect, Layer } from "effect";
|
|
5
|
+
import { RpcClient, RpcSerialization } from "effect/rpc";
|
|
6
|
+
import { SecureRandom } from "effect/crypto";
|
|
7
|
+
import { HttpClient, HttpClientError, HttpClientRequest, HttpClientResponse, HttpRouter } from "effect/http";
|
|
8
|
+
// src/serve/rpc/in-process-client.layer.ts
|
|
9
|
+
const inProcessOrigin = "http://127.0.0.1";
|
|
10
|
+
const sendTo = (handler) => HttpClient.make((request, _url, signal) => {
|
|
11
|
+
const failed = (cause) => new HttpClientError.HttpClientError({ reason: new HttpClientError.TransportError({
|
|
12
|
+
cause,
|
|
13
|
+
request
|
|
14
|
+
}) });
|
|
15
|
+
return HttpClientRequest.toWeb(request, { signal }).pipe(Effect.mapError(failed), Effect.flatMap((web) => Effect.tryPromise({
|
|
16
|
+
catch: failed,
|
|
17
|
+
try: () => handler(web)
|
|
18
|
+
})), Effect.map((response) => HttpClientResponse.fromWeb(request, response)));
|
|
19
|
+
});
|
|
20
|
+
const inProcessHttp = Effect.fnUntraced(function* inProcessHttp(actors) {
|
|
21
|
+
const routes = yield* rpcRoutes(actors);
|
|
22
|
+
const context = yield* Effect.context();
|
|
23
|
+
const hosted = Layer.provide(routes, Layer.succeedContext(context));
|
|
24
|
+
const web = yield* Effect.acquireRelease(Effect.sync(() => HttpRouter.toWebHandler(hosted, { disableLogger: true })), (built) => Effect.promise(() => built.dispose()));
|
|
25
|
+
return Layer.succeed(HttpClient.HttpClient)(sendTo(web.handler));
|
|
26
|
+
});
|
|
27
|
+
const localClient = (options) => {
|
|
28
|
+
const url = new globalThis.URL(rpcPath, inProcessOrigin).href;
|
|
29
|
+
const http = Layer.unwrap(inProcessHttp(options.actors));
|
|
30
|
+
const protocol = RpcClient.layerProtocolHttp({ url }).pipe(Layer.provide([http, RpcSerialization.layerNdjson]));
|
|
31
|
+
const clients = Layer.merge(ActorClients.layer.pipe(Layer.provide(SecureRandom.layerWebCrypto)), rpcFileClients);
|
|
32
|
+
return Layer.provideMerge(clients, protocol);
|
|
33
|
+
};
|
|
34
|
+
export { localClient };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
declare const ListenerNotLoopbackError_base: Schema.Class<ListenerNotLoopbackError, Schema.TaggedStruct<"ListenerNotLoopbackError", {
|
|
3
|
+
readonly address: Schema.String;
|
|
4
|
+
readonly message: Schema.String;
|
|
5
|
+
}>, import("effect/Cause").YieldableError & {
|
|
6
|
+
readonly brand: unique symbol;
|
|
7
|
+
}>;
|
|
8
|
+
export declare class ListenerNotLoopbackError extends ListenerNotLoopbackError_base {}
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
// src/serve/rpc/listener-not-loopback.errors.ts
|
|
3
|
+
var ListenerNotLoopbackError = class extends Schema.TaggedError()("ListenerNotLoopbackError", {
|
|
4
|
+
address: Schema.String,
|
|
5
|
+
message: Schema.String
|
|
6
|
+
}) {};
|
|
7
|
+
export { ListenerNotLoopbackError };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { HttpServerRequest, HttpServerResponse } from "effect/http";
|
|
3
|
+
type Response = HttpServerResponse.HttpServerResponse;
|
|
4
|
+
declare const ndjsonOnly: <Failure, Services>(app: Effect.Effect<Response, Failure, Services>) => Effect.Effect<Response, Failure, Services | HttpServerRequest.HttpServerRequest>;
|
|
5
|
+
export { ndjsonOnly };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Array, Effect, Option, String } from "effect";
|
|
2
|
+
import { Headers, HttpServerRequest, HttpServerResponse } from "effect/http";
|
|
3
|
+
// src/serve/rpc/ndjson-only.pure.ts
|
|
4
|
+
const unsupportedMediaType = 415;
|
|
5
|
+
const ndjsonTypes = ["application/ndjson", "application/x-ndjson"];
|
|
6
|
+
const refusal = "a POST here must be application/ndjson; a browser sends any other body from another site without asking first, so it is refused";
|
|
7
|
+
const parameters = /;.*$/su;
|
|
8
|
+
const mediaType = (contentType) => String.toLowerCase(String.trim(String.replace(parameters, "")(contentType)));
|
|
9
|
+
const isNdjson = (request) => Option.exists(Headers.get(request.headers, "content-type"), (contentType) => Array.contains(ndjsonTypes, mediaType(contentType)));
|
|
10
|
+
const ndjsonOnly = (app) => HttpServerRequest.HttpServerRequest.use((request) => {
|
|
11
|
+
if (request.method !== "POST" || isNdjson(request)) return app;
|
|
12
|
+
return Effect.succeed(HttpServerResponse.text(refusal, { status: unsupportedMediaType }));
|
|
13
|
+
});
|
|
14
|
+
export { ndjsonOnly };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ActorHost } from "../engine/actor-host.service.mjs";
|
|
2
|
+
import { ActorRpcHandlers, ServedActor } from "./actor-rpc.handlers.mjs";
|
|
3
|
+
import { Effect, Scope } from "effect";
|
|
4
|
+
/** Every handler of the served actors' RPC groups: calls, reads and subscriptions, file streams and computers. */
|
|
5
|
+
declare const servedRpcHandlers: (actors: readonly ServedActor[]) => Effect.Effect<ActorRpcHandlers, never, ActorHost | Scope.Scope>;
|
|
6
|
+
export { type ServedActor, servedRpcHandlers };
|