@openclaw/fs-safe 0.16.0 → 0.18.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/CHANGELOG.md +91 -0
- package/README.md +8 -1
- package/dist/absolute-path.d.ts +0 -1
- package/dist/absolute-path.js +2 -8
- package/dist/advanced.d.ts +2 -1
- package/dist/advanced.js +2 -0
- package/dist/archive-crc32.d.ts +0 -1
- package/dist/archive-deadline.d.ts +0 -1
- package/dist/archive-deadline.js +22 -23
- package/dist/archive-durability.d.ts +0 -1
- package/dist/archive-entry.d.ts +0 -1
- package/dist/archive-errors.d.ts +0 -1
- package/dist/archive-gzip-tail.d.ts +0 -1
- package/dist/archive-input.d.ts +0 -1
- package/dist/archive-kind.d.ts +0 -1
- package/dist/archive-limits.d.ts +0 -1
- package/dist/archive-merge.d.ts +3 -4
- package/dist/archive-merge.js +17 -7
- package/dist/archive-native.d.ts +3 -14
- package/dist/archive-native.js +46 -70
- package/dist/archive-options.d.ts +9 -2
- package/dist/archive-parser-errors.d.ts +0 -1
- package/dist/archive-parser.wasm +0 -0
- package/dist/archive-plan.d.ts +10 -1
- package/dist/archive-plan.js +31 -21
- package/dist/archive-policy.d.ts +0 -1
- package/dist/archive-read.d.ts +0 -1
- package/dist/archive-staging.d.ts +0 -1
- package/dist/archive-tar-inspect.d.ts +0 -1
- package/dist/archive-tar-stream.d.ts +0 -1
- package/dist/archive-tar-wasm.d.ts +0 -1
- package/dist/archive-tar.d.ts +0 -1
- package/dist/archive-zip-admission.d.ts +0 -1
- package/dist/archive-zip-count.d.ts +0 -1
- package/dist/archive-zip-count.js +21 -1
- package/dist/archive-zip-directory.d.ts +0 -1
- package/dist/archive-zip-directory.js +23 -1
- package/dist/archive-zip-entry.d.ts +0 -1
- package/dist/archive-zip-integrity.d.ts +0 -1
- package/dist/archive-zip-loader.d.ts +2 -1
- package/dist/archive-zip-loader.js +7 -0
- package/dist/archive-zip-manifest.d.ts +0 -1
- package/dist/archive-zip-names.d.ts +0 -1
- package/dist/archive-zip-names.js +7 -2
- package/dist/archive-zip-preflight.d.ts +0 -1
- package/dist/archive.d.ts +0 -1
- package/dist/archive.js +93 -164
- package/dist/async-lock.d.ts +0 -1
- package/dist/atomic.d.ts +0 -1
- package/dist/bounded-read-stream.d.ts +0 -1
- package/dist/bounded-read.d.ts +0 -1
- package/dist/byte-budget.d.ts +0 -1
- package/dist/byte-view.d.ts +2 -0
- package/dist/byte-view.js +13 -0
- package/dist/clone-metadata.d.ts +0 -1
- package/dist/config.d.ts +0 -1
- package/dist/containment.d.ts +0 -1
- package/dist/copy-file-input.d.ts +0 -1
- package/dist/copy-policy.d.ts +0 -1
- package/dist/copy-publication.d.ts +0 -1
- package/dist/copy-tree-portable.d.ts +0 -1
- package/dist/copy-tree-portable.js +9 -6
- package/dist/copy.d.ts +0 -1
- package/dist/copy.js +5 -5
- package/dist/create-directory.d.ts +0 -2
- package/dist/create-directory.js +3 -22
- package/dist/create-file-async.d.ts +0 -1
- package/dist/create-file.d.ts +0 -1
- package/dist/create-file.js +3 -14
- package/dist/create-owned-file.d.ts +0 -1
- package/dist/create.d.ts +1 -2
- package/dist/create.js +1 -1
- package/dist/creation-darwin.d.ts +0 -2
- package/dist/creation-darwin.js +0 -9
- package/dist/creation-file-state.d.ts +0 -1
- package/dist/creation-path.d.ts +2 -1
- package/dist/creation-path.js +12 -0
- package/dist/creation-permissions.d.ts +0 -1
- package/dist/creation-permissions.js +28 -38
- package/dist/deny-mutations.d.ts +2 -3
- package/dist/deny-mutations.js +55 -35
- package/dist/device-path.d.ts +0 -1
- package/dist/directory-durability.d.ts +6 -7
- package/dist/directory-entry-path.d.ts +0 -1
- package/dist/directory-guard.d.ts +2 -7
- package/dist/directory-guard.js +25 -56
- package/dist/directory-mode-node.d.ts +0 -1
- package/dist/directory-mode-owner.d.ts +0 -1
- package/dist/directory-receipt.d.ts +2 -3
- package/dist/directory-receipt.js +15 -19
- package/dist/durability.d.ts +0 -1
- package/dist/effective-uid.d.ts +0 -1
- package/dist/error-detail.d.ts +0 -1
- package/dist/errors.d.ts +0 -1
- package/dist/file-cleanup.d.ts +1 -1
- package/dist/file-cleanup.js +7 -4
- package/dist/file-contents.d.ts +5 -0
- package/dist/file-contents.js +40 -0
- package/dist/file-handle-transfer.d.ts +0 -1
- package/dist/file-hash.d.ts +0 -1
- package/dist/file-hash.js +186 -70
- package/dist/file-identity.d.ts +0 -1
- package/dist/file-lock-sync-acquisition.d.ts +22 -0
- package/dist/file-lock-sync-acquisition.js +98 -0
- package/dist/file-lock-sync-admission.d.ts +0 -2
- package/dist/file-lock-sync-admission.js +9 -48
- package/dist/file-lock-sync-root-acquire.d.ts +0 -1
- package/dist/file-lock-sync-root-acquire.js +35 -98
- package/dist/file-lock-sync-root-arbitration.d.ts +0 -1
- package/dist/file-lock-sync-root-held.d.ts +1 -3
- package/dist/file-lock-sync-root-held.js +7 -5
- package/dist/file-lock-sync-root-io.d.ts +0 -1
- package/dist/file-lock-sync-root-mutation.d.ts +4 -5
- package/dist/file-lock-sync-root-mutation.js +7 -9
- package/dist/file-lock-sync-root-options.d.ts +0 -1
- package/dist/file-lock-sync-root-registration.d.ts +0 -1
- package/dist/file-lock-sync-root.d.ts +1 -2
- package/dist/file-lock-sync-root.js +14 -87
- package/dist/file-lock-sync-stale-admission.d.ts +2 -7
- package/dist/file-lock-sync-stale-admission.js +24 -23
- package/dist/file-lock-sync.d.ts +0 -1
- package/dist/file-lock-sync.js +46 -128
- package/dist/file-lock.d.ts +0 -1
- package/dist/file-observation.d.ts +0 -1
- package/dist/file-store-boundary.d.ts +0 -2
- package/dist/file-store-boundary.js +6 -26
- package/dist/file-store-copy-source.d.ts +1 -2
- package/dist/file-store-copy-source.js +1 -1
- package/dist/file-store-limit.d.ts +1 -2
- package/dist/file-store-limit.js +2 -3
- package/dist/file-store-path.d.ts +0 -1
- package/dist/file-store-prune.d.ts +0 -1
- package/dist/file-store-sync-directory.d.ts +0 -1
- package/dist/file-store-sync-directory.js +194 -231
- package/dist/file-store-sync-write.d.ts +0 -1
- package/dist/file-store-sync-write.js +16 -26
- package/dist/file-store.d.ts +0 -1
- package/dist/file-store.js +6 -7
- package/dist/file-sync.d.ts +0 -1
- package/dist/filename.d.ts +0 -1
- package/dist/filename.js +1 -7
- package/dist/fs.d.ts +0 -1
- package/dist/guarded-mkdir.d.ts +0 -1
- package/dist/guarded-mkdir.js +6 -27
- package/dist/guarded-mutation.d.ts +0 -7
- package/dist/guarded-mutation.js +6 -11
- package/dist/guest-dispatch-python.d.ts +0 -1
- package/dist/guest-dispatch-python.js +41 -90
- package/dist/guest-native-python.d.ts +0 -1
- package/dist/guest.d.ts +0 -1
- package/dist/home-dir.d.ts +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/install-path.d.ts +0 -1
- package/dist/install-path.js +2 -5
- package/dist/json-document-store.d.ts +0 -1
- package/dist/json-durable-queue-directory.d.ts +13 -1
- package/dist/json-durable-queue-directory.js +134 -0
- package/dist/json-durable-queue-ownership.d.ts +0 -1
- package/dist/json-durable-queue-ownership.js +43 -66
- package/dist/json-durable-queue-read.d.ts +0 -1
- package/dist/json-durable-queue-read.js +6 -6
- package/dist/json-durable-queue.d.ts +0 -1
- package/dist/json-durable-queue.js +17 -139
- package/dist/json-store.d.ts +0 -1
- package/dist/json-stringify.d.ts +0 -1
- package/dist/json.d.ts +0 -1
- package/dist/json.js +38 -90
- package/dist/local-file-access.d.ts +0 -1
- package/dist/local-file-access.js +3 -10
- package/dist/local-file-descriptor.d.ts +0 -1
- package/dist/local-roots.d.ts +0 -1
- package/dist/local-roots.js +19 -21
- package/dist/lock-config.d.ts +0 -1
- package/dist/move-path-cleanup.d.ts +5 -20
- package/dist/move-path-cleanup.js +57 -21
- package/dist/move-path-stage.d.ts +0 -1
- package/dist/move-path.d.ts +0 -1
- package/dist/move-path.js +62 -39
- package/dist/mutation-authority.d.ts +0 -1
- package/dist/native-binding.d.ts +0 -1
- package/dist/native-config.d.ts +0 -1
- package/dist/native-directory-observation.d.ts +0 -1
- package/dist/native-fallback-warning.d.ts +0 -1
- package/dist/native-operations.d.ts +1 -5
- package/dist/native-operations.js +2 -6
- package/dist/native-parent-admission.d.ts +0 -1
- package/dist/native-pinned-write-windows.d.ts +0 -1
- package/dist/native-pinned-write.d.ts +0 -1
- package/dist/native-pinned-write.js +4 -10
- package/dist/native-policy-directory-observation.d.ts +0 -1
- package/dist/native-policy-parent-windows.d.ts +0 -1
- package/dist/native-rename-outcome.d.ts +0 -1
- package/dist/native-staged-file.d.ts +17 -4
- package/dist/native-staged-file.js +63 -68
- package/dist/native.d.ts +0 -1
- package/dist/native.js +2 -2
- package/dist/opened-file-failure.d.ts +0 -1
- package/dist/opened-realpath.d.ts +0 -1
- package/dist/opened-realpath.js +11 -2
- package/dist/output.d.ts +0 -1
- package/dist/overwrite-file-handle.d.ts +0 -1
- package/dist/owner-dacl.d.ts +0 -1
- package/dist/path-case.d.ts +0 -1
- package/dist/path-policy.d.ts +0 -1
- package/dist/path-prefix.d.ts +0 -1
- package/dist/path-scope-lexical.d.ts +0 -1
- package/dist/path-segment-route.d.ts +0 -1
- package/dist/path-suffix-aliases.d.ts +0 -1
- package/dist/path.d.ts +0 -1
- package/dist/path.js +2 -1
- package/dist/permission-exec.d.ts +0 -1
- package/dist/permission-exec.js +19 -25
- package/dist/permissions-public.d.ts +0 -1
- package/dist/permissions-windows.d.ts +2 -10
- package/dist/permissions-windows.js +10 -30
- package/dist/permissions.d.ts +0 -1
- package/dist/permissions.js +11 -33
- package/dist/pinned-mutation-admission.d.ts +0 -1
- package/dist/pinned-mutation-observation.d.ts +0 -1
- package/dist/pinned-mutation-shared-route.d.ts +0 -1
- package/dist/pinned-open.d.ts +1 -1
- package/dist/pinned-open.js +1 -1
- package/dist/pinned-operation.d.ts +0 -1
- package/dist/pinned-write-input.d.ts +0 -1
- package/dist/pinned-write-input.js +11 -1
- package/dist/pinned-write-mode.d.ts +3 -4
- package/dist/pinned-write-mode.js +15 -8
- package/dist/pinned-write-staged.d.ts +0 -1
- package/dist/pinned-write-staged.js +10 -11
- package/dist/pinned-write-types.d.ts +9 -21
- package/dist/pinned-write.d.ts +0 -1
- package/dist/pinned-write.js +17 -13
- package/dist/positional-read.d.ts +0 -1
- package/dist/private-directory.d.ts +0 -1
- package/dist/private-producer-handoff-sync.d.ts +0 -1
- package/dist/private-producer-handoff-sync.js +9 -51
- package/dist/private-producer-handoff.d.ts +20 -1
- package/dist/private-producer-handoff.js +69 -46
- package/dist/private-temp-workspace.d.ts +0 -1
- package/dist/private-temp-workspace.js +11 -36
- package/dist/publish-copy-stage.d.ts +0 -1
- package/dist/publish-file-failure.d.ts +0 -1
- package/dist/publish-file.d.ts +2 -3
- package/dist/publish-file.js +56 -96
- package/dist/read-open-flags.d.ts +0 -1
- package/dist/read-opened-file.d.ts +0 -1
- package/dist/realpath.d.ts +0 -1
- package/dist/recursive-mkdir-path.d.ts +0 -1
- package/dist/regular-file.d.ts +0 -1
- package/dist/regular-file.js +107 -178
- package/dist/replace-directory.d.ts +0 -1
- package/dist/replace-file-copy-fallback.d.ts +0 -1
- package/dist/replace-file-copy-fallback.js +42 -29
- package/dist/replace-file-copy-source.d.ts +0 -1
- package/dist/replace-file-copy-source.js +19 -23
- package/dist/replace-file-descriptor.d.ts +0 -1
- package/dist/replace-file-descriptor.js +16 -17
- package/dist/replace-file-mode.d.ts +0 -1
- package/dist/replace-file-rename-policy.d.ts +0 -1
- package/dist/replace-file-temp-owner.d.ts +12 -13
- package/dist/replace-file-temp-owner.js +72 -91
- package/dist/replace-file.d.ts +0 -1
- package/dist/replace-file.js +9 -13
- package/dist/retained-directory-replacement.d.ts +0 -1
- package/dist/root-boundary.d.ts +0 -1
- package/dist/root-context.d.ts +0 -1
- package/dist/root-create-input.d.ts +0 -1
- package/dist/root-directory-creation.d.ts +0 -1
- package/dist/root-directory-list.d.ts +0 -1
- package/dist/root-directory-list.js +20 -3
- package/dist/root-directory.d.ts +0 -1
- package/dist/root-entries.d.ts +0 -1
- package/dist/root-errors.d.ts +0 -1
- package/dist/root-file-final-admission.d.ts +1 -2
- package/dist/root-file-final-admission.js +5 -2
- package/dist/root-file.d.ts +0 -1
- package/dist/root-file.js +3 -2
- package/dist/root-impl.d.ts +2 -10
- package/dist/root-impl.js +164 -111
- package/dist/root-move-noreplace.d.ts +2 -1
- package/dist/root-move-noreplace.js +2 -2
- package/dist/root-move-preflight.d.ts +0 -1
- package/dist/root-observed-path.d.ts +0 -1
- package/dist/root-options.d.ts +0 -1
- package/dist/root-path-errors.d.ts +0 -1
- package/dist/root-path-existing.d.ts +3 -1
- package/dist/root-path-existing.js +39 -18
- package/dist/root-path-observation.d.ts +0 -1
- package/dist/root-path-stat.d.ts +0 -1
- package/dist/root-path.d.ts +0 -1
- package/dist/root-path.js +60 -188
- package/dist/root-paths-lexical.d.ts +0 -1
- package/dist/root-paths.d.ts +0 -1
- package/dist/root-read-admission.d.ts +0 -1
- package/dist/root-read-admission.js +31 -39
- package/dist/root-remove-identity.d.ts +0 -1
- package/dist/root-remove-receipt.d.ts +0 -1
- package/dist/root-remove.d.ts +0 -1
- package/dist/root-remove.js +15 -1
- package/dist/root-symlink-policy.d.ts +0 -1
- package/dist/root-walk.d.ts +0 -1
- package/dist/root-write-admission.d.ts +0 -1
- package/dist/root-write-compatibility.d.ts +0 -1
- package/dist/root-write-complete-parent.d.ts +0 -1
- package/dist/root-write-lock-binding.d.ts +0 -1
- package/dist/root-write-mode.d.ts +0 -1
- package/dist/root-write-publication.d.ts +0 -1
- package/dist/root-write-verification.d.ts +0 -1
- package/dist/root.d.ts +0 -1
- package/dist/safe-path-segment.d.ts +1 -2
- package/dist/safe-path-segment.js +2 -5
- package/dist/secret-file.d.ts +0 -1
- package/dist/secret-file.js +7 -17
- package/dist/secret-read-async.d.ts +0 -1
- package/dist/secret-read-async.js +5 -5
- package/dist/secret-read-policy.d.ts +0 -1
- package/dist/secret.d.ts +0 -1
- package/dist/secure-file-windows.d.ts +0 -6
- package/dist/secure-file-windows.js +13 -28
- package/dist/secure-file.d.ts +0 -1
- package/dist/secure-file.js +9 -9
- package/dist/secure-temp-dir.d.ts +0 -1
- package/dist/secure-temp-repair.d.ts +0 -1
- package/dist/sibling-staged-file.d.ts +0 -1
- package/dist/sibling-staged-file.js +32 -39
- package/dist/sibling-temp.d.ts +0 -1
- package/dist/sidecar-lock-acquire.d.ts +1 -2
- package/dist/sidecar-lock-acquire.js +35 -58
- package/dist/sidecar-lock-admission-context.d.ts +0 -1
- package/dist/sidecar-lock-admission-parser.d.ts +0 -1
- package/dist/sidecar-lock-admission.d.ts +1 -5
- package/dist/sidecar-lock-admission.js +1 -7
- package/dist/sidecar-lock-handle.d.ts +3 -1
- package/dist/sidecar-lock-handle.js +6 -0
- package/dist/sidecar-lock-policy.d.ts +3 -1
- package/dist/sidecar-lock-policy.js +16 -0
- package/dist/sidecar-lock-reclaim.d.ts +1 -2
- package/dist/sidecar-lock-reclaim.js +11 -8
- package/dist/sidecar-lock-registration.d.ts +13 -0
- package/dist/sidecar-lock-registration.js +47 -0
- package/dist/sidecar-lock-root.d.ts +0 -1
- package/dist/sidecar-lock-stale-admission.d.ts +0 -1
- package/dist/sidecar-lock-target.d.ts +0 -1
- package/dist/sidecar-lock-types.d.ts +0 -1
- package/dist/sidecar-lock.d.ts +0 -1
- package/dist/sidecar-lock.js +19 -88
- package/dist/staged-directory.d.ts +2 -3
- package/dist/staged-file-settlement.d.ts +0 -1
- package/dist/staged-file-types.d.ts +0 -1
- package/dist/standalone-publication-path.d.ts +0 -1
- package/dist/stat-observation.d.ts +0 -1
- package/dist/store.d.ts +0 -1
- package/dist/strict-file-identity.d.ts +1 -2
- package/dist/strict-file-identity.js +9 -9
- package/dist/string-coerce.d.ts +0 -1
- package/dist/suppressed-error.d.ts +0 -1
- package/dist/symlink-parents.d.ts +0 -1
- package/dist/symlink-parents.js +2 -27
- package/dist/temp-cleanup.d.ts +0 -1
- package/dist/temp-target.d.ts +0 -1
- package/dist/temp-target.js +7 -46
- package/dist/temp-workspace-admission.d.ts +0 -8
- package/dist/temp-workspace-admission.js +0 -4
- package/dist/temp-workspace-child-admission.d.ts +0 -4
- package/dist/temp-workspace-child-admission.js +0 -12
- package/dist/temp-workspace-descriptor.d.ts +0 -6
- package/dist/temp-workspace-descriptor.js +0 -2
- package/dist/temp-workspace-identity.d.ts +0 -1
- package/dist/temp-workspace-owner.d.ts +1 -1
- package/dist/temp-workspace-owner.js +49 -26
- package/dist/temp-workspace-permissions.d.ts +0 -1
- package/dist/temp-workspace-types.d.ts +0 -1
- package/dist/temp.d.ts +0 -1
- package/dist/test-hooks.d.ts +0 -1
- package/dist/text-atomic.d.ts +0 -1
- package/dist/timing.d.ts +0 -1
- package/dist/trash.d.ts +0 -1
- package/dist/types.d.ts +0 -1
- package/dist/unicode-path.d.ts +0 -1
- package/dist/unicode-path.js +3 -0
- package/dist/walk.d.ts +0 -1
- package/dist/walk.js +4 -2
- package/dist/windows-command.d.ts +0 -1
- package/dist/windows-owner.d.ts +0 -1
- package/dist/windows-owner.js +4 -1
- package/dist/windows-path-alias.d.ts +0 -1
- package/dist/windows-path-alias.js +7 -43
- package/dist/windows-path-syntax.d.ts +5 -0
- package/dist/windows-path-syntax.js +21 -0
- package/dist/windows-security-command.d.ts +0 -1
- package/dist/windows-security-facts.d.ts +0 -1
- package/dist/write-file-handle.d.ts +7 -1
- package/dist/write-file-handle.js +23 -0
- package/dist/write-open-flags.d.ts +0 -1
- package/dist/write-open-flags.js +1 -8
- package/dist/write-queue.d.ts +0 -1
- package/dist/write-queue.js +1 -4
- package/docs/advanced.md +68 -1
- package/docs/archive.md +41 -2
- package/docs/atomic.md +43 -5
- package/docs/contributing.md +4 -0
- package/docs/copy.md +2 -0
- package/docs/creation.md +8 -4
- package/docs/durability.md +35 -0
- package/docs/file-contents.md +68 -0
- package/docs/json.md +5 -4
- package/docs/local-roots.md +2 -0
- package/docs/mutation-policy-proof.md +11 -7
- package/docs/native.md +9 -8
- package/docs/path.md +4 -4
- package/docs/permissions.md +6 -0
- package/docs/public-api.md +5 -0
- package/docs/quickstart.md +1 -1
- package/docs/reading.md +2 -2
- package/docs/regular-file.md +3 -0
- package/docs/root.md +19 -0
- package/docs/secret-file.md +4 -0
- package/docs/sidecar-lock.md +9 -1
- package/docs/staged-file.md +4 -3
- package/docs/store.md +3 -1
- package/docs/temp.md +4 -1
- package/docs/types.md +18 -2
- package/docs/walk.md +7 -0
- package/docs/writing.md +18 -5
- package/package.json +8 -9
- package/dist/absolute-path.d.ts.map +0 -1
- package/dist/advanced.d.ts.map +0 -1
- package/dist/archive-crc32.d.ts.map +0 -1
- package/dist/archive-deadline.d.ts.map +0 -1
- package/dist/archive-durability.d.ts.map +0 -1
- package/dist/archive-entry.d.ts.map +0 -1
- package/dist/archive-errors.d.ts.map +0 -1
- package/dist/archive-gzip-tail.d.ts.map +0 -1
- package/dist/archive-input.d.ts.map +0 -1
- package/dist/archive-kind.d.ts.map +0 -1
- package/dist/archive-limits.d.ts.map +0 -1
- package/dist/archive-merge.d.ts.map +0 -1
- package/dist/archive-native.d.ts.map +0 -1
- package/dist/archive-options.d.ts.map +0 -1
- package/dist/archive-parser-errors.d.ts.map +0 -1
- package/dist/archive-plan.d.ts.map +0 -1
- package/dist/archive-policy.d.ts.map +0 -1
- package/dist/archive-read.d.ts.map +0 -1
- package/dist/archive-staging.d.ts.map +0 -1
- package/dist/archive-tar-inspect.d.ts.map +0 -1
- package/dist/archive-tar-stream.d.ts.map +0 -1
- package/dist/archive-tar-wasm.d.ts.map +0 -1
- package/dist/archive-tar.d.ts.map +0 -1
- package/dist/archive-zip-admission.d.ts.map +0 -1
- package/dist/archive-zip-count.d.ts.map +0 -1
- package/dist/archive-zip-directory.d.ts.map +0 -1
- package/dist/archive-zip-entry.d.ts.map +0 -1
- package/dist/archive-zip-integrity.d.ts.map +0 -1
- package/dist/archive-zip-loader.d.ts.map +0 -1
- package/dist/archive-zip-manifest.d.ts.map +0 -1
- package/dist/archive-zip-names.d.ts.map +0 -1
- package/dist/archive-zip-preflight.d.ts.map +0 -1
- package/dist/archive.d.ts.map +0 -1
- package/dist/async-lock.d.ts.map +0 -1
- package/dist/atomic.d.ts.map +0 -1
- package/dist/bounded-read-stream.d.ts.map +0 -1
- package/dist/bounded-read.d.ts.map +0 -1
- package/dist/byte-budget.d.ts.map +0 -1
- package/dist/clone-metadata.d.ts.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/containment.d.ts.map +0 -1
- package/dist/copy-file-input.d.ts.map +0 -1
- package/dist/copy-policy.d.ts.map +0 -1
- package/dist/copy-publication.d.ts.map +0 -1
- package/dist/copy-tree-portable.d.ts.map +0 -1
- package/dist/copy.d.ts.map +0 -1
- package/dist/create-directory.d.ts.map +0 -1
- package/dist/create-file-async.d.ts.map +0 -1
- package/dist/create-file.d.ts.map +0 -1
- package/dist/create-owned-file.d.ts.map +0 -1
- package/dist/create.d.ts.map +0 -1
- package/dist/creation-darwin.d.ts.map +0 -1
- package/dist/creation-file-state.d.ts.map +0 -1
- package/dist/creation-path.d.ts.map +0 -1
- package/dist/creation-permissions.d.ts.map +0 -1
- package/dist/deny-mutations.d.ts.map +0 -1
- package/dist/device-path.d.ts.map +0 -1
- package/dist/directory-durability.d.ts.map +0 -1
- package/dist/directory-entry-path.d.ts.map +0 -1
- package/dist/directory-guard.d.ts.map +0 -1
- package/dist/directory-mode-node.d.ts.map +0 -1
- package/dist/directory-mode-owner.d.ts.map +0 -1
- package/dist/directory-receipt.d.ts.map +0 -1
- package/dist/durability.d.ts.map +0 -1
- package/dist/effective-uid.d.ts.map +0 -1
- package/dist/error-detail.d.ts.map +0 -1
- package/dist/errors.d.ts.map +0 -1
- package/dist/file-cleanup.d.ts.map +0 -1
- package/dist/file-handle-transfer.d.ts.map +0 -1
- package/dist/file-hash.d.ts.map +0 -1
- package/dist/file-identity.d.ts.map +0 -1
- package/dist/file-lock-sync-admission.d.ts.map +0 -1
- package/dist/file-lock-sync-root-acquire.d.ts.map +0 -1
- package/dist/file-lock-sync-root-arbitration.d.ts.map +0 -1
- package/dist/file-lock-sync-root-held.d.ts.map +0 -1
- package/dist/file-lock-sync-root-io.d.ts.map +0 -1
- package/dist/file-lock-sync-root-mutation.d.ts.map +0 -1
- package/dist/file-lock-sync-root-options.d.ts.map +0 -1
- package/dist/file-lock-sync-root-registration.d.ts.map +0 -1
- package/dist/file-lock-sync-root.d.ts.map +0 -1
- package/dist/file-lock-sync-stale-admission.d.ts.map +0 -1
- package/dist/file-lock-sync.d.ts.map +0 -1
- package/dist/file-lock.d.ts.map +0 -1
- package/dist/file-observation.d.ts.map +0 -1
- package/dist/file-store-boundary.d.ts.map +0 -1
- package/dist/file-store-copy-source.d.ts.map +0 -1
- package/dist/file-store-limit.d.ts.map +0 -1
- package/dist/file-store-path.d.ts.map +0 -1
- package/dist/file-store-prune.d.ts.map +0 -1
- package/dist/file-store-sync-directory.d.ts.map +0 -1
- package/dist/file-store-sync-write.d.ts.map +0 -1
- package/dist/file-store.d.ts.map +0 -1
- package/dist/file-sync.d.ts.map +0 -1
- package/dist/filename.d.ts.map +0 -1
- package/dist/fs.d.ts.map +0 -1
- package/dist/guarded-mkdir.d.ts.map +0 -1
- package/dist/guarded-mutation.d.ts.map +0 -1
- package/dist/guest-dispatch-python.d.ts.map +0 -1
- package/dist/guest-native-python.d.ts.map +0 -1
- package/dist/guest.d.ts.map +0 -1
- package/dist/home-dir.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/install-path.d.ts.map +0 -1
- package/dist/json-document-store.d.ts.map +0 -1
- package/dist/json-durable-queue-directory.d.ts.map +0 -1
- package/dist/json-durable-queue-ownership.d.ts.map +0 -1
- package/dist/json-durable-queue-paths.d.ts +0 -11
- package/dist/json-durable-queue-paths.d.ts.map +0 -1
- package/dist/json-durable-queue-paths.js +0 -42
- package/dist/json-durable-queue-read.d.ts.map +0 -1
- package/dist/json-durable-queue.d.ts.map +0 -1
- package/dist/json-store.d.ts.map +0 -1
- package/dist/json-stringify.d.ts.map +0 -1
- package/dist/json.d.ts.map +0 -1
- package/dist/local-file-access.d.ts.map +0 -1
- package/dist/local-file-descriptor.d.ts.map +0 -1
- package/dist/local-roots.d.ts.map +0 -1
- package/dist/lock-config.d.ts.map +0 -1
- package/dist/move-path-cleanup.d.ts.map +0 -1
- package/dist/move-path-stage.d.ts.map +0 -1
- package/dist/move-path.d.ts.map +0 -1
- package/dist/mutation-authority.d.ts.map +0 -1
- package/dist/native-binding.d.ts.map +0 -1
- package/dist/native-config.d.ts.map +0 -1
- package/dist/native-directory-observation.d.ts.map +0 -1
- package/dist/native-fallback-warning.d.ts.map +0 -1
- package/dist/native-operations.d.ts.map +0 -1
- package/dist/native-parent-admission.d.ts.map +0 -1
- package/dist/native-pinned-write-windows.d.ts.map +0 -1
- package/dist/native-pinned-write.d.ts.map +0 -1
- package/dist/native-policy-directory-observation.d.ts.map +0 -1
- package/dist/native-policy-parent-windows.d.ts.map +0 -1
- package/dist/native-rename-outcome.d.ts.map +0 -1
- package/dist/native-staged-file.d.ts.map +0 -1
- package/dist/native.d.ts.map +0 -1
- package/dist/opened-file-failure.d.ts.map +0 -1
- package/dist/opened-realpath.d.ts.map +0 -1
- package/dist/output.d.ts.map +0 -1
- package/dist/overwrite-file-handle.d.ts.map +0 -1
- package/dist/owner-dacl.d.ts.map +0 -1
- package/dist/path-case.d.ts.map +0 -1
- package/dist/path-policy.d.ts.map +0 -1
- package/dist/path-prefix.d.ts.map +0 -1
- package/dist/path-scope-lexical.d.ts.map +0 -1
- package/dist/path-segment-route.d.ts.map +0 -1
- package/dist/path-suffix-aliases.d.ts.map +0 -1
- package/dist/path.d.ts.map +0 -1
- package/dist/permission-exec.d.ts.map +0 -1
- package/dist/permissions-public.d.ts.map +0 -1
- package/dist/permissions-windows.d.ts.map +0 -1
- package/dist/permissions.d.ts.map +0 -1
- package/dist/pinned-mutation-admission.d.ts.map +0 -1
- package/dist/pinned-mutation-observation.d.ts.map +0 -1
- package/dist/pinned-mutation-shared-route.d.ts.map +0 -1
- package/dist/pinned-open.d.ts.map +0 -1
- package/dist/pinned-operation.d.ts.map +0 -1
- package/dist/pinned-write-input.d.ts.map +0 -1
- package/dist/pinned-write-mode.d.ts.map +0 -1
- package/dist/pinned-write-staged.d.ts.map +0 -1
- package/dist/pinned-write-types.d.ts.map +0 -1
- package/dist/pinned-write.d.ts.map +0 -1
- package/dist/positional-read.d.ts.map +0 -1
- package/dist/private-directory.d.ts.map +0 -1
- package/dist/private-producer-handoff-sync.d.ts.map +0 -1
- package/dist/private-producer-handoff.d.ts.map +0 -1
- package/dist/private-temp-workspace.d.ts.map +0 -1
- package/dist/publish-copy-stage.d.ts.map +0 -1
- package/dist/publish-file-failure.d.ts.map +0 -1
- package/dist/publish-file.d.ts.map +0 -1
- package/dist/read-open-flags.d.ts.map +0 -1
- package/dist/read-opened-file.d.ts.map +0 -1
- package/dist/realpath.d.ts.map +0 -1
- package/dist/recursive-mkdir-path.d.ts.map +0 -1
- package/dist/regular-file.d.ts.map +0 -1
- package/dist/replace-directory.d.ts.map +0 -1
- package/dist/replace-file-copy-fallback.d.ts.map +0 -1
- package/dist/replace-file-copy-source.d.ts.map +0 -1
- package/dist/replace-file-descriptor.d.ts.map +0 -1
- package/dist/replace-file-mode.d.ts.map +0 -1
- package/dist/replace-file-rename-policy.d.ts.map +0 -1
- package/dist/replace-file-temp-owner.d.ts.map +0 -1
- package/dist/replace-file.d.ts.map +0 -1
- package/dist/retained-directory-replacement.d.ts.map +0 -1
- package/dist/root-boundary.d.ts.map +0 -1
- package/dist/root-context.d.ts.map +0 -1
- package/dist/root-create-input.d.ts.map +0 -1
- package/dist/root-directory-creation.d.ts.map +0 -1
- package/dist/root-directory-list.d.ts.map +0 -1
- package/dist/root-directory.d.ts.map +0 -1
- package/dist/root-entries.d.ts.map +0 -1
- package/dist/root-errors.d.ts.map +0 -1
- package/dist/root-file-final-admission.d.ts.map +0 -1
- package/dist/root-file.d.ts.map +0 -1
- package/dist/root-impl.d.ts.map +0 -1
- package/dist/root-move-noreplace.d.ts.map +0 -1
- package/dist/root-move-preflight.d.ts.map +0 -1
- package/dist/root-observed-path.d.ts.map +0 -1
- package/dist/root-options.d.ts.map +0 -1
- package/dist/root-path-errors.d.ts.map +0 -1
- package/dist/root-path-existing.d.ts.map +0 -1
- package/dist/root-path-observation.d.ts.map +0 -1
- package/dist/root-path-stat.d.ts.map +0 -1
- package/dist/root-path-symlink.d.ts +0 -7
- package/dist/root-path-symlink.d.ts.map +0 -1
- package/dist/root-path-symlink.js +0 -55
- package/dist/root-path.d.ts.map +0 -1
- package/dist/root-paths-lexical.d.ts.map +0 -1
- package/dist/root-paths.d.ts.map +0 -1
- package/dist/root-read-admission.d.ts.map +0 -1
- package/dist/root-remove-identity.d.ts.map +0 -1
- package/dist/root-remove-receipt.d.ts.map +0 -1
- package/dist/root-remove.d.ts.map +0 -1
- package/dist/root-symlink-policy.d.ts.map +0 -1
- package/dist/root-walk.d.ts.map +0 -1
- package/dist/root-write-admission.d.ts.map +0 -1
- package/dist/root-write-compatibility.d.ts.map +0 -1
- package/dist/root-write-complete-parent.d.ts.map +0 -1
- package/dist/root-write-lock-binding.d.ts.map +0 -1
- package/dist/root-write-mode.d.ts.map +0 -1
- package/dist/root-write-publication.d.ts.map +0 -1
- package/dist/root-write-verification.d.ts.map +0 -1
- package/dist/root.d.ts.map +0 -1
- package/dist/safe-path-segment.d.ts.map +0 -1
- package/dist/secret-file.d.ts.map +0 -1
- package/dist/secret-read-async.d.ts.map +0 -1
- package/dist/secret-read-policy.d.ts.map +0 -1
- package/dist/secret.d.ts.map +0 -1
- package/dist/secure-file-windows.d.ts.map +0 -1
- package/dist/secure-file.d.ts.map +0 -1
- package/dist/secure-temp-dir.d.ts.map +0 -1
- package/dist/secure-temp-repair.d.ts.map +0 -1
- package/dist/sibling-staged-file.d.ts.map +0 -1
- package/dist/sibling-temp.d.ts.map +0 -1
- package/dist/sidecar-lock-acquire.d.ts.map +0 -1
- package/dist/sidecar-lock-admission-context.d.ts.map +0 -1
- package/dist/sidecar-lock-admission-parser.d.ts.map +0 -1
- package/dist/sidecar-lock-admission.d.ts.map +0 -1
- package/dist/sidecar-lock-handle.d.ts.map +0 -1
- package/dist/sidecar-lock-policy.d.ts.map +0 -1
- package/dist/sidecar-lock-reclaim.d.ts.map +0 -1
- package/dist/sidecar-lock-root.d.ts.map +0 -1
- package/dist/sidecar-lock-stale-admission.d.ts.map +0 -1
- package/dist/sidecar-lock-target.d.ts.map +0 -1
- package/dist/sidecar-lock-types.d.ts.map +0 -1
- package/dist/sidecar-lock.d.ts.map +0 -1
- package/dist/staged-directory.d.ts.map +0 -1
- package/dist/staged-file-settlement.d.ts.map +0 -1
- package/dist/staged-file-types.d.ts.map +0 -1
- package/dist/standalone-publication-path.d.ts.map +0 -1
- package/dist/stat-observation.d.ts.map +0 -1
- package/dist/store.d.ts.map +0 -1
- package/dist/strict-file-identity.d.ts.map +0 -1
- package/dist/string-coerce.d.ts.map +0 -1
- package/dist/suppressed-error.d.ts.map +0 -1
- package/dist/symlink-parents.d.ts.map +0 -1
- package/dist/temp-cleanup.d.ts.map +0 -1
- package/dist/temp-target.d.ts.map +0 -1
- package/dist/temp-workspace-admission.d.ts.map +0 -1
- package/dist/temp-workspace-child-admission.d.ts.map +0 -1
- package/dist/temp-workspace-descriptor.d.ts.map +0 -1
- package/dist/temp-workspace-identity.d.ts.map +0 -1
- package/dist/temp-workspace-owner.d.ts.map +0 -1
- package/dist/temp-workspace-permissions.d.ts.map +0 -1
- package/dist/temp-workspace-types.d.ts.map +0 -1
- package/dist/temp.d.ts.map +0 -1
- package/dist/test-hooks.d.ts.map +0 -1
- package/dist/text-atomic.d.ts.map +0 -1
- package/dist/timing.d.ts.map +0 -1
- package/dist/trash.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/unicode-path.d.ts.map +0 -1
- package/dist/walk.d.ts.map +0 -1
- package/dist/windows-command.d.ts.map +0 -1
- package/dist/windows-owner.d.ts.map +0 -1
- package/dist/windows-path-alias.d.ts.map +0 -1
- package/dist/windows-security-command.d.ts.map +0 -1
- package/dist/windows-security-facts.d.ts.map +0 -1
- package/dist/write-file-handle.d.ts.map +0 -1
- package/dist/write-open-flags.d.ts.map +0 -1
- package/dist/write-queue.d.ts.map +0 -1
|
@@ -165,14 +165,62 @@ async function openProducerSource(params, identity, links = 1n) {
|
|
|
165
165
|
}
|
|
166
166
|
return fallback;
|
|
167
167
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
168
|
+
export class FileHandoff {
|
|
169
|
+
paths;
|
|
170
|
+
identity;
|
|
171
|
+
createdLabels;
|
|
172
|
+
siblingOwned = false;
|
|
173
|
+
publication = "not-published";
|
|
174
|
+
cleanup = "preserved";
|
|
175
|
+
closeFailed = false;
|
|
176
|
+
constructor(paths, identity, createdLabels = false) {
|
|
177
|
+
this.paths = paths;
|
|
178
|
+
this.identity = identity;
|
|
179
|
+
this.createdLabels = createdLabels;
|
|
180
|
+
}
|
|
181
|
+
inspect(owner, links) {
|
|
182
|
+
assertParents(this.paths);
|
|
183
|
+
const opened = inspectLinkedFile(() => fsSync.fstatSync(owner.fd, { bigint: true }), this.identity, links, this.createdLabels ? "created file descriptor" : "isolated producer descriptor");
|
|
184
|
+
if (this.cleanup !== "removed") {
|
|
185
|
+
inspectLinkedFile(() => fsSync.lstatSync(this.paths.sourcePath, { bigint: true }), this.identity, links, this.createdLabels ? "created file stage" : "isolated producer path");
|
|
186
|
+
}
|
|
187
|
+
const named = this.publication === "published"
|
|
188
|
+
? inspectLinkedFile(() => fsSync.lstatSync(this.paths.targetPath, { bigint: true }), this.identity, links, this.createdLabels ? "created file destination" : "isolated producer sibling")
|
|
189
|
+
: undefined;
|
|
190
|
+
return { opened, named };
|
|
191
|
+
}
|
|
192
|
+
publish() {
|
|
193
|
+
this.publication = "indeterminate";
|
|
194
|
+
try {
|
|
195
|
+
fsSync.linkSync(this.paths.sourcePath, this.paths.targetPath);
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
const normalized = normalizeLinkError(error);
|
|
199
|
+
if (normalized instanceof FsSafeError &&
|
|
200
|
+
(normalized.code === "already-exists" || normalized.code === "helper-unavailable")) {
|
|
201
|
+
this.publication = "not-published";
|
|
202
|
+
}
|
|
203
|
+
throw normalized;
|
|
204
|
+
}
|
|
205
|
+
this.publication = "published";
|
|
206
|
+
}
|
|
207
|
+
retireSource() {
|
|
208
|
+
this.cleanup = "failed";
|
|
209
|
+
fsSync.unlinkSync(this.paths.sourcePath);
|
|
210
|
+
this.cleanup = "removed";
|
|
211
|
+
}
|
|
212
|
+
failure(failures, aggregateMessage) {
|
|
213
|
+
const primary = failures[0];
|
|
214
|
+
// Collision-as-no-op callers must still observe a failed settlement.
|
|
215
|
+
return new FsSafeError(this.closeFailed || failures.length > 1 ? "helper-failed" : primary instanceof FsSafeError ? primary.code : "helper-failed", "created file publication failed", {
|
|
216
|
+
cause: failures.length === 1 ? primary : new AggregateError(failures, aggregateMessage),
|
|
217
|
+
details: {
|
|
218
|
+
publication: { status: this.publication }, cleanup: this.cleanup,
|
|
219
|
+
resources: this.closeFailed ? "close-failed" : "closed",
|
|
220
|
+
path: this.paths.targetPath, dev: this.identity.dev, ino: this.identity.ino,
|
|
221
|
+
},
|
|
222
|
+
});
|
|
173
223
|
}
|
|
174
|
-
const named = state.publication === "published" ? inspectLinkedFile(() => fsSync.lstatSync(params.targetPath, { bigint: true }), identity, links, "isolated producer sibling") : undefined;
|
|
175
|
-
return { opened, named };
|
|
176
224
|
}
|
|
177
225
|
async function handoffFile(params) {
|
|
178
226
|
const created = "source" in params ? params : undefined;
|
|
@@ -186,9 +234,7 @@ async function handoffFile(params) {
|
|
|
186
234
|
const owners = new Set(handle ? [handle] : []);
|
|
187
235
|
const failures = [];
|
|
188
236
|
let unregister;
|
|
189
|
-
const state =
|
|
190
|
-
siblingOwned: false, publication: "not-published", cleanup: "preserved", closeFailed: false,
|
|
191
|
-
};
|
|
237
|
+
const state = new FileHandoff(params, identity);
|
|
192
238
|
async function close(owned) {
|
|
193
239
|
// Final creation consumes its pin before close can release and recycle it.
|
|
194
240
|
// Legacy temporary handoff retains its historical FileHandle close retry.
|
|
@@ -209,7 +255,7 @@ async function handoffFile(params) {
|
|
|
209
255
|
handle = await openProducerSource({ ...params, readWrite: "readWrite" in params && params.readWrite }, identity);
|
|
210
256
|
owners.add(handle);
|
|
211
257
|
}
|
|
212
|
-
|
|
258
|
+
state.inspect(handle, 1n);
|
|
213
259
|
if (created?.verifyDescriptor)
|
|
214
260
|
await created.verifyDescriptor(handle.fd, params.sourcePath, 1);
|
|
215
261
|
if (!created) {
|
|
@@ -220,20 +266,8 @@ async function handoffFile(params) {
|
|
|
220
266
|
});
|
|
221
267
|
}
|
|
222
268
|
assertSynchronousCallbackResult(created?.assertBeforeMutation?.(), "assertBeforeMutation");
|
|
223
|
-
|
|
224
|
-
state.
|
|
225
|
-
try {
|
|
226
|
-
fsSync.linkSync(params.sourcePath, params.targetPath);
|
|
227
|
-
}
|
|
228
|
-
catch (error) {
|
|
229
|
-
const normalized = normalizeLinkError(error);
|
|
230
|
-
if (normalized instanceof FsSafeError &&
|
|
231
|
-
(normalized.code === "already-exists" || normalized.code === "helper-unavailable")) {
|
|
232
|
-
state.publication = "not-published";
|
|
233
|
-
}
|
|
234
|
-
throw normalized;
|
|
235
|
-
}
|
|
236
|
-
state.publication = "published";
|
|
269
|
+
state.inspect(handle, 1n);
|
|
270
|
+
state.publish();
|
|
237
271
|
state.siblingOwned = !created;
|
|
238
272
|
try {
|
|
239
273
|
assertSynchronousCallbackResult(created?.onPublished?.(), "onPublished");
|
|
@@ -241,7 +275,7 @@ async function handoffFile(params) {
|
|
|
241
275
|
catch (error) {
|
|
242
276
|
failures.push(error);
|
|
243
277
|
}
|
|
244
|
-
|
|
278
|
+
state.inspect(handle, 2n);
|
|
245
279
|
if (process.platform === "win32") {
|
|
246
280
|
// Legacy Windows unlink retains a delete-pending name until handles
|
|
247
281
|
// opened through that name close. Transfer the pin before retiring it.
|
|
@@ -250,26 +284,24 @@ async function handoffFile(params) {
|
|
|
250
284
|
: await openProducerSource({ ...params, sourcePath: params.targetPath,
|
|
251
285
|
readWrite: "readWrite" in params && params.readWrite }, identity, 2n);
|
|
252
286
|
owners.add(sibling);
|
|
253
|
-
|
|
287
|
+
state.inspect(sibling, 2n);
|
|
254
288
|
if (created?.verifyDescriptor)
|
|
255
289
|
await created.verifyDescriptor(sibling.fd, params.targetPath, 2);
|
|
256
|
-
|
|
290
|
+
state.inspect(sibling, 2n);
|
|
257
291
|
inspectSourceDescriptor(handle, identity, 2n);
|
|
258
292
|
await close(handle);
|
|
259
293
|
handle = sibling;
|
|
260
294
|
// The old handle's close yielded; both names must still be ours.
|
|
261
|
-
|
|
295
|
+
state.inspect(handle, 2n);
|
|
262
296
|
}
|
|
263
297
|
if (created?.verifyDescriptor)
|
|
264
298
|
await created.verifyDescriptor(handle.fd, process.platform === "win32" ? params.targetPath : params.sourcePath, 2);
|
|
265
299
|
assertSynchronousCallbackResult(created?.assertBeforeMutation?.(), "assertBeforeMutation");
|
|
266
|
-
|
|
267
|
-
state.
|
|
268
|
-
fsSync.unlinkSync(params.sourcePath);
|
|
269
|
-
state.cleanup = "removed";
|
|
300
|
+
state.inspect(handle, 2n);
|
|
301
|
+
state.retireSource();
|
|
270
302
|
if (created?.verifyDescriptor)
|
|
271
303
|
await created.verifyDescriptor(handle.fd, params.targetPath, 1);
|
|
272
|
-
const { opened, named } =
|
|
304
|
+
const { opened, named } = state.inspect(handle, 1n);
|
|
273
305
|
const originalMode = identity.mode & 511n;
|
|
274
306
|
if (!created && process.platform === "win32" && (originalMode & 128n) === 0n &&
|
|
275
307
|
((opened.mode & 511n) !== originalMode || (named.mode & 511n) !== originalMode)) {
|
|
@@ -277,7 +309,7 @@ async function handoffFile(params) {
|
|
|
277
309
|
// admitted sibling inode, without reopening or chmodding its pathname.
|
|
278
310
|
assertParents(params);
|
|
279
311
|
fsSync.fchmodSync(handle.fd, Number(originalMode));
|
|
280
|
-
const restored =
|
|
312
|
+
const restored = state.inspect(handle, 1n);
|
|
281
313
|
if ((restored.opened.mode & 511n) !== originalMode || (restored.named.mode & 511n) !== originalMode) {
|
|
282
314
|
throw pathMismatch("isolated producer read-only mode could not be restored");
|
|
283
315
|
}
|
|
@@ -314,18 +346,9 @@ async function handoffFile(params) {
|
|
|
314
346
|
failures.push(error);
|
|
315
347
|
}
|
|
316
348
|
}
|
|
317
|
-
const primary = failures[0];
|
|
318
|
-
const cause = combinedFailure(primary, failures.slice(1));
|
|
319
349
|
if (!created)
|
|
320
|
-
throw
|
|
321
|
-
throw
|
|
322
|
-
cause,
|
|
323
|
-
details: {
|
|
324
|
-
publication: { status: state.publication }, cleanup: state.cleanup,
|
|
325
|
-
resources: state.closeFailed ? "close-failed" : "closed",
|
|
326
|
-
path: params.targetPath, dev: identity.dev, ino: identity.ino,
|
|
327
|
-
},
|
|
328
|
-
});
|
|
350
|
+
throw combinedFailure(failures[0], failures.slice(1));
|
|
351
|
+
throw state.failure(failures, "isolated producer handoff and settlement failed");
|
|
329
352
|
}
|
|
330
353
|
export function handoffPrivateProducerFile(params) {
|
|
331
354
|
return handoffFile(params);
|
|
@@ -5,4 +5,3 @@ export declare function tempWorkspace(options: TempWorkspaceOptions): Promise<Te
|
|
|
5
5
|
export declare function withTempWorkspace<T>(options: TempWorkspaceOptions, run: (workspace: TempWorkspace) => Promise<T>): Promise<T>;
|
|
6
6
|
export declare function tempWorkspaceSync(options: TempWorkspaceOptions): TempWorkspaceSync;
|
|
7
7
|
export declare function withTempWorkspaceSync<T>(options: TempWorkspaceOptions, run: (workspace: TempWorkspaceSync) => T): T;
|
|
8
|
-
//# sourceMappingURL=private-temp-workspace.d.ts.map
|
|
@@ -9,10 +9,10 @@ import { inspectDirectoryIdentitySync } from "./directory-guard.js";
|
|
|
9
9
|
import { throwFsSafeReadError } from "./root-errors.js";
|
|
10
10
|
import { matchRootFileOpenFailure, openRootFileSync, } from "./root-file.js";
|
|
11
11
|
import { registerTempPathForExit, } from "./temp-cleanup.js";
|
|
12
|
-
import { TempWorkspaceCleanupCapability, TempWorkspaceCleanupOwner, } from "./temp-workspace-owner.js";
|
|
12
|
+
import { TempWorkspaceCleanupCapability, TempWorkspaceCleanupOwner, throwTempWorkspaceCreationFailure, } from "./temp-workspace-owner.js";
|
|
13
13
|
import { assertNoWindowsPathAlias, hasWindowsPathAlias, } from "./windows-path-alias.js";
|
|
14
14
|
import { TempWorkspaceRetainedChild } from "./temp-workspace-descriptor.js";
|
|
15
|
-
import {
|
|
15
|
+
import { validateInitialTempWorkspaceChild } from "./temp-workspace-child-admission.js";
|
|
16
16
|
import { admitTempWorkspaceRoot, admitTempWorkspaceRootSync, } from "./temp-workspace-admission.js";
|
|
17
17
|
import { validateTempWorkspaceDirMode } from "./temp-workspace-permissions.js";
|
|
18
18
|
function resolveTempWorkspaceCleanupSafety(value) {
|
|
@@ -125,36 +125,6 @@ function tempWorkspaceChildPrefix(root, options, scopedPrefix) {
|
|
|
125
125
|
assertNoWindowsPathAlias(childPrefix, "filesystem", "temp workspace path uses a Windows filesystem namespace alias");
|
|
126
126
|
return childPrefix;
|
|
127
127
|
}
|
|
128
|
-
function throwTempWorkspaceCreationFailure(error, retainedChild, capability, owner) {
|
|
129
|
-
try {
|
|
130
|
-
if (owner)
|
|
131
|
-
owner.cleanupSync();
|
|
132
|
-
else {
|
|
133
|
-
const closeErrors = [];
|
|
134
|
-
try {
|
|
135
|
-
retainedChild?.close();
|
|
136
|
-
}
|
|
137
|
-
catch (closeError) {
|
|
138
|
-
closeErrors.push(closeError);
|
|
139
|
-
}
|
|
140
|
-
try {
|
|
141
|
-
capability.close();
|
|
142
|
-
}
|
|
143
|
-
catch (closeError) {
|
|
144
|
-
closeErrors.push(closeError);
|
|
145
|
-
}
|
|
146
|
-
if (closeErrors.length === 1)
|
|
147
|
-
throw closeErrors[0];
|
|
148
|
-
if (closeErrors.length > 1) {
|
|
149
|
-
throw new AggregateError(closeErrors, "temp workspace admission descriptor close failed");
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
catch (cleanupError) {
|
|
154
|
-
throw new AggregateError([error, cleanupError], "temp workspace creation and cleanup both failed");
|
|
155
|
-
}
|
|
156
|
-
throw error;
|
|
157
|
-
}
|
|
158
128
|
function registerTempWorkspace(dir, retainedChild, capability, admission, dirMode) {
|
|
159
129
|
let owner;
|
|
160
130
|
let stat;
|
|
@@ -201,9 +171,9 @@ async function createTempWorkspace(options, scopedPrefix = false) {
|
|
|
201
171
|
// Retain while the child still has its private creation mode so an
|
|
202
172
|
// explicit dirMode such as 0 cannot make identity descriptor acquisition fail.
|
|
203
173
|
retainedChild = TempWorkspaceRetainedChild.retain(dir, stat);
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
174
|
+
if (needsModeInitialization) {
|
|
175
|
+
await retainedChild.initializeMode(dirMode, admission.ownerUid, admission.assertCurrent);
|
|
176
|
+
}
|
|
207
177
|
}
|
|
208
178
|
catch (error) {
|
|
209
179
|
throwTempWorkspaceCreationFailure(error, retainedChild, capability);
|
|
@@ -294,7 +264,12 @@ function createTempWorkspaceSync(options, scopedPrefix = false) {
|
|
|
294
264
|
}
|
|
295
265
|
const needsModeInitialization = validateInitialTempWorkspaceChild(stat, admission.ownerUid, dirMode);
|
|
296
266
|
retainedChild ??= TempWorkspaceRetainedChild.retain(dir, stat);
|
|
297
|
-
|
|
267
|
+
if (needsModeInitialization) {
|
|
268
|
+
retainedChild.initializeModeSync(dirMode, admission.ownerUid, admission.assertCurrent);
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
retainedChild.discardInitialReceipt();
|
|
272
|
+
}
|
|
298
273
|
}
|
|
299
274
|
catch (error) {
|
|
300
275
|
throwTempWorkspaceCreationFailure(error, retainedChild, capability);
|
|
@@ -25,4 +25,3 @@ export type PublishFailureState = {
|
|
|
25
25
|
export declare function rememberCreatedTarget(state: PublishFailureState, identity: FileIdentityStat, phase: PublishFileExclusiveFailurePhase): void;
|
|
26
26
|
export declare function publicationFailure(error: unknown, state: PublishFailureState, cleanup: PublishFileExclusiveCleanup): FsSafeError;
|
|
27
27
|
export declare function directorySyncFailure(error: unknown): PublishFileExclusiveDirectorySyncFailure;
|
|
28
|
-
//# sourceMappingURL=publish-file-failure.d.ts.map
|
package/dist/publish-file.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Stats } from "node:fs";
|
|
1
|
+
import { type BigIntStats, type Stats } from "node:fs";
|
|
2
2
|
import { type DirectoryReceipt, type DirectorySyncOutcome } from "./directory-durability.js";
|
|
3
3
|
import { type FileIdentityStat } from "./file-identity.js";
|
|
4
4
|
import { type PublishFileExclusiveSyncFailurePolicy } from "./publish-file-failure.js";
|
|
@@ -16,6 +16,5 @@ export declare function publishFileExclusive(params: {
|
|
|
16
16
|
expectedSourceIdentity?: FileIdentityStat;
|
|
17
17
|
strategy: PublishFileExclusiveStrategy;
|
|
18
18
|
onSyncFailure?: PublishFileExclusiveSyncFailurePolicy;
|
|
19
|
-
parentReceipt?: DirectoryReceipt
|
|
19
|
+
parentReceipt?: DirectoryReceipt<Stats | BigIntStats>;
|
|
20
20
|
}): Promise<PublishFileExclusiveResult>;
|
|
21
|
-
//# sourceMappingURL=publish-file.d.ts.map
|
package/dist/publish-file.js
CHANGED
|
@@ -15,6 +15,8 @@ import { directorySyncFailure, publicationFailure, rememberCreatedTarget, } from
|
|
|
15
15
|
import { admitStandalonePublicationPath } from "./standalone-publication-path.js";
|
|
16
16
|
import { getFsSafeTestHooks } from "./test-hooks.js";
|
|
17
17
|
import { assertNoWindowsPathAlias } from "./windows-path-alias.js";
|
|
18
|
+
import { hasErrorCode } from "./file-cleanup.js";
|
|
19
|
+
import { writeAllToFile } from "./write-file-handle.js";
|
|
18
20
|
const HARDLINK_FALLBACK_CODES = new Set(["EPERM", "EXDEV", "ENOTSUP", "EOPNOTSUPP", "ENOSYS"]);
|
|
19
21
|
const NATIVE_COPY_FALLBACK_CODES = new Set(["EINVAL", "ENOSYS", "ENOTSUP", "EOPNOTSUPP", "EPERM", "EXDEV"]);
|
|
20
22
|
export function isHardlinkFallbackError(error) {
|
|
@@ -41,7 +43,7 @@ async function openNativeParent(filePath) {
|
|
|
41
43
|
throw error;
|
|
42
44
|
}
|
|
43
45
|
}
|
|
44
|
-
|
|
46
|
+
function assertPinnedSourceCurrent(params) {
|
|
45
47
|
// Windows file indexes can exceed Number.MAX_SAFE_INTEGER, so publication
|
|
46
48
|
// fences must compare bigint stats instead of rounded numeric identities.
|
|
47
49
|
const opened = fsSync.fstatSync(params.handle.fd, { bigint: true });
|
|
@@ -54,6 +56,23 @@ async function assertPinnedSourceCurrent(params) {
|
|
|
54
56
|
throw new FsSafeError("path-mismatch", "publication source changed during operation");
|
|
55
57
|
}
|
|
56
58
|
}
|
|
59
|
+
function assertPublishedTargetCurrent(targetPath, identity, message) {
|
|
60
|
+
const current = fsSync.lstatSync(targetPath, { bigint: true });
|
|
61
|
+
if (current.isSymbolicLink() || !current.isFile() || !sameFileIdentity(current, identity)) {
|
|
62
|
+
throw new FsSafeError("path-mismatch", message);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function assertRenamedSourceAbsent(sourcePath) {
|
|
66
|
+
try {
|
|
67
|
+
fsSync.lstatSync(sourcePath);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (hasErrorCode(error, "ENOENT"))
|
|
71
|
+
return;
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
throw new FsSafeError("path-mismatch", "no-replace publication source still exists");
|
|
75
|
+
}
|
|
57
76
|
async function copyPinnedSource(params) {
|
|
58
77
|
if (params.native && params.targetNativeParent) {
|
|
59
78
|
const closeFd = captureNativeFdClose(params.native);
|
|
@@ -131,15 +150,9 @@ async function copyPinnedSource(params) {
|
|
|
131
150
|
if (bytesRead === 0) {
|
|
132
151
|
break;
|
|
133
152
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
const result = await target.write(buffer, written, bytesRead - written, position + written);
|
|
138
|
-
if (result.bytesWritten <= 0) {
|
|
139
|
-
throw new FsSafeError("helper-failed", "exclusive publication copy made no progress");
|
|
140
|
-
}
|
|
141
|
-
written += result.bytesWritten;
|
|
142
|
-
}
|
|
153
|
+
const chunk = buffer.subarray(0, bytesRead);
|
|
154
|
+
hash.update(chunk);
|
|
155
|
+
await writeAllToFile(target, chunk, { position });
|
|
143
156
|
position += bytesRead;
|
|
144
157
|
}
|
|
145
158
|
await target.sync();
|
|
@@ -208,6 +221,7 @@ export async function publishFileExclusive(params) {
|
|
|
208
221
|
let parent;
|
|
209
222
|
let sourceNativeParent;
|
|
210
223
|
let targetNativeParent;
|
|
224
|
+
let copiedTarget;
|
|
211
225
|
const strategy = params.strategy;
|
|
212
226
|
const failure = {
|
|
213
227
|
phase: strategy === "rename-noreplace" ? "rename-create" : "hardlink-create",
|
|
@@ -232,8 +246,20 @@ export async function publishFileExclusive(params) {
|
|
|
232
246
|
: sourceIdentity))) {
|
|
233
247
|
throw new FsSafeError("path-mismatch", "publication source identity did not match");
|
|
234
248
|
}
|
|
249
|
+
const assertSourceCurrent = () => assertPinnedSourceCurrent({ sourcePath, handle: source, identity: sourceExactIdentity });
|
|
250
|
+
const finishPublication = async (method, handle, identity) => {
|
|
251
|
+
const verifyPhase = failure.phase;
|
|
252
|
+
const directorySync = await syncPublishedParent({ parent: parent, failure, method, targetPath });
|
|
253
|
+
failure.phase = verifyPhase;
|
|
254
|
+
if (method === "rename-noreplace")
|
|
255
|
+
assertRenamedSourceAbsent(sourcePath);
|
|
256
|
+
else
|
|
257
|
+
assertSourceCurrent();
|
|
258
|
+
assertPublishedTargetCurrent(targetPath, identity, "publication target changed during directory sync");
|
|
259
|
+
return { method, identity: fsSync.fstatSync(handle.fd), directorySync };
|
|
260
|
+
};
|
|
235
261
|
await parent.assertCurrent();
|
|
236
|
-
|
|
262
|
+
assertSourceCurrent();
|
|
237
263
|
const native = strategy === "rename-noreplace"
|
|
238
264
|
? requireNativeBinding()
|
|
239
265
|
: getNativeBinding();
|
|
@@ -248,33 +274,10 @@ export async function publishFileExclusive(params) {
|
|
|
248
274
|
// A failed post-rename fence must not delete the only remaining name.
|
|
249
275
|
failure.preserveTarget = true;
|
|
250
276
|
await getFsSafeTestHooks()?.afterPublishTargetCreated?.("rename-noreplace", targetPath, sourceExactIdentity);
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
!targetExactIdentity.isFile() ||
|
|
254
|
-
!sameFileIdentity(targetExactIdentity, sourceExactIdentity)) {
|
|
255
|
-
throw new FsSafeError("path-mismatch", "no-replace publication target changed");
|
|
256
|
-
}
|
|
257
|
-
try {
|
|
258
|
-
fsSync.lstatSync(sourcePath);
|
|
259
|
-
throw new FsSafeError("path-mismatch", "no-replace publication source still exists");
|
|
260
|
-
}
|
|
261
|
-
catch (error) {
|
|
262
|
-
if (error.code !== "ENOENT") {
|
|
263
|
-
throw error;
|
|
264
|
-
}
|
|
265
|
-
}
|
|
277
|
+
assertPublishedTargetCurrent(targetPath, sourceExactIdentity, "no-replace publication target changed");
|
|
278
|
+
assertRenamedSourceAbsent(sourcePath);
|
|
266
279
|
syncFileBestEffortSync(sourceNativeParent.handle.fd);
|
|
267
|
-
|
|
268
|
-
return {
|
|
269
|
-
method: "rename-noreplace",
|
|
270
|
-
identity: targetIdentity,
|
|
271
|
-
directorySync: await syncPublishedParent({
|
|
272
|
-
parent,
|
|
273
|
-
failure,
|
|
274
|
-
method: "rename-noreplace",
|
|
275
|
-
targetPath,
|
|
276
|
-
}),
|
|
277
|
-
};
|
|
280
|
+
return await finishPublication("rename-noreplace", source, sourceExactIdentity);
|
|
278
281
|
}
|
|
279
282
|
try {
|
|
280
283
|
if (native) {
|
|
@@ -285,24 +288,9 @@ export async function publishFileExclusive(params) {
|
|
|
285
288
|
}
|
|
286
289
|
rememberCreatedTarget(failure, sourceExactIdentity, "hardlink-verify");
|
|
287
290
|
await getFsSafeTestHooks()?.afterPublishTargetCreated?.("hardlink", targetPath, sourceExactIdentity);
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
!sameFileIdentity(targetExactIdentity, sourceExactIdentity)) {
|
|
292
|
-
throw new FsSafeError("path-mismatch", "hardlink publication target changed");
|
|
293
|
-
}
|
|
294
|
-
await assertPinnedSourceCurrent({ sourcePath, handle: source, identity: sourceExactIdentity });
|
|
295
|
-
const targetIdentity = fsSync.lstatSync(targetPath);
|
|
296
|
-
return {
|
|
297
|
-
method: "hardlink",
|
|
298
|
-
identity: targetIdentity,
|
|
299
|
-
directorySync: await syncPublishedParent({
|
|
300
|
-
parent,
|
|
301
|
-
failure,
|
|
302
|
-
method: "hardlink",
|
|
303
|
-
targetPath,
|
|
304
|
-
}),
|
|
305
|
-
};
|
|
291
|
+
assertPublishedTargetCurrent(targetPath, sourceExactIdentity, "hardlink publication target changed");
|
|
292
|
+
assertSourceCurrent();
|
|
293
|
+
return await finishPublication("hardlink", source, sourceExactIdentity);
|
|
306
294
|
}
|
|
307
295
|
catch (error) {
|
|
308
296
|
if (failure.targetCreated ||
|
|
@@ -312,48 +300,19 @@ export async function publishFileExclusive(params) {
|
|
|
312
300
|
}
|
|
313
301
|
}
|
|
314
302
|
failure.phase = "copy-create";
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
target = copied.handle;
|
|
326
|
-
targetIdentity = fsSync.fstatSync(target.fd);
|
|
327
|
-
const targetPathStat = fsSync.lstatSync(targetPath);
|
|
328
|
-
const targetPathExactStat = fsSync.lstatSync(targetPath, { bigint: true });
|
|
329
|
-
const copiedBack = await hashFileHandle(target, native);
|
|
330
|
-
const sourceAfter = await hashFileHandle(source, native);
|
|
331
|
-
if (targetPathStat.isSymbolicLink() ||
|
|
332
|
-
targetPathExactStat.isSymbolicLink() ||
|
|
333
|
-
!sameFileIdentity(targetPathExactStat, copied.exactIdentity) ||
|
|
334
|
-
copiedBack.bytes !== copied.bytes ||
|
|
335
|
-
copiedBack.digest !== copied.digest ||
|
|
336
|
-
sourceAfter.bytes !== copied.bytes ||
|
|
337
|
-
sourceAfter.digest !== copied.digest) {
|
|
338
|
-
throw new FsSafeError("path-mismatch", "exclusive publication copy failed content fencing");
|
|
339
|
-
}
|
|
340
|
-
await assertPinnedSourceCurrent({ sourcePath, handle: source, identity: sourceExactIdentity });
|
|
341
|
-
const directorySync = await syncPublishedParent({
|
|
342
|
-
parent,
|
|
343
|
-
failure,
|
|
344
|
-
method: "exclusive-copy",
|
|
345
|
-
targetPath,
|
|
346
|
-
});
|
|
347
|
-
return { method: "exclusive-copy", identity: targetPathStat, directorySync };
|
|
348
|
-
}
|
|
349
|
-
catch (error) {
|
|
350
|
-
await target?.close().catch(() => undefined);
|
|
351
|
-
target = undefined;
|
|
352
|
-
throw error;
|
|
353
|
-
}
|
|
354
|
-
finally {
|
|
355
|
-
await target?.close().catch(() => undefined);
|
|
303
|
+
const copied = await copyPinnedSource({ source, targetPath, native, targetNativeParent, failure });
|
|
304
|
+
copiedTarget = copied.handle;
|
|
305
|
+
const copiedBack = await hashFileHandle(copiedTarget, native);
|
|
306
|
+
const sourceAfter = await hashFileHandle(source, native);
|
|
307
|
+
assertPublishedTargetCurrent(targetPath, copied.exactIdentity, "exclusive publication copy failed content fencing");
|
|
308
|
+
if (copiedBack.bytes !== copied.bytes ||
|
|
309
|
+
copiedBack.digest !== copied.digest ||
|
|
310
|
+
sourceAfter.bytes !== copied.bytes ||
|
|
311
|
+
sourceAfter.digest !== copied.digest) {
|
|
312
|
+
throw new FsSafeError("path-mismatch", "exclusive publication copy failed content fencing");
|
|
356
313
|
}
|
|
314
|
+
assertSourceCurrent();
|
|
315
|
+
return await finishPublication("exclusive-copy", copiedTarget, copied.exactIdentity);
|
|
357
316
|
}
|
|
358
317
|
catch (error) {
|
|
359
318
|
if (!failure.targetCreated)
|
|
@@ -365,6 +324,7 @@ export async function publishFileExclusive(params) {
|
|
|
365
324
|
throw publicationFailure(error, failure, cleanup);
|
|
366
325
|
}
|
|
367
326
|
finally {
|
|
327
|
+
await copiedTarget?.close().catch(() => undefined);
|
|
368
328
|
await sourceNativeParent?.handle.close().catch(() => undefined);
|
|
369
329
|
await targetNativeParent?.handle.close().catch(() => undefined);
|
|
370
330
|
await source.close().catch(() => undefined);
|
package/dist/realpath.d.ts
CHANGED
package/dist/regular-file.d.ts
CHANGED
|
@@ -35,4 +35,3 @@ export declare function readRegularFileSync(params: {
|
|
|
35
35
|
export declare function appendRegularFile(options: AppendRegularFileOptions): Promise<void>;
|
|
36
36
|
export declare function appendRegularFileSync(options: AppendRegularFileOptions): void;
|
|
37
37
|
export {};
|
|
38
|
-
//# sourceMappingURL=regular-file.d.ts.map
|