@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
|
@@ -1,26 +1,25 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
|
-
import { defaultSyncShouldReclaim
|
|
2
|
+
import { defaultSyncShouldReclaim } from "./file-lock-sync-admission.js";
|
|
3
3
|
import { parseSidecarLockSnapshot, readSidecarLockRawSnapshotSync, removeSidecarLockIfUnchangedSync, } from "./sidecar-lock-reclaim.js";
|
|
4
|
+
import { assertSynchronousCallbackResult } from "./mutation-authority.js";
|
|
4
5
|
/** Handle one exclusive-create conflict without surrendering canonical admission. */
|
|
5
|
-
export function handleSyncStaleAdmission(params) {
|
|
6
|
+
export function handleSyncStaleAdmission(acquisition, params) {
|
|
6
7
|
const holderChanged = {};
|
|
7
8
|
const assertUnheld = () => {
|
|
8
|
-
|
|
9
|
-
throw syncLockTimeout(params.lockPath, params.normalizedTargetPath);
|
|
10
|
-
}
|
|
9
|
+
acquisition.assert();
|
|
11
10
|
if (params.currentHeld())
|
|
12
11
|
throw holderChanged;
|
|
13
12
|
};
|
|
14
13
|
const retryHolderChange = (error) => {
|
|
15
14
|
if (error !== holderChanged)
|
|
16
15
|
return false;
|
|
17
|
-
|
|
16
|
+
acquisition.waitForRetry();
|
|
18
17
|
return true;
|
|
19
18
|
};
|
|
20
19
|
let rawSnapshot;
|
|
21
20
|
let lockFileOpenDenied = false;
|
|
22
21
|
try {
|
|
23
|
-
rawSnapshot = readSidecarLockRawSnapshotSync(
|
|
22
|
+
rawSnapshot = readSidecarLockRawSnapshotSync(acquisition.lockPath, {
|
|
24
23
|
rejectNonFile: true,
|
|
25
24
|
onOpenFailure: (error) => {
|
|
26
25
|
lockFileOpenDenied = true;
|
|
@@ -40,7 +39,7 @@ export function handleSyncStaleAdmission(params) {
|
|
|
40
39
|
return;
|
|
41
40
|
throw boundaryError;
|
|
42
41
|
}
|
|
43
|
-
if (lockFileOpenDenied &&
|
|
42
|
+
if (lockFileOpenDenied && acquisition.retryDenial(error))
|
|
44
43
|
return;
|
|
45
44
|
throw error;
|
|
46
45
|
}
|
|
@@ -92,7 +91,7 @@ export function handleSyncStaleAdmission(params) {
|
|
|
92
91
|
throw error;
|
|
93
92
|
}
|
|
94
93
|
if (!snapshot) {
|
|
95
|
-
|
|
94
|
+
acquisition.waitForRetry();
|
|
96
95
|
return;
|
|
97
96
|
}
|
|
98
97
|
const nowMs = Date.now();
|
|
@@ -102,14 +101,15 @@ export function handleSyncStaleAdmission(params) {
|
|
|
102
101
|
try {
|
|
103
102
|
reclaim = stale.shouldReclaim
|
|
104
103
|
? Reflect.apply(stale.shouldReclaim, params.options, [{
|
|
105
|
-
lockPath:
|
|
106
|
-
normalizedTargetPath:
|
|
104
|
+
lockPath: acquisition.lockPath,
|
|
105
|
+
normalizedTargetPath: acquisition.normalizedTargetPath,
|
|
107
106
|
payload: snapshot.payload,
|
|
108
107
|
staleMs: params.staleMs,
|
|
109
108
|
nowMs,
|
|
110
109
|
heldByThisProcess: false,
|
|
111
110
|
}])
|
|
112
111
|
: defaultSyncShouldReclaim(snapshot, params.staleMs, nowMs);
|
|
112
|
+
assertSynchronousCallbackResult(reclaim, "shouldReclaim");
|
|
113
113
|
}
|
|
114
114
|
finally {
|
|
115
115
|
assertUnheld();
|
|
@@ -121,7 +121,7 @@ export function handleSyncStaleAdmission(params) {
|
|
|
121
121
|
throw error;
|
|
122
122
|
}
|
|
123
123
|
if (!reclaim) {
|
|
124
|
-
|
|
124
|
+
acquisition.waitForRetry();
|
|
125
125
|
return;
|
|
126
126
|
}
|
|
127
127
|
if (params.staleRecovery === "remove-if-unchanged" &&
|
|
@@ -132,11 +132,12 @@ export function handleSyncStaleAdmission(params) {
|
|
|
132
132
|
assertUnheld();
|
|
133
133
|
try {
|
|
134
134
|
approved = Reflect.apply(stale.shouldRemove, params.options, [{
|
|
135
|
-
lockPath:
|
|
136
|
-
normalizedTargetPath:
|
|
135
|
+
lockPath: acquisition.lockPath,
|
|
136
|
+
normalizedTargetPath: acquisition.normalizedTargetPath,
|
|
137
137
|
raw: snapshot.raw,
|
|
138
138
|
payload: snapshot.payload,
|
|
139
139
|
}]);
|
|
140
|
+
assertSynchronousCallbackResult(approved, "shouldRemoveStaleLock");
|
|
140
141
|
}
|
|
141
142
|
finally {
|
|
142
143
|
assertUnheld();
|
|
@@ -148,10 +149,10 @@ export function handleSyncStaleAdmission(params) {
|
|
|
148
149
|
throw error;
|
|
149
150
|
}
|
|
150
151
|
if (!approved) {
|
|
151
|
-
throw Object.assign(new Error(`file lock stale for ${
|
|
152
|
+
throw Object.assign(new Error(`file lock stale for ${acquisition.normalizedTargetPath}`), {
|
|
152
153
|
code: "file_lock_stale",
|
|
153
|
-
lockPath:
|
|
154
|
-
normalizedTargetPath:
|
|
154
|
+
lockPath: acquisition.lockPath,
|
|
155
|
+
normalizedTargetPath: acquisition.normalizedTargetPath,
|
|
155
156
|
});
|
|
156
157
|
}
|
|
157
158
|
try {
|
|
@@ -167,7 +168,7 @@ export function handleSyncStaleAdmission(params) {
|
|
|
167
168
|
throw boundaryError;
|
|
168
169
|
}
|
|
169
170
|
if (error.code === "EEXIST") {
|
|
170
|
-
|
|
171
|
+
acquisition.waitForRetry();
|
|
171
172
|
return;
|
|
172
173
|
}
|
|
173
174
|
throw error;
|
|
@@ -175,7 +176,7 @@ export function handleSyncStaleAdmission(params) {
|
|
|
175
176
|
let holderInterrupted = false;
|
|
176
177
|
try {
|
|
177
178
|
assertUnheld();
|
|
178
|
-
if (removeSidecarLockIfUnchangedSync(
|
|
179
|
+
if (removeSidecarLockIfUnchangedSync(acquisition.lockPath, snapshot, assertUnheld))
|
|
179
180
|
return;
|
|
180
181
|
}
|
|
181
182
|
catch (error) {
|
|
@@ -193,13 +194,13 @@ export function handleSyncStaleAdmission(params) {
|
|
|
193
194
|
}
|
|
194
195
|
}
|
|
195
196
|
if (holderInterrupted) {
|
|
196
|
-
|
|
197
|
+
acquisition.waitForRetry();
|
|
197
198
|
return;
|
|
198
199
|
}
|
|
199
200
|
}
|
|
200
|
-
throw Object.assign(new Error(`file lock stale for ${
|
|
201
|
+
throw Object.assign(new Error(`file lock stale for ${acquisition.normalizedTargetPath}`), {
|
|
201
202
|
code: "file_lock_stale",
|
|
202
|
-
lockPath:
|
|
203
|
-
normalizedTargetPath:
|
|
203
|
+
lockPath: acquisition.lockPath,
|
|
204
|
+
normalizedTargetPath: acquisition.normalizedTargetPath,
|
|
204
205
|
});
|
|
205
206
|
}
|
package/dist/file-lock-sync.d.ts
CHANGED
|
@@ -32,4 +32,3 @@ export type FileLockSyncHandle = {
|
|
|
32
32
|
};
|
|
33
33
|
export declare function acquireFileLockSync<TPayload extends Record<string, unknown>>(targetPath: string, options: FileLockSyncAcquireOptions<TPayload>): FileLockSyncHandle;
|
|
34
34
|
export declare function withFileLockSync<T, TPayload extends Record<string, unknown>>(targetPath: string, options: FileLockSyncAcquireOptions<TPayload>, fn: () => T): T;
|
|
35
|
-
//# sourceMappingURL=file-lock-sync.d.ts.map
|
package/dist/file-lock-sync.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import { acquireFileLockSyncWithRoot } from "./file-lock-sync-root-acquire.js";
|
|
3
|
-
import {
|
|
3
|
+
import { withSyncHeldLockHandle } from "./file-lock-sync-root-held.js";
|
|
4
4
|
import path from "node:path";
|
|
5
|
-
import { readSidecarLockSnapshotSync, removeSidecarLockIfUnchangedSync, serializeSidecarLockPayload, sidecarLockSnapshotMatches, } from "./sidecar-lock-reclaim.js";
|
|
6
|
-
import {
|
|
5
|
+
import { readSidecarLockRawSnapshotSync, readSidecarLockSnapshotSync, removeSidecarLockIfUnchangedSync, serializeSidecarLockPayload, sidecarLockSnapshotMatches, } from "./sidecar-lock-reclaim.js";
|
|
6
|
+
import { sidecarLockTimeout, isTransientLockFileDenial, validateSidecarLockStaleMs, validateSidecarLockCompromiseCheckIntervalMs, validateSidecarLockRetryOptions, validateSidecarLockTimeoutMs, } from "./sidecar-lock-policy.js";
|
|
7
7
|
import { getFsSafeLockConfig } from "./lock-config.js";
|
|
8
|
-
import {
|
|
8
|
+
import { SyncLockAcquisition } from "./file-lock-sync-acquisition.js";
|
|
9
9
|
import { assertNoWindowsPathAlias } from "./windows-path-alias.js";
|
|
10
10
|
import { realpathSync } from "./realpath.js";
|
|
11
11
|
import { recursiveMkdirPath } from "./recursive-mkdir-path.js";
|
|
12
12
|
import { createSuppressedError } from "./suppressed-error.js";
|
|
13
|
-
import { ensureSyncLockExitCleanupRegistered, getSyncHeldLocks, foreignSyncHeldLock, getSyncLockAdmissions, syncReclaimGuardExists,
|
|
13
|
+
import { ensureSyncLockExitCleanupRegistered, getSyncHeldLocks, foreignSyncHeldLock, getSyncLockAdmissions, syncReclaimGuardExists, } from "./file-lock-sync-admission.js";
|
|
14
14
|
import { handleSyncStaleAdmission, } from "./file-lock-sync-stale-admission.js";
|
|
15
15
|
function releaseAllSyncHeldLocks() {
|
|
16
16
|
const heldLocks = getSyncHeldLocks();
|
|
@@ -37,7 +37,11 @@ function releaseAllSyncHeldLocks() {
|
|
|
37
37
|
getSyncLockAdmissions().clear();
|
|
38
38
|
}
|
|
39
39
|
function verifySyncHeldLock(held) {
|
|
40
|
-
const
|
|
40
|
+
const lockPath = held.lockPath;
|
|
41
|
+
const parsePayload = held.parsePayload;
|
|
42
|
+
const current = parsePayload
|
|
43
|
+
? readSidecarLockSnapshotSync(lockPath, parsePayload)
|
|
44
|
+
: readSidecarLockRawSnapshotSync(lockPath);
|
|
41
45
|
return !!current && sidecarLockSnapshotMatches(current, held.snapshot);
|
|
42
46
|
}
|
|
43
47
|
function releaseSyncHeldLock(held) {
|
|
@@ -131,15 +135,7 @@ export function acquireFileLockSync(targetPath, options) {
|
|
|
131
135
|
initiallyHeld.refCount += 1;
|
|
132
136
|
return createSyncHeldLockHandle(initiallyHeld);
|
|
133
137
|
}
|
|
134
|
-
const
|
|
135
|
-
const admissionToken = {};
|
|
136
|
-
let ownsAdmission = false;
|
|
137
|
-
const hasAdmissionToken = () => admissions.get(normalizedTargetPath) === admissionToken;
|
|
138
|
-
const releaseAdmission = () => {
|
|
139
|
-
if (ownsAdmission && hasAdmissionToken())
|
|
140
|
-
admissions.delete(normalizedTargetPath);
|
|
141
|
-
ownsAdmission = false;
|
|
142
|
-
};
|
|
138
|
+
const acquisition = new SyncLockAcquisition(lockPath, normalizedTargetPath, retry, timeoutMs);
|
|
143
139
|
let payloadCallback;
|
|
144
140
|
let onCompromised = undefined;
|
|
145
141
|
let onCompromisedObserved = false;
|
|
@@ -148,54 +144,10 @@ export function acquireFileLockSync(targetPath, options) {
|
|
|
148
144
|
let staleRecovery = undefined;
|
|
149
145
|
let staleRecoveryObserved = false;
|
|
150
146
|
const staleOptions = {};
|
|
151
|
-
const startedAt = Date.now();
|
|
152
|
-
let attempt = 0;
|
|
153
|
-
let transientDenials = 0;
|
|
154
147
|
const reclaimGuardPath = `${lockPath}.reclaim`;
|
|
155
|
-
const waitForRetry = () => {
|
|
156
|
-
releaseAdmission();
|
|
157
|
-
const elapsed = Date.now() - startedAt;
|
|
158
|
-
const timedOut = timeoutMs !== undefined && elapsed >= timeoutMs;
|
|
159
|
-
if (timedOut || (retry.retries !== undefined && attempt >= retry.retries)) {
|
|
160
|
-
throw syncLockTimeout(lockPath, normalizedTargetPath);
|
|
161
|
-
}
|
|
162
|
-
const remaining = timeoutMs === undefined || timeoutMs === Number.POSITIVE_INFINITY
|
|
163
|
-
? Number.POSITIVE_INFINITY
|
|
164
|
-
: Math.max(0, timeoutMs - elapsed);
|
|
165
|
-
sleepSync(Math.min(computeSidecarLockDelayMs(retry, attempt), remaining));
|
|
166
|
-
attempt += 1;
|
|
167
|
-
};
|
|
168
|
-
const retryLockFileDenial = (error) => {
|
|
169
|
-
if (!isTransientLockFileDenial(error, lockPath) ||
|
|
170
|
-
++transientDenials > maxTransientLockDenials)
|
|
171
|
-
return false;
|
|
172
|
-
try {
|
|
173
|
-
waitForRetry();
|
|
174
|
-
}
|
|
175
|
-
catch (waitError) {
|
|
176
|
-
// Preserve the filesystem diagnosis when the caller's budget runs out.
|
|
177
|
-
if (waitError.code === "file_lock_timeout")
|
|
178
|
-
throw error;
|
|
179
|
-
throw waitError;
|
|
180
|
-
}
|
|
181
|
-
return true;
|
|
182
|
-
};
|
|
183
|
-
const assertAdmissionToken = () => {
|
|
184
|
-
if (!hasAdmissionToken())
|
|
185
|
-
throw syncLockTimeout(lockPath, normalizedTargetPath);
|
|
186
|
-
};
|
|
187
|
-
const runAdmissionBoundary = (callback) => {
|
|
188
|
-
assertAdmissionToken();
|
|
189
|
-
try {
|
|
190
|
-
return callback();
|
|
191
|
-
}
|
|
192
|
-
finally {
|
|
193
|
-
assertAdmissionToken();
|
|
194
|
-
}
|
|
195
|
-
};
|
|
196
148
|
try {
|
|
197
149
|
while (true) {
|
|
198
|
-
if (!
|
|
150
|
+
if (!acquisition.owns) {
|
|
199
151
|
const held = heldLocks.get(normalizedTargetPath);
|
|
200
152
|
if (held && !foreignSyncHeldLock("raw", normalizedTargetPath) &&
|
|
201
153
|
requestedReentrantOwner !== undefined &&
|
|
@@ -204,12 +156,7 @@ export function acquireFileLockSync(targetPath, options) {
|
|
|
204
156
|
held.refCount += 1;
|
|
205
157
|
return createSyncHeldLockHandle(held);
|
|
206
158
|
}
|
|
207
|
-
|
|
208
|
-
// The owner can only finish after this synchronous callback unwinds.
|
|
209
|
-
throw syncLockTimeout(lockPath, normalizedTargetPath);
|
|
210
|
-
}
|
|
211
|
-
admissions.set(normalizedTargetPath, admissionToken);
|
|
212
|
-
ownsAdmission = true;
|
|
159
|
+
acquisition.reserve();
|
|
213
160
|
}
|
|
214
161
|
const attemptHeld = currentTargetHolder();
|
|
215
162
|
const holderWasReplaced = () => {
|
|
@@ -217,60 +164,60 @@ export function acquireFileLockSync(targetPath, options) {
|
|
|
217
164
|
return current !== undefined && current !== attemptHeld;
|
|
218
165
|
};
|
|
219
166
|
if (!staleRecoveryObserved) {
|
|
220
|
-
staleRecovery =
|
|
167
|
+
staleRecovery = acquisition.run(() => options.staleRecovery ?? defaults.staleRecovery);
|
|
221
168
|
staleRecoveryObserved = true;
|
|
222
169
|
if (holderWasReplaced()) {
|
|
223
|
-
waitForRetry();
|
|
170
|
+
acquisition.waitForRetry();
|
|
224
171
|
continue;
|
|
225
172
|
}
|
|
226
173
|
}
|
|
227
174
|
const reclaimGuardExists = syncReclaimGuardExists(reclaimGuardPath);
|
|
228
|
-
if (!
|
|
229
|
-
throw
|
|
175
|
+
if (!acquisition.hasToken())
|
|
176
|
+
throw sidecarLockTimeout(lockPath, normalizedTargetPath);
|
|
230
177
|
if (holderWasReplaced()) {
|
|
231
|
-
waitForRetry();
|
|
178
|
+
acquisition.waitForRetry();
|
|
232
179
|
continue;
|
|
233
180
|
}
|
|
234
181
|
if (reclaimGuardExists) {
|
|
235
|
-
waitForRetry();
|
|
182
|
+
acquisition.waitForRetry();
|
|
236
183
|
continue;
|
|
237
184
|
}
|
|
238
185
|
let fd;
|
|
239
186
|
let createdHeld;
|
|
240
187
|
let createdSnapshot;
|
|
241
188
|
if (!payloadCallback)
|
|
242
|
-
payloadCallback =
|
|
189
|
+
payloadCallback = acquisition.run(() => options.payload);
|
|
243
190
|
if (holderWasReplaced()) {
|
|
244
|
-
waitForRetry();
|
|
191
|
+
acquisition.waitForRetry();
|
|
245
192
|
continue;
|
|
246
193
|
}
|
|
247
|
-
const payload =
|
|
194
|
+
const payload = acquisition.run(() => Reflect.apply(payloadCallback, options, []));
|
|
248
195
|
if (holderWasReplaced()) {
|
|
249
|
-
waitForRetry();
|
|
196
|
+
acquisition.waitForRetry();
|
|
250
197
|
continue;
|
|
251
198
|
}
|
|
252
|
-
const { raw, ownershipToken } =
|
|
199
|
+
const { raw, ownershipToken } = acquisition.run(() => serializeSidecarLockPayload(payload));
|
|
253
200
|
if (holderWasReplaced()) {
|
|
254
|
-
waitForRetry();
|
|
201
|
+
acquisition.waitForRetry();
|
|
255
202
|
continue;
|
|
256
203
|
}
|
|
257
204
|
if (currentTargetHolder() !== undefined) {
|
|
258
|
-
waitForRetry();
|
|
205
|
+
acquisition.waitForRetry();
|
|
259
206
|
continue;
|
|
260
207
|
}
|
|
261
208
|
if (!onCompromisedObserved) {
|
|
262
|
-
onCompromised =
|
|
209
|
+
onCompromised = acquisition.run(() => options.onCompromised);
|
|
263
210
|
onCompromisedObserved = true;
|
|
264
211
|
if (currentTargetHolder() !== undefined) {
|
|
265
|
-
waitForRetry();
|
|
212
|
+
acquisition.waitForRetry();
|
|
266
213
|
continue;
|
|
267
214
|
}
|
|
268
215
|
}
|
|
269
216
|
if (!parsePayloadObserved) {
|
|
270
|
-
parsePayload =
|
|
217
|
+
parsePayload = acquisition.run(() => options.parsePayload);
|
|
271
218
|
parsePayloadObserved = true;
|
|
272
219
|
if (currentTargetHolder() !== undefined) {
|
|
273
|
-
waitForRetry();
|
|
220
|
+
acquisition.waitForRetry();
|
|
274
221
|
continue;
|
|
275
222
|
}
|
|
276
223
|
}
|
|
@@ -307,34 +254,17 @@ export function acquireFileLockSync(targetPath, options) {
|
|
|
307
254
|
};
|
|
308
255
|
const candidateHeld = createdHeld;
|
|
309
256
|
ensureSyncLockExitCleanupRegistered(releaseAllSyncHeldLocks, lockPath, normalizedTargetPath);
|
|
310
|
-
if (!
|
|
311
|
-
throw
|
|
257
|
+
if (!acquisition.hasToken() || currentTargetHolder() !== undefined) {
|
|
258
|
+
throw sidecarLockTimeout(lockPath, normalizedTargetPath);
|
|
312
259
|
}
|
|
313
260
|
const returnedHandle = createSyncHeldLockHandle(candidateHeld);
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
candidateHeld.timer = setInterval(() => {
|
|
317
|
-
let stillHeld;
|
|
318
|
-
try {
|
|
319
|
-
stillHeld = returnedHandle.verifyStillHeld();
|
|
320
|
-
}
|
|
321
|
-
catch {
|
|
322
|
-
stillHeld = false;
|
|
323
|
-
}
|
|
324
|
-
if (!stillHeld && candidateHeld.timer) {
|
|
325
|
-
clearInterval(candidateHeld.timer);
|
|
326
|
-
candidateHeld.timer = undefined;
|
|
327
|
-
Reflect.apply(compromisedCallback, options, [{ lockPath, normalizedTargetPath }]);
|
|
328
|
-
}
|
|
329
|
-
}, compromiseCheckIntervalMs);
|
|
330
|
-
candidateHeld.timer.unref();
|
|
331
|
-
}
|
|
332
|
-
if (!hasAdmissionToken() ||
|
|
261
|
+
acquisition.monitor(candidateHeld, returnedHandle, onCompromised, compromiseCheckIntervalMs, options);
|
|
262
|
+
if (!acquisition.hasToken() ||
|
|
333
263
|
currentTargetHolder() !== undefined) {
|
|
334
|
-
throw
|
|
264
|
+
throw sidecarLockTimeout(lockPath, normalizedTargetPath);
|
|
335
265
|
}
|
|
336
266
|
heldLocks.set(normalizedTargetPath, candidateHeld);
|
|
337
|
-
|
|
267
|
+
acquisition.release();
|
|
338
268
|
fd = undefined;
|
|
339
269
|
return returnedHandle;
|
|
340
270
|
}
|
|
@@ -370,54 +300,42 @@ export function acquireFileLockSync(targetPath, options) {
|
|
|
370
300
|
}
|
|
371
301
|
}
|
|
372
302
|
if (lockFileCreateDenied) {
|
|
373
|
-
if (!
|
|
374
|
-
throw
|
|
303
|
+
if (!acquisition.hasToken())
|
|
304
|
+
throw sidecarLockTimeout(lockPath, normalizedTargetPath);
|
|
375
305
|
if (currentTargetHolder() !== undefined) {
|
|
376
|
-
waitForRetry();
|
|
306
|
+
acquisition.waitForRetry();
|
|
377
307
|
continue;
|
|
378
308
|
}
|
|
379
|
-
if (
|
|
309
|
+
if (acquisition.retryDenial(error))
|
|
380
310
|
continue;
|
|
381
311
|
throw error;
|
|
382
312
|
}
|
|
383
313
|
if (!exclusiveCreateConflict)
|
|
384
314
|
throw error;
|
|
385
|
-
if (!
|
|
386
|
-
throw
|
|
315
|
+
if (!acquisition.hasToken())
|
|
316
|
+
throw sidecarLockTimeout(lockPath, normalizedTargetPath);
|
|
387
317
|
if (currentTargetHolder() !== undefined) {
|
|
388
|
-
waitForRetry();
|
|
318
|
+
acquisition.waitForRetry();
|
|
389
319
|
continue;
|
|
390
320
|
}
|
|
391
|
-
handleSyncStaleAdmission({
|
|
392
|
-
hasToken: hasAdmissionToken,
|
|
321
|
+
handleSyncStaleAdmission(acquisition, {
|
|
393
322
|
currentHeld: currentTargetHolder,
|
|
394
|
-
lockPath,
|
|
395
|
-
normalizedTargetPath,
|
|
396
323
|
options,
|
|
397
324
|
parsePayload,
|
|
398
325
|
reclaimGuardPath,
|
|
399
|
-
retryLockFileDenial,
|
|
400
326
|
staleMs,
|
|
401
327
|
staleOptions,
|
|
402
328
|
staleRecovery,
|
|
403
|
-
waitForRetry,
|
|
404
329
|
});
|
|
405
330
|
continue;
|
|
406
331
|
}
|
|
407
332
|
}
|
|
408
333
|
}
|
|
409
334
|
finally {
|
|
410
|
-
|
|
335
|
+
acquisition.release();
|
|
411
336
|
}
|
|
412
337
|
}
|
|
413
338
|
export function withFileLockSync(targetPath, options, fn) {
|
|
414
339
|
const lock = acquireFileLockSync(targetPath, options);
|
|
415
|
-
|
|
416
|
-
return withRootSyncHeldLockHandle(lock, fn);
|
|
417
|
-
try {
|
|
418
|
-
return fn();
|
|
419
|
-
}
|
|
420
|
-
finally {
|
|
421
|
-
lock.release();
|
|
422
|
-
}
|
|
340
|
+
return withSyncHeldLockHandle(lock, fn);
|
|
423
341
|
}
|
package/dist/file-lock.d.ts
CHANGED
|
@@ -21,4 +21,3 @@ export declare function withFileLock<T, TPayload extends Record<string, unknown>
|
|
|
21
21
|
export declare function createFileLockManager(key: string): FileLockManager;
|
|
22
22
|
export declare function drainFileLockManagerForTest(targetPath: string, managerKey?: string): Promise<void>;
|
|
23
23
|
export declare function resetFileLockManagerForTest(targetPath: string, managerKey?: string): void;
|
|
24
|
-
//# sourceMappingURL=file-lock.d.ts.map
|
|
@@ -18,7 +18,6 @@ export declare function writeStreamToTempSource(params: {
|
|
|
18
18
|
path: string;
|
|
19
19
|
cleanup: () => Promise<void>;
|
|
20
20
|
}>;
|
|
21
|
-
export declare function assertSyncDirectoryGuard(guard: SyncParentGuard): void;
|
|
22
21
|
export declare function ensureParentSync(params: {
|
|
23
22
|
rootDir: string;
|
|
24
23
|
filePath: string;
|
|
@@ -30,4 +29,3 @@ export declare function ensureStoreDirectorySync(params: {
|
|
|
30
29
|
mode: number;
|
|
31
30
|
messagePrefix: "private store" | "store";
|
|
32
31
|
}): SyncParentGuard;
|
|
33
|
-
//# sourceMappingURL=file-store-boundary.d.ts.map
|
|
@@ -2,7 +2,6 @@ import syncFs from "node:fs";
|
|
|
2
2
|
import fs from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { createByteLimitTransform } from "./bounded-read-stream.js";
|
|
5
|
-
import { normalizeMaxBytes } from "./byte-budget.js";
|
|
6
5
|
import { pipeline } from "node:stream/promises";
|
|
7
6
|
import { FsSafeError } from "./errors.js";
|
|
8
7
|
import { assertSyncStoreDirectoryReceipt, ensureSyncStoreDirectory, } from "./file-store-sync-directory.js";
|
|
@@ -14,13 +13,9 @@ import { prepareSecretFileWrite } from "./secret-file.js";
|
|
|
14
13
|
import { resolveSecureTempRoot } from "./secure-temp-dir.js";
|
|
15
14
|
import { recursiveMkdirPath } from "./recursive-mkdir-path.js";
|
|
16
15
|
import { assertNoWindowsPathAlias } from "./windows-path-alias.js";
|
|
17
|
-
function parentRelativePath(relativePath) {
|
|
18
|
-
const parent = path.posix.dirname(relativePath);
|
|
19
|
-
return parent === "." ? "" : parent;
|
|
20
|
-
}
|
|
21
16
|
export async function ensureParentInRoot(scopedRoot, relativePath, mode) {
|
|
22
|
-
const parent =
|
|
23
|
-
if (
|
|
17
|
+
const parent = path.posix.dirname(relativePath);
|
|
18
|
+
if (parent === ".") {
|
|
24
19
|
return;
|
|
25
20
|
}
|
|
26
21
|
await scopedRoot.mkdir(parent);
|
|
@@ -28,10 +23,9 @@ export async function ensureParentInRoot(scopedRoot, relativePath, mode) {
|
|
|
28
23
|
}
|
|
29
24
|
export async function openWritableStoreRoot(params) {
|
|
30
25
|
assertNoWindowsPathAlias(params.rootDir, "filesystem", "store root uses a Windows filesystem namespace alias");
|
|
31
|
-
const maxBytes = normalizeMaxBytes(params.maxBytes);
|
|
32
26
|
await fs.mkdir(recursiveMkdirPath(params.rootDir), { recursive: true, mode: params.dirMode });
|
|
33
27
|
await fs.chmod(params.rootDir, params.dirMode).catch(() => undefined);
|
|
34
|
-
return await root(params.rootDir, { hardlinks: "reject", maxBytes });
|
|
28
|
+
return await root(params.rootDir, { hardlinks: "reject", maxBytes: params.maxBytes });
|
|
35
29
|
}
|
|
36
30
|
export async function openPrivateStoreLockRoot(params) {
|
|
37
31
|
const { parentGuard } = await prepareSecretFileWrite(params);
|
|
@@ -66,15 +60,8 @@ async function chmodDirectoryInRootBestEffort(scopedRoot, relativePath, mode) {
|
|
|
66
60
|
await handle.close().catch(() => undefined);
|
|
67
61
|
}
|
|
68
62
|
}
|
|
69
|
-
function createMaxBytesTransform(maxBytes) {
|
|
70
|
-
const limit = normalizeMaxBytes(maxBytes);
|
|
71
|
-
if (limit === undefined) {
|
|
72
|
-
return undefined;
|
|
73
|
-
}
|
|
74
|
-
return createByteLimitTransform(limit, () => new FsSafeError("too-large", `file exceeds maximum size of ${limit} bytes`));
|
|
75
|
-
}
|
|
76
63
|
export async function writeStreamToTempSource(params) {
|
|
77
|
-
const maxBytes =
|
|
64
|
+
const maxBytes = params.maxBytes;
|
|
78
65
|
const tempRoot = resolveSecureTempRoot({
|
|
79
66
|
fallbackPrefix: "fs-safe-file-store",
|
|
80
67
|
unsafeFallbackLabel: "file store temp dir",
|
|
@@ -90,7 +77,7 @@ export async function writeStreamToTempSource(params) {
|
|
|
90
77
|
writable.once("close", () => {
|
|
91
78
|
handleClosedByStream = true;
|
|
92
79
|
});
|
|
93
|
-
const limiter =
|
|
80
|
+
const limiter = maxBytes === undefined ? undefined : createByteLimitTransform(maxBytes, () => new FsSafeError("too-large", `file exceeds maximum size of ${maxBytes} bytes`));
|
|
94
81
|
if (limiter) {
|
|
95
82
|
await pipeline(params.stream, limiter, writable);
|
|
96
83
|
}
|
|
@@ -116,13 +103,6 @@ export async function writeStreamToTempSource(params) {
|
|
|
116
103
|
throw err;
|
|
117
104
|
}
|
|
118
105
|
}
|
|
119
|
-
export function assertSyncDirectoryGuard(guard) {
|
|
120
|
-
assertSyncStoreDirectoryReceipt({
|
|
121
|
-
dir: guard.dir,
|
|
122
|
-
realPath: guard.realPath,
|
|
123
|
-
exactStat: guard.exactStat,
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
106
|
export function ensureParentSync(params) {
|
|
127
107
|
assertNoWindowsPathAlias(params.rootDir, "filesystem", "store root uses a Windows filesystem namespace alias");
|
|
128
108
|
assertNoWindowsPathAlias(params.filePath, "filesystem", "store path uses a Windows filesystem namespace alias");
|
|
@@ -135,6 +115,6 @@ export function ensureParentSync(params) {
|
|
|
135
115
|
}
|
|
136
116
|
export function ensureStoreDirectorySync(params) {
|
|
137
117
|
const guard = ensureSyncStoreDirectory(params);
|
|
138
|
-
|
|
118
|
+
assertSyncStoreDirectoryReceipt(guard);
|
|
139
119
|
return guard;
|
|
140
120
|
}
|
|
@@ -21,7 +21,7 @@ export async function readFileStoreCopySource(params) {
|
|
|
21
21
|
cause: error instanceof Error ? error : undefined,
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
|
-
if (
|
|
24
|
+
if (message.includes(`exceeds ${params.maxBytes} bytes`)) {
|
|
25
25
|
throw new FsSafeError("too-large", `file exceeds maximum size of ${params.maxBytes} bytes`, {
|
|
26
26
|
cause: error instanceof Error ? error : undefined,
|
|
27
27
|
});
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export declare function assertFileStoreMaxBytes(size: number,
|
|
2
|
-
//# sourceMappingURL=file-store-limit.d.ts.map
|
|
1
|
+
export declare function assertFileStoreMaxBytes(size: number, limit: number | undefined): void;
|
package/dist/file-store-limit.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { normalizeMaxBytes } from "./byte-budget.js";
|
|
2
1
|
import { FsSafeError } from "./errors.js";
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
// Store operation boundaries admit the primitive limit before reaching this helper.
|
|
3
|
+
export function assertFileStoreMaxBytes(size, limit) {
|
|
5
4
|
if (limit !== undefined && size > limit) {
|
|
6
5
|
throw new FsSafeError("too-large", `file exceeds maximum size of ${limit} bytes`);
|
|
7
6
|
}
|