@openclaw/fs-safe 0.16.0 → 0.18.0
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 +91 -0
- package/README.md +8 -1
- package/dist/absolute-path.d.ts +0 -1
- package/dist/absolute-path.js +2 -8
- package/dist/advanced.d.ts +2 -1
- package/dist/advanced.js +2 -0
- package/dist/archive-crc32.d.ts +0 -1
- package/dist/archive-deadline.d.ts +0 -1
- package/dist/archive-deadline.js +22 -23
- package/dist/archive-durability.d.ts +0 -1
- 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 +3 -4
- package/dist/archive-merge.js +17 -7
- package/dist/archive-native.d.ts +3 -14
- package/dist/archive-native.js +46 -70
- package/dist/archive-options.d.ts +9 -2
- package/dist/archive-parser-errors.d.ts +0 -1
- package/dist/archive-parser.wasm +0 -0
- package/dist/archive-plan.d.ts +10 -1
- package/dist/archive-plan.js +31 -21
- package/dist/archive-policy.d.ts +0 -1
- package/dist/archive-read.d.ts +0 -1
- package/dist/archive-staging.d.ts +0 -1
- package/dist/archive-tar-inspect.d.ts +0 -1
- package/dist/archive-tar-stream.d.ts +0 -1
- package/dist/archive-tar-wasm.d.ts +0 -1
- package/dist/archive-tar.d.ts +0 -1
- package/dist/archive-zip-admission.d.ts +0 -1
- package/dist/archive-zip-count.d.ts +0 -1
- package/dist/archive-zip-count.js +21 -1
- package/dist/archive-zip-directory.d.ts +0 -1
- package/dist/archive-zip-directory.js +23 -1
- package/dist/archive-zip-entry.d.ts +0 -1
- package/dist/archive-zip-integrity.d.ts +0 -1
- package/dist/archive-zip-loader.d.ts +2 -1
- package/dist/archive-zip-loader.js +7 -0
- package/dist/archive-zip-manifest.d.ts +0 -1
- package/dist/archive-zip-names.d.ts +0 -1
- package/dist/archive-zip-names.js +7 -2
- package/dist/archive-zip-preflight.d.ts +0 -1
- package/dist/archive.d.ts +0 -1
- package/dist/archive.js +93 -164
- package/dist/async-lock.d.ts +0 -1
- package/dist/atomic.d.ts +0 -1
- 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 +2 -0
- package/dist/byte-view.js +13 -0
- 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 +0 -1
- 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-directory.d.ts +0 -2
- package/dist/create-directory.js +3 -22
- package/dist/create-file-async.d.ts +0 -1
- package/dist/create-file.d.ts +0 -1
- package/dist/create-file.js +3 -14
- package/dist/create-owned-file.d.ts +0 -1
- package/dist/create.d.ts +1 -2
- package/dist/create.js +1 -1
- package/dist/creation-darwin.d.ts +0 -2
- package/dist/creation-darwin.js +0 -9
- package/dist/creation-file-state.d.ts +0 -1
- package/dist/creation-path.d.ts +2 -1
- package/dist/creation-path.js +12 -0
- package/dist/creation-permissions.d.ts +0 -1
- package/dist/creation-permissions.js +28 -38
- 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 +6 -7
- 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-owner.d.ts +0 -1
- package/dist/directory-receipt.d.ts +2 -3
- package/dist/directory-receipt.js +15 -19
- package/dist/durability.d.ts +0 -1
- 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 +1 -1
- package/dist/file-cleanup.js +7 -4
- package/dist/file-contents.d.ts +5 -0
- package/dist/file-contents.js +40 -0
- package/dist/file-handle-transfer.d.ts +0 -1
- package/dist/file-hash.d.ts +0 -1
- package/dist/file-hash.js +186 -70
- 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 +35 -98
- package/dist/file-lock-sync-root-arbitration.d.ts +0 -1
- package/dist/file-lock-sync-root-held.d.ts +1 -3
- package/dist/file-lock-sync-root-held.js +7 -5
- 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 +1 -2
- 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 +24 -23
- package/dist/file-lock-sync.d.ts +0 -1
- package/dist/file-lock-sync.js +46 -128
- package/dist/file-lock.d.ts +0 -1
- package/dist/file-observation.d.ts +0 -1
- package/dist/file-store-boundary.d.ts +0 -2
- package/dist/file-store-boundary.js +6 -26
- package/dist/file-store-copy-source.d.ts +1 -2
- package/dist/file-store-copy-source.js +1 -1
- package/dist/file-store-limit.d.ts +1 -2
- package/dist/file-store-limit.js +2 -3
- package/dist/file-store-path.d.ts +0 -1
- 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 +16 -26
- package/dist/file-store.d.ts +0 -1
- package/dist/file-store.js +6 -7
- 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 +0 -1
- package/dist/guarded-mkdir.js +6 -27
- 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 +0 -1
- package/dist/install-path.d.ts +0 -1
- package/dist/install-path.js +2 -5
- 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 +43 -66
- package/dist/json-durable-queue-read.d.ts +0 -1
- package/dist/json-durable-queue-read.js +6 -6
- package/dist/json-durable-queue.d.ts +0 -1
- package/dist/json-durable-queue.js +17 -139
- package/dist/json-store.d.ts +0 -1
- package/dist/json-stringify.d.ts +0 -1
- package/dist/json.d.ts +0 -1
- package/dist/json.js +38 -90
- 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/local-roots.js +19 -21
- package/dist/lock-config.d.ts +0 -1
- package/dist/move-path-cleanup.d.ts +5 -20
- package/dist/move-path-cleanup.js +57 -21
- package/dist/move-path-stage.d.ts +0 -1
- package/dist/move-path.d.ts +0 -1
- package/dist/move-path.js +62 -39
- 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 -6
- package/dist/native-parent-admission.d.ts +0 -1
- package/dist/native-pinned-write-windows.d.ts +0 -1
- package/dist/native-pinned-write.d.ts +0 -1
- package/dist/native-pinned-write.js +4 -10
- package/dist/native-policy-directory-observation.d.ts +0 -1
- package/dist/native-policy-parent-windows.d.ts +0 -1
- package/dist/native-rename-outcome.d.ts +0 -1
- package/dist/native-staged-file.d.ts +17 -4
- package/dist/native-staged-file.js +63 -68
- package/dist/native.d.ts +0 -1
- package/dist/native.js +2 -2
- package/dist/opened-file-failure.d.ts +0 -1
- package/dist/opened-realpath.d.ts +0 -1
- package/dist/opened-realpath.js +11 -2
- 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/path.js +2 -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 +11 -33
- package/dist/pinned-mutation-admission.d.ts +0 -1
- 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 +1 -1
- package/dist/pinned-operation.d.ts +0 -1
- package/dist/pinned-write-input.d.ts +0 -1
- package/dist/pinned-write-input.js +11 -1
- package/dist/pinned-write-mode.d.ts +3 -4
- package/dist/pinned-write-mode.js +15 -8
- package/dist/pinned-write-staged.d.ts +0 -1
- package/dist/pinned-write-staged.js +10 -11
- package/dist/pinned-write-types.d.ts +9 -21
- package/dist/pinned-write.d.ts +0 -1
- package/dist/pinned-write.js +17 -13
- package/dist/positional-read.d.ts +0 -1
- package/dist/private-directory.d.ts +0 -1
- package/dist/private-producer-handoff-sync.d.ts +0 -1
- package/dist/private-producer-handoff-sync.js +9 -51
- package/dist/private-producer-handoff.d.ts +20 -1
- package/dist/private-producer-handoff.js +69 -46
- package/dist/private-temp-workspace.d.ts +0 -1
- package/dist/private-temp-workspace.js +11 -36
- package/dist/publish-copy-stage.d.ts +0 -1
- package/dist/publish-file-failure.d.ts +0 -1
- package/dist/publish-file.d.ts +2 -3
- package/dist/publish-file.js +56 -96
- 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 +107 -178
- package/dist/replace-directory.d.ts +0 -1
- package/dist/replace-file-copy-fallback.d.ts +0 -1
- package/dist/replace-file-copy-fallback.js +42 -29
- package/dist/replace-file-copy-source.d.ts +0 -1
- package/dist/replace-file-copy-source.js +19 -23
- package/dist/replace-file-descriptor.d.ts +0 -1
- package/dist/replace-file-descriptor.js +16 -17
- package/dist/replace-file-mode.d.ts +0 -1
- package/dist/replace-file-rename-policy.d.ts +0 -1
- package/dist/replace-file-temp-owner.d.ts +12 -13
- package/dist/replace-file-temp-owner.js +72 -91
- package/dist/replace-file.d.ts +0 -1
- package/dist/replace-file.js +9 -13
- 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-create-input.d.ts +0 -1
- package/dist/root-directory-creation.d.ts +0 -1
- package/dist/root-directory-list.d.ts +0 -1
- package/dist/root-directory-list.js +20 -3
- package/dist/root-directory.d.ts +0 -1
- package/dist/root-entries.d.ts +0 -1
- package/dist/root-errors.d.ts +0 -1
- package/dist/root-file-final-admission.d.ts +1 -2
- package/dist/root-file-final-admission.js +5 -2
- package/dist/root-file.d.ts +0 -1
- package/dist/root-file.js +3 -2
- package/dist/root-impl.d.ts +2 -10
- package/dist/root-impl.js +164 -111
- package/dist/root-move-noreplace.d.ts +2 -1
- package/dist/root-move-noreplace.js +2 -2
- package/dist/root-move-preflight.d.ts +0 -1
- package/dist/root-observed-path.d.ts +0 -1
- package/dist/root-options.d.ts +0 -1
- package/dist/root-path-errors.d.ts +0 -1
- package/dist/root-path-existing.d.ts +3 -1
- package/dist/root-path-existing.js +39 -18
- package/dist/root-path-observation.d.ts +0 -1
- package/dist/root-path-stat.d.ts +0 -1
- 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-read-admission.d.ts +0 -1
- package/dist/root-read-admission.js +31 -39
- package/dist/root-remove-identity.d.ts +0 -1
- package/dist/root-remove-receipt.d.ts +0 -1
- package/dist/root-remove.d.ts +0 -1
- package/dist/root-remove.js +15 -1
- package/dist/root-symlink-policy.d.ts +0 -1
- package/dist/root-walk.d.ts +0 -1
- package/dist/root-write-admission.d.ts +0 -1
- package/dist/root-write-compatibility.d.ts +0 -1
- package/dist/root-write-complete-parent.d.ts +0 -1
- 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 +0 -1
- package/dist/root.d.ts +0 -1
- 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 -17
- 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/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 +35 -58
- 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 +3 -1
- package/dist/sidecar-lock-handle.js +6 -0
- package/dist/sidecar-lock-policy.d.ts +3 -1
- package/dist/sidecar-lock-policy.js +16 -0
- package/dist/sidecar-lock-reclaim.d.ts +1 -2
- package/dist/sidecar-lock-reclaim.js +11 -8
- 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-target.d.ts +0 -1
- package/dist/sidecar-lock-types.d.ts +0 -1
- package/dist/sidecar-lock.d.ts +0 -1
- package/dist/sidecar-lock.js +19 -88
- package/dist/staged-directory.d.ts +2 -3
- package/dist/staged-file-settlement.d.ts +0 -1
- package/dist/staged-file-types.d.ts +0 -1
- package/dist/standalone-publication-path.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 +1 -2
- package/dist/strict-file-identity.js +9 -9
- 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/symlink-parents.js +2 -27
- 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 +0 -4
- package/dist/temp-workspace-child-admission.d.ts +0 -4
- package/dist/temp-workspace-child-admission.js +0 -12
- package/dist/temp-workspace-descriptor.d.ts +0 -6
- package/dist/temp-workspace-descriptor.js +0 -2
- package/dist/temp-workspace-identity.d.ts +0 -1
- package/dist/temp-workspace-owner.d.ts +1 -1
- package/dist/temp-workspace-owner.js +49 -26
- package/dist/temp-workspace-permissions.d.ts +0 -1
- 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/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/unicode-path.js +3 -0
- package/dist/walk.d.ts +0 -1
- package/dist/walk.js +4 -2
- package/dist/windows-command.d.ts +0 -1
- package/dist/windows-owner.d.ts +0 -1
- package/dist/windows-owner.js +4 -1
- package/dist/windows-path-alias.d.ts +0 -1
- package/dist/windows-path-alias.js +7 -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 +7 -1
- package/dist/write-file-handle.js +23 -0
- package/dist/write-open-flags.d.ts +0 -1
- package/dist/write-open-flags.js +1 -8
- package/dist/write-queue.d.ts +0 -1
- package/dist/write-queue.js +1 -4
- package/docs/advanced.md +68 -1
- package/docs/archive.md +41 -2
- package/docs/atomic.md +43 -5
- package/docs/contributing.md +4 -0
- package/docs/copy.md +2 -0
- package/docs/creation.md +8 -4
- package/docs/durability.md +35 -0
- package/docs/file-contents.md +68 -0
- package/docs/json.md +5 -4
- package/docs/local-roots.md +2 -0
- package/docs/mutation-policy-proof.md +11 -7
- package/docs/native.md +9 -8
- package/docs/path.md +4 -4
- package/docs/permissions.md +6 -0
- package/docs/public-api.md +5 -0
- package/docs/quickstart.md +1 -1
- package/docs/reading.md +2 -2
- package/docs/regular-file.md +3 -0
- package/docs/root.md +19 -0
- package/docs/secret-file.md +4 -0
- package/docs/sidecar-lock.md +9 -1
- package/docs/staged-file.md +4 -3
- package/docs/store.md +3 -1
- package/docs/temp.md +4 -1
- package/docs/types.md +18 -2
- package/docs/walk.md +7 -0
- package/docs/writing.md +18 -5
- 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.map +0 -1
- 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.map +0 -1
- 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.map +0 -1
- 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.map +0 -1
- 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/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.map +0 -1
- package/dist/create-file-async.d.ts.map +0 -1
- package/dist/create-file.d.ts.map +0 -1
- package/dist/create-owned-file.d.ts.map +0 -1
- package/dist/create.d.ts.map +0 -1
- package/dist/creation-darwin.d.ts.map +0 -1
- package/dist/creation-file-state.d.ts.map +0 -1
- package/dist/creation-path.d.ts.map +0 -1
- package/dist/creation-permissions.d.ts.map +0 -1
- 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-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.map +0 -1
- package/dist/file-store-limit.d.ts.map +0 -1
- package/dist/file-store-path.d.ts.map +0 -1
- 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 -42
- 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.map +0 -1
- 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.map +0 -1
- package/dist/temp-workspace-owner.d.ts.map +0 -1
- package/dist/temp-workspace-permissions.d.ts.map +0 -1
- 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
|
@@ -2,11 +2,12 @@ import fs from "node:fs";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { FsSafeError } from "./errors.js";
|
|
4
4
|
import { captureRootSyncAcquireOptions } from "./file-lock-sync-root-options.js";
|
|
5
|
-
import { defaultSyncShouldReclaim, foreignSyncHeldLock
|
|
6
|
-
import {
|
|
5
|
+
import { defaultSyncShouldReclaim, foreignSyncHeldLock } from "./file-lock-sync-admission.js";
|
|
6
|
+
import { isTransientLockFileDenial } from "./sidecar-lock-policy.js";
|
|
7
7
|
import { serializeSidecarLockPayload, } from "./sidecar-lock-reclaim.js";
|
|
8
8
|
import { createSuppressedError } from "./suppressed-error.js";
|
|
9
|
-
import {
|
|
9
|
+
import { SyncLockAcquisition } from "./file-lock-sync-acquisition.js";
|
|
10
|
+
import { assertSynchronousCallbackResult } from "./mutation-authority.js";
|
|
10
11
|
import { assertNoWindowsPathAlias } from "./windows-path-alias.js";
|
|
11
12
|
import { admitFileLockSyncRootPath, assertFileLockSyncRootPathsCurrent, captureFileLockSyncRootAuthority, normalizeFileLockSyncTargetWithRoot, } from "./file-lock-sync-root.js";
|
|
12
13
|
import { cleanupCreatedRootSyncLock, FileLockSyncRootArbitrationCollision, tryReuseCurrentRootSyncHeldLock, } from "./file-lock-sync-root-arbitration.js";
|
|
@@ -36,20 +37,6 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
|
|
|
36
37
|
const heldLocks = getRootSyncHeldLocks();
|
|
37
38
|
const currentTargetHolder = () => heldLocks.get(normalizedTargetPath) ??
|
|
38
39
|
foreignSyncHeldLock("root", normalizedTargetPath);
|
|
39
|
-
const admissions = getSyncLockAdmissions();
|
|
40
|
-
const admissionToken = {};
|
|
41
|
-
let ownsAdmission = false;
|
|
42
|
-
const assertAdmission = () => {
|
|
43
|
-
if (admissions.get(normalizedTargetPath) !== admissionToken) {
|
|
44
|
-
throw syncLockTimeout(lockPath, normalizedTargetPath);
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
const releaseAdmission = () => {
|
|
48
|
-
if (ownsAdmission && admissions.get(normalizedTargetPath) === admissionToken) {
|
|
49
|
-
admissions.delete(normalizedTargetPath);
|
|
50
|
-
}
|
|
51
|
-
ownsAdmission = false;
|
|
52
|
-
};
|
|
53
40
|
const arbitration = Object.freeze({
|
|
54
41
|
authority,
|
|
55
42
|
heldLocks,
|
|
@@ -58,44 +45,15 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
|
|
|
58
45
|
reentrantOwner: options.reentrantOwner,
|
|
59
46
|
});
|
|
60
47
|
if (heldLocks.has(normalizedTargetPath) && !foreignSyncHeldLock("root", normalizedTargetPath)) {
|
|
61
|
-
assertFileLockSyncRootPathsCurrent(guardedPaths
|
|
48
|
+
assertFileLockSyncRootPathsCurrent(guardedPaths);
|
|
62
49
|
const initiallyReusable = tryReuseCurrentRootSyncHeldLock(arbitration);
|
|
63
50
|
if (initiallyReusable)
|
|
64
51
|
return initiallyReusable;
|
|
65
52
|
}
|
|
66
|
-
const
|
|
67
|
-
let attempt = 0;
|
|
68
|
-
let transientDenials = 0;
|
|
53
|
+
const acquisition = new SyncLockAcquisition(lockPath, normalizedTargetPath, options.retry, options.timeoutMs);
|
|
69
54
|
let ownedReclaimGuard;
|
|
70
55
|
let reclaimCleanupAttempted = false;
|
|
71
56
|
const reuseCurrentHeld = () => ownedReclaimGuard ? undefined : tryReuseCurrentRootSyncHeldLock(arbitration);
|
|
72
|
-
const waitForRetry = () => {
|
|
73
|
-
releaseAdmission();
|
|
74
|
-
const elapsed = Date.now() - startedAt;
|
|
75
|
-
const timedOut = options.timeoutMs !== undefined && elapsed >= options.timeoutMs;
|
|
76
|
-
if (timedOut || (options.retry.retries !== undefined && attempt >= options.retry.retries)) {
|
|
77
|
-
throw syncLockTimeout(lockPath, normalizedTargetPath);
|
|
78
|
-
}
|
|
79
|
-
const remaining = options.timeoutMs === undefined || options.timeoutMs === Number.POSITIVE_INFINITY
|
|
80
|
-
? Number.POSITIVE_INFINITY
|
|
81
|
-
: Math.max(0, options.timeoutMs - elapsed);
|
|
82
|
-
sleepSync(Math.min(computeSidecarLockDelayMs(options.retry, attempt), remaining));
|
|
83
|
-
attempt += 1;
|
|
84
|
-
};
|
|
85
|
-
const retryLockFileDenial = (error) => {
|
|
86
|
-
if (!isTransientLockFileDenial(error, lockPath) ||
|
|
87
|
-
++transientDenials > maxTransientLockDenials)
|
|
88
|
-
return false;
|
|
89
|
-
try {
|
|
90
|
-
waitForRetry();
|
|
91
|
-
}
|
|
92
|
-
catch (waitError) {
|
|
93
|
-
if (waitError.code === "file_lock_timeout")
|
|
94
|
-
throw error;
|
|
95
|
-
throw waitError;
|
|
96
|
-
}
|
|
97
|
-
return true;
|
|
98
|
-
};
|
|
99
57
|
const releaseReclaimGuard = () => {
|
|
100
58
|
const receipt = ownedReclaimGuard;
|
|
101
59
|
if (!receipt)
|
|
@@ -115,19 +73,14 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
|
|
|
115
73
|
};
|
|
116
74
|
try {
|
|
117
75
|
while (true) {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
ownsAdmission = true;
|
|
123
|
-
}
|
|
124
|
-
assertAdmission();
|
|
125
|
-
assertFileLockSyncRootPathsCurrent(guardedPaths, true, true);
|
|
126
|
-
assertAdmission();
|
|
76
|
+
acquisition.reserve();
|
|
77
|
+
acquisition.assert();
|
|
78
|
+
assertFileLockSyncRootPathsCurrent(guardedPaths);
|
|
79
|
+
acquisition.assert();
|
|
127
80
|
if (ownedReclaimGuard)
|
|
128
81
|
assertOwnedReclaimGuardCurrent();
|
|
129
|
-
if (!ownedReclaimGuard && fileLockSyncRootGuardExists(reclaimRootPath
|
|
130
|
-
waitForRetry();
|
|
82
|
+
if (!ownedReclaimGuard && fileLockSyncRootGuardExists(reclaimRootPath)) {
|
|
83
|
+
acquisition.waitForRetry();
|
|
131
84
|
continue;
|
|
132
85
|
}
|
|
133
86
|
if (currentTargetHolder() !== undefined) {
|
|
@@ -136,16 +89,16 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
|
|
|
136
89
|
return reused;
|
|
137
90
|
}
|
|
138
91
|
const payload = Reflect.apply(options.payload, options.optionsReceiver, []);
|
|
139
|
-
|
|
92
|
+
acquisition.assert();
|
|
140
93
|
const { raw, ownershipToken } = serializeSidecarLockPayload(payload);
|
|
141
|
-
|
|
94
|
+
acquisition.assert();
|
|
142
95
|
if (ownedReclaimGuard)
|
|
143
96
|
assertOwnedReclaimGuardCurrent();
|
|
144
97
|
if (currentTargetHolder() !== undefined) {
|
|
145
98
|
const reused = reuseCurrentHeld();
|
|
146
99
|
if (reused)
|
|
147
100
|
return reused;
|
|
148
|
-
waitForRetry();
|
|
101
|
+
acquisition.waitForRetry();
|
|
149
102
|
continue;
|
|
150
103
|
}
|
|
151
104
|
let fd;
|
|
@@ -153,9 +106,9 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
|
|
|
153
106
|
let unpublishedTimer;
|
|
154
107
|
let lockFileCreateOpenFailure;
|
|
155
108
|
try {
|
|
156
|
-
const created = createFileLockSyncRootFile(lockRootPath,
|
|
109
|
+
const created = createFileLockSyncRootFile(lockRootPath, {
|
|
157
110
|
assertBeforeOpen: () => {
|
|
158
|
-
|
|
111
|
+
acquisition.assert();
|
|
159
112
|
if (ownedReclaimGuard)
|
|
160
113
|
assertOwnedReclaimGuardCurrent();
|
|
161
114
|
if (currentTargetHolder() !== undefined)
|
|
@@ -192,29 +145,11 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
|
|
|
192
145
|
snapshot,
|
|
193
146
|
};
|
|
194
147
|
const returnedHandle = createRootSyncHeldLockHandle(createdHeld);
|
|
195
|
-
|
|
196
|
-
const timer = setInterval(() => {
|
|
197
|
-
let stillHeld;
|
|
198
|
-
try {
|
|
199
|
-
stillHeld = returnedHandle.verifyStillHeld();
|
|
200
|
-
}
|
|
201
|
-
catch {
|
|
202
|
-
stillHeld = false;
|
|
203
|
-
}
|
|
204
|
-
if (!stillHeld && createdHeld.timer) {
|
|
205
|
-
clearInterval(createdHeld.timer);
|
|
206
|
-
createdHeld.timer = undefined;
|
|
207
|
-
Reflect.apply(options.onCompromised, options.optionsReceiver, [{ lockPath, normalizedTargetPath }]);
|
|
208
|
-
}
|
|
209
|
-
}, options.compromiseCheckIntervalMs);
|
|
210
|
-
unpublishedTimer = timer;
|
|
211
|
-
createdHeld.timer = timer;
|
|
212
|
-
timer.unref();
|
|
213
|
-
}
|
|
148
|
+
acquisition.monitor(createdHeld, returnedHandle, options.onCompromised, options.compromiseCheckIntervalMs, options.optionsReceiver, (timer) => { unpublishedTimer = timer; });
|
|
214
149
|
if (currentTargetHolder() !== undefined) {
|
|
215
150
|
throw new FileLockSyncRootArbitrationCollision();
|
|
216
151
|
}
|
|
217
|
-
|
|
152
|
+
acquisition.assert();
|
|
218
153
|
heldLocks.set(normalizedTargetPath, createdHeld);
|
|
219
154
|
fd = undefined;
|
|
220
155
|
unpublishedTimer = undefined;
|
|
@@ -239,12 +174,12 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
|
|
|
239
174
|
const reused = reuseCurrentHeld();
|
|
240
175
|
if (reused)
|
|
241
176
|
return reused;
|
|
242
|
-
waitForRetry();
|
|
177
|
+
acquisition.waitForRetry();
|
|
243
178
|
continue;
|
|
244
179
|
}
|
|
245
180
|
const fromLockFileOpen = lockFileCreateOpenFailure !== undefined &&
|
|
246
181
|
lockFileCreateOpenFailure.error === error;
|
|
247
|
-
if (fromLockFileOpen &&
|
|
182
|
+
if (fromLockFileOpen && acquisition.retryDenial(error))
|
|
248
183
|
continue;
|
|
249
184
|
if (!fromLockFileOpen || error.code !== "EEXIST")
|
|
250
185
|
throw error;
|
|
@@ -253,14 +188,14 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
|
|
|
253
188
|
const reused = reuseCurrentHeld();
|
|
254
189
|
if (reused)
|
|
255
190
|
return reused;
|
|
256
|
-
waitForRetry();
|
|
191
|
+
acquisition.waitForRetry();
|
|
257
192
|
continue;
|
|
258
193
|
}
|
|
259
194
|
if (currentTargetHolder() !== undefined) {
|
|
260
195
|
const reused = reuseCurrentHeld();
|
|
261
196
|
if (reused)
|
|
262
197
|
return reused;
|
|
263
|
-
waitForRetry();
|
|
198
|
+
acquisition.waitForRetry();
|
|
264
199
|
continue;
|
|
265
200
|
}
|
|
266
201
|
let lockFileOpenDenied = false;
|
|
@@ -271,7 +206,7 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
|
|
|
271
206
|
});
|
|
272
207
|
}
|
|
273
208
|
catch (readError) {
|
|
274
|
-
if (lockFileOpenDenied &&
|
|
209
|
+
if (lockFileOpenDenied && acquisition.retryDenial(readError))
|
|
275
210
|
continue;
|
|
276
211
|
throw readError;
|
|
277
212
|
}
|
|
@@ -279,12 +214,12 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
|
|
|
279
214
|
const reused = reuseCurrentHeld();
|
|
280
215
|
if (reused)
|
|
281
216
|
return reused;
|
|
282
|
-
waitForRetry();
|
|
217
|
+
acquisition.waitForRetry();
|
|
283
218
|
continue;
|
|
284
219
|
}
|
|
285
|
-
|
|
220
|
+
acquisition.assert();
|
|
286
221
|
if (!current) {
|
|
287
|
-
waitForRetry();
|
|
222
|
+
acquisition.waitForRetry();
|
|
288
223
|
continue;
|
|
289
224
|
}
|
|
290
225
|
const snapshot = current.snapshot;
|
|
@@ -299,7 +234,8 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
|
|
|
299
234
|
nowMs,
|
|
300
235
|
heldByThisProcess: false,
|
|
301
236
|
}]);
|
|
302
|
-
|
|
237
|
+
assertSynchronousCallbackResult(reclaim, "shouldReclaim");
|
|
238
|
+
acquisition.assert();
|
|
303
239
|
if (!fileLockSyncRootSnapshotStillCurrent(lockRootPath, current)) {
|
|
304
240
|
throw new FsSafeError("path-mismatch", "sidecar changed during reclaim policy callback");
|
|
305
241
|
}
|
|
@@ -313,7 +249,7 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
|
|
|
313
249
|
options.shouldRemoveStaleLock) {
|
|
314
250
|
const guard = createFileLockSyncRootDirectory(reclaimRootPath);
|
|
315
251
|
if (!guard) {
|
|
316
|
-
waitForRetry();
|
|
252
|
+
acquisition.waitForRetry();
|
|
317
253
|
continue;
|
|
318
254
|
}
|
|
319
255
|
ownedReclaimGuard = guard;
|
|
@@ -324,11 +260,12 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
|
|
|
324
260
|
raw: snapshot.raw,
|
|
325
261
|
payload: snapshot.payload,
|
|
326
262
|
}]);
|
|
327
|
-
|
|
263
|
+
assertSynchronousCallbackResult(approved, "shouldRemoveStaleLock");
|
|
264
|
+
acquisition.assert();
|
|
328
265
|
assertOwnedReclaimGuardCurrent();
|
|
329
266
|
if (approved) {
|
|
330
267
|
const removed = removeFileLockSyncRootFile(lockRootPath, current.receipt, snapshot, () => {
|
|
331
|
-
|
|
268
|
+
acquisition.assert();
|
|
332
269
|
assertOwnedReclaimGuardCurrent();
|
|
333
270
|
if (currentTargetHolder() !== undefined)
|
|
334
271
|
throw new FileLockSyncRootArbitrationCollision();
|
|
@@ -349,7 +286,7 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
|
|
|
349
286
|
normalizedTargetPath,
|
|
350
287
|
});
|
|
351
288
|
}
|
|
352
|
-
waitForRetry();
|
|
289
|
+
acquisition.waitForRetry();
|
|
353
290
|
}
|
|
354
291
|
}
|
|
355
292
|
}
|
|
@@ -365,6 +302,6 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
|
|
|
365
302
|
throw error;
|
|
366
303
|
}
|
|
367
304
|
finally {
|
|
368
|
-
|
|
305
|
+
acquisition.release();
|
|
369
306
|
}
|
|
370
307
|
}
|
|
@@ -15,4 +15,3 @@ export type FileLockSyncRootArbitration = Readonly<{
|
|
|
15
15
|
}>;
|
|
16
16
|
export declare function tryReuseCurrentRootSyncHeldLock(arbitration: FileLockSyncRootArbitration): FileLockSyncHandle | undefined;
|
|
17
17
|
export declare function cleanupCreatedRootSyncLock(lockRootPath: FileLockSyncRootPath, fd: number, receipt: FileLockSyncRootFileReceipt, timer?: NodeJS.Timeout): void;
|
|
18
|
-
//# sourceMappingURL=file-lock-sync-root-arbitration.d.ts.map
|
|
@@ -28,7 +28,5 @@ export declare function getRootSyncHeldLocks(): Map<string, RootSyncHeldLock>;
|
|
|
28
28
|
export declare function ensureRootSyncExitCleanupRegistered(): void;
|
|
29
29
|
export declare function verifyRootSyncHeldLock(held: RootSyncHeldLock): boolean;
|
|
30
30
|
export declare function createRootSyncHeldLockHandle(held: RootSyncHeldLock): FileLockSyncHandle;
|
|
31
|
-
export declare function
|
|
32
|
-
export declare function withRootSyncHeldLockHandle<T>(lock: FileLockSyncHandle, fn: () => T): T;
|
|
31
|
+
export declare function withSyncHeldLockHandle<T>(lock: FileLockSyncHandle, fn: () => T): T;
|
|
33
32
|
export {};
|
|
34
|
-
//# sourceMappingURL=file-lock-sync-root-held.d.ts.map
|
|
@@ -223,7 +223,12 @@ export function ensureRootSyncExitCleanupRegistered() {
|
|
|
223
223
|
ensureFileLockSyncRootExitCleanupRegistered(releaseAllRootSyncHeldLocks);
|
|
224
224
|
}
|
|
225
225
|
export function verifyRootSyncHeldLock(held) {
|
|
226
|
-
const
|
|
226
|
+
const rootPath = held.rootPath;
|
|
227
|
+
const parsePayload = held.parsePayload;
|
|
228
|
+
const rootReceipt = held.rootReceipt;
|
|
229
|
+
const current = parsePayload
|
|
230
|
+
? readRootSidecarSnapshotSync(rootPath, parsePayload, undefined, rootReceipt)
|
|
231
|
+
: readFileLockSyncRootSnapshot(rootPath, { expectedReceipt: rootReceipt });
|
|
227
232
|
if (!current)
|
|
228
233
|
return false;
|
|
229
234
|
return current.receipt.identity.dev === held.rootReceipt.identity.dev &&
|
|
@@ -369,10 +374,7 @@ export function createRootSyncHeldLockHandle(held) {
|
|
|
369
374
|
rootSyncHandleDispositions.set(handle, disposition);
|
|
370
375
|
return handle;
|
|
371
376
|
}
|
|
372
|
-
export function
|
|
373
|
-
return rootSyncHandleDispositions.has(handle);
|
|
374
|
-
}
|
|
375
|
-
export function withRootSyncHeldLockHandle(lock, fn) {
|
|
377
|
+
export function withSyncHeldLockHandle(lock, fn) {
|
|
376
378
|
let result;
|
|
377
379
|
try {
|
|
378
380
|
result = fn();
|
|
@@ -41,4 +41,3 @@ export declare function readFileLockSyncRootSnapshot(pathAuthority: FileLockSync
|
|
|
41
41
|
export declare function fileLockSyncRootSnapshotStillCurrent(pathAuthority: FileLockSyncRootPath, observed: FileLockSyncRootSnapshot): boolean;
|
|
42
42
|
export declare function fileReceiptCurrentAfterParentCheck(pathAuthority: FileLockSyncRootPath, receipt: FileLockSyncRootFileReceipt): boolean;
|
|
43
43
|
export declare function fileLockSyncRootReceiptStillCurrent(pathAuthority: FileLockSyncRootPath, receipt: FileLockSyncRootFileReceipt): boolean;
|
|
44
|
-
//# sourceMappingURL=file-lock-sync-root-io.d.ts.map
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
import { type SidecarLockSnapshot } from "./sidecar-lock-reclaim.js";
|
|
2
2
|
import { type FileLockSyncRootPath } from "./file-lock-sync-root.js";
|
|
3
3
|
import { type FileLockSyncRootDirectoryReceipt, type FileLockSyncRootFileReceipt } from "./file-lock-sync-root-io.js";
|
|
4
|
-
export declare function createFileLockSyncRootFile(pathAuthority: FileLockSyncRootPath,
|
|
5
|
-
assertBeforeOpen
|
|
6
|
-
onOpenFailure
|
|
4
|
+
export declare function createFileLockSyncRootFile(pathAuthority: FileLockSyncRootPath, options: {
|
|
5
|
+
assertBeforeOpen: () => void;
|
|
6
|
+
onOpenFailure: (error: unknown) => void;
|
|
7
7
|
}): {
|
|
8
8
|
fd: number;
|
|
9
9
|
receipt: FileLockSyncRootFileReceipt;
|
|
10
10
|
};
|
|
11
11
|
export declare function refreshFileLockSyncRootFileReceipt(pathAuthority: FileLockSyncRootPath, receipt: FileLockSyncRootFileReceipt): FileLockSyncRootFileReceipt;
|
|
12
12
|
export declare function removeFileLockSyncRootFile(pathAuthority: FileLockSyncRootPath, receipt: FileLockSyncRootFileReceipt, expected?: SidecarLockSnapshot, assertBeforeRemove?: () => boolean | void): boolean;
|
|
13
|
-
export declare function fileLockSyncRootGuardExists(pathAuthority: FileLockSyncRootPath
|
|
13
|
+
export declare function fileLockSyncRootGuardExists(pathAuthority: FileLockSyncRootPath): boolean;
|
|
14
14
|
export declare function createFileLockSyncRootDirectory(pathAuthority: FileLockSyncRootPath): FileLockSyncRootDirectoryReceipt | null;
|
|
15
15
|
export declare function removeFileLockSyncRootDirectory(pathAuthority: FileLockSyncRootPath, receipt: FileLockSyncRootDirectoryReceipt): boolean;
|
|
16
16
|
export declare function fileLockSyncRootDirectoryReceiptStillCurrent(pathAuthority: FileLockSyncRootPath, receipt: FileLockSyncRootDirectoryReceipt): boolean;
|
|
17
|
-
//# sourceMappingURL=file-lock-sync-root-mutation.d.ts.map
|
|
@@ -76,7 +76,7 @@ function ensureParent(pathAuthority) {
|
|
|
76
76
|
assertDirectoryCurrent(currentReceipt);
|
|
77
77
|
return currentReceipt;
|
|
78
78
|
}
|
|
79
|
-
export function createFileLockSyncRootFile(pathAuthority,
|
|
79
|
+
export function createFileLockSyncRootFile(pathAuthority, options) {
|
|
80
80
|
const parent = ensureParent(pathAuthority);
|
|
81
81
|
if (invokeFileLockSyncRootMutationAuthority(pathAuthority.authority)) {
|
|
82
82
|
assertFileLockSyncRootResolvedPathCurrent(pathAuthority);
|
|
@@ -88,12 +88,12 @@ export function createFileLockSyncRootFile(pathAuthority, mode, options = {}) {
|
|
|
88
88
|
let fd;
|
|
89
89
|
let receipt;
|
|
90
90
|
try {
|
|
91
|
-
options.assertBeforeOpen
|
|
91
|
+
options.assertBeforeOpen();
|
|
92
92
|
try {
|
|
93
|
-
fd = fs.openSync(pathForWindowsFilesystem(pathAuthority.path), fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL | noFollow,
|
|
93
|
+
fd = fs.openSync(pathForWindowsFilesystem(pathAuthority.path), fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL | noFollow, 0o600);
|
|
94
94
|
}
|
|
95
95
|
catch (error) {
|
|
96
|
-
options.onOpenFailure
|
|
96
|
+
options.onOpenFailure(error);
|
|
97
97
|
throw error;
|
|
98
98
|
}
|
|
99
99
|
const opened = inspectFileIdentitySync(() => fs.fstatSync(fd, { bigint: true }));
|
|
@@ -193,11 +193,9 @@ export function removeFileLockSyncRootFile(pathAuthority, receipt, expected, ass
|
|
|
193
193
|
}
|
|
194
194
|
throw new FsSafeError("path-mismatch", "sidecar lock was replaced during removal");
|
|
195
195
|
}
|
|
196
|
-
export function fileLockSyncRootGuardExists(pathAuthority
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
// A shared path admission may skip only duplicate resolution, never this
|
|
200
|
-
// operation-local Root identity fence before fresh directory inspection.
|
|
196
|
+
export function fileLockSyncRootGuardExists(pathAuthority) {
|
|
197
|
+
// The caller already admitted this path; every guard observation still needs
|
|
198
|
+
// an operation-local Root identity fence before fresh directory inspection.
|
|
201
199
|
assertRootIdentityCurrentSync(pathAuthority.authority.context);
|
|
202
200
|
let stat;
|
|
203
201
|
try {
|
|
@@ -17,4 +17,3 @@ type CapturedRootSyncAcquireOptions<TPayload extends Record<string, unknown>> =
|
|
|
17
17
|
}>;
|
|
18
18
|
export declare function captureRootSyncAcquireOptions<TPayload extends Record<string, unknown>>(options: FileLockSyncAcquireOptions<TPayload>): CapturedRootSyncAcquireOptions<TPayload>;
|
|
19
19
|
export {};
|
|
20
|
-
//# sourceMappingURL=file-lock-sync-root-options.d.ts.map
|
|
@@ -30,7 +30,6 @@ type RootPathResolutionPolicy = Readonly<{
|
|
|
30
30
|
}>;
|
|
31
31
|
export declare function admitFileLockSyncRootPath(authority: FileLockSyncRootAuthority, requestedPath: string): FileLockSyncRootPath;
|
|
32
32
|
export declare function assertFileLockSyncRootResolvedPathCurrent(pathAuthority: FileLockSyncRootPath): void;
|
|
33
|
-
export declare function assertFileLockSyncRootPathsCurrent(paths: readonly FileLockSyncRootPath[]
|
|
33
|
+
export declare function assertFileLockSyncRootPathsCurrent(paths: readonly FileLockSyncRootPath[]): void;
|
|
34
34
|
export declare function normalizeFileLockSyncTargetWithRoot(authority: FileLockSyncRootAuthority, resolvedTargetPath: string): string;
|
|
35
35
|
export {};
|
|
36
|
-
//# sourceMappingURL=file-lock-sync-root.d.ts.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import {} from "./deny-mutations.js";
|
|
3
|
+
import { assertMutationNotDenied } from "./deny-mutations.js";
|
|
4
4
|
import { FsSafeError } from "./errors.js";
|
|
5
|
-
import { assertNoNulPathInput, isNotFoundPathError
|
|
5
|
+
import { assertNoNulPathInput, isNotFoundPathError } from "./path.js";
|
|
6
6
|
import { resolveRootPathSync } from "./root-path.js";
|
|
7
7
|
import { isRootPathEscapeError } from "./root-path-errors.js";
|
|
8
8
|
import { admitPathInsideRoot } from "./root-boundary.js";
|
|
@@ -100,68 +100,8 @@ function absoluteRootPath(authority, relativePath) {
|
|
|
100
100
|
assertNoWindowsPathAlias(absolute, "filesystem", "sidecar lock path uses a Windows filesystem namespace alias");
|
|
101
101
|
return absolute;
|
|
102
102
|
}
|
|
103
|
-
function assertValidPolicyEntries(entries) {
|
|
104
|
-
const captured = [];
|
|
105
|
-
for (const entry of entries ?? []) {
|
|
106
|
-
if (!entry || !path.isAbsolute(entry)) {
|
|
107
|
-
throw new FsSafeError("invalid-path", "deny mutation paths must be non-empty absolute paths");
|
|
108
|
-
}
|
|
109
|
-
assertNoNulPathInput(entry, "deny mutation path contains a NUL byte");
|
|
110
|
-
assertNoWindowsPathAlias(entry, "filesystem", "deny mutation path uses a Windows filesystem namespace alias");
|
|
111
|
-
captured.push(resolvePathPreservingWindowsRoot(entry));
|
|
112
|
-
}
|
|
113
|
-
return captured;
|
|
114
|
-
}
|
|
115
|
-
function mutationComparablePaths(pathname) {
|
|
116
|
-
const resolved = resolvePathPreservingWindowsRoot(pathname);
|
|
117
|
-
assertNoWindowsPathAlias(resolved, "filesystem", "mutation path uses a Windows filesystem namespace alias");
|
|
118
|
-
let cursor = resolved;
|
|
119
|
-
const missing = [];
|
|
120
|
-
while (path.parse(cursor).root !== cursor) {
|
|
121
|
-
try {
|
|
122
|
-
fs.lstatSync(pathForWindowsFilesystem(cursor));
|
|
123
|
-
break;
|
|
124
|
-
}
|
|
125
|
-
catch (error) {
|
|
126
|
-
if (!isNotFoundPathError(error))
|
|
127
|
-
throw error;
|
|
128
|
-
missing.unshift(path.basename(cursor));
|
|
129
|
-
cursor = path.dirname(cursor);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
// Deny policy is an authority boundary: unlike advisory key normalization,
|
|
133
|
-
// an ambiguous existing ancestor must not silently fall back to lexical form.
|
|
134
|
-
const canonicalAncestor = realpathSync.native(pathForWindowsFilesystem(cursor));
|
|
135
|
-
assertNoWindowsPathAlias(canonicalAncestor, "filesystem", "mutation path uses a Windows filesystem namespace alias");
|
|
136
|
-
const canonical = missing.length === 0
|
|
137
|
-
? canonicalAncestor
|
|
138
|
-
: path.resolve(canonicalAncestor, ...missing);
|
|
139
|
-
assertNoWindowsPathAlias(canonical, "filesystem", "mutation path uses a Windows filesystem namespace alias");
|
|
140
|
-
return samePath(resolved, canonical) ? [resolved] : [resolved, canonical];
|
|
141
|
-
}
|
|
142
103
|
export function assertFileLockSyncRootMutationAllowed(pathname, policy, protectAncestors = false) {
|
|
143
|
-
|
|
144
|
-
return;
|
|
145
|
-
const targets = mutationComparablePaths(pathname);
|
|
146
|
-
for (const entry of assertValidPolicyEntries(policy.paths)) {
|
|
147
|
-
for (const denied of mutationComparablePaths(entry)) {
|
|
148
|
-
for (const target of targets) {
|
|
149
|
-
if ((isPathInside(denied, target) && isPathInside(target, denied)) ||
|
|
150
|
-
(protectAncestors && isPathInside(target, denied))) {
|
|
151
|
-
throw new FsSafeError("denied-path", "path is denied by denyMutations policy");
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
for (const entry of assertValidPolicyEntries(policy.prefixes)) {
|
|
157
|
-
for (const denied of mutationComparablePaths(entry)) {
|
|
158
|
-
for (const target of targets) {
|
|
159
|
-
if (isPathInside(denied, target) || (protectAncestors && isPathInside(target, denied))) {
|
|
160
|
-
throw new FsSafeError("denied-path", "path is denied by denyMutations policy");
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
104
|
+
assertMutationNotDenied(pathname, policy, { protectAncestors }, "sync-root-lock");
|
|
165
105
|
}
|
|
166
106
|
function resolveAdmittedPath(authority, absolutePath, policy, rootPath) {
|
|
167
107
|
const context = authority.context;
|
|
@@ -279,24 +219,14 @@ function assertMissingParentMutationsAllowed(pathAuthority) {
|
|
|
279
219
|
assertFileLockSyncRootMutationAllowed(current, authority.denyMutations);
|
|
280
220
|
}
|
|
281
221
|
}
|
|
282
|
-
export function assertFileLockSyncRootPathsCurrent(paths
|
|
222
|
+
export function assertFileLockSyncRootPathsCurrent(paths) {
|
|
283
223
|
const authority = paths[0]?.authority;
|
|
284
224
|
for (const pathAuthority of paths) {
|
|
285
225
|
if (authority && pathAuthority.authority !== authority) {
|
|
286
226
|
throw new FsSafeError("path-mismatch", "sidecar paths use different Root authority");
|
|
287
227
|
}
|
|
288
228
|
}
|
|
289
|
-
if (
|
|
290
|
-
if (authority)
|
|
291
|
-
assertRootIdentityCurrentSync(authority.context);
|
|
292
|
-
for (const pathAuthority of paths) {
|
|
293
|
-
assertFileLockSyncRootResolvedPathCurrent(pathAuthority);
|
|
294
|
-
assertMissingParentMutationsAllowed(pathAuthority);
|
|
295
|
-
}
|
|
296
|
-
if (authority)
|
|
297
|
-
assertRootIdentityCurrentSync(authority.context);
|
|
298
|
-
}
|
|
299
|
-
if (invokeAuthority && authority && invokeFileLockSyncRootMutationAuthority(authority)) {
|
|
229
|
+
if (authority && invokeFileLockSyncRootMutationAuthority(authority)) {
|
|
300
230
|
assertRootIdentityCurrentSync(authority.context);
|
|
301
231
|
for (const pathAuthority of paths) {
|
|
302
232
|
assertFileLockSyncRootResolvedPathCurrent(pathAuthority);
|
|
@@ -309,16 +239,13 @@ function resolveTargetPathViaExistingAncestorSync(targetPath) {
|
|
|
309
239
|
const normalized = resolvePathPreservingWindowsRoot(targetPath);
|
|
310
240
|
const canonicalize = process.platform === "win32" ? realpathSync.native : realpathSync;
|
|
311
241
|
let cursor = normalized;
|
|
312
|
-
|
|
242
|
+
let canonicalAncestor;
|
|
313
243
|
while (true) {
|
|
314
244
|
try {
|
|
315
245
|
fs.lstatSync(pathForWindowsFilesystem(cursor));
|
|
316
246
|
try {
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
return missing.length === 0
|
|
320
|
-
? resolvePathPreservingWindowsRoot(canonicalAncestor)
|
|
321
|
-
: resolvePathPreservingWindowsRoot(path.resolve(canonicalAncestor, ...missing));
|
|
247
|
+
canonicalAncestor = canonicalize(pathForWindowsFilesystem(cursor));
|
|
248
|
+
break;
|
|
322
249
|
}
|
|
323
250
|
catch (error) {
|
|
324
251
|
if (!isNotFoundPathError(error))
|
|
@@ -336,15 +263,15 @@ function resolveTargetPathViaExistingAncestorSync(targetPath) {
|
|
|
336
263
|
if (parent === cursor) {
|
|
337
264
|
// Filesystem roots are expected to exist; preserve the underlying
|
|
338
265
|
// not-found diagnosis if a synthetic namespace violates that premise.
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
return missing.length === 0
|
|
342
|
-
? resolvePathPreservingWindowsRoot(canonicalAncestor)
|
|
343
|
-
: resolvePathPreservingWindowsRoot(path.resolve(canonicalAncestor, ...missing));
|
|
266
|
+
canonicalAncestor = canonicalize(pathForWindowsFilesystem(cursor));
|
|
267
|
+
break;
|
|
344
268
|
}
|
|
345
|
-
missing.unshift(path.basename(cursor));
|
|
346
269
|
cursor = parent;
|
|
347
270
|
}
|
|
271
|
+
assertNoWindowsPathAlias(canonicalAncestor, "filesystem", "file-lock target ancestor uses a Windows filesystem namespace alias");
|
|
272
|
+
return resolvePathPreservingWindowsRoot(cursor === normalized
|
|
273
|
+
? canonicalAncestor
|
|
274
|
+
: path.resolve(canonicalAncestor, `.${path.sep}${normalized.slice(cursor.length)}`));
|
|
348
275
|
}
|
|
349
276
|
export function normalizeFileLockSyncTargetWithRoot(authority, resolvedTargetPath) {
|
|
350
277
|
assertNoNulPathInput(resolvedTargetPath, "file-lock target contains a NUL byte");
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { FileLockSyncAcquireOptions } from "./file-lock-sync.js";
|
|
2
|
+
import type { SyncLockAcquisition } from "./file-lock-sync-acquisition.js";
|
|
2
3
|
import type { SidecarLockStaleRecovery } from "./sidecar-lock-types.js";
|
|
3
4
|
export type SyncStaleOptionsState<TPayload extends Record<string, unknown>> = {
|
|
4
5
|
shouldReclaimObserved?: boolean;
|
|
@@ -7,18 +8,12 @@ export type SyncStaleOptionsState<TPayload extends Record<string, unknown>> = {
|
|
|
7
8
|
shouldRemove?: FileLockSyncAcquireOptions<TPayload>["shouldRemoveStaleLock"];
|
|
8
9
|
};
|
|
9
10
|
/** Handle one exclusive-create conflict without surrendering canonical admission. */
|
|
10
|
-
export declare function handleSyncStaleAdmission<TPayload extends Record<string, unknown>>(params: {
|
|
11
|
-
hasToken(): boolean;
|
|
11
|
+
export declare function handleSyncStaleAdmission<TPayload extends Record<string, unknown>>(acquisition: SyncLockAcquisition, params: {
|
|
12
12
|
currentHeld(): unknown;
|
|
13
|
-
lockPath: string;
|
|
14
|
-
normalizedTargetPath: string;
|
|
15
13
|
options: FileLockSyncAcquireOptions<TPayload>;
|
|
16
14
|
parsePayload?: (raw: string) => unknown;
|
|
17
15
|
reclaimGuardPath: string;
|
|
18
|
-
retryLockFileDenial(error: unknown): boolean;
|
|
19
16
|
staleMs: number;
|
|
20
17
|
staleOptions: SyncStaleOptionsState<TPayload>;
|
|
21
18
|
staleRecovery?: SidecarLockStaleRecovery;
|
|
22
|
-
waitForRetry(): void;
|
|
23
19
|
}): void;
|
|
24
|
-
//# sourceMappingURL=file-lock-sync-stale-admission.d.ts.map
|