@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/sidecar-lock.js
CHANGED
|
@@ -5,6 +5,7 @@ import { removeSidecarLockIfUnchanged, sidecarLockSnapshotMatches, } from "./sid
|
|
|
5
5
|
import { acquireSidecarLock } from "./sidecar-lock-acquire.js";
|
|
6
6
|
import { createHeldSidecarLockHandle, stopSidecarLockMonitoring } from "./sidecar-lock-handle.js";
|
|
7
7
|
import { createSuppressedError } from "./suppressed-error.js";
|
|
8
|
+
import { ensureSidecarLockCleanupRegistered } from "./sidecar-lock-registration.js";
|
|
8
9
|
const GLOBAL_STATE_KEY = Symbol.for("fsSafe.sidecarLockManagers");
|
|
9
10
|
const GLOBAL_CLEANUP_KEY = Symbol.for("fsSafe.sidecarLockCleanupRegistered");
|
|
10
11
|
const GLOBAL_CLEANUP_HANDLER_KEY = Symbol.for("fsSafe.sidecarLockCleanupHandler");
|
|
@@ -118,51 +119,19 @@ function releaseAllLocksSync(state, options) {
|
|
|
118
119
|
releaseAllReclaimGuardsSync(state);
|
|
119
120
|
}
|
|
120
121
|
function ensureGlobalExitCleanupRegistered() {
|
|
121
|
-
const globalWithCleanup = globalThis;
|
|
122
|
-
if (globalWithCleanup[GLOBAL_CLEANUP_KEY])
|
|
123
|
-
return;
|
|
124
|
-
if (globalWithCleanup[GLOBAL_CLEANUP_REGISTRATION_KEY]) {
|
|
125
|
-
throw new FsSafeError("helper-unavailable", "sidecar lock exit cleanup registration is already in progress");
|
|
126
|
-
}
|
|
127
|
-
const registration = {};
|
|
128
122
|
const cleanup = () => {
|
|
129
123
|
for (const state of getGlobalManagers().values()) {
|
|
130
124
|
releaseAllLocksSync(state, { preserveRetained: true });
|
|
131
125
|
}
|
|
132
126
|
};
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
if (process.listeners("exit").includes(cleanup)) {
|
|
142
|
-
try {
|
|
143
|
-
process.off("exit", cleanup);
|
|
144
|
-
}
|
|
145
|
-
catch {
|
|
146
|
-
// Reconcile the marker with the actual listener below.
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
if (process.listeners("exit").includes(cleanup)) {
|
|
150
|
-
globalWithCleanup[GLOBAL_CLEANUP_HANDLER_KEY] = cleanup;
|
|
151
|
-
globalWithCleanup[GLOBAL_RETAIN_AWARE_KEY] = true;
|
|
152
|
-
globalWithCleanup[GLOBAL_CLEANUP_KEY] = true;
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
if (globalWithCleanup[GLOBAL_CLEANUP_HANDLER_KEY] === cleanup) {
|
|
156
|
-
delete globalWithCleanup[GLOBAL_CLEANUP_HANDLER_KEY];
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
throw error;
|
|
160
|
-
}
|
|
161
|
-
finally {
|
|
162
|
-
if (globalWithCleanup[GLOBAL_CLEANUP_REGISTRATION_KEY] === registration) {
|
|
163
|
-
delete globalWithCleanup[GLOBAL_CLEANUP_REGISTRATION_KEY];
|
|
164
|
-
}
|
|
165
|
-
}
|
|
127
|
+
ensureSidecarLockCleanupRegistered({
|
|
128
|
+
event: "exit",
|
|
129
|
+
registered: GLOBAL_CLEANUP_KEY,
|
|
130
|
+
registering: GLOBAL_CLEANUP_REGISTRATION_KEY,
|
|
131
|
+
handler: GLOBAL_CLEANUP_HANDLER_KEY,
|
|
132
|
+
retainAware: GLOBAL_RETAIN_AWARE_KEY,
|
|
133
|
+
reentryError: () => new FsSafeError("helper-unavailable", "sidecar lock exit cleanup registration is already in progress"),
|
|
134
|
+
}, cleanup, true);
|
|
166
135
|
}
|
|
167
136
|
/** True when a retain-unaware package copy registered the process-exit handlers first. */
|
|
168
137
|
export function exitCleanupCannotRetain() {
|
|
@@ -170,16 +139,8 @@ export function exitCleanupCannotRetain() {
|
|
|
170
139
|
return globalWithCleanup[GLOBAL_CLEANUP_KEY] === true && globalWithCleanup[GLOBAL_RETAIN_AWARE_KEY] !== true;
|
|
171
140
|
}
|
|
172
141
|
function ensureGlobalBeforeExitCleanupRegistered() {
|
|
173
|
-
const globalWithCleanup = globalThis;
|
|
174
|
-
if (globalWithCleanup[GLOBAL_BEFORE_EXIT_KEY]) {
|
|
175
|
-
return globalWithCleanup[GLOBAL_BEFORE_EXIT_KEY];
|
|
176
|
-
}
|
|
177
|
-
if (globalWithCleanup[GLOBAL_BEFORE_EXIT_REGISTRATION_KEY]) {
|
|
178
|
-
throw new FsSafeError("helper-unavailable", "sidecar lock before-exit cleanup registration is already in progress");
|
|
179
|
-
}
|
|
180
142
|
// Independent of the exit registration, which an older package copy may own.
|
|
181
143
|
const lifecycle = { armed: false };
|
|
182
|
-
const registration = {};
|
|
183
144
|
const cleanup = () => {
|
|
184
145
|
if (!lifecycle.armed)
|
|
185
146
|
return;
|
|
@@ -193,41 +154,13 @@ function ensureGlobalBeforeExitCleanupRegistered() {
|
|
|
193
154
|
}
|
|
194
155
|
}
|
|
195
156
|
};
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
}
|
|
203
|
-
catch (error) {
|
|
204
|
-
if (process.listeners("beforeExit").includes(cleanup)) {
|
|
205
|
-
try {
|
|
206
|
-
process.off("beforeExit", cleanup);
|
|
207
|
-
}
|
|
208
|
-
catch {
|
|
209
|
-
// Reconcile the marker with the actual listener below.
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
if (process.listeners("beforeExit").includes(cleanup)) {
|
|
213
|
-
globalWithCleanup[GLOBAL_BEFORE_EXIT_HANDLER_KEY] = cleanup;
|
|
214
|
-
globalWithCleanup[GLOBAL_BEFORE_EXIT_KEY] = lifecycle;
|
|
215
|
-
}
|
|
216
|
-
else {
|
|
217
|
-
if (globalWithCleanup[GLOBAL_BEFORE_EXIT_HANDLER_KEY] === cleanup) {
|
|
218
|
-
delete globalWithCleanup[GLOBAL_BEFORE_EXIT_HANDLER_KEY];
|
|
219
|
-
}
|
|
220
|
-
if (globalWithCleanup[GLOBAL_BEFORE_EXIT_KEY] === lifecycle) {
|
|
221
|
-
delete globalWithCleanup[GLOBAL_BEFORE_EXIT_KEY];
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
throw error;
|
|
225
|
-
}
|
|
226
|
-
finally {
|
|
227
|
-
if (globalWithCleanup[GLOBAL_BEFORE_EXIT_REGISTRATION_KEY] === registration) {
|
|
228
|
-
delete globalWithCleanup[GLOBAL_BEFORE_EXIT_REGISTRATION_KEY];
|
|
229
|
-
}
|
|
230
|
-
}
|
|
157
|
+
return ensureSidecarLockCleanupRegistered({
|
|
158
|
+
event: "beforeExit",
|
|
159
|
+
registered: GLOBAL_BEFORE_EXIT_KEY,
|
|
160
|
+
registering: GLOBAL_BEFORE_EXIT_REGISTRATION_KEY,
|
|
161
|
+
handler: GLOBAL_BEFORE_EXIT_HANDLER_KEY,
|
|
162
|
+
reentryError: () => new FsSafeError("helper-unavailable", "sidecar lock before-exit cleanup registration is already in progress"),
|
|
163
|
+
}, cleanup, lifecycle);
|
|
231
164
|
}
|
|
232
165
|
async function releaseHeldLock(state, normalizedTargetPath, held, options = {}) {
|
|
233
166
|
const current = state.held.get(normalizedTargetPath);
|
|
@@ -8,4 +8,3 @@ export type StatObservationReceipt = {
|
|
|
8
8
|
export declare function inspectStatObservationSync(inspect: (bigint: boolean) => Stats | BigIntStats, expected?: ExactStatIdentity, initial?: Stats | BigIntStats, platform?: NodeJS.Platform): StatObservationReceipt;
|
|
9
9
|
/** Revalidate an exact identity without allocating a receipt that the caller will discard. */
|
|
10
10
|
export declare function assertStatObservationSync(inspect: (bigint: boolean) => Stats | BigIntStats, expected: ExactStatIdentity, initial?: Stats | BigIntStats, platform?: NodeJS.Platform): Stats | BigIntStats;
|
|
11
|
-
//# sourceMappingURL=stat-observation.d.ts.map
|
package/dist/store.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
export { fileStore, fileStoreSync, type FileStore, type FileStoreOptions, type FileStorePruneOptions, type FileStoreReadOptions, type FileStoreSync, type FileStoreWriteOptions, } from "./file-store.js";
|
|
2
2
|
export { jsonStore, type JsonStore, type JsonFileStoreOptions, type JsonStoreLockOptions, type JsonStoreOptions, } from "./json-store.js";
|
|
3
3
|
export { ackJsonDurableQueueEntry, ensureJsonDurableQueueDirs, jsonDurableQueueEntryExists, loadJsonDurableQueueEntry, loadPendingJsonDurableQueueEntries, moveJsonDurableQueueEntryToFailed, readJsonDurableQueueEntry, resolveJsonDurableQueueEntryPaths, unlinkBestEffort, writeJsonDurableQueueEntry, type JsonDurableQueueEntryPaths, type JsonDurableQueueLoadOptions, type JsonDurableQueueReadResult, } from "./json-durable-queue.js";
|
|
4
|
-
//# sourceMappingURL=store.d.ts.map
|
|
@@ -3,4 +3,3 @@ type ExactFileIdentity = Pick<BigIntStats, "dev" | "ino">;
|
|
|
3
3
|
export declare function inspectFileIdentity<T extends ExactFileIdentity>(inspect: () => T | Promise<T>, expected?: ExactFileIdentity, platform?: NodeJS.Platform): Promise<T>;
|
|
4
4
|
export declare function inspectFileIdentitySync<T extends ExactFileIdentity>(inspect: () => T, expected?: ExactFileIdentity, platform?: NodeJS.Platform, mismatch?: () => Error): T;
|
|
5
5
|
export {};
|
|
6
|
-
//# sourceMappingURL=strict-file-identity.d.ts.map
|
package/dist/string-coerce.d.ts
CHANGED
|
@@ -2,4 +2,3 @@ export declare function normalizeNullableString(value: unknown): string | null;
|
|
|
2
2
|
export declare function normalizeOptionalString(value: unknown): string | undefined;
|
|
3
3
|
export declare function normalizeOptionalLowercaseString(value: unknown): string | undefined;
|
|
4
4
|
export declare function normalizeLowercaseStringOrEmpty(value: unknown): string;
|
|
5
|
-
//# sourceMappingURL=string-coerce.d.ts.map
|
|
@@ -9,4 +9,3 @@ export type AssertNoSymlinkParentsOptions = {
|
|
|
9
9
|
};
|
|
10
10
|
export declare function assertNoSymlinkParents(params: AssertNoSymlinkParentsOptions): Promise<void>;
|
|
11
11
|
export declare function assertNoSymlinkParentsSync(params: AssertNoSymlinkParentsOptions): void;
|
|
12
|
-
//# sourceMappingURL=symlink-parents.d.ts.map
|
package/dist/temp-cleanup.d.ts
CHANGED
|
@@ -11,4 +11,3 @@ export declare function registerTempPathForExit(tempPath: string, options?: {
|
|
|
11
11
|
}): TempPathRegistration;
|
|
12
12
|
export declare function __cleanupRegisteredTempPathsForTest(): void;
|
|
13
13
|
export declare function __cleanupRegisteredTempPathForTest(tempPath: string): void;
|
|
14
|
-
//# sourceMappingURL=temp-cleanup.d.ts.map
|
package/dist/temp-target.d.ts
CHANGED
|
@@ -29,4 +29,3 @@ export declare function createOwnedTempFile(params: TempFileOptions): Promise<{
|
|
|
29
29
|
export declare function tempFile(params: TempFileOptions): Promise<TempFile>;
|
|
30
30
|
export declare function withTempFile<T>(params: TempFileOptions, fn: (tmpPath: string) => Promise<T>): Promise<T>;
|
|
31
31
|
export {};
|
|
32
|
-
//# sourceMappingURL=temp-target.d.ts.map
|
package/dist/temp-target.js
CHANGED
|
@@ -59,10 +59,7 @@ function sanitizeExtension(extension) {
|
|
|
59
59
|
return token ? `.${token}` : "";
|
|
60
60
|
}
|
|
61
61
|
export function sanitizeTempFileName(fileName) {
|
|
62
|
-
|
|
63
|
-
allowDotPrefix: true,
|
|
64
|
-
});
|
|
65
|
-
return suffixWindowsReservedDeviceName(sanitized);
|
|
62
|
+
return suffixWindowsReservedDeviceName(sanitizeSafePathSegment(path.basename(fileName)) ?? "download.bin");
|
|
66
63
|
}
|
|
67
64
|
export function buildRandomTempFilePath(params) {
|
|
68
65
|
const rootDir = resolveTempRoot(params.rootDir);
|
|
@@ -87,16 +84,7 @@ function isNodeErrorWithCode(err, code) {
|
|
|
87
84
|
}
|
|
88
85
|
async function cleanupTempDir(dir, identity, onCleanupError) {
|
|
89
86
|
try {
|
|
90
|
-
|
|
91
|
-
try {
|
|
92
|
-
current = fsSync.lstatSync(dir, { bigint: true });
|
|
93
|
-
}
|
|
94
|
-
catch (error) {
|
|
95
|
-
if (isNodeErrorWithCode(error, "ENOENT")) {
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
throw error;
|
|
99
|
-
}
|
|
87
|
+
const current = fsSync.lstatSync(dir, { bigint: true });
|
|
100
88
|
if (!current || !sameFileIdentityForCleanup(current, identity)) {
|
|
101
89
|
return;
|
|
102
90
|
}
|
|
@@ -131,7 +119,7 @@ export async function createOwnedTempFile(params) {
|
|
|
131
119
|
const prefix = `${sanitizePrefix(params.prefix)}-`;
|
|
132
120
|
if (cleanupSafety === "require-bounded") {
|
|
133
121
|
const initialFileName = sanitizeTempFileName(params.fileName ?? "download.bin");
|
|
134
|
-
const [{ TempWorkspaceCleanupCapability, TempWorkspaceCleanupOwner }, { admitExistingTempWorkspaceRoot }, { TempWorkspaceRetainedChild }, { validateInitialTempWorkspaceChild
|
|
122
|
+
const [{ TempWorkspaceCleanupCapability, TempWorkspaceCleanupOwner, throwTempWorkspaceCreationFailure }, { admitExistingTempWorkspaceRoot }, { TempWorkspaceRetainedChild }, { validateInitialTempWorkspaceChild }, { inspectDirectoryIdentitySync },] = await Promise.all([
|
|
135
123
|
import("./temp-workspace-owner.js"),
|
|
136
124
|
import("./temp-workspace-admission.js"),
|
|
137
125
|
import("./temp-workspace-descriptor.js"),
|
|
@@ -159,9 +147,9 @@ export async function createOwnedTempFile(params) {
|
|
|
159
147
|
identity = Object.freeze({ dev: initial.dev, ino: initial.ino });
|
|
160
148
|
const needsModeInitialization = validateInitialTempWorkspaceChild(initial, admission.ownerUid, 0o700);
|
|
161
149
|
retainedChild = TempWorkspaceRetainedChild.retain(dir, identity);
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
150
|
+
if (needsModeInitialization) {
|
|
151
|
+
await retainedChild.initializeMode(0o700, admission.ownerUid, admission.assertCurrent);
|
|
152
|
+
}
|
|
165
153
|
const retainDescriptor = capability.admitChildDescriptor(retainedChild.ensureReadable());
|
|
166
154
|
capability.assertAncestryCurrent();
|
|
167
155
|
retainedChild.finalizeAdmission(admission.ownerUid, 0o700);
|
|
@@ -172,34 +160,7 @@ export async function createOwnedTempFile(params) {
|
|
|
172
160
|
});
|
|
173
161
|
}
|
|
174
162
|
catch (error) {
|
|
175
|
-
|
|
176
|
-
if (cleanupOwner)
|
|
177
|
-
cleanupOwner.cleanupSync();
|
|
178
|
-
else {
|
|
179
|
-
const closeErrors = [];
|
|
180
|
-
try {
|
|
181
|
-
retainedChild?.close();
|
|
182
|
-
}
|
|
183
|
-
catch (closeError) {
|
|
184
|
-
closeErrors.push(closeError);
|
|
185
|
-
}
|
|
186
|
-
try {
|
|
187
|
-
capability.close();
|
|
188
|
-
}
|
|
189
|
-
catch (closeError) {
|
|
190
|
-
closeErrors.push(closeError);
|
|
191
|
-
}
|
|
192
|
-
if (closeErrors.length === 1)
|
|
193
|
-
throw closeErrors[0];
|
|
194
|
-
if (closeErrors.length > 1) {
|
|
195
|
-
throw new AggregateError(closeErrors, "temp file admission descriptor close failed");
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
catch (cleanupError) {
|
|
200
|
-
throw new AggregateError([error, cleanupError], "temp file creation and cleanup both failed");
|
|
201
|
-
}
|
|
202
|
-
throw error;
|
|
163
|
+
return throwTempWorkspaceCreationFailure(error, retainedChild, capability, cleanupOwner, "temp file");
|
|
203
164
|
}
|
|
204
165
|
const owner = cleanupOwner;
|
|
205
166
|
const file = (fileName) => {
|
|
@@ -1,12 +1,6 @@
|
|
|
1
|
-
type ExactIdentity = Readonly<{
|
|
2
|
-
dev: bigint;
|
|
3
|
-
ino: bigint;
|
|
4
|
-
}>;
|
|
5
1
|
export type TempWorkspaceRootAdmission = {
|
|
6
2
|
dir: string;
|
|
7
|
-
identity: ExactIdentity;
|
|
8
3
|
ownerUid: number | undefined;
|
|
9
|
-
realPath: string;
|
|
10
4
|
retainCleanupParent(descriptorFd: number): void;
|
|
11
5
|
prepareCleanupProbe(descriptorFd: number): void;
|
|
12
6
|
prepareChildCreation(descriptorFd?: number): void;
|
|
@@ -18,5 +12,3 @@ export type TempWorkspaceRootAdmission = {
|
|
|
18
12
|
export declare function admitExistingTempWorkspaceRoot(rootDir: string): TempWorkspaceRootAdmission;
|
|
19
13
|
export declare function admitTempWorkspaceRoot(rootDir: string): Promise<TempWorkspaceRootAdmission>;
|
|
20
14
|
export declare function admitTempWorkspaceRootSync(rootDir: string): TempWorkspaceRootAdmission;
|
|
21
|
-
export {};
|
|
22
|
-
//# sourceMappingURL=temp-workspace-admission.d.ts.map
|
|
@@ -2,14 +2,12 @@ import fsSync, {} from "node:fs";
|
|
|
2
2
|
import fs from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { inspectDirectoryIdentitySync, observeDirectoryIdentitySync, } from "./directory-guard.js";
|
|
5
|
-
import { admitTempWorkspaceChild, admitTempWorkspaceChildSync, } from "./temp-workspace-child-admission.js";
|
|
5
|
+
import { admitTempWorkspaceChild, admitTempWorkspaceChildSync, assertTrustedTempWorkspaceDirectory, inspectTempWorkspaceDescriptorIdentitySync, projectTempWorkspaceNumericIdentity, TEMP_WORKSPACE_NUMERIC_IDENTITY_REPLAY, } from "./temp-workspace-child-admission.js";
|
|
6
6
|
import { FsSafeError } from "./errors.js";
|
|
7
7
|
import { recordFileObservationFailure } from "./file-observation.js";
|
|
8
8
|
import { realpathSync } from "./realpath.js";
|
|
9
9
|
import { assertNoWindowsPathAlias, pathForWindowsFilesystem, resolvePathPreservingWindowsRoot, } from "./windows-path-alias.js";
|
|
10
10
|
import { inspectFileIdentitySync } from "./strict-file-identity.js";
|
|
11
|
-
import { inspectTempWorkspaceDescriptorIdentitySync, projectTempWorkspaceNumericIdentity, TEMP_WORKSPACE_NUMERIC_IDENTITY_REPLAY, } from "./temp-workspace-identity.js";
|
|
12
|
-
import { assertTrustedTempWorkspaceDirectory } from "./temp-workspace-permissions.js";
|
|
13
11
|
const WINDOWS = process.platform === "win32";
|
|
14
12
|
function effectiveOwner() {
|
|
15
13
|
// Windows mode/uid fields do not describe ACL authority. The supplied root's
|
|
@@ -247,9 +245,7 @@ function rootAdmission(chain, ownerUid) {
|
|
|
247
245
|
const current = chain[chain.length - 1];
|
|
248
246
|
return {
|
|
249
247
|
dir: current.dir,
|
|
250
|
-
identity: current.identity,
|
|
251
248
|
ownerUid,
|
|
252
|
-
realPath: current.realPath,
|
|
253
249
|
retainCleanupParent: (descriptorFd) => {
|
|
254
250
|
assertSnapshot(current, ownerUid);
|
|
255
251
|
associateTempWorkspaceRoot(current, ownerUid, descriptorFd);
|
|
@@ -280,9 +276,7 @@ function canonicalRootAdmission(discovery, ownerUid) {
|
|
|
280
276
|
};
|
|
281
277
|
return {
|
|
282
278
|
dir: discovery.dir,
|
|
283
|
-
identity: discovery.identity,
|
|
284
279
|
ownerUid,
|
|
285
|
-
realPath: discovery.realPath,
|
|
286
280
|
// Merely opening the cleanup-parent descriptor grants no authority. The
|
|
287
281
|
// exact association is completed only at a bounded probe or the mutation
|
|
288
282
|
// boundary below.
|
|
@@ -1,13 +1,23 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type BigIntStats, type Stats } from "node:fs";
|
|
2
2
|
import type { TempWorkspaceRootAdmission } from "./temp-workspace-admission.js";
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
export type TempWorkspaceIdentity = Readonly<{
|
|
4
|
+
dev: bigint;
|
|
5
|
+
ino: bigint;
|
|
6
|
+
}>;
|
|
7
|
+
export type TempWorkspaceNumericIdentity = Readonly<{
|
|
8
|
+
dev: number;
|
|
9
|
+
ino: number;
|
|
10
|
+
}>;
|
|
11
|
+
export type TempWorkspaceIdentityStat = BigIntStats | Stats;
|
|
12
|
+
export declare const TEMP_WORKSPACE_NUMERIC_IDENTITY_REPLAY: boolean;
|
|
13
|
+
export declare function projectTempWorkspaceNumericIdentity(identity: TempWorkspaceIdentity): TempWorkspaceNumericIdentity | undefined;
|
|
14
|
+
export declare function inspectTempWorkspaceDescriptorIdentitySync(fd: number, expected: TempWorkspaceIdentity, numeric: TempWorkspaceNumericIdentity | undefined): TempWorkspaceIdentityStat;
|
|
15
|
+
export declare function inspectTempWorkspaceDirectoryIdentitySync(dir: string, expected: TempWorkspaceIdentity, numeric: TempWorkspaceNumericIdentity | undefined): TempWorkspaceIdentityStat;
|
|
16
|
+
export declare function validateTempWorkspaceDirMode(mode: number): void;
|
|
17
|
+
export declare function assertTrustedTempWorkspaceDirectory(stat: Pick<BigIntStats, "uid" | "mode"> | Pick<Stats, "uid" | "mode">, uid: number | undefined, child?: boolean): void;
|
|
5
18
|
export declare function assertTempWorkspaceChildState(stat: BigIntStats | Stats, ownerUid: number | undefined): void;
|
|
6
19
|
export declare function validateInitialTempWorkspaceChild(stat: BigIntStats, ownerUid: number | undefined, mode: number): boolean;
|
|
7
20
|
export declare function childHasRequestedMode(stat: BigIntStats | Stats, mode: number): boolean;
|
|
8
21
|
export declare function admitTempWorkspaceChild(dir: string, expected: BigIntStats, parent: TempWorkspaceRootAdmission, mode: number): Promise<void> | undefined;
|
|
9
22
|
export declare function admitTempWorkspaceChildSync(dir: string, expected: BigIntStats, parent: TempWorkspaceRootAdmission, mode: number): void;
|
|
10
|
-
export declare function admitRetainedTempWorkspaceChild(retained: TempWorkspaceRetainedChild, needsModeInitialization: boolean, parent: TempWorkspaceRootAdmission, mode: number): Promise<void> | undefined;
|
|
11
|
-
export declare function admitRetainedTempWorkspaceChildSync(retained: TempWorkspaceRetainedChild, needsModeInitialization: boolean, parent: TempWorkspaceRootAdmission, mode: number): void;
|
|
12
23
|
export declare function validateAdmittedTempWorkspaceChild(current: TempWorkspaceIdentityStat, ownerUid: number | undefined, mode: number): TempWorkspaceIdentityStat;
|
|
13
|
-
//# sourceMappingURL=temp-workspace-child-admission.d.ts.map
|
|
@@ -1,8 +1,76 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import fsSync, {} from "node:fs";
|
|
2
|
+
import { inspectDirectoryIdentitySync, observeDirectoryIdentitySync } from "./directory-guard.js";
|
|
2
3
|
import { pinNodeDirectoryForMode, pinNodeDirectoryForModeSync } from "./directory-mode-node.js";
|
|
3
4
|
import { FsSafeError } from "./errors.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
5
|
+
import { recordFileObservationFailure } from "./file-observation.js";
|
|
6
|
+
import { inspectFileIdentitySync } from "./strict-file-identity.js";
|
|
7
|
+
export const TEMP_WORKSPACE_NUMERIC_IDENTITY_REPLAY = process.platform === "linux" || process.platform === "darwin";
|
|
8
|
+
export function projectTempWorkspaceNumericIdentity(identity) {
|
|
9
|
+
const dev = Number(identity.dev);
|
|
10
|
+
const ino = Number(identity.ino);
|
|
11
|
+
if (!Number.isSafeInteger(dev) || dev < 0 || BigInt(dev) !== identity.dev ||
|
|
12
|
+
!Number.isSafeInteger(ino) || ino < 0 || BigInt(ino) !== identity.ino) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
return Object.freeze({ dev, ino });
|
|
16
|
+
}
|
|
17
|
+
function identityMismatch() {
|
|
18
|
+
const error = new FsSafeError("path-mismatch", "file identity changed or could not be verified");
|
|
19
|
+
recordFileObservationFailure(error, "identity");
|
|
20
|
+
throw error;
|
|
21
|
+
}
|
|
22
|
+
function inspectNumericIdentity(current, expected) {
|
|
23
|
+
if (!Number.isSafeInteger(current.dev) || current.dev < 0 || current.dev !== expected.dev ||
|
|
24
|
+
!Number.isSafeInteger(current.ino) || current.ino < 0 || current.ino !== expected.ino) {
|
|
25
|
+
identityMismatch();
|
|
26
|
+
}
|
|
27
|
+
return current;
|
|
28
|
+
}
|
|
29
|
+
export function inspectTempWorkspaceDescriptorIdentitySync(fd, expected, numeric) {
|
|
30
|
+
// A malformed or mismatched numeric observation is definite and never
|
|
31
|
+
// retried. Unsafe receipts and other platforms retain exact replay.
|
|
32
|
+
if (TEMP_WORKSPACE_NUMERIC_IDENTITY_REPLAY && numeric) {
|
|
33
|
+
return inspectNumericIdentity(fsSync.fstatSync(fd), numeric);
|
|
34
|
+
}
|
|
35
|
+
return inspectFileIdentitySync(() => fsSync.fstatSync(fd, { bigint: true }), expected);
|
|
36
|
+
}
|
|
37
|
+
export function inspectTempWorkspaceDirectoryIdentitySync(dir, expected, numeric) {
|
|
38
|
+
if (TEMP_WORKSPACE_NUMERIC_IDENTITY_REPLAY && numeric) {
|
|
39
|
+
return inspectNumericIdentity(observeDirectoryIdentitySync(dir), numeric);
|
|
40
|
+
}
|
|
41
|
+
return inspectFileIdentitySync(() => observeDirectoryIdentitySync(dir, { bigint: true }), expected);
|
|
42
|
+
}
|
|
43
|
+
export function validateTempWorkspaceDirMode(mode) {
|
|
44
|
+
if (!Number.isInteger(mode) || mode < 0 || mode > 0o7777) {
|
|
45
|
+
throw new FsSafeError("insecure-permissions", "temp workspace dirMode must be permission bits");
|
|
46
|
+
}
|
|
47
|
+
if (process.platform !== "win32" && (mode & 0o022) !== 0) {
|
|
48
|
+
throw new FsSafeError("insecure-permissions", "temp workspace must not be group/world writable");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function assertTrustedTempWorkspaceDirectory(stat, uid, child = false) {
|
|
52
|
+
if (uid === undefined)
|
|
53
|
+
return;
|
|
54
|
+
const ownedByUser = typeof stat.uid === "bigint" ? stat.uid === BigInt(uid) : stat.uid === uid;
|
|
55
|
+
const ownedByRoot = typeof stat.uid === "bigint" ? stat.uid === 0n : stat.uid === 0;
|
|
56
|
+
if (!ownedByUser && (child || !ownedByRoot)) {
|
|
57
|
+
throw new FsSafeError("not-owned", "temp workspace directory has an untrusted owner");
|
|
58
|
+
}
|
|
59
|
+
// A root/current-user-owned sticky directory protects children owned by us,
|
|
60
|
+
// including the usual shared system temp directory. Never chmod that parent.
|
|
61
|
+
const writable = typeof stat.mode === "bigint"
|
|
62
|
+
? (stat.mode & 18n) !== 0n
|
|
63
|
+
: Number.isSafeInteger(stat.mode) && stat.mode >= 0 && (stat.mode & 0o022) !== 0;
|
|
64
|
+
const sticky = typeof stat.mode === "bigint"
|
|
65
|
+
? (stat.mode & 512n) !== 0n
|
|
66
|
+
: Number.isSafeInteger(stat.mode) && stat.mode >= 0 && (stat.mode & 0o1000) !== 0;
|
|
67
|
+
if (typeof stat.mode !== "bigint" && (!Number.isSafeInteger(stat.mode) || stat.mode < 0)) {
|
|
68
|
+
throw new FsSafeError("insecure-permissions", "temp workspace directory permissions are invalid");
|
|
69
|
+
}
|
|
70
|
+
if (writable && (child || !sticky)) {
|
|
71
|
+
throw new FsSafeError("insecure-permissions", "temp workspace directory is group/world writable without sticky protection");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
6
74
|
const WINDOWS = process.platform === "win32";
|
|
7
75
|
export function assertTempWorkspaceChildState(stat, ownerUid) {
|
|
8
76
|
const exactIdentity = typeof stat.dev === "bigint" && typeof stat.ino === "bigint" &&
|
|
@@ -74,18 +142,6 @@ export function admitTempWorkspaceChildSync(dir, expected, parent, mode) {
|
|
|
74
142
|
owner.close();
|
|
75
143
|
}
|
|
76
144
|
}
|
|
77
|
-
export function admitRetainedTempWorkspaceChild(retained, needsModeInitialization, parent, mode) {
|
|
78
|
-
if (!needsModeInitialization)
|
|
79
|
-
return undefined;
|
|
80
|
-
return retained.initializeMode(mode, parent.ownerUid, parent.assertCurrent);
|
|
81
|
-
}
|
|
82
|
-
export function admitRetainedTempWorkspaceChildSync(retained, needsModeInitialization, parent, mode) {
|
|
83
|
-
if (!needsModeInitialization) {
|
|
84
|
-
retained.discardInitialReceipt();
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
retained.initializeModeSync(mode, parent.ownerUid, parent.assertCurrent);
|
|
88
|
-
}
|
|
89
145
|
export function validateAdmittedTempWorkspaceChild(current, ownerUid, mode) {
|
|
90
146
|
assertTempWorkspaceChildState(current, ownerUid);
|
|
91
147
|
if (!childHasRequestedMode(current, mode)) {
|
|
@@ -1,18 +1,13 @@
|
|
|
1
1
|
import fsSync from "node:fs";
|
|
2
2
|
import type { FileIdentityStat } from "./file-identity.js";
|
|
3
3
|
import type { TempWorkspaceRootAdmission } from "./temp-workspace-admission.js";
|
|
4
|
-
import { type TempWorkspaceIdentityStat } from "./temp-workspace-
|
|
4
|
+
import { type TempWorkspaceIdentityStat } from "./temp-workspace-child-admission.js";
|
|
5
5
|
type DirectoryDescriptorAccess = "read" | "search";
|
|
6
6
|
export type RetainedDirectory = {
|
|
7
7
|
fd: number;
|
|
8
8
|
access: DirectoryDescriptorAccess;
|
|
9
9
|
receipt: Readonly<{
|
|
10
10
|
path: string;
|
|
11
|
-
realPath: string;
|
|
12
|
-
identity: Readonly<{
|
|
13
|
-
dev: bigint;
|
|
14
|
-
ino: bigint;
|
|
15
|
-
}>;
|
|
16
11
|
}>;
|
|
17
12
|
};
|
|
18
13
|
export type RetainedChildDirectory = {
|
|
@@ -45,4 +40,3 @@ export declare class TempWorkspaceRetainedChild {
|
|
|
45
40
|
close(): void;
|
|
46
41
|
}
|
|
47
42
|
export {};
|
|
48
|
-
//# sourceMappingURL=temp-workspace-descriptor.d.ts.map
|
|
@@ -5,8 +5,7 @@ import { assertOwnedDirectory } from "./directory-mode-owner.js";
|
|
|
5
5
|
import { FsSafeError } from "./errors.js";
|
|
6
6
|
import { assertNoWindowsPathAlias, pathForWindowsFilesystem, resolvePathPreservingWindowsRoot, } from "./windows-path-alias.js";
|
|
7
7
|
import { inspectFileIdentitySync } from "./strict-file-identity.js";
|
|
8
|
-
import { assertTempWorkspaceChildState, childHasRequestedMode, validateAdmittedTempWorkspaceChild, } from "./temp-workspace-child-admission.js";
|
|
9
|
-
import { inspectTempWorkspaceDescriptorIdentitySync, inspectTempWorkspaceDirectoryIdentitySync, projectTempWorkspaceNumericIdentity, TEMP_WORKSPACE_NUMERIC_IDENTITY_REPLAY, } from "./temp-workspace-identity.js";
|
|
8
|
+
import { assertTempWorkspaceChildState, childHasRequestedMode, validateAdmittedTempWorkspaceChild, inspectTempWorkspaceDescriptorIdentitySync, inspectTempWorkspaceDirectoryIdentitySync, projectTempWorkspaceNumericIdentity, TEMP_WORKSPACE_NUMERIC_IDENTITY_REPLAY, } from "./temp-workspace-child-admission.js";
|
|
10
9
|
function assertRetainedChildDirectory(stat) {
|
|
11
10
|
if (stat.isSymbolicLink() || !stat.isDirectory()) {
|
|
12
11
|
throw new FsSafeError("not-file", "temp workspace child must be a real directory");
|
|
@@ -80,8 +79,6 @@ export function openTempWorkspaceCleanupParent(root, admission) {
|
|
|
80
79
|
access: opened.access,
|
|
81
80
|
receipt: Object.freeze({
|
|
82
81
|
path: pathname,
|
|
83
|
-
realPath: admission.realPath,
|
|
84
|
-
identity: admission.identity,
|
|
85
82
|
}),
|
|
86
83
|
};
|
|
87
84
|
}
|
|
@@ -15,10 +15,10 @@ export declare class TempWorkspaceCleanupCapability {
|
|
|
15
15
|
assertAncestryCurrent(): void;
|
|
16
16
|
close(): void;
|
|
17
17
|
}
|
|
18
|
+
export declare function throwTempWorkspaceCreationFailure(error: unknown, retainedChild: TempWorkspaceRetainedChild | undefined, capability: TempWorkspaceCleanupCapability, owner?: TempWorkspaceCleanupOwner, label?: string): never;
|
|
18
19
|
export declare class TempWorkspaceCleanupOwner {
|
|
19
20
|
#private;
|
|
20
21
|
constructor(retained: TempWorkspaceRetainedChild, capability: TempWorkspaceCleanupCapability, retainDescriptor: boolean);
|
|
21
22
|
cleanup(): Promise<TempWorkspaceCleanupResult>;
|
|
22
23
|
cleanupSync(): TempWorkspaceCleanupResult;
|
|
23
24
|
}
|
|
24
|
-
//# sourceMappingURL=temp-workspace-owner.d.ts.map
|
|
@@ -158,6 +158,36 @@ export class TempWorkspaceCleanupCapability {
|
|
|
158
158
|
fsSync.closeSync(this.parent.fd);
|
|
159
159
|
}
|
|
160
160
|
}
|
|
161
|
+
export function throwTempWorkspaceCreationFailure(error, retainedChild, capability, owner, label = "temp workspace") {
|
|
162
|
+
try {
|
|
163
|
+
if (owner)
|
|
164
|
+
owner.cleanupSync();
|
|
165
|
+
else {
|
|
166
|
+
const closeErrors = [];
|
|
167
|
+
try {
|
|
168
|
+
retainedChild?.close();
|
|
169
|
+
}
|
|
170
|
+
catch (closeError) {
|
|
171
|
+
closeErrors.push(closeError);
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
capability.close();
|
|
175
|
+
}
|
|
176
|
+
catch (closeError) {
|
|
177
|
+
closeErrors.push(closeError);
|
|
178
|
+
}
|
|
179
|
+
if (closeErrors.length === 1)
|
|
180
|
+
throw closeErrors[0];
|
|
181
|
+
if (closeErrors.length > 1) {
|
|
182
|
+
throw new AggregateError(closeErrors, `${label} admission descriptor close failed`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
catch (cleanupError) {
|
|
187
|
+
throw new AggregateError([error, cleanupError], `${label} creation and cleanup both failed`);
|
|
188
|
+
}
|
|
189
|
+
throw error;
|
|
190
|
+
}
|
|
161
191
|
export class TempWorkspaceCleanupOwner {
|
|
162
192
|
#dir;
|
|
163
193
|
#identity;
|
|
@@ -294,22 +324,19 @@ export class TempWorkspaceCleanupOwner {
|
|
|
294
324
|
await beforeNativeRemoval(quarantine.path);
|
|
295
325
|
return this.#mapRemoval(await this.#capability.binding.removeOwnedTree(this.#capability.parent.fd, quarantine.name, this.#directory.fd));
|
|
296
326
|
}
|
|
297
|
-
let removalFailure;
|
|
298
327
|
try {
|
|
299
328
|
this.#assertQuarantine(quarantine);
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
329
|
+
}
|
|
330
|
+
catch {
|
|
331
|
+
return "indeterminate";
|
|
332
|
+
}
|
|
333
|
+
// Removal failures propagate unchanged; only authority uncertainty becomes a receipt.
|
|
334
|
+
await fs.rm(quarantine.path, { recursive: true, force: true });
|
|
335
|
+
try {
|
|
307
336
|
this.#capability.assertCurrent();
|
|
308
337
|
return "removed";
|
|
309
338
|
}
|
|
310
|
-
catch
|
|
311
|
-
if (removalFailure !== undefined)
|
|
312
|
-
throw removalFailure.error;
|
|
339
|
+
catch {
|
|
313
340
|
return "indeterminate";
|
|
314
341
|
}
|
|
315
342
|
}
|
|
@@ -318,22 +345,18 @@ export class TempWorkspaceCleanupOwner {
|
|
|
318
345
|
getFsSafeTestHooks()?.beforeTempWorkspaceNativeRemovalSync?.(quarantine.path);
|
|
319
346
|
return this.#mapRemoval(this.#capability.binding.removeOwnedTreeSync(this.#capability.parent.fd, quarantine.name, this.#directory.fd));
|
|
320
347
|
}
|
|
321
|
-
let removalFailure;
|
|
322
348
|
try {
|
|
323
349
|
this.#assertQuarantine(quarantine);
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
}
|
|
350
|
+
}
|
|
351
|
+
catch {
|
|
352
|
+
return "indeterminate";
|
|
353
|
+
}
|
|
354
|
+
fsSync.rmSync(quarantine.path, { recursive: true, force: true });
|
|
355
|
+
try {
|
|
331
356
|
this.#capability.assertCurrent();
|
|
332
357
|
return "removed";
|
|
333
358
|
}
|
|
334
|
-
catch
|
|
335
|
-
if (removalFailure !== undefined)
|
|
336
|
-
throw removalFailure.error;
|
|
359
|
+
catch {
|
|
337
360
|
return "indeterminate";
|
|
338
361
|
}
|
|
339
362
|
}
|
package/dist/temp.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
export { tempWorkspace, type TempWorkspace, type TempWorkspaceOptions, type TempWorkspaceCleanupResult, type TempWorkspaceCleanupSafety, tempWorkspaceSync, type TempWorkspaceSync, withTempWorkspace, withTempWorkspaceSync, } from "./private-temp-workspace.js";
|
|
2
2
|
export type { TempPathIdentityReceipt } from "./temp-cleanup.js";
|
|
3
3
|
export { resolveSecureTempRoot, type ResolveSecureTempRootOptions, type SecureTempRootDescriptorAdapter, } from "./secure-temp-dir.js";
|
|
4
|
-
//# sourceMappingURL=temp.d.ts.map
|