@amalgm/shell 0.1.164-preview.36072132286 → 0.1.164-preview.36809057014
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/PURPOSE.md +642 -128
- package/README.md +10 -8
- package/dist/accepted-tail.d.ts +26 -0
- package/dist/accepted-tail.js +37 -0
- package/dist/accepted-tail.js.map +1 -0
- package/dist/agent-execution.d.ts +16 -1
- package/dist/agent-execution.js +13 -5
- package/dist/agent-execution.js.map +1 -1
- package/dist/apply-cleanup.d.ts +28 -0
- package/dist/apply-cleanup.js +166 -0
- package/dist/apply-cleanup.js.map +1 -0
- package/dist/apply-recovery.d.ts +47 -0
- package/dist/apply-recovery.js +99 -0
- package/dist/apply-recovery.js.map +1 -0
- package/dist/apply-rows.d.ts +72 -0
- package/dist/apply-rows.js +150 -0
- package/dist/apply-rows.js.map +1 -0
- package/dist/apply-saves.d.ts +85 -0
- package/dist/apply-saves.js +238 -0
- package/dist/apply-saves.js.map +1 -0
- package/dist/boot.js +2 -1
- package/dist/boot.js.map +1 -1
- package/dist/capture-work.d.ts +8 -0
- package/dist/capture-work.js +67 -0
- package/dist/capture-work.js.map +1 -0
- package/dist/cargo-group.d.ts +45 -0
- package/dist/cargo-group.js +88 -0
- package/dist/cargo-group.js.map +1 -0
- package/dist/channel-session.d.ts +4 -2
- package/dist/channel-session.js +4 -3
- package/dist/channel-session.js.map +1 -1
- package/dist/chat-composition.d.ts +2 -0
- package/dist/chat-composition.js +1 -0
- package/dist/chat-composition.js.map +1 -1
- package/dist/cli.js +20 -1
- package/dist/cli.js.map +1 -1
- package/dist/construct-apply-host.d.ts +4 -2
- package/dist/construct-apply-host.js +8 -3
- package/dist/construct-apply-host.js.map +1 -1
- package/dist/construct-door.js +1 -1
- package/dist/construct-door.js.map +1 -1
- package/dist/construct-ledger.d.ts +6 -1
- package/dist/construct-ledger.js +21 -33
- package/dist/construct-ledger.js.map +1 -1
- package/dist/content-cache-collection.d.ts +18 -0
- package/dist/content-cache-collection.js +99 -0
- package/dist/content-cache-collection.js.map +1 -0
- package/dist/content-cache-host.d.ts +83 -17
- package/dist/content-cache-host.js +335 -95
- package/dist/content-cache-host.js.map +1 -1
- package/dist/content-cache-namespace.d.ts +59 -0
- package/dist/content-cache-namespace.js +210 -0
- package/dist/content-cache-namespace.js.map +1 -0
- package/dist/content-cache-ownership.d.ts +13 -0
- package/dist/content-cache-ownership.js +75 -0
- package/dist/content-cache-ownership.js.map +1 -0
- package/dist/content-cache-retention.d.ts +23 -0
- package/dist/content-cache-retention.js +195 -0
- package/dist/content-cache-retention.js.map +1 -0
- package/dist/content-capture-pool.d.ts +287 -0
- package/dist/content-capture-pool.js +461 -0
- package/dist/content-capture-pool.js.map +1 -0
- package/dist/content-capture-worker.d.ts +8 -0
- package/dist/content-capture-worker.js +109 -0
- package/dist/content-capture-worker.js.map +1 -0
- package/dist/content-clock.d.ts +42 -0
- package/dist/content-clock.js +166 -0
- package/dist/content-clock.js.map +1 -0
- package/dist/content-direct.d.ts +2 -0
- package/dist/content-direct.js +12 -0
- package/dist/content-direct.js.map +1 -1
- package/dist/content-failure.d.ts +18 -0
- package/dist/content-failure.js +38 -0
- package/dist/content-failure.js.map +1 -0
- package/dist/content-stream-thread.d.ts +60 -0
- package/dist/content-stream-thread.js +95 -0
- package/dist/content-stream-thread.js.map +1 -0
- package/dist/content-stream-worker.d.ts +7 -0
- package/dist/content-stream-worker.js +52 -0
- package/dist/content-stream-worker.js.map +1 -0
- package/dist/declaration-absorption.d.ts +37 -0
- package/dist/declaration-absorption.js +119 -0
- package/dist/declaration-absorption.js.map +1 -0
- package/dist/declaration-chain.d.ts +36 -0
- package/dist/declaration-chain.js +96 -0
- package/dist/declaration-chain.js.map +1 -0
- package/dist/declaration-commit.d.ts +31 -0
- package/dist/declaration-commit.js +49 -0
- package/dist/declaration-commit.js.map +1 -0
- package/dist/declaration-hold.d.ts +22 -0
- package/dist/declaration-hold.js +24 -0
- package/dist/declaration-hold.js.map +1 -0
- package/dist/declaration-journal.d.ts +62 -0
- package/dist/declaration-journal.js +99 -0
- package/dist/declaration-journal.js.map +1 -0
- package/dist/declaration-save.d.ts +31 -0
- package/dist/declaration-save.js +134 -0
- package/dist/declaration-save.js.map +1 -0
- package/dist/detection/accepted-result.d.ts +19 -1
- package/dist/detection/accepted-result.js +36 -5
- package/dist/detection/accepted-result.js.map +1 -1
- package/dist/detection/admission-save.d.ts +55 -0
- package/dist/detection/admission-save.js +48 -0
- package/dist/detection/admission-save.js.map +1 -0
- package/dist/detection/admission-units.d.ts +66 -0
- package/dist/detection/admission-units.js +322 -0
- package/dist/detection/admission-units.js.map +1 -0
- package/dist/detection/alias-discovery.d.ts +12 -0
- package/dist/detection/alias-discovery.js +80 -0
- package/dist/detection/alias-discovery.js.map +1 -0
- package/dist/detection/alias-examination.d.ts +30 -0
- package/dist/detection/alias-examination.js +49 -0
- package/dist/detection/alias-examination.js.map +1 -0
- package/dist/detection/apply-ownership.d.ts +81 -0
- package/dist/detection/apply-ownership.js +232 -0
- package/dist/detection/apply-ownership.js.map +1 -0
- package/dist/detection/basis-advanced.d.ts +11 -0
- package/dist/detection/basis-advanced.js +26 -0
- package/dist/detection/basis-advanced.js.map +1 -0
- package/dist/detection/capture-outcome.d.ts +16 -0
- package/dist/detection/capture-outcome.js +92 -0
- package/dist/detection/capture-outcome.js.map +1 -0
- package/dist/detection/container-membership.d.ts +32 -0
- package/dist/detection/container-membership.js +49 -0
- package/dist/detection/container-membership.js.map +1 -0
- package/dist/detection/detect-cancelled.d.ts +6 -0
- package/dist/detection/detect-cancelled.js +10 -0
- package/dist/detection/detect-cancelled.js.map +1 -0
- package/dist/detection/directory-proof.d.ts +47 -0
- package/dist/detection/directory-proof.js +77 -0
- package/dist/detection/directory-proof.js.map +1 -0
- package/dist/detection/disposition-rows.d.ts +18 -0
- package/dist/detection/disposition-rows.js +29 -0
- package/dist/detection/disposition-rows.js.map +1 -0
- package/dist/detection/dispositions.d.ts +130 -0
- package/dist/detection/dispositions.js +248 -0
- package/dist/detection/dispositions.js.map +1 -0
- package/dist/detection/git-notice.d.ts +88 -0
- package/dist/detection/git-notice.js +444 -0
- package/dist/detection/git-notice.js.map +1 -0
- package/dist/detection/ground-proof.d.ts +130 -0
- package/dist/detection/ground-proof.js +274 -0
- package/dist/detection/ground-proof.js.map +1 -0
- package/dist/detection/ground-reader.d.ts +29 -0
- package/dist/detection/ground-reader.js +102 -0
- package/dist/detection/ground-reader.js.map +1 -0
- package/dist/detection/held-territory.d.ts +51 -0
- package/dist/detection/held-territory.js +205 -0
- package/dist/detection/held-territory.js.map +1 -0
- package/dist/detection/identity-discovery.d.ts +45 -0
- package/dist/detection/identity-discovery.js +287 -0
- package/dist/detection/identity-discovery.js.map +1 -0
- package/dist/detection/maintenance-sweep.d.ts +108 -0
- package/dist/detection/maintenance-sweep.js +325 -0
- package/dist/detection/maintenance-sweep.js.map +1 -0
- package/dist/detection/name-reach.d.ts +12 -0
- package/dist/detection/name-reach.js +28 -0
- package/dist/detection/name-reach.js.map +1 -0
- package/dist/detection/notebook-basis.d.ts +5 -7
- package/dist/detection/notebook-basis.js +6 -7
- package/dist/detection/notebook-basis.js.map +1 -1
- package/dist/detection/owed-selection.d.ts +51 -0
- package/dist/detection/owed-selection.js +169 -0
- package/dist/detection/owed-selection.js.map +1 -0
- package/dist/detection/portable.d.ts +34 -34
- package/dist/detection/portable.js +67 -93
- package/dist/detection/portable.js.map +1 -1
- package/dist/detection/reconciliation-coverage.d.ts +7 -0
- package/dist/detection/reconciliation-coverage.js +16 -0
- package/dist/detection/reconciliation-coverage.js.map +1 -0
- package/dist/detection/repository-publication.d.ts +20 -0
- package/dist/detection/repository-publication.js +79 -0
- package/dist/detection/repository-publication.js.map +1 -0
- package/dist/detection/repository-routes.d.ts +43 -0
- package/dist/detection/repository-routes.js +97 -0
- package/dist/detection/repository-routes.js.map +1 -0
- package/dist/detection/root-examination.d.ts +94 -0
- package/dist/detection/root-examination.js +523 -0
- package/dist/detection/root-examination.js.map +1 -0
- package/dist/detection/runtime.d.ts +131 -64
- package/dist/detection/runtime.js +808 -1103
- package/dist/detection/runtime.js.map +1 -1
- package/dist/detection/scoped-identity-port.d.ts +34 -0
- package/dist/detection/scoped-identity-port.js +81 -0
- package/dist/detection/scoped-identity-port.js.map +1 -0
- package/dist/detection/seal-law.d.ts +66 -0
- package/dist/detection/seal-law.js +116 -0
- package/dist/detection/seal-law.js.map +1 -0
- package/dist/detection/sharing-policy.d.ts +11 -0
- package/dist/detection/sharing-policy.js +32 -0
- package/dist/detection/sharing-policy.js.map +1 -0
- package/dist/detection/thread-database.d.ts +4 -0
- package/dist/detection/thread-database.js +30 -0
- package/dist/detection/thread-database.js.map +1 -0
- package/dist/detection/unreadable.d.ts +11 -0
- package/dist/detection/unreadable.js +9 -0
- package/dist/detection/unreadable.js.map +1 -0
- package/dist/detection/verified-content.d.ts +6 -0
- package/dist/detection/verified-content.js +12 -0
- package/dist/detection/verified-content.js.map +1 -0
- package/dist/detection/walk-law.d.ts +34 -0
- package/dist/detection/walk-law.js +55 -0
- package/dist/detection/walk-law.js.map +1 -0
- package/dist/development/fly-guest.js +2 -1
- package/dist/development/fly-guest.js.map +1 -1
- package/dist/entity-apply-host.d.ts +29 -13
- package/dist/entity-apply-host.js +1426 -461
- package/dist/entity-apply-host.js.map +1 -1
- package/dist/entity-apply-store.d.ts +77 -30
- package/dist/entity-apply-store.js +221 -516
- package/dist/entity-apply-store.js.map +1 -1
- package/dist/entity-record-observability.js +2 -0
- package/dist/entity-record-observability.js.map +1 -1
- package/dist/entity-record-saves.d.ts +20 -0
- package/dist/entity-record-saves.js +91 -0
- package/dist/entity-record-saves.js.map +1 -0
- package/dist/entity-record-store.d.ts +15 -7
- package/dist/entity-record-store.js +57 -117
- package/dist/entity-record-store.js.map +1 -1
- package/dist/files-register-host.d.ts +22 -3
- package/dist/files-register-host.js +70 -31
- package/dist/files-register-host.js.map +1 -1
- package/dist/filesystem.js +3 -2
- package/dist/filesystem.js.map +1 -1
- package/dist/git-binding.d.ts +65 -0
- package/dist/git-binding.js +220 -0
- package/dist/git-binding.js.map +1 -0
- package/dist/git-capture.d.ts +39 -0
- package/dist/git-capture.js +86 -0
- package/dist/git-capture.js.map +1 -0
- package/dist/git-card.d.ts +12 -0
- package/dist/git-card.js +123 -0
- package/dist/git-card.js.map +1 -0
- package/dist/git-checkpoint-construction.d.ts +41 -0
- package/dist/git-checkpoint-construction.js +96 -0
- package/dist/git-checkpoint-construction.js.map +1 -0
- package/dist/git-checkpoint-preparation.d.ts +37 -0
- package/dist/git-checkpoint-preparation.js +145 -0
- package/dist/git-checkpoint-preparation.js.map +1 -0
- package/dist/git-command.d.ts +61 -8
- package/dist/git-command.js +217 -63
- package/dist/git-command.js.map +1 -1
- package/dist/git-configuration.d.ts +40 -0
- package/dist/git-configuration.js +217 -0
- package/dist/git-configuration.js.map +1 -0
- package/dist/git-evidence.d.ts +61 -0
- package/dist/git-evidence.js +181 -0
- package/dist/git-evidence.js.map +1 -0
- package/dist/git-index-entries.d.ts +15 -0
- package/dist/git-index-entries.js +44 -0
- package/dist/git-index-entries.js.map +1 -0
- package/dist/git-index-format.d.ts +35 -0
- package/dist/git-index-format.js +293 -0
- package/dist/git-index-format.js.map +1 -0
- package/dist/git-index-witness.d.ts +33 -0
- package/dist/git-index-witness.js +69 -0
- package/dist/git-index-witness.js.map +1 -0
- package/dist/git-literal-host.d.ts +82 -0
- package/dist/git-literal-host.js +172 -0
- package/dist/git-literal-host.js.map +1 -0
- package/dist/git-literal-read.d.ts +88 -0
- package/dist/git-literal-read.js +170 -0
- package/dist/git-literal-read.js.map +1 -0
- package/dist/git-literal-replay.d.ts +33 -0
- package/dist/git-literal-replay.js +268 -0
- package/dist/git-literal-replay.js.map +1 -0
- package/dist/git-native-file.d.ts +42 -0
- package/dist/git-native-file.js +145 -0
- package/dist/git-native-file.js.map +1 -0
- package/dist/git-native-index.d.ts +21 -0
- package/dist/git-native-index.js +44 -0
- package/dist/git-native-index.js.map +1 -0
- package/dist/git-operation-host.d.ts +48 -0
- package/dist/git-operation-host.js +127 -0
- package/dist/git-operation-host.js.map +1 -0
- package/dist/git-private-index.d.ts +11 -0
- package/dist/git-private-index.js +42 -0
- package/dist/git-private-index.js.map +1 -0
- package/dist/git-private-repository.d.ts +4 -0
- package/dist/git-private-repository.js +69 -0
- package/dist/git-private-repository.js.map +1 -0
- package/dist/git-private-view.d.ts +39 -0
- package/dist/git-private-view.js +162 -0
- package/dist/git-private-view.js.map +1 -0
- package/dist/git-ref-store.d.ts +12 -0
- package/dist/git-ref-store.js +68 -0
- package/dist/git-ref-store.js.map +1 -0
- package/dist/git-registration-host.d.ts +20 -30
- package/dist/git-registration-host.js +86 -249
- package/dist/git-registration-host.js.map +1 -1
- package/dist/git-repository-host.d.ts +148 -22
- package/dist/git-repository-host.js +633 -650
- package/dist/git-repository-host.js.map +1 -1
- package/dist/git-worktree-host.d.ts +2 -0
- package/dist/git-worktree-host.js +16 -0
- package/dist/git-worktree-host.js.map +1 -0
- package/dist/graph-publication.d.ts +75 -0
- package/dist/graph-publication.js +203 -0
- package/dist/graph-publication.js.map +1 -0
- package/dist/ground-basis.d.ts +242 -0
- package/dist/ground-basis.js +1023 -0
- package/dist/ground-basis.js.map +1 -0
- package/dist/ground-checkpoint-worker.d.ts +1 -0
- package/dist/ground-checkpoint-worker.js +84 -0
- package/dist/ground-checkpoint-worker.js.map +1 -0
- package/dist/ground-checkpoints.d.ts +16 -0
- package/dist/ground-checkpoints.js +45 -0
- package/dist/ground-checkpoints.js.map +1 -0
- package/dist/ground-coordination.d.ts +107 -3
- package/dist/ground-coordination.js +249 -24
- package/dist/ground-coordination.js.map +1 -1
- package/dist/ground-database.d.ts +42 -0
- package/dist/ground-database.js +290 -0
- package/dist/ground-database.js.map +1 -0
- package/dist/ground-differences.d.ts +23 -0
- package/dist/ground-differences.js +47 -0
- package/dist/ground-differences.js.map +1 -0
- package/dist/ground-holders.d.ts +4 -0
- package/dist/ground-holders.js +15 -0
- package/dist/ground-holders.js.map +1 -0
- package/dist/ground-initialization-worker.d.ts +1 -0
- package/dist/ground-initialization-worker.js +20 -0
- package/dist/ground-initialization-worker.js.map +1 -0
- package/dist/ground-initialization.d.ts +35 -0
- package/dist/ground-initialization.js +102 -0
- package/dist/ground-initialization.js.map +1 -0
- package/dist/ground-install-saves.d.ts +63 -0
- package/dist/ground-install-saves.js +139 -0
- package/dist/ground-install-saves.js.map +1 -0
- package/dist/ground-inventory-schema.d.ts +18 -0
- package/dist/ground-inventory-schema.js +168 -0
- package/dist/ground-inventory-schema.js.map +1 -0
- package/dist/ground-profile.d.ts +7 -0
- package/dist/ground-profile.js +52 -0
- package/dist/ground-profile.js.map +1 -0
- package/dist/ground-root-index.d.ts +2 -1
- package/dist/ground-root-index.js +16 -14
- package/dist/ground-root-index.js.map +1 -1
- package/dist/ground-row.d.ts +62 -0
- package/dist/ground-row.js +70 -0
- package/dist/ground-row.js.map +1 -0
- package/dist/ground-save-ops.d.ts +44 -0
- package/dist/ground-save-ops.js +41 -0
- package/dist/ground-save-ops.js.map +1 -0
- package/dist/ground-saver-worker.d.ts +1 -0
- package/dist/ground-saver-worker.js +156 -0
- package/dist/ground-saver-worker.js.map +1 -0
- package/dist/ground-saver.d.ts +75 -0
- package/dist/ground-saver.js +216 -0
- package/dist/ground-saver.js.map +1 -0
- package/dist/ground-store.d.ts +84 -0
- package/dist/ground-store.js +473 -0
- package/dist/ground-store.js.map +1 -0
- package/dist/ground-territory.d.ts +130 -0
- package/dist/ground-territory.js +511 -0
- package/dist/ground-territory.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/installation/ownership.d.ts +0 -2
- package/dist/installation/ownership.js +3 -15
- package/dist/installation/ownership.js.map +1 -1
- package/dist/machine-host.d.ts +3 -2
- package/dist/machine-host.js +28 -16
- package/dist/machine-host.js.map +1 -1
- package/dist/materialized-graph.d.ts +7 -7
- package/dist/materialized-graph.js +11 -23
- package/dist/materialized-graph.js.map +1 -1
- package/dist/module-thread.d.ts +9 -0
- package/dist/module-thread.js +10 -0
- package/dist/module-thread.js.map +1 -0
- package/dist/native/fsevents-stream.node +0 -0
- package/dist/physical-path-witness.d.ts +64 -0
- package/dist/physical-path-witness.js +168 -0
- package/dist/physical-path-witness.js.map +1 -0
- package/dist/register-upload-fusion.d.ts +5 -4
- package/dist/register-upload-fusion.js +9 -6
- package/dist/register-upload-fusion.js.map +1 -1
- package/dist/registry-graph.d.ts +3 -2
- package/dist/registry-graph.js +9 -6
- package/dist/registry-graph.js.map +1 -1
- package/dist/registry-page-cache.d.ts +5 -2
- package/dist/registry-page-cache.js.map +1 -1
- package/dist/repository-identity-steps.d.ts +5 -0
- package/dist/repository-identity-steps.js +33 -0
- package/dist/repository-identity-steps.js.map +1 -0
- package/dist/runtime-node-flags.d.ts +10 -0
- package/dist/runtime-node-flags.js +11 -0
- package/dist/runtime-node-flags.js.map +1 -0
- package/dist/service/adapter.d.ts +1 -1
- package/dist/service/adapter.js +1 -1
- package/dist/service/adapter.js.map +1 -1
- package/dist/service/cli.js +16 -20
- package/dist/service/cli.js.map +1 -1
- package/dist/service/control.d.ts +2 -2
- package/dist/service/keepalive.d.ts +4 -11
- package/dist/service/keepalive.js +65 -118
- package/dist/service/keepalive.js.map +1 -1
- package/dist/service/policy.d.ts +36 -0
- package/dist/service/policy.js +25 -0
- package/dist/service/policy.js.map +1 -0
- package/dist/service/portable.d.ts +1 -1
- package/dist/service/portable.js +1 -1
- package/dist/service/portable.js.map +1 -1
- package/dist/service/recovery.d.ts +10 -9
- package/dist/service/recovery.js +29 -19
- package/dist/service/recovery.js.map +1 -1
- package/dist/service/windows-action.d.ts +5 -3
- package/dist/service/windows-action.js +6 -9
- package/dist/service/windows-action.js.map +1 -1
- package/dist/service/windows-task.js +5 -5
- package/dist/service/windows-task.js.map +1 -1
- package/dist/sharing-admission.d.ts +17 -0
- package/dist/sharing-admission.js +128 -0
- package/dist/sharing-admission.js.map +1 -0
- package/dist/snapshot-delivery-baseline.d.ts +12 -3
- package/dist/snapshot-delivery-baseline.js +41 -42
- package/dist/snapshot-delivery-baseline.js.map +1 -1
- package/dist/source-proof.d.ts +36 -0
- package/dist/source-proof.js +70 -0
- package/dist/source-proof.js.map +1 -0
- package/dist/source-signature.d.ts +56 -0
- package/dist/source-signature.js +56 -0
- package/dist/source-signature.js.map +1 -0
- package/dist/source-witness.d.ts +15 -0
- package/dist/source-witness.js +29 -0
- package/dist/source-witness.js.map +1 -0
- package/dist/sqlite-durability.d.ts +31 -0
- package/dist/sqlite-durability.js +28 -0
- package/dist/sqlite-durability.js.map +1 -0
- package/dist/sqlite.d.ts +8 -2
- package/dist/sqlite.js +27 -4
- package/dist/sqlite.js.map +1 -1
- package/dist/sync-address.d.ts +19 -0
- package/dist/sync-address.js +52 -0
- package/dist/sync-address.js.map +1 -0
- package/dist/sync-setting.d.ts +15 -0
- package/dist/sync-setting.js +13 -0
- package/dist/sync-setting.js.map +1 -1
- package/dist/turns.d.ts +42 -0
- package/dist/turns.js +112 -0
- package/dist/turns.js.map +1 -0
- package/dist/updates/bootstrap.d.ts +53 -7
- package/dist/updates/bootstrap.js +224 -137
- package/dist/updates/bootstrap.js.map +1 -1
- package/dist/updates/controller.d.ts +8 -0
- package/dist/updates/controller.js +27 -3
- package/dist/updates/controller.js.map +1 -1
- package/dist/updates/store.d.ts +3 -0
- package/dist/updates/store.js +12 -0
- package/dist/updates/store.js.map +1 -1
- package/dist/user-ground-host.d.ts +364 -69
- package/dist/user-ground-host.js +5231 -3366
- package/dist/user-ground-host.js.map +1 -1
- package/dist/watching/fsevents.d.ts +52 -1
- package/dist/watching/fsevents.js +60 -25
- package/dist/watching/fsevents.js.map +1 -1
- package/dist/watching/host.d.ts +129 -5
- package/dist/watching/host.js +433 -80
- package/dist/watching/host.js.map +1 -1
- package/dist/watching/index.d.ts +1 -1
- package/dist/wire-binary.d.ts +3 -2
- package/dist/wire-binary.js +10 -8
- package/dist/wire-binary.js.map +1 -1
- package/dist/wire-client.d.ts +3 -4
- package/dist/wire-client.js +18 -44
- package/dist/wire-client.js.map +1 -1
- package/dist/wire-outbox.d.ts +34 -0
- package/dist/wire-outbox.js +127 -0
- package/dist/wire-outbox.js.map +1 -0
- package/dist/workspace-host.d.ts +4 -0
- package/dist/workspace-host.js +12 -1
- package/dist/workspace-host.js.map +1 -1
- package/examinations/fixtures/private-wire-authority.js +133 -10
- package/npm-shrinkwrap.json +43 -56
- package/package.json +26 -13
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type Database from "better-sqlite3";
|
|
2
|
+
import { type SourceStat } from "./source-signature.js";
|
|
3
|
+
export interface ContentBoundary {
|
|
4
|
+
/** The stamp's mtime less its profile's margin, nanoseconds in decimal. */
|
|
5
|
+
readonly ns: string;
|
|
6
|
+
/** The device whose clock wrote the stamp. */
|
|
7
|
+
readonly dev: bigint;
|
|
8
|
+
}
|
|
9
|
+
/** One stamp: its boundary, and the retirement epoch it completed in, which
|
|
10
|
+
* every conclusion drawn from reads after it is drawn in. */
|
|
11
|
+
export interface ContentStamp {
|
|
12
|
+
readonly boundary: ContentBoundary | null;
|
|
13
|
+
readonly epoch: number;
|
|
14
|
+
}
|
|
15
|
+
/** The boundary one leaf may carry: none under another device's clock. */
|
|
16
|
+
export declare const leafBoundary: (clock: ContentBoundary | null, stat: Pick<SourceStat, "dev">) => string | null;
|
|
17
|
+
/** How a directory listing read under clock closes: `racy` until a fresh
|
|
18
|
+
* listing under a later stamp can, `unqualified` when no stamp can because
|
|
19
|
+
* the root has no clock or another device holds the directory, so only
|
|
20
|
+
* listing it again after its walk closes it (see detection/ground-proof.ts). */
|
|
21
|
+
export declare function listingQualification(clock: ContentBoundary | null, stat: Pick<SourceStat, "dev" | "mtimeNs" | "ctimeNs">): "qualified" | "racy" | "unqualified";
|
|
22
|
+
/** Milliseconds until a later stamp can qualify a fresh listing of a racy
|
|
23
|
+
* directory that stays untouched: stamps only advance, so a stamp taken that
|
|
24
|
+
* long after this one has a boundary past both of its times. */
|
|
25
|
+
export declare function listingWaitMs(clock: ContentBoundary, stat: Pick<SourceStat, "mtimeNs" | "ctimeNs">): number;
|
|
26
|
+
/** The retirement epoch a conclusion drawn now is drawn in. */
|
|
27
|
+
export declare const clockEpoch: () => number;
|
|
28
|
+
/** Throws when a retirement since epoch touched root's ground: at, above or
|
|
29
|
+
* beneath it. */
|
|
30
|
+
export declare function assertQualifiedSince(root: string, epoch: number): void;
|
|
31
|
+
/** Stamps root's content clock. The boundary is null when the root cannot
|
|
32
|
+
* hold a stamp, being absent or unwritable, or when its filesystem is
|
|
33
|
+
* untrusted, which is still stamped so that a later trusted stamp sees the
|
|
34
|
+
* change of profile: no leaf under it is then qualified, and every one is
|
|
35
|
+
* reread by whatever reads it next, and every listing under it closes only by
|
|
36
|
+
* being listed again. */
|
|
37
|
+
export declare function stampContentClock(file: string, root: string): Promise<ContentStamp>;
|
|
38
|
+
/** The save: every leaf at or under root, in both inventories, loses its
|
|
39
|
+
* proof. Returns how many proofs it retired. */
|
|
40
|
+
export declare function retireProofs(database: Database.Database, { root }: {
|
|
41
|
+
readonly root: string;
|
|
42
|
+
}): number;
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { lstat, mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { GroundBasisChangedError } from "./ground-basis.js";
|
|
4
|
+
import { groundProfile } from "./ground-profile.js";
|
|
5
|
+
import { save } from "./ground-saver.js";
|
|
6
|
+
import { groundStore } from "./ground-store.js";
|
|
7
|
+
import { precedenceWaitNs, timePrecedes } from "./source-signature.js";
|
|
8
|
+
import { cachedStatement } from "./sqlite.js";
|
|
9
|
+
/** The boundary one leaf may carry: none under another device's clock. */
|
|
10
|
+
export const leafBoundary = (clock, stat) => clock !== null && clock.dev === stat.dev ? clock.ns : null;
|
|
11
|
+
/** How a directory listing read under clock closes: `racy` until a fresh
|
|
12
|
+
* listing under a later stamp can, `unqualified` when no stamp can because
|
|
13
|
+
* the root has no clock or another device holds the directory, so only
|
|
14
|
+
* listing it again after its walk closes it (see detection/ground-proof.ts). */
|
|
15
|
+
export function listingQualification(clock, stat) {
|
|
16
|
+
if (clock === null || clock.dev !== stat.dev)
|
|
17
|
+
return "unqualified";
|
|
18
|
+
const boundary = BigInt(clock.ns);
|
|
19
|
+
return timePrecedes(stat.mtimeNs, boundary) && timePrecedes(stat.ctimeNs, boundary) ? "qualified" : "racy";
|
|
20
|
+
}
|
|
21
|
+
/** Milliseconds until a later stamp can qualify a fresh listing of a racy
|
|
22
|
+
* directory that stays untouched: stamps only advance, so a stamp taken that
|
|
23
|
+
* long after this one has a boundary past both of its times. */
|
|
24
|
+
export function listingWaitMs(clock, stat) {
|
|
25
|
+
const boundary = BigInt(clock.ns);
|
|
26
|
+
const mtime = precedenceWaitNs(stat.mtimeNs, boundary), ctime = precedenceWaitNs(stat.ctimeNs, boundary);
|
|
27
|
+
return Number(((mtime > ctime ? mtime : ctime) + 999999n) / 1000000n);
|
|
28
|
+
}
|
|
29
|
+
const UNSTAMPABLE = new Set(["EACCES", "EPERM", "EROFS", "ENOENT", "ENOTDIR"]);
|
|
30
|
+
const IGNORE_ALL = "*\n";
|
|
31
|
+
/** Control trees this process already told Git to ignore. */
|
|
32
|
+
const ignoredControls = new Set();
|
|
33
|
+
/** The profile each root was last stamped under by this process. */
|
|
34
|
+
const stampedUnder = new Map();
|
|
35
|
+
/** Retirements this process took, and the latest one of each root. */
|
|
36
|
+
let retirements = 0;
|
|
37
|
+
const retiredAt = new Map();
|
|
38
|
+
/** The retirement epoch a conclusion drawn now is drawn in. */
|
|
39
|
+
export const clockEpoch = () => retirements;
|
|
40
|
+
/** Throws when a retirement since epoch touched root's ground: at, above or
|
|
41
|
+
* beneath it. */
|
|
42
|
+
export function assertQualifiedSince(root, epoch) {
|
|
43
|
+
for (const [retired, at] of retiredAt) {
|
|
44
|
+
if (at > epoch && (retired === root || retired.startsWith(`${root}/`) || root.startsWith(`${retired}/`))) {
|
|
45
|
+
throw new GroundBasisChangedError(`${retired} was requalified after a conclusion under ${root}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const absent = (error) => error.code === "ENOENT";
|
|
50
|
+
/** The profile a standing stamp names; null when it names none. */
|
|
51
|
+
async function stampProfile(clock) {
|
|
52
|
+
try {
|
|
53
|
+
return (await readFile(clock, "utf8")).match(/^content clock (\S+)\n$/)?.[1] ?? null;
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
if (absent(error))
|
|
57
|
+
return null;
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** Writes the control tree's `.gitignore` when it is absent or different. */
|
|
62
|
+
async function ignoreControl(control) {
|
|
63
|
+
if (ignoredControls.has(control))
|
|
64
|
+
return;
|
|
65
|
+
const file = join(control, ".gitignore");
|
|
66
|
+
let current = null;
|
|
67
|
+
try {
|
|
68
|
+
current = await readFile(file, "utf8");
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
if (!absent(error))
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
if (current !== IGNORE_ALL)
|
|
75
|
+
await writeFile(file, IGNORE_ALL);
|
|
76
|
+
ignoredControls.add(control);
|
|
77
|
+
}
|
|
78
|
+
/** Each root's latest stamp, settled either way. */
|
|
79
|
+
const stamping = new Map();
|
|
80
|
+
/** Stamps root's content clock. The boundary is null when the root cannot
|
|
81
|
+
* hold a stamp, being absent or unwritable, or when its filesystem is
|
|
82
|
+
* untrusted, which is still stamped so that a later trusted stamp sees the
|
|
83
|
+
* change of profile: no leaf under it is then qualified, and every one is
|
|
84
|
+
* reread by whatever reads it next, and every listing under it closes only by
|
|
85
|
+
* being listed again. */
|
|
86
|
+
export function stampContentClock(file, root) {
|
|
87
|
+
const stamp = (stamping.get(root) ?? Promise.resolve()).then(() => stampNow(file, root));
|
|
88
|
+
const settled = stamp.then(() => { }, () => { });
|
|
89
|
+
stamping.set(root, settled);
|
|
90
|
+
void settled.then(() => { if (stamping.get(root) === settled)
|
|
91
|
+
stamping.delete(root); });
|
|
92
|
+
return stamp;
|
|
93
|
+
}
|
|
94
|
+
async function stampNow(file, root) {
|
|
95
|
+
const control = join(root, ".amalgm");
|
|
96
|
+
const clock = join(control, "content-clock"), next = `${clock}.next`;
|
|
97
|
+
let profile;
|
|
98
|
+
try {
|
|
99
|
+
profile = groundProfile(root);
|
|
100
|
+
const content = `content clock ${profile.id}\n`;
|
|
101
|
+
// Only written bytes move mtime everywhere; truncating an empty file
|
|
102
|
+
// does not on every filesystem.
|
|
103
|
+
try {
|
|
104
|
+
await writeFile(next, content);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
if (!absent(error))
|
|
108
|
+
throw error;
|
|
109
|
+
// Only the control tree is created; a vanished root stays vanished.
|
|
110
|
+
await mkdir(control, { mode: 0o700 });
|
|
111
|
+
await writeFile(next, content);
|
|
112
|
+
}
|
|
113
|
+
await ignoreControl(control);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
if (UNSTAMPABLE.has(error.code ?? ""))
|
|
117
|
+
return { boundary: null, epoch: retirements };
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
const stamp = await lstat(next, { bigint: true });
|
|
121
|
+
let previous;
|
|
122
|
+
try {
|
|
123
|
+
previous = await lstat(clock, { bigint: true });
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
if (!absent(error))
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
const backwards = previous !== undefined && stamp.mtimeNs < previous.mtimeNs;
|
|
130
|
+
const requalified = previous === undefined
|
|
131
|
+
|| stampedUnder.get(root) !== profile.id && await stampProfile(clock) !== profile.id;
|
|
132
|
+
// The previous stamp is replaced only after its retirement committed.
|
|
133
|
+
const retired = backwards || requalified ? await retire(file, root) : 0;
|
|
134
|
+
await rename(next, clock);
|
|
135
|
+
stampedUnder.set(root, profile.id);
|
|
136
|
+
if (backwards)
|
|
137
|
+
throw new GroundBasisChangedError(`the filesystem clock under ${root} went backwards; its content proofs were retired`);
|
|
138
|
+
if (retired)
|
|
139
|
+
throw new GroundBasisChangedError(`${root} is now stamped under ${profile.id}; its earlier content proofs were retired`);
|
|
140
|
+
return { boundary: profile.marginNs === null ? null : { ns: (stamp.mtimeNs - profile.marginNs).toString(), dev: stamp.dev },
|
|
141
|
+
epoch: retirements };
|
|
142
|
+
}
|
|
143
|
+
/** Every leaf at or under root loses its proof, as a save. A conclusion
|
|
144
|
+
* drawn under root from here on is drawn in the new epoch. */
|
|
145
|
+
async function retire(file, root) {
|
|
146
|
+
retiredAt.set(root, ++retirements);
|
|
147
|
+
return (await save(file, "ground.retireProofs", { root })).value;
|
|
148
|
+
}
|
|
149
|
+
/** The save: every leaf at or under root, in both inventories, loses its
|
|
150
|
+
* proof. Returns how many proofs it retired. */
|
|
151
|
+
export function retireProofs(database, { root }) {
|
|
152
|
+
const prefix = `${root}/`;
|
|
153
|
+
let retired = 0;
|
|
154
|
+
groundStore(database).write(writer => {
|
|
155
|
+
for (const inventory of ["entities", "detection_notebook"]) {
|
|
156
|
+
const proven = cachedStatement(database, `SELECT uuid FROM ${inventory} WHERE content_verified_ns IS NOT NULL
|
|
157
|
+
AND (absolute_path = ? OR substr(absolute_path, 1, ?) = ?)`).pluck().all(root, prefix.length, prefix);
|
|
158
|
+
for (const uuid of proven) {
|
|
159
|
+
writer.update(inventory, uuid, { contentVerifiedNs: null }, inventory === "detection_notebook" ? "retain-equivalent" : undefined);
|
|
160
|
+
}
|
|
161
|
+
retired += proven.length;
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
return retired;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=content-clock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-clock.js","sourceRoot":"","sources":["../src/content-clock.ts"],"names":[],"mappings":"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"}
|
package/dist/content-direct.d.ts
CHANGED
|
@@ -30,6 +30,8 @@ export interface DirectContentMetrics {
|
|
|
30
30
|
}
|
|
31
31
|
export declare class DirectContentPlane {
|
|
32
32
|
private readonly signal?;
|
|
33
|
+
/** This process's one-time fetch-client compile, measured at construction. */
|
|
34
|
+
readonly warmMs: number;
|
|
33
35
|
/** Key material is stable for a resource's lifetime, so one handoff per
|
|
34
36
|
* process is enough; it lives only in memory, never at rest. */
|
|
35
37
|
private readonly keys;
|
package/dist/content-direct.js
CHANGED
|
@@ -36,8 +36,20 @@ function decodeRefs(frame) {
|
|
|
36
36
|
return { url, offset: Number(ref.offset), length: Number(ref.length) };
|
|
37
37
|
});
|
|
38
38
|
}
|
|
39
|
+
/** Node compiles its bundled fetch client on first use: one synchronous
|
|
40
|
+
* step of tens of milliseconds. A plane pays it when built, as declared
|
|
41
|
+
* startup work before readiness, not as a stall inside the first download.
|
|
42
|
+
* Constructing `Headers` loads that same client. Answers the milliseconds
|
|
43
|
+
* spent; zero once the client is loaded. */
|
|
44
|
+
function warmFetchClient() {
|
|
45
|
+
const started = performance.now();
|
|
46
|
+
void new Headers();
|
|
47
|
+
return performance.now() - started;
|
|
48
|
+
}
|
|
39
49
|
export class DirectContentPlane {
|
|
40
50
|
signal;
|
|
51
|
+
/** This process's one-time fetch-client compile, measured at construction. */
|
|
52
|
+
warmMs = warmFetchClient();
|
|
41
53
|
/** Key material is stable for a resource's lifetime, so one handoff per
|
|
42
54
|
* process is enough; it lives only in memory, never at rest. */
|
|
43
55
|
keys = new Map();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-direct.js","sourceRoot":"","sources":["../src/content-direct.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,0BAA0B,GAI3B,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AA0BpD,SAAS,UAAU,CAAC,KAA8B;IAChD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC;WACpE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACtB,MAAM,GAAG,GAAG,GAA4D,CAAC;QACzE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5F,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAW,CAAC;QAC5C,IAAI,GAAG,CAAC,MAAM,IAAI,IAAI,IAAI,GAAG,CAAC,MAAM,IAAI,IAAI;YAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;eAC1D,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;eAC3D,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACpE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,OAAO,kBAAkB;
|
|
1
|
+
{"version":3,"file":"content-direct.js","sourceRoot":"","sources":["../src/content-direct.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,0BAA0B,GAI3B,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AA0BpD,SAAS,UAAU,CAAC,KAA8B;IAChD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC;WACpE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACtB,MAAM,GAAG,GAAG,GAA4D,CAAC;QACzE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5F,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAW,CAAC;QAC5C,IAAI,GAAG,CAAC,MAAM,IAAI,IAAI,IAAI,GAAG,CAAC,MAAM,IAAI,IAAI;YAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;eAC1D,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;eAC3D,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACpE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;4CAI4C;AAC5C,SAAS,eAAe;IACtB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAClC,KAAK,IAAI,OAAO,EAAE,CAAC;IACnB,OAAO,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;AACrC,CAAC;AAED,MAAM,OAAO,kBAAkB;IAayB;IAZtD,8EAA8E;IACrE,MAAM,GAAG,eAAe,EAAE,CAAC;IAEpC;oEACgE;IAC/C,IAAI,GAAG,IAAI,GAAG,EAAuC,CAAC;IACtD,IAAI,CAAoB;IAExB,QAAQ,GAAG;QAC1B,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC;KACrF,CAAC;IAEF,YAAY,IAAuB,EAAmB,MAAoB;QAApB,WAAM,GAAN,MAAM,CAAc;QACxE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,OAAO;QACL,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED;6EACyE;IACzE,KAAK,CAAC,WAAW,CACf,UAAkB,EAClB,OAAqC;QAErC,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACtC,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;gBACpC,IAAI,EAAE,6BAA6B;gBACnC,WAAW,EAAE,UAAU;gBACvB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;aACjF,EAAE,CAAC,oCAAoC,CAAC,CAAC,CAAC;YAC3C,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC;QAC1D,CAAC;IACH,CAAC;IAED;;uCAEmC;IACnC,KAAK,CAAC,SAAS,CAAC,GAAW,EAAE,IAAqB;QAChD,IAAI,IAAI;YAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,CAAC,CAAC;;YACnC,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7D,IAAI,CAAC,QAAQ,CAAC,YAAY,IAAI,KAAK,CAAC,UAAU,CAAC;QAC/C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,YAAY,CAChB,UAAkB,EAClB,MAAkB;QAElB,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC5D,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE;gBAC3D,UAAU;gBACV,QAAQ;gBACR,OAAO,EAAE,gBAAgB;aAC1B,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAC1E,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;QAChE,CAAC;IACH,CAAC;IAED;;;gDAG4C;IAC5C,KAAK,CAAC,WAAW,CAAC,UAAkB,EAAE,MAAyB;QAC7D,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,IAAI,GAAG,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAC3F,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;YAC/D,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;YAC5C,CAAC,CAAC,IAAI,CAAC;QACT,IAAI,MAAkB,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kEAAkE;YAClE,sEAAsE;YACtE,IAAI,KAAK,YAAY,gBAAgB,IAAI,KAAK,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;gBACnF,MAAM,IAAI,gBAAgB,CAAC;oBACzB,IAAI,EAAE,cAAc;oBACpB,IAAI,EAAE,0BAA0B;oBAChC,OAAO,EAAE,0BAA0B,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE;oBACjE,MAAM,EAAE,GAAG;oBACX,SAAS,EAAE,KAAK;iBACjB,CAAC,CAAC;YACL,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAEO,UAAU,CAAC,UAAkB;QACnC,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,SAAS,GAAG,CAAC,KAAK,IAAiC,EAAE;gBACzD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;oBACpC,IAAI,EAAE,4BAA4B;oBAClC,WAAW,EAAE,UAAU;iBACxB,EAAE,CAAC,qCAAqC,CAAC,CAAC,CAAC;gBAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;gBAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;gBAC9C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;oBACtD,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;gBACrE,CAAC;gBACD,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;YACvD,CAAC,CAAC,EAAE,CAAC;YACL,4EAA4E;YAC5E,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE;gBACnB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,SAAS;oBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC5E,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACrC,OAAO,GAAG,SAAS,CAAC;QACtB,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAED;;;iBAGiB;AACjB,KAAK,UAAU,gBAAgB,CAAC,GAAW,EAAE,IAAqB,EAAE,MAAoB;IACtF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM;QACN,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjG,CAAC,CAAC;IACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,IAAI,gBAAgB,CAAC;YACzB,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,0BAA0B;YAChC,OAAO,EAAE,wDAAwD;YACjE,MAAM,EAAE,GAAG;YACX,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,MAAM,qBAAqB,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAClD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A content thread's failure as it crosses to the main thread. Only plain
|
|
3
|
+
* fields survive structured clone, so a thread describes its error by the
|
|
4
|
+
* fields callers classify by — above all `code` — and the main thread
|
|
5
|
+
* restores an Error of the same kind. A churned capture returns as
|
|
6
|
+
* CaptureSourceChangedError, so the walk's churn law sees it unchanged.
|
|
7
|
+
*/
|
|
8
|
+
export interface CaptureFailure {
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly message: string;
|
|
11
|
+
readonly stack?: string;
|
|
12
|
+
readonly code?: string;
|
|
13
|
+
readonly errno?: number;
|
|
14
|
+
readonly syscall?: string;
|
|
15
|
+
readonly path?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function describeFailure(error: unknown): CaptureFailure;
|
|
18
|
+
export declare function restoreFailure(failure: CaptureFailure): Error;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A content thread's failure as it crosses to the main thread. Only plain
|
|
3
|
+
* fields survive structured clone, so a thread describes its error by the
|
|
4
|
+
* fields callers classify by — above all `code` — and the main thread
|
|
5
|
+
* restores an Error of the same kind. A churned capture returns as
|
|
6
|
+
* CaptureSourceChangedError, so the walk's churn law sees it unchanged.
|
|
7
|
+
*/
|
|
8
|
+
import { CaptureSourceChangedError } from "./content-cache-host.js";
|
|
9
|
+
export function describeFailure(error) {
|
|
10
|
+
if (!(error instanceof Error))
|
|
11
|
+
return { name: "Error", message: String(error) };
|
|
12
|
+
const fields = error;
|
|
13
|
+
return {
|
|
14
|
+
name: error.name,
|
|
15
|
+
message: error.message,
|
|
16
|
+
...(error.stack !== undefined ? { stack: error.stack } : {}),
|
|
17
|
+
...(typeof fields.code === "string" ? { code: fields.code } : {}),
|
|
18
|
+
...(typeof fields.errno === "number" ? { errno: fields.errno } : {}),
|
|
19
|
+
...(typeof fields.syscall === "string" ? { syscall: fields.syscall } : {}),
|
|
20
|
+
...(typeof fields.path === "string" ? { path: fields.path } : {}),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export function restoreFailure(failure) {
|
|
24
|
+
const error = failure.code === "CAPTURE_SOURCE_CHANGED"
|
|
25
|
+
? new CaptureSourceChangedError(failure.message)
|
|
26
|
+
: Object.assign(new Error(failure.message), {
|
|
27
|
+
...(failure.code !== undefined ? { code: failure.code } : {}),
|
|
28
|
+
...(failure.errno !== undefined ? { errno: failure.errno } : {}),
|
|
29
|
+
...(failure.syscall !== undefined ? { syscall: failure.syscall } : {}),
|
|
30
|
+
...(failure.path !== undefined ? { path: failure.path } : {}),
|
|
31
|
+
});
|
|
32
|
+
if (failure.code !== "CAPTURE_SOURCE_CHANGED")
|
|
33
|
+
error.name = failure.name;
|
|
34
|
+
if (failure.stack)
|
|
35
|
+
error.stack = failure.stack;
|
|
36
|
+
return error;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=content-failure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-failure.js","sourceRoot":"","sources":["../src/content-failure.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAYpE,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAChF,MAAM,MAAM,GAAG,KAA8B,CAAC;IAC9C,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,GAAG,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAuB;IACpD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,KAAK,wBAAwB;QACrD,CAAC,CAAC,IAAI,yBAAyB,CAAC,OAAO,CAAC,OAAO,CAAC;QAChD,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAC1C,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9D,CAAC,CAAC;IACL,IAAI,OAAO,CAAC,IAAI,KAAK,wBAAwB;QAAE,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IACzE,IAAI,OAAO,CAAC,KAAK;QAAE,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC/C,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Large-file uploads stream on one thread of their own.
|
|
3
|
+
*
|
|
4
|
+
* A fused upload reads a large file once, hashes every block and the whole
|
|
5
|
+
* file, and ships each batch while reading the next. The read and both
|
|
6
|
+
* hashes run on the stream thread, never on the one thread that schedules
|
|
7
|
+
* Watch, Detect admission, Apply and Send. The main thread only relays each
|
|
8
|
+
* batch's blocks and the final seal to the wire; batch bytes cross by
|
|
9
|
+
* transfer, not copy.
|
|
10
|
+
*
|
|
11
|
+
* A stream spends most of its life waiting on the network between batches.
|
|
12
|
+
* It therefore holds no capture slot: the thread serves every concurrent
|
|
13
|
+
* stream at once, and none waits for another's upload. The capture laws —
|
|
14
|
+
* fingerprint before and after, manifest sealed last, two batches at most
|
|
15
|
+
* in memory — stay in content-cache-host and Live's uploadStream, run
|
|
16
|
+
* unchanged on that thread.
|
|
17
|
+
*/
|
|
18
|
+
import { type MessagePort } from "node:worker_threads";
|
|
19
|
+
import type { ContentChunk, ContentManifest } from "@amalgm/live";
|
|
20
|
+
import type { CapturedFileContent, CaptureStreamTransport } from "./content-cache-host.js";
|
|
21
|
+
import { type CaptureFailure } from "./content-failure.js";
|
|
22
|
+
import type { SourceStat } from "./source-signature.js";
|
|
23
|
+
/** One stream as it crosses to the thread, with its own relay channel. */
|
|
24
|
+
export interface StreamJob {
|
|
25
|
+
readonly sourceFile: string;
|
|
26
|
+
readonly expected: SourceStat;
|
|
27
|
+
readonly relay: MessagePort;
|
|
28
|
+
}
|
|
29
|
+
/** One wire effect a stream asks the main thread for. */
|
|
30
|
+
export type StreamEffect = {
|
|
31
|
+
readonly op: "put";
|
|
32
|
+
readonly chunks: readonly ContentChunk[];
|
|
33
|
+
readonly bytes: Uint8Array;
|
|
34
|
+
} | {
|
|
35
|
+
readonly op: "seal";
|
|
36
|
+
readonly manifest: ContentManifest;
|
|
37
|
+
};
|
|
38
|
+
/** A numbered effect, or how the stream ended. The thread closes nothing;
|
|
39
|
+
* the main thread closes the relay once the stream has ended. */
|
|
40
|
+
export type StreamRequest = (StreamEffect & {
|
|
41
|
+
readonly seq: number;
|
|
42
|
+
}) | {
|
|
43
|
+
readonly op: "done";
|
|
44
|
+
readonly captured: CapturedFileContent;
|
|
45
|
+
} | {
|
|
46
|
+
readonly op: "failed";
|
|
47
|
+
readonly failure: CaptureFailure;
|
|
48
|
+
};
|
|
49
|
+
/** The wire's answer to one request. A failed effect keeps its error on the
|
|
50
|
+
* main thread, where the caller classifies it. */
|
|
51
|
+
export interface StreamAnswer {
|
|
52
|
+
readonly seq: number;
|
|
53
|
+
readonly failed: boolean;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Capture one large file by streaming its single read to the wire through
|
|
57
|
+
* `transport`. Ground churn rejects as CaptureSourceChangedError; a failed
|
|
58
|
+
* transport effect rejects with that effect's own error.
|
|
59
|
+
*/
|
|
60
|
+
export declare function streamContentUpload(sourceFile: string, expected: SourceStat, transport: CaptureStreamTransport): Promise<CapturedFileContent>;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Large-file uploads stream on one thread of their own.
|
|
3
|
+
*
|
|
4
|
+
* A fused upload reads a large file once, hashes every block and the whole
|
|
5
|
+
* file, and ships each batch while reading the next. The read and both
|
|
6
|
+
* hashes run on the stream thread, never on the one thread that schedules
|
|
7
|
+
* Watch, Detect admission, Apply and Send. The main thread only relays each
|
|
8
|
+
* batch's blocks and the final seal to the wire; batch bytes cross by
|
|
9
|
+
* transfer, not copy.
|
|
10
|
+
*
|
|
11
|
+
* A stream spends most of its life waiting on the network between batches.
|
|
12
|
+
* It therefore holds no capture slot: the thread serves every concurrent
|
|
13
|
+
* stream at once, and none waits for another's upload. The capture laws —
|
|
14
|
+
* fingerprint before and after, manifest sealed last, two batches at most
|
|
15
|
+
* in memory — stay in content-cache-host and Live's uploadStream, run
|
|
16
|
+
* unchanged on that thread.
|
|
17
|
+
*/
|
|
18
|
+
import { MessageChannel } from "node:worker_threads";
|
|
19
|
+
import { restoreFailure } from "./content-failure.js";
|
|
20
|
+
import { moduleThread } from "./module-thread.js";
|
|
21
|
+
import { queueTurn } from "./turns.js";
|
|
22
|
+
const WORKER = new URL("./content-stream-worker.js", import.meta.url);
|
|
23
|
+
let thread = null;
|
|
24
|
+
function spawn() {
|
|
25
|
+
const spawned = { worker: moduleThread(WORKER), streams: new Set() };
|
|
26
|
+
let failure = null;
|
|
27
|
+
spawned.worker.on("error", error => { failure ??= error; });
|
|
28
|
+
// A stream fails only once its thread has exited, so no caller released
|
|
29
|
+
// by the failure races the thread's still-open file.
|
|
30
|
+
spawned.worker.on("exit", code => {
|
|
31
|
+
if (thread === spawned)
|
|
32
|
+
thread = null;
|
|
33
|
+
const error = failure ?? new Error(`content stream worker exited with code ${code}`);
|
|
34
|
+
for (const fail of [...spawned.streams])
|
|
35
|
+
fail(error);
|
|
36
|
+
});
|
|
37
|
+
spawned.worker.unref();
|
|
38
|
+
return spawned;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Capture one large file by streaming its single read to the wire through
|
|
42
|
+
* `transport`. Ground churn rejects as CaptureSourceChangedError; a failed
|
|
43
|
+
* transport effect rejects with that effect's own error.
|
|
44
|
+
*/
|
|
45
|
+
export function streamContentUpload(sourceFile, expected, transport) {
|
|
46
|
+
const current = thread ??= spawn();
|
|
47
|
+
return new Promise((resolve, reject) => {
|
|
48
|
+
const { port1: relay, port2 } = new MessageChannel();
|
|
49
|
+
let transportFailure = null;
|
|
50
|
+
let settled = false;
|
|
51
|
+
const settle = (outcome) => {
|
|
52
|
+
if (settled)
|
|
53
|
+
return;
|
|
54
|
+
settled = true;
|
|
55
|
+
current.streams.delete(fail);
|
|
56
|
+
if (current.streams.size === 0)
|
|
57
|
+
current.worker.unref();
|
|
58
|
+
relay.close();
|
|
59
|
+
queueTurn(outcome);
|
|
60
|
+
};
|
|
61
|
+
const fail = (error) => settle(() => reject(error));
|
|
62
|
+
current.streams.add(fail);
|
|
63
|
+
// A streaming thread keeps the process alive; an idle one never does.
|
|
64
|
+
current.worker.ref();
|
|
65
|
+
relay.on("message", (request) => {
|
|
66
|
+
if (request.op === "done")
|
|
67
|
+
settle(() => resolve(request.captured));
|
|
68
|
+
else if (request.op === "failed")
|
|
69
|
+
fail(transportFailure ? transportFailure.error : restoreFailure(request.failure));
|
|
70
|
+
else {
|
|
71
|
+
queueTurn(() => {
|
|
72
|
+
const effect = request.op === "put"
|
|
73
|
+
? transport.putBlocks(request.chunks, request.bytes)
|
|
74
|
+
: transport.sealManifest(request.manifest);
|
|
75
|
+
effect.then(() => { if (!settled)
|
|
76
|
+
relay.postMessage({ seq: request.seq, failed: false }); }, (error) => {
|
|
77
|
+
transportFailure ??= { error };
|
|
78
|
+
if (!settled)
|
|
79
|
+
relay.postMessage({ seq: request.seq, failed: true });
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
current.worker.postMessage({
|
|
85
|
+
sourceFile,
|
|
86
|
+
// Only the signed fields travel; a Stats object loses its prototype.
|
|
87
|
+
expected: {
|
|
88
|
+
dev: expected.dev, ino: expected.ino, mode: expected.mode, nlink: expected.nlink,
|
|
89
|
+
size: expected.size, mtimeNs: expected.mtimeNs, ctimeNs: expected.ctimeNs,
|
|
90
|
+
},
|
|
91
|
+
relay: port2,
|
|
92
|
+
}, [port2]);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=content-stream-thread.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-stream-thread.js","sourceRoot":"","sources":["../src/content-stream-thread.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The stream thread. It runs every large-file upload's one read and both of
|
|
3
|
+
* its hashes, many streams at once, and asks the main thread for each wire
|
|
4
|
+
* effect over the stream's own relay (content-stream-thread.ts). Batches
|
|
5
|
+
* cross by transfer; the main thread closes each relay once it has ended.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The stream thread. It runs every large-file upload's one read and both of
|
|
3
|
+
* its hashes, many streams at once, and asks the main thread for each wire
|
|
4
|
+
* effect over the stream's own relay (content-stream-thread.ts). Batches
|
|
5
|
+
* cross by transfer; the main thread closes each relay once it has ended.
|
|
6
|
+
*/
|
|
7
|
+
import { parentPort } from "node:worker_threads";
|
|
8
|
+
import { captureContentFileStream } from "./content-cache-host.js";
|
|
9
|
+
import { describeFailure } from "./content-failure.js";
|
|
10
|
+
const port = parentPort;
|
|
11
|
+
if (!port)
|
|
12
|
+
throw new Error("content streams must run on a worker thread");
|
|
13
|
+
port.on("message", (job) => { void stream(job); });
|
|
14
|
+
/** The wire failed this effect; the main thread holds its error. */
|
|
15
|
+
class RelayedEffectFailed extends Error {
|
|
16
|
+
}
|
|
17
|
+
async function stream({ sourceFile, expected, relay }) {
|
|
18
|
+
const waiting = new Map();
|
|
19
|
+
let next = 0;
|
|
20
|
+
relay.on("message", (answer) => {
|
|
21
|
+
const pending = waiting.get(answer.seq);
|
|
22
|
+
waiting.delete(answer.seq);
|
|
23
|
+
if (answer.failed)
|
|
24
|
+
pending?.reject(new RelayedEffectFailed("content stream wire effect failed"));
|
|
25
|
+
else
|
|
26
|
+
pending?.resolve();
|
|
27
|
+
});
|
|
28
|
+
const ask = (effect, transfer) => new Promise((resolve, reject) => {
|
|
29
|
+
const seq = next++;
|
|
30
|
+
waiting.set(seq, { resolve, reject });
|
|
31
|
+
relay.postMessage({ ...effect, seq }, transfer);
|
|
32
|
+
});
|
|
33
|
+
let ended;
|
|
34
|
+
try {
|
|
35
|
+
const captured = await captureContentFileStream(sourceFile, expected, {
|
|
36
|
+
putBlocks: (chunks, bytes) => {
|
|
37
|
+
// A batch that shares its ArrayBuffer is copied, so the transfer
|
|
38
|
+
// never detaches bytes this thread still holds.
|
|
39
|
+
const owned = bytes.byteOffset === 0 && bytes.byteLength === bytes.buffer.byteLength
|
|
40
|
+
? bytes : new Uint8Array(bytes);
|
|
41
|
+
return ask({ op: "put", chunks, bytes: owned }, [owned.buffer]);
|
|
42
|
+
},
|
|
43
|
+
sealManifest: manifest => ask({ op: "seal", manifest }, []),
|
|
44
|
+
});
|
|
45
|
+
ended = { op: "done", captured };
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
ended = { op: "failed", failure: describeFailure(error) };
|
|
49
|
+
}
|
|
50
|
+
relay.postMessage(ended);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=content-stream-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-stream-worker.js","sourceRoot":"","sources":["../src/content-stream-worker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,IAAI,CAAC,IAAI;IAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;AAE1E,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAc,EAAE,EAAE,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9D,oEAAoE;AACpE,MAAM,mBAAoB,SAAQ,KAAK;CAAG;AAE1C,KAAK,UAAU,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAa;IAC9D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqE,CAAC;IAC7F,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,MAAoB,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,EAAE,MAAM,CAAC,IAAI,mBAAmB,CAAC,mCAAmC,CAAC,CAAC,CAAC;;YAC5F,OAAO,EAAE,OAAO,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,CAAC,MAAoB,EAAE,QAAuB,EAAiB,EAAE,CAC3E,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC9B,MAAM,GAAG,GAAG,IAAI,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACtC,KAAK,CAAC,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,EAA0B,EAAE,QAAQ,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IACL,IAAI,KAAoB,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,UAAU,EAAE,QAAQ,EAAE;YACpE,SAAS,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBAC3B,iEAAiE;gBACjE,gDAAgD;gBAChD,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,MAAM,CAAC,UAAU;oBAClF,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;gBAClC,OAAO,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAqB,CAAC,CAAC,CAAC;YACjF,CAAC;YACD,YAAY,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;SAC5D,CAAC,CAAC;QACH,KAAK,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5D,CAAC;IACD,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Register's enclosing law. W's ground may enclose workspaces this machine
|
|
3
|
+
* already materializes. Each one the authority holds as its own root is
|
|
4
|
+
* absorbed: its accepted subtree joins W's head with every identity kept,
|
|
5
|
+
* and its root leaves the head in the same commit. Only its root record
|
|
6
|
+
* changes: it is re-placed where W's walk found it, under its parentUUID
|
|
7
|
+
* and name there, and a `workspace`, which only a root can be, becomes a
|
|
8
|
+
* `folder`.
|
|
9
|
+
*
|
|
10
|
+
* Absorbed ground rides as each inventory already holds it. The head
|
|
11
|
+
* carries its accepted records, and sharing (B) keeps its own rows
|
|
12
|
+
* (declaration-save.ts), so local work there, including an identity the walk
|
|
13
|
+
* found moved out of it, stays owed to ordinary Detect. Only identities an
|
|
14
|
+
* inventory lacks enter from the walk.
|
|
15
|
+
*/
|
|
16
|
+
import { type CloudEntityRecord, type Sha256Hex } from "@amalgm/live";
|
|
17
|
+
import { type AcceptedView } from "./graph-publication.js";
|
|
18
|
+
/** A workspace this machine binds to ground. */
|
|
19
|
+
export interface BoundWorkspace {
|
|
20
|
+
readonly workspaceId: string;
|
|
21
|
+
readonly directory: string;
|
|
22
|
+
}
|
|
23
|
+
/** The bound workspaces W's ground encloses. */
|
|
24
|
+
export declare function enclosedWorkspaces(bindings: readonly BoundWorkspace[], workspaceId: string, directory: string): BoundWorkspace[];
|
|
25
|
+
/** The root AV holds this identity in, or null when AV never accepted it. */
|
|
26
|
+
export declare function acceptedHolder(view: AcceptedView, uuid: string): Promise<string | null>;
|
|
27
|
+
/** The enclosed workspaces W absorbs on this view. One held inside another
|
|
28
|
+
* enclosed workspace rides with it. Anything else refuses: ground whose own
|
|
29
|
+
* declaration the authority has not accepted, or that it holds inside a root
|
|
30
|
+
* this machine does not enclose, would move identities W never observed. */
|
|
31
|
+
export declare function absorbedRoots(view: AcceptedView, workspaceId: string, enclosed: readonly BoundWorkspace[], held: ReadonlySet<string>): Promise<string[]>;
|
|
32
|
+
/** An absorbed root's own record, re-placed where W's walk found it. */
|
|
33
|
+
export declare function placeAbsorbedRoot(record: CloudEntityRecord, placement: Pick<CloudEntityRecord, "parentUUID" | "name">, sha256Hex: Sha256Hex): CloudEntityRecord;
|
|
34
|
+
/** D's records for W: the walk outside absorbed ground, minus identities AV
|
|
35
|
+
* already holds there, plus each absorbed root exactly as AV holds it with
|
|
36
|
+
* its root re-placed. Container versions derive from D's own membership. */
|
|
37
|
+
export declare function absorbingDeclaration(view: AcceptedView, workspaceId: string, walked: readonly CloudEntityRecord[], absorbed: readonly string[], sha256Hex: Sha256Hex): Promise<readonly CloudEntityRecord[]>;
|