@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/json.js
CHANGED
|
@@ -3,37 +3,34 @@ import fsSync from "node:fs";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { readFileDescriptorBoundedSync } from "./bounded-read.js";
|
|
5
5
|
import { FsSafeError } from "./errors.js";
|
|
6
|
-
import { sameFileIdentityForCleanup } from "./file-identity.js";
|
|
7
6
|
import { stringifyJsonDocument } from "./json-stringify.js";
|
|
8
7
|
import { readRegularFile, readRegularFileSync, statRegularFile } from "./regular-file.js";
|
|
9
8
|
import { openRootFileSync } from "./root-file.js";
|
|
10
|
-
import { resolveReadOpenFlags } from "./read-open-flags.js";
|
|
11
9
|
import { recursiveMkdirPath } from "./recursive-mkdir-path.js";
|
|
10
|
+
import { writeTempFileSync } from "./replace-file-descriptor.js";
|
|
11
|
+
import { SyncAtomicTempOwner } from "./replace-file-temp-owner.js";
|
|
12
12
|
import { admitStandalonePublicationPath } from "./standalone-publication-path.js";
|
|
13
13
|
import { writeTextAtomic } from "./text-atomic.js";
|
|
14
14
|
import { sleep } from "./timing.js";
|
|
15
15
|
import { assertNoWindowsPathAlias } from "./windows-path-alias.js";
|
|
16
16
|
const READ_RETRY_MAX_ATTEMPTS = 5;
|
|
17
17
|
const READ_RETRY_BASE_DELAY_MS = 50;
|
|
18
|
-
function isRetryableReadError(err
|
|
18
|
+
function isRetryableReadError(err) {
|
|
19
19
|
if (err instanceof FsSafeError && err.code === "path-mismatch") {
|
|
20
20
|
return true;
|
|
21
21
|
}
|
|
22
|
-
if (options.retryOpenRaceErrors !== true) {
|
|
23
|
-
return false;
|
|
24
|
-
}
|
|
25
22
|
const code = getErrorCode(err);
|
|
26
23
|
return code === "ENOENT" || code === "EPERM";
|
|
27
24
|
}
|
|
28
|
-
async function readRegularFileWithRetry(filePath,
|
|
25
|
+
async function readRegularFileWithRetry(filePath, maxBytes) {
|
|
29
26
|
let lastErr;
|
|
30
27
|
for (let attempt = 0; attempt < READ_RETRY_MAX_ATTEMPTS; attempt++) {
|
|
31
28
|
try {
|
|
32
|
-
return (await readRegularFile({ filePath, maxBytes
|
|
29
|
+
return (await readRegularFile({ filePath, maxBytes })).buffer;
|
|
33
30
|
}
|
|
34
31
|
catch (err) {
|
|
35
32
|
lastErr = err;
|
|
36
|
-
if (!isRetryableReadError(err
|
|
33
|
+
if (!isRetryableReadError(err) || attempt === READ_RETRY_MAX_ATTEMPTS - 1) {
|
|
37
34
|
throw err;
|
|
38
35
|
}
|
|
39
36
|
await sleep(READ_RETRY_BASE_DELAY_MS * Math.pow(2, attempt));
|
|
@@ -46,52 +43,19 @@ async function readRegularFileIfExistsWithRetry(filePath, options = {}) {
|
|
|
46
43
|
if (initial.missing) {
|
|
47
44
|
return null;
|
|
48
45
|
}
|
|
49
|
-
return await readRegularFileWithRetry(filePath,
|
|
50
|
-
maxBytes: options.maxBytes,
|
|
51
|
-
retryOpenRaceErrors: true,
|
|
52
|
-
});
|
|
46
|
+
return await readRegularFileWithRetry(filePath, options.maxBytes);
|
|
53
47
|
}
|
|
54
48
|
const JSON_FILE_MODE = 0o600;
|
|
55
49
|
const JSON_DIR_MODE = 0o700;
|
|
56
50
|
function getErrorCode(err) {
|
|
57
51
|
return err instanceof Error ? err.code : undefined;
|
|
58
52
|
}
|
|
59
|
-
function trySetSecureMode(
|
|
60
|
-
let fd;
|
|
53
|
+
function trySetSecureMode(fd) {
|
|
61
54
|
try {
|
|
62
|
-
const before = fsSync.lstatSync(pathname, { bigint: true });
|
|
63
|
-
if (before.isSymbolicLink() ||
|
|
64
|
-
!before.isFile() ||
|
|
65
|
-
before.nlink !== 1n ||
|
|
66
|
-
!sameFileIdentityForCleanup(before, expectedIdentity)) {
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
fd = fsSync.openSync(pathname, resolveReadOpenFlags());
|
|
70
|
-
const opened = fsSync.fstatSync(fd, { bigint: true });
|
|
71
|
-
const current = fsSync.lstatSync(pathname, { bigint: true });
|
|
72
|
-
if (!opened.isFile() ||
|
|
73
|
-
opened.nlink !== 1n ||
|
|
74
|
-
current.isSymbolicLink() ||
|
|
75
|
-
!current.isFile() ||
|
|
76
|
-
current.nlink !== 1n ||
|
|
77
|
-
!sameFileIdentityForCleanup(opened, expectedIdentity) ||
|
|
78
|
-
!sameFileIdentityForCleanup(current, opened)) {
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
55
|
fsSync.fchmodSync(fd, JSON_FILE_MODE);
|
|
82
56
|
}
|
|
83
57
|
catch {
|
|
84
|
-
// Best-effort mode application
|
|
85
|
-
}
|
|
86
|
-
finally {
|
|
87
|
-
if (fd !== undefined) {
|
|
88
|
-
try {
|
|
89
|
-
fsSync.closeSync(fd);
|
|
90
|
-
}
|
|
91
|
-
catch {
|
|
92
|
-
// best-effort cleanup
|
|
93
|
-
}
|
|
94
|
-
}
|
|
58
|
+
// Best-effort mode application stays on the retained staging descriptor.
|
|
95
59
|
}
|
|
96
60
|
}
|
|
97
61
|
function trySyncDirectory(pathname) {
|
|
@@ -114,48 +78,24 @@ function trySyncDirectory(pathname) {
|
|
|
114
78
|
}
|
|
115
79
|
}
|
|
116
80
|
}
|
|
117
|
-
function renameJsonFileWithFallback(
|
|
81
|
+
function renameJsonFileWithFallback(owner, pathname) {
|
|
82
|
+
owner.assertCurrent(fsSync);
|
|
118
83
|
try {
|
|
119
|
-
fsSync.renameSync(
|
|
84
|
+
fsSync.renameSync(owner.pathname, pathname);
|
|
120
85
|
return;
|
|
121
86
|
}
|
|
122
87
|
catch (error) {
|
|
123
|
-
const code = error
|
|
88
|
+
const code = error?.code;
|
|
124
89
|
if (code === "EPERM" || code === "EEXIST") {
|
|
125
|
-
|
|
126
|
-
try {
|
|
127
|
-
return fsSync.lstatSync(pathname);
|
|
128
|
-
}
|
|
129
|
-
catch (lstatError) {
|
|
130
|
-
if (lstatError.code === "ENOENT") {
|
|
131
|
-
return null;
|
|
132
|
-
}
|
|
133
|
-
throw lstatError;
|
|
134
|
-
}
|
|
135
|
-
})();
|
|
136
|
-
if (existing?.isSymbolicLink()) {
|
|
137
|
-
fsSync.rmSync(pathname, { force: true });
|
|
138
|
-
fsSync.renameSync(tmpPath, pathname);
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
90
|
+
owner.assertCurrent(fsSync);
|
|
141
91
|
fsSync.rmSync(pathname, { force: true });
|
|
142
|
-
|
|
92
|
+
owner.assertCurrent(fsSync);
|
|
93
|
+
fsSync.renameSync(owner.pathname, pathname);
|
|
143
94
|
return;
|
|
144
95
|
}
|
|
145
96
|
throw error;
|
|
146
97
|
}
|
|
147
98
|
}
|
|
148
|
-
function writeTempJsonFile(pathname, payload) {
|
|
149
|
-
const fd = fsSync.openSync(pathname, "wx", JSON_FILE_MODE);
|
|
150
|
-
try {
|
|
151
|
-
fsSync.writeFileSync(fd, payload, "utf8");
|
|
152
|
-
fsSync.fsyncSync(fd);
|
|
153
|
-
return fsSync.fstatSync(fd, { bigint: true });
|
|
154
|
-
}
|
|
155
|
-
finally {
|
|
156
|
-
fsSync.closeSync(fd);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
99
|
export function tryReadJsonSync(pathname, options = {}) {
|
|
160
100
|
try {
|
|
161
101
|
const raw = readRegularFileSync({
|
|
@@ -174,20 +114,31 @@ export function writeJsonSync(pathname, data) {
|
|
|
174
114
|
const tmpPath = path.format({ ...path.parse(filePath), base: `.fs-safe-${randomUUID()}.tmp` });
|
|
175
115
|
const payload = `${stringifyJsonDocument(data, null, 2)}\n`;
|
|
176
116
|
fsSync.mkdirSync(recursiveMkdirPath(path.dirname(filePath)), { recursive: true, mode: JSON_DIR_MODE });
|
|
117
|
+
const owner = new SyncAtomicTempOwner(tmpPath);
|
|
118
|
+
let originalFailure;
|
|
177
119
|
try {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
120
|
+
owner.start();
|
|
121
|
+
const temp = writeTempFileSync({
|
|
122
|
+
fsModule: fsSync, tempPath: tmpPath, content: payload, mode: JSON_FILE_MODE,
|
|
123
|
+
sync: false, onIdentity: owner.onIdentity,
|
|
124
|
+
});
|
|
125
|
+
owner.adopt(temp);
|
|
126
|
+
owner.assertCurrent(fsSync);
|
|
127
|
+
trySetSecureMode(temp.fd);
|
|
128
|
+
fsSync.fsyncSync(temp.fd);
|
|
129
|
+
renameJsonFileWithFallback(owner, filePath);
|
|
130
|
+
owner.markRenamed();
|
|
131
|
+
owner.assertPublished(fsSync, filePath);
|
|
132
|
+
trySetSecureMode(temp.fd);
|
|
182
133
|
trySyncDirectory(filePath);
|
|
134
|
+
owner.assertPublished(fsSync, filePath);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
originalFailure = { error };
|
|
138
|
+
throw error;
|
|
183
139
|
}
|
|
184
140
|
finally {
|
|
185
|
-
|
|
186
|
-
fsSync.rmSync(tmpPath, { force: true });
|
|
187
|
-
}
|
|
188
|
-
catch {
|
|
189
|
-
// best-effort cleanup when rename does not happen
|
|
190
|
-
}
|
|
141
|
+
owner.finish({ fsModule: fsSync, originalFailure, throwOnCleanupError: false });
|
|
191
142
|
}
|
|
192
143
|
}
|
|
193
144
|
export class JsonFileReadError extends Error {
|
|
@@ -312,10 +263,7 @@ export async function tryReadJson(filePath, options = {}) {
|
|
|
312
263
|
export async function readJson(filePath, options = {}) {
|
|
313
264
|
let raw;
|
|
314
265
|
try {
|
|
315
|
-
raw = (await readRegularFileWithRetry(filePath,
|
|
316
|
-
maxBytes: options.maxBytes,
|
|
317
|
-
retryOpenRaceErrors: true,
|
|
318
|
-
})).toString("utf8");
|
|
266
|
+
raw = (await readRegularFileWithRetry(filePath, options.maxBytes)).toString("utf8");
|
|
319
267
|
}
|
|
320
268
|
catch (err) {
|
|
321
269
|
throw new JsonFileReadError(filePath, "read", err);
|
|
@@ -6,4 +6,3 @@ export declare function assertNoWindowsNetworkPath(filePath: string, label?: str
|
|
|
6
6
|
export declare function safeFileURLToPath(fileUrl: string, platform?: NodeJS.Platform): string;
|
|
7
7
|
export declare function trySafeFileURLToPath(fileUrl: string, platform?: NodeJS.Platform): string | undefined;
|
|
8
8
|
export declare function basenameFromMediaSource(source?: string): string | undefined;
|
|
9
|
-
//# sourceMappingURL=local-file-access.d.ts.map
|
|
@@ -2,6 +2,7 @@ import path from "node:path";
|
|
|
2
2
|
import { fileURLToPath, URL } from "node:url";
|
|
3
3
|
import { normalizeLowercaseStringOrEmpty } from "./string-coerce.js";
|
|
4
4
|
import { hasWindowsPathAlias } from "./windows-path-alias.js";
|
|
5
|
+
import { isWindowsSeparator, rootedWindowsDriveColonIndex, windowsNamespaceMarker, } from "./windows-path-syntax.js";
|
|
5
6
|
const ENCODED_FILE_URL_SEPARATOR_RE = /%(?:2f|5c)/i;
|
|
6
7
|
const FILE_URL_PREFIX_RE = /^file:\/\//i;
|
|
7
8
|
export function isFileUrl(input) {
|
|
@@ -18,16 +19,8 @@ export function isWindowsNetworkPath(filePath, platform = process.platform) {
|
|
|
18
19
|
if (platform !== "win32") {
|
|
19
20
|
return false;
|
|
20
21
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
normalized.startsWith("\\\\?\\") &&
|
|
24
|
-
/^[a-z]$/i.test(normalized[4] ?? "") &&
|
|
25
|
-
normalized[5] === ":" &&
|
|
26
|
-
normalized[6] === "\\";
|
|
27
|
-
if (extendedDrive) {
|
|
28
|
-
return false;
|
|
29
|
-
}
|
|
30
|
-
return normalized.startsWith("\\\\");
|
|
22
|
+
return isWindowsSeparator(filePath, 0) && isWindowsSeparator(filePath, 1) &&
|
|
23
|
+
!(windowsNamespaceMarker(filePath) === "?" && rootedWindowsDriveColonIndex(filePath) === 5);
|
|
31
24
|
}
|
|
32
25
|
export function isWindowsDriveLetterPath(filePath, platform = process.platform) {
|
|
33
26
|
return platform === "win32" && /^[A-Za-z]:[\\/]/.test(filePath);
|
package/dist/local-roots.d.ts
CHANGED
|
@@ -23,4 +23,3 @@ export type ReadLocalFileFromRootsOptions = LocalRootsInputOptions & {
|
|
|
23
23
|
};
|
|
24
24
|
export declare function resolveLocalPathFromRootsSync(options: ResolveLocalPathFromRootsSyncOptions): LocalRootsPathResult | null;
|
|
25
25
|
export declare function readLocalFileFromRoots(options: ReadLocalFileFromRootsOptions): Promise<LocalRootsReadResult | null>;
|
|
26
|
-
//# sourceMappingURL=local-roots.d.ts.map
|
package/dist/local-roots.js
CHANGED
|
@@ -71,7 +71,7 @@ function resolveRootRealSync(rootDir) {
|
|
|
71
71
|
assertNoWindowsPathAlias(realPath, "filesystem", "local root uses a Windows filesystem namespace alias");
|
|
72
72
|
return realPath;
|
|
73
73
|
}
|
|
74
|
-
|
|
74
|
+
function prepareLocalRootsInput(options) {
|
|
75
75
|
const label = options.label ?? "local roots";
|
|
76
76
|
const rootDirs = options.roots.map((rootEntry) => resolveLocalRootInput(rootEntry, label));
|
|
77
77
|
let requestedPath;
|
|
@@ -83,6 +83,13 @@ export function resolveLocalPathFromRootsSync(options) {
|
|
|
83
83
|
return null;
|
|
84
84
|
throw error;
|
|
85
85
|
}
|
|
86
|
+
return { label, rootDirs, requestedPath };
|
|
87
|
+
}
|
|
88
|
+
export function resolveLocalPathFromRootsSync(options) {
|
|
89
|
+
const input = prepareLocalRootsInput(options);
|
|
90
|
+
if (!input)
|
|
91
|
+
return null;
|
|
92
|
+
const { label, rootDirs, requestedPath } = input;
|
|
86
93
|
for (const rootDir of rootDirs) {
|
|
87
94
|
const rootReal = resolveRootRealSync(rootDir);
|
|
88
95
|
if (!rootReal) {
|
|
@@ -122,17 +129,17 @@ export function resolveLocalPathFromRootsSync(options) {
|
|
|
122
129
|
}
|
|
123
130
|
export async function readLocalFileFromRoots(options) {
|
|
124
131
|
const maxBytes = normalizeMaxBytes(options.maxBytes);
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
132
|
+
const input = prepareLocalRootsInput(options);
|
|
133
|
+
if (!input || input.rootDirs.length === 0)
|
|
134
|
+
return null;
|
|
135
|
+
const { rootDirs, requestedPath } = input;
|
|
136
|
+
const readOptions = {
|
|
137
|
+
hardlinks: options.hardlinks,
|
|
138
|
+
symlinks: options.symlinks,
|
|
139
|
+
};
|
|
140
|
+
// Omission keeps Root's default cap; one policy snapshot serves every root.
|
|
141
|
+
if (maxBytes !== undefined)
|
|
142
|
+
readOptions.maxBytes = maxBytes;
|
|
136
143
|
for (const rootDir of rootDirs) {
|
|
137
144
|
let scopedRoot;
|
|
138
145
|
try {
|
|
@@ -141,15 +148,6 @@ export async function readLocalFileFromRoots(options) {
|
|
|
141
148
|
catch {
|
|
142
149
|
continue;
|
|
143
150
|
}
|
|
144
|
-
const readOptions = {
|
|
145
|
-
hardlinks: options.hardlinks,
|
|
146
|
-
symlinks: options.symlinks,
|
|
147
|
-
};
|
|
148
|
-
// Leave maxBytes absent when the caller omits it so Root's own default
|
|
149
|
-
// cap remains in force instead of being overwritten by undefined.
|
|
150
|
-
if (maxBytes !== undefined) {
|
|
151
|
-
readOptions.maxBytes = maxBytes;
|
|
152
|
-
}
|
|
153
151
|
try {
|
|
154
152
|
const result = await scopedRoot.readAbsolute(requestedPath, readOptions);
|
|
155
153
|
return { ...result, root: scopedRoot.rootReal };
|
package/dist/lock-config.d.ts
CHANGED
|
@@ -1,13 +1,5 @@
|
|
|
1
1
|
import fsSync from "node:fs";
|
|
2
|
-
export type EntryIdentity =
|
|
3
|
-
ctimeMs: number;
|
|
4
|
-
dev: number;
|
|
5
|
-
ino: number;
|
|
6
|
-
mode: number;
|
|
7
|
-
mtimeMs: number;
|
|
8
|
-
nlink: number;
|
|
9
|
-
size: number;
|
|
10
|
-
};
|
|
2
|
+
export type EntryIdentity = Readonly<Pick<fsSync.BigIntStats, "ctimeNs" | "dev" | "ino" | "mode" | "mtimeNs" | "nlink" | "size">>;
|
|
11
3
|
export type CopiedEntryManifest = (EntryIdentity & {
|
|
12
4
|
children: Array<{
|
|
13
5
|
name: string;
|
|
@@ -27,19 +19,12 @@ type CleanupAliasGroup = {
|
|
|
27
19
|
export type CleanupCopiedEntryState = {
|
|
28
20
|
aliasGroups: Map<string, CleanupAliasGroup>;
|
|
29
21
|
};
|
|
30
|
-
export declare function entryIdentity(stat:
|
|
31
|
-
ctimeMs: number;
|
|
32
|
-
dev: number;
|
|
33
|
-
ino: number;
|
|
34
|
-
mode: number;
|
|
35
|
-
mtimeMs: number;
|
|
36
|
-
nlink: number;
|
|
37
|
-
size: number;
|
|
38
|
-
}): EntryIdentity;
|
|
22
|
+
export declare function entryIdentity(stat: EntryIdentity): EntryIdentity;
|
|
39
23
|
export declare function sameIdentity(a: EntryIdentity, b: EntryIdentity): boolean;
|
|
40
24
|
export declare function sourceChangedError(sourcePath: string): Error;
|
|
25
|
+
export declare function inspectSourceEntry(sourcePath: string, observe: () => fsSync.BigIntStats): fsSync.BigIntStats;
|
|
26
|
+
export declare function inspectSourceDirectory(sourcePath: string, expected?: Pick<fsSync.BigIntStats, "dev" | "ino">): fsSync.BigIntStats;
|
|
41
27
|
export declare function assertSourceStillMatches(sourcePath: string, identity: EntryIdentity): Promise<void>;
|
|
42
28
|
export declare function createCleanupCopiedEntryState(sourcePath: string, manifest: CopiedEntryManifest): CleanupCopiedEntryState;
|
|
43
|
-
export declare function cleanupCopiedEntry(sourcePath: string, manifest: CopiedEntryManifest, state: CleanupCopiedEntryState, assertBeforeMutation: () => void): Promise<CleanupCopiedEntryResult>;
|
|
29
|
+
export declare function cleanupCopiedEntry(sourcePath: string, manifest: CopiedEntryManifest, state: CleanupCopiedEntryState, assertBeforeMutation: (() => void) | undefined): Promise<CleanupCopiedEntryResult>;
|
|
44
30
|
export {};
|
|
45
|
-
//# sourceMappingURL=move-path-cleanup.d.ts.map
|
|
@@ -2,14 +2,15 @@ import fsSync from "node:fs";
|
|
|
2
2
|
import fs from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { FsSafeError } from "./errors.js";
|
|
5
|
+
import { inspectDirectoryIdentitySync } from "./directory-guard.js";
|
|
5
6
|
import { inspectFileIdentitySync } from "./strict-file-identity.js";
|
|
6
7
|
export function entryIdentity(stat) {
|
|
7
8
|
return {
|
|
8
|
-
|
|
9
|
+
ctimeNs: stat.ctimeNs,
|
|
9
10
|
dev: stat.dev,
|
|
10
11
|
ino: stat.ino,
|
|
11
12
|
mode: stat.mode,
|
|
12
|
-
|
|
13
|
+
mtimeNs: stat.mtimeNs,
|
|
13
14
|
nlink: stat.nlink,
|
|
14
15
|
size: stat.size,
|
|
15
16
|
};
|
|
@@ -20,16 +21,32 @@ export function sameIdentity(a, b) {
|
|
|
20
21
|
a.mode === b.mode &&
|
|
21
22
|
a.nlink === b.nlink &&
|
|
22
23
|
a.size === b.size &&
|
|
23
|
-
a.
|
|
24
|
-
a.
|
|
24
|
+
a.mtimeNs === b.mtimeNs &&
|
|
25
|
+
a.ctimeNs === b.ctimeNs);
|
|
25
26
|
}
|
|
26
27
|
export function sourceChangedError(sourcePath) {
|
|
27
28
|
return Object.assign(new Error(`Source changed during move fallback: ${sourcePath}`), {
|
|
28
29
|
code: "ESTALE",
|
|
29
30
|
});
|
|
30
31
|
}
|
|
32
|
+
export function inspectSourceEntry(sourcePath, observe) {
|
|
33
|
+
return inspectFileIdentitySync(observe, undefined, process.platform, () => sourceChangedError(sourcePath));
|
|
34
|
+
}
|
|
35
|
+
export function inspectSourceDirectory(sourcePath, expected) {
|
|
36
|
+
try {
|
|
37
|
+
return inspectDirectoryIdentitySync(sourcePath, expected);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
const code = error?.code;
|
|
41
|
+
if (code === "ENOENT" || code === "ENOTDIR" ||
|
|
42
|
+
(error instanceof FsSafeError && (error.code === "path-mismatch" || error.code === "not-file"))) {
|
|
43
|
+
throw sourceChangedError(sourcePath);
|
|
44
|
+
}
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
31
48
|
export async function assertSourceStillMatches(sourcePath, identity) {
|
|
32
|
-
if (!sameIdentity(identity,
|
|
49
|
+
if (!sameIdentity(identity, inspectSourceEntry(sourcePath, () => fsSync.lstatSync(sourcePath, { bigint: true })))) {
|
|
33
50
|
throw sourceChangedError(sourcePath);
|
|
34
51
|
}
|
|
35
52
|
}
|
|
@@ -43,7 +60,7 @@ function collectAliasCandidates(sourcePath, manifest, candidates) {
|
|
|
43
60
|
}
|
|
44
61
|
return;
|
|
45
62
|
}
|
|
46
|
-
if (manifest.nlink <=
|
|
63
|
+
if (manifest.nlink <= 1n) {
|
|
47
64
|
return;
|
|
48
65
|
}
|
|
49
66
|
const key = identityKey(manifest);
|
|
@@ -76,15 +93,26 @@ function sameOwnedUnlinkTransition(before, after) {
|
|
|
76
93
|
before.ino === after.ino &&
|
|
77
94
|
before.mode === after.mode &&
|
|
78
95
|
before.size === after.size &&
|
|
79
|
-
before.
|
|
80
|
-
before.nlink >
|
|
81
|
-
after.nlink === before.nlink -
|
|
82
|
-
after.
|
|
96
|
+
before.mtimeNs === after.mtimeNs &&
|
|
97
|
+
before.nlink > 0n &&
|
|
98
|
+
after.nlink === before.nlink - 1n &&
|
|
99
|
+
after.ctimeNs >= before.ctimeNs);
|
|
83
100
|
}
|
|
84
101
|
function poisonAliasGroup(group) {
|
|
85
102
|
group.stale = true;
|
|
86
103
|
return "stale";
|
|
87
104
|
}
|
|
105
|
+
function inspectCleanupLeaf(sourcePath, expected) {
|
|
106
|
+
let mismatch;
|
|
107
|
+
try {
|
|
108
|
+
return inspectFileIdentitySync(() => fsSync.lstatSync(sourcePath, { bigint: true }), expected, process.platform, () => mismatch = sourceChangedError(sourcePath));
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (mismatch !== undefined && error === mismatch)
|
|
112
|
+
return undefined;
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
88
116
|
async function observeOwnedAliasUnlink(sourcePath, group) {
|
|
89
117
|
group.remainingPaths.delete(sourcePath);
|
|
90
118
|
const remainingPath = group.remainingPaths.values().next().value;
|
|
@@ -93,7 +121,7 @@ async function observeOwnedAliasUnlink(sourcePath, group) {
|
|
|
93
121
|
}
|
|
94
122
|
let observed;
|
|
95
123
|
try {
|
|
96
|
-
observed =
|
|
124
|
+
observed = inspectCleanupLeaf(remainingPath, group.expected);
|
|
97
125
|
}
|
|
98
126
|
catch (error) {
|
|
99
127
|
if (error?.code === "ENOENT") {
|
|
@@ -101,11 +129,10 @@ async function observeOwnedAliasUnlink(sourcePath, group) {
|
|
|
101
129
|
}
|
|
102
130
|
throw error;
|
|
103
131
|
}
|
|
104
|
-
|
|
105
|
-
if (!sameOwnedUnlinkTransition(group.expected, observedIdentity)) {
|
|
132
|
+
if (!observed || !sameOwnedUnlinkTransition(group.expected, observed)) {
|
|
106
133
|
return poisonAliasGroup(group);
|
|
107
134
|
}
|
|
108
|
-
group.expected =
|
|
135
|
+
group.expected = entryIdentity(observed);
|
|
109
136
|
return "removed";
|
|
110
137
|
}
|
|
111
138
|
function mergeCleanupResults(a, b) {
|
|
@@ -130,12 +157,16 @@ export async function cleanupCopiedEntry(sourcePath, manifest, state, assertBefo
|
|
|
130
157
|
// A same-inode directory can gain unrelated children after commit. Still
|
|
131
158
|
// clean manifest children so the fallback does not duplicate copied files.
|
|
132
159
|
let result = "removed";
|
|
160
|
+
const assertBeforeChildMutation = assertBeforeMutation ? () => {
|
|
161
|
+
assertBeforeMutation();
|
|
162
|
+
inspectSourceDirectory(sourcePath, manifest.directoryIdentity);
|
|
163
|
+
} : undefined;
|
|
133
164
|
for (const child of manifest.children) {
|
|
134
|
-
result = mergeCleanupResults(result, await cleanupCopiedEntry(path.join(sourcePath, child.name), child.manifest, state,
|
|
165
|
+
result = mergeCleanupResults(result, await cleanupCopiedEntry(path.join(sourcePath, child.name), child.manifest, state, assertBeforeChildMutation));
|
|
135
166
|
}
|
|
136
167
|
// Child cleanup and the caller's authority check can replace the directory.
|
|
137
168
|
// Keep the final exact observation after both, immediately before removal.
|
|
138
|
-
assertBeforeMutation();
|
|
169
|
+
assertBeforeMutation?.();
|
|
139
170
|
try {
|
|
140
171
|
currentStat = inspectFileIdentitySync(() => fsSync.lstatSync(sourcePath, { bigint: true }), manifest.directoryIdentity);
|
|
141
172
|
}
|
|
@@ -166,9 +197,10 @@ export async function cleanupCopiedEntry(sourcePath, manifest, state, assertBefo
|
|
|
166
197
|
if (aliasGroup?.stale) {
|
|
167
198
|
return "stale";
|
|
168
199
|
}
|
|
200
|
+
const expected = aliasGroup?.expected ?? manifest;
|
|
169
201
|
let currentStat;
|
|
170
202
|
try {
|
|
171
|
-
currentStat =
|
|
203
|
+
currentStat = inspectCleanupLeaf(sourcePath, expected);
|
|
172
204
|
}
|
|
173
205
|
catch (error) {
|
|
174
206
|
if (error?.code === "ENOENT") {
|
|
@@ -176,11 +208,15 @@ export async function cleanupCopiedEntry(sourcePath, manifest, state, assertBefo
|
|
|
176
208
|
}
|
|
177
209
|
throw error;
|
|
178
210
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
211
|
+
for (let observation = 0;; observation++) {
|
|
212
|
+
if (!currentStat || !sameIdentity(expected, currentStat)) {
|
|
213
|
+
return aliasGroup ? poisonAliasGroup(aliasGroup) : "stale";
|
|
214
|
+
}
|
|
215
|
+
if (observation || !assertBeforeMutation)
|
|
216
|
+
break;
|
|
217
|
+
assertBeforeMutation();
|
|
218
|
+
currentStat = inspectCleanupLeaf(sourcePath, expected);
|
|
182
219
|
}
|
|
183
|
-
assertBeforeMutation();
|
|
184
220
|
await fs.unlink(sourcePath);
|
|
185
221
|
return aliasGroup
|
|
186
222
|
? await observeOwnedAliasUnlink(sourcePath, aliasGroup)
|
package/dist/move-path.d.ts
CHANGED
|
@@ -18,4 +18,3 @@ type MoveCopyFallbackReason = "cross-device" | "windows-rename-denied";
|
|
|
18
18
|
export declare function moveCopyFallbackReasonForRenameError(error: unknown, platform?: NodeJS.Platform): MoveCopyFallbackReason | undefined;
|
|
19
19
|
export declare function movePathWithCopyFallback(options: MovePathWithCopyFallbackOptions): Promise<void>;
|
|
20
20
|
export {};
|
|
21
|
-
//# sourceMappingURL=move-path.d.ts.map
|