@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
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { type FileHandle } from "node:fs/promises";
|
|
2
|
-
import { type CreationPath } from "./creation-path.js";
|
|
3
|
-
export declare function createPrivateWindowsFileHandle(selected: CreationPath, options: {
|
|
4
|
-
mode: number;
|
|
5
|
-
assertBeforeMutation?: () => void;
|
|
6
|
-
}): Promise<FileHandle>;
|
|
7
|
-
//# sourceMappingURL=create-file-async.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-file-async.d.ts","sourceRoot":"","sources":["../src/create-file-async.ts"],"names":[],"mappings":"AAEA,OAAW,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAevD,OAAO,EAAmD,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKxG,wBAAsB,8BAA8B,CAClD,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,GAC3D,OAAO,CAAC,UAAU,CAAC,CA0FrB"}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
|
-
import fsSync, {} from "node:fs";
|
|
3
|
-
import fs, {} from "node:fs/promises";
|
|
4
|
-
import path from "node:path";
|
|
5
|
-
import { createDirectoryWithReceipt } from "./create-directory.js";
|
|
6
|
-
import { assertDirectoryIdentitySync } from "./directory-guard.js";
|
|
7
|
-
import { FsSafeError } from "./errors.js";
|
|
8
|
-
import { assertSynchronousCallbackResult } from "./mutation-authority.js";
|
|
9
|
-
import { assertCreationFile, creationPublicationAfterFailure, privateFileSettlementFailure, rethrowPrivateStageCreationFailure, removeRecordedCreationFile, } from "./creation-file-state.js";
|
|
10
|
-
import { inspectCreationDirectory, protectCreatedFile, verifyCreatedFile } from "./creation-permissions.js";
|
|
11
|
-
import { creationCollision, removeCreationDirectoryAsync } from "./creation-path.js";
|
|
12
|
-
import { handoffCreatedFile } from "./private-producer-handoff.js";
|
|
13
|
-
import { resolveReadOpenFlags } from "./read-open-flags.js";
|
|
14
|
-
import { hasUnsettledWindowsSecurityCommand } from "./windows-security-command.js";
|
|
15
|
-
export async function createPrivateWindowsFileHandle(selected, options) {
|
|
16
|
-
const assertion = options.assertBeforeMutation;
|
|
17
|
-
const existing = await fs.lstat(selected.target).catch((error) => {
|
|
18
|
-
if (error.code !== "ENOENT")
|
|
19
|
-
throw error;
|
|
20
|
-
return undefined;
|
|
21
|
-
});
|
|
22
|
-
selected.assertParent();
|
|
23
|
-
if (existing)
|
|
24
|
-
throw new FsSafeError("already-exists", "creation target already exists");
|
|
25
|
-
const parentIdentity = await inspectCreationDirectory(selected.parent.dir, false);
|
|
26
|
-
selected.assertParent();
|
|
27
|
-
const stageDirectory = path.join(selected.parent.dir, `.fs-safe-create-${randomUUID()}`);
|
|
28
|
-
let stage;
|
|
29
|
-
try {
|
|
30
|
-
stage = await createDirectoryWithReceipt(stageDirectory, { private: true, assertBeforeMutation: assertion }, {
|
|
31
|
-
expectedParentIdentity: selected.parent.stat,
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
catch (error) {
|
|
35
|
-
rethrowPrivateStageCreationFailure(error, selected.target, stageDirectory);
|
|
36
|
-
}
|
|
37
|
-
const stageIdentity = stage.windowsIdentity;
|
|
38
|
-
const stagePath = path.join(stageDirectory, "file");
|
|
39
|
-
const assertStage = () => {
|
|
40
|
-
selected.assertParent();
|
|
41
|
-
assertDirectoryIdentitySync(stageDirectory, stage.stat);
|
|
42
|
-
};
|
|
43
|
-
let file;
|
|
44
|
-
let identity;
|
|
45
|
-
let publication = "not-published";
|
|
46
|
-
try {
|
|
47
|
-
if (await inspectCreationDirectory(stageDirectory, true) !== stageIdentity) {
|
|
48
|
-
throw new FsSafeError("path-mismatch", "private staging directory changed before file creation");
|
|
49
|
-
}
|
|
50
|
-
assertSynchronousCallbackResult(assertion?.(), "assertBeforeMutation");
|
|
51
|
-
assertStage();
|
|
52
|
-
file = await fs.open(stagePath, fsSync.constants.O_RDWR | fsSync.constants.O_CREAT |
|
|
53
|
-
fsSync.constants.O_EXCL | resolveReadOpenFlags(), 0o600);
|
|
54
|
-
assertStage();
|
|
55
|
-
identity = assertCreationFile(file.fd, stagePath);
|
|
56
|
-
assertSynchronousCallbackResult(assertion?.(), "assertBeforeMutation");
|
|
57
|
-
assertStage();
|
|
58
|
-
assertCreationFile(file.fd, stagePath, identity);
|
|
59
|
-
const windowsIdentity = await protectCreatedFile(file.fd, stagePath, stageIdentity);
|
|
60
|
-
assertStage();
|
|
61
|
-
assertCreationFile(file.fd, stagePath, identity);
|
|
62
|
-
const source = file;
|
|
63
|
-
file = undefined;
|
|
64
|
-
// The handoff consumes the source pin on both success and failure.
|
|
65
|
-
file = await handoffCreatedFile({
|
|
66
|
-
source, sourcePath: stagePath, targetPath: selected.target, identity,
|
|
67
|
-
assertSourceParent: assertStage, assertTargetParent: selected.assertParent,
|
|
68
|
-
assertBeforeMutation: assertion,
|
|
69
|
-
verifyDescriptor: (fd, pathname, links) => verifyCreatedFile(fd, pathname, windowsIdentity, pathname === stagePath ? stageIdentity : parentIdentity, links),
|
|
70
|
-
onPublished: () => { publication = "published"; },
|
|
71
|
-
});
|
|
72
|
-
assertSynchronousCallbackResult(assertion?.(), "assertBeforeMutation");
|
|
73
|
-
selected.assertParent();
|
|
74
|
-
assertCreationFile(file.fd, selected.target, identity);
|
|
75
|
-
await verifyCreatedFile(file.fd, selected.target, windowsIdentity, parentIdentity);
|
|
76
|
-
selected.assertParent();
|
|
77
|
-
assertCreationFile(file.fd, selected.target, identity);
|
|
78
|
-
await file.chmod(options.mode);
|
|
79
|
-
await verifyCreatedFile(file.fd, selected.target, windowsIdentity, parentIdentity);
|
|
80
|
-
selected.assertParent();
|
|
81
|
-
assertCreationFile(file.fd, selected.target, identity);
|
|
82
|
-
await removeCreationDirectoryAsync(stageDirectory, stage.stat, selected.assertParent);
|
|
83
|
-
selected.assertParent();
|
|
84
|
-
assertCreationFile(file.fd, selected.target, identity);
|
|
85
|
-
return file;
|
|
86
|
-
}
|
|
87
|
-
catch (primary) {
|
|
88
|
-
publication = creationPublicationAfterFailure(primary, publication);
|
|
89
|
-
const preserved = publication === "indeterminate" || hasUnsettledWindowsSecurityCommand(primary);
|
|
90
|
-
const cleanup = [];
|
|
91
|
-
if (file) {
|
|
92
|
-
const owned = file;
|
|
93
|
-
file = undefined;
|
|
94
|
-
try {
|
|
95
|
-
await owned.close();
|
|
96
|
-
}
|
|
97
|
-
catch (error) {
|
|
98
|
-
cleanup.push(error);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
if (!preserved) {
|
|
102
|
-
if (identity) {
|
|
103
|
-
try {
|
|
104
|
-
await removeRecordedCreationFile(stagePath, identity, assertStage);
|
|
105
|
-
}
|
|
106
|
-
catch (error) {
|
|
107
|
-
cleanup.push(error);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
try {
|
|
111
|
-
await removeCreationDirectoryAsync(stageDirectory, stage.stat, selected.assertParent);
|
|
112
|
-
}
|
|
113
|
-
catch (error) {
|
|
114
|
-
cleanup.push(error);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
if (publication === "not-published" && cleanup.length === 0 && !preserved)
|
|
118
|
-
throw creationCollision(primary);
|
|
119
|
-
throw privateFileSettlementFailure({ primary, cleanup, publication, path: selected.target, stageDirectory, preserved });
|
|
120
|
-
}
|
|
121
|
-
}
|
package/dist/create-file.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { type FileHandle } from "node:fs/promises";
|
|
2
|
-
import { type CreateDirectoryOptions, type CreationAdmission } from "./create-directory.js";
|
|
3
|
-
import { type OwnedFileDescriptorSync } from "./create-owned-file.js";
|
|
4
|
-
export type CreateFileOptions = CreateDirectoryOptions;
|
|
5
|
-
export declare function createFileSync(targetPath: string, options?: CreateFileOptions): OwnedFileDescriptorSync;
|
|
6
|
-
/** Internal async writer; Windows preparation uses the nonblocking stage owner. */
|
|
7
|
-
export declare function createFileHandle(targetPath: string, options?: CreateFileOptions, admission?: CreationAdmission): Promise<FileHandle>;
|
|
8
|
-
//# sourceMappingURL=create-file.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-file.d.ts","sourceRoot":"","sources":["../src/create-file.ts"],"names":[],"mappings":"AAEA,OAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE5D,OAAO,EAAkC,KAAK,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC5H,OAAO,EAAyB,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AA2B7F,MAAM,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;AA8GvD,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,uBAAuB,CAE3G;AAED,mFAAmF;AACnF,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,iBAAsB,EAC/B,SAAS,GAAE,iBAAsB,GAChC,OAAO,CAAC,UAAU,CAAC,CA+BrB"}
|
package/dist/create-file.js
DELETED
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
|
-
import fs, {} from "node:fs";
|
|
3
|
-
import fsAsync, {} from "node:fs/promises";
|
|
4
|
-
import path from "node:path";
|
|
5
|
-
import { createDirectoryWithReceiptSync } from "./create-directory.js";
|
|
6
|
-
import { ownFileDescriptorSync } from "./create-owned-file.js";
|
|
7
|
-
import { assertDirectoryIdentitySync } from "./directory-guard.js";
|
|
8
|
-
import { FsSafeError } from "./errors.js";
|
|
9
|
-
import { assertSynchronousCallbackResult } from "./mutation-authority.js";
|
|
10
|
-
import { assertPrivateFileCreationAvailable, inspectCreationDirectorySync, protectCreatedFileSync, resolveCreationPermissions, verifyCreatedFileSync, } from "./creation-permissions.js";
|
|
11
|
-
import { creationCollision, prepareCreationPath, removeCreationDirectory } from "./creation-path.js";
|
|
12
|
-
import { handoffCreatedFileSync } from "./private-producer-handoff-sync.js";
|
|
13
|
-
import { resolveReadOpenFlags } from "./read-open-flags.js";
|
|
14
|
-
import { assertCreationFile, assertPrivateCreationFile, creationPublicationAfterFailure, privateFileSettlementFailure, rethrowPrivateStageCreationFailure, removeRecordedCreationFileSync, } from "./creation-file-state.js";
|
|
15
|
-
import { createPrivateWindowsFileHandle } from "./create-file-async.js";
|
|
16
|
-
import { assertDarwinCreationDirectoryAcl } from "./creation-darwin.js";
|
|
17
|
-
function createPrivateWindowsFile(selected, options, mode) {
|
|
18
|
-
const assertion = options.assertBeforeMutation;
|
|
19
|
-
if (fs.lstatSync(selected.target, { throwIfNoEntry: false })) {
|
|
20
|
-
throw new FsSafeError("already-exists", "creation target already exists");
|
|
21
|
-
}
|
|
22
|
-
const parentIdentity = inspectCreationDirectorySync(selected.parent.dir, false);
|
|
23
|
-
selected.assertParent();
|
|
24
|
-
const stageDirectory = path.join(selected.parent.dir, `.fs-safe-create-${randomUUID()}`);
|
|
25
|
-
let stage;
|
|
26
|
-
try {
|
|
27
|
-
stage = createDirectoryWithReceiptSync(stageDirectory, { private: true, assertBeforeMutation: assertion }, {
|
|
28
|
-
expectedParentIdentity: selected.parent.stat,
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
catch (error) {
|
|
32
|
-
rethrowPrivateStageCreationFailure(error, selected.target, stageDirectory);
|
|
33
|
-
}
|
|
34
|
-
const stageIdentity = stage.windowsIdentity;
|
|
35
|
-
const stagePath = path.join(stageDirectory, "file");
|
|
36
|
-
const assertStage = () => {
|
|
37
|
-
selected.assertParent();
|
|
38
|
-
assertDirectoryIdentitySync(stageDirectory, stage.stat);
|
|
39
|
-
};
|
|
40
|
-
let file;
|
|
41
|
-
let identity;
|
|
42
|
-
let windowsIdentity;
|
|
43
|
-
let publication = "not-published";
|
|
44
|
-
try {
|
|
45
|
-
if (inspectCreationDirectorySync(stageDirectory, true) !== stageIdentity) {
|
|
46
|
-
throw new FsSafeError("path-mismatch", "private staging directory changed before file creation");
|
|
47
|
-
}
|
|
48
|
-
assertSynchronousCallbackResult(assertion?.(), "assertBeforeMutation");
|
|
49
|
-
assertStage();
|
|
50
|
-
file = ownFileDescriptorSync(fs.openSync(stagePath, fs.constants.O_RDWR | fs.constants.O_CREAT |
|
|
51
|
-
fs.constants.O_EXCL | resolveReadOpenFlags(), 0o600));
|
|
52
|
-
identity = assertCreationFile(file.fd, stagePath);
|
|
53
|
-
// The inherited ACL must already be restrictive. This freezes that policy;
|
|
54
|
-
// the bridge refuses to repair broad access on an exposed file.
|
|
55
|
-
assertSynchronousCallbackResult(assertion?.(), "assertBeforeMutation");
|
|
56
|
-
assertStage();
|
|
57
|
-
assertCreationFile(file.fd, stagePath, identity);
|
|
58
|
-
windowsIdentity = protectCreatedFileSync(file.fd, stagePath, stageIdentity);
|
|
59
|
-
assertStage();
|
|
60
|
-
file = handoffCreatedFileSync({
|
|
61
|
-
source: file, sourcePath: stagePath, targetPath: selected.target, identity,
|
|
62
|
-
assertSourceParent: assertStage, assertTargetParent: selected.assertParent,
|
|
63
|
-
assertBeforeMutation: assertion,
|
|
64
|
-
verifyDescriptor: (fd, pathname, links) => verifyCreatedFileSync(fd, pathname, windowsIdentity, pathname === stagePath ? stageIdentity : parentIdentity, links),
|
|
65
|
-
onPublished: () => { publication = "published"; },
|
|
66
|
-
});
|
|
67
|
-
// Windows may clear the read-only attribute while retiring the stage name.
|
|
68
|
-
// Finalize it only after the published-name descriptor owns the file.
|
|
69
|
-
fs.fchmodSync(file.fd, mode);
|
|
70
|
-
selected.assertParent();
|
|
71
|
-
identity = assertCreationFile(file.fd, selected.target, identity);
|
|
72
|
-
verifyCreatedFileSync(file.fd, selected.target, windowsIdentity, parentIdentity);
|
|
73
|
-
removeCreationDirectory(stageDirectory, stage.stat, selected.assertParent);
|
|
74
|
-
return file;
|
|
75
|
-
}
|
|
76
|
-
catch (primary) {
|
|
77
|
-
publication = creationPublicationAfterFailure(primary, publication);
|
|
78
|
-
const cleanup = [];
|
|
79
|
-
if (file) {
|
|
80
|
-
try {
|
|
81
|
-
file.close();
|
|
82
|
-
}
|
|
83
|
-
catch (error) {
|
|
84
|
-
cleanup.push(error);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
if (publication !== "indeterminate") {
|
|
88
|
-
if (identity) {
|
|
89
|
-
try {
|
|
90
|
-
removeRecordedCreationFileSync(stagePath, identity, assertStage);
|
|
91
|
-
}
|
|
92
|
-
catch (error) {
|
|
93
|
-
cleanup.push(error);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
try {
|
|
97
|
-
removeCreationDirectory(stageDirectory, stage.stat, selected.assertParent);
|
|
98
|
-
}
|
|
99
|
-
catch (error) {
|
|
100
|
-
cleanup.push(error);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
if (publication === "not-published" && cleanup.length === 0)
|
|
104
|
-
throw creationCollision(primary);
|
|
105
|
-
throw privateFileSettlementFailure({ primary, cleanup, publication, path: selected.target, stageDirectory });
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
function createFileCore(targetPath, options, admission) {
|
|
109
|
-
const permissions = resolveCreationPermissions(options, false);
|
|
110
|
-
const assertion = options.assertBeforeMutation;
|
|
111
|
-
const selected = prepareCreationPath(targetPath, admission.expectedParentIdentity);
|
|
112
|
-
if (permissions.private && process.platform === "win32") {
|
|
113
|
-
assertPrivateFileCreationAvailable();
|
|
114
|
-
return createPrivateWindowsFile(selected, { ...permissions, assertBeforeMutation: assertion }, permissions.mode);
|
|
115
|
-
}
|
|
116
|
-
if (permissions.private)
|
|
117
|
-
assertDarwinCreationDirectoryAcl(selected.parent.dir, selected.parent.stat, "file");
|
|
118
|
-
assertSynchronousCallbackResult(assertion?.(), "assertBeforeMutation");
|
|
119
|
-
selected.assertParent();
|
|
120
|
-
if (permissions.private)
|
|
121
|
-
assertDarwinCreationDirectoryAcl(selected.parent.dir, selected.parent.stat, "file");
|
|
122
|
-
let file;
|
|
123
|
-
try {
|
|
124
|
-
file = ownFileDescriptorSync(fs.openSync(selected.target, fs.constants.O_RDWR | fs.constants.O_CREAT |
|
|
125
|
-
fs.constants.O_EXCL | resolveReadOpenFlags(), permissions.mode ?? 0o666));
|
|
126
|
-
}
|
|
127
|
-
catch (error) {
|
|
128
|
-
throw creationCollision(error);
|
|
129
|
-
}
|
|
130
|
-
try {
|
|
131
|
-
const identity = assertCreationFile(file.fd, selected.target);
|
|
132
|
-
selected.assertParent();
|
|
133
|
-
if (permissions.private)
|
|
134
|
-
assertPrivateCreationFile(identity, file.fd);
|
|
135
|
-
return file;
|
|
136
|
-
}
|
|
137
|
-
catch (primary) {
|
|
138
|
-
let failure = primary;
|
|
139
|
-
try {
|
|
140
|
-
file.close();
|
|
141
|
-
}
|
|
142
|
-
catch (closeError) {
|
|
143
|
-
failure = new AggregateError([primary, closeError], "created file admission and close failed");
|
|
144
|
-
}
|
|
145
|
-
throw new FsSafeError("helper-failed", "created file admission failed", {
|
|
146
|
-
cause: failure, details: { publication: { status: "published" }, path: selected.target, cleanup: "preserved" },
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
export function createFileSync(targetPath, options = {}) {
|
|
151
|
-
return createFileCore(targetPath, options, {});
|
|
152
|
-
}
|
|
153
|
-
/** Internal async writer; Windows preparation uses the nonblocking stage owner. */
|
|
154
|
-
export async function createFileHandle(targetPath, options = {}, admission = {}) {
|
|
155
|
-
const permissions = resolveCreationPermissions(options, false);
|
|
156
|
-
const assertion = options.assertBeforeMutation;
|
|
157
|
-
if (process.platform !== "win32" || !permissions.private) {
|
|
158
|
-
const selected = prepareCreationPath(targetPath, admission.expectedParentIdentity);
|
|
159
|
-
if (permissions.private)
|
|
160
|
-
assertDarwinCreationDirectoryAcl(selected.parent.dir, selected.parent.stat, "file");
|
|
161
|
-
assertSynchronousCallbackResult(assertion?.(), "assertBeforeMutation");
|
|
162
|
-
selected.assertParent();
|
|
163
|
-
if (permissions.private)
|
|
164
|
-
assertDarwinCreationDirectoryAcl(selected.parent.dir, selected.parent.stat, "file");
|
|
165
|
-
const handle = await fsAsync.open(selected.target, fs.constants.O_RDWR | fs.constants.O_CREAT |
|
|
166
|
-
fs.constants.O_EXCL | resolveReadOpenFlags(), permissions.mode ?? 0o666)
|
|
167
|
-
.catch(error => { throw creationCollision(error); });
|
|
168
|
-
try {
|
|
169
|
-
const identity = assertCreationFile(handle.fd, selected.target);
|
|
170
|
-
selected.assertParent();
|
|
171
|
-
if (permissions.private)
|
|
172
|
-
assertPrivateCreationFile(identity, handle.fd);
|
|
173
|
-
return handle;
|
|
174
|
-
}
|
|
175
|
-
catch (primary) {
|
|
176
|
-
let failure = primary;
|
|
177
|
-
try {
|
|
178
|
-
await handle.close();
|
|
179
|
-
}
|
|
180
|
-
catch (closeError) {
|
|
181
|
-
failure = new AggregateError([primary, closeError], "created file admission and close failed");
|
|
182
|
-
}
|
|
183
|
-
throw new FsSafeError("helper-failed", "created file handle admission failed", {
|
|
184
|
-
cause: failure, details: { publication: { status: "published" }, path: selected.target, cleanup: "preserved" },
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
assertPrivateFileCreationAvailable();
|
|
189
|
-
return await createPrivateWindowsFileHandle(prepareCreationPath(targetPath, admission.expectedParentIdentity), { mode: permissions.mode, assertBeforeMutation: assertion });
|
|
190
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-owned-file.d.ts","sourceRoot":"","sources":["../src/create-owned-file.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,KAAK,IAAI,IAAI,CAAC;IACd,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;CAC1B,CAAC;AAEF,6EAA6E;AAC7E,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAmB,GAC3C,uBAAuB,CAYzB"}
|
package/dist/create.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAAE,mBAAmB,EACpC,4BAA4B,EAAE,gCAAgC,EAC9D,KAAK,sBAAsB,EAAE,KAAK,iBAAiB,GACpD,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC5F,YAAY,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { type BigIntStats } from "node:fs";
|
|
2
|
-
export declare function assertDarwinPrivateCreationAvailable(): void;
|
|
3
|
-
export declare function assertDarwinPrivateDirectoryMode(mode: number): void;
|
|
4
|
-
export declare function assertDarwinCreationAcl(fd: number, inheritanceTarget?: "file" | "directory"): void;
|
|
5
|
-
export declare function assertDarwinCreationDirectoryAcl(pathname: string, expected: BigIntStats, inheritanceTarget?: "file" | "directory"): void;
|
|
6
|
-
//# sourceMappingURL=creation-darwin.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"creation-darwin.d.ts","sourceRoot":"","sources":["../src/creation-darwin.ts"],"names":[],"mappings":"AAAA,OAAW,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAe/C,wBAAgB,oCAAoC,IAAI,IAAI,CAE3D;AAED,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAInE;AAED,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAYlG;AAED,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,WAAW,GAChF,IAAI,CAqBN"}
|
package/dist/creation-darwin.js
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import fs, {} from "node:fs";
|
|
2
|
-
import { inspectDirectoryIdentitySync } from "./directory-guard.js";
|
|
3
|
-
import { nodeDarwinDirectoryMetadataFlags, nodeDirectorySearchOnlyFlags } from "./directory-mode-node.js";
|
|
4
|
-
import { FsSafeError } from "./errors.js";
|
|
5
|
-
import { getNativeBinding } from "./native.js";
|
|
6
|
-
import { inspectFileIdentitySync } from "./strict-file-identity.js";
|
|
7
|
-
function inspector() {
|
|
8
|
-
const native = getNativeBinding();
|
|
9
|
-
if (typeof native?.inspectDarwinAcl !== "function") {
|
|
10
|
-
throw new FsSafeError("helper-unavailable", "private Darwin creation requires native descriptor ACL inspection");
|
|
11
|
-
}
|
|
12
|
-
return native.inspectDarwinAcl.bind(native);
|
|
13
|
-
}
|
|
14
|
-
export function assertDarwinPrivateCreationAvailable() {
|
|
15
|
-
if (process.platform === "darwin")
|
|
16
|
-
inspector();
|
|
17
|
-
}
|
|
18
|
-
export function assertDarwinPrivateDirectoryMode(mode) {
|
|
19
|
-
if (process.platform === "darwin" && ((mode & ~process.umask()) & 0o500) === 0) {
|
|
20
|
-
throw new FsSafeError("helper-unavailable", "private Darwin directory ACL inspection requires owner read or search permission");
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
export function assertDarwinCreationAcl(fd, inheritanceTarget) {
|
|
24
|
-
if (process.platform !== "darwin")
|
|
25
|
-
return;
|
|
26
|
-
const inspect = inspector();
|
|
27
|
-
const state = inspect(fd, inheritanceTarget)?.state;
|
|
28
|
-
if (state === "present") {
|
|
29
|
-
throw new FsSafeError("insecure-permissions", inheritanceTarget
|
|
30
|
-
? "private creation parent has inheritable Darwin ACL entries"
|
|
31
|
-
: "private creation object has Darwin ACL entries");
|
|
32
|
-
}
|
|
33
|
-
if (state !== "absent" && state !== "empty") {
|
|
34
|
-
throw new FsSafeError("helper-unavailable", "native Darwin ACL inspection returned incomplete facts");
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
export function assertDarwinCreationDirectoryAcl(pathname, expected, inheritanceTarget) {
|
|
38
|
-
if (process.platform !== "darwin")
|
|
39
|
-
return;
|
|
40
|
-
assertDarwinPrivateCreationAvailable();
|
|
41
|
-
let fd;
|
|
42
|
-
try {
|
|
43
|
-
fd = fs.openSync(pathname, nodeDarwinDirectoryMetadataFlags());
|
|
44
|
-
}
|
|
45
|
-
catch (error) {
|
|
46
|
-
if (error.code !== "EACCES")
|
|
47
|
-
throw error;
|
|
48
|
-
const search = nodeDirectorySearchOnlyFlags();
|
|
49
|
-
if (!search)
|
|
50
|
-
throw error;
|
|
51
|
-
try {
|
|
52
|
-
fd = fs.openSync(pathname, search.flags | fs.constants.O_DIRECTORY | fs.constants.O_NOFOLLOW | fs.constants.O_NONBLOCK);
|
|
53
|
-
}
|
|
54
|
-
catch (cause) {
|
|
55
|
-
if (cause.code !== "EACCES")
|
|
56
|
-
throw cause;
|
|
57
|
-
throw new FsSafeError("helper-unavailable", "private Darwin directory ACL inspection requires owner read or search permission", { cause });
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
try {
|
|
61
|
-
const opened = inspectFileIdentitySync(() => fs.fstatSync(fd, { bigint: true }), expected);
|
|
62
|
-
if (!opened.isDirectory())
|
|
63
|
-
throw new FsSafeError("path-mismatch", "ACL target is not the admitted directory");
|
|
64
|
-
assertDarwinCreationAcl(fd, inheritanceTarget);
|
|
65
|
-
inspectDirectoryIdentitySync(pathname, expected);
|
|
66
|
-
}
|
|
67
|
-
finally {
|
|
68
|
-
fs.closeSync(fd);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { type BigIntStats } from "node:fs";
|
|
2
|
-
import { FsSafeError } from "./errors.js";
|
|
3
|
-
export type CreationPublicationStatus = "not-published" | "published" | "indeterminate";
|
|
4
|
-
export declare function assertCreationFile(fd: number, pathname: string, expected?: BigIntStats): BigIntStats;
|
|
5
|
-
export declare function assertPrivateCreationFile(stat: BigIntStats, fd: number): void;
|
|
6
|
-
export declare function removeRecordedCreationFileSync(pathname: string, identity: BigIntStats, assertParent: () => void): void;
|
|
7
|
-
export declare function removeRecordedCreationFile(pathname: string, identity: BigIntStats, assertParent: () => void): Promise<void>;
|
|
8
|
-
export declare function creationPublicationAfterFailure(error: unknown, recorded: CreationPublicationStatus): CreationPublicationStatus;
|
|
9
|
-
export declare function hasPreservedCreationArtifacts(error: unknown): boolean;
|
|
10
|
-
export declare function rethrowPrivateStageCreationFailure(error: unknown, path: string, stageDirectory: string): never;
|
|
11
|
-
export declare function privateFileSettlementFailure(params: {
|
|
12
|
-
primary: unknown;
|
|
13
|
-
cleanup: readonly unknown[];
|
|
14
|
-
publication: CreationPublicationStatus;
|
|
15
|
-
path: string;
|
|
16
|
-
stageDirectory: string;
|
|
17
|
-
preserved?: boolean;
|
|
18
|
-
}): FsSafeError;
|
|
19
|
-
//# sourceMappingURL=creation-file-state.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"creation-file-state.d.ts","sourceRoot":"","sources":["../src/creation-file-state.ts"],"names":[],"mappings":"AAAA,OAAW,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM1C,MAAM,MAAM,yBAAyB,GAAG,eAAe,GAAG,WAAW,GAAG,eAAe,CAAC;AAExF,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,WAAW,CAOpG;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAS7E;AAQD,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,IAAI,GAAG,IAAI,CAUtH;AAED,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,IAAI,GAChE,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,yBAAyB,GAClD,yBAAyB,CAO3B;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAMrE;AAED,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,KAAK,CAuB9G;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;IAC5B,WAAW,EAAE,yBAAyB,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,WAAW,CAUd"}
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import fs, {} from "node:fs";
|
|
2
|
-
import fsAsync from "node:fs/promises";
|
|
3
|
-
import { FsSafeError } from "./errors.js";
|
|
4
|
-
import { sameFileIdentityForCleanup } from "./file-identity.js";
|
|
5
|
-
import { inspectFileIdentitySync } from "./strict-file-identity.js";
|
|
6
|
-
import { hasUnsettledWindowsSecurityCommand } from "./windows-security-command.js";
|
|
7
|
-
import { assertDarwinCreationAcl } from "./creation-darwin.js";
|
|
8
|
-
export function assertCreationFile(fd, pathname, expected) {
|
|
9
|
-
const opened = inspectFileIdentitySync(() => fs.fstatSync(fd, { bigint: true }), expected);
|
|
10
|
-
const named = inspectFileIdentitySync(() => fs.lstatSync(pathname, { bigint: true }), opened);
|
|
11
|
-
if (!opened.isFile() || !named.isFile() || named.isSymbolicLink() || opened.nlink !== 1n || named.nlink !== 1n) {
|
|
12
|
-
throw new FsSafeError("path-mismatch", "created file is not the expected single-linked regular file");
|
|
13
|
-
}
|
|
14
|
-
return opened;
|
|
15
|
-
}
|
|
16
|
-
export function assertPrivateCreationFile(stat, fd) {
|
|
17
|
-
if (process.platform === "win32")
|
|
18
|
-
return;
|
|
19
|
-
if (typeof process.getuid !== "function" || stat.uid !== BigInt(process.getuid())) {
|
|
20
|
-
throw new FsSafeError("not-owned", "created private file must belong to the current user");
|
|
21
|
-
}
|
|
22
|
-
if ((stat.mode & 3647n) !== 0n) {
|
|
23
|
-
throw new FsSafeError("insecure-permissions", "created private file is not owner-only");
|
|
24
|
-
}
|
|
25
|
-
assertDarwinCreationAcl(fd);
|
|
26
|
-
}
|
|
27
|
-
function assertRecordedFile(current, identity) {
|
|
28
|
-
if (!current.isFile() || current.isSymbolicLink() || !sameFileIdentityForCleanup(current, identity)) {
|
|
29
|
-
throw new FsSafeError("path-mismatch", "created file cleanup preserved a replacement");
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
export function removeRecordedCreationFileSync(pathname, identity, assertParent) {
|
|
33
|
-
assertParent();
|
|
34
|
-
let current;
|
|
35
|
-
try {
|
|
36
|
-
current = fs.lstatSync(pathname, { bigint: true });
|
|
37
|
-
}
|
|
38
|
-
catch (error) {
|
|
39
|
-
if (error?.code === "ENOENT")
|
|
40
|
-
return;
|
|
41
|
-
throw error;
|
|
42
|
-
}
|
|
43
|
-
assertRecordedFile(current, identity);
|
|
44
|
-
fs.unlinkSync(pathname);
|
|
45
|
-
}
|
|
46
|
-
export async function removeRecordedCreationFile(pathname, identity, assertParent) {
|
|
47
|
-
assertParent();
|
|
48
|
-
let current;
|
|
49
|
-
try {
|
|
50
|
-
current = await fsAsync.lstat(pathname, { bigint: true });
|
|
51
|
-
}
|
|
52
|
-
catch (error) {
|
|
53
|
-
if (error?.code === "ENOENT")
|
|
54
|
-
return;
|
|
55
|
-
throw error;
|
|
56
|
-
}
|
|
57
|
-
assertParent();
|
|
58
|
-
assertRecordedFile(current, identity);
|
|
59
|
-
// Recheck after the awaited observation before dispatching the unlink.
|
|
60
|
-
assertRecordedFile(fs.lstatSync(pathname, { bigint: true }), identity);
|
|
61
|
-
await fsAsync.unlink(pathname);
|
|
62
|
-
}
|
|
63
|
-
export function creationPublicationAfterFailure(error, recorded) {
|
|
64
|
-
if (error instanceof FsSafeError) {
|
|
65
|
-
const publication = error.details?.publication;
|
|
66
|
-
if (publication && typeof publication === "object" && "status" in publication &&
|
|
67
|
-
publication.status === "indeterminate")
|
|
68
|
-
return "indeterminate";
|
|
69
|
-
}
|
|
70
|
-
return recorded;
|
|
71
|
-
}
|
|
72
|
-
export function hasPreservedCreationArtifacts(error) {
|
|
73
|
-
if (!(error instanceof FsSafeError))
|
|
74
|
-
return false;
|
|
75
|
-
if (error.details?.cleanup === "preserved" || error.details?.cleanup === "failed")
|
|
76
|
-
return true;
|
|
77
|
-
const publication = error.details?.publication;
|
|
78
|
-
return publication !== null && typeof publication === "object" && "status" in publication &&
|
|
79
|
-
(publication.status === "published" || publication.status === "indeterminate");
|
|
80
|
-
}
|
|
81
|
-
export function rethrowPrivateStageCreationFailure(error, path, stageDirectory) {
|
|
82
|
-
if (error instanceof FsSafeError && error.code === "already-exists") {
|
|
83
|
-
throw new FsSafeError("helper-failed", "private file staging path already exists", {
|
|
84
|
-
cause: error, details: { publication: { status: "not-published" }, path, stageDirectory },
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
const publication = error instanceof FsSafeError ? error.details?.publication : undefined;
|
|
88
|
-
const created = error instanceof FsSafeError && error.details?.path === stageDirectory &&
|
|
89
|
-
publication !== null && typeof publication === "object" && "status" in publication &&
|
|
90
|
-
publication.status === "published";
|
|
91
|
-
let unconfirmed = hasUnsettledWindowsSecurityCommand(error);
|
|
92
|
-
if (error !== null && (typeof error === "object" || typeof error === "function")) {
|
|
93
|
-
try {
|
|
94
|
-
const outcome = Object.getOwnPropertyDescriptor(error, "creationOutcome");
|
|
95
|
-
unconfirmed ||= Boolean(outcome && "value" in outcome && outcome.value === "unconfirmed");
|
|
96
|
-
}
|
|
97
|
-
catch {
|
|
98
|
-
unconfirmed = true;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
if (created || unconfirmed) {
|
|
102
|
-
throw privateFileSettlementFailure({
|
|
103
|
-
primary: error, cleanup: [], publication: "not-published", path, stageDirectory, preserved: true,
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
throw error;
|
|
107
|
-
}
|
|
108
|
-
export function privateFileSettlementFailure(params) {
|
|
109
|
-
return new FsSafeError("helper-failed", "file creation or staging settlement failed", {
|
|
110
|
-
cause: params.cleanup.length
|
|
111
|
-
? new AggregateError([params.primary, ...params.cleanup], "file creation and cleanup failed")
|
|
112
|
-
: params.primary,
|
|
113
|
-
details: {
|
|
114
|
-
publication: { status: params.publication }, path: params.path, stageDirectory: params.stageDirectory,
|
|
115
|
-
cleanup: params.preserved || params.publication === "indeterminate" ? "preserved" : params.cleanup.length ? "failed" : "removed",
|
|
116
|
-
},
|
|
117
|
-
});
|
|
118
|
-
}
|
package/dist/creation-path.d.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { type BigIntStats } from "node:fs";
|
|
2
|
-
import { type AsyncDirectoryGuard, type AnyAsyncDirectoryGuard } from "./directory-guard.js";
|
|
3
|
-
export type CreationParentIdentity = Readonly<{
|
|
4
|
-
dev: bigint;
|
|
5
|
-
ino: bigint;
|
|
6
|
-
realPath?: string;
|
|
7
|
-
}>;
|
|
8
|
-
export type CreationPath = {
|
|
9
|
-
target: string;
|
|
10
|
-
parent: AsyncDirectoryGuard<BigIntStats>;
|
|
11
|
-
assertParent(): void;
|
|
12
|
-
};
|
|
13
|
-
export declare function creationAdmissionFromParent(parent: AnyAsyncDirectoryGuard): {
|
|
14
|
-
expectedParentIdentity: CreationParentIdentity;
|
|
15
|
-
};
|
|
16
|
-
export declare function prepareCreationPath(input: string, expectedParent?: CreationParentIdentity): CreationPath;
|
|
17
|
-
export declare function creationCollision(error: unknown): unknown;
|
|
18
|
-
/** Remove only the recorded empty stage; never traverse a replaced directory. */
|
|
19
|
-
export declare function removeCreationDirectory(directory: string, identity: BigIntStats, assertParent: () => void): void;
|
|
20
|
-
export declare function removeCreationDirectoryAsync(directory: string, identity: BigIntStats, assertParent: () => void): Promise<void>;
|
|
21
|
-
//# sourceMappingURL=creation-path.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"creation-path.d.ts","sourceRoot":"","sources":["../src/creation-path.ts"],"names":[],"mappings":"AAAA,OAAW,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAG/C,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC5B,MAAM,sBAAsB,CAAC;AAM9B,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACzC,YAAY,IAAI,IAAI,CAAC;CACtB,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,sBAAsB,GAAG;IAAE,sBAAsB,EAAE,sBAAsB,CAAA;CAAE,CAO9H;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,sBAAsB,GAAG,YAAY,CAuBxG;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAKzD;AAED,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,IAAI,GAAG,IAAI,CAQhH;AAED,wBAAsB,4BAA4B,CAChD,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,IAAI,GACjE,OAAO,CAAC,IAAI,CAAC,CAQf"}
|