@openclaw/fs-safe 0.17.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 +43 -0
- package/dist/absolute-path.d.ts +0 -1
- package/dist/advanced.d.ts +0 -1
- package/dist/archive-crc32.d.ts +0 -1
- package/dist/archive-deadline.d.ts +0 -1
- 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 +2 -4
- package/dist/archive-merge.js +14 -4
- package/dist/archive-native.d.ts +3 -15
- package/dist/archive-native.js +46 -71
- package/dist/archive-options.d.ts +7 -2
- package/dist/archive-parser-errors.d.ts +0 -1
- 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-directory.d.ts +0 -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 +0 -1
- package/dist/archive-zip-manifest.d.ts +0 -1
- package/dist/archive-zip-names.d.ts +0 -1
- package/dist/archive-zip-preflight.d.ts +0 -1
- package/dist/archive.d.ts +0 -1
- package/dist/archive.js +87 -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 +0 -1
- package/dist/clone-metadata.d.ts +0 -1
- package/dist/config.d.ts +0 -1
- package/dist/containment.d.ts +0 -1
- package/dist/copy-file-input.d.ts +0 -1
- package/dist/copy-policy.d.ts +0 -1
- package/dist/copy-publication.d.ts +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 -1
- 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 +0 -1
- package/dist/directory-entry-path.d.ts +0 -1
- package/dist/directory-guard.d.ts +2 -7
- package/dist/directory-guard.js +25 -56
- package/dist/directory-mode-node.d.ts +0 -1
- package/dist/directory-mode-owner.d.ts +0 -1
- package/dist/directory-receipt.d.ts +0 -1
- 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 +0 -1
- package/dist/file-contents.d.ts +0 -1
- package/dist/file-handle-transfer.d.ts +0 -1
- package/dist/file-hash.d.ts +0 -1
- package/dist/file-hash.js +170 -66
- package/dist/file-identity.d.ts +0 -1
- package/dist/file-lock-sync-acquisition.d.ts +22 -0
- package/dist/file-lock-sync-acquisition.js +98 -0
- package/dist/file-lock-sync-admission.d.ts +0 -2
- package/dist/file-lock-sync-admission.js +9 -48
- package/dist/file-lock-sync-root-acquire.d.ts +0 -1
- package/dist/file-lock-sync-root-acquire.js +32 -98
- package/dist/file-lock-sync-root-arbitration.d.ts +0 -1
- package/dist/file-lock-sync-root-held.d.ts +0 -1
- package/dist/file-lock-sync-root-io.d.ts +0 -1
- package/dist/file-lock-sync-root-mutation.d.ts +4 -5
- package/dist/file-lock-sync-root-mutation.js +7 -9
- package/dist/file-lock-sync-root-options.d.ts +0 -1
- package/dist/file-lock-sync-root-registration.d.ts +0 -1
- package/dist/file-lock-sync-root.d.ts +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 +21 -23
- package/dist/file-lock-sync.d.ts +0 -1
- package/dist/file-lock-sync.js +38 -117
- package/dist/file-lock.d.ts +0 -1
- package/dist/file-observation.d.ts +0 -1
- package/dist/file-store-boundary.d.ts +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 +3 -4
- 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-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/json-document-store.d.ts +0 -1
- package/dist/json-durable-queue-directory.d.ts +13 -1
- package/dist/json-durable-queue-directory.js +134 -0
- package/dist/json-durable-queue-ownership.d.ts +0 -1
- package/dist/json-durable-queue-ownership.js +42 -61
- package/dist/json-durable-queue-read.d.ts +0 -1
- package/dist/json-durable-queue-read.js +6 -6
- package/dist/json-durable-queue.d.ts +0 -1
- package/dist/json-durable-queue.js +7 -130
- 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 +6 -15
- package/dist/local-file-access.d.ts +0 -1
- package/dist/local-file-access.js +3 -10
- package/dist/local-file-descriptor.d.ts +0 -1
- package/dist/local-roots.d.ts +0 -1
- package/dist/lock-config.d.ts +0 -1
- package/dist/move-path-cleanup.d.ts +0 -1
- package/dist/move-path-stage.d.ts +0 -1
- package/dist/move-path.d.ts +0 -1
- package/dist/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 +15 -3
- package/dist/native-staged-file.js +55 -63
- package/dist/native.d.ts +0 -1
- package/dist/opened-file-failure.d.ts +0 -1
- package/dist/opened-realpath.d.ts +0 -1
- package/dist/output.d.ts +0 -1
- package/dist/overwrite-file-handle.d.ts +0 -1
- package/dist/owner-dacl.d.ts +0 -1
- package/dist/path-case.d.ts +0 -1
- package/dist/path-policy.d.ts +0 -1
- package/dist/path-prefix.d.ts +0 -1
- package/dist/path-scope-lexical.d.ts +0 -1
- package/dist/path-segment-route.d.ts +0 -1
- package/dist/path-suffix-aliases.d.ts +0 -1
- package/dist/path.d.ts +0 -1
- package/dist/permission-exec.d.ts +0 -1
- package/dist/permission-exec.js +19 -25
- package/dist/permissions-public.d.ts +0 -1
- package/dist/permissions-windows.d.ts +2 -10
- package/dist/permissions-windows.js +10 -30
- package/dist/permissions.d.ts +0 -1
- package/dist/permissions.js +8 -16
- package/dist/pinned-mutation-admission.d.ts +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-mode.d.ts +0 -1
- package/dist/pinned-write-staged.d.ts +0 -1
- package/dist/pinned-write-types.d.ts +9 -21
- package/dist/pinned-write.d.ts +0 -1
- 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 +0 -1
- package/dist/read-open-flags.d.ts +0 -1
- package/dist/read-opened-file.d.ts +0 -1
- package/dist/realpath.d.ts +0 -1
- package/dist/recursive-mkdir-path.d.ts +0 -1
- package/dist/regular-file.d.ts +0 -1
- package/dist/regular-file.js +77 -139
- package/dist/replace-directory.d.ts +0 -1
- package/dist/replace-file-copy-fallback.d.ts +0 -1
- package/dist/replace-file-copy-fallback.js +14 -3
- package/dist/replace-file-copy-source.d.ts +0 -1
- package/dist/replace-file-copy-source.js +6 -1
- package/dist/replace-file-descriptor.d.ts +0 -1
- package/dist/replace-file-descriptor.js +6 -1
- package/dist/replace-file-mode.d.ts +0 -1
- package/dist/replace-file-rename-policy.d.ts +0 -1
- package/dist/replace-file-temp-owner.d.ts +12 -13
- package/dist/replace-file-temp-owner.js +66 -85
- package/dist/replace-file.d.ts +0 -1
- package/dist/retained-directory-replacement.d.ts +0 -1
- package/dist/root-boundary.d.ts +0 -1
- package/dist/root-context.d.ts +0 -1
- package/dist/root-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.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 +0 -1
- package/dist/root-file.d.ts +0 -1
- package/dist/root-impl.d.ts +2 -10
- package/dist/root-impl.js +114 -91
- package/dist/root-move-noreplace.d.ts +0 -1
- 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 -44
- 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-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 +31 -52
- package/dist/sidecar-lock-admission-context.d.ts +0 -1
- package/dist/sidecar-lock-admission-parser.d.ts +0 -1
- package/dist/sidecar-lock-admission.d.ts +1 -5
- package/dist/sidecar-lock-admission.js +1 -7
- package/dist/sidecar-lock-handle.d.ts +0 -1
- package/dist/sidecar-lock-policy.d.ts +3 -1
- package/dist/sidecar-lock-policy.js +16 -0
- package/dist/sidecar-lock-reclaim.d.ts +0 -1
- package/dist/sidecar-lock-registration.d.ts +13 -0
- package/dist/sidecar-lock-registration.js +47 -0
- package/dist/sidecar-lock-root.d.ts +0 -1
- package/dist/sidecar-lock-stale-admission.d.ts +0 -1
- package/dist/sidecar-lock-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 +16 -83
- package/dist/staged-directory.d.ts +0 -1
- package/dist/staged-file-settlement.d.ts +0 -1
- package/dist/staged-file-types.d.ts +0 -1
- package/dist/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 +0 -1
- package/dist/string-coerce.d.ts +0 -1
- package/dist/suppressed-error.d.ts +0 -1
- package/dist/symlink-parents.d.ts +0 -1
- package/dist/temp-cleanup.d.ts +0 -1
- package/dist/temp-target.d.ts +0 -1
- package/dist/temp-target.js +7 -46
- package/dist/temp-workspace-admission.d.ts +0 -8
- package/dist/temp-workspace-admission.js +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 +45 -22
- 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/walk.d.ts +0 -1
- package/dist/windows-command.d.ts +0 -1
- package/dist/windows-owner.d.ts +0 -1
- package/dist/windows-owner.js +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 +0 -1
- package/dist/write-open-flags.d.ts +0 -1
- package/dist/write-queue.d.ts +0 -1
- package/docs/atomic.md +14 -0
- package/docs/copy.md +2 -0
- package/docs/mutation-policy-proof.md +6 -4
- package/docs/permissions.md +6 -0
- package/docs/root.md +10 -0
- package/docs/secret-file.md +4 -0
- package/docs/writing.md +9 -3
- package/package.json +8 -9
- package/dist/absolute-path.d.ts.map +0 -1
- package/dist/advanced.d.ts.map +0 -1
- package/dist/archive-crc32.d.ts.map +0 -1
- package/dist/archive-deadline.d.ts.map +0 -1
- package/dist/archive-durability.d.ts.map +0 -1
- package/dist/archive-entry.d.ts.map +0 -1
- package/dist/archive-errors.d.ts.map +0 -1
- package/dist/archive-gzip-tail.d.ts.map +0 -1
- package/dist/archive-input.d.ts.map +0 -1
- package/dist/archive-kind.d.ts.map +0 -1
- package/dist/archive-limits.d.ts.map +0 -1
- package/dist/archive-merge.d.ts.map +0 -1
- package/dist/archive-native.d.ts.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/byte-view.d.ts.map +0 -1
- package/dist/clone-metadata.d.ts.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/containment.d.ts.map +0 -1
- package/dist/copy-file-input.d.ts.map +0 -1
- package/dist/copy-policy.d.ts.map +0 -1
- package/dist/copy-publication.d.ts.map +0 -1
- package/dist/copy-tree-portable.d.ts.map +0 -1
- package/dist/copy.d.ts.map +0 -1
- package/dist/create-directory.d.ts.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-contents.d.ts.map +0 -1
- package/dist/file-handle-transfer.d.ts.map +0 -1
- package/dist/file-hash.d.ts.map +0 -1
- package/dist/file-identity.d.ts.map +0 -1
- package/dist/file-lock-sync-admission.d.ts.map +0 -1
- package/dist/file-lock-sync-root-acquire.d.ts.map +0 -1
- package/dist/file-lock-sync-root-arbitration.d.ts.map +0 -1
- package/dist/file-lock-sync-root-held.d.ts.map +0 -1
- package/dist/file-lock-sync-root-io.d.ts.map +0 -1
- package/dist/file-lock-sync-root-mutation.d.ts.map +0 -1
- package/dist/file-lock-sync-root-options.d.ts.map +0 -1
- package/dist/file-lock-sync-root-registration.d.ts.map +0 -1
- package/dist/file-lock-sync-root.d.ts.map +0 -1
- package/dist/file-lock-sync-stale-admission.d.ts.map +0 -1
- package/dist/file-lock-sync.d.ts.map +0 -1
- package/dist/file-lock.d.ts.map +0 -1
- package/dist/file-observation.d.ts.map +0 -1
- package/dist/file-store-boundary.d.ts.map +0 -1
- package/dist/file-store-copy-source.d.ts.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 -20
- package/dist/json-durable-queue-read.d.ts.map +0 -1
- package/dist/json-durable-queue.d.ts.map +0 -1
- package/dist/json-store.d.ts.map +0 -1
- package/dist/json-stringify.d.ts.map +0 -1
- package/dist/json.d.ts.map +0 -1
- package/dist/local-file-access.d.ts.map +0 -1
- package/dist/local-file-descriptor.d.ts.map +0 -1
- package/dist/local-roots.d.ts.map +0 -1
- package/dist/lock-config.d.ts.map +0 -1
- package/dist/move-path-cleanup.d.ts.map +0 -1
- package/dist/move-path-stage.d.ts.map +0 -1
- package/dist/move-path.d.ts.map +0 -1
- package/dist/mutation-authority.d.ts.map +0 -1
- package/dist/native-binding.d.ts.map +0 -1
- package/dist/native-config.d.ts.map +0 -1
- package/dist/native-directory-observation.d.ts.map +0 -1
- package/dist/native-fallback-warning.d.ts.map +0 -1
- package/dist/native-operations.d.ts.map +0 -1
- package/dist/native-parent-admission.d.ts.map +0 -1
- package/dist/native-pinned-write-windows.d.ts.map +0 -1
- package/dist/native-pinned-write.d.ts.map +0 -1
- package/dist/native-policy-directory-observation.d.ts.map +0 -1
- package/dist/native-policy-parent-windows.d.ts.map +0 -1
- package/dist/native-rename-outcome.d.ts.map +0 -1
- package/dist/native-staged-file.d.ts.map +0 -1
- package/dist/native.d.ts.map +0 -1
- package/dist/opened-file-failure.d.ts.map +0 -1
- package/dist/opened-realpath.d.ts.map +0 -1
- package/dist/output.d.ts.map +0 -1
- package/dist/overwrite-file-handle.d.ts.map +0 -1
- package/dist/owner-dacl.d.ts.map +0 -1
- package/dist/path-case.d.ts.map +0 -1
- package/dist/path-policy.d.ts.map +0 -1
- package/dist/path-prefix.d.ts.map +0 -1
- package/dist/path-scope-lexical.d.ts.map +0 -1
- package/dist/path-segment-route.d.ts.map +0 -1
- package/dist/path-suffix-aliases.d.ts.map +0 -1
- package/dist/path.d.ts.map +0 -1
- package/dist/permission-exec.d.ts.map +0 -1
- package/dist/permissions-public.d.ts.map +0 -1
- package/dist/permissions-windows.d.ts.map +0 -1
- package/dist/permissions.d.ts.map +0 -1
- package/dist/pinned-mutation-admission.d.ts.map +0 -1
- package/dist/pinned-mutation-observation.d.ts.map +0 -1
- package/dist/pinned-mutation-shared-route.d.ts.map +0 -1
- package/dist/pinned-open.d.ts.map +0 -1
- package/dist/pinned-operation.d.ts.map +0 -1
- package/dist/pinned-write-input.d.ts.map +0 -1
- package/dist/pinned-write-mode.d.ts.map +0 -1
- package/dist/pinned-write-staged.d.ts.map +0 -1
- package/dist/pinned-write-types.d.ts.map +0 -1
- package/dist/pinned-write.d.ts.map +0 -1
- package/dist/positional-read.d.ts.map +0 -1
- package/dist/private-directory.d.ts.map +0 -1
- package/dist/private-producer-handoff-sync.d.ts.map +0 -1
- package/dist/private-producer-handoff.d.ts.map +0 -1
- package/dist/private-temp-workspace.d.ts.map +0 -1
- package/dist/publish-copy-stage.d.ts.map +0 -1
- package/dist/publish-file-failure.d.ts.map +0 -1
- package/dist/publish-file.d.ts.map +0 -1
- package/dist/read-open-flags.d.ts.map +0 -1
- package/dist/read-opened-file.d.ts.map +0 -1
- package/dist/realpath.d.ts.map +0 -1
- package/dist/recursive-mkdir-path.d.ts.map +0 -1
- package/dist/regular-file.d.ts.map +0 -1
- package/dist/replace-directory.d.ts.map +0 -1
- package/dist/replace-file-copy-fallback.d.ts.map +0 -1
- package/dist/replace-file-copy-source.d.ts.map +0 -1
- package/dist/replace-file-descriptor.d.ts.map +0 -1
- package/dist/replace-file-mode.d.ts.map +0 -1
- package/dist/replace-file-rename-policy.d.ts.map +0 -1
- package/dist/replace-file-temp-owner.d.ts.map +0 -1
- package/dist/replace-file.d.ts.map +0 -1
- package/dist/retained-directory-replacement.d.ts.map +0 -1
- package/dist/root-boundary.d.ts.map +0 -1
- package/dist/root-context.d.ts.map +0 -1
- package/dist/root-create-input.d.ts.map +0 -1
- package/dist/root-directory-creation.d.ts.map +0 -1
- package/dist/root-directory-list.d.ts.map +0 -1
- package/dist/root-directory.d.ts.map +0 -1
- package/dist/root-entries.d.ts.map +0 -1
- package/dist/root-errors.d.ts.map +0 -1
- package/dist/root-file-final-admission.d.ts.map +0 -1
- package/dist/root-file.d.ts.map +0 -1
- package/dist/root-impl.d.ts.map +0 -1
- package/dist/root-move-noreplace.d.ts.map +0 -1
- package/dist/root-move-preflight.d.ts.map +0 -1
- package/dist/root-observed-path.d.ts.map +0 -1
- package/dist/root-options.d.ts.map +0 -1
- package/dist/root-path-errors.d.ts.map +0 -1
- package/dist/root-path-existing.d.ts.map +0 -1
- package/dist/root-path-observation.d.ts.map +0 -1
- package/dist/root-path-stat.d.ts.map +0 -1
- package/dist/root-path-symlink.d.ts +0 -7
- package/dist/root-path-symlink.d.ts.map +0 -1
- package/dist/root-path-symlink.js +0 -55
- package/dist/root-path.d.ts.map +0 -1
- package/dist/root-paths-lexical.d.ts.map +0 -1
- package/dist/root-paths.d.ts.map +0 -1
- package/dist/root-read-admission.d.ts.map +0 -1
- package/dist/root-remove-identity.d.ts.map +0 -1
- package/dist/root-remove-receipt.d.ts.map +0 -1
- package/dist/root-remove.d.ts.map +0 -1
- package/dist/root-symlink-policy.d.ts.map +0 -1
- package/dist/root-walk.d.ts.map +0 -1
- package/dist/root-write-admission.d.ts.map +0 -1
- package/dist/root-write-compatibility.d.ts.map +0 -1
- package/dist/root-write-complete-parent.d.ts.map +0 -1
- package/dist/root-write-lock-binding.d.ts.map +0 -1
- package/dist/root-write-mode.d.ts.map +0 -1
- package/dist/root-write-publication.d.ts.map +0 -1
- package/dist/root-write-verification.d.ts.map +0 -1
- package/dist/root.d.ts.map +0 -1
- package/dist/safe-path-segment.d.ts.map +0 -1
- package/dist/secret-file.d.ts.map +0 -1
- package/dist/secret-read-async.d.ts.map +0 -1
- package/dist/secret-read-policy.d.ts.map +0 -1
- package/dist/secret.d.ts.map +0 -1
- package/dist/secure-file-windows.d.ts.map +0 -1
- package/dist/secure-file.d.ts.map +0 -1
- package/dist/secure-temp-dir.d.ts.map +0 -1
- package/dist/secure-temp-repair.d.ts.map +0 -1
- package/dist/sibling-staged-file.d.ts.map +0 -1
- package/dist/sibling-temp.d.ts.map +0 -1
- package/dist/sidecar-lock-acquire.d.ts.map +0 -1
- package/dist/sidecar-lock-admission-context.d.ts.map +0 -1
- package/dist/sidecar-lock-admission-parser.d.ts.map +0 -1
- package/dist/sidecar-lock-admission.d.ts.map +0 -1
- package/dist/sidecar-lock-handle.d.ts.map +0 -1
- package/dist/sidecar-lock-policy.d.ts.map +0 -1
- package/dist/sidecar-lock-reclaim.d.ts.map +0 -1
- package/dist/sidecar-lock-root.d.ts.map +0 -1
- package/dist/sidecar-lock-stale-admission.d.ts.map +0 -1
- package/dist/sidecar-lock-target.d.ts.map +0 -1
- package/dist/sidecar-lock-types.d.ts.map +0 -1
- package/dist/sidecar-lock.d.ts.map +0 -1
- package/dist/staged-directory.d.ts.map +0 -1
- package/dist/staged-file-settlement.d.ts.map +0 -1
- package/dist/staged-file-types.d.ts.map +0 -1
- package/dist/standalone-publication-path.d.ts.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-hash.js
CHANGED
|
@@ -1,3 +1,55 @@
|
|
|
1
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
2
|
+
if (value !== null && value !== void 0) {
|
|
3
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
4
|
+
var dispose, inner;
|
|
5
|
+
if (async) {
|
|
6
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
7
|
+
dispose = value[Symbol.asyncDispose];
|
|
8
|
+
}
|
|
9
|
+
if (dispose === void 0) {
|
|
10
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
11
|
+
dispose = value[Symbol.dispose];
|
|
12
|
+
if (async) inner = dispose;
|
|
13
|
+
}
|
|
14
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
15
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
16
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
17
|
+
}
|
|
18
|
+
else if (async) {
|
|
19
|
+
env.stack.push({ async: true });
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
24
|
+
return function (env) {
|
|
25
|
+
function fail(e) {
|
|
26
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
27
|
+
env.hasError = true;
|
|
28
|
+
}
|
|
29
|
+
var r, s = 0;
|
|
30
|
+
function next() {
|
|
31
|
+
while (r = env.stack.pop()) {
|
|
32
|
+
try {
|
|
33
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
34
|
+
if (r.dispose) {
|
|
35
|
+
var result = r.dispose.call(r.value);
|
|
36
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
37
|
+
}
|
|
38
|
+
else s |= 1;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
fail(e);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
45
|
+
if (env.hasError) throw env.error;
|
|
46
|
+
}
|
|
47
|
+
return next();
|
|
48
|
+
};
|
|
49
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
50
|
+
var e = new Error(message);
|
|
51
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
52
|
+
});
|
|
1
53
|
import { createHash } from "node:crypto";
|
|
2
54
|
import fsSync from "node:fs";
|
|
3
55
|
import fs from "node:fs/promises";
|
|
@@ -7,58 +59,99 @@ import { getNativeBinding } from "./native.js";
|
|
|
7
59
|
import { resolveReadOpenFlags } from "./read-open-flags.js";
|
|
8
60
|
import { inspectFileIdentity, inspectFileIdentitySync } from "./strict-file-identity.js";
|
|
9
61
|
import { assertNoWindowsPathAlias } from "./windows-path-alias.js";
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
62
|
+
// Idle storage is bounded independently of caller concurrency. A pending read
|
|
63
|
+
// retains its exclusive borrow until the async hasher settles.
|
|
64
|
+
const hashScratchBuffers = [];
|
|
65
|
+
function takeHashScratch(size) {
|
|
66
|
+
const index = hashScratchBuffers.findIndex((buffer) => buffer.length >= size);
|
|
67
|
+
return index < 0 ? Buffer.allocUnsafe(size) : hashScratchBuffers.splice(index, 1)[0];
|
|
68
|
+
}
|
|
69
|
+
class HashScratch {
|
|
70
|
+
#storage;
|
|
71
|
+
buffer;
|
|
72
|
+
constructor(size) {
|
|
73
|
+
this.#storage = takeHashScratch(size);
|
|
74
|
+
this.buffer = this.#storage.subarray(0, size);
|
|
15
75
|
}
|
|
16
|
-
|
|
17
|
-
|
|
76
|
+
grow(size) {
|
|
77
|
+
const storage = takeHashScratch(size);
|
|
78
|
+
this[Symbol.dispose]();
|
|
79
|
+
this.#storage = storage;
|
|
80
|
+
return this.buffer = storage.subarray(0, size);
|
|
18
81
|
}
|
|
19
|
-
|
|
20
|
-
//
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
catch (error) {
|
|
28
|
-
// N-API settles only after compute stops; never race descriptor cleanup.
|
|
29
|
-
signal?.throwIfAborted();
|
|
30
|
-
if (error?.code === "too-large") {
|
|
31
|
-
throw new FsSafeError("too-large", `SHA-256 input exceeds ${maxBytes} bytes`, { cause: error });
|
|
32
|
-
}
|
|
33
|
-
throw error;
|
|
34
|
-
}
|
|
35
|
-
finally {
|
|
36
|
-
// Node retains composite signals while N-API's abort listener is attached.
|
|
37
|
-
if (nativeSignal)
|
|
38
|
-
nativeSignal.onabort = null;
|
|
39
|
-
}
|
|
82
|
+
[Symbol.dispose]() {
|
|
83
|
+
// Clear the used view before retention; a larger unused tail was cleared
|
|
84
|
+
// by its previous borrower, without making tiny hashes clear large buffers.
|
|
85
|
+
this.buffer.fill(0);
|
|
86
|
+
hashScratchBuffers.push(this.#storage);
|
|
87
|
+
hashScratchBuffers.sort((left, right) => left.length - right.length);
|
|
88
|
+
if (hashScratchBuffers.length > 4)
|
|
89
|
+
hashScratchBuffers.shift();
|
|
40
90
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
signal?.throwIfAborted();
|
|
46
|
-
const length = Math.min(buffer.length, maxBytes - position + 1);
|
|
47
|
-
const { bytesRead } = await handle.read(buffer, 0, length, position);
|
|
91
|
+
}
|
|
92
|
+
export async function hashFileHandle(handle, native = getNativeBinding(), { maxBytes = Infinity, signal } = {}) {
|
|
93
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
94
|
+
try {
|
|
48
95
|
signal?.throwIfAborted();
|
|
49
|
-
|
|
96
|
+
const stat = fsSync.fstatSync(handle.fd);
|
|
97
|
+
if (!stat.isFile()) {
|
|
98
|
+
throw new FsSafeError("not-file", "SHA-256 input is not a regular file");
|
|
99
|
+
}
|
|
100
|
+
if (stat.size > maxBytes) {
|
|
50
101
|
throw new FsSafeError("too-large", `SHA-256 input exceeds ${maxBytes} bytes`);
|
|
51
102
|
}
|
|
52
|
-
if (
|
|
53
|
-
|
|
103
|
+
if (native) {
|
|
104
|
+
// A completed N-API task can mask later aborts on the same signal.
|
|
105
|
+
const nativeSignal = signal ? AbortSignal.any([signal]) : undefined;
|
|
106
|
+
try {
|
|
107
|
+
const result = await native.sha256File(handle.fd, Number.isFinite(maxBytes) ? maxBytes : undefined, nativeSignal);
|
|
108
|
+
signal?.throwIfAborted();
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
// N-API settles only after compute stops; never race descriptor cleanup.
|
|
113
|
+
signal?.throwIfAborted();
|
|
114
|
+
if (error?.code === "too-large") {
|
|
115
|
+
throw new FsSafeError("too-large", `SHA-256 input exceeds ${maxBytes} bytes`, { cause: error });
|
|
116
|
+
}
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
// Node retains composite signals while N-API's abort listener is attached.
|
|
121
|
+
if (nativeSignal)
|
|
122
|
+
nativeSignal.onabort = null;
|
|
123
|
+
}
|
|
54
124
|
}
|
|
55
|
-
hash
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
125
|
+
const hash = createHash("sha256");
|
|
126
|
+
const scratch = __addDisposableResource(env_1, new HashScratch(Math.min(256 * 1024, Math.max(1, stat.size + 1), maxBytes + 1)), false);
|
|
127
|
+
let buffer = scratch.buffer;
|
|
128
|
+
let position = 0;
|
|
129
|
+
while (true) {
|
|
130
|
+
signal?.throwIfAborted();
|
|
131
|
+
const length = Math.min(buffer.length, maxBytes - position + 1);
|
|
132
|
+
const { bytesRead } = await handle.read(buffer, 0, length, position);
|
|
133
|
+
signal?.throwIfAborted();
|
|
134
|
+
if (bytesRead > maxBytes - position) {
|
|
135
|
+
throw new FsSafeError("too-large", `SHA-256 input exceeds ${maxBytes} bytes`);
|
|
136
|
+
}
|
|
137
|
+
if (bytesRead === 0) {
|
|
138
|
+
return { bytes: position, digest: hash.digest("hex") };
|
|
139
|
+
}
|
|
140
|
+
hash.update(buffer.subarray(0, bytesRead));
|
|
141
|
+
position += bytesRead;
|
|
142
|
+
// A full small buffer can mean growth or a virtual file with an unhelpful size.
|
|
143
|
+
if (bytesRead === buffer.length && buffer.length < 64 * 1024) {
|
|
144
|
+
buffer = scratch.grow(Math.min(64 * 1024, maxBytes + 1));
|
|
145
|
+
}
|
|
60
146
|
}
|
|
61
147
|
}
|
|
148
|
+
catch (e_1) {
|
|
149
|
+
env_1.error = e_1;
|
|
150
|
+
env_1.hasError = true;
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
__disposeResources(env_1);
|
|
154
|
+
}
|
|
62
155
|
}
|
|
63
156
|
function hashPathIdentity(filePath, afterOpen = false) {
|
|
64
157
|
const stat = fsSync.lstatSync(filePath, { bigint: true });
|
|
@@ -123,34 +216,45 @@ export async function sha256File(input, options = {}) {
|
|
|
123
216
|
: await hashFileHandle(input, getNativeBinding(), normalized);
|
|
124
217
|
}
|
|
125
218
|
function hashDescriptorSync(fd, { maxBytes = Infinity, signal }) {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
if (!stat.isFile()) {
|
|
129
|
-
throw new FsSafeError("not-file", "SHA-256 input is not a regular file");
|
|
130
|
-
}
|
|
131
|
-
if (stat.size > maxBytes) {
|
|
132
|
-
throw new FsSafeError("too-large", `SHA-256 input exceeds ${maxBytes} bytes`);
|
|
133
|
-
}
|
|
134
|
-
const hash = createHash("sha256");
|
|
135
|
-
let buffer = Buffer.allocUnsafe(Math.min(256 * 1024, Math.max(1, stat.size + 1), maxBytes + 1));
|
|
136
|
-
let position = 0;
|
|
137
|
-
while (true) {
|
|
138
|
-
signal?.throwIfAborted();
|
|
139
|
-
const length = Math.min(buffer.length, maxBytes - position + 1);
|
|
140
|
-
const bytesRead = fsSync.readSync(fd, buffer, 0, length, position);
|
|
219
|
+
const env_2 = { stack: [], error: void 0, hasError: false };
|
|
220
|
+
try {
|
|
141
221
|
signal?.throwIfAborted();
|
|
142
|
-
|
|
143
|
-
|
|
222
|
+
const stat = fsSync.fstatSync(fd);
|
|
223
|
+
if (!stat.isFile()) {
|
|
224
|
+
throw new FsSafeError("not-file", "SHA-256 input is not a regular file");
|
|
144
225
|
}
|
|
145
|
-
if (
|
|
146
|
-
|
|
226
|
+
if (stat.size > maxBytes) {
|
|
227
|
+
throw new FsSafeError("too-large", `SHA-256 input exceeds ${maxBytes} bytes`);
|
|
147
228
|
}
|
|
148
|
-
hash
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
229
|
+
const hash = createHash("sha256");
|
|
230
|
+
const scratch = __addDisposableResource(env_2, new HashScratch(Math.min(256 * 1024, Math.max(1, stat.size + 1), maxBytes + 1)), false);
|
|
231
|
+
let buffer = scratch.buffer;
|
|
232
|
+
let position = 0;
|
|
233
|
+
while (true) {
|
|
234
|
+
signal?.throwIfAborted();
|
|
235
|
+
const length = Math.min(buffer.length, maxBytes - position + 1);
|
|
236
|
+
const bytesRead = fsSync.readSync(fd, buffer, 0, length, position);
|
|
237
|
+
signal?.throwIfAborted();
|
|
238
|
+
if (bytesRead > maxBytes - position) {
|
|
239
|
+
throw new FsSafeError("too-large", `SHA-256 input exceeds ${maxBytes} bytes`);
|
|
240
|
+
}
|
|
241
|
+
if (bytesRead === 0) {
|
|
242
|
+
return { bytes: position, digest: hash.digest("hex") };
|
|
243
|
+
}
|
|
244
|
+
hash.update(buffer.subarray(0, bytesRead));
|
|
245
|
+
position += bytesRead;
|
|
246
|
+
if (bytesRead === buffer.length && buffer.length < 64 * 1024) {
|
|
247
|
+
buffer = scratch.grow(Math.min(64 * 1024, maxBytes + 1));
|
|
248
|
+
}
|
|
152
249
|
}
|
|
153
250
|
}
|
|
251
|
+
catch (e_2) {
|
|
252
|
+
env_2.error = e_2;
|
|
253
|
+
env_2.hasError = true;
|
|
254
|
+
}
|
|
255
|
+
finally {
|
|
256
|
+
__disposeResources(env_2);
|
|
257
|
+
}
|
|
154
258
|
}
|
|
155
259
|
function hashPathSync(filePath, options) {
|
|
156
260
|
assertNoWindowsPathAlias(filePath, "filesystem", "SHA-256 path uses a Windows filesystem namespace alias");
|
package/dist/file-identity.d.ts
CHANGED
|
@@ -5,4 +5,3 @@ export type FileIdentityStat = {
|
|
|
5
5
|
export declare function sha256Hex(data: string | Buffer, encoding?: BufferEncoding): string;
|
|
6
6
|
export declare function sameFileIdentity(left: FileIdentityStat, right: FileIdentityStat, platform?: NodeJS.Platform): boolean;
|
|
7
7
|
export declare function sameFileIdentityForCleanup(left: FileIdentityStat, right: FileIdentityStat, platform?: NodeJS.Platform): boolean;
|
|
8
|
-
//# sourceMappingURL=file-identity.d.ts.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { FileLockSyncHandle } from "./file-lock-sync.js";
|
|
2
|
+
import type { SidecarLockCompromisedInfo, SidecarLockRetryOptions } from "./sidecar-lock-types.js";
|
|
3
|
+
/** Owns local arbitration and retry state, independently of filesystem authority. */
|
|
4
|
+
export declare class SyncLockAcquisition {
|
|
5
|
+
#private;
|
|
6
|
+
readonly lockPath: string;
|
|
7
|
+
readonly normalizedTargetPath: string;
|
|
8
|
+
private readonly retry;
|
|
9
|
+
private readonly timeoutMs;
|
|
10
|
+
constructor(lockPath: string, normalizedTargetPath: string, retry: SidecarLockRetryOptions, timeoutMs: number | undefined);
|
|
11
|
+
get owns(): boolean;
|
|
12
|
+
hasToken(): boolean;
|
|
13
|
+
assert(): void;
|
|
14
|
+
reserve(): void;
|
|
15
|
+
release(): void;
|
|
16
|
+
run<T>(callback: () => T): T;
|
|
17
|
+
waitForRetry(): void;
|
|
18
|
+
retryDenial(error: unknown): boolean;
|
|
19
|
+
monitor(held: {
|
|
20
|
+
timer?: NodeJS.Timeout;
|
|
21
|
+
}, handle: FileLockSyncHandle, callback: ((info: SidecarLockCompromisedInfo) => void) | undefined, interval: number | undefined, receiver: object, recordTimer?: (timer: NodeJS.Timeout) => void): void;
|
|
22
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { getSyncLockAdmissions } from "./file-lock-sync-admission.js";
|
|
2
|
+
import { isTransientLockFileDenial, maxTransientLockDenials, sidecarLockRetryDelay, sidecarLockTimeout, } from "./sidecar-lock-policy.js";
|
|
3
|
+
import { sleepSync } from "./timing.js";
|
|
4
|
+
/** Owns local arbitration and retry state, independently of filesystem authority. */
|
|
5
|
+
export class SyncLockAcquisition {
|
|
6
|
+
lockPath;
|
|
7
|
+
normalizedTargetPath;
|
|
8
|
+
retry;
|
|
9
|
+
timeoutMs;
|
|
10
|
+
#admissions = getSyncLockAdmissions();
|
|
11
|
+
#token = {};
|
|
12
|
+
#owns = false;
|
|
13
|
+
#startedAt = 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
|