@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
package/dist/file-cleanup.js
CHANGED
|
@@ -3,17 +3,20 @@ import fs, {} from "node:fs/promises";
|
|
|
3
3
|
import { assertAsyncDirectoryGuard } from "./directory-guard.js";
|
|
4
4
|
import { FsSafeError } from "./errors.js";
|
|
5
5
|
import { sameFileIdentityForCleanup } from "./file-identity.js";
|
|
6
|
-
export function
|
|
6
|
+
export function readErrorCode(error) {
|
|
7
7
|
if ((typeof error !== "object" || error === null) && typeof error !== "function") {
|
|
8
|
-
return
|
|
8
|
+
return undefined;
|
|
9
9
|
}
|
|
10
10
|
try {
|
|
11
|
-
return Reflect.get(error, "code")
|
|
11
|
+
return Reflect.get(error, "code");
|
|
12
12
|
}
|
|
13
13
|
catch {
|
|
14
|
-
return
|
|
14
|
+
return undefined;
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
+
export function hasErrorCode(error, expected) {
|
|
18
|
+
return readErrorCode(error) === expected;
|
|
19
|
+
}
|
|
17
20
|
export async function removeOwnedPath(params) {
|
|
18
21
|
if (!params.identity)
|
|
19
22
|
return "preserved";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type SameFileContentsOptions = {
|
|
2
|
+
maxBytes?: number;
|
|
3
|
+
};
|
|
4
|
+
/** Compares borrowed regular files from offset zero without moving or closing either descriptor. */
|
|
5
|
+
export declare function sameFileContentsSync(leftFd: number, rightFd: number, options?: SameFileContentsOptions): boolean;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { normalizeMaxBytes } from "./byte-budget.js";
|
|
3
|
+
import { FsSafeError } from "./errors.js";
|
|
4
|
+
import { readFileWindowFullySync } from "./positional-read.js";
|
|
5
|
+
/** Compares borrowed regular files from offset zero without moving or closing either descriptor. */
|
|
6
|
+
export function sameFileContentsSync(leftFd, rightFd, options = {}) {
|
|
7
|
+
const maxBytes = normalizeMaxBytes(options.maxBytes) ?? Infinity;
|
|
8
|
+
const limit = Math.min(maxBytes, Number.MAX_SAFE_INTEGER);
|
|
9
|
+
const tooLarge = () => new FsSafeError("too-large", `file comparison exceeds ${limit} bytes`);
|
|
10
|
+
for (const fd of [leftFd, rightFd]) {
|
|
11
|
+
const stat = fs.fstatSync(fd, { bigint: true });
|
|
12
|
+
if (!stat.isFile()) {
|
|
13
|
+
throw new FsSafeError("not-file", "file comparison requires regular-file descriptors");
|
|
14
|
+
}
|
|
15
|
+
if (stat.size > BigInt(limit))
|
|
16
|
+
throw tooLarge();
|
|
17
|
+
}
|
|
18
|
+
const left = Buffer.allocUnsafe(Math.min(1024 * 1024, Math.max(1, limit)));
|
|
19
|
+
const right = Buffer.allocUnsafe(left.length);
|
|
20
|
+
let position = 0;
|
|
21
|
+
while (true) {
|
|
22
|
+
const length = Math.min(left.length, limit - position);
|
|
23
|
+
if (length === 0) {
|
|
24
|
+
// Probe EOF at the limit without forming an unsafe exclusive window end.
|
|
25
|
+
const leftExtra = fs.readSync(leftFd, left, 0, 1, position);
|
|
26
|
+
const rightExtra = fs.readSync(rightFd, right, 0, 1, position);
|
|
27
|
+
if (leftExtra !== 0 || rightExtra !== 0)
|
|
28
|
+
throw tooLarge();
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
const leftRead = readFileWindowFullySync(leftFd, left.subarray(0, length), position);
|
|
32
|
+
const rightRead = readFileWindowFullySync(rightFd, right.subarray(0, length), position);
|
|
33
|
+
if (leftRead !== rightRead || !left.subarray(0, leftRead).equals(right.subarray(0, rightRead))) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
if (leftRead < length)
|
|
37
|
+
return true;
|
|
38
|
+
position += leftRead;
|
|
39
|
+
}
|
|
40
|
+
}
|
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 });
|
|
@@ -99,14 +192,20 @@ async function hashPath(filePath, options) {
|
|
|
99
192
|
catch (error) {
|
|
100
193
|
rethrowHashOpenError(error);
|
|
101
194
|
}
|
|
195
|
+
let completed = false;
|
|
102
196
|
try {
|
|
103
197
|
options.signal?.throwIfAborted();
|
|
104
198
|
const opened = await inspectFileIdentity(() => hashDescriptorIdentity(handle.fd), before);
|
|
105
199
|
await inspectFileIdentity(() => hashPathIdentity(filePath, true), opened);
|
|
106
|
-
|
|
200
|
+
const result = await hashFileHandle(handle, getNativeBinding(), options);
|
|
201
|
+
completed = true;
|
|
202
|
+
return result;
|
|
107
203
|
}
|
|
108
204
|
finally {
|
|
109
|
-
|
|
205
|
+
if (completed)
|
|
206
|
+
await handle.close();
|
|
207
|
+
else
|
|
208
|
+
await handle.close().catch(() => undefined);
|
|
110
209
|
}
|
|
111
210
|
}
|
|
112
211
|
export async function sha256File(input, options = {}) {
|
|
@@ -117,34 +216,45 @@ export async function sha256File(input, options = {}) {
|
|
|
117
216
|
: await hashFileHandle(input, getNativeBinding(), normalized);
|
|
118
217
|
}
|
|
119
218
|
function hashDescriptorSync(fd, { maxBytes = Infinity, signal }) {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
if (!stat.isFile()) {
|
|
123
|
-
throw new FsSafeError("not-file", "SHA-256 input is not a regular file");
|
|
124
|
-
}
|
|
125
|
-
if (stat.size > maxBytes) {
|
|
126
|
-
throw new FsSafeError("too-large", `SHA-256 input exceeds ${maxBytes} bytes`);
|
|
127
|
-
}
|
|
128
|
-
const hash = createHash("sha256");
|
|
129
|
-
let buffer = Buffer.allocUnsafe(Math.min(256 * 1024, Math.max(1, stat.size + 1), maxBytes + 1));
|
|
130
|
-
let position = 0;
|
|
131
|
-
while (true) {
|
|
132
|
-
signal?.throwIfAborted();
|
|
133
|
-
const length = Math.min(buffer.length, maxBytes - position + 1);
|
|
134
|
-
const bytesRead = fsSync.readSync(fd, buffer, 0, length, position);
|
|
219
|
+
const env_2 = { stack: [], error: void 0, hasError: false };
|
|
220
|
+
try {
|
|
135
221
|
signal?.throwIfAborted();
|
|
136
|
-
|
|
137
|
-
|
|
222
|
+
const stat = fsSync.fstatSync(fd);
|
|
223
|
+
if (!stat.isFile()) {
|
|
224
|
+
throw new FsSafeError("not-file", "SHA-256 input is not a regular file");
|
|
138
225
|
}
|
|
139
|
-
if (
|
|
140
|
-
|
|
226
|
+
if (stat.size > maxBytes) {
|
|
227
|
+
throw new FsSafeError("too-large", `SHA-256 input exceeds ${maxBytes} bytes`);
|
|
141
228
|
}
|
|
142
|
-
hash
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
+
}
|
|
146
249
|
}
|
|
147
250
|
}
|
|
251
|
+
catch (e_2) {
|
|
252
|
+
env_2.error = e_2;
|
|
253
|
+
env_2.hasError = true;
|
|
254
|
+
}
|
|
255
|
+
finally {
|
|
256
|
+
__disposeResources(env_2);
|
|
257
|
+
}
|
|
148
258
|
}
|
|
149
259
|
function hashPathSync(filePath, options) {
|
|
150
260
|
assertNoWindowsPathAlias(filePath, "filesystem", "SHA-256 path uses a Windows filesystem namespace alias");
|
|
@@ -157,17 +267,23 @@ function hashPathSync(filePath, options) {
|
|
|
157
267
|
catch (error) {
|
|
158
268
|
rethrowHashOpenError(error);
|
|
159
269
|
}
|
|
270
|
+
let completed = false;
|
|
160
271
|
try {
|
|
161
272
|
options.signal?.throwIfAborted();
|
|
162
273
|
const opened = inspectFileIdentitySync(() => hashDescriptorIdentity(fd), before);
|
|
163
274
|
inspectFileIdentitySync(() => hashPathIdentity(filePath, true), opened);
|
|
164
|
-
|
|
275
|
+
const result = hashDescriptorSync(fd, options);
|
|
276
|
+
completed = true;
|
|
277
|
+
return result;
|
|
165
278
|
}
|
|
166
279
|
finally {
|
|
167
280
|
try {
|
|
168
281
|
fsSync.closeSync(fd);
|
|
169
282
|
}
|
|
170
|
-
catch {
|
|
283
|
+
catch (error) {
|
|
284
|
+
if (completed)
|
|
285
|
+
throw error;
|
|
286
|
+
}
|
|
171
287
|
}
|
|
172
288
|
}
|
|
173
289
|
/** Hash synchronously from offset zero, retaining ownership and position of a borrowed fd. */
|
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 = Date.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, Date.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
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
|
-
import { sidecarLockPayloadCreatedAtMs } from "./sidecar-lock-policy.js";
|
|
2
|
+
import { sidecarLockPayloadCreatedAtMs, sidecarLockTimeout } from "./sidecar-lock-policy.js";
|
|
3
|
+
import { ensureSidecarLockCleanupRegistered } from "./sidecar-lock-registration.js";
|
|
3
4
|
const SYNC_HELD_LOCKS_KEY = Symbol.for("fsSafe.syncSidecarLocks");
|
|
4
5
|
const SYNC_ADMISSIONS_KEY = Symbol.for("fsSafe.syncSidecarLockAdmissions");
|
|
5
6
|
const SYNC_CLEANUP_REGISTERED_KEY = Symbol.for("fsSafe.syncSidecarLockCleanupRegistered");
|
|
@@ -25,13 +26,6 @@ export function getSyncLockAdmissions() {
|
|
|
25
26
|
}
|
|
26
27
|
return globalWithState[SYNC_ADMISSIONS_KEY];
|
|
27
28
|
}
|
|
28
|
-
export function syncLockTimeout(lockPath, normalizedTargetPath) {
|
|
29
|
-
return Object.assign(new Error(`file lock timeout for ${normalizedTargetPath}`), {
|
|
30
|
-
code: "file_lock_timeout",
|
|
31
|
-
lockPath,
|
|
32
|
-
normalizedTargetPath,
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
29
|
export function defaultSyncShouldReclaim(snapshot, staleMs, nowMs) {
|
|
36
30
|
const createdAtMs = sidecarLockPayloadCreatedAtMs(snapshot.payload);
|
|
37
31
|
if (createdAtMs !== null)
|
|
@@ -50,44 +44,11 @@ export function syncReclaimGuardExists(reclaimGuardPath) {
|
|
|
50
44
|
}
|
|
51
45
|
}
|
|
52
46
|
export function ensureSyncLockExitCleanupRegistered(cleanup, lockPath, normalizedTargetPath) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
const registration = {};
|
|
62
|
-
globalWithCleanup[SYNC_CLEANUP_REGISTRATION_KEY] = registration;
|
|
63
|
-
try {
|
|
64
|
-
process.on("exit", cleanup);
|
|
65
|
-
globalWithCleanup[SYNC_CLEANUP_HANDLER_KEY] = cleanup;
|
|
66
|
-
globalWithCleanup[SYNC_CLEANUP_REGISTERED_KEY] = true;
|
|
67
|
-
}
|
|
68
|
-
catch (error) {
|
|
69
|
-
if (process.listeners("exit").includes(cleanup)) {
|
|
70
|
-
try {
|
|
71
|
-
process.off("exit", cleanup);
|
|
72
|
-
}
|
|
73
|
-
catch {
|
|
74
|
-
// Reconcile the marker with the actual listener below.
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
if (process.listeners("exit").includes(cleanup)) {
|
|
78
|
-
globalWithCleanup[SYNC_CLEANUP_HANDLER_KEY] = cleanup;
|
|
79
|
-
globalWithCleanup[SYNC_CLEANUP_REGISTERED_KEY] = true;
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
if (globalWithCleanup[SYNC_CLEANUP_HANDLER_KEY] === cleanup) {
|
|
83
|
-
delete globalWithCleanup[SYNC_CLEANUP_HANDLER_KEY];
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
throw error;
|
|
87
|
-
}
|
|
88
|
-
finally {
|
|
89
|
-
if (globalWithCleanup[SYNC_CLEANUP_REGISTRATION_KEY] === registration) {
|
|
90
|
-
delete globalWithCleanup[SYNC_CLEANUP_REGISTRATION_KEY];
|
|
91
|
-
}
|
|
92
|
-
}
|
|
47
|
+
ensureSidecarLockCleanupRegistered({
|
|
48
|
+
event: "exit",
|
|
49
|
+
registered: SYNC_CLEANUP_REGISTERED_KEY,
|
|
50
|
+
registering: SYNC_CLEANUP_REGISTRATION_KEY,
|
|
51
|
+
handler: SYNC_CLEANUP_HANDLER_KEY,
|
|
52
|
+
reentryError: () => sidecarLockTimeout(lockPath, normalizedTargetPath),
|
|
53
|
+
}, cleanup, true);
|
|
93
54
|
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
import type { FileLockSyncAcquireOptions, FileLockSyncHandle } from "./file-lock-sync.js";
|
|
2
2
|
import type { Root } from "./root-impl.js";
|
|
3
3
|
export declare function acquireFileLockSyncWithRoot<TPayload extends Record<string, unknown>>(targetPath: string, inputOptions: FileLockSyncAcquireOptions<TPayload>, lockRoot: Root): FileLockSyncHandle;
|
|
4
|
-
//# sourceMappingURL=file-lock-sync-root-acquire.d.ts.map
|