@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/directory-guard.js
CHANGED
|
@@ -30,6 +30,12 @@ export function assertDirectoryIdentitySync(observedPath, expected) {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
export async function createAsyncDirectoryGuard(dir, options) {
|
|
33
|
+
return captureDirectoryGuard(dir, "native", options);
|
|
34
|
+
}
|
|
35
|
+
export function createSyncDirectoryGuard(dir) {
|
|
36
|
+
return captureDirectoryGuard(dir, "normalized");
|
|
37
|
+
}
|
|
38
|
+
function captureDirectoryGuard(dir, mode, options) {
|
|
33
39
|
const operationPath = directoryOperationPath(dir);
|
|
34
40
|
const stat = options?.bigint
|
|
35
41
|
? inspectDirectoryIdentityAtPathSync(operationPath, undefined, options.initial)
|
|
@@ -37,11 +43,17 @@ export async function createAsyncDirectoryGuard(dir, options) {
|
|
|
37
43
|
if (stat.isSymbolicLink() || !stat.isDirectory()) {
|
|
38
44
|
throw directoryComponentNotDirectoryError();
|
|
39
45
|
}
|
|
40
|
-
const realPath = realpathSync.native(operationPath);
|
|
46
|
+
const realPath = mode === "native" ? realpathSync.native(operationPath) : realpathSync(operationPath);
|
|
41
47
|
assertNoWindowsPathAlias(realPath, "filesystem");
|
|
42
48
|
return { dir, realPath, stat };
|
|
43
49
|
}
|
|
44
50
|
export async function assertAsyncDirectoryGuard(guard) {
|
|
51
|
+
assertDirectoryGuard(guard, "native");
|
|
52
|
+
}
|
|
53
|
+
export function assertSyncDirectoryGuard(guard) {
|
|
54
|
+
assertDirectoryGuard(guard, "normalized");
|
|
55
|
+
}
|
|
56
|
+
function assertDirectoryGuard(guard, mode) {
|
|
45
57
|
const dir = guard.dir;
|
|
46
58
|
const operationPath = directoryOperationPath(dir);
|
|
47
59
|
const expectedRealPath = guard.realPath;
|
|
@@ -57,71 +69,32 @@ export async function assertAsyncDirectoryGuard(guard) {
|
|
|
57
69
|
if (stat.isSymbolicLink() || !stat.isDirectory()) {
|
|
58
70
|
throw directoryComponentNotDirectoryError();
|
|
59
71
|
}
|
|
60
|
-
|
|
72
|
+
// Native guards check identity first; normalized numeric guards preserve
|
|
73
|
+
// canonicalization errors before their final identity comparison.
|
|
74
|
+
if (mode === "native" && !sameFileIdentity(stat, expectedIdentity)) {
|
|
61
75
|
throw new FsSafeError("path-mismatch", "directory changed during operation");
|
|
62
76
|
}
|
|
63
|
-
const realPath =
|
|
64
|
-
assertNoWindowsPathAlias(realPath, "filesystem");
|
|
65
|
-
if (realPath !== expectedRealPath) {
|
|
66
|
-
throw new FsSafeError("path-mismatch", "directory changed during operation");
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
export function createSyncDirectoryGuard(dir) {
|
|
70
|
-
const operationPath = directoryOperationPath(dir);
|
|
71
|
-
const stat = fsSync.lstatSync(operationPath);
|
|
72
|
-
if (stat.isSymbolicLink() || !stat.isDirectory()) {
|
|
73
|
-
throw directoryComponentNotDirectoryError();
|
|
74
|
-
}
|
|
75
|
-
const realPath = realpathSync(operationPath);
|
|
76
|
-
assertNoWindowsPathAlias(realPath, "filesystem");
|
|
77
|
-
return { dir, realPath, stat };
|
|
78
|
-
}
|
|
79
|
-
export function assertSyncDirectoryGuard(guard) {
|
|
80
|
-
const dir = guard.dir;
|
|
81
|
-
const operationPath = directoryOperationPath(dir);
|
|
82
|
-
const expectedRealPath = guard.realPath;
|
|
83
|
-
assertNoWindowsPathAlias(expectedRealPath, "filesystem");
|
|
84
|
-
const expectedStat = guard.stat;
|
|
85
|
-
const expectedIdentity = { dev: expectedStat.dev, ino: expectedStat.ino };
|
|
86
|
-
const stat = typeof expectedIdentity.dev === "bigint" && typeof expectedIdentity.ino === "bigint"
|
|
87
|
-
? inspectDirectoryIdentityAtPathSync(operationPath, { dev: expectedIdentity.dev, ino: expectedIdentity.ino })
|
|
88
|
-
: fsSync.lstatSync(operationPath);
|
|
89
|
-
if (stat.isSymbolicLink() || !stat.isDirectory()) {
|
|
90
|
-
throw directoryComponentNotDirectoryError();
|
|
91
|
-
}
|
|
92
|
-
const realPath = typeof expectedIdentity.ino === "bigint"
|
|
77
|
+
const realPath = mode === "native" || typeof expectedIdentity.ino === "bigint"
|
|
93
78
|
? realpathSync.native(operationPath) : realpathSync(operationPath);
|
|
94
79
|
assertNoWindowsPathAlias(realPath, "filesystem");
|
|
95
|
-
if (!sameFileIdentity(stat, expectedIdentity) || realPath !== expectedRealPath) {
|
|
80
|
+
if ((mode === "normalized" && !sameFileIdentity(stat, expectedIdentity)) || realPath !== expectedRealPath) {
|
|
96
81
|
throw new FsSafeError("path-mismatch", "directory changed during operation");
|
|
97
82
|
}
|
|
98
83
|
}
|
|
99
84
|
export async function createNearestExistingDirectoryGuard(rootReal, targetPath, options = { bigint: false }) {
|
|
100
|
-
|
|
101
|
-
assertNoWindowsPathAlias(targetPath, "filesystem");
|
|
102
|
-
let current = resolvePathPreservingWindowsRoot(targetPath);
|
|
103
|
-
const root = resolvePathPreservingWindowsRoot(rootReal);
|
|
104
|
-
while (current !== root) {
|
|
105
|
-
try {
|
|
106
|
-
return await createAsyncDirectoryGuard(current, options);
|
|
107
|
-
}
|
|
108
|
-
catch (error) {
|
|
109
|
-
if (!isNotFoundPathError(error)) {
|
|
110
|
-
throw error;
|
|
111
|
-
}
|
|
112
|
-
current = path.dirname(current);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return await createAsyncDirectoryGuard(root, options);
|
|
85
|
+
return nearestExistingDirectoryGuard(rootReal, targetPath, "native", options);
|
|
116
86
|
}
|
|
117
87
|
export function createNearestExistingSyncDirectoryGuard(rootReal, targetPath) {
|
|
88
|
+
return nearestExistingDirectoryGuard(rootReal, targetPath, "normalized");
|
|
89
|
+
}
|
|
90
|
+
function nearestExistingDirectoryGuard(rootReal, targetPath, mode, options) {
|
|
118
91
|
assertNoWindowsPathAlias(rootReal, "filesystem");
|
|
119
92
|
assertNoWindowsPathAlias(targetPath, "filesystem");
|
|
120
93
|
let current = resolvePathPreservingWindowsRoot(targetPath);
|
|
121
94
|
const root = resolvePathPreservingWindowsRoot(rootReal);
|
|
122
95
|
while (current !== root) {
|
|
123
96
|
try {
|
|
124
|
-
return
|
|
97
|
+
return captureDirectoryGuard(current, mode, options);
|
|
125
98
|
}
|
|
126
99
|
catch (error) {
|
|
127
100
|
if (!isNotFoundPathError(error)) {
|
|
@@ -130,15 +103,11 @@ export function createNearestExistingSyncDirectoryGuard(rootReal, targetPath) {
|
|
|
130
103
|
current = path.dirname(current);
|
|
131
104
|
}
|
|
132
105
|
}
|
|
133
|
-
return
|
|
106
|
+
return captureDirectoryGuard(root, mode, options);
|
|
134
107
|
}
|
|
135
108
|
// Recovery receipts must retain every identity bit, including on Windows.
|
|
136
109
|
export async function inspectDirectoryIdentity(dir, expected) {
|
|
137
|
-
|
|
138
|
-
const expectedIdentity = expected === undefined
|
|
139
|
-
? undefined
|
|
140
|
-
: { dev: expected.dev, ino: expected.ino };
|
|
141
|
-
return inspectDirectoryIdentityAtPathSync(operationPath, expectedIdentity);
|
|
110
|
+
return inspectDirectoryIdentitySync(dir, expected);
|
|
142
111
|
}
|
|
143
112
|
function directoryOperationPath(dir) {
|
|
144
113
|
assertNoWindowsPathAlias(dir, "filesystem");
|
|
@@ -95,7 +95,12 @@ export async function pinNodeDirectoryForMode(dirPath, options = {}) {
|
|
|
95
95
|
return owner;
|
|
96
96
|
}
|
|
97
97
|
catch (error) {
|
|
98
|
-
|
|
98
|
+
try {
|
|
99
|
+
await handle.close();
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// Preserve the initial admission failure before ownership transfers.
|
|
103
|
+
}
|
|
99
104
|
throw error;
|
|
100
105
|
}
|
|
101
106
|
}
|
|
@@ -193,7 +198,12 @@ export function pinNodeDirectoryForModeSync(dirPath, options = {}) {
|
|
|
193
198
|
};
|
|
194
199
|
}
|
|
195
200
|
catch (error) {
|
|
196
|
-
|
|
201
|
+
try {
|
|
202
|
+
fsSync.closeSync(fd);
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
// Preserve the initial admission failure before ownership transfers.
|
|
206
|
+
}
|
|
197
207
|
throw error;
|
|
198
208
|
}
|
|
199
209
|
}
|
|
@@ -21,4 +21,3 @@ export declare function createDirectoryReceiptFromIdentity(pathname: string, rea
|
|
|
21
21
|
export declare function createDirectoryReceiptSync(directoryPath: string, label: string, canonicalize?: (pathname: string) => string): DirectoryReceipt;
|
|
22
22
|
export declare function assertDirectoryReceiptCurrentSync(receipt: DirectoryReceipt, label: string, canonicalize?: (pathname: string) => string): void;
|
|
23
23
|
export {};
|
|
24
|
-
//# sourceMappingURL=directory-receipt.d.ts.map
|
package/dist/durability.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { ensureDurableDirectory, pinDirectory, syncDirectory, syncDirectoryBestEffort, syncDirectoryBestEffortSync, syncDirectorySync, type DirectoryReceipt, type DirectorySyncOutcome, type DurableDirectoryReceipt, type EnsureDurableDirectoryOptions, type PinnedDirectory, } from "./directory-durability.js";
|
|
2
|
-
export { isHardlinkFallbackError, publishFileExclusive, type PublishFileExclusiveResult, type PublishFileExclusiveStrategy,
|
|
2
|
+
export { isHardlinkFallbackError, publishFileExclusive, type PublishFileExclusiveResult, type PublishFileExclusiveStrategy, } from "./publish-file.js";
|
|
3
|
+
export type { PublishFileExclusiveCleanup, PublishFileExclusiveDirectorySyncFailure, PublishFileExclusiveFailureDetails, PublishFileExclusiveFailurePhase, PublishFileExclusiveSyncFailurePolicy, } from "./publish-file-failure.js";
|
|
3
4
|
export { sha256File, sha256FileSync, type Sha256FileInput, type Sha256FileSyncInput, type Sha256FileOptions, type Sha256FileResult, } from "./file-hash.js";
|
|
4
|
-
//# sourceMappingURL=durability.d.ts.map
|
package/dist/effective-uid.d.ts
CHANGED
package/dist/error-detail.d.ts
CHANGED
package/dist/errors.d.ts
CHANGED
package/dist/file-cleanup.d.ts
CHANGED
package/dist/file-contents.d.ts
CHANGED
|
@@ -3,4 +3,3 @@ export type SameFileContentsOptions = {
|
|
|
3
3
|
};
|
|
4
4
|
/** Compares borrowed regular files from offset zero without moving or closing either descriptor. */
|
|
5
5
|
export declare function sameFileContentsSync(leftFd: number, rightFd: number, options?: SameFileContentsOptions): boolean;
|
|
6
|
-
//# sourceMappingURL=file-contents.d.ts.map
|
package/dist/file-hash.d.ts
CHANGED
|
@@ -14,4 +14,3 @@ export declare function hashFileHandle(handle: FileHandle, native?: NativeBindin
|
|
|
14
14
|
export declare function sha256File(input: Sha256FileInput, options?: Sha256FileOptions): Promise<Sha256FileResult>;
|
|
15
15
|
/** Hash synchronously from offset zero, retaining ownership and position of a borrowed fd. */
|
|
16
16
|
export declare function sha256FileSync(input: Sha256FileSyncInput, options?: Sha256FileOptions): Sha256FileResult;
|
|
17
|
-
//# sourceMappingURL=file-hash.d.ts.map
|
package/dist/file-hash.js
CHANGED
|
@@ -1,3 +1,55 @@
|
|
|
1
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
2
|
+
if (value !== null && value !== void 0) {
|
|
3
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
4
|
+
var dispose, inner;
|
|
5
|
+
if (async) {
|
|
6
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
7
|
+
dispose = value[Symbol.asyncDispose];
|
|
8
|
+
}
|
|
9
|
+
if (dispose === void 0) {
|
|
10
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
11
|
+
dispose = value[Symbol.dispose];
|
|
12
|
+
if (async) inner = dispose;
|
|
13
|
+
}
|
|
14
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
15
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
16
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
17
|
+
}
|
|
18
|
+
else if (async) {
|
|
19
|
+
env.stack.push({ async: true });
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
24
|
+
return function (env) {
|
|
25
|
+
function fail(e) {
|
|
26
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
27
|
+
env.hasError = true;
|
|
28
|
+
}
|
|
29
|
+
var r, s = 0;
|
|
30
|
+
function next() {
|
|
31
|
+
while (r = env.stack.pop()) {
|
|
32
|
+
try {
|
|
33
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
34
|
+
if (r.dispose) {
|
|
35
|
+
var result = r.dispose.call(r.value);
|
|
36
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
37
|
+
}
|
|
38
|
+
else s |= 1;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
fail(e);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
45
|
+
if (env.hasError) throw env.error;
|
|
46
|
+
}
|
|
47
|
+
return next();
|
|
48
|
+
};
|
|
49
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
50
|
+
var e = new Error(message);
|
|
51
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
52
|
+
});
|
|
1
53
|
import { createHash } from "node:crypto";
|
|
2
54
|
import fsSync from "node:fs";
|
|
3
55
|
import fs from "node:fs/promises";
|
|
@@ -7,58 +59,99 @@ import { getNativeBinding } from "./native.js";
|
|
|
7
59
|
import { resolveReadOpenFlags } from "./read-open-flags.js";
|
|
8
60
|
import { inspectFileIdentity, inspectFileIdentitySync } from "./strict-file-identity.js";
|
|
9
61
|
import { assertNoWindowsPathAlias } from "./windows-path-alias.js";
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
62
|
+
// Idle storage is bounded independently of caller concurrency. A pending read
|
|
63
|
+
// retains its exclusive borrow until the async hasher settles.
|
|
64
|
+
const hashScratchBuffers = [];
|
|
65
|
+
function takeHashScratch(size) {
|
|
66
|
+
const index = hashScratchBuffers.findIndex((buffer) => buffer.length >= size);
|
|
67
|
+
return index < 0 ? Buffer.allocUnsafe(size) : hashScratchBuffers.splice(index, 1)[0];
|
|
68
|
+
}
|
|
69
|
+
class HashScratch {
|
|
70
|
+
#storage;
|
|
71
|
+
buffer;
|
|
72
|
+
constructor(size) {
|
|
73
|
+
this.#storage = takeHashScratch(size);
|
|
74
|
+
this.buffer = this.#storage.subarray(0, size);
|
|
15
75
|
}
|
|
16
|
-
|
|
17
|
-
|
|
76
|
+
grow(size) {
|
|
77
|
+
const storage = takeHashScratch(size);
|
|
78
|
+
this[Symbol.dispose]();
|
|
79
|
+
this.#storage = storage;
|
|
80
|
+
return this.buffer = storage.subarray(0, size);
|
|
18
81
|
}
|
|
19
|
-
|
|
20
|
-
//
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
catch (error) {
|
|
28
|
-
// N-API settles only after compute stops; never race descriptor cleanup.
|
|
29
|
-
signal?.throwIfAborted();
|
|
30
|
-
if (error?.code === "too-large") {
|
|
31
|
-
throw new FsSafeError("too-large", `SHA-256 input exceeds ${maxBytes} bytes`, { cause: error });
|
|
32
|
-
}
|
|
33
|
-
throw error;
|
|
34
|
-
}
|
|
35
|
-
finally {
|
|
36
|
-
// Node retains composite signals while N-API's abort listener is attached.
|
|
37
|
-
if (nativeSignal)
|
|
38
|
-
nativeSignal.onabort = null;
|
|
39
|
-
}
|
|
82
|
+
[Symbol.dispose]() {
|
|
83
|
+
// Clear the used view before retention; a larger unused tail was cleared
|
|
84
|
+
// by its previous borrower, without making tiny hashes clear large buffers.
|
|
85
|
+
this.buffer.fill(0);
|
|
86
|
+
hashScratchBuffers.push(this.#storage);
|
|
87
|
+
hashScratchBuffers.sort((left, right) => left.length - right.length);
|
|
88
|
+
if (hashScratchBuffers.length > 4)
|
|
89
|
+
hashScratchBuffers.shift();
|
|
40
90
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
signal?.throwIfAborted();
|
|
46
|
-
const length = Math.min(buffer.length, maxBytes - position + 1);
|
|
47
|
-
const { bytesRead } = await handle.read(buffer, 0, length, position);
|
|
91
|
+
}
|
|
92
|
+
export async function hashFileHandle(handle, native = getNativeBinding(), { maxBytes = Infinity, signal } = {}) {
|
|
93
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
94
|
+
try {
|
|
48
95
|
signal?.throwIfAborted();
|
|
49
|
-
|
|
96
|
+
const stat = fsSync.fstatSync(handle.fd);
|
|
97
|
+
if (!stat.isFile()) {
|
|
98
|
+
throw new FsSafeError("not-file", "SHA-256 input is not a regular file");
|
|
99
|
+
}
|
|
100
|
+
if (stat.size > maxBytes) {
|
|
50
101
|
throw new FsSafeError("too-large", `SHA-256 input exceeds ${maxBytes} bytes`);
|
|
51
102
|
}
|
|
52
|
-
if (
|
|
53
|
-
|
|
103
|
+
if (native) {
|
|
104
|
+
// A completed N-API task can mask later aborts on the same signal.
|
|
105
|
+
const nativeSignal = signal ? AbortSignal.any([signal]) : undefined;
|
|
106
|
+
try {
|
|
107
|
+
const result = await native.sha256File(handle.fd, Number.isFinite(maxBytes) ? maxBytes : undefined, nativeSignal);
|
|
108
|
+
signal?.throwIfAborted();
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
// N-API settles only after compute stops; never race descriptor cleanup.
|
|
113
|
+
signal?.throwIfAborted();
|
|
114
|
+
if (error?.code === "too-large") {
|
|
115
|
+
throw new FsSafeError("too-large", `SHA-256 input exceeds ${maxBytes} bytes`, { cause: error });
|
|
116
|
+
}
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
// Node retains composite signals while N-API's abort listener is attached.
|
|
121
|
+
if (nativeSignal)
|
|
122
|
+
nativeSignal.onabort = null;
|
|
123
|
+
}
|
|
54
124
|
}
|
|
55
|
-
hash
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
125
|
+
const hash = createHash("sha256");
|
|
126
|
+
const scratch = __addDisposableResource(env_1, new HashScratch(Math.min(256 * 1024, Math.max(1, stat.size + 1), maxBytes + 1)), false);
|
|
127
|
+
let buffer = scratch.buffer;
|
|
128
|
+
let position = 0;
|
|
129
|
+
while (true) {
|
|
130
|
+
signal?.throwIfAborted();
|
|
131
|
+
const length = Math.min(buffer.length, maxBytes - position + 1);
|
|
132
|
+
const { bytesRead } = await handle.read(buffer, 0, length, position);
|
|
133
|
+
signal?.throwIfAborted();
|
|
134
|
+
if (bytesRead > maxBytes - position) {
|
|
135
|
+
throw new FsSafeError("too-large", `SHA-256 input exceeds ${maxBytes} bytes`);
|
|
136
|
+
}
|
|
137
|
+
if (bytesRead === 0) {
|
|
138
|
+
return { bytes: position, digest: hash.digest("hex") };
|
|
139
|
+
}
|
|
140
|
+
hash.update(buffer.subarray(0, bytesRead));
|
|
141
|
+
position += bytesRead;
|
|
142
|
+
// A full small buffer can mean growth or a virtual file with an unhelpful size.
|
|
143
|
+
if (bytesRead === buffer.length && buffer.length < 64 * 1024) {
|
|
144
|
+
buffer = scratch.grow(Math.min(64 * 1024, maxBytes + 1));
|
|
145
|
+
}
|
|
60
146
|
}
|
|
61
147
|
}
|
|
148
|
+
catch (e_1) {
|
|
149
|
+
env_1.error = e_1;
|
|
150
|
+
env_1.hasError = true;
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
__disposeResources(env_1);
|
|
154
|
+
}
|
|
62
155
|
}
|
|
63
156
|
function hashPathIdentity(filePath, afterOpen = false) {
|
|
64
157
|
const stat = fsSync.lstatSync(filePath, { bigint: true });
|
|
@@ -123,34 +216,45 @@ export async function sha256File(input, options = {}) {
|
|
|
123
216
|
: await hashFileHandle(input, getNativeBinding(), normalized);
|
|
124
217
|
}
|
|
125
218
|
function hashDescriptorSync(fd, { maxBytes = Infinity, signal }) {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
if (!stat.isFile()) {
|
|
129
|
-
throw new FsSafeError("not-file", "SHA-256 input is not a regular file");
|
|
130
|
-
}
|
|
131
|
-
if (stat.size > maxBytes) {
|
|
132
|
-
throw new FsSafeError("too-large", `SHA-256 input exceeds ${maxBytes} bytes`);
|
|
133
|
-
}
|
|
134
|
-
const hash = createHash("sha256");
|
|
135
|
-
let buffer = Buffer.allocUnsafe(Math.min(256 * 1024, Math.max(1, stat.size + 1), maxBytes + 1));
|
|
136
|
-
let position = 0;
|
|
137
|
-
while (true) {
|
|
138
|
-
signal?.throwIfAborted();
|
|
139
|
-
const length = Math.min(buffer.length, maxBytes - position + 1);
|
|
140
|
-
const bytesRead = fsSync.readSync(fd, buffer, 0, length, position);
|
|
219
|
+
const env_2 = { stack: [], error: void 0, hasError: false };
|
|
220
|
+
try {
|
|
141
221
|
signal?.throwIfAborted();
|
|
142
|
-
|
|
143
|
-
|
|
222
|
+
const stat = fsSync.fstatSync(fd);
|
|
223
|
+
if (!stat.isFile()) {
|
|
224
|
+
throw new FsSafeError("not-file", "SHA-256 input is not a regular file");
|
|
144
225
|
}
|
|
145
|
-
if (
|
|
146
|
-
|
|
226
|
+
if (stat.size > maxBytes) {
|
|
227
|
+
throw new FsSafeError("too-large", `SHA-256 input exceeds ${maxBytes} bytes`);
|
|
147
228
|
}
|
|
148
|
-
hash
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
229
|
+
const hash = createHash("sha256");
|
|
230
|
+
const scratch = __addDisposableResource(env_2, new HashScratch(Math.min(256 * 1024, Math.max(1, stat.size + 1), maxBytes + 1)), false);
|
|
231
|
+
let buffer = scratch.buffer;
|
|
232
|
+
let position = 0;
|
|
233
|
+
while (true) {
|
|
234
|
+
signal?.throwIfAborted();
|
|
235
|
+
const length = Math.min(buffer.length, maxBytes - position + 1);
|
|
236
|
+
const bytesRead = fsSync.readSync(fd, buffer, 0, length, position);
|
|
237
|
+
signal?.throwIfAborted();
|
|
238
|
+
if (bytesRead > maxBytes - position) {
|
|
239
|
+
throw new FsSafeError("too-large", `SHA-256 input exceeds ${maxBytes} bytes`);
|
|
240
|
+
}
|
|
241
|
+
if (bytesRead === 0) {
|
|
242
|
+
return { bytes: position, digest: hash.digest("hex") };
|
|
243
|
+
}
|
|
244
|
+
hash.update(buffer.subarray(0, bytesRead));
|
|
245
|
+
position += bytesRead;
|
|
246
|
+
if (bytesRead === buffer.length && buffer.length < 64 * 1024) {
|
|
247
|
+
buffer = scratch.grow(Math.min(64 * 1024, maxBytes + 1));
|
|
248
|
+
}
|
|
152
249
|
}
|
|
153
250
|
}
|
|
251
|
+
catch (e_2) {
|
|
252
|
+
env_2.error = e_2;
|
|
253
|
+
env_2.hasError = true;
|
|
254
|
+
}
|
|
255
|
+
finally {
|
|
256
|
+
__disposeResources(env_2);
|
|
257
|
+
}
|
|
154
258
|
}
|
|
155
259
|
function hashPathSync(filePath, options) {
|
|
156
260
|
assertNoWindowsPathAlias(filePath, "filesystem", "SHA-256 path uses a Windows filesystem namespace alias");
|
package/dist/file-identity.d.ts
CHANGED
|
@@ -5,4 +5,3 @@ export type FileIdentityStat = {
|
|
|
5
5
|
export declare function sha256Hex(data: string | Buffer, encoding?: BufferEncoding): string;
|
|
6
6
|
export declare function sameFileIdentity(left: FileIdentityStat, right: FileIdentityStat, platform?: NodeJS.Platform): boolean;
|
|
7
7
|
export declare function sameFileIdentityForCleanup(left: FileIdentityStat, right: FileIdentityStat, platform?: NodeJS.Platform): boolean;
|
|
8
|
-
//# sourceMappingURL=file-identity.d.ts.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { FileLockSyncHandle } from "./file-lock-sync.js";
|
|
2
|
+
import type { SidecarLockCompromisedInfo, SidecarLockRetryOptions } from "./sidecar-lock-types.js";
|
|
3
|
+
/** Owns local arbitration and retry state, independently of filesystem authority. */
|
|
4
|
+
export declare class SyncLockAcquisition {
|
|
5
|
+
#private;
|
|
6
|
+
readonly lockPath: string;
|
|
7
|
+
readonly normalizedTargetPath: string;
|
|
8
|
+
private readonly retry;
|
|
9
|
+
private readonly timeoutMs;
|
|
10
|
+
constructor(lockPath: string, normalizedTargetPath: string, retry: SidecarLockRetryOptions, timeoutMs: number | undefined);
|
|
11
|
+
get owns(): boolean;
|
|
12
|
+
hasToken(): boolean;
|
|
13
|
+
assert(): void;
|
|
14
|
+
reserve(): void;
|
|
15
|
+
release(): void;
|
|
16
|
+
run<T>(callback: () => T): T;
|
|
17
|
+
waitForRetry(): void;
|
|
18
|
+
retryDenial(error: unknown): boolean;
|
|
19
|
+
monitor(held: {
|
|
20
|
+
timer?: NodeJS.Timeout;
|
|
21
|
+
}, handle: FileLockSyncHandle, callback: ((info: SidecarLockCompromisedInfo) => void) | undefined, interval: number | undefined, receiver: object, recordTimer?: (timer: NodeJS.Timeout) => void): void;
|
|
22
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { getSyncLockAdmissions } from "./file-lock-sync-admission.js";
|
|
2
|
+
import { isTransientLockFileDenial, maxTransientLockDenials, sidecarLockRetryDelay, sidecarLockTimeout, } from "./sidecar-lock-policy.js";
|
|
3
|
+
import { sleepSync } from "./timing.js";
|
|
4
|
+
/** Owns local arbitration and retry state, independently of filesystem authority. */
|
|
5
|
+
export class SyncLockAcquisition {
|
|
6
|
+
lockPath;
|
|
7
|
+
normalizedTargetPath;
|
|
8
|
+
retry;
|
|
9
|
+
timeoutMs;
|
|
10
|
+
#admissions = getSyncLockAdmissions();
|
|
11
|
+
#token = {};
|
|
12
|
+
#owns = false;
|
|
13
|
+
#startedAt = performance.now();
|
|
14
|
+
#attempt = 0;
|
|
15
|
+
#transientDenials = 0;
|
|
16
|
+
constructor(lockPath, normalizedTargetPath, retry, timeoutMs) {
|
|
17
|
+
this.lockPath = lockPath;
|
|
18
|
+
this.normalizedTargetPath = normalizedTargetPath;
|
|
19
|
+
this.retry = retry;
|
|
20
|
+
this.timeoutMs = timeoutMs;
|
|
21
|
+
}
|
|
22
|
+
get owns() { return this.#owns; }
|
|
23
|
+
hasToken() { return this.#admissions.get(this.normalizedTargetPath) === this.#token; }
|
|
24
|
+
assert() {
|
|
25
|
+
if (!this.hasToken())
|
|
26
|
+
throw sidecarLockTimeout(this.lockPath, this.normalizedTargetPath);
|
|
27
|
+
}
|
|
28
|
+
reserve() {
|
|
29
|
+
if (this.#owns)
|
|
30
|
+
return;
|
|
31
|
+
// An existing synchronous owner can finish only after this stack unwinds.
|
|
32
|
+
if (this.#admissions.has(this.normalizedTargetPath)) {
|
|
33
|
+
throw sidecarLockTimeout(this.lockPath, this.normalizedTargetPath);
|
|
34
|
+
}
|
|
35
|
+
this.#admissions.set(this.normalizedTargetPath, this.#token);
|
|
36
|
+
this.#owns = true;
|
|
37
|
+
}
|
|
38
|
+
release() {
|
|
39
|
+
if (this.#owns && this.hasToken())
|
|
40
|
+
this.#admissions.delete(this.normalizedTargetPath);
|
|
41
|
+
this.#owns = false;
|
|
42
|
+
}
|
|
43
|
+
run(callback) {
|
|
44
|
+
this.assert();
|
|
45
|
+
try {
|
|
46
|
+
return callback();
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
this.assert();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
waitForRetry() {
|
|
53
|
+
this.release();
|
|
54
|
+
const delay = sidecarLockRetryDelay(this.retry, this.timeoutMs, performance.now() - this.#startedAt, this.#attempt);
|
|
55
|
+
if (delay === undefined)
|
|
56
|
+
throw sidecarLockTimeout(this.lockPath, this.normalizedTargetPath);
|
|
57
|
+
sleepSync(delay);
|
|
58
|
+
this.#attempt += 1;
|
|
59
|
+
}
|
|
60
|
+
retryDenial(error) {
|
|
61
|
+
if (!isTransientLockFileDenial(error, this.lockPath) ||
|
|
62
|
+
++this.#transientDenials > maxTransientLockDenials)
|
|
63
|
+
return false;
|
|
64
|
+
try {
|
|
65
|
+
this.waitForRetry();
|
|
66
|
+
}
|
|
67
|
+
catch (waitError) {
|
|
68
|
+
// Exhausted backoff must preserve the filesystem denial diagnosis.
|
|
69
|
+
if (waitError.code === "file_lock_timeout")
|
|
70
|
+
throw error;
|
|
71
|
+
throw waitError;
|
|
72
|
+
}
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
monitor(held, handle, callback, interval, receiver, recordTimer) {
|
|
76
|
+
if (!callback || (interval ?? 0) <= 0)
|
|
77
|
+
return;
|
|
78
|
+
const { lockPath, normalizedTargetPath } = this;
|
|
79
|
+
const timer = setInterval(() => {
|
|
80
|
+
let stillHeld;
|
|
81
|
+
try {
|
|
82
|
+
stillHeld = handle.verifyStillHeld();
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
stillHeld = false;
|
|
86
|
+
}
|
|
87
|
+
if (!stillHeld && held.timer) {
|
|
88
|
+
clearInterval(held.timer);
|
|
89
|
+
held.timer = undefined;
|
|
90
|
+
Reflect.apply(callback, receiver, [{ lockPath, normalizedTargetPath }]);
|
|
91
|
+
}
|
|
92
|
+
}, interval);
|
|
93
|
+
// Root cleanup retains a separate provisional receipt before unref can fail.
|
|
94
|
+
recordTimer?.(timer);
|
|
95
|
+
held.timer = timer;
|
|
96
|
+
timer.unref();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -12,8 +12,6 @@ export type SyncHeldLock = {
|
|
|
12
12
|
export declare function foreignSyncHeldLock(route: "raw" | "root", target: string): object | undefined;
|
|
13
13
|
export declare function getSyncHeldLocks(): Map<string, SyncHeldLock>;
|
|
14
14
|
export declare function getSyncLockAdmissions(): Map<string, object>;
|
|
15
|
-
export declare function syncLockTimeout(lockPath: string, normalizedTargetPath: string): Error;
|
|
16
15
|
export declare function defaultSyncShouldReclaim(snapshot: SidecarLockSnapshot, staleMs: number, nowMs: number): boolean;
|
|
17
16
|
export declare function syncReclaimGuardExists(reclaimGuardPath: string): boolean;
|
|
18
17
|
export declare function ensureSyncLockExitCleanupRegistered(cleanup: () => void, lockPath: string, normalizedTargetPath: string): void;
|
|
19
|
-
//# sourceMappingURL=file-lock-sync-admission.d.ts.map
|