@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
|
@@ -5,16 +5,16 @@ import { fileObservation } from "./file-observation.js";
|
|
|
5
5
|
import { readFileHandleBounded } from "./bounded-read.js";
|
|
6
6
|
import { openSidecarRoot } from "./sidecar-lock-root.js";
|
|
7
7
|
import { createNativeExclusiveFile } from "./native-operations.js";
|
|
8
|
-
import {
|
|
8
|
+
import { sidecarLockRetryDelay, sidecarLockTimeout, isTransientLockFileDenial, maxTransientLockDenials, validateSidecarLockStaleMs, validateSidecarLockRetryOptions, validateSidecarLockCompromiseCheckIntervalMs, validateSidecarLockTimeoutMs, } from "./sidecar-lock-policy.js";
|
|
9
9
|
import { relativeSidecarLockPath, removeSidecarLockIfUnchanged, serializeSidecarLockPayload, sidecarReclaimGuardExists, } from "./sidecar-lock-reclaim.js";
|
|
10
10
|
import { awaitSidecarAdmissionBoundary, conditionalSidecarLockParser, observeHeldSidecarParser, observeSidecarLockParser, runSidecarAdmissionBoundary, } from "./sidecar-lock-admission-parser.js";
|
|
11
11
|
import { handleStaleSidecarAdmission, } from "./sidecar-lock-stale-admission.js";
|
|
12
12
|
import { ancestryHasSidecarAdmission, captureSidecarAdmissionAncestry, createSidecarAdmissionController, } from "./sidecar-lock-admission-context.js";
|
|
13
|
-
import { sidecarLockTimeout } from "./sidecar-lock-admission.js";
|
|
14
13
|
import { resolveSidecarLockPaths } from "./sidecar-lock-target.js";
|
|
15
14
|
import { createSuppressedError } from "./suppressed-error.js";
|
|
16
15
|
import { sleep } from "./timing.js";
|
|
17
16
|
import { sidecarExclusiveCreate } from "./root-create-input.js";
|
|
17
|
+
import { stopSidecarLockMonitoring } from "./sidecar-lock-handle.js";
|
|
18
18
|
export async function acquireSidecarLock(options, context) {
|
|
19
19
|
const admissionAncestry = captureSidecarAdmissionAncestry();
|
|
20
20
|
const retainOnExit = options.retainOnExit;
|
|
@@ -33,11 +33,25 @@ export async function acquireSidecarLock(options, context) {
|
|
|
33
33
|
const requestedReentrantOwner = options.reentrantOwner;
|
|
34
34
|
const { lockPath, normalizedTargetPath } = await resolveSidecarLockPaths(targetPath, explicitLockPath, lockRoot);
|
|
35
35
|
const activeDescendant = ancestryHasSidecarAdmission(admissionAncestry, context.admissions, normalizedTargetPath);
|
|
36
|
-
|
|
37
|
-
if (held &&
|
|
36
|
+
const isReentrant = (candidate) => !!candidate &&
|
|
38
37
|
requestedReentrantOwner !== undefined &&
|
|
39
|
-
|
|
40
|
-
requestedReentrantOwner ===
|
|
38
|
+
candidate.reentrantOwner !== undefined &&
|
|
39
|
+
requestedReentrantOwner === candidate.reentrantOwner;
|
|
40
|
+
const reuseHeldLock = (candidate) => {
|
|
41
|
+
const lifecycle = context.ensureExitCleanupRegistered();
|
|
42
|
+
context.assertRetainOnExitSupported(retainOnExit);
|
|
43
|
+
if (context.held.get(normalizedTargetPath) !== candidate || candidate.releasePromise)
|
|
44
|
+
return undefined;
|
|
45
|
+
candidate.refCount = (candidate.refCount ?? 1) + 1;
|
|
46
|
+
// Any same-owner request upgrades exit retention; later requests never revoke it.
|
|
47
|
+
if (retainOnExit === true)
|
|
48
|
+
candidate.retainOnExit = true;
|
|
49
|
+
const returnedHandle = context.handleForHeldLock(normalizedTargetPath, candidate);
|
|
50
|
+
context.armExitCleanup(lifecycle);
|
|
51
|
+
return returnedHandle;
|
|
52
|
+
};
|
|
53
|
+
let held = context.held.get(normalizedTargetPath);
|
|
54
|
+
if (isReentrant(held)) {
|
|
41
55
|
// Join a final release before deciding whether this completed owner remains.
|
|
42
56
|
// Successful cleanup requires a fresh acquisition; failed cleanup can retry.
|
|
43
57
|
if (held.releasePromise) {
|
|
@@ -46,23 +60,10 @@ export async function acquireSidecarLock(options, context) {
|
|
|
46
60
|
await held.releasePromise.catch(() => undefined);
|
|
47
61
|
held = context.held.get(normalizedTargetPath);
|
|
48
62
|
}
|
|
49
|
-
if (held
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const lifecycle = context.ensureExitCleanupRegistered();
|
|
54
|
-
context.assertRetainOnExitSupported(retainOnExit);
|
|
55
|
-
if (context.held.get(normalizedTargetPath) === held && !held.releasePromise) {
|
|
56
|
-
held.refCount = (held.refCount ?? 1) + 1;
|
|
57
|
-
// Retention is monotonic: any same-owner request to keep the sidecar on
|
|
58
|
-
// exit upgrades the held lock; a later default acquisition never revokes it.
|
|
59
|
-
if (retainOnExit === true) {
|
|
60
|
-
held.retainOnExit = true;
|
|
61
|
-
}
|
|
62
|
-
const returnedHandle = context.handleForHeldLock(normalizedTargetPath, held);
|
|
63
|
-
context.armExitCleanup(lifecycle);
|
|
64
|
-
return returnedHandle;
|
|
65
|
-
}
|
|
63
|
+
if (isReentrant(held)) {
|
|
64
|
+
const reused = reuseHeldLock(held);
|
|
65
|
+
if (reused)
|
|
66
|
+
return reused;
|
|
66
67
|
}
|
|
67
68
|
}
|
|
68
69
|
if (activeDescendant)
|
|
@@ -89,17 +90,9 @@ export async function acquireSidecarLock(options, context) {
|
|
|
89
90
|
const withinDenialBudget = () => ++transientDenials <= maxTransientLockDenials;
|
|
90
91
|
const waitForRetry = async () => {
|
|
91
92
|
admission.release();
|
|
92
|
-
const
|
|
93
|
-
if (
|
|
94
|
-
timeoutMs !== Number.POSITIVE_INFINITY &&
|
|
95
|
-
elapsed >= timeoutMs) ||
|
|
96
|
-
(retry.retries !== undefined && attempt >= retry.retries)) {
|
|
93
|
+
const delay = sidecarLockRetryDelay(retry, timeoutMs === Number.POSITIVE_INFINITY ? undefined : timeoutMs, Date.now() - startedAt, attempt);
|
|
94
|
+
if (delay === undefined)
|
|
97
95
|
throw sidecarLockTimeout(lockPath, normalizedTargetPath);
|
|
98
|
-
}
|
|
99
|
-
const remaining = timeoutMs === undefined || timeoutMs === Number.POSITIVE_INFINITY
|
|
100
|
-
? Number.POSITIVE_INFINITY
|
|
101
|
-
: Math.max(0, timeoutMs - elapsed);
|
|
102
|
-
const delay = Math.min(computeSidecarLockDelayMs(retry, attempt), remaining);
|
|
103
96
|
attempt += 1;
|
|
104
97
|
await sleep(delay);
|
|
105
98
|
};
|
|
@@ -122,29 +115,16 @@ export async function acquireSidecarLock(options, context) {
|
|
|
122
115
|
while (true) {
|
|
123
116
|
if (!admission.owns) {
|
|
124
117
|
held = context.held.get(normalizedTargetPath);
|
|
125
|
-
if (held
|
|
126
|
-
requestedReentrantOwner !== undefined &&
|
|
127
|
-
held.reentrantOwner !== undefined &&
|
|
128
|
-
requestedReentrantOwner === held.reentrantOwner) {
|
|
118
|
+
if (isReentrant(held)) {
|
|
129
119
|
if (held.releasePromise) {
|
|
130
120
|
await held.releasePromise.catch(() => undefined);
|
|
131
121
|
held = context.held.get(normalizedTargetPath);
|
|
132
122
|
}
|
|
133
|
-
if (held
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
context.assertRetainOnExitSupported(retainOnExit);
|
|
139
|
-
if (context.held.get(normalizedTargetPath) !== held || held.releasePromise) {
|
|
140
|
-
continue;
|
|
141
|
-
}
|
|
142
|
-
held.refCount = (held.refCount ?? 1) + 1;
|
|
143
|
-
if (retainOnExit === true)
|
|
144
|
-
held.retainOnExit = true;
|
|
145
|
-
const returnedHandle = context.handleForHeldLock(normalizedTargetPath, held);
|
|
146
|
-
context.armExitCleanup(lifecycle);
|
|
147
|
-
return returnedHandle;
|
|
123
|
+
if (isReentrant(held)) {
|
|
124
|
+
const reused = reuseHeldLock(held);
|
|
125
|
+
if (reused)
|
|
126
|
+
return reused;
|
|
127
|
+
continue;
|
|
148
128
|
}
|
|
149
129
|
}
|
|
150
130
|
if (context.admissions.has(normalizedTargetPath)) {
|
|
@@ -353,8 +333,7 @@ export async function acquireSidecarLock(options, context) {
|
|
|
353
333
|
.catch(() => false)
|
|
354
334
|
.then((stillHeld) => {
|
|
355
335
|
if (!stillHeld && candidateHeld.compromiseTimer) {
|
|
356
|
-
|
|
357
|
-
candidateHeld.compromiseTimer = undefined;
|
|
336
|
+
stopSidecarLockMonitoring(candidateHeld);
|
|
358
337
|
Reflect.apply(compromisedCallback, options, [{ lockPath, normalizedTargetPath }]);
|
|
359
338
|
}
|
|
360
339
|
})
|
|
@@ -376,10 +355,8 @@ export async function acquireSidecarLock(options, context) {
|
|
|
376
355
|
}
|
|
377
356
|
catch (err) {
|
|
378
357
|
try {
|
|
379
|
-
if (createdHeld
|
|
380
|
-
|
|
381
|
-
createdHeld.compromiseTimer = undefined;
|
|
382
|
-
}
|
|
358
|
+
if (createdHeld)
|
|
359
|
+
stopSidecarLockMonitoring(createdHeld);
|
|
383
360
|
if (handle) {
|
|
384
361
|
const failedSnapshot = createdSnapshot ?? { payload: null };
|
|
385
362
|
try {
|
|
@@ -2,11 +2,10 @@ import type { NativeFileHandle } from "./native-operations.js";
|
|
|
2
2
|
import type { Root } from "./root-impl.js";
|
|
3
3
|
import type { SidecarLockSnapshot } from "./sidecar-lock-reclaim.js";
|
|
4
4
|
import type { SidecarLockHandle } from "./sidecar-lock-types.js";
|
|
5
|
-
type SidecarFileHandle = Pick<NativeFileHandle, "fd" | "close" | "stat" | "writeFile">;
|
|
6
5
|
export type HeldSidecarLock = {
|
|
7
6
|
refCount: number;
|
|
8
7
|
reentrantOwner?: string;
|
|
9
|
-
handle:
|
|
8
|
+
handle: NativeFileHandle;
|
|
10
9
|
lockPath: string;
|
|
11
10
|
snapshot: SidecarLockSnapshot;
|
|
12
11
|
acquiredAt: number;
|
|
@@ -30,6 +29,3 @@ export type SidecarLockAcquisitionContext = {
|
|
|
30
29
|
assertRetainOnExitSupported(retainOnExit: boolean | undefined): void;
|
|
31
30
|
handleForHeldLock(normalizedTargetPath: string, held: HeldSidecarLock): SidecarLockHandle;
|
|
32
31
|
};
|
|
33
|
-
export declare function sidecarLockTimeout(lockPath: string, normalizedTargetPath: string): Error;
|
|
34
|
-
export {};
|
|
35
|
-
//# sourceMappingURL=sidecar-lock-admission.d.ts.map
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { Root } from "./root-impl.js";
|
|
2
2
|
import { type SidecarLockSnapshot } from "./sidecar-lock-reclaim.js";
|
|
3
3
|
import type { SidecarLockHandle } from "./sidecar-lock-types.js";
|
|
4
|
+
export declare function stopSidecarLockMonitoring(held: {
|
|
5
|
+
compromiseTimer?: NodeJS.Timeout;
|
|
6
|
+
}): void;
|
|
4
7
|
export declare function createSidecarLockHandle(params: {
|
|
5
8
|
lockPath: string;
|
|
6
9
|
normalizedTargetPath: string;
|
|
@@ -21,4 +24,3 @@ export declare function createHeldSidecarLockHandle(params: {
|
|
|
21
24
|
retry?: boolean;
|
|
22
25
|
}) => Promise<unknown>;
|
|
23
26
|
}): SidecarLockHandle;
|
|
24
|
-
//# sourceMappingURL=sidecar-lock-handle.d.ts.map
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { sidecarLockSnapshotStillPresent, } from "./sidecar-lock-reclaim.js";
|
|
2
|
+
export function stopSidecarLockMonitoring(held) {
|
|
3
|
+
const timer = held.compromiseTimer;
|
|
4
|
+
held.compromiseTimer = undefined;
|
|
5
|
+
if (timer)
|
|
6
|
+
clearInterval(timer);
|
|
7
|
+
}
|
|
2
8
|
export function createSidecarLockHandle(params) {
|
|
3
9
|
let released = false;
|
|
4
10
|
let releasePromise;
|
|
@@ -4,6 +4,9 @@ export declare function validateSidecarLockTimeoutMs(timeoutMs: number | undefin
|
|
|
4
4
|
export declare function validateSidecarLockStaleMs(staleMs: number | undefined): void;
|
|
5
5
|
export declare function validateSidecarLockCompromiseCheckIntervalMs(intervalMs: number | undefined): void;
|
|
6
6
|
export declare function computeSidecarLockDelayMs(retry: SidecarLockRetryOptions, attempt: number): number;
|
|
7
|
+
export declare function sidecarLockTimeout(lockPath: string, normalizedTargetPath: string): Error;
|
|
8
|
+
/** Undefined means the deadline or retry count is exhausted. */
|
|
9
|
+
export declare function sidecarLockRetryDelay(retry: SidecarLockRetryOptions, timeoutMs: number | undefined, elapsed: number, attempt: number): number | undefined;
|
|
7
10
|
export declare const maxTransientLockDenials = 8;
|
|
8
11
|
export declare function isTransientLockFileDenial(error: unknown, lockPath: string): boolean;
|
|
9
12
|
export declare function sidecarLockPayloadCreatedAtMs(payload: unknown): number | null;
|
|
@@ -13,4 +16,3 @@ export declare function defaultSidecarLockShouldReclaim(params: {
|
|
|
13
16
|
staleMs: number;
|
|
14
17
|
nowMs: number;
|
|
15
18
|
}): Promise<boolean>;
|
|
16
|
-
//# sourceMappingURL=sidecar-lock-policy.d.ts.map
|
|
@@ -55,6 +55,22 @@ export function computeSidecarLockDelayMs(retry, attempt) {
|
|
|
55
55
|
const jitter = retry.randomize ? 1 + Math.random() : 1;
|
|
56
56
|
return Math.min(maxTimeout, Math.round(base * jitter));
|
|
57
57
|
}
|
|
58
|
+
export function sidecarLockTimeout(lockPath, normalizedTargetPath) {
|
|
59
|
+
return Object.assign(new Error(`file lock timeout for ${normalizedTargetPath}`), {
|
|
60
|
+
code: "file_lock_timeout",
|
|
61
|
+
lockPath,
|
|
62
|
+
normalizedTargetPath,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/** Undefined means the deadline or retry count is exhausted. */
|
|
66
|
+
export function sidecarLockRetryDelay(retry, timeoutMs, elapsed, attempt) {
|
|
67
|
+
if ((timeoutMs !== undefined && elapsed >= timeoutMs) ||
|
|
68
|
+
(retry.retries !== undefined && attempt >= retry.retries))
|
|
69
|
+
return undefined;
|
|
70
|
+
const remaining = timeoutMs === undefined || timeoutMs === Number.POSITIVE_INFINITY
|
|
71
|
+
? Number.POSITIVE_INFINITY : Math.max(0, timeoutMs - elapsed);
|
|
72
|
+
return Math.min(computeSidecarLockDelayMs(retry, attempt), remaining);
|
|
73
|
+
}
|
|
58
74
|
// Windows denies access to a lock file while a just-unlinked directory entry
|
|
59
75
|
// is still being torn down, so a contended acquire sees EPERM on a name that is
|
|
60
76
|
// already gone -- both when creating it exclusively and when reading the
|
|
@@ -39,7 +39,7 @@ export declare function readSidecarLockRawSnapshotSync(lockPath: string, options
|
|
|
39
39
|
onOpenFailure?: (error: unknown) => void;
|
|
40
40
|
}): SidecarLockRawSnapshot | null;
|
|
41
41
|
export declare function removeSidecarLockIfUnchangedSync(lockPath: string, observed: SidecarLockSnapshot, assertAuthorized?: () => void): boolean;
|
|
42
|
-
export declare function sidecarLockSnapshotMatches(current: SidecarLockSnapshot, observed: SidecarLockSnapshot): boolean;
|
|
42
|
+
export declare function sidecarLockSnapshotMatches(current: SidecarLockRawSnapshot | SidecarLockSnapshot, observed: SidecarLockSnapshot): boolean;
|
|
43
43
|
export declare function removeSidecarLockIfUnchanged(lockPath: string, observed: SidecarLockSnapshot | null, options?: {
|
|
44
44
|
lockRoot?: Root;
|
|
45
45
|
parsePayload?: (raw: string) => unknown;
|
|
@@ -65,4 +65,3 @@ export declare function removeStaleSidecarLockIfAllowed(params: {
|
|
|
65
65
|
assertGuardHeld?: () => Promise<void>;
|
|
66
66
|
}): Promise<"removed" | "changed" | "not-approved">;
|
|
67
67
|
export {};
|
|
68
|
-
//# sourceMappingURL=sidecar-lock-reclaim.d.ts.map
|
|
@@ -71,6 +71,12 @@ function missingSnapshotPath(error) {
|
|
|
71
71
|
export async function readSidecarLockSnapshot(lockPath, options = {}) {
|
|
72
72
|
return parseSidecarLockSnapshot(await readSidecarLockRawSnapshot(lockPath, options), options.parsePayload);
|
|
73
73
|
}
|
|
74
|
+
async function readSidecarLockComparisonSnapshot(lockPath, options) {
|
|
75
|
+
const snapshot = await readSidecarLockRawSnapshot(lockPath, options);
|
|
76
|
+
const parsePayload = options?.parsePayload;
|
|
77
|
+
// Ownership uses raw bytes and identity, but custom parsers retain their effects.
|
|
78
|
+
return parsePayload ? parseSidecarLockSnapshot(snapshot, parsePayload) : snapshot;
|
|
79
|
+
}
|
|
74
80
|
export async function readSidecarLockRawSnapshot(lockPath, options = {}) {
|
|
75
81
|
let handle;
|
|
76
82
|
try {
|
|
@@ -197,7 +203,6 @@ export function readSidecarLockRawSnapshotSync(lockPath, options = {}) {
|
|
|
197
203
|
return {
|
|
198
204
|
raw,
|
|
199
205
|
stat: after,
|
|
200
|
-
ownershipToken: readSidecarLockOwnershipToken(raw),
|
|
201
206
|
};
|
|
202
207
|
}
|
|
203
208
|
finally {
|
|
@@ -207,7 +212,7 @@ export function readSidecarLockRawSnapshotSync(lockPath, options = {}) {
|
|
|
207
212
|
}
|
|
208
213
|
export function removeSidecarLockIfUnchangedSync(lockPath, observed, assertAuthorized) {
|
|
209
214
|
assertAuthorized?.();
|
|
210
|
-
const current =
|
|
215
|
+
const current = readSidecarLockRawSnapshotSync(lockPath);
|
|
211
216
|
assertAuthorized?.();
|
|
212
217
|
if (!current || !sidecarLockSnapshotMatches(current, observed))
|
|
213
218
|
return false;
|
|
@@ -219,10 +224,8 @@ export function sidecarLockSnapshotMatches(current, observed) {
|
|
|
219
224
|
if (observed.ownershipToken !== undefined) {
|
|
220
225
|
return (current.stat?.isFile() === true &&
|
|
221
226
|
current.raw !== undefined &&
|
|
222
|
-
|
|
223
|
-
readSidecarLockOwnershipToken(current.raw) === observed.ownershipToken
|
|
224
|
-
readSidecarLockOwnershipToken(observed.raw) === observed.ownershipToken &&
|
|
225
|
-
current.raw === observed.raw);
|
|
227
|
+
current.raw === observed.raw &&
|
|
228
|
+
readSidecarLockOwnershipToken(current.raw) === observed.ownershipToken);
|
|
226
229
|
}
|
|
227
230
|
if (observed.stat &&
|
|
228
231
|
current.stat &&
|
|
@@ -235,7 +238,7 @@ export function sidecarLockSnapshotMatches(current, observed) {
|
|
|
235
238
|
return observed.stat !== undefined && current.stat !== undefined;
|
|
236
239
|
}
|
|
237
240
|
export async function removeSidecarLockIfUnchanged(lockPath, observed, options = {}) {
|
|
238
|
-
const current = await
|
|
241
|
+
const current = await readSidecarLockComparisonSnapshot(lockPath, {
|
|
239
242
|
...options,
|
|
240
243
|
allowDescriptorIdentityDrift: observed?.ownershipToken !== undefined,
|
|
241
244
|
});
|
|
@@ -251,7 +254,7 @@ export async function removeSidecarLockIfUnchanged(lockPath, observed, options =
|
|
|
251
254
|
return true;
|
|
252
255
|
}
|
|
253
256
|
export async function sidecarLockSnapshotStillPresent(lockPath, observed, options = {}) {
|
|
254
|
-
const current = await
|
|
257
|
+
const current = await readSidecarLockComparisonSnapshot(lockPath, {
|
|
255
258
|
...options,
|
|
256
259
|
allowDescriptorIdentityDrift: observed?.ownershipToken !== undefined,
|
|
257
260
|
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type CleanupRegistration = {
|
|
2
|
+
event: "exit" | "beforeExit";
|
|
3
|
+
registered: symbol;
|
|
4
|
+
registering: symbol;
|
|
5
|
+
handler: symbol;
|
|
6
|
+
retainAware?: symbol;
|
|
7
|
+
reentryError(): Error;
|
|
8
|
+
};
|
|
9
|
+
/** Preserve the legacy, first-registration-wins protocol across package copies. */
|
|
10
|
+
export declare function ensureSidecarLockCleanupRegistered<T extends true | {
|
|
11
|
+
armed: boolean;
|
|
12
|
+
}>(keys: CleanupRegistration, cleanup: () => void, marker: T): T;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/** Preserve the legacy, first-registration-wins protocol across package copies. */
|
|
2
|
+
export function ensureSidecarLockCleanupRegistered(keys, cleanup, marker) {
|
|
3
|
+
const state = globalThis;
|
|
4
|
+
if (state[keys.registered])
|
|
5
|
+
return state[keys.registered];
|
|
6
|
+
// process.on emits newListener synchronously; reentry cannot wait for it.
|
|
7
|
+
if (state[keys.registering])
|
|
8
|
+
throw keys.reentryError();
|
|
9
|
+
const registration = {};
|
|
10
|
+
const commit = () => {
|
|
11
|
+
state[keys.handler] = cleanup;
|
|
12
|
+
if (keys.retainAware)
|
|
13
|
+
state[keys.retainAware] = true;
|
|
14
|
+
state[keys.registered] = marker;
|
|
15
|
+
};
|
|
16
|
+
state[keys.registering] = registration;
|
|
17
|
+
try {
|
|
18
|
+
process.on(keys.event, cleanup);
|
|
19
|
+
commit();
|
|
20
|
+
return marker;
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (process.listeners(keys.event).includes(cleanup)) {
|
|
24
|
+
try {
|
|
25
|
+
process.off(keys.event, cleanup);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Reconcile the marker with the actual listener below.
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (process.listeners(keys.event).includes(cleanup)) {
|
|
32
|
+
commit();
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
if (state[keys.handler] === cleanup)
|
|
36
|
+
delete state[keys.handler];
|
|
37
|
+
// Only the before-exit lifecycle has an individually owned marker.
|
|
38
|
+
if (marker !== true && state[keys.registered] === marker)
|
|
39
|
+
delete state[keys.registered];
|
|
40
|
+
}
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
if (state[keys.registering] === registration)
|
|
45
|
+
delete state[keys.registering];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -1,3 +1,2 @@
|
|
|
1
1
|
import type { OpenResult, Root } from "./root-impl.js";
|
|
2
2
|
export declare function openSidecarRoot(lockRoot: Root, relative: string, discardObservation?: "unlinked" | "changed", onOpenFailure?: (error: unknown) => void): Promise<OpenResult | null>;
|
|
3
|
-
//# sourceMappingURL=sidecar-lock-root.d.ts.map
|
package/dist/sidecar-lock.d.ts
CHANGED
|
@@ -11,4 +11,3 @@ export declare function createSidecarLockManager(key: string): {
|
|
|
11
11
|
heldEntries: () => SidecarLockHeldEntry[];
|
|
12
12
|
};
|
|
13
13
|
export declare function withSidecarLock<T, TPayload extends Record<string, unknown>>(targetPath: string, options: WithSidecarLockOptions<TPayload>, fn: () => Promise<T>): Promise<T>;
|
|
14
|
-
//# sourceMappingURL=sidecar-lock.d.ts.map
|
package/dist/sidecar-lock.js
CHANGED
|
@@ -3,8 +3,9 @@ import { FsSafeError } from "./errors.js";
|
|
|
3
3
|
import { sameFileIdentity } from "./file-identity.js";
|
|
4
4
|
import { removeSidecarLockIfUnchanged, sidecarLockSnapshotMatches, } from "./sidecar-lock-reclaim.js";
|
|
5
5
|
import { acquireSidecarLock } from "./sidecar-lock-acquire.js";
|
|
6
|
-
import { createHeldSidecarLockHandle } from "./sidecar-lock-handle.js";
|
|
6
|
+
import { createHeldSidecarLockHandle, stopSidecarLockMonitoring } from "./sidecar-lock-handle.js";
|
|
7
7
|
import { createSuppressedError } from "./suppressed-error.js";
|
|
8
|
+
import { ensureSidecarLockCleanupRegistered } from "./sidecar-lock-registration.js";
|
|
8
9
|
const GLOBAL_STATE_KEY = Symbol.for("fsSafe.sidecarLockManagers");
|
|
9
10
|
const GLOBAL_CLEANUP_KEY = Symbol.for("fsSafe.sidecarLockCleanupRegistered");
|
|
10
11
|
const GLOBAL_CLEANUP_HANDLER_KEY = Symbol.for("fsSafe.sidecarLockCleanupHandler");
|
|
@@ -101,6 +102,7 @@ function releaseAllReclaimGuardsSync(state) {
|
|
|
101
102
|
}
|
|
102
103
|
function releaseAllLocksSync(state, options) {
|
|
103
104
|
for (const [normalizedTargetPath, held] of state.held) {
|
|
105
|
+
stopSidecarLockMonitoring(held);
|
|
104
106
|
void held.handle.close().catch(() => undefined);
|
|
105
107
|
try {
|
|
106
108
|
const retained = options?.preserveRetained === true && held.retainOnExit;
|
|
@@ -117,51 +119,19 @@ function releaseAllLocksSync(state, options) {
|
|
|
117
119
|
releaseAllReclaimGuardsSync(state);
|
|
118
120
|
}
|
|
119
121
|
function ensureGlobalExitCleanupRegistered() {
|
|
120
|
-
const globalWithCleanup = globalThis;
|
|
121
|
-
if (globalWithCleanup[GLOBAL_CLEANUP_KEY])
|
|
122
|
-
return;
|
|
123
|
-
if (globalWithCleanup[GLOBAL_CLEANUP_REGISTRATION_KEY]) {
|
|
124
|
-
throw new FsSafeError("helper-unavailable", "sidecar lock exit cleanup registration is already in progress");
|
|
125
|
-
}
|
|
126
|
-
const registration = {};
|
|
127
122
|
const cleanup = () => {
|
|
128
123
|
for (const state of getGlobalManagers().values()) {
|
|
129
124
|
releaseAllLocksSync(state, { preserveRetained: true });
|
|
130
125
|
}
|
|
131
126
|
};
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
if (process.listeners("exit").includes(cleanup)) {
|
|
141
|
-
try {
|
|
142
|
-
process.off("exit", cleanup);
|
|
143
|
-
}
|
|
144
|
-
catch {
|
|
145
|
-
// Reconcile the marker with the actual listener below.
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
if (process.listeners("exit").includes(cleanup)) {
|
|
149
|
-
globalWithCleanup[GLOBAL_CLEANUP_HANDLER_KEY] = cleanup;
|
|
150
|
-
globalWithCleanup[GLOBAL_RETAIN_AWARE_KEY] = true;
|
|
151
|
-
globalWithCleanup[GLOBAL_CLEANUP_KEY] = true;
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
if (globalWithCleanup[GLOBAL_CLEANUP_HANDLER_KEY] === cleanup) {
|
|
155
|
-
delete globalWithCleanup[GLOBAL_CLEANUP_HANDLER_KEY];
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
throw error;
|
|
159
|
-
}
|
|
160
|
-
finally {
|
|
161
|
-
if (globalWithCleanup[GLOBAL_CLEANUP_REGISTRATION_KEY] === registration) {
|
|
162
|
-
delete globalWithCleanup[GLOBAL_CLEANUP_REGISTRATION_KEY];
|
|
163
|
-
}
|
|
164
|
-
}
|
|
127
|
+
ensureSidecarLockCleanupRegistered({
|
|
128
|
+
event: "exit",
|
|
129
|
+
registered: GLOBAL_CLEANUP_KEY,
|
|
130
|
+
registering: GLOBAL_CLEANUP_REGISTRATION_KEY,
|
|
131
|
+
handler: GLOBAL_CLEANUP_HANDLER_KEY,
|
|
132
|
+
retainAware: GLOBAL_RETAIN_AWARE_KEY,
|
|
133
|
+
reentryError: () => new FsSafeError("helper-unavailable", "sidecar lock exit cleanup registration is already in progress"),
|
|
134
|
+
}, cleanup, true);
|
|
165
135
|
}
|
|
166
136
|
/** True when a retain-unaware package copy registered the process-exit handlers first. */
|
|
167
137
|
export function exitCleanupCannotRetain() {
|
|
@@ -169,16 +139,8 @@ export function exitCleanupCannotRetain() {
|
|
|
169
139
|
return globalWithCleanup[GLOBAL_CLEANUP_KEY] === true && globalWithCleanup[GLOBAL_RETAIN_AWARE_KEY] !== true;
|
|
170
140
|
}
|
|
171
141
|
function ensureGlobalBeforeExitCleanupRegistered() {
|
|
172
|
-
const globalWithCleanup = globalThis;
|
|
173
|
-
if (globalWithCleanup[GLOBAL_BEFORE_EXIT_KEY]) {
|
|
174
|
-
return globalWithCleanup[GLOBAL_BEFORE_EXIT_KEY];
|
|
175
|
-
}
|
|
176
|
-
if (globalWithCleanup[GLOBAL_BEFORE_EXIT_REGISTRATION_KEY]) {
|
|
177
|
-
throw new FsSafeError("helper-unavailable", "sidecar lock before-exit cleanup registration is already in progress");
|
|
178
|
-
}
|
|
179
142
|
// Independent of the exit registration, which an older package copy may own.
|
|
180
143
|
const lifecycle = { armed: false };
|
|
181
|
-
const registration = {};
|
|
182
144
|
const cleanup = () => {
|
|
183
145
|
if (!lifecycle.armed)
|
|
184
146
|
return;
|
|
@@ -192,41 +154,13 @@ function ensureGlobalBeforeExitCleanupRegistered() {
|
|
|
192
154
|
}
|
|
193
155
|
}
|
|
194
156
|
};
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
}
|
|
202
|
-
catch (error) {
|
|
203
|
-
if (process.listeners("beforeExit").includes(cleanup)) {
|
|
204
|
-
try {
|
|
205
|
-
process.off("beforeExit", cleanup);
|
|
206
|
-
}
|
|
207
|
-
catch {
|
|
208
|
-
// Reconcile the marker with the actual listener below.
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
if (process.listeners("beforeExit").includes(cleanup)) {
|
|
212
|
-
globalWithCleanup[GLOBAL_BEFORE_EXIT_HANDLER_KEY] = cleanup;
|
|
213
|
-
globalWithCleanup[GLOBAL_BEFORE_EXIT_KEY] = lifecycle;
|
|
214
|
-
}
|
|
215
|
-
else {
|
|
216
|
-
if (globalWithCleanup[GLOBAL_BEFORE_EXIT_HANDLER_KEY] === cleanup) {
|
|
217
|
-
delete globalWithCleanup[GLOBAL_BEFORE_EXIT_HANDLER_KEY];
|
|
218
|
-
}
|
|
219
|
-
if (globalWithCleanup[GLOBAL_BEFORE_EXIT_KEY] === lifecycle) {
|
|
220
|
-
delete globalWithCleanup[GLOBAL_BEFORE_EXIT_KEY];
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
throw error;
|
|
224
|
-
}
|
|
225
|
-
finally {
|
|
226
|
-
if (globalWithCleanup[GLOBAL_BEFORE_EXIT_REGISTRATION_KEY] === registration) {
|
|
227
|
-
delete globalWithCleanup[GLOBAL_BEFORE_EXIT_REGISTRATION_KEY];
|
|
228
|
-
}
|
|
229
|
-
}
|
|
157
|
+
return ensureSidecarLockCleanupRegistered({
|
|
158
|
+
event: "beforeExit",
|
|
159
|
+
registered: GLOBAL_BEFORE_EXIT_KEY,
|
|
160
|
+
registering: GLOBAL_BEFORE_EXIT_REGISTRATION_KEY,
|
|
161
|
+
handler: GLOBAL_BEFORE_EXIT_HANDLER_KEY,
|
|
162
|
+
reentryError: () => new FsSafeError("helper-unavailable", "sidecar lock before-exit cleanup registration is already in progress"),
|
|
163
|
+
}, cleanup, lifecycle);
|
|
230
164
|
}
|
|
231
165
|
async function releaseHeldLock(state, normalizedTargetPath, held, options = {}) {
|
|
232
166
|
const current = state.held.get(normalizedTargetPath);
|
|
@@ -257,10 +191,7 @@ async function releaseHeldLock(state, normalizedTargetPath, held, options = {})
|
|
|
257
191
|
if (state.held.get(normalizedTargetPath) === held) {
|
|
258
192
|
state.held.delete(normalizedTargetPath);
|
|
259
193
|
}
|
|
260
|
-
|
|
261
|
-
clearInterval(held.compromiseTimer);
|
|
262
|
-
held.compromiseTimer = undefined;
|
|
263
|
-
}
|
|
194
|
+
stopSidecarLockMonitoring(held);
|
|
264
195
|
})();
|
|
265
196
|
try {
|
|
266
197
|
await held.releasePromise;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type BigIntStats } from "node:fs";
|
|
1
|
+
import { type BigIntStats, type Stats } from "node:fs";
|
|
2
2
|
import type { DirectoryReceipt } from "./directory-durability.js";
|
|
3
3
|
import type { FileIdentityStat } from "./file-identity.js";
|
|
4
4
|
import type { NativeBinding } from "./native-binding.js";
|
|
@@ -21,8 +21,7 @@ export declare function assertStagedDirectoryCurrent(receipt: StagedDirectorySna
|
|
|
21
21
|
export declare function describePolicyStagedDirectory(fd: number, pathname: string, binding?: NativeBinding): PolicyStagedDirectory;
|
|
22
22
|
export declare function assertPolicyStagedDirectoryCurrent(captured: PolicyStagedDirectory): BigIntStats;
|
|
23
23
|
export declare function refreshPolicyStagedDirectoryObservation(captured: PolicyStagedDirectory): MutationDirectoryObservation;
|
|
24
|
-
export declare function openStagedDirectory(directory: string | DirectoryReceipt): {
|
|
24
|
+
export declare function openStagedDirectory(directory: string | DirectoryReceipt<Stats | BigIntStats>): {
|
|
25
25
|
fd: number;
|
|
26
26
|
receipt: StagedDirectorySnapshot;
|
|
27
27
|
};
|
|
28
|
-
//# sourceMappingURL=staged-directory.d.ts.map
|
|
@@ -8,4 +8,3 @@ export type StatObservationReceipt = {
|
|
|
8
8
|
export declare function inspectStatObservationSync(inspect: (bigint: boolean) => Stats | BigIntStats, expected?: ExactStatIdentity, initial?: Stats | BigIntStats, platform?: NodeJS.Platform): StatObservationReceipt;
|
|
9
9
|
/** Revalidate an exact identity without allocating a receipt that the caller will discard. */
|
|
10
10
|
export declare function assertStatObservationSync(inspect: (bigint: boolean) => Stats | BigIntStats, expected: ExactStatIdentity, initial?: Stats | BigIntStats, platform?: NodeJS.Platform): Stats | BigIntStats;
|
|
11
|
-
//# sourceMappingURL=stat-observation.d.ts.map
|
package/dist/store.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
export { fileStore, fileStoreSync, type FileStore, type FileStoreOptions, type FileStorePruneOptions, type FileStoreReadOptions, type FileStoreSync, type FileStoreWriteOptions, } from "./file-store.js";
|
|
2
2
|
export { jsonStore, type JsonStore, type JsonFileStoreOptions, type JsonStoreLockOptions, type JsonStoreOptions, } from "./json-store.js";
|
|
3
3
|
export { ackJsonDurableQueueEntry, ensureJsonDurableQueueDirs, jsonDurableQueueEntryExists, loadJsonDurableQueueEntry, loadPendingJsonDurableQueueEntries, moveJsonDurableQueueEntryToFailed, readJsonDurableQueueEntry, resolveJsonDurableQueueEntryPaths, unlinkBestEffort, writeJsonDurableQueueEntry, type JsonDurableQueueEntryPaths, type JsonDurableQueueLoadOptions, type JsonDurableQueueReadResult, } from "./json-durable-queue.js";
|
|
4
|
-
//# sourceMappingURL=store.d.ts.map
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { BigIntStats } from "node:fs";
|
|
2
2
|
type ExactFileIdentity = Pick<BigIntStats, "dev" | "ino">;
|
|
3
3
|
export declare function inspectFileIdentity<T extends ExactFileIdentity>(inspect: () => T | Promise<T>, expected?: ExactFileIdentity, platform?: NodeJS.Platform): Promise<T>;
|
|
4
|
-
export declare function inspectFileIdentitySync<T extends ExactFileIdentity>(inspect: () => T, expected?: ExactFileIdentity, platform?: NodeJS.Platform): T;
|
|
4
|
+
export declare function inspectFileIdentitySync<T extends ExactFileIdentity>(inspect: () => T, expected?: ExactFileIdentity, platform?: NodeJS.Platform, mismatch?: () => Error): T;
|
|
5
5
|
export {};
|
|
6
|
-
//# sourceMappingURL=strict-file-identity.d.ts.map
|