@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/permission-exec.js
CHANGED
|
@@ -8,7 +8,6 @@ export function formatPermissionErrorDetail(value) {
|
|
|
8
8
|
const formatted = formatErrorDetail(value);
|
|
9
9
|
return formatted.length > 400 ? `${formatted.slice(0, 399)}…` : formatted;
|
|
10
10
|
}
|
|
11
|
-
const MISSING_DATA_PROPERTY = Object.freeze({ found: false });
|
|
12
11
|
const MAX_CAUGHT_FAILURE_PROTOTYPES = 4;
|
|
13
12
|
const primitiveString = String;
|
|
14
13
|
const isUint8Array = utilTypes.isUint8Array;
|
|
@@ -36,32 +35,28 @@ function isInspectableCaughtObject(value) {
|
|
|
36
35
|
}
|
|
37
36
|
}
|
|
38
37
|
function dataProperty(value, name) {
|
|
39
|
-
if (!isInspectableCaughtObject(value))
|
|
40
|
-
return MISSING_DATA_PROPERTY;
|
|
41
38
|
let current = value;
|
|
42
39
|
for (let depth = 0; current !== null && depth < MAX_CAUGHT_FAILURE_PROTOTYPES; depth += 1) {
|
|
43
40
|
if (!isInspectableCaughtObject(current))
|
|
44
|
-
return
|
|
41
|
+
return undefined;
|
|
45
42
|
let descriptor;
|
|
46
43
|
try {
|
|
47
44
|
descriptor = Object.getOwnPropertyDescriptor(current, name);
|
|
48
45
|
}
|
|
49
46
|
catch {
|
|
50
|
-
return
|
|
47
|
+
return undefined;
|
|
51
48
|
}
|
|
52
49
|
if (descriptor) {
|
|
53
|
-
return Object.hasOwn(descriptor, "value")
|
|
54
|
-
? { found: true, value: descriptor.value }
|
|
55
|
-
: MISSING_DATA_PROPERTY;
|
|
50
|
+
return Object.hasOwn(descriptor, "value") ? descriptor : undefined;
|
|
56
51
|
}
|
|
57
52
|
try {
|
|
58
53
|
current = Object.getPrototypeOf(current);
|
|
59
54
|
}
|
|
60
55
|
catch {
|
|
61
|
-
return
|
|
56
|
+
return undefined;
|
|
62
57
|
}
|
|
63
58
|
}
|
|
64
|
-
return
|
|
59
|
+
return undefined;
|
|
65
60
|
}
|
|
66
61
|
function caughtPrimitiveDisplay(value) {
|
|
67
62
|
if (value !== null && (typeof value === "object" || typeof value === "function"))
|
|
@@ -78,9 +73,9 @@ export function formatCaughtPermissionFailure(error) {
|
|
|
78
73
|
}
|
|
79
74
|
const message = dataProperty(error, "message");
|
|
80
75
|
const name = dataProperty(error, "name");
|
|
81
|
-
const rawMessage =
|
|
76
|
+
const rawMessage = typeof message?.value === "string"
|
|
82
77
|
? message.value : "";
|
|
83
|
-
const rawName =
|
|
78
|
+
const rawName = typeof name?.value === "string"
|
|
84
79
|
? name.value : "";
|
|
85
80
|
const messageText = rawMessage.slice(0, 400);
|
|
86
81
|
const nameText = rawName.slice(0, 400);
|
|
@@ -123,12 +118,11 @@ function commandFailureFields(error) {
|
|
|
123
118
|
const signal = dataProperty(error, "signal");
|
|
124
119
|
const stderr = dataProperty(error, "stderr");
|
|
125
120
|
return {
|
|
126
|
-
found: killed
|
|
127
|
-
timedOut: killed
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
stderr: stderr.found ? safeStderr(stderr.value) : "",
|
|
121
|
+
found: !!(killed || code || signal || stderr),
|
|
122
|
+
timedOut: killed?.value === true && signal?.value === "SIGKILL",
|
|
123
|
+
exitCode: typeof code?.value === "number" ? code.value : null,
|
|
124
|
+
signal: typeof signal?.value === "string" ? signal.value : null,
|
|
125
|
+
stderr: stderr ? safeStderr(stderr.value) : "",
|
|
132
126
|
};
|
|
133
127
|
}
|
|
134
128
|
export class PermissionCommandError extends Error {
|
|
@@ -155,20 +149,20 @@ export class PermissionCommandError extends Error {
|
|
|
155
149
|
export function getPermissionCommandFailure(error, command, durationMs) {
|
|
156
150
|
if (isInspectableCaughtObject(error) && utilTypes.isNativeError(error)) {
|
|
157
151
|
const name = dataProperty(error, "name");
|
|
158
|
-
if (name
|
|
152
|
+
if (name?.value === "PermissionCommandError") {
|
|
159
153
|
const wrappedCommand = dataProperty(error, "command");
|
|
160
154
|
const wrappedDuration = dataProperty(error, "durationMs");
|
|
161
155
|
const wrappedTimedOut = dataProperty(error, "timedOut");
|
|
162
156
|
const wrappedExitCode = dataProperty(error, "exitCode");
|
|
163
157
|
const wrappedSignal = dataProperty(error, "signal");
|
|
164
158
|
const wrappedStderr = dataProperty(error, "stderr");
|
|
165
|
-
if (
|
|
166
|
-
|
|
159
|
+
if (typeof wrappedCommand?.value === "string" &&
|
|
160
|
+
typeof wrappedDuration?.value === "number" &&
|
|
167
161
|
Number.isSafeInteger(wrappedDuration.value) && wrappedDuration.value >= 0 &&
|
|
168
|
-
|
|
169
|
-
wrappedExitCode
|
|
170
|
-
wrappedSignal
|
|
171
|
-
wrappedStderr
|
|
162
|
+
typeof wrappedTimedOut?.value === "boolean" &&
|
|
163
|
+
wrappedExitCode && (wrappedExitCode.value === null || typeof wrappedExitCode.value === "number") &&
|
|
164
|
+
wrappedSignal && (wrappedSignal.value === null || typeof wrappedSignal.value === "string") &&
|
|
165
|
+
wrappedStderr) {
|
|
172
166
|
return {
|
|
173
167
|
command: wrappedCommand.value,
|
|
174
168
|
durationMs: wrappedDuration.value,
|
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
export { formatOctal, formatPermissionDetail, formatPermissionRemediation, inspectPathPermissions, isGroupReadable, isGroupWritable, isWorldReadable, isWorldWritable, modeBits, safeStat, type PermissionCheck, type PermissionCheckOptions, type PermissionCommandFailure, type SafeStatResult, } from "./permissions.js";
|
|
2
2
|
export { createPrivateDirectory, type CreatePrivateDirectoryOptions, } from "./private-directory.js";
|
|
3
3
|
export { readOwnerAndDacl, type OwnerAndDaclResult, type WindowsAccessControlEntry, type WindowsAceFlags, } from "./owner-dacl.js";
|
|
4
|
-
//# sourceMappingURL=permissions-public.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type PermissionCommandFailure } from "./permission-exec.js";
|
|
2
|
-
import { type PermissionCheck, type PermissionCheckOptions
|
|
2
|
+
import { type PermissionCheck, type PermissionCheckOptions } from "./permissions.js";
|
|
3
3
|
export type PermissionExec = (command: string, args: string[]) => Promise<{
|
|
4
4
|
stdout: string;
|
|
5
5
|
stderr: string;
|
|
@@ -31,14 +31,7 @@ export type IcaclsResetCommandOptions = {
|
|
|
31
31
|
env?: NodeJS.ProcessEnv;
|
|
32
32
|
userInfo?: WindowsUserInfoProvider;
|
|
33
33
|
};
|
|
34
|
-
export declare function inspectWindowsPermissions(
|
|
35
|
-
targetPath: string;
|
|
36
|
-
stat: SafeStatResult;
|
|
37
|
-
effectiveIsDir: boolean;
|
|
38
|
-
effectiveMode: number | null;
|
|
39
|
-
bits: number | null;
|
|
40
|
-
opts?: PermissionCheckOptions;
|
|
41
|
-
}): Promise<PermissionCheck>;
|
|
34
|
+
export declare function inspectWindowsPermissions(targetPath: string, unverified: Readonly<PermissionCheck>, opts?: PermissionCheckOptions): Promise<PermissionCheck>;
|
|
42
35
|
export declare function resolveWindowsUserPrincipal(env?: NodeJS.ProcessEnv, userInfo?: WindowsUserInfoProvider): string | null;
|
|
43
36
|
export declare function parseIcaclsOutput(output: string, targetPath: string): WindowsAclEntry[];
|
|
44
37
|
export declare function summarizeWindowsAcl(entries: WindowsAclEntry[], env?: NodeJS.ProcessEnv): Pick<WindowsAclSummary, "trusted" | "untrustedWorld" | "untrustedGroup">;
|
|
@@ -56,4 +49,3 @@ export declare function createIcaclsResetCommand(targetPath: string, opts: Icacl
|
|
|
56
49
|
args: string[];
|
|
57
50
|
display: string;
|
|
58
51
|
} | null;
|
|
59
|
-
//# sourceMappingURL=permissions-windows.d.ts.map
|
|
@@ -39,20 +39,16 @@ const TRUSTED_BASE_ASCII = new Set([...TRUSTED_BASE].map(stripDiacritics));
|
|
|
39
39
|
const normalize = (value) => normalizeLowercaseStringOrEmpty(value);
|
|
40
40
|
const defaultWindowsUserInfo = () => os.userInfo();
|
|
41
41
|
const defaultPermissionExec = executePermissionCommand;
|
|
42
|
-
function inspectWindowsPermissionsNative(
|
|
42
|
+
function inspectWindowsPermissionsNative(targetPath, unverified) {
|
|
43
43
|
const native = getNativeBinding();
|
|
44
44
|
if (!native)
|
|
45
45
|
return undefined;
|
|
46
46
|
try {
|
|
47
|
-
const facts = native.readOwnerAndDacl(
|
|
47
|
+
const facts = native.readOwnerAndDacl(targetPath);
|
|
48
48
|
if (facts.fallbackRequired)
|
|
49
49
|
return undefined;
|
|
50
50
|
return {
|
|
51
|
-
|
|
52
|
-
isSymlink: params.stat.isSymlink,
|
|
53
|
-
isDir: params.effectiveIsDir,
|
|
54
|
-
mode: params.effectiveMode,
|
|
55
|
-
bits: params.bits,
|
|
51
|
+
...unverified,
|
|
56
52
|
source: "windows-acl",
|
|
57
53
|
worldWritable: facts.worldWritable,
|
|
58
54
|
groupWritable: facts.groupWritable,
|
|
@@ -69,32 +65,20 @@ function inspectWindowsPermissionsNative(params) {
|
|
|
69
65
|
return undefined;
|
|
70
66
|
}
|
|
71
67
|
}
|
|
72
|
-
export async function inspectWindowsPermissions(
|
|
73
|
-
|
|
74
|
-
ok: true,
|
|
75
|
-
isSymlink: params.stat.isSymlink,
|
|
76
|
-
isDir: params.effectiveIsDir,
|
|
77
|
-
mode: params.effectiveMode,
|
|
78
|
-
bits: params.bits,
|
|
79
|
-
source: "unknown",
|
|
80
|
-
worldWritable: false,
|
|
81
|
-
groupWritable: false,
|
|
82
|
-
worldReadable: false,
|
|
83
|
-
groupReadable: false,
|
|
84
|
-
};
|
|
85
|
-
if (hasWindowsPathAlias(params.targetPath, "filesystem", "win32")) {
|
|
68
|
+
export async function inspectWindowsPermissions(targetPath, unverified, opts) {
|
|
69
|
+
if (hasWindowsPathAlias(targetPath, "filesystem", "win32")) {
|
|
86
70
|
return {
|
|
87
71
|
...unverified,
|
|
88
72
|
error: "Path uses a Windows filesystem namespace alias",
|
|
89
73
|
};
|
|
90
74
|
}
|
|
91
|
-
const native = inspectWindowsPermissionsNative(
|
|
75
|
+
const native = inspectWindowsPermissionsNative(targetPath, unverified);
|
|
92
76
|
if (native)
|
|
93
77
|
return native;
|
|
94
78
|
const owner = await inspectWindowsOwner({
|
|
95
|
-
targetPath
|
|
96
|
-
env:
|
|
97
|
-
exec:
|
|
79
|
+
targetPath,
|
|
80
|
+
env: opts?.env,
|
|
81
|
+
exec: opts?.exec ?? defaultPermissionExec,
|
|
98
82
|
});
|
|
99
83
|
if (owner.error !== undefined) {
|
|
100
84
|
const error = `Windows owner inspection failed: ${owner.error}`;
|
|
@@ -109,11 +93,7 @@ export async function inspectWindowsPermissions(params) {
|
|
|
109
93
|
if (!acl.ok)
|
|
110
94
|
return { ...unverified, ...ownerFields, error: acl.error, errorDetail: acl.errorDetail, errorCause: acl.errorCause };
|
|
111
95
|
return {
|
|
112
|
-
|
|
113
|
-
isSymlink: params.stat.isSymlink,
|
|
114
|
-
isDir: params.effectiveIsDir,
|
|
115
|
-
mode: params.effectiveMode,
|
|
116
|
-
bits: params.bits,
|
|
96
|
+
...unverified,
|
|
117
97
|
source: "windows-acl",
|
|
118
98
|
worldWritable: acl.untrustedWorld.some((entry) => entry.canWrite),
|
|
119
99
|
groupWritable: acl.untrustedGroup.some((entry) => entry.canWrite),
|
package/dist/permissions.d.ts
CHANGED
|
@@ -57,4 +57,3 @@ export declare function isGroupWritable(bits: number | null): boolean;
|
|
|
57
57
|
export declare function isWorldReadable(bits: number | null): boolean;
|
|
58
58
|
export declare function isGroupReadable(bits: number | null): boolean;
|
|
59
59
|
export declare function formatPosixMode(mode: number): string;
|
|
60
|
-
//# sourceMappingURL=permissions.d.ts.map
|
package/dist/permissions.js
CHANGED
|
@@ -71,28 +71,20 @@ export async function inspectPathPermissions(targetPath, opts) {
|
|
|
71
71
|
}
|
|
72
72
|
const bits = modeBits(effectiveMode);
|
|
73
73
|
const platform = opts?.platform ?? process.platform;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
targetPath,
|
|
77
|
-
stat: st,
|
|
78
|
-
effectiveIsDir,
|
|
79
|
-
effectiveMode,
|
|
80
|
-
bits,
|
|
81
|
-
opts,
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
return {
|
|
74
|
+
const windows = platform === "win32";
|
|
75
|
+
const permissions = {
|
|
85
76
|
ok: true,
|
|
86
77
|
isSymlink: st.isSymlink,
|
|
87
78
|
isDir: effectiveIsDir,
|
|
88
79
|
mode: effectiveMode,
|
|
89
80
|
bits,
|
|
90
|
-
source: "posix",
|
|
91
|
-
worldWritable: isWorldWritable(bits),
|
|
92
|
-
groupWritable: isGroupWritable(bits),
|
|
93
|
-
worldReadable: isWorldReadable(bits),
|
|
94
|
-
groupReadable: isGroupReadable(bits),
|
|
81
|
+
source: windows ? "unknown" : "posix",
|
|
82
|
+
worldWritable: !windows && isWorldWritable(bits),
|
|
83
|
+
groupWritable: !windows && isGroupWritable(bits),
|
|
84
|
+
worldReadable: !windows && isWorldReadable(bits),
|
|
85
|
+
groupReadable: !windows && isGroupReadable(bits),
|
|
95
86
|
};
|
|
87
|
+
return windows ? await inspectWindowsPermissions(targetPath, permissions, opts) : permissions;
|
|
96
88
|
}
|
|
97
89
|
export function formatPermissionDetail(targetPath, perms) {
|
|
98
90
|
if (perms.source === "windows-acl") {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type DenyMutationPolicy } from "./deny-mutations.js";
|
|
2
2
|
import { type RootBoundaryIdentity } from "./root-boundary.js";
|
|
3
|
-
import type { PinnedWriteMutationAdmission } from "./pinned-write.js";
|
|
3
|
+
import type { PinnedWriteMutationAdmission } from "./pinned-write-types.js";
|
|
4
4
|
import type { MutationSymlinkPolicy } from "./root-symlink-policy.js";
|
|
5
5
|
export type PinnedMutationPolicySnapshot = Readonly<{
|
|
6
6
|
denyMutations?: DenyMutationPolicy;
|
|
@@ -22,4 +22,3 @@ export declare function preparePinnedWriteMutationAdmission(params: {
|
|
|
22
22
|
relativeParentPath: string;
|
|
23
23
|
mutationAdmission?: PinnedWriteMutationAdmission;
|
|
24
24
|
}>;
|
|
25
|
-
//# sourceMappingURL=pinned-mutation-admission.d.ts.map
|
|
@@ -36,4 +36,3 @@ export declare function mutationObservationCurrent(observation: MutationPathObse
|
|
|
36
36
|
export declare function mutationObservationsCurrent(observations: readonly MutationPathObservation[], directories: readonly MutationDirectoryObservation[]): boolean;
|
|
37
37
|
export declare function advanceMutationObservation(observation: MutationPathObservation, parent: MutationDirectoryObservation, child: MutationDirectoryObservation): MutationPathObservation | undefined;
|
|
38
38
|
export {};
|
|
39
|
-
//# sourceMappingURL=pinned-mutation-observation.d.ts.map
|
package/dist/pinned-open.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export type PinnedOpenSyncResult = {
|
|
|
5
5
|
path: string;
|
|
6
6
|
fd: number;
|
|
7
7
|
stat: fs.Stats;
|
|
8
|
+
identity: fs.BigIntStats;
|
|
8
9
|
} | {
|
|
9
10
|
ok: false;
|
|
10
11
|
reason: PinnedOpenSyncFailureReason;
|
|
@@ -27,4 +28,3 @@ export declare function openPinnedFileSync(params: {
|
|
|
27
28
|
ioFs?: PinnedOpenSyncFs;
|
|
28
29
|
finalAdmission?: PinnedOpenSyncFinalAdmission;
|
|
29
30
|
}): PinnedOpenSyncResult;
|
|
30
|
-
//# sourceMappingURL=pinned-open.d.ts.map
|
package/dist/pinned-open.js
CHANGED
|
@@ -63,7 +63,7 @@ export function openPinnedFileSync(params) {
|
|
|
63
63
|
preRealpathIdentity: pathIdentity,
|
|
64
64
|
descriptorIdentity: identity,
|
|
65
65
|
}) ?? realPath;
|
|
66
|
-
const opened = { ok: true, path: admittedPath, fd, stat: openedStat };
|
|
66
|
+
const opened = { ok: true, path: admittedPath, fd, stat: openedStat, identity };
|
|
67
67
|
fd = null;
|
|
68
68
|
return opened;
|
|
69
69
|
}
|
|
@@ -77,7 +77,12 @@ export function openPinnedFileSync(params) {
|
|
|
77
77
|
}
|
|
78
78
|
finally {
|
|
79
79
|
if (fd !== null) {
|
|
80
|
-
|
|
80
|
+
try {
|
|
81
|
+
ioFs.closeSync(fd);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Preserve the failed admission result; success transfers fd above.
|
|
85
|
+
}
|
|
81
86
|
}
|
|
82
87
|
}
|
|
83
88
|
}
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export declare function
|
|
2
|
-
//# sourceMappingURL=pinned-operation.d.ts.map
|
|
1
|
+
export declare function validatePinnedRelativePath(relativePath: unknown): void;
|
package/dist/pinned-operation.js
CHANGED
|
@@ -1,19 +1,7 @@
|
|
|
1
1
|
import { FsSafeError } from "./errors.js";
|
|
2
|
-
export function
|
|
3
|
-
if (typeof
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
if (typeof payload.relativeParentPath === "string") {
|
|
7
|
-
validatePinnedRelativePath(payload.relativeParentPath);
|
|
8
|
-
}
|
|
9
|
-
if (typeof payload.from === "string") {
|
|
10
|
-
validatePinnedRelativePath(payload.from);
|
|
11
|
-
}
|
|
12
|
-
if (typeof payload.to === "string") {
|
|
13
|
-
validatePinnedRelativePath(payload.to);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
function validatePinnedRelativePath(relativePath) {
|
|
2
|
+
export function validatePinnedRelativePath(relativePath) {
|
|
3
|
+
if (typeof relativePath !== "string")
|
|
4
|
+
return;
|
|
17
5
|
if (relativePath.length === 0 || relativePath === ".") {
|
|
18
6
|
return;
|
|
19
7
|
}
|
|
@@ -21,7 +9,6 @@ function validatePinnedRelativePath(relativePath) {
|
|
|
21
9
|
throw new FsSafeError("invalid-path", "relative path contains a NUL byte");
|
|
22
10
|
}
|
|
23
11
|
if (relativePath.startsWith("/") ||
|
|
24
|
-
relativePath.startsWith("//") ||
|
|
25
12
|
relativePath === ".." ||
|
|
26
13
|
relativePath.startsWith("../") ||
|
|
27
14
|
relativePath.startsWith("..\\")) {
|
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
import type { FileHandle } from "node:fs/promises";
|
|
2
2
|
import type { PinnedWriteInput } from "./pinned-write-types.js";
|
|
3
3
|
export declare function writePinnedInput(target: FileHandle | number, input: PinnedWriteInput, maxBytes?: number, assertBeforeMutation?: () => void): Promise<void>;
|
|
4
|
-
//# sourceMappingURL=pinned-write-input.d.ts.map
|
|
@@ -2,4 +2,3 @@ import type { FileHandle } from "node:fs/promises";
|
|
|
2
2
|
export declare function assertPinnedWriteMode(fd: number, mode: number, privateCreation?: boolean): void;
|
|
3
3
|
export declare function preparePinnedWriteMode(handle: FileHandle, createdMode: number, assertBeforeMutation?: () => void, privateCreation?: boolean): Promise<(() => void) | undefined>;
|
|
4
4
|
export declare function pinnedWriteModeAssertion(fd: number, mode: number, assertBeforeMutation?: () => void, privateCreation?: boolean): () => void;
|
|
5
|
-
//# sourceMappingURL=pinned-write-mode.d.ts.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import { FsSafeError } from "./errors.js";
|
|
3
3
|
import { assertSynchronousCallbackResult } from "./mutation-authority.js";
|
|
4
|
-
import { assertPrivateCreationFile } from "./creation-
|
|
4
|
+
import { assertPrivateCreationFile } from "./creation-boundary.js";
|
|
5
5
|
export function assertPinnedWriteMode(fd, mode, privateCreation = false) {
|
|
6
6
|
if (process.platform === "win32")
|
|
7
7
|
return;
|
|
@@ -3,4 +3,3 @@ import type { AsyncDirectoryGuard } from "./directory-guard.js";
|
|
|
3
3
|
import { type FileIdentityStat } from "./file-identity.js";
|
|
4
4
|
import type { PinnedWriteParams } from "./pinned-write-types.js";
|
|
5
5
|
export declare function runPinnedStagedWrite(params: PinnedWriteParams, parentPath: string, parentGuard: AsyncDirectoryGuard<BigIntStats>): Promise<FileIdentityStat>;
|
|
6
|
-
//# sourceMappingURL=pinned-write-staged.d.ts.map
|
|
@@ -3,8 +3,7 @@ import fsSync, {} from "node:fs";
|
|
|
3
3
|
import fs, {} from "node:fs/promises";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { createFileHandle } from "./create.js";
|
|
6
|
-
import { hasPreservedCreationArtifacts } from "./creation-
|
|
7
|
-
import { creationAdmissionFromParent } from "./creation-path.js";
|
|
6
|
+
import { hasPreservedCreationArtifacts, creationAdmissionFromParent } from "./creation-boundary.js";
|
|
8
7
|
import { syncDirectoryBestEffort } from "./directory-durability.js";
|
|
9
8
|
import { FsSafeError } from "./errors.js";
|
|
10
9
|
import { sameFileIdentity, sha256Hex } from "./file-identity.js";
|
|
@@ -24,18 +24,15 @@ export type PinnedCreatedDirectoryReceipt = Readonly<{
|
|
|
24
24
|
parent: MutationDirectoryObservation;
|
|
25
25
|
child: MutationDirectoryObservation;
|
|
26
26
|
}>;
|
|
27
|
+
export type PinnedMutationParentRequest = {
|
|
28
|
+
targetPath: string;
|
|
29
|
+
mutationPath: string;
|
|
30
|
+
phase: "parent" | "parent-create";
|
|
31
|
+
};
|
|
27
32
|
export type PinnedMutationParentWalkSession = Readonly<{
|
|
28
33
|
retainedTargetPath: string;
|
|
29
|
-
tryAuthorizeAtParent(request: Readonly<
|
|
30
|
-
|
|
31
|
-
mutationPath: string;
|
|
32
|
-
phase: "parent" | "parent-create";
|
|
33
|
-
}>, parent: MutationDirectoryObservation): PinnedMutationAuthorizationToken | undefined;
|
|
34
|
-
authorize(request: Readonly<{
|
|
35
|
-
targetPath: string;
|
|
36
|
-
mutationPath: string;
|
|
37
|
-
phase: "parent" | "parent-create";
|
|
38
|
-
}>): Promise<PinnedMutationAdmissionReceipt | undefined>;
|
|
34
|
+
tryAuthorizeAtParent(request: Readonly<PinnedMutationParentRequest>, parent: MutationDirectoryObservation): PinnedMutationAuthorizationToken | undefined;
|
|
35
|
+
authorize(request: Readonly<PinnedMutationParentRequest>): Promise<PinnedMutationAdmissionReceipt | undefined>;
|
|
39
36
|
advanceCreatedDirectory(receipt: PinnedCreatedDirectoryReceipt): PinnedMutationAuthorizationToken | undefined;
|
|
40
37
|
dispose(): void;
|
|
41
38
|
}>;
|
|
@@ -44,16 +41,8 @@ export type PinnedWriteMutationAdmission = Readonly<{
|
|
|
44
41
|
beginParentWalk?(): string | undefined;
|
|
45
42
|
beginSharedParentWalk?(): PinnedMutationParentWalkSession | undefined;
|
|
46
43
|
beginNativeParentWalk?(): PinnedMutationParentWalkSession | undefined;
|
|
47
|
-
tryAuthorizeAtParent?(request: Readonly<
|
|
48
|
-
|
|
49
|
-
mutationPath: string;
|
|
50
|
-
phase: "parent" | "parent-create";
|
|
51
|
-
}>, parent: MutationDirectoryObservation): PinnedMutationAuthorizationToken | undefined;
|
|
52
|
-
authorize(request: Readonly<{
|
|
53
|
-
targetPath: string;
|
|
54
|
-
mutationPath: string;
|
|
55
|
-
phase: "parent" | "parent-create";
|
|
56
|
-
}>): Promise<PinnedMutationAdmissionReceipt | undefined>;
|
|
44
|
+
tryAuthorizeAtParent?(request: Readonly<PinnedMutationParentRequest>, parent: MutationDirectoryObservation): PinnedMutationAuthorizationToken | undefined;
|
|
45
|
+
authorize(request: Readonly<PinnedMutationParentRequest>): Promise<PinnedMutationAdmissionReceipt | undefined>;
|
|
57
46
|
advanceCreatedDirectory?(receipt: PinnedCreatedDirectoryReceipt): PinnedMutationAuthorizationToken | undefined;
|
|
58
47
|
}>;
|
|
59
48
|
export type PinnedWriteParams = {
|
|
@@ -77,4 +66,3 @@ export type PinnedWriteParams = {
|
|
|
77
66
|
onPublished?: (identity: PublishedWriteIdentity) => void;
|
|
78
67
|
verifyPublished?: (fd: number, identity: PublishedWriteIdentity, parentGuard: AnyAsyncDirectoryGuard) => Promise<void>;
|
|
79
68
|
};
|
|
80
|
-
//# sourceMappingURL=pinned-write-types.d.ts.map
|
package/dist/pinned-write.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { FileIdentityStat } from "./file-identity.js";
|
|
2
2
|
import type { PinnedWriteParams, RenameIdentityPolicy } from "./pinned-write-types.js";
|
|
3
|
-
export type { PinnedWriteInput, RenameIdentityPolicy, PublishedWriteIdentity, PinnedMutationAdmissionReceipt, PinnedMutationAuthorizationToken, PinnedCreatedDirectoryReceipt, PinnedMutationParentWalkSession, PinnedWriteMutationAdmission, PinnedWriteParams, } from "./pinned-write-types.js";
|
|
4
3
|
export declare function runPinnedWriteHelper(params: PinnedWriteParams): Promise<FileIdentityStat>;
|
|
5
4
|
export declare function runPinnedWriteWithRenamePolicy(params: PinnedWriteParams & {
|
|
6
5
|
targetPath: string;
|
|
@@ -11,4 +10,3 @@ export declare function withPinnedWriteRenameIdentityLock<T>(params: {
|
|
|
11
10
|
targetPath: string;
|
|
12
11
|
relativeTargetPath: string;
|
|
13
12
|
}, run: () => Promise<T>): Promise<T>;
|
|
14
|
-
//# sourceMappingURL=pinned-write.d.ts.map
|
package/dist/pinned-write.js
CHANGED
|
@@ -3,7 +3,7 @@ import fsSync, {} from "node:fs";
|
|
|
3
3
|
import fs from "node:fs/promises";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { createFileHandle } from "./create.js";
|
|
6
|
-
import { creationAdmissionFromParent } from "./creation-
|
|
6
|
+
import { creationAdmissionFromParent } from "./creation-boundary.js";
|
|
7
7
|
import { normalizeMaxBytes } from "./byte-budget.js";
|
|
8
8
|
import { assertAsyncDirectoryGuard, createAsyncDirectoryGuard, createNearestExistingDirectoryGuard, inspectDirectoryIdentity } from "./directory-guard.js";
|
|
9
9
|
import { FsSafeError } from "./errors.js";
|
|
@@ -13,7 +13,7 @@ import { withAsyncDirectoryGuards } from "./guarded-mutation.js";
|
|
|
13
13
|
import { mkdirPathComponentsWithGuards } from "./guarded-mkdir.js";
|
|
14
14
|
import { runPinnedWriteNative } from "./native-pinned-write.js";
|
|
15
15
|
import { getNativeBinding } from "./native.js";
|
|
16
|
-
import {
|
|
16
|
+
import { validatePinnedRelativePath } from "./pinned-operation.js";
|
|
17
17
|
import { cleanupPinnedFilePath } from "./file-cleanup.js";
|
|
18
18
|
import { withSidecarLock } from "./sidecar-lock.js";
|
|
19
19
|
import { getFsSafeTestHooks } from "./test-hooks.js";
|
|
@@ -71,9 +71,7 @@ export async function runPinnedWriteHelper(params) {
|
|
|
71
71
|
rootIdentity,
|
|
72
72
|
};
|
|
73
73
|
assertSafeBasename(normalizedParams.basename);
|
|
74
|
-
|
|
75
|
-
relativeParentPath: normalizedParams.relativeParentPath,
|
|
76
|
-
});
|
|
74
|
+
validatePinnedRelativePath(normalizedParams.relativeParentPath);
|
|
77
75
|
assertNoWindowsPathAlias(normalizedParams.rootPath, "filesystem", "pinned write root uses a Windows filesystem namespace alias");
|
|
78
76
|
assertNoWindowsPathAlias(normalizedParams.relativeParentPath, "relative", "pinned write parent uses a Windows filesystem namespace alias");
|
|
79
77
|
assertNoWindowsPathAlias(normalizedParams.basename, "relative", "pinned write basename uses a Windows filesystem namespace alias");
|
|
@@ -6,4 +6,3 @@ export type ReadFileWindowOptions = {
|
|
|
6
6
|
export declare function readFileWindowFully(handle: FileHandle, buffer: Buffer, position: number, { signal }?: ReadFileWindowOptions): Promise<number>;
|
|
7
7
|
/** Synchronous positional read; neither variant advances or closes its descriptor. */
|
|
8
8
|
export declare function readFileWindowFullySync(fd: number, buffer: Buffer, position: number): number;
|
|
9
|
-
//# sourceMappingURL=positional-read.d.ts.map
|
|
@@ -1,14 +1,3 @@
|
|
|
1
|
-
import { type BigIntStats } from "node:fs";
|
|
2
1
|
import { type OwnedFileDescriptorSync } from "./create-owned-file.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
sourcePath: string;
|
|
6
|
-
targetPath: string;
|
|
7
|
-
identity: BigIntStats;
|
|
8
|
-
assertSourceParent: () => void;
|
|
9
|
-
assertTargetParent: () => void;
|
|
10
|
-
assertBeforeMutation?: () => void;
|
|
11
|
-
verifyDescriptor?: (fd: number, path: string, links: number) => void;
|
|
12
|
-
onPublished?: () => void;
|
|
13
|
-
}): OwnedFileDescriptorSync;
|
|
14
|
-
//# sourceMappingURL=private-producer-handoff-sync.d.ts.map
|
|
2
|
+
import { type CreatedHandoffParams } from "./private-producer-handoff.js";
|
|
3
|
+
export declare function handoffCreatedFileSync(params: CreatedHandoffParams<OwnedFileDescriptorSync, void>): OwnedFileDescriptorSync;
|
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
import fs
|
|
1
|
+
import fs from "node:fs";
|
|
2
2
|
import { ownFileDescriptorSync } from "./create-owned-file.js";
|
|
3
|
-
import { FsSafeError } from "./errors.js";
|
|
4
3
|
import { assertSynchronousCallbackResult } from "./mutation-authority.js";
|
|
5
|
-
import { assertInitialSource,
|
|
4
|
+
import { assertInitialSource, FileHandoff, inspectLinkedFile, } from "./private-producer-handoff.js";
|
|
6
5
|
import { resolveReadOpenFlags } from "./read-open-flags.js";
|
|
7
6
|
export function handoffCreatedFileSync(params) {
|
|
8
7
|
let retained = params.source;
|
|
9
8
|
const owners = new Set([retained]);
|
|
10
9
|
const failures = [];
|
|
11
|
-
|
|
12
|
-
let cleanup = "preserved";
|
|
13
|
-
let closeFailed = false;
|
|
10
|
+
const state = new FileHandoff(params, params.identity, true);
|
|
14
11
|
function close(owner) {
|
|
15
12
|
// A throwing close may already have released the descriptor for reuse.
|
|
16
13
|
owners.delete(owner);
|
|
@@ -18,42 +15,20 @@ export function handoffCreatedFileSync(params) {
|
|
|
18
15
|
owner.close();
|
|
19
16
|
}
|
|
20
17
|
catch (error) {
|
|
21
|
-
closeFailed = true;
|
|
18
|
+
state.closeFailed = true;
|
|
22
19
|
throw error;
|
|
23
20
|
}
|
|
24
21
|
}
|
|
25
|
-
function assertIdentityCurrent(owner, links) {
|
|
26
|
-
assertParents(params);
|
|
27
|
-
inspectLinkedFile(() => fs.fstatSync(owner.fd, { bigint: true }), params.identity, links, "created file descriptor");
|
|
28
|
-
if (cleanup !== "removed") {
|
|
29
|
-
inspectLinkedFile(() => fs.lstatSync(params.sourcePath, { bigint: true }), params.identity, links, "created file stage");
|
|
30
|
-
}
|
|
31
|
-
if (publication === "published") {
|
|
32
|
-
inspectLinkedFile(() => fs.lstatSync(params.targetPath, { bigint: true }), params.identity, links, "created file destination");
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
22
|
function verifyCurrent(owner, descriptorPath, links) {
|
|
36
|
-
|
|
23
|
+
state.inspect(owner, links);
|
|
37
24
|
params.verifyDescriptor?.(owner.fd, descriptorPath, Number(links));
|
|
38
25
|
}
|
|
39
26
|
try {
|
|
40
27
|
assertInitialSource(params.identity);
|
|
41
28
|
verifyCurrent(retained, params.sourcePath, 1n);
|
|
42
29
|
assertSynchronousCallbackResult(params.assertBeforeMutation?.(), "assertBeforeMutation");
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
try {
|
|
46
|
-
fs.linkSync(params.sourcePath, params.targetPath);
|
|
47
|
-
}
|
|
48
|
-
catch (error) {
|
|
49
|
-
const normalized = normalizeLinkError(error);
|
|
50
|
-
if (normalized instanceof FsSafeError &&
|
|
51
|
-
(normalized.code === "already-exists" || normalized.code === "helper-unavailable")) {
|
|
52
|
-
publication = "not-published";
|
|
53
|
-
}
|
|
54
|
-
throw normalized;
|
|
55
|
-
}
|
|
56
|
-
publication = "published";
|
|
30
|
+
state.inspect(retained, 1n);
|
|
31
|
+
state.publish();
|
|
57
32
|
try {
|
|
58
33
|
params.onPublished?.();
|
|
59
34
|
}
|
|
@@ -74,12 +49,10 @@ export function handoffCreatedFileSync(params) {
|
|
|
74
49
|
const descriptorPath = process.platform === "win32" ? params.targetPath : params.sourcePath;
|
|
75
50
|
verifyCurrent(retained, descriptorPath, 2n);
|
|
76
51
|
assertSynchronousCallbackResult(params.assertBeforeMutation?.(), "assertBeforeMutation");
|
|
77
|
-
|
|
78
|
-
cleanup = "failed";
|
|
52
|
+
state.inspect(retained, 2n);
|
|
79
53
|
// Link and unlink stay in one JS turn. Only the verified stage is removed;
|
|
80
54
|
// publication has committed and the destination is never rollback cleanup.
|
|
81
|
-
|
|
82
|
-
cleanup = "removed";
|
|
55
|
+
state.retireSource();
|
|
83
56
|
verifyCurrent(retained, params.targetPath, 1n);
|
|
84
57
|
}
|
|
85
58
|
catch (error) {
|
|
@@ -95,20 +68,5 @@ export function handoffCreatedFileSync(params) {
|
|
|
95
68
|
failures.push(error);
|
|
96
69
|
}
|
|
97
70
|
}
|
|
98
|
-
|
|
99
|
-
// Collision-as-no-op callers must still observe a failed settlement.
|
|
100
|
-
const code = closeFailed || failures.length > 1
|
|
101
|
-
? "helper-failed"
|
|
102
|
-
: primary instanceof FsSafeError ? primary.code : "helper-failed";
|
|
103
|
-
throw new FsSafeError(code, "created file publication failed", {
|
|
104
|
-
cause: failures.length === 1 ? primary : new AggregateError(failures, "created file publication and settlement failed"),
|
|
105
|
-
details: {
|
|
106
|
-
publication: { status: publication },
|
|
107
|
-
cleanup,
|
|
108
|
-
resources: closeFailed ? "close-failed" : "closed",
|
|
109
|
-
path: params.targetPath,
|
|
110
|
-
dev: params.identity.dev,
|
|
111
|
-
ino: params.identity.ino,
|
|
112
|
-
},
|
|
113
|
-
});
|
|
71
|
+
throw state.failure(failures, "created file publication and settlement failed");
|
|
114
72
|
}
|