@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
package/dist/move-path.js
CHANGED
|
@@ -2,10 +2,10 @@ import { randomUUID } from "node:crypto";
|
|
|
2
2
|
import fsSync, { constants as fsConstants } from "node:fs";
|
|
3
3
|
import fs from "node:fs/promises";
|
|
4
4
|
import path from "node:path";
|
|
5
|
-
import {
|
|
5
|
+
import { assertSyncDirectoryGuard, createAsyncDirectoryGuard } from "./directory-guard.js";
|
|
6
6
|
import { FsSafeError } from "./errors.js";
|
|
7
7
|
import { guardedRename } from "./guarded-mutation.js";
|
|
8
|
-
import { assertSourceStillMatches, cleanupCopiedEntry, createCleanupCopiedEntryState, entryIdentity, sameIdentity, sourceChangedError, } from "./move-path-cleanup.js";
|
|
8
|
+
import { assertSourceStillMatches, cleanupCopiedEntry, createCleanupCopiedEntryState, entryIdentity, inspectSourceDirectory, inspectSourceEntry, sameIdentity, sourceChangedError, } from "./move-path-cleanup.js";
|
|
9
9
|
import { resolveReadOpenFlags } from "./read-open-flags.js";
|
|
10
10
|
import { realpathSync } from "./realpath.js";
|
|
11
11
|
import { cleanupPinnedFilePath } from "./file-cleanup.js";
|
|
@@ -57,7 +57,7 @@ function isSameOrDescendant(parentPath, candidatePath) {
|
|
|
57
57
|
(!path.isAbsolute(relative) && !relative.startsWith(`..${path.sep}`) && relative !== ".."));
|
|
58
58
|
}
|
|
59
59
|
async function assertCopyDestinationOutsideSource(sourcePath, targetPath, expectedIdentity) {
|
|
60
|
-
const sourceStat = fsSync.lstatSync(sourcePath);
|
|
60
|
+
const sourceStat = inspectSourceEntry(sourcePath, () => fsSync.lstatSync(sourcePath, { bigint: true }));
|
|
61
61
|
const sourceIdentity = entryIdentity(sourceStat);
|
|
62
62
|
if (expectedIdentity && !sameIdentity(expectedIdentity, sourceIdentity)) {
|
|
63
63
|
throw sourceChangedError(sourcePath);
|
|
@@ -80,7 +80,7 @@ async function assertCopyDestinationOutsideSource(sourcePath, targetPath, expect
|
|
|
80
80
|
return sourceIdentity;
|
|
81
81
|
}
|
|
82
82
|
function modeBits(mode) {
|
|
83
|
-
return mode &
|
|
83
|
+
return Number(mode & 511n);
|
|
84
84
|
}
|
|
85
85
|
async function chmodDirectoryPinned(directoryPath, mode) {
|
|
86
86
|
if (process.platform === "win32") {
|
|
@@ -120,21 +120,25 @@ async function copyRegularFilePinned(params) {
|
|
|
120
120
|
throw error;
|
|
121
121
|
}
|
|
122
122
|
try {
|
|
123
|
-
const
|
|
123
|
+
const inspectOpenedSource = () => inspectSourceEntry(params.from, () => {
|
|
124
|
+
const stat = fsSync.fstatSync(sourceHandle.fd, { bigint: true });
|
|
125
|
+
if (params.rejectHardlinks && stat.nlink > 1n)
|
|
126
|
+
throw hardlinkedSourceError(params.from);
|
|
127
|
+
if (!stat.isFile())
|
|
128
|
+
throw sourceChangedError(params.from);
|
|
129
|
+
return stat;
|
|
130
|
+
});
|
|
131
|
+
const openedStat = inspectOpenedSource();
|
|
124
132
|
openedIdentity = entryIdentity(openedStat);
|
|
125
|
-
if (params.rejectHardlinks && openedStat.nlink > 1) {
|
|
126
|
-
throw hardlinkedSourceError(params.from);
|
|
127
|
-
}
|
|
128
133
|
const openAdvancedWindowsCtime = process.platform === "win32" &&
|
|
129
134
|
params.identity.dev === openedIdentity.dev &&
|
|
130
135
|
params.identity.ino === openedIdentity.ino &&
|
|
131
136
|
params.identity.mode === openedIdentity.mode &&
|
|
132
137
|
params.identity.nlink === openedIdentity.nlink &&
|
|
133
138
|
params.identity.size === openedIdentity.size &&
|
|
134
|
-
params.identity.
|
|
135
|
-
openedIdentity.
|
|
136
|
-
if (!
|
|
137
|
-
(!sameIdentity(params.identity, openedIdentity) && !openAdvancedWindowsCtime)) {
|
|
139
|
+
params.identity.mtimeNs === openedIdentity.mtimeNs &&
|
|
140
|
+
openedIdentity.ctimeNs >= params.identity.ctimeNs;
|
|
141
|
+
if (!sameIdentity(params.identity, openedIdentity) && !openAdvancedWindowsCtime) {
|
|
138
142
|
throw sourceChangedError(params.from);
|
|
139
143
|
}
|
|
140
144
|
await assertSourceStillMatches(params.from, openedIdentity);
|
|
@@ -154,11 +158,7 @@ async function copyRegularFilePinned(params) {
|
|
|
154
158
|
}
|
|
155
159
|
// Re-check the opened source before the staged tree can be committed. If
|
|
156
160
|
// it changed while we copied, the caller should retry the move.
|
|
157
|
-
|
|
158
|
-
if (params.rejectHardlinks && finalSourceStat.nlink > 1) {
|
|
159
|
-
throw hardlinkedSourceError(params.from);
|
|
160
|
-
}
|
|
161
|
-
if (!sameIdentity(openedIdentity, entryIdentity(finalSourceStat))) {
|
|
161
|
+
if (!sameIdentity(openedIdentity, inspectOpenedSource())) {
|
|
162
162
|
throw sourceChangedError(params.from);
|
|
163
163
|
}
|
|
164
164
|
await destinationHandle.chmod(modeBits(params.mode));
|
|
@@ -178,21 +178,8 @@ async function copyRegularFilePinned(params) {
|
|
|
178
178
|
}
|
|
179
179
|
return openedIdentity;
|
|
180
180
|
}
|
|
181
|
-
function inspectSourceDirectory(sourcePath, expected) {
|
|
182
|
-
try {
|
|
183
|
-
return inspectDirectoryIdentitySync(sourcePath, expected);
|
|
184
|
-
}
|
|
185
|
-
catch (error) {
|
|
186
|
-
const code = error?.code;
|
|
187
|
-
if (code === "ENOENT" || code === "ENOTDIR" ||
|
|
188
|
-
(error instanceof FsSafeError && (error.code === "path-mismatch" || error.code === "not-file"))) {
|
|
189
|
-
throw sourceChangedError(sourcePath);
|
|
190
|
-
}
|
|
191
|
-
throw error;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
181
|
async function copyEntryWithManifest(from, to, options, expectedIdentity) {
|
|
195
|
-
const sourceStat = fsSync.lstatSync(from);
|
|
182
|
+
const sourceStat = inspectSourceEntry(from, () => fsSync.lstatSync(from, { bigint: true }));
|
|
196
183
|
const identity = entryIdentity(sourceStat);
|
|
197
184
|
if (expectedIdentity && !sameIdentity(expectedIdentity, identity)) {
|
|
198
185
|
throw sourceChangedError(from);
|
|
@@ -208,8 +195,7 @@ async function copyEntryWithManifest(from, to, options, expectedIdentity) {
|
|
|
208
195
|
return { ...identity, kind: "leaf" };
|
|
209
196
|
}
|
|
210
197
|
if (sourceStat.isDirectory()) {
|
|
211
|
-
const
|
|
212
|
-
const directoryIdentity = Object.freeze({ dev: directoryStat.dev, ino: directoryStat.ino });
|
|
198
|
+
const directoryIdentity = Object.freeze({ dev: sourceStat.dev, ino: sourceStat.ino });
|
|
213
199
|
await fs.mkdir(to, { mode: modeBits(sourceStat.mode) || 0o755 });
|
|
214
200
|
options.onCreated?.(fsSync.lstatSync(to, { bigint: true }));
|
|
215
201
|
const children = [];
|
|
@@ -226,6 +212,7 @@ async function copyEntryWithManifest(from, to, options, expectedIdentity) {
|
|
|
226
212
|
name: child,
|
|
227
213
|
manifest: await copyEntryWithManifest(path.join(from, child), path.join(to, child), {
|
|
228
214
|
sourceHardlinks: options.sourceHardlinks, budget: options.budget,
|
|
215
|
+
aliases: options.aliases,
|
|
229
216
|
}),
|
|
230
217
|
});
|
|
231
218
|
}
|
|
@@ -241,9 +228,13 @@ async function copyEntryWithManifest(from, to, options, expectedIdentity) {
|
|
|
241
228
|
if (!sourceStat.isFile()) {
|
|
242
229
|
throw new Error(`Refusing to move non-file path with copy fallback: ${from}`);
|
|
243
230
|
}
|
|
244
|
-
if (options.sourceHardlinks === "reject" && sourceStat.nlink >
|
|
231
|
+
if (options.sourceHardlinks === "reject" && sourceStat.nlink > 1n) {
|
|
245
232
|
throw hardlinkedSourceError(from);
|
|
246
233
|
}
|
|
234
|
+
const aliasKey = options.aliases && identity.nlink > 1n ? `${identity.dev}:${identity.ino}` : undefined;
|
|
235
|
+
const alias = aliasKey ? options.aliases.get(aliasKey) : undefined;
|
|
236
|
+
if (alias && !sameIdentity(alias, identity))
|
|
237
|
+
throw sourceChangedError(from);
|
|
247
238
|
const copiedIdentity = await copyRegularFilePinned({
|
|
248
239
|
from,
|
|
249
240
|
identity,
|
|
@@ -252,7 +243,14 @@ async function copyEntryWithManifest(from, to, options, expectedIdentity) {
|
|
|
252
243
|
to,
|
|
253
244
|
onCreated: options.onCreated,
|
|
254
245
|
});
|
|
255
|
-
|
|
246
|
+
// A permitted Windows open advances every name's ctime. Share its receipt
|
|
247
|
+
// only after the preceding fingerprint and this complete copy were verified.
|
|
248
|
+
if (alias)
|
|
249
|
+
return Object.assign(alias, copiedIdentity);
|
|
250
|
+
const manifest = { ...copiedIdentity, kind: "leaf" };
|
|
251
|
+
if (aliasKey)
|
|
252
|
+
options.aliases.set(aliasKey, manifest);
|
|
253
|
+
return manifest;
|
|
256
254
|
}
|
|
257
255
|
function assertSynchronousResult(returned, name) {
|
|
258
256
|
if (returned !== undefined) {
|
|
@@ -275,13 +273,13 @@ export async function movePathWithCopyFallback(options) {
|
|
|
275
273
|
const callerPublished = options.onDestinationPublished;
|
|
276
274
|
let assertionRejected = false;
|
|
277
275
|
let destinationPublished = false;
|
|
278
|
-
const assertBeforeMutation = () => {
|
|
279
|
-
assertSynchronousResult(callerMutationAssert
|
|
276
|
+
const assertBeforeMutation = callerMutationAssert == null ? undefined : () => {
|
|
277
|
+
assertSynchronousResult(callerMutationAssert(), "assertBeforeMutation");
|
|
280
278
|
};
|
|
281
279
|
const assertBeforeRename = () => {
|
|
282
280
|
try {
|
|
283
281
|
assertSynchronousResult(callerRenameAssert?.(), "assertBeforeRename");
|
|
284
|
-
assertBeforeMutation();
|
|
282
|
+
assertBeforeMutation?.();
|
|
285
283
|
}
|
|
286
284
|
catch (error) {
|
|
287
285
|
assertionRejected = true;
|
|
@@ -332,6 +330,29 @@ export async function movePathWithCopyFallback(options) {
|
|
|
332
330
|
// never become the published target; the copy loop fences nlink again.
|
|
333
331
|
}
|
|
334
332
|
const sourceIdentity = await assertCopyDestinationOutsideSource(sourcePath, targetPath);
|
|
333
|
+
const sourceParentPath = path.dirname(sourcePath);
|
|
334
|
+
const sourceParent = assertBeforeMutation || callerRenameAssert || callerPublished
|
|
335
|
+
? await createAsyncDirectoryGuard(realpathSync.native(sourceParentPath), { bigint: true })
|
|
336
|
+
: undefined;
|
|
337
|
+
const assertSourceParent = sourceParent ? () => {
|
|
338
|
+
try {
|
|
339
|
+
if (realpathSync.native(sourceParentPath) !== sourceParent.realPath)
|
|
340
|
+
throw sourceChangedError(sourcePath);
|
|
341
|
+
assertSyncDirectoryGuard(sourceParent);
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
const code = error?.code;
|
|
345
|
+
if (code === "ENOENT" || code === "ENOTDIR" || code === "ELOOP" ||
|
|
346
|
+
(error instanceof FsSafeError && (error.code === "path-mismatch" || error.code === "not-file"))) {
|
|
347
|
+
throw sourceChangedError(sourcePath);
|
|
348
|
+
}
|
|
349
|
+
throw error;
|
|
350
|
+
}
|
|
351
|
+
} : undefined;
|
|
352
|
+
const assertBeforeCleanup = assertSourceParent ? () => {
|
|
353
|
+
assertBeforeMutation?.();
|
|
354
|
+
assertSourceParent();
|
|
355
|
+
} : undefined;
|
|
335
356
|
const targetDir = path.dirname(targetPath);
|
|
336
357
|
const staged = path.join(targetDir, `.fs-safe-move-${process.pid}-${randomUUID()}.tmp`);
|
|
337
358
|
const stage = await createMoveStageOwner(staged);
|
|
@@ -339,6 +360,7 @@ export async function movePathWithCopyFallback(options) {
|
|
|
339
360
|
const manifest = await copyEntryWithManifest(sourcePath, staged, {
|
|
340
361
|
sourceHardlinks: rejectHardlinks ? "reject" : "allow",
|
|
341
362
|
onCreated: stage.record,
|
|
363
|
+
...(!rejectHardlinks && process.platform === "win32" ? { aliases: new Map() } : {}),
|
|
342
364
|
...(rejectHardlinks ? { budget: { discovered: 1 } } : {}),
|
|
343
365
|
}, sourceIdentity);
|
|
344
366
|
const cleanupState = createCleanupCopiedEntryState(sourcePath, manifest);
|
|
@@ -355,7 +377,8 @@ export async function movePathWithCopyFallback(options) {
|
|
|
355
377
|
onRenamed();
|
|
356
378
|
},
|
|
357
379
|
});
|
|
358
|
-
|
|
380
|
+
assertSourceParent?.();
|
|
381
|
+
const cleanupResult = await cleanupCopiedEntry(sourcePath, manifest, cleanupState, assertBeforeCleanup);
|
|
359
382
|
if (cleanupResult === "stale") {
|
|
360
383
|
throw sourceChangedError(sourcePath);
|
|
361
384
|
}
|
|
@@ -6,4 +6,3 @@ export declare class MutationAuthorityError extends FsSafeError {
|
|
|
6
6
|
export declare function assertSynchronousCallbackResult(returned: unknown, name: string): void;
|
|
7
7
|
export declare function composeMutationAssertions(defaultAssertion?: () => void, callAssertion?: () => void): (() => void) | undefined;
|
|
8
8
|
export declare function rethrowMutationAuthorityError(error: unknown): never;
|
|
9
|
-
//# sourceMappingURL=mutation-authority.d.ts.map
|
package/dist/native-binding.d.ts
CHANGED
|
@@ -160,4 +160,3 @@ export interface NativeBinding {
|
|
|
160
160
|
sha256File(fd: number, maxBytes?: number, signal?: AbortSignal): Promise<NativeFileHash>;
|
|
161
161
|
}
|
|
162
162
|
export declare function captureNativeFdClose(binding: NativeBinding): (fd: number) => void;
|
|
163
|
-
//# sourceMappingURL=native-binding.d.ts.map
|
package/dist/native-config.d.ts
CHANGED
|
@@ -14,4 +14,3 @@ export declare function configureFsSafeNative(config: Partial<FsSafeNativeConfig
|
|
|
14
14
|
export declare function configureFsSafePython(config: Partial<FsSafePythonConfig>): void;
|
|
15
15
|
export declare function getFsSafeNativeConfig(): FsSafeNativeConfig;
|
|
16
16
|
export declare function __resetFsSafeNativeConfigForTest(): void;
|
|
17
|
-
//# sourceMappingURL=native-config.d.ts.map
|
|
@@ -14,4 +14,3 @@ export declare function getNativeDirectoryObservationBackend(enabled?: boolean):
|
|
|
14
14
|
export declare function inspectNativeDirectoryObservation(backend: NativeDirectoryObservationBackend, pathname: string, expected?: ExactStatIdentity, platform?: NodeJS.Platform): NativeDirectoryObservation;
|
|
15
15
|
export declare function extendNativeDirectoryObservationGuard(observation: NativeDirectoryObservation, dir: string): NativeDirectoryObservationGuard;
|
|
16
16
|
export declare function isNativeDirectoryObservationGuard(guard: unknown): guard is NativeDirectoryObservationGuard;
|
|
17
|
-
//# sourceMappingURL=native-directory-observation.d.ts.map
|
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
/** Warn once per capability, without including caller paths or native error text. */
|
|
2
2
|
export declare function warnNativeFallback(feature: string, limitation: string): void;
|
|
3
3
|
export declare function __resetNativeFallbackWarningsForTest(): void;
|
|
4
|
-
//# sourceMappingURL=native-fallback-warning.d.ts.map
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import { type BigIntStats
|
|
2
|
-
import type { ContainmentGuarantee } from "./containment.js";
|
|
1
|
+
import { type BigIntStats } from "node:fs";
|
|
3
2
|
export type NativeFileHandle = {
|
|
4
3
|
readonly fd: number;
|
|
5
|
-
readonly containment: ContainmentGuarantee;
|
|
6
4
|
close(): Promise<void>;
|
|
7
|
-
stat(): Promise<Stats>;
|
|
8
5
|
writeFile(data: string | Buffer, encoding?: BufferEncoding): Promise<void>;
|
|
9
6
|
};
|
|
10
7
|
export declare function nativeOpenFlags(flags: number): number;
|
|
@@ -16,4 +13,3 @@ export declare function removeNativeCreatedFileIfStillPinned(params: {
|
|
|
16
13
|
created?: BigIntStats;
|
|
17
14
|
}): void;
|
|
18
15
|
export declare function createNativeExclusiveFile(targetPath: string, mode: number): Promise<NativeFileHandle | undefined>;
|
|
19
|
-
//# sourceMappingURL=native-operations.d.ts.map
|
|
@@ -21,20 +21,16 @@ export function writeNativeFd(fd, data) {
|
|
|
21
21
|
offset += written;
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
|
-
function wrapNativeFd(fd,
|
|
24
|
+
function wrapNativeFd(fd, closeFd) {
|
|
25
25
|
let open = true;
|
|
26
26
|
return {
|
|
27
27
|
fd,
|
|
28
|
-
containment,
|
|
29
28
|
async close() {
|
|
30
29
|
if (open) {
|
|
31
30
|
open = false;
|
|
32
31
|
closeFd(fd);
|
|
33
32
|
}
|
|
34
33
|
},
|
|
35
|
-
async stat() {
|
|
36
|
-
return fsSync.fstatSync(fd);
|
|
37
|
-
},
|
|
38
34
|
async writeFile(data, encoding) {
|
|
39
35
|
writeNativeFd(fd, Buffer.isBuffer(data) ? data : Buffer.from(data, encoding ?? "utf8"));
|
|
40
36
|
},
|
|
@@ -91,7 +87,7 @@ export async function createNativeExclusiveFile(targetPath, mode) {
|
|
|
91
87
|
fd = opened.fd;
|
|
92
88
|
fsSync.fchmodSync(fd, mode);
|
|
93
89
|
created = fsSync.fstatSync(fd, { bigint: true });
|
|
94
|
-
return wrapNativeFd(fd,
|
|
90
|
+
return wrapNativeFd(fd, closeFd);
|
|
95
91
|
}
|
|
96
92
|
catch (error) {
|
|
97
93
|
if (fd !== undefined) {
|
|
@@ -32,4 +32,3 @@ export declare function openNativeParentAdmission(binding: NativeBinding, rootAd
|
|
|
32
32
|
root: Pick<FileHandle, "fd">;
|
|
33
33
|
}, relativeParentPath: string, observation?: "native-directory"): Promise<NativeParentAdmission>;
|
|
34
34
|
export {};
|
|
35
|
-
//# sourceMappingURL=native-parent-admission.d.ts.map
|
|
@@ -4,4 +4,3 @@ import type { FileIdentityStat } from "./file-identity.js";
|
|
|
4
4
|
import type { NativeBinding } from "./native.js";
|
|
5
5
|
import type { PinnedWriteParams } from "./pinned-write.js";
|
|
6
6
|
export declare function runPinnedWriteWindows(binding: NativeBinding, params: PinnedWriteParams, root: FileHandle, parentFd: number, parentGuard: AnyAsyncDirectoryGuard): Promise<FileIdentityStat>;
|
|
7
|
-
//# sourceMappingURL=native-pinned-write-windows.d.ts.map
|
|
@@ -2,4 +2,3 @@ import type { FileIdentityStat } from "./file-identity.js";
|
|
|
2
2
|
import type { NativeBinding } from "./native.js";
|
|
3
3
|
import type { PinnedWriteParams } from "./pinned-write.js";
|
|
4
4
|
export declare function runPinnedWriteNative(binding: NativeBinding, params: PinnedWriteParams): Promise<FileIdentityStat>;
|
|
5
|
-
//# sourceMappingURL=native-pinned-write.d.ts.map
|
|
@@ -66,12 +66,6 @@ import { realpathSync } from "./realpath.js";
|
|
|
66
66
|
import { isNotFoundPathError, isSymlinkOpenError } from "./path.js";
|
|
67
67
|
import { checkedMutationDirectory, } from "./pinned-mutation-observation.js";
|
|
68
68
|
import { createPathSegmentRoute, joinPathSegmentRoute } from "./path-segment-route.js";
|
|
69
|
-
function relativeParentSegments(relativeParentPath) {
|
|
70
|
-
return relativeParentPath.split("/").filter(Boolean);
|
|
71
|
-
}
|
|
72
|
-
function prospectiveTargetPath(parentPath, parentRoute, offset, basename) {
|
|
73
|
-
return joinPathSegmentRoute(parentPath, parentRoute, offset, basename);
|
|
74
|
-
}
|
|
75
69
|
function sameAbsolutePath(left, right) {
|
|
76
70
|
return path.relative(path.resolve(left), path.resolve(right)) === "";
|
|
77
71
|
}
|
|
@@ -172,12 +166,12 @@ async function capturePolicyAwarePosixParent(binding, params, rootFd, directoryF
|
|
|
172
166
|
observationDisposers.set(fd, dispose);
|
|
173
167
|
return captured;
|
|
174
168
|
};
|
|
175
|
-
const segments =
|
|
169
|
+
const segments = params.relativeParentPath.split("/").filter(Boolean);
|
|
176
170
|
const parentSpelling = segments.length
|
|
177
171
|
? path.join(params.rootPath, ...segments)
|
|
178
172
|
: params.rootPath;
|
|
179
173
|
const segmentRoute = createPathSegmentRoute(segments);
|
|
180
|
-
const initialTarget =
|
|
174
|
+
const initialTarget = joinPathSegmentRoute(params.rootPath, segmentRoute, 0, params.basename);
|
|
181
175
|
let retainedTargetPath = params.mutationAdmission?.beginParentWalk?.();
|
|
182
176
|
if (retainedTargetPath && !sameAbsolutePath(retainedTargetPath, initialTarget)) {
|
|
183
177
|
retainedTargetPath = undefined;
|
|
@@ -255,7 +249,7 @@ async function capturePolicyAwarePosixParent(binding, params, rootFd, directoryF
|
|
|
255
249
|
if (!isNotFoundPathError(openError)) {
|
|
256
250
|
throw normalizePolicyParentOpenError(openError, params);
|
|
257
251
|
}
|
|
258
|
-
const targetPath = retainedTargetPath ??
|
|
252
|
+
const targetPath = retainedTargetPath ?? joinPathSegmentRoute(currentPath, segmentRoute, index, params.basename);
|
|
259
253
|
const request = Object.freeze({
|
|
260
254
|
targetPath,
|
|
261
255
|
mutationPath: childPath,
|
|
@@ -311,7 +305,7 @@ async function capturePolicyAwarePosixParent(binding, params, rootFd, directoryF
|
|
|
311
305
|
childAuthorization = params.mutationAdmission.advanceCreatedDirectory(evidence);
|
|
312
306
|
}
|
|
313
307
|
}
|
|
314
|
-
const targetPath = retainedTargetPath ??
|
|
308
|
+
const targetPath = retainedTargetPath ?? joinPathSegmentRoute(child.parentPath, segmentRoute, index + 1, params.basename);
|
|
315
309
|
const request = Object.freeze({
|
|
316
310
|
targetPath,
|
|
317
311
|
mutationPath: targetPath,
|
|
@@ -9,4 +9,3 @@ export type NativePolicyDirectoryObserver = MutationDirectoryObserver & {
|
|
|
9
9
|
};
|
|
10
10
|
/** Fresh name/metadata/canonical facts from a caller-owned POSIX descriptor. */
|
|
11
11
|
export declare function nativePolicyDirectoryObserver(binding: NativeBinding | undefined, fd: number, pathname: string): NativePolicyDirectoryObserver | undefined;
|
|
12
|
-
//# sourceMappingURL=native-policy-directory-observation.d.ts.map
|
|
@@ -11,4 +11,3 @@ type PolicyParent = {
|
|
|
11
11
|
};
|
|
12
12
|
export declare function capturePolicyAwareWindowsParent(binding: NativeBinding, params: PinnedWriteParams, rootAdmission: NativeRootAdmission): Promise<PolicyParent>;
|
|
13
13
|
export {};
|
|
14
|
-
//# sourceMappingURL=native-policy-parent-windows.d.ts.map
|
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
export declare const NATIVE_RENAME_SOURCE_IDENTITY_MISMATCH = "FS_SAFE_INTERNAL_RENAME_SOURCE_IDENTITY_MISMATCH";
|
|
2
2
|
export type NativeRenameFailureOutcome = "uncommitted" | "indeterminate";
|
|
3
3
|
export declare function classifyNativeRenameFailure(error: unknown): NativeRenameFailureOutcome;
|
|
4
|
-
//# sourceMappingURL=native-rename-outcome.d.ts.map
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { DirectoryReceipt } from "./directory-durability.js";
|
|
2
|
+
import { type BigIntStats, type Stats } from "node:fs";
|
|
2
3
|
import type { AnyAsyncDirectoryGuard } from "./directory-guard.js";
|
|
3
4
|
import type { FileIdentityStat } from "./file-identity.js";
|
|
4
5
|
import { type NativeBinding } from "./native-binding.js";
|
|
@@ -7,10 +8,23 @@ import type { PublishedFileReceipt, StagedFile, StagedFileCleanupReceipt, Staged
|
|
|
7
8
|
export type NativeStagingBinding = NativeBinding & Required<Pick<NativeBinding, "createStagedFile" | "stagedFileMatches" | "removeStagedFile">>;
|
|
8
9
|
export declare function assertNativeStaging(binding: NativeBinding): asserts binding is NativeStagingBinding;
|
|
9
10
|
type StagedPermissionPolicy = "private-creation" | "mode-only";
|
|
11
|
+
type NativeStageOwner = Readonly<{
|
|
12
|
+
binding: NativeStagingBinding;
|
|
13
|
+
parentFd: number;
|
|
14
|
+
closeParentFd: (fd: number) => void;
|
|
15
|
+
directory: StagedFileReceipt["directory"];
|
|
16
|
+
portableNames?: boolean;
|
|
17
|
+
mode: number;
|
|
18
|
+
sync?: boolean;
|
|
19
|
+
strictFileSync?: boolean;
|
|
20
|
+
assertBeforeMutation?: () => void;
|
|
21
|
+
permissionPolicy?: StagedPermissionPolicy;
|
|
22
|
+
name?: string;
|
|
23
|
+
}>;
|
|
10
24
|
declare class NativeStagedFile implements StagedFile {
|
|
11
25
|
#private;
|
|
12
|
-
constructor(
|
|
13
|
-
static create(
|
|
26
|
+
constructor(owner: NativeStageOwner);
|
|
27
|
+
static create(owner: NativeStageOwner, input: PinnedWriteInput, maxBytes?: number): Promise<NativeStagedFile>;
|
|
14
28
|
static write(binding: NativeStagingBinding, parentFd: number, closeParentFd: (fd: number) => void, directory: StagedFileReceipt["directory"], params: PinnedWriteParams, parentGuard: AnyAsyncDirectoryGuard): Promise<FileIdentityStat>;
|
|
15
29
|
get receipt(): StagedFileReceipt;
|
|
16
30
|
assertCurrent(): Promise<void>;
|
|
@@ -24,9 +38,8 @@ export declare const createNativeStage: (...args: Parameters<typeof NativeStaged
|
|
|
24
38
|
export declare const writeNativeStage: typeof NativeStagedFile.write;
|
|
25
39
|
export type { PublishedFileReceipt, StagedFile, StagedFileCleanupReceipt, StagedFileFailureDetails, StagedFilePublication, StagedFileReceipt, } from "./staged-file-types.js";
|
|
26
40
|
export declare function stageFileInDirectory(options: {
|
|
27
|
-
directory: string | DirectoryReceipt
|
|
41
|
+
directory: string | DirectoryReceipt<Stats | BigIntStats>;
|
|
28
42
|
content: string | Uint8Array;
|
|
29
43
|
/** Published mode; the unpublished stage stays at 0600. Defaults to 0600. */
|
|
30
44
|
mode?: number;
|
|
31
45
|
}): Promise<StagedFile>;
|
|
32
|
-
//# sourceMappingURL=native-staged-file.d.ts.map
|