@openclaw/fs-safe 0.17.0 → 0.18.1
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 +53 -0
- package/dist/absolute-path.d.ts +0 -1
- package/dist/advanced.d.ts +2 -2
- package/dist/archive-crc32.d.ts +0 -1
- package/dist/archive-deadline.d.ts +0 -1
- package/dist/archive-durability.d.ts +1 -2
- 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-parser-errors.d.ts +0 -1
- package/dist/archive-parser.wasm +0 -0
- package/dist/archive-plan.d.ts +72 -2
- package/dist/archive-plan.js +86 -22
- package/dist/archive-read.d.ts +0 -1
- package/dist/archive-staging.d.ts +0 -1
- package/dist/archive-tar-stream.d.ts +0 -1
- package/dist/archive-tar-wasm.d.ts +1 -2
- 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 +1 -2
- package/dist/archive-zip-entry.d.ts +1 -2
- package/dist/archive-zip-entry.js +1 -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 +8 -6
- package/dist/archive.js +204 -168
- package/dist/async-lock.d.ts +0 -1
- package/dist/atomic.d.ts +3 -2
- 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 +1 -2
- 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-owned-file.d.ts +0 -1
- package/dist/create.d.ts +16 -3
- package/dist/create.js +388 -2
- package/dist/creation-boundary.d.ts +60 -0
- package/dist/creation-boundary.js +371 -0
- 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-node.js +12 -2
- package/dist/directory-mode-owner.d.ts +0 -1
- package/dist/directory-receipt.d.ts +0 -1
- package/dist/durability.d.ts +2 -2
- 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 +33 -103
- 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 +3 -3
- 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 +18 -27
- package/dist/file-lock-sync.d.ts +4 -22
- 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 +7 -2
- package/dist/file-store-boundary.js +64 -27
- 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 +18 -29
- package/dist/file-store.d.ts +0 -1
- package/dist/file-store.js +4 -10
- 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 +1 -2
- 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 +9 -7
- 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 +13 -9
- package/dist/json-durable-queue.d.ts +0 -1
- package/dist/json-durable-queue.js +8 -132
- package/dist/json-store.d.ts +0 -1
- package/dist/json-store.js +1 -2
- package/dist/json-stringify.d.ts +0 -1
- package/dist/json.d.ts +0 -1
- package/dist/json.js +7 -17
- 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/move-path.js +1 -2
- 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 -7
- package/dist/native-parent-admission.d.ts +0 -1
- package/dist/native-pinned-write-windows.d.ts +1 -2
- package/dist/native-pinned-write-windows.js +1 -1
- package/dist/native-pinned-write.d.ts +1 -2
- package/dist/native-pinned-write.js +7 -16
- package/dist/native-policy-directory-observation.d.ts +0 -1
- package/dist/native-policy-parent-windows.d.ts +1 -2
- package/dist/native-rename-outcome.d.ts +0 -1
- package/dist/native-staged-file.d.ts +17 -5
- package/dist/native-staged-file.js +56 -65
- 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 +1 -2
- 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 +7 -2
- package/dist/pinned-operation.d.ts +1 -2
- package/dist/pinned-operation.js +3 -16
- package/dist/pinned-write-input.d.ts +0 -1
- package/dist/pinned-write-mode.d.ts +0 -1
- package/dist/pinned-write-mode.js +1 -1
- package/dist/pinned-write-staged.d.ts +0 -1
- package/dist/pinned-write-staged.js +1 -2
- package/dist/pinned-write-types.d.ts +9 -21
- package/dist/pinned-write.d.ts +0 -2
- package/dist/pinned-write.js +3 -5
- package/dist/positional-read.d.ts +0 -1
- package/dist/private-directory.d.ts +0 -1
- package/dist/private-producer-handoff-sync.d.ts +2 -13
- package/dist/private-producer-handoff-sync.js +10 -52
- package/dist/private-producer-handoff.d.ts +23 -4
- package/dist/private-producer-handoff.js +69 -46
- package/dist/private-temp-workspace.d.ts +0 -1
- package/dist/private-temp-workspace.js +11 -37
- package/dist/publish-copy-stage.d.ts +1 -2
- package/dist/publish-file-failure.d.ts +0 -1
- package/dist/publish-file.d.ts +0 -2
- package/dist/publish-file.js +1 -2
- 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-directory.js +1 -2
- 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 +1 -3
- 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 +3 -4
- package/dist/replace-file.js +1 -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-context.js +3 -7
- package/dist/root-create-input.d.ts +1 -2
- package/dist/root-directory-creation.d.ts +1 -2
- package/dist/root-directory-creation.js +1 -1
- package/dist/root-directory-list.d.ts +0 -1
- package/dist/root-directory-list.js +3 -7
- package/dist/root-directory.d.ts +0 -1
- package/dist/root-entries.d.ts +0 -1
- package/dist/root-entries.js +2 -2
- package/dist/root-errors.d.ts +4 -1
- package/dist/root-errors.js +5 -3
- 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 -15
- package/dist/root-impl.js +136 -112
- package/dist/root-move-noreplace.d.ts +0 -1
- package/dist/root-move-noreplace.js +4 -10
- package/dist/root-move-preflight.d.ts +0 -1
- package/dist/root-observed-path.d.ts +0 -1
- package/dist/root-observed-path.js +2 -4
- package/dist/root-options.d.ts +1 -2
- package/dist/root-path-errors.d.ts +0 -1
- package/dist/root-path-existing.d.ts +3 -1
- package/dist/root-path-existing.js +38 -18
- package/dist/root-path-observation.d.ts +0 -1
- package/dist/root-path-stat.d.ts +0 -1
- package/dist/root-path-stat.js +2 -4
- 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-public-types.d.ts +11 -0
- 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-identity.js +2 -4
- package/dist/root-remove-receipt.d.ts +0 -1
- package/dist/root-remove.d.ts +0 -1
- package/dist/root-remove.js +2 -4
- package/dist/root-symlink-policy.d.ts +0 -1
- package/dist/root-walk.d.ts +0 -1
- package/dist/root-write-admission.d.ts +1 -2
- package/dist/root-write-admission.js +3 -7
- package/dist/root-write-compatibility.d.ts +0 -1
- package/dist/root-write-complete-parent.d.ts +0 -1
- package/dist/root-write-complete-parent.js +2 -3
- 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 +1 -2
- package/dist/root.d.ts +2 -7
- 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 -18
- 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/secure-temp-repair.js +5 -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 +37 -61
- 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 +4 -1
- package/dist/sidecar-lock-policy.js +23 -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-stale-admission.js +2 -6
- package/dist/sidecar-lock-target.d.ts +0 -1
- package/dist/sidecar-lock-types.d.ts +22 -17
- 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/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 +1 -7
- package/dist/temp-workspace-child-admission.d.ts +16 -6
- package/dist/temp-workspace-child-admission.js +71 -15
- package/dist/temp-workspace-descriptor.d.ts +1 -7
- package/dist/temp-workspace-descriptor.js +1 -4
- package/dist/temp-workspace-owner.d.ts +1 -1
- package/dist/temp-workspace-owner.js +45 -22
- 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/text-atomic.js +1 -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 +5 -2
- package/dist/windows-path-alias.d.ts +1 -1
- package/dist/windows-path-alias.js +12 -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/advanced.md +3 -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 +8 -0
- package/docs/sidecar-lock.md +4 -0
- package/docs/store.md +6 -0
- package/docs/temp.md +8 -1
- package/docs/writing.md +14 -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 +0 -22
- package/dist/archive-native.d.ts.map +0 -1
- package/dist/archive-native.js +0 -98
- package/dist/archive-options.d.ts +0 -25
- 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 +0 -22
- package/dist/archive-policy.d.ts.map +0 -1
- package/dist/archive-policy.js +0 -38
- 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 +0 -7
- package/dist/archive-tar-inspect.d.ts.map +0 -1
- package/dist/archive-tar-inspect.js +0 -62
- 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 +0 -19
- package/dist/archive-tar.d.ts.map +0 -1
- package/dist/archive-tar.js +0 -21
- 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 +0 -20
- package/dist/create-directory.d.ts.map +0 -1
- package/dist/create-directory.js +0 -130
- package/dist/create-file-async.d.ts +0 -7
- package/dist/create-file-async.d.ts.map +0 -1
- package/dist/create-file-async.js +0 -121
- package/dist/create-file.d.ts +0 -8
- package/dist/create-file.d.ts.map +0 -1
- package/dist/create-file.js +0 -190
- package/dist/create-owned-file.d.ts.map +0 -1
- package/dist/create.d.ts.map +0 -1
- package/dist/creation-darwin.d.ts +0 -6
- package/dist/creation-darwin.d.ts.map +0 -1
- package/dist/creation-darwin.js +0 -70
- package/dist/creation-file-state.d.ts +0 -19
- package/dist/creation-file-state.d.ts.map +0 -1
- package/dist/creation-file-state.js +0 -118
- package/dist/creation-path.d.ts +0 -21
- package/dist/creation-path.d.ts.map +0 -1
- package/dist/creation-path.js +0 -71
- package/dist/creation-permissions.d.ts +0 -19
- package/dist/creation-permissions.d.ts.map +0 -1
- package/dist/creation-permissions.js +0 -125
- 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 +0 -5
- package/dist/file-store-copy-source.d.ts.map +0 -1
- package/dist/file-store-copy-source.js +0 -31
- package/dist/file-store-limit.d.ts +0 -2
- package/dist/file-store-limit.d.ts.map +0 -1
- package/dist/file-store-limit.js +0 -8
- package/dist/file-store-path.d.ts +0 -3
- package/dist/file-store-path.d.ts.map +0 -1
- package/dist/file-store-path.js +0 -30
- 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 +0 -2
- package/dist/standalone-publication-path.d.ts.map +0 -1
- package/dist/standalone-publication-path.js +0 -6
- 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 +0 -15
- package/dist/temp-workspace-identity.d.ts.map +0 -1
- package/dist/temp-workspace-identity.js +0 -41
- package/dist/temp-workspace-owner.d.ts.map +0 -1
- package/dist/temp-workspace-permissions.d.ts +0 -4
- package/dist/temp-workspace-permissions.d.ts.map +0 -1
- package/dist/temp-workspace-permissions.js +0 -32
- 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/{archive-options.js → root-public-types.js} +0 -0
package/dist/move-path.js
CHANGED
|
@@ -10,8 +10,7 @@ import { resolveReadOpenFlags } from "./read-open-flags.js";
|
|
|
10
10
|
import { realpathSync } from "./realpath.js";
|
|
11
11
|
import { cleanupPinnedFilePath } from "./file-cleanup.js";
|
|
12
12
|
import { createMoveStageOwner } from "./move-path-stage.js";
|
|
13
|
-
import { admitStandalonePublicationPath } from "./
|
|
14
|
-
import { assertNoWindowsPathAlias } from "./windows-path-alias.js";
|
|
13
|
+
import { admitStandalonePublicationPath, assertNoWindowsPathAlias } from "./windows-path-alias.js";
|
|
15
14
|
export function moveCopyFallbackReasonForRenameError(error, platform = process.platform) {
|
|
16
15
|
const code = error?.code;
|
|
17
16
|
if (code === "EXDEV") {
|
|
@@ -6,4 +6,3 @@ export declare class MutationAuthorityError extends FsSafeError {
|
|
|
6
6
|
export declare function assertSynchronousCallbackResult(returned: unknown, name: string): void;
|
|
7
7
|
export declare function composeMutationAssertions(defaultAssertion?: () => void, callAssertion?: () => void): (() => void) | undefined;
|
|
8
8
|
export declare function rethrowMutationAuthorityError(error: unknown): never;
|
|
9
|
-
//# sourceMappingURL=mutation-authority.d.ts.map
|
package/dist/native-binding.d.ts
CHANGED
|
@@ -160,4 +160,3 @@ export interface NativeBinding {
|
|
|
160
160
|
sha256File(fd: number, maxBytes?: number, signal?: AbortSignal): Promise<NativeFileHash>;
|
|
161
161
|
}
|
|
162
162
|
export declare function captureNativeFdClose(binding: NativeBinding): (fd: number) => void;
|
|
163
|
-
//# sourceMappingURL=native-binding.d.ts.map
|
package/dist/native-config.d.ts
CHANGED
|
@@ -14,4 +14,3 @@ export declare function configureFsSafeNative(config: Partial<FsSafeNativeConfig
|
|
|
14
14
|
export declare function configureFsSafePython(config: Partial<FsSafePythonConfig>): void;
|
|
15
15
|
export declare function getFsSafeNativeConfig(): FsSafeNativeConfig;
|
|
16
16
|
export declare function __resetFsSafeNativeConfigForTest(): void;
|
|
17
|
-
//# sourceMappingURL=native-config.d.ts.map
|
|
@@ -14,4 +14,3 @@ export declare function getNativeDirectoryObservationBackend(enabled?: boolean):
|
|
|
14
14
|
export declare function inspectNativeDirectoryObservation(backend: NativeDirectoryObservationBackend, pathname: string, expected?: ExactStatIdentity, platform?: NodeJS.Platform): NativeDirectoryObservation;
|
|
15
15
|
export declare function extendNativeDirectoryObservationGuard(observation: NativeDirectoryObservation, dir: string): NativeDirectoryObservationGuard;
|
|
16
16
|
export declare function isNativeDirectoryObservationGuard(guard: unknown): guard is NativeDirectoryObservationGuard;
|
|
17
|
-
//# sourceMappingURL=native-directory-observation.d.ts.map
|
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
/** Warn once per capability, without including caller paths or native error text. */
|
|
2
2
|
export declare function warnNativeFallback(feature: string, limitation: string): void;
|
|
3
3
|
export declare function __resetNativeFallbackWarningsForTest(): void;
|
|
4
|
-
//# sourceMappingURL=native-fallback-warning.d.ts.map
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import { type BigIntStats
|
|
2
|
-
import type { ContainmentGuarantee } from "./containment.js";
|
|
1
|
+
import { type BigIntStats } from "node:fs";
|
|
3
2
|
export type NativeFileHandle = {
|
|
4
3
|
readonly fd: number;
|
|
5
|
-
readonly containment: ContainmentGuarantee;
|
|
6
4
|
close(): Promise<void>;
|
|
7
|
-
stat(): Promise<Stats>;
|
|
8
5
|
writeFile(data: string | Buffer, encoding?: BufferEncoding): Promise<void>;
|
|
9
6
|
};
|
|
10
7
|
export declare function nativeOpenFlags(flags: number): number;
|
|
@@ -16,4 +13,3 @@ export declare function removeNativeCreatedFileIfStillPinned(params: {
|
|
|
16
13
|
created?: BigIntStats;
|
|
17
14
|
}): void;
|
|
18
15
|
export declare function createNativeExclusiveFile(targetPath: string, mode: number): Promise<NativeFileHandle | undefined>;
|
|
19
|
-
//# sourceMappingURL=native-operations.d.ts.map
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import fsSync, {} from "node:fs";
|
|
2
2
|
import fs from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
|
-
import { FsSafeError } from "./errors.js";
|
|
5
4
|
import { sameFileIdentityForCleanup } from "./file-identity.js";
|
|
6
5
|
import { getNativeBinding } from "./native.js";
|
|
7
6
|
import { captureNativeFdClose } from "./native-binding.js";
|
|
@@ -21,20 +20,16 @@ export function writeNativeFd(fd, data) {
|
|
|
21
20
|
offset += written;
|
|
22
21
|
}
|
|
23
22
|
}
|
|
24
|
-
function wrapNativeFd(fd,
|
|
23
|
+
function wrapNativeFd(fd, closeFd) {
|
|
25
24
|
let open = true;
|
|
26
25
|
return {
|
|
27
26
|
fd,
|
|
28
|
-
containment,
|
|
29
27
|
async close() {
|
|
30
28
|
if (open) {
|
|
31
29
|
open = false;
|
|
32
30
|
closeFd(fd);
|
|
33
31
|
}
|
|
34
32
|
},
|
|
35
|
-
async stat() {
|
|
36
|
-
return fsSync.fstatSync(fd);
|
|
37
|
-
},
|
|
38
33
|
async writeFile(data, encoding) {
|
|
39
34
|
writeNativeFd(fd, Buffer.isBuffer(data) ? data : Buffer.from(data, encoding ?? "utf8"));
|
|
40
35
|
},
|
|
@@ -91,7 +86,7 @@ export async function createNativeExclusiveFile(targetPath, mode) {
|
|
|
91
86
|
fd = opened.fd;
|
|
92
87
|
fsSync.fchmodSync(fd, mode);
|
|
93
88
|
created = fsSync.fstatSync(fd, { bigint: true });
|
|
94
|
-
return wrapNativeFd(fd,
|
|
89
|
+
return wrapNativeFd(fd, closeFd);
|
|
95
90
|
}
|
|
96
91
|
catch (error) {
|
|
97
92
|
if (fd !== undefined) {
|
|
@@ -32,4 +32,3 @@ export declare function openNativeParentAdmission(binding: NativeBinding, rootAd
|
|
|
32
32
|
root: Pick<FileHandle, "fd">;
|
|
33
33
|
}, relativeParentPath: string, observation?: "native-directory"): Promise<NativeParentAdmission>;
|
|
34
34
|
export {};
|
|
35
|
-
//# sourceMappingURL=native-parent-admission.d.ts.map
|
|
@@ -2,6 +2,5 @@ import type { FileHandle } from "node:fs/promises";
|
|
|
2
2
|
import { type AnyAsyncDirectoryGuard } from "./directory-guard.js";
|
|
3
3
|
import type { FileIdentityStat } from "./file-identity.js";
|
|
4
4
|
import type { NativeBinding } from "./native.js";
|
|
5
|
-
import type { PinnedWriteParams } from "./pinned-write.js";
|
|
5
|
+
import type { PinnedWriteParams } from "./pinned-write-types.js";
|
|
6
6
|
export declare function runPinnedWriteWindows(binding: NativeBinding, params: PinnedWriteParams, root: FileHandle, parentFd: number, parentGuard: AnyAsyncDirectoryGuard): Promise<FileIdentityStat>;
|
|
7
|
-
//# sourceMappingURL=native-pinned-write-windows.d.ts.map
|
|
@@ -3,7 +3,7 @@ import { randomUUID } from "node:crypto";
|
|
|
3
3
|
import fsSync, {} from "node:fs";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { createFileHandle } from "./create.js";
|
|
6
|
-
import { hasPreservedCreationArtifacts } from "./creation-
|
|
6
|
+
import { hasPreservedCreationArtifacts } from "./creation-boundary.js";
|
|
7
7
|
import { assertSyncDirectoryGuard } from "./directory-guard.js";
|
|
8
8
|
import { FsSafeError } from "./errors.js";
|
|
9
9
|
import { nativeOpenFlags, removeNativeCreatedFileIfStillPinned, } from "./native-operations.js";
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { FileIdentityStat } from "./file-identity.js";
|
|
2
2
|
import type { NativeBinding } from "./native.js";
|
|
3
|
-
import type { PinnedWriteParams } from "./pinned-write.js";
|
|
3
|
+
import type { PinnedWriteParams } from "./pinned-write-types.js";
|
|
4
4
|
export declare function runPinnedWriteNative(binding: NativeBinding, params: PinnedWriteParams): Promise<FileIdentityStat>;
|
|
5
|
-
//# sourceMappingURL=native-pinned-write.d.ts.map
|
|
@@ -63,15 +63,10 @@ import { NativePolicyDirectoryMismatch } from "./native-policy-directory-observa
|
|
|
63
63
|
import { assertPolicyStagedDirectoryCurrent, assertStagedDirectoryCurrent, describePolicyStagedDirectory, describeStagedDirectory, refreshPolicyStagedDirectoryObservation, } from "./staged-directory.js";
|
|
64
64
|
import { inspectFileIdentitySync } from "./strict-file-identity.js";
|
|
65
65
|
import { realpathSync } from "./realpath.js";
|
|
66
|
+
import { errorCauseOptions } from "./root-errors.js";
|
|
66
67
|
import { isNotFoundPathError, isSymlinkOpenError } from "./path.js";
|
|
67
68
|
import { checkedMutationDirectory, } from "./pinned-mutation-observation.js";
|
|
68
69
|
import { createPathSegmentRoute, joinPathSegmentRoute } from "./path-segment-route.js";
|
|
69
|
-
function relativeParentSegments(relativeParentPath) {
|
|
70
|
-
return relativeParentPath.split("/").filter(Boolean);
|
|
71
|
-
}
|
|
72
|
-
function prospectiveTargetPath(parentPath, parentRoute, offset, basename) {
|
|
73
|
-
return joinPathSegmentRoute(parentPath, parentRoute, offset, basename);
|
|
74
|
-
}
|
|
75
70
|
function sameAbsolutePath(left, right) {
|
|
76
71
|
return path.relative(path.resolve(left), path.resolve(right)) === "";
|
|
77
72
|
}
|
|
@@ -101,12 +96,8 @@ function normalizePolicyParentOpenError(error, params) {
|
|
|
101
96
|
if (!isSymlinkOpenError(error))
|
|
102
97
|
return error;
|
|
103
98
|
return params.mutationAdmission?.rejectParentSymlinks
|
|
104
|
-
? new FsSafeError("symlink", "symlink path component not allowed",
|
|
105
|
-
|
|
106
|
-
})
|
|
107
|
-
: new FsSafeError("path-mismatch", "native write parent changed during policy admission", {
|
|
108
|
-
cause: error instanceof Error ? error : undefined,
|
|
109
|
-
});
|
|
99
|
+
? new FsSafeError("symlink", "symlink path component not allowed", errorCauseOptions(error))
|
|
100
|
+
: new FsSafeError("path-mismatch", "native write parent changed during policy admission", errorCauseOptions(error));
|
|
110
101
|
}
|
|
111
102
|
async function describePosixParent(parentFd, pathname) {
|
|
112
103
|
const parentPath = realpathSync.native(pathname);
|
|
@@ -172,12 +163,12 @@ async function capturePolicyAwarePosixParent(binding, params, rootFd, directoryF
|
|
|
172
163
|
observationDisposers.set(fd, dispose);
|
|
173
164
|
return captured;
|
|
174
165
|
};
|
|
175
|
-
const segments =
|
|
166
|
+
const segments = params.relativeParentPath.split("/").filter(Boolean);
|
|
176
167
|
const parentSpelling = segments.length
|
|
177
168
|
? path.join(params.rootPath, ...segments)
|
|
178
169
|
: params.rootPath;
|
|
179
170
|
const segmentRoute = createPathSegmentRoute(segments);
|
|
180
|
-
const initialTarget =
|
|
171
|
+
const initialTarget = joinPathSegmentRoute(params.rootPath, segmentRoute, 0, params.basename);
|
|
181
172
|
let retainedTargetPath = params.mutationAdmission?.beginParentWalk?.();
|
|
182
173
|
if (retainedTargetPath && !sameAbsolutePath(retainedTargetPath, initialTarget)) {
|
|
183
174
|
retainedTargetPath = undefined;
|
|
@@ -255,7 +246,7 @@ async function capturePolicyAwarePosixParent(binding, params, rootFd, directoryF
|
|
|
255
246
|
if (!isNotFoundPathError(openError)) {
|
|
256
247
|
throw normalizePolicyParentOpenError(openError, params);
|
|
257
248
|
}
|
|
258
|
-
const targetPath = retainedTargetPath ??
|
|
249
|
+
const targetPath = retainedTargetPath ?? joinPathSegmentRoute(currentPath, segmentRoute, index, params.basename);
|
|
259
250
|
const request = Object.freeze({
|
|
260
251
|
targetPath,
|
|
261
252
|
mutationPath: childPath,
|
|
@@ -311,7 +302,7 @@ async function capturePolicyAwarePosixParent(binding, params, rootFd, directoryF
|
|
|
311
302
|
childAuthorization = params.mutationAdmission.advanceCreatedDirectory(evidence);
|
|
312
303
|
}
|
|
313
304
|
}
|
|
314
|
-
const targetPath = retainedTargetPath ??
|
|
305
|
+
const targetPath = retainedTargetPath ?? joinPathSegmentRoute(child.parentPath, segmentRoute, index + 1, params.basename);
|
|
315
306
|
const request = Object.freeze({
|
|
316
307
|
targetPath,
|
|
317
308
|
mutationPath: targetPath,
|
|
@@ -9,4 +9,3 @@ export type NativePolicyDirectoryObserver = MutationDirectoryObserver & {
|
|
|
9
9
|
};
|
|
10
10
|
/** Fresh name/metadata/canonical facts from a caller-owned POSIX descriptor. */
|
|
11
11
|
export declare function nativePolicyDirectoryObserver(binding: NativeBinding | undefined, fd: number, pathname: string): NativePolicyDirectoryObserver | undefined;
|
|
12
|
-
//# sourceMappingURL=native-policy-directory-observation.d.ts.map
|
|
@@ -2,7 +2,7 @@ import { type BigIntStats } from "node:fs";
|
|
|
2
2
|
import { type AsyncDirectoryGuard } from "./directory-guard.js";
|
|
3
3
|
import { type NativeRootAdmission } from "./native-parent-admission.js";
|
|
4
4
|
import type { NativeBinding } from "./native.js";
|
|
5
|
-
import type { PinnedWriteParams } from "./pinned-write.js";
|
|
5
|
+
import type { PinnedWriteParams } from "./pinned-write-types.js";
|
|
6
6
|
import { type MutationDirectoryObservation } from "./pinned-mutation-observation.js";
|
|
7
7
|
type PolicyParent = {
|
|
8
8
|
fd: number;
|
|
@@ -11,4 +11,3 @@ type PolicyParent = {
|
|
|
11
11
|
};
|
|
12
12
|
export declare function capturePolicyAwareWindowsParent(binding: NativeBinding, params: PinnedWriteParams, rootAdmission: NativeRootAdmission): Promise<PolicyParent>;
|
|
13
13
|
export {};
|
|
14
|
-
//# sourceMappingURL=native-policy-parent-windows.d.ts.map
|
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
export declare const NATIVE_RENAME_SOURCE_IDENTITY_MISMATCH = "FS_SAFE_INTERNAL_RENAME_SOURCE_IDENTITY_MISMATCH";
|
|
2
2
|
export type NativeRenameFailureOutcome = "uncommitted" | "indeterminate";
|
|
3
3
|
export declare function classifyNativeRenameFailure(error: unknown): NativeRenameFailureOutcome;
|
|
4
|
-
//# sourceMappingURL=native-rename-outcome.d.ts.map
|
|
@@ -3,15 +3,28 @@ import { type BigIntStats, type Stats } from "node:fs";
|
|
|
3
3
|
import type { AnyAsyncDirectoryGuard } from "./directory-guard.js";
|
|
4
4
|
import type { FileIdentityStat } from "./file-identity.js";
|
|
5
5
|
import { type NativeBinding } from "./native-binding.js";
|
|
6
|
-
import type { PinnedWriteInput, PinnedWriteParams } from "./pinned-write.js";
|
|
6
|
+
import type { PinnedWriteInput, PinnedWriteParams } from "./pinned-write-types.js";
|
|
7
7
|
import type { PublishedFileReceipt, StagedFile, StagedFileCleanupReceipt, StagedFileReceipt } from "./staged-file-types.js";
|
|
8
8
|
export type NativeStagingBinding = NativeBinding & Required<Pick<NativeBinding, "createStagedFile" | "stagedFileMatches" | "removeStagedFile">>;
|
|
9
9
|
export declare function assertNativeStaging(binding: NativeBinding): asserts binding is NativeStagingBinding;
|
|
10
10
|
type StagedPermissionPolicy = "private-creation" | "mode-only";
|
|
11
|
+
type NativeStageOwner = Readonly<{
|
|
12
|
+
binding: NativeStagingBinding;
|
|
13
|
+
parentFd: number;
|
|
14
|
+
closeParentFd: (fd: number) => void;
|
|
15
|
+
directory: StagedFileReceipt["directory"];
|
|
16
|
+
portableNames?: boolean;
|
|
17
|
+
mode: number;
|
|
18
|
+
sync?: boolean;
|
|
19
|
+
strictFileSync?: boolean;
|
|
20
|
+
assertBeforeMutation?: () => void;
|
|
21
|
+
permissionPolicy?: StagedPermissionPolicy;
|
|
22
|
+
name?: string;
|
|
23
|
+
}>;
|
|
11
24
|
declare class NativeStagedFile implements StagedFile {
|
|
12
25
|
#private;
|
|
13
|
-
constructor(
|
|
14
|
-
static create(
|
|
26
|
+
constructor(owner: NativeStageOwner);
|
|
27
|
+
static create(owner: NativeStageOwner, input: PinnedWriteInput, maxBytes?: number): Promise<NativeStagedFile>;
|
|
15
28
|
static write(binding: NativeStagingBinding, parentFd: number, closeParentFd: (fd: number) => void, directory: StagedFileReceipt["directory"], params: PinnedWriteParams, parentGuard: AnyAsyncDirectoryGuard): Promise<FileIdentityStat>;
|
|
16
29
|
get receipt(): StagedFileReceipt;
|
|
17
30
|
assertCurrent(): Promise<void>;
|
|
@@ -23,11 +36,10 @@ declare class NativeStagedFile implements StagedFile {
|
|
|
23
36
|
}
|
|
24
37
|
export declare const createNativeStage: (...args: Parameters<typeof NativeStagedFile.create>) => Promise<StagedFile>;
|
|
25
38
|
export declare const writeNativeStage: typeof NativeStagedFile.write;
|
|
26
|
-
export type { PublishedFileReceipt, StagedFile, StagedFileCleanupReceipt, StagedFileFailureDetails, StagedFilePublication, StagedFileReceipt, } from "./staged-file-types.js";
|
|
27
39
|
export declare function stageFileInDirectory(options: {
|
|
28
40
|
directory: string | DirectoryReceipt<Stats | BigIntStats>;
|
|
29
41
|
content: string | Uint8Array;
|
|
30
42
|
/** Published mode; the unpublished stage stays at 0600. Defaults to 0600. */
|
|
31
43
|
mode?: number;
|
|
32
44
|
}): Promise<StagedFile>;
|
|
33
|
-
|
|
45
|
+
export {};
|
|
@@ -50,8 +50,7 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
|
|
|
50
50
|
var e = new Error(message);
|
|
51
51
|
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
52
52
|
});
|
|
53
|
-
import { assertDarwinCreationAcl } from "./creation-
|
|
54
|
-
import { assertPrivateCreationFile } from "./creation-file-state.js";
|
|
53
|
+
import { assertDarwinCreationAcl, assertPrivateCreationFile } from "./creation-boundary.js";
|
|
55
54
|
import { requireNativeBinding } from "./native.js";
|
|
56
55
|
import { syncFileBestEffortSync } from "./file-sync.js";
|
|
57
56
|
import { randomUUID } from "node:crypto";
|
|
@@ -86,50 +85,33 @@ function assertBasename(name, portable) {
|
|
|
86
85
|
}
|
|
87
86
|
const NOT_PUBLISHED = Object.freeze({ status: "not-published" });
|
|
88
87
|
class NativeStagedFile {
|
|
89
|
-
#
|
|
88
|
+
#owner;
|
|
90
89
|
#closeFd;
|
|
91
|
-
#
|
|
92
|
-
#closeParentFd;
|
|
93
|
-
#directory;
|
|
94
|
-
#portableNames;
|
|
95
|
-
#publishedMode;
|
|
96
|
-
#sync;
|
|
97
|
-
#strictFileSync;
|
|
90
|
+
#assertBeforeMutation;
|
|
98
91
|
#private;
|
|
99
92
|
#verifyMode;
|
|
100
|
-
#assertBeforeMutation;
|
|
101
|
-
#name;
|
|
102
93
|
#state = { status: "open", publication: NOT_PUBLISHED };
|
|
103
94
|
#receipt;
|
|
104
95
|
#rejectFinalSymlink = false;
|
|
105
|
-
constructor(
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
this.#closeFd = captureNativeFdClose(binding);
|
|
109
|
-
this.#
|
|
110
|
-
this.#
|
|
111
|
-
this.#
|
|
112
|
-
this.#
|
|
113
|
-
this.#portableNames = portableNames;
|
|
114
|
-
this.#publishedMode = publishedMode;
|
|
115
|
-
this.#sync = sync;
|
|
116
|
-
this.#strictFileSync = strictFileSync;
|
|
117
|
-
this.#private = permissionPolicy === "private-creation";
|
|
118
|
-
this.#verifyMode = permissionPolicy !== undefined;
|
|
119
|
-
this.#assertBeforeMutation = assertBeforeMutation;
|
|
96
|
+
constructor(owner) {
|
|
97
|
+
const name = owner.name ?? `.fs-safe-${randomUUID()}.tmp`;
|
|
98
|
+
assertBasename(name, owner.portableNames !== false);
|
|
99
|
+
this.#closeFd = captureNativeFdClose(owner.binding);
|
|
100
|
+
this.#owner = { ...owner, name };
|
|
101
|
+
this.#assertBeforeMutation = owner.assertBeforeMutation;
|
|
102
|
+
this.#private = owner.permissionPolicy === "private-creation";
|
|
103
|
+
this.#verifyMode = owner.permissionPolicy !== undefined;
|
|
120
104
|
}
|
|
121
105
|
// Public staging supplies a Node parent; pinned writes supply a native parent.
|
|
122
106
|
// The supplied closer owns parentFd even on construction or preparation failure.
|
|
123
|
-
static async create(
|
|
124
|
-
// Public staging uses portable names; existing POSIX writes accept literal names.
|
|
125
|
-
portableNames = true, sync = true, assertBeforeMutation, exclusiveBasename, strictFileSync = false, permissionPolicy) {
|
|
107
|
+
static async create(owner, input, maxBytes) {
|
|
126
108
|
let staged;
|
|
127
109
|
try {
|
|
128
|
-
staged = new NativeStagedFile(
|
|
110
|
+
staged = new NativeStagedFile(owner);
|
|
129
111
|
}
|
|
130
112
|
catch (error) {
|
|
131
113
|
try {
|
|
132
|
-
closeParentFd(parentFd);
|
|
114
|
+
owner.closeParentFd(owner.parentFd);
|
|
133
115
|
}
|
|
134
116
|
catch (closeError) {
|
|
135
117
|
throw new AggregateError([error, closeError], "staged owner construction and close failed");
|
|
@@ -145,7 +127,13 @@ class NativeStagedFile {
|
|
|
145
127
|
const exclusive = params.overwrite === false && params.input.kind === "buffer" && params.input.stageBeforePublish === false;
|
|
146
128
|
// This owner never escapes. Only the internal verifier borrows its fd;
|
|
147
129
|
// public descriptor methods remain await-free and cannot race disposal.
|
|
148
|
-
const staged = __addDisposableResource(env_1, await NativeStagedFile.create(
|
|
130
|
+
const staged = __addDisposableResource(env_1, await NativeStagedFile.create({
|
|
131
|
+
binding, parentFd, closeParentFd, directory, mode: params.mode, sync: params.sync,
|
|
132
|
+
// Public staging uses portable names; existing POSIX writes accept literal names.
|
|
133
|
+
portableNames: false, assertBeforeMutation: params.assertBeforeMutation,
|
|
134
|
+
name: exclusive ? params.basename : undefined, strictFileSync: params.strictFileSync,
|
|
135
|
+
permissionPolicy: params.private ? "private-creation" : params.verifyPosixMode === true ? "mode-only" : undefined,
|
|
136
|
+
}, params.input, params.maxBytes), true);
|
|
149
137
|
staged.#rejectFinalSymlink = params.rejectFinalSymlink === true;
|
|
150
138
|
if (params.input.kind === "file")
|
|
151
139
|
await params.input.verifySource();
|
|
@@ -201,7 +189,7 @@ class NativeStagedFile {
|
|
|
201
189
|
}
|
|
202
190
|
#assertNamed(name, expectedMode) {
|
|
203
191
|
const fd = this.#file();
|
|
204
|
-
const stat = this.#binding.stagedFileMatches(this.#parentFd, name, fd)
|
|
192
|
+
const stat = this.#owner.binding.stagedFileMatches(this.#owner.parentFd, name, fd)
|
|
205
193
|
? fs.fstatSync(fd, { bigint: true }) : undefined;
|
|
206
194
|
if (!stat || stat.nlink !== 1n) {
|
|
207
195
|
throw new FsSafeError("path-mismatch", "staged entry no longer names the exclusive created file");
|
|
@@ -213,8 +201,8 @@ class NativeStagedFile {
|
|
|
213
201
|
if (this.#open().publication.status !== "not-published") {
|
|
214
202
|
throw new FsSafeError("helper-failed", "staged file publication has already been attempted");
|
|
215
203
|
}
|
|
216
|
-
assertStagedDirectoryCurrent(this.#directory);
|
|
217
|
-
this.#assertNamed(this.#name, 0o600);
|
|
204
|
+
assertStagedDirectoryCurrent(this.#owner.directory);
|
|
205
|
+
this.#assertNamed(this.#owner.name, 0o600);
|
|
218
206
|
}
|
|
219
207
|
#assertPermissions(fd, stat, expectedMode) {
|
|
220
208
|
if (this.#private)
|
|
@@ -228,7 +216,7 @@ class NativeStagedFile {
|
|
|
228
216
|
}
|
|
229
217
|
async #prepare(input, maxBytes) {
|
|
230
218
|
try {
|
|
231
|
-
const mode = this.#
|
|
219
|
+
const mode = this.#owner.mode;
|
|
232
220
|
if (!Number.isInteger(mode) || mode < 0 || mode > 0o7777) {
|
|
233
221
|
throw new FsSafeError("invalid-path", "invalid staged file mode");
|
|
234
222
|
}
|
|
@@ -239,25 +227,25 @@ class NativeStagedFile {
|
|
|
239
227
|
throw new FsSafeError("helper-unavailable", "required cloning cannot verify staged permissions before copying");
|
|
240
228
|
}
|
|
241
229
|
}
|
|
242
|
-
assertStagedDirectoryCurrent(this.#directory);
|
|
230
|
+
assertStagedDirectoryCurrent(this.#owner.directory);
|
|
243
231
|
// The exclusive open performs no fallible post-open checks. Store its fd
|
|
244
232
|
// before every subsequent operation, including the first metadata read.
|
|
245
233
|
const state = this.#open();
|
|
246
234
|
if (this.#private)
|
|
247
|
-
assertDarwinCreationAcl(this.#parentFd, "file");
|
|
235
|
+
assertDarwinCreationAcl(this.#owner.parentFd, "file");
|
|
248
236
|
this.#assertBeforeMutation?.();
|
|
249
237
|
if (this.#private)
|
|
250
|
-
assertDarwinCreationAcl(this.#parentFd, "file");
|
|
238
|
+
assertDarwinCreationAcl(this.#owner.parentFd, "file");
|
|
251
239
|
// Native copying populates its new file before returning its descriptor.
|
|
252
240
|
const copied = input.kind === "file" && !this.#verifyMode
|
|
253
|
-
? await createNativeCopyFile(this.#binding, input, this.#parentFd, this.#name, maxBytes, false)
|
|
241
|
+
? await createNativeCopyFile(this.#owner.binding, input, this.#owner.parentFd, this.#owner.name, maxBytes, false)
|
|
254
242
|
: undefined;
|
|
255
243
|
state.fileFd = copied?.fd;
|
|
256
244
|
if (state.fileFd === undefined) {
|
|
257
245
|
this.#assertBeforeMutation?.();
|
|
258
246
|
if (this.#private)
|
|
259
|
-
assertDarwinCreationAcl(this.#parentFd, "file");
|
|
260
|
-
state.fileFd = this.#binding.createStagedFile(this.#parentFd, this.#name);
|
|
247
|
+
assertDarwinCreationAcl(this.#owner.parentFd, "file");
|
|
248
|
+
state.fileFd = this.#owner.binding.createStagedFile(this.#owner.parentFd, this.#owner.name);
|
|
261
249
|
}
|
|
262
250
|
const fd = state.fileFd;
|
|
263
251
|
if (input.kind === "file")
|
|
@@ -281,14 +269,14 @@ class NativeStagedFile {
|
|
|
281
269
|
await writePinnedInput(fd, input, maxBytes, assertBeforeMutation);
|
|
282
270
|
if (this.#verifyMode)
|
|
283
271
|
this.#assertStagePermissions(fd);
|
|
284
|
-
if (this.#sync) {
|
|
285
|
-
if (this.#strictFileSync)
|
|
272
|
+
if (this.#owner.sync !== false) {
|
|
273
|
+
if (this.#owner.strictFileSync)
|
|
286
274
|
fs.fsyncSync(fd);
|
|
287
275
|
else
|
|
288
276
|
syncFileBestEffortSync(fd);
|
|
289
277
|
}
|
|
290
278
|
const stat = fs.fstatSync(fd, { bigint: true });
|
|
291
|
-
this.#receipt = createStagedFileReceipt(this.#directory, this.#name, stat);
|
|
279
|
+
this.#receipt = createStagedFileReceipt(this.#owner.directory, this.#owner.name, stat);
|
|
292
280
|
this.#assertCurrent();
|
|
293
281
|
}
|
|
294
282
|
catch (error) {
|
|
@@ -311,23 +299,23 @@ class NativeStagedFile {
|
|
|
311
299
|
const overwrite = options?.overwrite;
|
|
312
300
|
try {
|
|
313
301
|
const state = this.#open();
|
|
314
|
-
assertBasename(basename, this.#portableNames);
|
|
315
|
-
if (basename === this.#name || typeof overwrite !== "boolean") {
|
|
302
|
+
assertBasename(basename, this.#owner.portableNames !== false);
|
|
303
|
+
if (basename === this.#owner.name || typeof overwrite !== "boolean") {
|
|
316
304
|
throw new FsSafeError("invalid-path", "publication needs a distinct basename and explicit overwrite policy");
|
|
317
305
|
}
|
|
318
306
|
this.#assertCurrent();
|
|
319
|
-
assertFinalSymlinkRejected(path.join(this.#directory.realPath, basename), this.#rejectFinalSymlink);
|
|
307
|
+
assertFinalSymlinkRejected(path.join(this.#owner.directory.realPath, basename), this.#rejectFinalSymlink);
|
|
320
308
|
this.#assertBeforeMutation?.();
|
|
321
309
|
if (this.#assertBeforeMutation) {
|
|
322
310
|
this.#assertCurrent();
|
|
323
|
-
assertFinalSymlinkRejected(path.join(this.#directory.realPath, basename), this.#rejectFinalSymlink);
|
|
311
|
+
assertFinalSymlinkRejected(path.join(this.#owner.directory.realPath, basename), this.#rejectFinalSymlink);
|
|
324
312
|
}
|
|
325
313
|
try {
|
|
326
314
|
if (overwrite) {
|
|
327
|
-
this.#binding.renameReplace(this.#parentFd, this.#name, this.#parentFd, basename);
|
|
315
|
+
this.#owner.binding.renameReplace(this.#owner.parentFd, this.#owner.name, this.#owner.parentFd, basename);
|
|
328
316
|
}
|
|
329
317
|
else {
|
|
330
|
-
this.#binding.renameNoReplace(this.#parentFd, this.#name, this.#parentFd, basename);
|
|
318
|
+
this.#owner.binding.renameNoReplace(this.#owner.parentFd, this.#owner.name, this.#owner.parentFd, basename);
|
|
331
319
|
}
|
|
332
320
|
}
|
|
333
321
|
catch (error) {
|
|
@@ -355,24 +343,24 @@ class NativeStagedFile {
|
|
|
355
343
|
this.#open().publication = receipt;
|
|
356
344
|
onPublished?.(receipt.staged.identity);
|
|
357
345
|
const stagedMode = this.#assertNamed(basename, 0o600);
|
|
358
|
-
assertStagedDirectoryCurrent(this.#directory);
|
|
346
|
+
assertStagedDirectoryCurrent(this.#owner.directory);
|
|
359
347
|
// Keep contents private until the name passes its identity fence. Mode
|
|
360
348
|
// changes use the owned fd, including for final mode 000.
|
|
361
349
|
const fd = this.#file();
|
|
362
|
-
if (this.#
|
|
363
|
-
fs.fchmodSync(fd, this.#
|
|
350
|
+
if (this.#owner.mode !== 0o600 || stagedMode !== 0o600)
|
|
351
|
+
fs.fchmodSync(fd, this.#owner.mode);
|
|
364
352
|
// Content was synced during preparation. A lost chmod leaves 0600, no wider
|
|
365
353
|
// than modes retaining owner rw; restrictive modes still need a durable correction.
|
|
366
|
-
if (this.#sync && ((this.#
|
|
367
|
-
if (this.#strictFileSync)
|
|
354
|
+
if (this.#owner.sync !== false && ((this.#owner.mode & 0o600) !== 0o600 || (stagedMode & ~this.#owner.mode) !== 0)) {
|
|
355
|
+
if (this.#owner.strictFileSync)
|
|
368
356
|
fs.fsyncSync(fd);
|
|
369
357
|
else
|
|
370
358
|
syncFileBestEffortSync(fd);
|
|
371
359
|
}
|
|
372
|
-
if (this.#sync)
|
|
373
|
-
syncFileBestEffortSync(this.#parentFd);
|
|
374
|
-
this.#assertNamed(basename, this.#
|
|
375
|
-
assertStagedDirectoryCurrent(this.#directory);
|
|
360
|
+
if (this.#owner.sync !== false)
|
|
361
|
+
syncFileBestEffortSync(this.#owner.parentFd);
|
|
362
|
+
this.#assertNamed(basename, this.#owner.mode);
|
|
363
|
+
assertStagedDirectoryCurrent(this.#owner.directory);
|
|
376
364
|
return receipt;
|
|
377
365
|
}
|
|
378
366
|
#finalize() {
|
|
@@ -387,7 +375,7 @@ class NativeStagedFile {
|
|
|
387
375
|
}
|
|
388
376
|
else if (state.publication.status === "not-published" && state.fileFd !== undefined) {
|
|
389
377
|
try {
|
|
390
|
-
outcome = this.#binding.removeStagedFile(this.#parentFd, this.#name, state.fileFd);
|
|
378
|
+
outcome = this.#owner.binding.removeStagedFile(this.#owner.parentFd, this.#owner.name, state.fileFd);
|
|
391
379
|
}
|
|
392
380
|
catch (error) {
|
|
393
381
|
outcome = "failed";
|
|
@@ -397,7 +385,7 @@ class NativeStagedFile {
|
|
|
397
385
|
let resources = "closed";
|
|
398
386
|
for (const [fd, closeFd] of [
|
|
399
387
|
[state.fileFd, this.#closeFd],
|
|
400
|
-
[this.#parentFd, this.#closeParentFd],
|
|
388
|
+
[this.#owner.parentFd, this.#owner.closeParentFd],
|
|
401
389
|
]) {
|
|
402
390
|
if (fd === undefined) {
|
|
403
391
|
continue;
|
|
@@ -411,7 +399,7 @@ class NativeStagedFile {
|
|
|
411
399
|
}
|
|
412
400
|
}
|
|
413
401
|
const receipt = Object.freeze({
|
|
414
|
-
temporaryBasename: this.#name,
|
|
402
|
+
temporaryBasename: this.#owner.name,
|
|
415
403
|
publication: state.publication,
|
|
416
404
|
status: outcome,
|
|
417
405
|
resources,
|
|
@@ -447,5 +435,8 @@ export async function stageFileInDirectory(options) {
|
|
|
447
435
|
const input = { kind: "buffer", data: Buffer.from(options.content) };
|
|
448
436
|
const mode = options.mode ?? 0o600;
|
|
449
437
|
const parent = openStagedDirectory(options.directory);
|
|
450
|
-
return await createNativeStage(
|
|
438
|
+
return await createNativeStage({
|
|
439
|
+
binding, parentFd: parent.fd, closeParentFd: fs.closeSync,
|
|
440
|
+
directory: parent.receipt, mode, permissionPolicy: "mode-only",
|
|
441
|
+
}, input);
|
|
451
442
|
}
|
package/dist/native.d.ts
CHANGED
|
@@ -11,4 +11,3 @@ export declare function getNativeBinding(): NativeBinding | undefined;
|
|
|
11
11
|
export declare function requireNativeBinding(): NativeBinding;
|
|
12
12
|
export declare function __setNativeLoaderForTest(loader: () => NativeBinding): void;
|
|
13
13
|
export declare function __resetNativeLoaderForTest(): void;
|
|
14
|
-
//# sourceMappingURL=native.d.ts.map
|
|
@@ -5,4 +5,3 @@ export declare function recordExclusiveCreateFailure(error: unknown, filePath: s
|
|
|
5
5
|
export declare function openedPathResolutionError(error?: Error): Error;
|
|
6
6
|
export declare function recordPreOpenFileChange(error: unknown, handle: FileHandle, filePath: string, before: BigIntStats | undefined, opened: BigIntStats | undefined): Promise<void>;
|
|
7
7
|
export declare function recordOpenedFileFailure(error: unknown, handle: FileHandle, filePath: string, identity: BigIntStats): Promise<void>;
|
|
8
|
-
//# sourceMappingURL=opened-file-failure.d.ts.map
|
package/dist/output.d.ts
CHANGED
|
@@ -5,4 +5,3 @@ export type OverwriteFileHandleOptions = {
|
|
|
5
5
|
};
|
|
6
6
|
/** Overwrite a borrowed, non-append read/write handle with best-effort failure rollback. */
|
|
7
7
|
export declare function overwriteFileHandle(handle: FileHandle, data: Uint8Array, options?: OverwriteFileHandleOptions): Promise<void>;
|
|
8
|
-
//# sourceMappingURL=overwrite-file-handle.d.ts.map
|
package/dist/owner-dacl.d.ts
CHANGED
package/dist/path-case.d.ts
CHANGED
|
@@ -4,4 +4,3 @@ export type ProbePathCaseOptions = {
|
|
|
4
4
|
};
|
|
5
5
|
/** Observe local ASCII case behavior; unknown observations never imply an operating-system default. */
|
|
6
6
|
export declare function probePathCaseInsensitiveSync(targetPath: string, options?: ProbePathCaseOptions): boolean | undefined;
|
|
7
|
-
//# sourceMappingURL=path-case.d.ts.map
|
package/dist/path-policy.d.ts
CHANGED
package/dist/path-prefix.d.ts
CHANGED
|
@@ -4,4 +4,3 @@ export type PathSegmentRoute = Readonly<{
|
|
|
4
4
|
}>;
|
|
5
5
|
export declare function createPathSegmentRoute(segments: readonly string[]): PathSegmentRoute;
|
|
6
6
|
export declare function joinPathSegmentRoute(base: string, route: PathSegmentRoute, offset: number, tail?: string): string;
|
|
7
|
-
//# sourceMappingURL=path-segment-route.d.ts.map
|
|
@@ -9,4 +9,3 @@ export type ProbePathSuffixAliasesOptions = {
|
|
|
9
9
|
};
|
|
10
10
|
/** Observe bounded missing suffix aliases; the caller owns caching and ambiguity policy. */
|
|
11
11
|
export declare function probePathSuffixAliasesSync(options: ProbePathSuffixAliasesOptions): boolean | undefined;
|
|
12
|
-
//# sourceMappingURL=path-suffix-aliases.d.ts.map
|
package/dist/path.d.ts
CHANGED
|
@@ -18,4 +18,3 @@ export declare function isPathInsideWithRealpath(basePath: string, candidatePath
|
|
|
18
18
|
export declare function safeStatSync(targetPath: string): fs.Stats | null;
|
|
19
19
|
export declare function splitSafeRelativePath(relativePath: string): string[];
|
|
20
20
|
export declare function resolveSafeRelativePath(rootDir: string, relativePath: string): string;
|
|
21
|
-
//# sourceMappingURL=path.d.ts.map
|