@openclaw/fs-safe 0.17.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 +43 -0
- package/dist/absolute-path.d.ts +0 -1
- package/dist/advanced.d.ts +0 -1
- package/dist/archive-crc32.d.ts +0 -1
- package/dist/archive-deadline.d.ts +0 -1
- 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 +2 -4
- package/dist/archive-merge.js +14 -4
- package/dist/archive-native.d.ts +3 -15
- package/dist/archive-native.js +46 -71
- package/dist/archive-options.d.ts +7 -2
- package/dist/archive-parser-errors.d.ts +0 -1
- 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-directory.d.ts +0 -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 +0 -1
- package/dist/archive-zip-manifest.d.ts +0 -1
- package/dist/archive-zip-names.d.ts +0 -1
- package/dist/archive-zip-preflight.d.ts +0 -1
- package/dist/archive.d.ts +0 -1
- package/dist/archive.js +87 -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 +0 -1
- 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 -1
- 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 +0 -1
- 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 +0 -1
- 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 +0 -1
- package/dist/file-contents.d.ts +0 -1
- package/dist/file-handle-transfer.d.ts +0 -1
- package/dist/file-hash.d.ts +0 -1
- package/dist/file-hash.js +170 -66
- 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 +32 -98
- package/dist/file-lock-sync-root-arbitration.d.ts +0 -1
- package/dist/file-lock-sync-root-held.d.ts +0 -1
- 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 +21 -23
- package/dist/file-lock-sync.d.ts +0 -1
- package/dist/file-lock-sync.js +38 -117
- 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 +3 -4
- 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-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/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 +42 -61
- 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 +7 -130
- 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 +6 -15
- 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/lock-config.d.ts +0 -1
- package/dist/move-path-cleanup.d.ts +0 -1
- package/dist/move-path-stage.d.ts +0 -1
- package/dist/move-path.d.ts +0 -1
- 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 +15 -3
- package/dist/native-staged-file.js +55 -63
- package/dist/native.d.ts +0 -1
- package/dist/opened-file-failure.d.ts +0 -1
- package/dist/opened-realpath.d.ts +0 -1
- 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/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 +8 -16
- 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-mode.d.ts +0 -1
- package/dist/pinned-write-staged.d.ts +0 -1
- package/dist/pinned-write-types.d.ts +9 -21
- package/dist/pinned-write.d.ts +0 -1
- 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 +0 -1
- 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 +77 -139
- 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 +14 -3
- package/dist/replace-file-copy-source.d.ts +0 -1
- package/dist/replace-file-copy-source.js +6 -1
- package/dist/replace-file-descriptor.d.ts +0 -1
- package/dist/replace-file-descriptor.js +6 -1
- 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 +66 -85
- package/dist/replace-file.d.ts +0 -1
- 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.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 +0 -1
- package/dist/root-file.d.ts +0 -1
- package/dist/root-impl.d.ts +2 -10
- package/dist/root-impl.js +114 -91
- package/dist/root-move-noreplace.d.ts +0 -1
- 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 -44
- 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-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 +31 -52
- 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 +0 -1
- package/dist/sidecar-lock-policy.d.ts +3 -1
- package/dist/sidecar-lock-policy.js +16 -0
- package/dist/sidecar-lock-reclaim.d.ts +0 -1
- 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 +16 -83
- package/dist/staged-directory.d.ts +0 -1
- 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 +0 -1
- 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/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 +45 -22
- 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/walk.d.ts +0 -1
- 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 +0 -1
- package/dist/write-open-flags.d.ts +0 -1
- package/dist/write-queue.d.ts +0 -1
- package/docs/atomic.md +14 -0
- package/docs/copy.md +2 -0
- package/docs/mutation-policy-proof.md +6 -4
- package/docs/permissions.md +6 -0
- package/docs/root.md +10 -0
- package/docs/secret-file.md +4 -0
- package/docs/writing.md +9 -3
- 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/byte-view.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-contents.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 -20
- 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
|
@@ -9,10 +9,10 @@ import { inspectDirectoryIdentitySync } from "./directory-guard.js";
|
|
|
9
9
|
import { throwFsSafeReadError } from "./root-errors.js";
|
|
10
10
|
import { matchRootFileOpenFailure, openRootFileSync, } from "./root-file.js";
|
|
11
11
|
import { registerTempPathForExit, } from "./temp-cleanup.js";
|
|
12
|
-
import { TempWorkspaceCleanupCapability, TempWorkspaceCleanupOwner, } from "./temp-workspace-owner.js";
|
|
12
|
+
import { TempWorkspaceCleanupCapability, TempWorkspaceCleanupOwner, throwTempWorkspaceCreationFailure, } from "./temp-workspace-owner.js";
|
|
13
13
|
import { assertNoWindowsPathAlias, hasWindowsPathAlias, } from "./windows-path-alias.js";
|
|
14
14
|
import { TempWorkspaceRetainedChild } from "./temp-workspace-descriptor.js";
|
|
15
|
-
import {
|
|
15
|
+
import { validateInitialTempWorkspaceChild } from "./temp-workspace-child-admission.js";
|
|
16
16
|
import { admitTempWorkspaceRoot, admitTempWorkspaceRootSync, } from "./temp-workspace-admission.js";
|
|
17
17
|
import { validateTempWorkspaceDirMode } from "./temp-workspace-permissions.js";
|
|
18
18
|
function resolveTempWorkspaceCleanupSafety(value) {
|
|
@@ -125,36 +125,6 @@ function tempWorkspaceChildPrefix(root, options, scopedPrefix) {
|
|
|
125
125
|
assertNoWindowsPathAlias(childPrefix, "filesystem", "temp workspace path uses a Windows filesystem namespace alias");
|
|
126
126
|
return childPrefix;
|
|
127
127
|
}
|
|
128
|
-
function throwTempWorkspaceCreationFailure(error, retainedChild, capability, owner) {
|
|
129
|
-
try {
|
|
130
|
-
if (owner)
|
|
131
|
-
owner.cleanupSync();
|
|
132
|
-
else {
|
|
133
|
-
const closeErrors = [];
|
|
134
|
-
try {
|
|
135
|
-
retainedChild?.close();
|
|
136
|
-
}
|
|
137
|
-
catch (closeError) {
|
|
138
|
-
closeErrors.push(closeError);
|
|
139
|
-
}
|
|
140
|
-
try {
|
|
141
|
-
capability.close();
|
|
142
|
-
}
|
|
143
|
-
catch (closeError) {
|
|
144
|
-
closeErrors.push(closeError);
|
|
145
|
-
}
|
|
146
|
-
if (closeErrors.length === 1)
|
|
147
|
-
throw closeErrors[0];
|
|
148
|
-
if (closeErrors.length > 1) {
|
|
149
|
-
throw new AggregateError(closeErrors, "temp workspace admission descriptor close failed");
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
catch (cleanupError) {
|
|
154
|
-
throw new AggregateError([error, cleanupError], "temp workspace creation and cleanup both failed");
|
|
155
|
-
}
|
|
156
|
-
throw error;
|
|
157
|
-
}
|
|
158
128
|
function registerTempWorkspace(dir, retainedChild, capability, admission, dirMode) {
|
|
159
129
|
let owner;
|
|
160
130
|
let stat;
|
|
@@ -201,9 +171,9 @@ async function createTempWorkspace(options, scopedPrefix = false) {
|
|
|
201
171
|
// Retain while the child still has its private creation mode so an
|
|
202
172
|
// explicit dirMode such as 0 cannot make identity descriptor acquisition fail.
|
|
203
173
|
retainedChild = TempWorkspaceRetainedChild.retain(dir, stat);
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
174
|
+
if (needsModeInitialization) {
|
|
175
|
+
await retainedChild.initializeMode(dirMode, admission.ownerUid, admission.assertCurrent);
|
|
176
|
+
}
|
|
207
177
|
}
|
|
208
178
|
catch (error) {
|
|
209
179
|
throwTempWorkspaceCreationFailure(error, retainedChild, capability);
|
|
@@ -294,7 +264,12 @@ function createTempWorkspaceSync(options, scopedPrefix = false) {
|
|
|
294
264
|
}
|
|
295
265
|
const needsModeInitialization = validateInitialTempWorkspaceChild(stat, admission.ownerUid, dirMode);
|
|
296
266
|
retainedChild ??= TempWorkspaceRetainedChild.retain(dir, stat);
|
|
297
|
-
|
|
267
|
+
if (needsModeInitialization) {
|
|
268
|
+
retainedChild.initializeModeSync(dirMode, admission.ownerUid, admission.assertCurrent);
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
retainedChild.discardInitialReceipt();
|
|
272
|
+
}
|
|
298
273
|
}
|
|
299
274
|
catch (error) {
|
|
300
275
|
throwTempWorkspaceCreationFailure(error, retainedChild, capability);
|
|
@@ -25,4 +25,3 @@ export type PublishFailureState = {
|
|
|
25
25
|
export declare function rememberCreatedTarget(state: PublishFailureState, identity: FileIdentityStat, phase: PublishFileExclusiveFailurePhase): void;
|
|
26
26
|
export declare function publicationFailure(error: unknown, state: PublishFailureState, cleanup: PublishFileExclusiveCleanup): FsSafeError;
|
|
27
27
|
export declare function directorySyncFailure(error: unknown): PublishFileExclusiveDirectorySyncFailure;
|
|
28
|
-
//# sourceMappingURL=publish-file-failure.d.ts.map
|
package/dist/publish-file.d.ts
CHANGED
package/dist/realpath.d.ts
CHANGED
package/dist/regular-file.d.ts
CHANGED
|
@@ -35,4 +35,3 @@ export declare function readRegularFileSync(params: {
|
|
|
35
35
|
export declare function appendRegularFile(options: AppendRegularFileOptions): Promise<void>;
|
|
36
36
|
export declare function appendRegularFileSync(options: AppendRegularFileOptions): void;
|
|
37
37
|
export {};
|
|
38
|
-
//# sourceMappingURL=regular-file.d.ts.map
|
package/dist/regular-file.js
CHANGED
|
@@ -5,10 +5,10 @@ import { readFileDescriptorBoundedSync, readFileHandleBounded } from "./bounded-
|
|
|
5
5
|
import { normalizeMaxBytes } from "./byte-budget.js";
|
|
6
6
|
import { assertNoUnsafeDeviceReadPath } from "./device-path.js";
|
|
7
7
|
import { FsSafeError } from "./errors.js";
|
|
8
|
-
import {
|
|
8
|
+
import { inspectFileIdentitySync } from "./strict-file-identity.js";
|
|
9
9
|
import { isNotFoundPathError } from "./path.js";
|
|
10
10
|
import { resolveReadOpenFlags } from "./read-open-flags.js";
|
|
11
|
-
import {
|
|
11
|
+
import { assertNoSymlinkParentsSync } from "./symlink-parents.js";
|
|
12
12
|
import { getFsSafeTestHooks } from "./test-hooks.js";
|
|
13
13
|
import { isNonRegularWriteOpenError, isNonRegularWriteOpenErrorSync, resolveNonblockingWriteFlag, } from "./write-open-flags.js";
|
|
14
14
|
import { assertNoWindowsPathAlias, resolvePathPreservingWindowsRoot, } from "./windows-path-alias.js";
|
|
@@ -50,18 +50,7 @@ export function statRegularFileSync(filePath) {
|
|
|
50
50
|
return { missing: false, stat };
|
|
51
51
|
}
|
|
52
52
|
export async function readRegularFile(params) {
|
|
53
|
-
const maxBytes =
|
|
54
|
-
const filePath = params.filePath;
|
|
55
|
-
assertNoWindowsPathAlias(filePath, "filesystem", "file path uses a Windows filesystem namespace alias");
|
|
56
|
-
assertNoUnsafeDeviceReadPath(filePath);
|
|
57
|
-
const before = await inspectFileIdentity(async () => {
|
|
58
|
-
const stat = fsSync.lstatSync(filePath, { bigint: true });
|
|
59
|
-
assertRegularReadStat(stat, filePath, true);
|
|
60
|
-
return stat;
|
|
61
|
-
}).catch((error) => throwReadPreviewError(error, filePath));
|
|
62
|
-
if (maxBytes !== undefined && before.size > maxBytes) {
|
|
63
|
-
throw regularFileTooLargeError(filePath, maxBytes);
|
|
64
|
-
}
|
|
53
|
+
const { filePath, maxBytes, before } = prepareRegularRead(params);
|
|
65
54
|
let handle;
|
|
66
55
|
try {
|
|
67
56
|
handle = await fs.open(filePath, resolveReadOpenFlags());
|
|
@@ -73,28 +62,7 @@ export async function readRegularFile(params) {
|
|
|
73
62
|
throw err;
|
|
74
63
|
}
|
|
75
64
|
try {
|
|
76
|
-
const stat =
|
|
77
|
-
const identity = await inspectFileIdentity(async () => {
|
|
78
|
-
const exact = fsSync.fstatSync(handle.fd, { bigint: true });
|
|
79
|
-
assertRegularReadStat(exact, filePath);
|
|
80
|
-
return exact;
|
|
81
|
-
}, before);
|
|
82
|
-
try {
|
|
83
|
-
await inspectFileIdentity(async () => {
|
|
84
|
-
const current = fsSync.lstatSync(filePath, { bigint: true });
|
|
85
|
-
assertRegularReadStat(current, filePath);
|
|
86
|
-
return current;
|
|
87
|
-
}, identity);
|
|
88
|
-
}
|
|
89
|
-
catch (err) {
|
|
90
|
-
if (isNotFoundPathError(err)) {
|
|
91
|
-
throw new FsSafeError("path-mismatch", `File changed during read: ${filePath}`);
|
|
92
|
-
}
|
|
93
|
-
throw err;
|
|
94
|
-
}
|
|
95
|
-
if (maxBytes !== undefined && stat.size > maxBytes) {
|
|
96
|
-
throw regularFileTooLargeError(filePath, maxBytes);
|
|
97
|
-
}
|
|
65
|
+
const stat = inspectOpenedRegularRead(handle.fd, filePath, before, maxBytes);
|
|
98
66
|
// With a byte cap, avoid readFile(): a raced file growth would allocate
|
|
99
67
|
// the oversized content before the post-read check could reject it.
|
|
100
68
|
let buffer;
|
|
@@ -127,47 +95,7 @@ function assertRegularReadStat(stat, filePath, preview = false) {
|
|
|
127
95
|
throw new Error(preview ? "path must be a regular file" : `File is not a regular file: ${filePath}`);
|
|
128
96
|
}
|
|
129
97
|
}
|
|
130
|
-
function
|
|
131
|
-
const stat = fsSync.fstatSync(params.fd);
|
|
132
|
-
const identity = inspectFileIdentitySync(() => {
|
|
133
|
-
const exact = fsSync.fstatSync(params.fd, { bigint: true });
|
|
134
|
-
assertRegularReadStat(exact, params.filePath);
|
|
135
|
-
return exact;
|
|
136
|
-
}, params.preOpenStat);
|
|
137
|
-
try {
|
|
138
|
-
inspectFileIdentitySync(() => {
|
|
139
|
-
const current = fsSync.lstatSync(params.filePath, { bigint: true });
|
|
140
|
-
assertRegularReadStat(current, params.filePath);
|
|
141
|
-
return current;
|
|
142
|
-
}, identity);
|
|
143
|
-
}
|
|
144
|
-
catch (error) {
|
|
145
|
-
if (isNotFoundPathError(error)) {
|
|
146
|
-
throw new FsSafeError("path-mismatch", `File changed during read: ${params.filePath}`);
|
|
147
|
-
}
|
|
148
|
-
throw error;
|
|
149
|
-
}
|
|
150
|
-
if (params.maxBytes !== undefined && stat.size > params.maxBytes) {
|
|
151
|
-
throw regularFileTooLargeError(params.filePath, params.maxBytes);
|
|
152
|
-
}
|
|
153
|
-
// Keep capped sync reads incremental for the same reason as async reads:
|
|
154
|
-
// readFileSync(fd) would buffer a raced oversized file before throwing.
|
|
155
|
-
let buffer;
|
|
156
|
-
try {
|
|
157
|
-
buffer =
|
|
158
|
-
params.maxBytes === undefined
|
|
159
|
-
? fsSync.readFileSync(params.fd)
|
|
160
|
-
: readFileDescriptorBoundedSync(params.fd, params.maxBytes);
|
|
161
|
-
}
|
|
162
|
-
catch (error) {
|
|
163
|
-
if (params.maxBytes !== undefined) {
|
|
164
|
-
translateBoundedReadOverflow(error, params.filePath, params.maxBytes);
|
|
165
|
-
}
|
|
166
|
-
throw error;
|
|
167
|
-
}
|
|
168
|
-
return { buffer, stat };
|
|
169
|
-
}
|
|
170
|
-
export function readRegularFileSync(params) {
|
|
98
|
+
function prepareRegularRead(params) {
|
|
171
99
|
const maxBytes = normalizeMaxBytes(params.maxBytes);
|
|
172
100
|
const filePath = params.filePath;
|
|
173
101
|
assertNoWindowsPathAlias(filePath, "filesystem", "file path uses a Windows filesystem namespace alias");
|
|
@@ -186,6 +114,35 @@ export function readRegularFileSync(params) {
|
|
|
186
114
|
if (maxBytes !== undefined && before.size > maxBytes) {
|
|
187
115
|
throw regularFileTooLargeError(filePath, maxBytes);
|
|
188
116
|
}
|
|
117
|
+
return { filePath, maxBytes, before };
|
|
118
|
+
}
|
|
119
|
+
function inspectOpenedRegularRead(fd, filePath, preOpenStat, maxBytes) {
|
|
120
|
+
const stat = fsSync.fstatSync(fd);
|
|
121
|
+
const identity = inspectFileIdentitySync(() => {
|
|
122
|
+
const exact = fsSync.fstatSync(fd, { bigint: true });
|
|
123
|
+
assertRegularReadStat(exact, filePath);
|
|
124
|
+
return exact;
|
|
125
|
+
}, preOpenStat);
|
|
126
|
+
try {
|
|
127
|
+
inspectFileIdentitySync(() => {
|
|
128
|
+
const current = fsSync.lstatSync(filePath, { bigint: true });
|
|
129
|
+
assertRegularReadStat(current, filePath);
|
|
130
|
+
return current;
|
|
131
|
+
}, identity);
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
if (isNotFoundPathError(error)) {
|
|
135
|
+
throw new FsSafeError("path-mismatch", `File changed during read: ${filePath}`);
|
|
136
|
+
}
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
if (maxBytes !== undefined && stat.size > maxBytes) {
|
|
140
|
+
throw regularFileTooLargeError(filePath, maxBytes);
|
|
141
|
+
}
|
|
142
|
+
return stat;
|
|
143
|
+
}
|
|
144
|
+
export function readRegularFileSync(params) {
|
|
145
|
+
const { filePath, maxBytes, before } = prepareRegularRead(params);
|
|
189
146
|
let fd;
|
|
190
147
|
try {
|
|
191
148
|
fd = fsSync.openSync(filePath, resolveReadOpenFlags());
|
|
@@ -197,12 +154,21 @@ export function readRegularFileSync(params) {
|
|
|
197
154
|
throw error;
|
|
198
155
|
}
|
|
199
156
|
try {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
maxBytes
|
|
205
|
-
|
|
157
|
+
const stat = inspectOpenedRegularRead(fd, filePath, before, maxBytes);
|
|
158
|
+
// Keep capped reads incremental so raced growth cannot allocate unbounded content.
|
|
159
|
+
let buffer;
|
|
160
|
+
try {
|
|
161
|
+
buffer = maxBytes === undefined
|
|
162
|
+
? fsSync.readFileSync(fd)
|
|
163
|
+
: readFileDescriptorBoundedSync(fd, maxBytes);
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
if (maxBytes !== undefined) {
|
|
167
|
+
translateBoundedReadOverflow(error, filePath, maxBytes);
|
|
168
|
+
}
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
return { buffer, stat };
|
|
206
172
|
}
|
|
207
173
|
finally {
|
|
208
174
|
fsSync.closeSync(fd);
|
|
@@ -240,11 +206,10 @@ function inspectAppendPath(filePath) {
|
|
|
240
206
|
throw new Error(`Refusing to append to non-file: ${filePath}`);
|
|
241
207
|
return stat;
|
|
242
208
|
}
|
|
243
|
-
|
|
244
|
-
const { filePath, content, encoding, mode, maxFileBytes, rejectSymlinkParents } = captureAppendOptions(options);
|
|
209
|
+
function prepareRegularAppend(filePath, rejectSymlinkParents) {
|
|
245
210
|
if (rejectSymlinkParents === true) {
|
|
246
211
|
const resolvedDir = resolvePathPreservingWindowsRoot(path.dirname(filePath));
|
|
247
|
-
|
|
212
|
+
assertNoSymlinkParentsSync({
|
|
248
213
|
rootDir: path.parse(resolvedDir).root,
|
|
249
214
|
targetPath: resolvedDir,
|
|
250
215
|
allowMissing: false,
|
|
@@ -253,14 +218,35 @@ export async function appendRegularFile(options) {
|
|
|
253
218
|
messagePrefix: "Refusing to append under",
|
|
254
219
|
});
|
|
255
220
|
}
|
|
256
|
-
let preOpenStat;
|
|
257
221
|
try {
|
|
258
|
-
|
|
222
|
+
return inspectFileIdentitySync(() => inspectAppendPath(filePath));
|
|
259
223
|
}
|
|
260
224
|
catch (error) {
|
|
261
225
|
if (!isNotFoundPathError(error))
|
|
262
226
|
throw error;
|
|
263
227
|
}
|
|
228
|
+
}
|
|
229
|
+
function inspectOpenedRegularAppend(fd, filePath, preOpenStat) {
|
|
230
|
+
try {
|
|
231
|
+
const identity = inspectFileIdentitySync(() => {
|
|
232
|
+
const stat = fsSync.fstatSync(fd, { bigint: true });
|
|
233
|
+
assertRegularAppendStat(stat, filePath);
|
|
234
|
+
return stat;
|
|
235
|
+
}, preOpenStat);
|
|
236
|
+
inspectFileIdentitySync(() => {
|
|
237
|
+
const current = fsSync.lstatSync(filePath, { bigint: true });
|
|
238
|
+
assertRegularAppendStat(current, filePath);
|
|
239
|
+
return current;
|
|
240
|
+
}, identity);
|
|
241
|
+
return identity;
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
throwAppendIdentityError(error, filePath);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
export async function appendRegularFile(options) {
|
|
248
|
+
const { filePath, content, encoding, mode, maxFileBytes, rejectSymlinkParents } = captureAppendOptions(options);
|
|
249
|
+
const preOpenStat = prepareRegularAppend(filePath, rejectSymlinkParents);
|
|
264
250
|
const contentBytes = Buffer.isBuffer(content) ? content.byteLength : Buffer.byteLength(content, encoding);
|
|
265
251
|
if (maxFileBytes !== undefined &&
|
|
266
252
|
Number(preOpenStat?.size ?? 0n) + contentBytes > maxFileBytes) {
|
|
@@ -279,22 +265,7 @@ export async function appendRegularFile(options) {
|
|
|
279
265
|
throw error;
|
|
280
266
|
}
|
|
281
267
|
try {
|
|
282
|
-
|
|
283
|
-
try {
|
|
284
|
-
identity = await inspectFileIdentity(async () => {
|
|
285
|
-
const stat = fsSync.fstatSync(handle.fd, { bigint: true });
|
|
286
|
-
assertRegularAppendStat(stat, filePath);
|
|
287
|
-
return stat;
|
|
288
|
-
}, preOpenStat);
|
|
289
|
-
await inspectFileIdentity(async () => {
|
|
290
|
-
const current = fsSync.lstatSync(filePath, { bigint: true });
|
|
291
|
-
assertRegularAppendStat(current, filePath);
|
|
292
|
-
return current;
|
|
293
|
-
}, identity);
|
|
294
|
-
}
|
|
295
|
-
catch (error) {
|
|
296
|
-
throwAppendIdentityError(error, filePath);
|
|
297
|
-
}
|
|
268
|
+
const identity = inspectOpenedRegularAppend(handle.fd, filePath, preOpenStat);
|
|
298
269
|
if (maxFileBytes !== undefined &&
|
|
299
270
|
Number(identity.size) + contentBytes > maxFileBytes) {
|
|
300
271
|
return;
|
|
@@ -311,25 +282,7 @@ export async function appendRegularFile(options) {
|
|
|
311
282
|
}
|
|
312
283
|
export function appendRegularFileSync(options) {
|
|
313
284
|
const { filePath, content, encoding, mode, maxFileBytes, rejectSymlinkParents } = captureAppendOptions(options);
|
|
314
|
-
|
|
315
|
-
const resolvedDir = resolvePathPreservingWindowsRoot(path.dirname(filePath));
|
|
316
|
-
assertNoSymlinkParentsSync({
|
|
317
|
-
rootDir: path.parse(resolvedDir).root,
|
|
318
|
-
targetPath: resolvedDir,
|
|
319
|
-
allowMissing: false,
|
|
320
|
-
allowRootChildSymlink: true,
|
|
321
|
-
requireDirectories: true,
|
|
322
|
-
messagePrefix: "Refusing to append under",
|
|
323
|
-
});
|
|
324
|
-
}
|
|
325
|
-
let preOpenStat;
|
|
326
|
-
try {
|
|
327
|
-
preOpenStat = inspectFileIdentitySync(() => inspectAppendPath(filePath));
|
|
328
|
-
}
|
|
329
|
-
catch (error) {
|
|
330
|
-
if (!isNotFoundPathError(error))
|
|
331
|
-
throw error;
|
|
332
|
-
}
|
|
285
|
+
const preOpenStat = prepareRegularAppend(filePath, rejectSymlinkParents);
|
|
333
286
|
const contentBuffer = typeof content === "string" ? Buffer.from(content, encoding) : Buffer.from(content);
|
|
334
287
|
if (maxFileBytes !== undefined &&
|
|
335
288
|
Number(preOpenStat?.size ?? 0n) + contentBuffer.byteLength > maxFileBytes) {
|
|
@@ -348,22 +301,7 @@ export function appendRegularFileSync(options) {
|
|
|
348
301
|
throw error;
|
|
349
302
|
}
|
|
350
303
|
try {
|
|
351
|
-
|
|
352
|
-
try {
|
|
353
|
-
identity = inspectFileIdentitySync(() => {
|
|
354
|
-
const stat = fsSync.fstatSync(fd, { bigint: true });
|
|
355
|
-
assertRegularAppendStat(stat, filePath);
|
|
356
|
-
return stat;
|
|
357
|
-
}, preOpenStat);
|
|
358
|
-
inspectFileIdentitySync(() => {
|
|
359
|
-
const current = fsSync.lstatSync(filePath, { bigint: true });
|
|
360
|
-
assertRegularAppendStat(current, filePath);
|
|
361
|
-
return current;
|
|
362
|
-
}, identity);
|
|
363
|
-
}
|
|
364
|
-
catch (error) {
|
|
365
|
-
throwAppendIdentityError(error, filePath);
|
|
366
|
-
}
|
|
304
|
+
const identity = inspectOpenedRegularAppend(fd, filePath, preOpenStat);
|
|
367
305
|
if (maxFileBytes !== undefined &&
|
|
368
306
|
Number(identity.size) + contentBuffer.byteLength > maxFileBytes) {
|
|
369
307
|
return;
|
|
@@ -73,7 +73,12 @@ async function openPinnedDestination(fsModule, dest, admission, hardlinks) {
|
|
|
73
73
|
return handle;
|
|
74
74
|
}
|
|
75
75
|
catch (error) {
|
|
76
|
-
|
|
76
|
+
try {
|
|
77
|
+
await handle.close();
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Preserve the already-selected admission failure.
|
|
81
|
+
}
|
|
77
82
|
throw error;
|
|
78
83
|
}
|
|
79
84
|
}
|
|
@@ -105,8 +110,14 @@ export async function assertDestinationHardlinkPolicy(fsModule, dest, policy) {
|
|
|
105
110
|
if (policy !== "reject")
|
|
106
111
|
return;
|
|
107
112
|
const handle = await openPinnedDestination(fsModule, dest, "hardlinks");
|
|
108
|
-
if (handle)
|
|
109
|
-
|
|
113
|
+
if (!handle)
|
|
114
|
+
return;
|
|
115
|
+
try {
|
|
116
|
+
await handle.close();
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// The asynchronous admission pin has best-effort close semantics.
|
|
120
|
+
}
|
|
110
121
|
}
|
|
111
122
|
export function assertDestinationHardlinkPolicySync(fsModule, dest, policy) {
|
|
112
123
|
if (policy !== "reject")
|
|
@@ -73,7 +73,12 @@ export async function readOwnedCopySource(params) {
|
|
|
73
73
|
return { replacement: await handle.readFile(), mode: Number(opened.mode) };
|
|
74
74
|
}
|
|
75
75
|
finally {
|
|
76
|
-
|
|
76
|
+
try {
|
|
77
|
+
await handle.close();
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Best-effort close includes synchronous adapter throws.
|
|
81
|
+
}
|
|
77
82
|
}
|
|
78
83
|
}
|
|
79
84
|
export function readOwnedCopySourceSync(params) {
|
|
@@ -14,7 +14,12 @@ export async function syncDirectoryBestEffort(fsModule, dirPath) {
|
|
|
14
14
|
// Best-effort on platforms/filesystems that do not support directory fsync.
|
|
15
15
|
}
|
|
16
16
|
finally {
|
|
17
|
-
|
|
17
|
+
try {
|
|
18
|
+
await handle?.close();
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// Best-effort close also covers synchronous adapter throws.
|
|
22
|
+
}
|
|
18
23
|
}
|
|
19
24
|
}
|
|
20
25
|
export function syncDirectoryBestEffortSync(fsModule, dirPath) {
|
|
@@ -4,4 +4,3 @@ export declare function validateRenameIdentity(policy: RenameIdentityPolicy | un
|
|
|
4
4
|
export declare function atomicExpectedContentHash(policy: RenameIdentityPolicy | undefined, content: string | Uint8Array): string | undefined;
|
|
5
5
|
export declare function withAtomicRenameIdentityLock<T>(filePath: string, fn: () => Promise<T>): Promise<T>;
|
|
6
6
|
export declare function withAtomicRenameIdentityLockSync<T>(filePath: string, fn: () => T): T;
|
|
7
|
-
//# sourceMappingURL=replace-file-rename-policy.d.ts.map
|
|
@@ -1,45 +1,45 @@
|
|
|
1
1
|
import syncFs, { type BigIntStats } from "node:fs";
|
|
2
2
|
import fs, { type FileHandle } from "node:fs/promises";
|
|
3
|
+
import { type TempPathRegistration } from "./temp-cleanup.js";
|
|
3
4
|
type AsyncOwnerFileSystem = Pick<typeof fs, "lstat" | "open" | "unlink">;
|
|
4
5
|
type SyncOwnerFileSystem = Pick<typeof syncFs, "closeSync" | "fstatSync" | "lstatSync" | "openSync" | "readFileSync" | "unlinkSync">;
|
|
5
6
|
export type AtomicTempFailure = Readonly<{
|
|
6
7
|
error: unknown;
|
|
7
8
|
}>;
|
|
8
9
|
export declare function removePathIfIdentityUnchanged(targetPath: string, identity: Pick<BigIntStats, "dev" | "ino">): Promise<void>;
|
|
9
|
-
|
|
10
|
-
#private;
|
|
10
|
+
declare class AtomicTempOwner<Resource> {
|
|
11
11
|
readonly pathname: string;
|
|
12
|
+
protected resource: Resource | undefined;
|
|
13
|
+
protected recordedIdentity: BigIntStats | undefined;
|
|
14
|
+
protected exists: boolean;
|
|
15
|
+
protected unregister: TempPathRegistration;
|
|
12
16
|
constructor(pathname: string);
|
|
13
17
|
start(): void;
|
|
14
18
|
readonly onIdentity: (identity: BigIntStats) => void;
|
|
19
|
+
get identity(): BigIntStats;
|
|
20
|
+
markRenamed(): void;
|
|
21
|
+
protected takeResource(): Resource | undefined;
|
|
22
|
+
}
|
|
23
|
+
export declare class AsyncAtomicTempOwner extends AtomicTempOwner<FileHandle> {
|
|
15
24
|
adopt(temp: {
|
|
16
25
|
handle: FileHandle;
|
|
17
26
|
identity: BigIntStats;
|
|
18
27
|
}): void;
|
|
19
|
-
get identity(): BigIntStats;
|
|
20
28
|
assertCurrent(fsModule: AsyncOwnerFileSystem, pathname?: string): Promise<void>;
|
|
21
29
|
assertPublished(fsModule: AsyncOwnerFileSystem, pathname: string, expectedHash?: string): Promise<void>;
|
|
22
|
-
markRenamed(): void;
|
|
23
30
|
finish(params: {
|
|
24
31
|
fsModule: AsyncOwnerFileSystem;
|
|
25
32
|
originalFailure?: AtomicTempFailure;
|
|
26
33
|
throwOnCleanupError: boolean;
|
|
27
34
|
}): Promise<void>;
|
|
28
35
|
}
|
|
29
|
-
export declare class SyncAtomicTempOwner {
|
|
30
|
-
#private;
|
|
31
|
-
readonly pathname: string;
|
|
32
|
-
constructor(pathname: string);
|
|
33
|
-
start(): void;
|
|
34
|
-
readonly onIdentity: (identity: BigIntStats) => void;
|
|
36
|
+
export declare class SyncAtomicTempOwner extends AtomicTempOwner<number> {
|
|
35
37
|
adopt(temp: {
|
|
36
38
|
fd: number;
|
|
37
39
|
identity: BigIntStats;
|
|
38
40
|
}): void;
|
|
39
|
-
get identity(): BigIntStats;
|
|
40
41
|
assertCurrent(fsModule: SyncOwnerFileSystem, pathname?: string): void;
|
|
41
42
|
assertPublished(fsModule: SyncOwnerFileSystem, pathname: string, expectedHash?: string): void;
|
|
42
|
-
markRenamed(): void;
|
|
43
43
|
finish(params: {
|
|
44
44
|
fsModule: SyncOwnerFileSystem;
|
|
45
45
|
originalFailure?: AtomicTempFailure;
|
|
@@ -47,4 +47,3 @@ export declare class SyncAtomicTempOwner {
|
|
|
47
47
|
}): void;
|
|
48
48
|
}
|
|
49
49
|
export {};
|
|
50
|
-
//# sourceMappingURL=replace-file-temp-owner.d.ts.map
|