@openclaw/fs-safe 0.17.0 → 0.18.1

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.
Files changed (690) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/dist/absolute-path.d.ts +0 -1
  3. package/dist/advanced.d.ts +2 -2
  4. package/dist/archive-crc32.d.ts +0 -1
  5. package/dist/archive-deadline.d.ts +0 -1
  6. package/dist/archive-durability.d.ts +1 -2
  7. package/dist/archive-entry.d.ts +0 -1
  8. package/dist/archive-errors.d.ts +0 -1
  9. package/dist/archive-gzip-tail.d.ts +0 -1
  10. package/dist/archive-input.d.ts +0 -1
  11. package/dist/archive-kind.d.ts +0 -1
  12. package/dist/archive-limits.d.ts +0 -1
  13. package/dist/archive-merge.d.ts +2 -4
  14. package/dist/archive-merge.js +14 -4
  15. package/dist/archive-parser-errors.d.ts +0 -1
  16. package/dist/archive-parser.wasm +0 -0
  17. package/dist/archive-plan.d.ts +72 -2
  18. package/dist/archive-plan.js +86 -22
  19. package/dist/archive-read.d.ts +0 -1
  20. package/dist/archive-staging.d.ts +0 -1
  21. package/dist/archive-tar-stream.d.ts +0 -1
  22. package/dist/archive-tar-wasm.d.ts +1 -2
  23. package/dist/archive-zip-admission.d.ts +0 -1
  24. package/dist/archive-zip-count.d.ts +0 -1
  25. package/dist/archive-zip-directory.d.ts +1 -2
  26. package/dist/archive-zip-entry.d.ts +1 -2
  27. package/dist/archive-zip-entry.js +1 -1
  28. package/dist/archive-zip-integrity.d.ts +0 -1
  29. package/dist/archive-zip-loader.d.ts +0 -1
  30. package/dist/archive-zip-manifest.d.ts +0 -1
  31. package/dist/archive-zip-names.d.ts +0 -1
  32. package/dist/archive-zip-preflight.d.ts +0 -1
  33. package/dist/archive.d.ts +8 -6
  34. package/dist/archive.js +204 -168
  35. package/dist/async-lock.d.ts +0 -1
  36. package/dist/atomic.d.ts +3 -2
  37. package/dist/bounded-read-stream.d.ts +0 -1
  38. package/dist/bounded-read.d.ts +0 -1
  39. package/dist/byte-budget.d.ts +0 -1
  40. package/dist/byte-view.d.ts +0 -1
  41. package/dist/clone-metadata.d.ts +0 -1
  42. package/dist/config.d.ts +0 -1
  43. package/dist/containment.d.ts +0 -1
  44. package/dist/copy-file-input.d.ts +0 -1
  45. package/dist/copy-policy.d.ts +0 -1
  46. package/dist/copy-publication.d.ts +1 -2
  47. package/dist/copy-tree-portable.d.ts +0 -1
  48. package/dist/copy-tree-portable.js +9 -6
  49. package/dist/copy.d.ts +0 -1
  50. package/dist/copy.js +5 -5
  51. package/dist/create-owned-file.d.ts +0 -1
  52. package/dist/create.d.ts +16 -3
  53. package/dist/create.js +388 -2
  54. package/dist/creation-boundary.d.ts +60 -0
  55. package/dist/creation-boundary.js +371 -0
  56. package/dist/deny-mutations.d.ts +2 -3
  57. package/dist/deny-mutations.js +55 -35
  58. package/dist/device-path.d.ts +0 -1
  59. package/dist/directory-durability.d.ts +0 -1
  60. package/dist/directory-entry-path.d.ts +0 -1
  61. package/dist/directory-guard.d.ts +2 -7
  62. package/dist/directory-guard.js +25 -56
  63. package/dist/directory-mode-node.d.ts +0 -1
  64. package/dist/directory-mode-node.js +12 -2
  65. package/dist/directory-mode-owner.d.ts +0 -1
  66. package/dist/directory-receipt.d.ts +0 -1
  67. package/dist/durability.d.ts +2 -2
  68. package/dist/effective-uid.d.ts +0 -1
  69. package/dist/error-detail.d.ts +0 -1
  70. package/dist/errors.d.ts +0 -1
  71. package/dist/file-cleanup.d.ts +0 -1
  72. package/dist/file-contents.d.ts +0 -1
  73. package/dist/file-handle-transfer.d.ts +0 -1
  74. package/dist/file-hash.d.ts +0 -1
  75. package/dist/file-hash.js +170 -66
  76. package/dist/file-identity.d.ts +0 -1
  77. package/dist/file-lock-sync-acquisition.d.ts +22 -0
  78. package/dist/file-lock-sync-acquisition.js +98 -0
  79. package/dist/file-lock-sync-admission.d.ts +0 -2
  80. package/dist/file-lock-sync-admission.js +9 -48
  81. package/dist/file-lock-sync-root-acquire.d.ts +0 -1
  82. package/dist/file-lock-sync-root-acquire.js +33 -103
  83. package/dist/file-lock-sync-root-arbitration.d.ts +0 -1
  84. package/dist/file-lock-sync-root-held.d.ts +0 -1
  85. package/dist/file-lock-sync-root-io.d.ts +0 -1
  86. package/dist/file-lock-sync-root-mutation.d.ts +4 -5
  87. package/dist/file-lock-sync-root-mutation.js +7 -9
  88. package/dist/file-lock-sync-root-options.d.ts +0 -1
  89. package/dist/file-lock-sync-root-registration.d.ts +0 -1
  90. package/dist/file-lock-sync-root.d.ts +3 -3
  91. package/dist/file-lock-sync-root.js +14 -87
  92. package/dist/file-lock-sync-stale-admission.d.ts +2 -7
  93. package/dist/file-lock-sync-stale-admission.js +18 -27
  94. package/dist/file-lock-sync.d.ts +4 -22
  95. package/dist/file-lock-sync.js +38 -117
  96. package/dist/file-lock.d.ts +0 -1
  97. package/dist/file-observation.d.ts +0 -1
  98. package/dist/file-store-boundary.d.ts +7 -2
  99. package/dist/file-store-boundary.js +64 -27
  100. package/dist/file-store-prune.d.ts +0 -1
  101. package/dist/file-store-sync-directory.d.ts +0 -1
  102. package/dist/file-store-sync-directory.js +194 -231
  103. package/dist/file-store-sync-write.d.ts +0 -1
  104. package/dist/file-store-sync-write.js +18 -29
  105. package/dist/file-store.d.ts +0 -1
  106. package/dist/file-store.js +4 -10
  107. package/dist/file-sync.d.ts +0 -1
  108. package/dist/filename.d.ts +0 -1
  109. package/dist/filename.js +1 -7
  110. package/dist/fs.d.ts +0 -1
  111. package/dist/guarded-mkdir.d.ts +1 -2
  112. package/dist/guarded-mutation.d.ts +0 -7
  113. package/dist/guarded-mutation.js +6 -11
  114. package/dist/guest-dispatch-python.d.ts +0 -1
  115. package/dist/guest-dispatch-python.js +41 -90
  116. package/dist/guest-native-python.d.ts +0 -1
  117. package/dist/guest.d.ts +0 -1
  118. package/dist/home-dir.d.ts +0 -1
  119. package/dist/index.d.ts +9 -7
  120. package/dist/install-path.d.ts +0 -1
  121. package/dist/json-document-store.d.ts +0 -1
  122. package/dist/json-durable-queue-directory.d.ts +13 -1
  123. package/dist/json-durable-queue-directory.js +134 -0
  124. package/dist/json-durable-queue-ownership.d.ts +0 -1
  125. package/dist/json-durable-queue-ownership.js +42 -61
  126. package/dist/json-durable-queue-read.d.ts +0 -1
  127. package/dist/json-durable-queue-read.js +13 -9
  128. package/dist/json-durable-queue.d.ts +0 -1
  129. package/dist/json-durable-queue.js +8 -132
  130. package/dist/json-store.d.ts +0 -1
  131. package/dist/json-store.js +1 -2
  132. package/dist/json-stringify.d.ts +0 -1
  133. package/dist/json.d.ts +0 -1
  134. package/dist/json.js +7 -17
  135. package/dist/local-file-access.d.ts +0 -1
  136. package/dist/local-file-access.js +3 -10
  137. package/dist/local-file-descriptor.d.ts +0 -1
  138. package/dist/local-roots.d.ts +0 -1
  139. package/dist/lock-config.d.ts +0 -1
  140. package/dist/move-path-cleanup.d.ts +0 -1
  141. package/dist/move-path-stage.d.ts +0 -1
  142. package/dist/move-path.d.ts +0 -1
  143. package/dist/move-path.js +1 -2
  144. package/dist/mutation-authority.d.ts +0 -1
  145. package/dist/native-binding.d.ts +0 -1
  146. package/dist/native-config.d.ts +0 -1
  147. package/dist/native-directory-observation.d.ts +0 -1
  148. package/dist/native-fallback-warning.d.ts +0 -1
  149. package/dist/native-operations.d.ts +1 -5
  150. package/dist/native-operations.js +2 -7
  151. package/dist/native-parent-admission.d.ts +0 -1
  152. package/dist/native-pinned-write-windows.d.ts +1 -2
  153. package/dist/native-pinned-write-windows.js +1 -1
  154. package/dist/native-pinned-write.d.ts +1 -2
  155. package/dist/native-pinned-write.js +7 -16
  156. package/dist/native-policy-directory-observation.d.ts +0 -1
  157. package/dist/native-policy-parent-windows.d.ts +1 -2
  158. package/dist/native-rename-outcome.d.ts +0 -1
  159. package/dist/native-staged-file.d.ts +17 -5
  160. package/dist/native-staged-file.js +56 -65
  161. package/dist/native.d.ts +0 -1
  162. package/dist/opened-file-failure.d.ts +0 -1
  163. package/dist/opened-realpath.d.ts +0 -1
  164. package/dist/output.d.ts +0 -1
  165. package/dist/overwrite-file-handle.d.ts +0 -1
  166. package/dist/owner-dacl.d.ts +0 -1
  167. package/dist/path-case.d.ts +0 -1
  168. package/dist/path-policy.d.ts +0 -1
  169. package/dist/path-prefix.d.ts +0 -1
  170. package/dist/path-scope-lexical.d.ts +0 -1
  171. package/dist/path-segment-route.d.ts +0 -1
  172. package/dist/path-suffix-aliases.d.ts +0 -1
  173. package/dist/path.d.ts +0 -1
  174. package/dist/permission-exec.d.ts +0 -1
  175. package/dist/permission-exec.js +19 -25
  176. package/dist/permissions-public.d.ts +0 -1
  177. package/dist/permissions-windows.d.ts +2 -10
  178. package/dist/permissions-windows.js +10 -30
  179. package/dist/permissions.d.ts +0 -1
  180. package/dist/permissions.js +8 -16
  181. package/dist/pinned-mutation-admission.d.ts +1 -2
  182. package/dist/pinned-mutation-observation.d.ts +0 -1
  183. package/dist/pinned-mutation-shared-route.d.ts +0 -1
  184. package/dist/pinned-open.d.ts +1 -1
  185. package/dist/pinned-open.js +7 -2
  186. package/dist/pinned-operation.d.ts +1 -2
  187. package/dist/pinned-operation.js +3 -16
  188. package/dist/pinned-write-input.d.ts +0 -1
  189. package/dist/pinned-write-mode.d.ts +0 -1
  190. package/dist/pinned-write-mode.js +1 -1
  191. package/dist/pinned-write-staged.d.ts +0 -1
  192. package/dist/pinned-write-staged.js +1 -2
  193. package/dist/pinned-write-types.d.ts +9 -21
  194. package/dist/pinned-write.d.ts +0 -2
  195. package/dist/pinned-write.js +3 -5
  196. package/dist/positional-read.d.ts +0 -1
  197. package/dist/private-directory.d.ts +0 -1
  198. package/dist/private-producer-handoff-sync.d.ts +2 -13
  199. package/dist/private-producer-handoff-sync.js +10 -52
  200. package/dist/private-producer-handoff.d.ts +23 -4
  201. package/dist/private-producer-handoff.js +69 -46
  202. package/dist/private-temp-workspace.d.ts +0 -1
  203. package/dist/private-temp-workspace.js +11 -37
  204. package/dist/publish-copy-stage.d.ts +1 -2
  205. package/dist/publish-file-failure.d.ts +0 -1
  206. package/dist/publish-file.d.ts +0 -2
  207. package/dist/publish-file.js +1 -2
  208. package/dist/read-open-flags.d.ts +0 -1
  209. package/dist/read-opened-file.d.ts +0 -1
  210. package/dist/realpath.d.ts +0 -1
  211. package/dist/recursive-mkdir-path.d.ts +0 -1
  212. package/dist/regular-file.d.ts +0 -1
  213. package/dist/regular-file.js +77 -139
  214. package/dist/replace-directory.d.ts +0 -1
  215. package/dist/replace-directory.js +1 -2
  216. package/dist/replace-file-copy-fallback.d.ts +0 -1
  217. package/dist/replace-file-copy-fallback.js +14 -3
  218. package/dist/replace-file-copy-source.d.ts +0 -1
  219. package/dist/replace-file-copy-source.js +6 -1
  220. package/dist/replace-file-descriptor.d.ts +0 -1
  221. package/dist/replace-file-descriptor.js +6 -1
  222. package/dist/replace-file-mode.d.ts +0 -1
  223. package/dist/replace-file-rename-policy.d.ts +1 -3
  224. package/dist/replace-file-temp-owner.d.ts +12 -13
  225. package/dist/replace-file-temp-owner.js +66 -85
  226. package/dist/replace-file.d.ts +3 -4
  227. package/dist/replace-file.js +1 -1
  228. package/dist/retained-directory-replacement.d.ts +0 -1
  229. package/dist/root-boundary.d.ts +0 -1
  230. package/dist/root-context.d.ts +0 -1
  231. package/dist/root-context.js +3 -7
  232. package/dist/root-create-input.d.ts +1 -2
  233. package/dist/root-directory-creation.d.ts +1 -2
  234. package/dist/root-directory-creation.js +1 -1
  235. package/dist/root-directory-list.d.ts +0 -1
  236. package/dist/root-directory-list.js +3 -7
  237. package/dist/root-directory.d.ts +0 -1
  238. package/dist/root-entries.d.ts +0 -1
  239. package/dist/root-entries.js +2 -2
  240. package/dist/root-errors.d.ts +4 -1
  241. package/dist/root-errors.js +5 -3
  242. package/dist/root-file-final-admission.d.ts +0 -1
  243. package/dist/root-file.d.ts +0 -1
  244. package/dist/root-impl.d.ts +2 -15
  245. package/dist/root-impl.js +136 -112
  246. package/dist/root-move-noreplace.d.ts +0 -1
  247. package/dist/root-move-noreplace.js +4 -10
  248. package/dist/root-move-preflight.d.ts +0 -1
  249. package/dist/root-observed-path.d.ts +0 -1
  250. package/dist/root-observed-path.js +2 -4
  251. package/dist/root-options.d.ts +1 -2
  252. package/dist/root-path-errors.d.ts +0 -1
  253. package/dist/root-path-existing.d.ts +3 -1
  254. package/dist/root-path-existing.js +38 -18
  255. package/dist/root-path-observation.d.ts +0 -1
  256. package/dist/root-path-stat.d.ts +0 -1
  257. package/dist/root-path-stat.js +2 -4
  258. package/dist/root-path.d.ts +0 -1
  259. package/dist/root-path.js +60 -188
  260. package/dist/root-paths-lexical.d.ts +0 -1
  261. package/dist/root-paths.d.ts +0 -1
  262. package/dist/root-public-types.d.ts +11 -0
  263. package/dist/root-read-admission.d.ts +0 -1
  264. package/dist/root-read-admission.js +31 -44
  265. package/dist/root-remove-identity.d.ts +0 -1
  266. package/dist/root-remove-identity.js +2 -4
  267. package/dist/root-remove-receipt.d.ts +0 -1
  268. package/dist/root-remove.d.ts +0 -1
  269. package/dist/root-remove.js +2 -4
  270. package/dist/root-symlink-policy.d.ts +0 -1
  271. package/dist/root-walk.d.ts +0 -1
  272. package/dist/root-write-admission.d.ts +1 -2
  273. package/dist/root-write-admission.js +3 -7
  274. package/dist/root-write-compatibility.d.ts +0 -1
  275. package/dist/root-write-complete-parent.d.ts +0 -1
  276. package/dist/root-write-complete-parent.js +2 -3
  277. package/dist/root-write-lock-binding.d.ts +0 -1
  278. package/dist/root-write-mode.d.ts +0 -1
  279. package/dist/root-write-publication.d.ts +0 -1
  280. package/dist/root-write-verification.d.ts +1 -2
  281. package/dist/root.d.ts +2 -7
  282. package/dist/safe-path-segment.d.ts +1 -2
  283. package/dist/safe-path-segment.js +2 -5
  284. package/dist/secret-file.d.ts +0 -1
  285. package/dist/secret-file.js +7 -18
  286. package/dist/secret-read-async.d.ts +0 -1
  287. package/dist/secret-read-async.js +5 -5
  288. package/dist/secret-read-policy.d.ts +0 -1
  289. package/dist/secret.d.ts +0 -1
  290. package/dist/secure-file-windows.d.ts +0 -6
  291. package/dist/secure-file-windows.js +13 -28
  292. package/dist/secure-file.d.ts +0 -1
  293. package/dist/secure-file.js +9 -9
  294. package/dist/secure-temp-dir.d.ts +0 -1
  295. package/dist/secure-temp-repair.d.ts +0 -1
  296. package/dist/secure-temp-repair.js +5 -1
  297. package/dist/sibling-staged-file.d.ts +0 -1
  298. package/dist/sibling-staged-file.js +32 -39
  299. package/dist/sibling-temp.d.ts +0 -1
  300. package/dist/sidecar-lock-acquire.d.ts +1 -2
  301. package/dist/sidecar-lock-acquire.js +37 -61
  302. package/dist/sidecar-lock-admission-context.d.ts +0 -1
  303. package/dist/sidecar-lock-admission-parser.d.ts +0 -1
  304. package/dist/sidecar-lock-admission.d.ts +1 -5
  305. package/dist/sidecar-lock-admission.js +1 -7
  306. package/dist/sidecar-lock-handle.d.ts +0 -1
  307. package/dist/sidecar-lock-policy.d.ts +4 -1
  308. package/dist/sidecar-lock-policy.js +23 -0
  309. package/dist/sidecar-lock-reclaim.d.ts +0 -1
  310. package/dist/sidecar-lock-registration.d.ts +13 -0
  311. package/dist/sidecar-lock-registration.js +47 -0
  312. package/dist/sidecar-lock-root.d.ts +0 -1
  313. package/dist/sidecar-lock-stale-admission.d.ts +0 -1
  314. package/dist/sidecar-lock-stale-admission.js +2 -6
  315. package/dist/sidecar-lock-target.d.ts +0 -1
  316. package/dist/sidecar-lock-types.d.ts +22 -17
  317. package/dist/sidecar-lock.d.ts +0 -1
  318. package/dist/sidecar-lock.js +16 -83
  319. package/dist/staged-directory.d.ts +0 -1
  320. package/dist/staged-file-settlement.d.ts +0 -1
  321. package/dist/staged-file-types.d.ts +0 -1
  322. package/dist/stat-observation.d.ts +0 -1
  323. package/dist/store.d.ts +0 -1
  324. package/dist/strict-file-identity.d.ts +0 -1
  325. package/dist/string-coerce.d.ts +0 -1
  326. package/dist/suppressed-error.d.ts +0 -1
  327. package/dist/symlink-parents.d.ts +0 -1
  328. package/dist/temp-cleanup.d.ts +0 -1
  329. package/dist/temp-target.d.ts +0 -1
  330. package/dist/temp-target.js +7 -46
  331. package/dist/temp-workspace-admission.d.ts +0 -8
  332. package/dist/temp-workspace-admission.js +1 -7
  333. package/dist/temp-workspace-child-admission.d.ts +16 -6
  334. package/dist/temp-workspace-child-admission.js +71 -15
  335. package/dist/temp-workspace-descriptor.d.ts +1 -7
  336. package/dist/temp-workspace-descriptor.js +1 -4
  337. package/dist/temp-workspace-owner.d.ts +1 -1
  338. package/dist/temp-workspace-owner.js +45 -22
  339. package/dist/temp-workspace-types.d.ts +0 -1
  340. package/dist/temp.d.ts +0 -1
  341. package/dist/test-hooks.d.ts +0 -1
  342. package/dist/text-atomic.d.ts +0 -1
  343. package/dist/text-atomic.js +1 -1
  344. package/dist/timing.d.ts +0 -1
  345. package/dist/trash.d.ts +0 -1
  346. package/dist/types.d.ts +0 -1
  347. package/dist/unicode-path.d.ts +0 -1
  348. package/dist/walk.d.ts +0 -1
  349. package/dist/windows-command.d.ts +0 -1
  350. package/dist/windows-owner.d.ts +0 -1
  351. package/dist/windows-owner.js +5 -2
  352. package/dist/windows-path-alias.d.ts +1 -1
  353. package/dist/windows-path-alias.js +12 -43
  354. package/dist/windows-path-syntax.d.ts +5 -0
  355. package/dist/windows-path-syntax.js +21 -0
  356. package/dist/windows-security-command.d.ts +0 -1
  357. package/dist/windows-security-facts.d.ts +0 -1
  358. package/dist/write-file-handle.d.ts +0 -1
  359. package/dist/write-open-flags.d.ts +0 -1
  360. package/dist/write-queue.d.ts +0 -1
  361. package/docs/advanced.md +3 -1
  362. package/docs/atomic.md +14 -0
  363. package/docs/copy.md +2 -0
  364. package/docs/mutation-policy-proof.md +6 -4
  365. package/docs/permissions.md +6 -0
  366. package/docs/root.md +10 -0
  367. package/docs/secret-file.md +8 -0
  368. package/docs/sidecar-lock.md +4 -0
  369. package/docs/store.md +6 -0
  370. package/docs/temp.md +8 -1
  371. package/docs/writing.md +14 -3
  372. package/package.json +8 -9
  373. package/dist/absolute-path.d.ts.map +0 -1
  374. package/dist/advanced.d.ts.map +0 -1
  375. package/dist/archive-crc32.d.ts.map +0 -1
  376. package/dist/archive-deadline.d.ts.map +0 -1
  377. package/dist/archive-durability.d.ts.map +0 -1
  378. package/dist/archive-entry.d.ts.map +0 -1
  379. package/dist/archive-errors.d.ts.map +0 -1
  380. package/dist/archive-gzip-tail.d.ts.map +0 -1
  381. package/dist/archive-input.d.ts.map +0 -1
  382. package/dist/archive-kind.d.ts.map +0 -1
  383. package/dist/archive-limits.d.ts.map +0 -1
  384. package/dist/archive-merge.d.ts.map +0 -1
  385. package/dist/archive-native.d.ts +0 -22
  386. package/dist/archive-native.d.ts.map +0 -1
  387. package/dist/archive-native.js +0 -98
  388. package/dist/archive-options.d.ts +0 -25
  389. package/dist/archive-options.d.ts.map +0 -1
  390. package/dist/archive-parser-errors.d.ts.map +0 -1
  391. package/dist/archive-plan.d.ts.map +0 -1
  392. package/dist/archive-policy.d.ts +0 -22
  393. package/dist/archive-policy.d.ts.map +0 -1
  394. package/dist/archive-policy.js +0 -38
  395. package/dist/archive-read.d.ts.map +0 -1
  396. package/dist/archive-staging.d.ts.map +0 -1
  397. package/dist/archive-tar-inspect.d.ts +0 -7
  398. package/dist/archive-tar-inspect.d.ts.map +0 -1
  399. package/dist/archive-tar-inspect.js +0 -62
  400. package/dist/archive-tar-stream.d.ts.map +0 -1
  401. package/dist/archive-tar-wasm.d.ts.map +0 -1
  402. package/dist/archive-tar.d.ts +0 -19
  403. package/dist/archive-tar.d.ts.map +0 -1
  404. package/dist/archive-tar.js +0 -21
  405. package/dist/archive-zip-admission.d.ts.map +0 -1
  406. package/dist/archive-zip-count.d.ts.map +0 -1
  407. package/dist/archive-zip-directory.d.ts.map +0 -1
  408. package/dist/archive-zip-entry.d.ts.map +0 -1
  409. package/dist/archive-zip-integrity.d.ts.map +0 -1
  410. package/dist/archive-zip-loader.d.ts.map +0 -1
  411. package/dist/archive-zip-manifest.d.ts.map +0 -1
  412. package/dist/archive-zip-names.d.ts.map +0 -1
  413. package/dist/archive-zip-preflight.d.ts.map +0 -1
  414. package/dist/archive.d.ts.map +0 -1
  415. package/dist/async-lock.d.ts.map +0 -1
  416. package/dist/atomic.d.ts.map +0 -1
  417. package/dist/bounded-read-stream.d.ts.map +0 -1
  418. package/dist/bounded-read.d.ts.map +0 -1
  419. package/dist/byte-budget.d.ts.map +0 -1
  420. package/dist/byte-view.d.ts.map +0 -1
  421. package/dist/clone-metadata.d.ts.map +0 -1
  422. package/dist/config.d.ts.map +0 -1
  423. package/dist/containment.d.ts.map +0 -1
  424. package/dist/copy-file-input.d.ts.map +0 -1
  425. package/dist/copy-policy.d.ts.map +0 -1
  426. package/dist/copy-publication.d.ts.map +0 -1
  427. package/dist/copy-tree-portable.d.ts.map +0 -1
  428. package/dist/copy.d.ts.map +0 -1
  429. package/dist/create-directory.d.ts +0 -20
  430. package/dist/create-directory.d.ts.map +0 -1
  431. package/dist/create-directory.js +0 -130
  432. package/dist/create-file-async.d.ts +0 -7
  433. package/dist/create-file-async.d.ts.map +0 -1
  434. package/dist/create-file-async.js +0 -121
  435. package/dist/create-file.d.ts +0 -8
  436. package/dist/create-file.d.ts.map +0 -1
  437. package/dist/create-file.js +0 -190
  438. package/dist/create-owned-file.d.ts.map +0 -1
  439. package/dist/create.d.ts.map +0 -1
  440. package/dist/creation-darwin.d.ts +0 -6
  441. package/dist/creation-darwin.d.ts.map +0 -1
  442. package/dist/creation-darwin.js +0 -70
  443. package/dist/creation-file-state.d.ts +0 -19
  444. package/dist/creation-file-state.d.ts.map +0 -1
  445. package/dist/creation-file-state.js +0 -118
  446. package/dist/creation-path.d.ts +0 -21
  447. package/dist/creation-path.d.ts.map +0 -1
  448. package/dist/creation-path.js +0 -71
  449. package/dist/creation-permissions.d.ts +0 -19
  450. package/dist/creation-permissions.d.ts.map +0 -1
  451. package/dist/creation-permissions.js +0 -125
  452. package/dist/deny-mutations.d.ts.map +0 -1
  453. package/dist/device-path.d.ts.map +0 -1
  454. package/dist/directory-durability.d.ts.map +0 -1
  455. package/dist/directory-entry-path.d.ts.map +0 -1
  456. package/dist/directory-guard.d.ts.map +0 -1
  457. package/dist/directory-mode-node.d.ts.map +0 -1
  458. package/dist/directory-mode-owner.d.ts.map +0 -1
  459. package/dist/directory-receipt.d.ts.map +0 -1
  460. package/dist/durability.d.ts.map +0 -1
  461. package/dist/effective-uid.d.ts.map +0 -1
  462. package/dist/error-detail.d.ts.map +0 -1
  463. package/dist/errors.d.ts.map +0 -1
  464. package/dist/file-cleanup.d.ts.map +0 -1
  465. package/dist/file-contents.d.ts.map +0 -1
  466. package/dist/file-handle-transfer.d.ts.map +0 -1
  467. package/dist/file-hash.d.ts.map +0 -1
  468. package/dist/file-identity.d.ts.map +0 -1
  469. package/dist/file-lock-sync-admission.d.ts.map +0 -1
  470. package/dist/file-lock-sync-root-acquire.d.ts.map +0 -1
  471. package/dist/file-lock-sync-root-arbitration.d.ts.map +0 -1
  472. package/dist/file-lock-sync-root-held.d.ts.map +0 -1
  473. package/dist/file-lock-sync-root-io.d.ts.map +0 -1
  474. package/dist/file-lock-sync-root-mutation.d.ts.map +0 -1
  475. package/dist/file-lock-sync-root-options.d.ts.map +0 -1
  476. package/dist/file-lock-sync-root-registration.d.ts.map +0 -1
  477. package/dist/file-lock-sync-root.d.ts.map +0 -1
  478. package/dist/file-lock-sync-stale-admission.d.ts.map +0 -1
  479. package/dist/file-lock-sync.d.ts.map +0 -1
  480. package/dist/file-lock.d.ts.map +0 -1
  481. package/dist/file-observation.d.ts.map +0 -1
  482. package/dist/file-store-boundary.d.ts.map +0 -1
  483. package/dist/file-store-copy-source.d.ts +0 -5
  484. package/dist/file-store-copy-source.d.ts.map +0 -1
  485. package/dist/file-store-copy-source.js +0 -31
  486. package/dist/file-store-limit.d.ts +0 -2
  487. package/dist/file-store-limit.d.ts.map +0 -1
  488. package/dist/file-store-limit.js +0 -8
  489. package/dist/file-store-path.d.ts +0 -3
  490. package/dist/file-store-path.d.ts.map +0 -1
  491. package/dist/file-store-path.js +0 -30
  492. package/dist/file-store-prune.d.ts.map +0 -1
  493. package/dist/file-store-sync-directory.d.ts.map +0 -1
  494. package/dist/file-store-sync-write.d.ts.map +0 -1
  495. package/dist/file-store.d.ts.map +0 -1
  496. package/dist/file-sync.d.ts.map +0 -1
  497. package/dist/filename.d.ts.map +0 -1
  498. package/dist/fs.d.ts.map +0 -1
  499. package/dist/guarded-mkdir.d.ts.map +0 -1
  500. package/dist/guarded-mutation.d.ts.map +0 -1
  501. package/dist/guest-dispatch-python.d.ts.map +0 -1
  502. package/dist/guest-native-python.d.ts.map +0 -1
  503. package/dist/guest.d.ts.map +0 -1
  504. package/dist/home-dir.d.ts.map +0 -1
  505. package/dist/index.d.ts.map +0 -1
  506. package/dist/install-path.d.ts.map +0 -1
  507. package/dist/json-document-store.d.ts.map +0 -1
  508. package/dist/json-durable-queue-directory.d.ts.map +0 -1
  509. package/dist/json-durable-queue-ownership.d.ts.map +0 -1
  510. package/dist/json-durable-queue-paths.d.ts +0 -11
  511. package/dist/json-durable-queue-paths.d.ts.map +0 -1
  512. package/dist/json-durable-queue-paths.js +0 -20
  513. package/dist/json-durable-queue-read.d.ts.map +0 -1
  514. package/dist/json-durable-queue.d.ts.map +0 -1
  515. package/dist/json-store.d.ts.map +0 -1
  516. package/dist/json-stringify.d.ts.map +0 -1
  517. package/dist/json.d.ts.map +0 -1
  518. package/dist/local-file-access.d.ts.map +0 -1
  519. package/dist/local-file-descriptor.d.ts.map +0 -1
  520. package/dist/local-roots.d.ts.map +0 -1
  521. package/dist/lock-config.d.ts.map +0 -1
  522. package/dist/move-path-cleanup.d.ts.map +0 -1
  523. package/dist/move-path-stage.d.ts.map +0 -1
  524. package/dist/move-path.d.ts.map +0 -1
  525. package/dist/mutation-authority.d.ts.map +0 -1
  526. package/dist/native-binding.d.ts.map +0 -1
  527. package/dist/native-config.d.ts.map +0 -1
  528. package/dist/native-directory-observation.d.ts.map +0 -1
  529. package/dist/native-fallback-warning.d.ts.map +0 -1
  530. package/dist/native-operations.d.ts.map +0 -1
  531. package/dist/native-parent-admission.d.ts.map +0 -1
  532. package/dist/native-pinned-write-windows.d.ts.map +0 -1
  533. package/dist/native-pinned-write.d.ts.map +0 -1
  534. package/dist/native-policy-directory-observation.d.ts.map +0 -1
  535. package/dist/native-policy-parent-windows.d.ts.map +0 -1
  536. package/dist/native-rename-outcome.d.ts.map +0 -1
  537. package/dist/native-staged-file.d.ts.map +0 -1
  538. package/dist/native.d.ts.map +0 -1
  539. package/dist/opened-file-failure.d.ts.map +0 -1
  540. package/dist/opened-realpath.d.ts.map +0 -1
  541. package/dist/output.d.ts.map +0 -1
  542. package/dist/overwrite-file-handle.d.ts.map +0 -1
  543. package/dist/owner-dacl.d.ts.map +0 -1
  544. package/dist/path-case.d.ts.map +0 -1
  545. package/dist/path-policy.d.ts.map +0 -1
  546. package/dist/path-prefix.d.ts.map +0 -1
  547. package/dist/path-scope-lexical.d.ts.map +0 -1
  548. package/dist/path-segment-route.d.ts.map +0 -1
  549. package/dist/path-suffix-aliases.d.ts.map +0 -1
  550. package/dist/path.d.ts.map +0 -1
  551. package/dist/permission-exec.d.ts.map +0 -1
  552. package/dist/permissions-public.d.ts.map +0 -1
  553. package/dist/permissions-windows.d.ts.map +0 -1
  554. package/dist/permissions.d.ts.map +0 -1
  555. package/dist/pinned-mutation-admission.d.ts.map +0 -1
  556. package/dist/pinned-mutation-observation.d.ts.map +0 -1
  557. package/dist/pinned-mutation-shared-route.d.ts.map +0 -1
  558. package/dist/pinned-open.d.ts.map +0 -1
  559. package/dist/pinned-operation.d.ts.map +0 -1
  560. package/dist/pinned-write-input.d.ts.map +0 -1
  561. package/dist/pinned-write-mode.d.ts.map +0 -1
  562. package/dist/pinned-write-staged.d.ts.map +0 -1
  563. package/dist/pinned-write-types.d.ts.map +0 -1
  564. package/dist/pinned-write.d.ts.map +0 -1
  565. package/dist/positional-read.d.ts.map +0 -1
  566. package/dist/private-directory.d.ts.map +0 -1
  567. package/dist/private-producer-handoff-sync.d.ts.map +0 -1
  568. package/dist/private-producer-handoff.d.ts.map +0 -1
  569. package/dist/private-temp-workspace.d.ts.map +0 -1
  570. package/dist/publish-copy-stage.d.ts.map +0 -1
  571. package/dist/publish-file-failure.d.ts.map +0 -1
  572. package/dist/publish-file.d.ts.map +0 -1
  573. package/dist/read-open-flags.d.ts.map +0 -1
  574. package/dist/read-opened-file.d.ts.map +0 -1
  575. package/dist/realpath.d.ts.map +0 -1
  576. package/dist/recursive-mkdir-path.d.ts.map +0 -1
  577. package/dist/regular-file.d.ts.map +0 -1
  578. package/dist/replace-directory.d.ts.map +0 -1
  579. package/dist/replace-file-copy-fallback.d.ts.map +0 -1
  580. package/dist/replace-file-copy-source.d.ts.map +0 -1
  581. package/dist/replace-file-descriptor.d.ts.map +0 -1
  582. package/dist/replace-file-mode.d.ts.map +0 -1
  583. package/dist/replace-file-rename-policy.d.ts.map +0 -1
  584. package/dist/replace-file-temp-owner.d.ts.map +0 -1
  585. package/dist/replace-file.d.ts.map +0 -1
  586. package/dist/retained-directory-replacement.d.ts.map +0 -1
  587. package/dist/root-boundary.d.ts.map +0 -1
  588. package/dist/root-context.d.ts.map +0 -1
  589. package/dist/root-create-input.d.ts.map +0 -1
  590. package/dist/root-directory-creation.d.ts.map +0 -1
  591. package/dist/root-directory-list.d.ts.map +0 -1
  592. package/dist/root-directory.d.ts.map +0 -1
  593. package/dist/root-entries.d.ts.map +0 -1
  594. package/dist/root-errors.d.ts.map +0 -1
  595. package/dist/root-file-final-admission.d.ts.map +0 -1
  596. package/dist/root-file.d.ts.map +0 -1
  597. package/dist/root-impl.d.ts.map +0 -1
  598. package/dist/root-move-noreplace.d.ts.map +0 -1
  599. package/dist/root-move-preflight.d.ts.map +0 -1
  600. package/dist/root-observed-path.d.ts.map +0 -1
  601. package/dist/root-options.d.ts.map +0 -1
  602. package/dist/root-path-errors.d.ts.map +0 -1
  603. package/dist/root-path-existing.d.ts.map +0 -1
  604. package/dist/root-path-observation.d.ts.map +0 -1
  605. package/dist/root-path-stat.d.ts.map +0 -1
  606. package/dist/root-path-symlink.d.ts +0 -7
  607. package/dist/root-path-symlink.d.ts.map +0 -1
  608. package/dist/root-path-symlink.js +0 -55
  609. package/dist/root-path.d.ts.map +0 -1
  610. package/dist/root-paths-lexical.d.ts.map +0 -1
  611. package/dist/root-paths.d.ts.map +0 -1
  612. package/dist/root-read-admission.d.ts.map +0 -1
  613. package/dist/root-remove-identity.d.ts.map +0 -1
  614. package/dist/root-remove-receipt.d.ts.map +0 -1
  615. package/dist/root-remove.d.ts.map +0 -1
  616. package/dist/root-symlink-policy.d.ts.map +0 -1
  617. package/dist/root-walk.d.ts.map +0 -1
  618. package/dist/root-write-admission.d.ts.map +0 -1
  619. package/dist/root-write-compatibility.d.ts.map +0 -1
  620. package/dist/root-write-complete-parent.d.ts.map +0 -1
  621. package/dist/root-write-lock-binding.d.ts.map +0 -1
  622. package/dist/root-write-mode.d.ts.map +0 -1
  623. package/dist/root-write-publication.d.ts.map +0 -1
  624. package/dist/root-write-verification.d.ts.map +0 -1
  625. package/dist/root.d.ts.map +0 -1
  626. package/dist/safe-path-segment.d.ts.map +0 -1
  627. package/dist/secret-file.d.ts.map +0 -1
  628. package/dist/secret-read-async.d.ts.map +0 -1
  629. package/dist/secret-read-policy.d.ts.map +0 -1
  630. package/dist/secret.d.ts.map +0 -1
  631. package/dist/secure-file-windows.d.ts.map +0 -1
  632. package/dist/secure-file.d.ts.map +0 -1
  633. package/dist/secure-temp-dir.d.ts.map +0 -1
  634. package/dist/secure-temp-repair.d.ts.map +0 -1
  635. package/dist/sibling-staged-file.d.ts.map +0 -1
  636. package/dist/sibling-temp.d.ts.map +0 -1
  637. package/dist/sidecar-lock-acquire.d.ts.map +0 -1
  638. package/dist/sidecar-lock-admission-context.d.ts.map +0 -1
  639. package/dist/sidecar-lock-admission-parser.d.ts.map +0 -1
  640. package/dist/sidecar-lock-admission.d.ts.map +0 -1
  641. package/dist/sidecar-lock-handle.d.ts.map +0 -1
  642. package/dist/sidecar-lock-policy.d.ts.map +0 -1
  643. package/dist/sidecar-lock-reclaim.d.ts.map +0 -1
  644. package/dist/sidecar-lock-root.d.ts.map +0 -1
  645. package/dist/sidecar-lock-stale-admission.d.ts.map +0 -1
  646. package/dist/sidecar-lock-target.d.ts.map +0 -1
  647. package/dist/sidecar-lock-types.d.ts.map +0 -1
  648. package/dist/sidecar-lock.d.ts.map +0 -1
  649. package/dist/staged-directory.d.ts.map +0 -1
  650. package/dist/staged-file-settlement.d.ts.map +0 -1
  651. package/dist/staged-file-types.d.ts.map +0 -1
  652. package/dist/standalone-publication-path.d.ts +0 -2
  653. package/dist/standalone-publication-path.d.ts.map +0 -1
  654. package/dist/standalone-publication-path.js +0 -6
  655. package/dist/stat-observation.d.ts.map +0 -1
  656. package/dist/store.d.ts.map +0 -1
  657. package/dist/strict-file-identity.d.ts.map +0 -1
  658. package/dist/string-coerce.d.ts.map +0 -1
  659. package/dist/suppressed-error.d.ts.map +0 -1
  660. package/dist/symlink-parents.d.ts.map +0 -1
  661. package/dist/temp-cleanup.d.ts.map +0 -1
  662. package/dist/temp-target.d.ts.map +0 -1
  663. package/dist/temp-workspace-admission.d.ts.map +0 -1
  664. package/dist/temp-workspace-child-admission.d.ts.map +0 -1
  665. package/dist/temp-workspace-descriptor.d.ts.map +0 -1
  666. package/dist/temp-workspace-identity.d.ts +0 -15
  667. package/dist/temp-workspace-identity.d.ts.map +0 -1
  668. package/dist/temp-workspace-identity.js +0 -41
  669. package/dist/temp-workspace-owner.d.ts.map +0 -1
  670. package/dist/temp-workspace-permissions.d.ts +0 -4
  671. package/dist/temp-workspace-permissions.d.ts.map +0 -1
  672. package/dist/temp-workspace-permissions.js +0 -32
  673. package/dist/temp-workspace-types.d.ts.map +0 -1
  674. package/dist/temp.d.ts.map +0 -1
  675. package/dist/test-hooks.d.ts.map +0 -1
  676. package/dist/text-atomic.d.ts.map +0 -1
  677. package/dist/timing.d.ts.map +0 -1
  678. package/dist/trash.d.ts.map +0 -1
  679. package/dist/types.d.ts.map +0 -1
  680. package/dist/unicode-path.d.ts.map +0 -1
  681. package/dist/walk.d.ts.map +0 -1
  682. package/dist/windows-command.d.ts.map +0 -1
  683. package/dist/windows-owner.d.ts.map +0 -1
  684. package/dist/windows-path-alias.d.ts.map +0 -1
  685. package/dist/windows-security-command.d.ts.map +0 -1
  686. package/dist/windows-security-facts.d.ts.map +0 -1
  687. package/dist/write-file-handle.d.ts.map +0 -1
  688. package/dist/write-open-flags.d.ts.map +0 -1
  689. package/dist/write-queue.d.ts.map +0 -1
  690. /package/dist/{archive-options.js → root-public-types.js} +0 -0
@@ -1,5 +1,6 @@
1
1
  import fs from "node:fs";
2
- import { sidecarLockPayloadCreatedAtMs } from "./sidecar-lock-policy.js";
2
+ import { sidecarLockPayloadCreatedAtMs, sidecarLockTimeout } from "./sidecar-lock-policy.js";
3
+ import { ensureSidecarLockCleanupRegistered } from "./sidecar-lock-registration.js";
3
4
  const SYNC_HELD_LOCKS_KEY = Symbol.for("fsSafe.syncSidecarLocks");
4
5
  const SYNC_ADMISSIONS_KEY = Symbol.for("fsSafe.syncSidecarLockAdmissions");
5
6
  const SYNC_CLEANUP_REGISTERED_KEY = Symbol.for("fsSafe.syncSidecarLockCleanupRegistered");
@@ -25,13 +26,6 @@ export function getSyncLockAdmissions() {
25
26
  }
26
27
  return globalWithState[SYNC_ADMISSIONS_KEY];
27
28
  }
28
- export function syncLockTimeout(lockPath, normalizedTargetPath) {
29
- return Object.assign(new Error(`file lock timeout for ${normalizedTargetPath}`), {
30
- code: "file_lock_timeout",
31
- lockPath,
32
- normalizedTargetPath,
33
- });
34
- }
35
29
  export function defaultSyncShouldReclaim(snapshot, staleMs, nowMs) {
36
30
  const createdAtMs = sidecarLockPayloadCreatedAtMs(snapshot.payload);
37
31
  if (createdAtMs !== null)
@@ -50,44 +44,11 @@ export function syncReclaimGuardExists(reclaimGuardPath) {
50
44
  }
51
45
  }
52
46
  export function ensureSyncLockExitCleanupRegistered(cleanup, lockPath, normalizedTargetPath) {
53
- const globalWithCleanup = globalThis;
54
- if (globalWithCleanup[SYNC_CLEANUP_REGISTERED_KEY])
55
- return;
56
- if (globalWithCleanup[SYNC_CLEANUP_REGISTRATION_KEY]) {
57
- // process.on() emits newListener synchronously. A nested synchronous
58
- // acquisition cannot wait for this stack to finish registering.
59
- throw syncLockTimeout(lockPath, normalizedTargetPath);
60
- }
61
- const registration = {};
62
- globalWithCleanup[SYNC_CLEANUP_REGISTRATION_KEY] = registration;
63
- try {
64
- process.on("exit", cleanup);
65
- globalWithCleanup[SYNC_CLEANUP_HANDLER_KEY] = cleanup;
66
- globalWithCleanup[SYNC_CLEANUP_REGISTERED_KEY] = true;
67
- }
68
- catch (error) {
69
- if (process.listeners("exit").includes(cleanup)) {
70
- try {
71
- process.off("exit", cleanup);
72
- }
73
- catch {
74
- // Reconcile the marker with the actual listener below.
75
- }
76
- }
77
- if (process.listeners("exit").includes(cleanup)) {
78
- globalWithCleanup[SYNC_CLEANUP_HANDLER_KEY] = cleanup;
79
- globalWithCleanup[SYNC_CLEANUP_REGISTERED_KEY] = true;
80
- }
81
- else {
82
- if (globalWithCleanup[SYNC_CLEANUP_HANDLER_KEY] === cleanup) {
83
- delete globalWithCleanup[SYNC_CLEANUP_HANDLER_KEY];
84
- }
85
- }
86
- throw error;
87
- }
88
- finally {
89
- if (globalWithCleanup[SYNC_CLEANUP_REGISTRATION_KEY] === registration) {
90
- delete globalWithCleanup[SYNC_CLEANUP_REGISTRATION_KEY];
91
- }
92
- }
47
+ ensureSidecarLockCleanupRegistered({
48
+ event: "exit",
49
+ registered: SYNC_CLEANUP_REGISTERED_KEY,
50
+ registering: SYNC_CLEANUP_REGISTRATION_KEY,
51
+ handler: SYNC_CLEANUP_HANDLER_KEY,
52
+ reentryError: () => sidecarLockTimeout(lockPath, normalizedTargetPath),
53
+ }, cleanup, true);
93
54
  }
@@ -1,4 +1,3 @@
1
1
  import type { FileLockSyncAcquireOptions, FileLockSyncHandle } from "./file-lock-sync.js";
2
2
  import type { Root } from "./root-impl.js";
3
3
  export declare function acquireFileLockSyncWithRoot<TPayload extends Record<string, unknown>>(targetPath: string, inputOptions: FileLockSyncAcquireOptions<TPayload>, lockRoot: Root): FileLockSyncHandle;
4
- //# sourceMappingURL=file-lock-sync-root-acquire.d.ts.map
@@ -2,11 +2,11 @@ import fs from "node:fs";
2
2
  import path from "node:path";
3
3
  import { FsSafeError } from "./errors.js";
4
4
  import { captureRootSyncAcquireOptions } from "./file-lock-sync-root-options.js";
5
- import { defaultSyncShouldReclaim, foreignSyncHeldLock, getSyncLockAdmissions, syncLockTimeout } from "./file-lock-sync-admission.js";
6
- import { computeSidecarLockDelayMs, isTransientLockFileDenial, maxTransientLockDenials, } from "./sidecar-lock-policy.js";
5
+ import { defaultSyncShouldReclaim, foreignSyncHeldLock } from "./file-lock-sync-admission.js";
6
+ import { isTransientLockFileDenial, sidecarLockStale } from "./sidecar-lock-policy.js";
7
7
  import { serializeSidecarLockPayload, } from "./sidecar-lock-reclaim.js";
8
8
  import { createSuppressedError } from "./suppressed-error.js";
9
- import { sleepSync } from "./timing.js";
9
+ import { SyncLockAcquisition } from "./file-lock-sync-acquisition.js";
10
10
  import { assertSynchronousCallbackResult } from "./mutation-authority.js";
11
11
  import { assertNoWindowsPathAlias } from "./windows-path-alias.js";
12
12
  import { admitFileLockSyncRootPath, assertFileLockSyncRootPathsCurrent, captureFileLockSyncRootAuthority, normalizeFileLockSyncTargetWithRoot, } from "./file-lock-sync-root.js";
@@ -37,20 +37,6 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
37
37
  const heldLocks = getRootSyncHeldLocks();
38
38
  const currentTargetHolder = () => heldLocks.get(normalizedTargetPath) ??
39
39
  foreignSyncHeldLock("root", normalizedTargetPath);
40
- const admissions = getSyncLockAdmissions();
41
- const admissionToken = {};
42
- let ownsAdmission = false;
43
- const assertAdmission = () => {
44
- if (admissions.get(normalizedTargetPath) !== admissionToken) {
45
- throw syncLockTimeout(lockPath, normalizedTargetPath);
46
- }
47
- };
48
- const releaseAdmission = () => {
49
- if (ownsAdmission && admissions.get(normalizedTargetPath) === admissionToken) {
50
- admissions.delete(normalizedTargetPath);
51
- }
52
- ownsAdmission = false;
53
- };
54
40
  const arbitration = Object.freeze({
55
41
  authority,
56
42
  heldLocks,
@@ -59,44 +45,15 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
59
45
  reentrantOwner: options.reentrantOwner,
60
46
  });
61
47
  if (heldLocks.has(normalizedTargetPath) && !foreignSyncHeldLock("root", normalizedTargetPath)) {
62
- assertFileLockSyncRootPathsCurrent(guardedPaths, true, true);
48
+ assertFileLockSyncRootPathsCurrent(guardedPaths);
63
49
  const initiallyReusable = tryReuseCurrentRootSyncHeldLock(arbitration);
64
50
  if (initiallyReusable)
65
51
  return initiallyReusable;
66
52
  }
67
- const startedAt = Date.now();
68
- let attempt = 0;
69
- let transientDenials = 0;
53
+ const acquisition = new SyncLockAcquisition(lockPath, normalizedTargetPath, options.retry, options.timeoutMs);
70
54
  let ownedReclaimGuard;
71
55
  let reclaimCleanupAttempted = false;
72
56
  const reuseCurrentHeld = () => ownedReclaimGuard ? undefined : tryReuseCurrentRootSyncHeldLock(arbitration);
73
- const waitForRetry = () => {
74
- releaseAdmission();
75
- const elapsed = Date.now() - startedAt;
76
- const timedOut = options.timeoutMs !== undefined && elapsed >= options.timeoutMs;
77
- if (timedOut || (options.retry.retries !== undefined && attempt >= options.retry.retries)) {
78
- throw syncLockTimeout(lockPath, normalizedTargetPath);
79
- }
80
- const remaining = options.timeoutMs === undefined || options.timeoutMs === Number.POSITIVE_INFINITY
81
- ? Number.POSITIVE_INFINITY
82
- : Math.max(0, options.timeoutMs - elapsed);
83
- sleepSync(Math.min(computeSidecarLockDelayMs(options.retry, attempt), remaining));
84
- attempt += 1;
85
- };
86
- const retryLockFileDenial = (error) => {
87
- if (!isTransientLockFileDenial(error, lockPath) ||
88
- ++transientDenials > maxTransientLockDenials)
89
- return false;
90
- try {
91
- waitForRetry();
92
- }
93
- catch (waitError) {
94
- if (waitError.code === "file_lock_timeout")
95
- throw error;
96
- throw waitError;
97
- }
98
- return true;
99
- };
100
57
  const releaseReclaimGuard = () => {
101
58
  const receipt = ownedReclaimGuard;
102
59
  if (!receipt)
@@ -116,19 +73,14 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
116
73
  };
117
74
  try {
118
75
  while (true) {
119
- if (!ownsAdmission) {
120
- if (admissions.has(normalizedTargetPath))
121
- throw syncLockTimeout(lockPath, normalizedTargetPath);
122
- admissions.set(normalizedTargetPath, admissionToken);
123
- ownsAdmission = true;
124
- }
125
- assertAdmission();
126
- assertFileLockSyncRootPathsCurrent(guardedPaths, true, true);
127
- assertAdmission();
76
+ acquisition.reserve();
77
+ acquisition.assert();
78
+ assertFileLockSyncRootPathsCurrent(guardedPaths);
79
+ acquisition.assert();
128
80
  if (ownedReclaimGuard)
129
81
  assertOwnedReclaimGuardCurrent();
130
- if (!ownedReclaimGuard && fileLockSyncRootGuardExists(reclaimRootPath, true)) {
131
- waitForRetry();
82
+ if (!ownedReclaimGuard && fileLockSyncRootGuardExists(reclaimRootPath)) {
83
+ acquisition.waitForRetry();
132
84
  continue;
133
85
  }
134
86
  if (currentTargetHolder() !== undefined) {
@@ -137,16 +89,16 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
137
89
  return reused;
138
90
  }
139
91
  const payload = Reflect.apply(options.payload, options.optionsReceiver, []);
140
- assertAdmission();
92
+ acquisition.assert();
141
93
  const { raw, ownershipToken } = serializeSidecarLockPayload(payload);
142
- assertAdmission();
94
+ acquisition.assert();
143
95
  if (ownedReclaimGuard)
144
96
  assertOwnedReclaimGuardCurrent();
145
97
  if (currentTargetHolder() !== undefined) {
146
98
  const reused = reuseCurrentHeld();
147
99
  if (reused)
148
100
  return reused;
149
- waitForRetry();
101
+ acquisition.waitForRetry();
150
102
  continue;
151
103
  }
152
104
  let fd;
@@ -154,9 +106,9 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
154
106
  let unpublishedTimer;
155
107
  let lockFileCreateOpenFailure;
156
108
  try {
157
- const created = createFileLockSyncRootFile(lockRootPath, 0o600, {
109
+ const created = createFileLockSyncRootFile(lockRootPath, {
158
110
  assertBeforeOpen: () => {
159
- assertAdmission();
111
+ acquisition.assert();
160
112
  if (ownedReclaimGuard)
161
113
  assertOwnedReclaimGuardCurrent();
162
114
  if (currentTargetHolder() !== undefined)
@@ -193,29 +145,11 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
193
145
  snapshot,
194
146
  };
195
147
  const returnedHandle = createRootSyncHeldLockHandle(createdHeld);
196
- if (options.onCompromised && (options.compromiseCheckIntervalMs ?? 0) > 0) {
197
- const timer = setInterval(() => {
198
- let stillHeld;
199
- try {
200
- stillHeld = returnedHandle.verifyStillHeld();
201
- }
202
- catch {
203
- stillHeld = false;
204
- }
205
- if (!stillHeld && createdHeld.timer) {
206
- clearInterval(createdHeld.timer);
207
- createdHeld.timer = undefined;
208
- Reflect.apply(options.onCompromised, options.optionsReceiver, [{ lockPath, normalizedTargetPath }]);
209
- }
210
- }, options.compromiseCheckIntervalMs);
211
- unpublishedTimer = timer;
212
- createdHeld.timer = timer;
213
- timer.unref();
214
- }
148
+ acquisition.monitor(createdHeld, returnedHandle, options.onCompromised, options.compromiseCheckIntervalMs, options.optionsReceiver, (timer) => { unpublishedTimer = timer; });
215
149
  if (currentTargetHolder() !== undefined) {
216
150
  throw new FileLockSyncRootArbitrationCollision();
217
151
  }
218
- assertAdmission();
152
+ acquisition.assert();
219
153
  heldLocks.set(normalizedTargetPath, createdHeld);
220
154
  fd = undefined;
221
155
  unpublishedTimer = undefined;
@@ -240,12 +174,12 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
240
174
  const reused = reuseCurrentHeld();
241
175
  if (reused)
242
176
  return reused;
243
- waitForRetry();
177
+ acquisition.waitForRetry();
244
178
  continue;
245
179
  }
246
180
  const fromLockFileOpen = lockFileCreateOpenFailure !== undefined &&
247
181
  lockFileCreateOpenFailure.error === error;
248
- if (fromLockFileOpen && retryLockFileDenial(error))
182
+ if (fromLockFileOpen && acquisition.retryDenial(error))
249
183
  continue;
250
184
  if (!fromLockFileOpen || error.code !== "EEXIST")
251
185
  throw error;
@@ -254,14 +188,14 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
254
188
  const reused = reuseCurrentHeld();
255
189
  if (reused)
256
190
  return reused;
257
- waitForRetry();
191
+ acquisition.waitForRetry();
258
192
  continue;
259
193
  }
260
194
  if (currentTargetHolder() !== undefined) {
261
195
  const reused = reuseCurrentHeld();
262
196
  if (reused)
263
197
  return reused;
264
- waitForRetry();
198
+ acquisition.waitForRetry();
265
199
  continue;
266
200
  }
267
201
  let lockFileOpenDenied = false;
@@ -272,7 +206,7 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
272
206
  });
273
207
  }
274
208
  catch (readError) {
275
- if (lockFileOpenDenied && retryLockFileDenial(readError))
209
+ if (lockFileOpenDenied && acquisition.retryDenial(readError))
276
210
  continue;
277
211
  throw readError;
278
212
  }
@@ -280,12 +214,12 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
280
214
  const reused = reuseCurrentHeld();
281
215
  if (reused)
282
216
  return reused;
283
- waitForRetry();
217
+ acquisition.waitForRetry();
284
218
  continue;
285
219
  }
286
- assertAdmission();
220
+ acquisition.assert();
287
221
  if (!current) {
288
- waitForRetry();
222
+ acquisition.waitForRetry();
289
223
  continue;
290
224
  }
291
225
  const snapshot = current.snapshot;
@@ -301,7 +235,7 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
301
235
  heldByThisProcess: false,
302
236
  }]);
303
237
  assertSynchronousCallbackResult(reclaim, "shouldReclaim");
304
- assertAdmission();
238
+ acquisition.assert();
305
239
  if (!fileLockSyncRootSnapshotStillCurrent(lockRootPath, current)) {
306
240
  throw new FsSafeError("path-mismatch", "sidecar changed during reclaim policy callback");
307
241
  }
@@ -315,7 +249,7 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
315
249
  options.shouldRemoveStaleLock) {
316
250
  const guard = createFileLockSyncRootDirectory(reclaimRootPath);
317
251
  if (!guard) {
318
- waitForRetry();
252
+ acquisition.waitForRetry();
319
253
  continue;
320
254
  }
321
255
  ownedReclaimGuard = guard;
@@ -327,11 +261,11 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
327
261
  payload: snapshot.payload,
328
262
  }]);
329
263
  assertSynchronousCallbackResult(approved, "shouldRemoveStaleLock");
330
- assertAdmission();
264
+ acquisition.assert();
331
265
  assertOwnedReclaimGuardCurrent();
332
266
  if (approved) {
333
267
  const removed = removeFileLockSyncRootFile(lockRootPath, current.receipt, snapshot, () => {
334
- assertAdmission();
268
+ acquisition.assert();
335
269
  assertOwnedReclaimGuardCurrent();
336
270
  if (currentTargetHolder() !== undefined)
337
271
  throw new FileLockSyncRootArbitrationCollision();
@@ -346,13 +280,9 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
346
280
  }
347
281
  releaseReclaimGuard();
348
282
  }
349
- throw Object.assign(new Error(`file lock stale for ${normalizedTargetPath}`), {
350
- code: "file_lock_stale",
351
- lockPath,
352
- normalizedTargetPath,
353
- });
283
+ throw sidecarLockStale(lockPath, normalizedTargetPath);
354
284
  }
355
- waitForRetry();
285
+ acquisition.waitForRetry();
356
286
  }
357
287
  }
358
288
  }
@@ -368,6 +298,6 @@ export function acquireFileLockSyncWithRoot(targetPath, inputOptions, lockRoot)
368
298
  throw error;
369
299
  }
370
300
  finally {
371
- releaseAdmission();
301
+ acquisition.release();
372
302
  }
373
303
  }
@@ -15,4 +15,3 @@ export type FileLockSyncRootArbitration = Readonly<{
15
15
  }>;
16
16
  export declare function tryReuseCurrentRootSyncHeldLock(arbitration: FileLockSyncRootArbitration): FileLockSyncHandle | undefined;
17
17
  export declare function cleanupCreatedRootSyncLock(lockRootPath: FileLockSyncRootPath, fd: number, receipt: FileLockSyncRootFileReceipt, timer?: NodeJS.Timeout): void;
18
- //# sourceMappingURL=file-lock-sync-root-arbitration.d.ts.map
@@ -30,4 +30,3 @@ export declare function verifyRootSyncHeldLock(held: RootSyncHeldLock): boolean;
30
30
  export declare function createRootSyncHeldLockHandle(held: RootSyncHeldLock): FileLockSyncHandle;
31
31
  export declare function withSyncHeldLockHandle<T>(lock: FileLockSyncHandle, fn: () => T): T;
32
32
  export {};
33
- //# sourceMappingURL=file-lock-sync-root-held.d.ts.map
@@ -41,4 +41,3 @@ export declare function readFileLockSyncRootSnapshot(pathAuthority: FileLockSync
41
41
  export declare function fileLockSyncRootSnapshotStillCurrent(pathAuthority: FileLockSyncRootPath, observed: FileLockSyncRootSnapshot): boolean;
42
42
  export declare function fileReceiptCurrentAfterParentCheck(pathAuthority: FileLockSyncRootPath, receipt: FileLockSyncRootFileReceipt): boolean;
43
43
  export declare function fileLockSyncRootReceiptStillCurrent(pathAuthority: FileLockSyncRootPath, receipt: FileLockSyncRootFileReceipt): boolean;
44
- //# sourceMappingURL=file-lock-sync-root-io.d.ts.map
@@ -1,17 +1,16 @@
1
1
  import { type SidecarLockSnapshot } from "./sidecar-lock-reclaim.js";
2
2
  import { type FileLockSyncRootPath } from "./file-lock-sync-root.js";
3
3
  import { type FileLockSyncRootDirectoryReceipt, type FileLockSyncRootFileReceipt } from "./file-lock-sync-root-io.js";
4
- export declare function createFileLockSyncRootFile(pathAuthority: FileLockSyncRootPath, mode: number, options?: {
5
- assertBeforeOpen?: () => void;
6
- onOpenFailure?: (error: unknown) => void;
4
+ export declare function createFileLockSyncRootFile(pathAuthority: FileLockSyncRootPath, options: {
5
+ assertBeforeOpen: () => void;
6
+ onOpenFailure: (error: unknown) => void;
7
7
  }): {
8
8
  fd: number;
9
9
  receipt: FileLockSyncRootFileReceipt;
10
10
  };
11
11
  export declare function refreshFileLockSyncRootFileReceipt(pathAuthority: FileLockSyncRootPath, receipt: FileLockSyncRootFileReceipt): FileLockSyncRootFileReceipt;
12
12
  export declare function removeFileLockSyncRootFile(pathAuthority: FileLockSyncRootPath, receipt: FileLockSyncRootFileReceipt, expected?: SidecarLockSnapshot, assertBeforeRemove?: () => boolean | void): boolean;
13
- export declare function fileLockSyncRootGuardExists(pathAuthority: FileLockSyncRootPath, pathAlreadyCurrent?: boolean): boolean;
13
+ export declare function fileLockSyncRootGuardExists(pathAuthority: FileLockSyncRootPath): boolean;
14
14
  export declare function createFileLockSyncRootDirectory(pathAuthority: FileLockSyncRootPath): FileLockSyncRootDirectoryReceipt | null;
15
15
  export declare function removeFileLockSyncRootDirectory(pathAuthority: FileLockSyncRootPath, receipt: FileLockSyncRootDirectoryReceipt): boolean;
16
16
  export declare function fileLockSyncRootDirectoryReceiptStillCurrent(pathAuthority: FileLockSyncRootPath, receipt: FileLockSyncRootDirectoryReceipt): boolean;
17
- //# sourceMappingURL=file-lock-sync-root-mutation.d.ts.map
@@ -76,7 +76,7 @@ function ensureParent(pathAuthority) {
76
76
  assertDirectoryCurrent(currentReceipt);
77
77
  return currentReceipt;
78
78
  }
79
- export function createFileLockSyncRootFile(pathAuthority, mode, options = {}) {
79
+ export function createFileLockSyncRootFile(pathAuthority, options) {
80
80
  const parent = ensureParent(pathAuthority);
81
81
  if (invokeFileLockSyncRootMutationAuthority(pathAuthority.authority)) {
82
82
  assertFileLockSyncRootResolvedPathCurrent(pathAuthority);
@@ -88,12 +88,12 @@ export function createFileLockSyncRootFile(pathAuthority, mode, options = {}) {
88
88
  let fd;
89
89
  let receipt;
90
90
  try {
91
- options.assertBeforeOpen?.();
91
+ options.assertBeforeOpen();
92
92
  try {
93
- fd = fs.openSync(pathForWindowsFilesystem(pathAuthority.path), fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL | noFollow, mode);
93
+ fd = fs.openSync(pathForWindowsFilesystem(pathAuthority.path), fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL | noFollow, 0o600);
94
94
  }
95
95
  catch (error) {
96
- options.onOpenFailure?.(error);
96
+ options.onOpenFailure(error);
97
97
  throw error;
98
98
  }
99
99
  const opened = inspectFileIdentitySync(() => fs.fstatSync(fd, { bigint: true }));
@@ -193,11 +193,9 @@ export function removeFileLockSyncRootFile(pathAuthority, receipt, expected, ass
193
193
  }
194
194
  throw new FsSafeError("path-mismatch", "sidecar lock was replaced during removal");
195
195
  }
196
- export function fileLockSyncRootGuardExists(pathAuthority, pathAlreadyCurrent = false) {
197
- if (!pathAlreadyCurrent)
198
- assertFileLockSyncRootResolvedPathCurrent(pathAuthority);
199
- // A shared path admission may skip only duplicate resolution, never this
200
- // operation-local Root identity fence before fresh directory inspection.
196
+ export function fileLockSyncRootGuardExists(pathAuthority) {
197
+ // The caller already admitted this path; every guard observation still needs
198
+ // an operation-local Root identity fence before fresh directory inspection.
201
199
  assertRootIdentityCurrentSync(pathAuthority.authority.context);
202
200
  let stat;
203
201
  try {
@@ -17,4 +17,3 @@ type CapturedRootSyncAcquireOptions<TPayload extends Record<string, unknown>> =
17
17
  }>;
18
18
  export declare function captureRootSyncAcquireOptions<TPayload extends Record<string, unknown>>(options: FileLockSyncAcquireOptions<TPayload>): CapturedRootSyncAcquireOptions<TPayload>;
19
19
  export {};
20
- //# sourceMappingURL=file-lock-sync-root-options.d.ts.map
@@ -1,2 +1 @@
1
1
  export declare function ensureFileLockSyncRootExitCleanupRegistered(cleanupHandler: () => void): void;
2
- //# sourceMappingURL=file-lock-sync-root-registration.d.ts.map
@@ -1,5 +1,6 @@
1
1
  import { type RootContext } from "./root-context.js";
2
- import type { Root, RootDefaults } from "./root-impl.js";
2
+ import type { Root } from "./root-impl.js";
3
+ import type { RootDefaults } from "./root-options.js";
3
4
  /** @internal Registers only instances constructed by RootHandle itself. */
4
5
  export declare function registerFileLockSyncRootAdapter(handle: object, context: RootContext, defaults: RootDefaults): void;
5
6
  export type FileLockSyncRootAuthority = Readonly<{
@@ -30,7 +31,6 @@ type RootPathResolutionPolicy = Readonly<{
30
31
  }>;
31
32
  export declare function admitFileLockSyncRootPath(authority: FileLockSyncRootAuthority, requestedPath: string): FileLockSyncRootPath;
32
33
  export declare function assertFileLockSyncRootResolvedPathCurrent(pathAuthority: FileLockSyncRootPath): void;
33
- export declare function assertFileLockSyncRootPathsCurrent(paths: readonly FileLockSyncRootPath[], invokeAuthority?: boolean, pathsAlreadyCurrent?: boolean): void;
34
+ export declare function assertFileLockSyncRootPathsCurrent(paths: readonly FileLockSyncRootPath[]): void;
34
35
  export declare function normalizeFileLockSyncTargetWithRoot(authority: FileLockSyncRootAuthority, resolvedTargetPath: string): string;
35
36
  export {};
36
- //# sourceMappingURL=file-lock-sync-root.d.ts.map
@@ -1,8 +1,8 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
- import {} from "./deny-mutations.js";
3
+ import { assertMutationNotDenied } from "./deny-mutations.js";
4
4
  import { FsSafeError } from "./errors.js";
5
- import { assertNoNulPathInput, isNotFoundPathError, isPathInside } from "./path.js";
5
+ import { assertNoNulPathInput, isNotFoundPathError } from "./path.js";
6
6
  import { resolveRootPathSync } from "./root-path.js";
7
7
  import { isRootPathEscapeError } from "./root-path-errors.js";
8
8
  import { admitPathInsideRoot } from "./root-boundary.js";
@@ -100,68 +100,8 @@ function absoluteRootPath(authority, relativePath) {
100
100
  assertNoWindowsPathAlias(absolute, "filesystem", "sidecar lock path uses a Windows filesystem namespace alias");
101
101
  return absolute;
102
102
  }
103
- function assertValidPolicyEntries(entries) {
104
- const captured = [];
105
- for (const entry of entries ?? []) {
106
- if (!entry || !path.isAbsolute(entry)) {
107
- throw new FsSafeError("invalid-path", "deny mutation paths must be non-empty absolute paths");
108
- }
109
- assertNoNulPathInput(entry, "deny mutation path contains a NUL byte");
110
- assertNoWindowsPathAlias(entry, "filesystem", "deny mutation path uses a Windows filesystem namespace alias");
111
- captured.push(resolvePathPreservingWindowsRoot(entry));
112
- }
113
- return captured;
114
- }
115
- function mutationComparablePaths(pathname) {
116
- const resolved = resolvePathPreservingWindowsRoot(pathname);
117
- assertNoWindowsPathAlias(resolved, "filesystem", "mutation path uses a Windows filesystem namespace alias");
118
- let cursor = resolved;
119
- const missing = [];
120
- while (path.parse(cursor).root !== cursor) {
121
- try {
122
- fs.lstatSync(pathForWindowsFilesystem(cursor));
123
- break;
124
- }
125
- catch (error) {
126
- if (!isNotFoundPathError(error))
127
- throw error;
128
- missing.unshift(path.basename(cursor));
129
- cursor = path.dirname(cursor);
130
- }
131
- }
132
- // Deny policy is an authority boundary: unlike advisory key normalization,
133
- // an ambiguous existing ancestor must not silently fall back to lexical form.
134
- const canonicalAncestor = realpathSync.native(pathForWindowsFilesystem(cursor));
135
- assertNoWindowsPathAlias(canonicalAncestor, "filesystem", "mutation path uses a Windows filesystem namespace alias");
136
- const canonical = missing.length === 0
137
- ? canonicalAncestor
138
- : path.resolve(canonicalAncestor, ...missing);
139
- assertNoWindowsPathAlias(canonical, "filesystem", "mutation path uses a Windows filesystem namespace alias");
140
- return samePath(resolved, canonical) ? [resolved] : [resolved, canonical];
141
- }
142
103
  export function assertFileLockSyncRootMutationAllowed(pathname, policy, protectAncestors = false) {
143
- if (!policy?.paths?.length && !policy?.prefixes?.length)
144
- return;
145
- const targets = mutationComparablePaths(pathname);
146
- for (const entry of assertValidPolicyEntries(policy.paths)) {
147
- for (const denied of mutationComparablePaths(entry)) {
148
- for (const target of targets) {
149
- if ((isPathInside(denied, target) && isPathInside(target, denied)) ||
150
- (protectAncestors && isPathInside(target, denied))) {
151
- throw new FsSafeError("denied-path", "path is denied by denyMutations policy");
152
- }
153
- }
154
- }
155
- }
156
- for (const entry of assertValidPolicyEntries(policy.prefixes)) {
157
- for (const denied of mutationComparablePaths(entry)) {
158
- for (const target of targets) {
159
- if (isPathInside(denied, target) || (protectAncestors && isPathInside(target, denied))) {
160
- throw new FsSafeError("denied-path", "path is denied by denyMutations policy");
161
- }
162
- }
163
- }
164
- }
104
+ assertMutationNotDenied(pathname, policy, { protectAncestors }, "sync-root-lock");
165
105
  }
166
106
  function resolveAdmittedPath(authority, absolutePath, policy, rootPath) {
167
107
  const context = authority.context;
@@ -279,24 +219,14 @@ function assertMissingParentMutationsAllowed(pathAuthority) {
279
219
  assertFileLockSyncRootMutationAllowed(current, authority.denyMutations);
280
220
  }
281
221
  }
282
- export function assertFileLockSyncRootPathsCurrent(paths, invokeAuthority = false, pathsAlreadyCurrent = false) {
222
+ export function assertFileLockSyncRootPathsCurrent(paths) {
283
223
  const authority = paths[0]?.authority;
284
224
  for (const pathAuthority of paths) {
285
225
  if (authority && pathAuthority.authority !== authority) {
286
226
  throw new FsSafeError("path-mismatch", "sidecar paths use different Root authority");
287
227
  }
288
228
  }
289
- if (!pathsAlreadyCurrent) {
290
- if (authority)
291
- assertRootIdentityCurrentSync(authority.context);
292
- for (const pathAuthority of paths) {
293
- assertFileLockSyncRootResolvedPathCurrent(pathAuthority);
294
- assertMissingParentMutationsAllowed(pathAuthority);
295
- }
296
- if (authority)
297
- assertRootIdentityCurrentSync(authority.context);
298
- }
299
- if (invokeAuthority && authority && invokeFileLockSyncRootMutationAuthority(authority)) {
229
+ if (authority && invokeFileLockSyncRootMutationAuthority(authority)) {
300
230
  assertRootIdentityCurrentSync(authority.context);
301
231
  for (const pathAuthority of paths) {
302
232
  assertFileLockSyncRootResolvedPathCurrent(pathAuthority);
@@ -309,16 +239,13 @@ function resolveTargetPathViaExistingAncestorSync(targetPath) {
309
239
  const normalized = resolvePathPreservingWindowsRoot(targetPath);
310
240
  const canonicalize = process.platform === "win32" ? realpathSync.native : realpathSync;
311
241
  let cursor = normalized;
312
- const missing = [];
242
+ let canonicalAncestor;
313
243
  while (true) {
314
244
  try {
315
245
  fs.lstatSync(pathForWindowsFilesystem(cursor));
316
246
  try {
317
- const canonicalAncestor = canonicalize(pathForWindowsFilesystem(cursor));
318
- assertNoWindowsPathAlias(canonicalAncestor, "filesystem", "file-lock target ancestor uses a Windows filesystem namespace alias");
319
- return missing.length === 0
320
- ? resolvePathPreservingWindowsRoot(canonicalAncestor)
321
- : resolvePathPreservingWindowsRoot(path.resolve(canonicalAncestor, ...missing));
247
+ canonicalAncestor = canonicalize(pathForWindowsFilesystem(cursor));
248
+ break;
322
249
  }
323
250
  catch (error) {
324
251
  if (!isNotFoundPathError(error))
@@ -336,15 +263,15 @@ function resolveTargetPathViaExistingAncestorSync(targetPath) {
336
263
  if (parent === cursor) {
337
264
  // Filesystem roots are expected to exist; preserve the underlying
338
265
  // not-found diagnosis if a synthetic namespace violates that premise.
339
- const canonicalAncestor = canonicalize(pathForWindowsFilesystem(cursor));
340
- assertNoWindowsPathAlias(canonicalAncestor, "filesystem", "file-lock target ancestor uses a Windows filesystem namespace alias");
341
- return missing.length === 0
342
- ? resolvePathPreservingWindowsRoot(canonicalAncestor)
343
- : resolvePathPreservingWindowsRoot(path.resolve(canonicalAncestor, ...missing));
266
+ canonicalAncestor = canonicalize(pathForWindowsFilesystem(cursor));
267
+ break;
344
268
  }
345
- missing.unshift(path.basename(cursor));
346
269
  cursor = parent;
347
270
  }
271
+ assertNoWindowsPathAlias(canonicalAncestor, "filesystem", "file-lock target ancestor uses a Windows filesystem namespace alias");
272
+ return resolvePathPreservingWindowsRoot(cursor === normalized
273
+ ? canonicalAncestor
274
+ : path.resolve(canonicalAncestor, `.${path.sep}${normalized.slice(cursor.length)}`));
348
275
  }
349
276
  export function normalizeFileLockSyncTargetWithRoot(authority, resolvedTargetPath) {
350
277
  assertNoNulPathInput(resolvedTargetPath, "file-lock target contains a NUL byte");
@@ -1,4 +1,5 @@
1
1
  import type { FileLockSyncAcquireOptions } from "./file-lock-sync.js";
2
+ import type { SyncLockAcquisition } from "./file-lock-sync-acquisition.js";
2
3
  import type { SidecarLockStaleRecovery } from "./sidecar-lock-types.js";
3
4
  export type SyncStaleOptionsState<TPayload extends Record<string, unknown>> = {
4
5
  shouldReclaimObserved?: boolean;
@@ -7,18 +8,12 @@ export type SyncStaleOptionsState<TPayload extends Record<string, unknown>> = {
7
8
  shouldRemove?: FileLockSyncAcquireOptions<TPayload>["shouldRemoveStaleLock"];
8
9
  };
9
10
  /** Handle one exclusive-create conflict without surrendering canonical admission. */
10
- export declare function handleSyncStaleAdmission<TPayload extends Record<string, unknown>>(params: {
11
- hasToken(): boolean;
11
+ export declare function handleSyncStaleAdmission<TPayload extends Record<string, unknown>>(acquisition: SyncLockAcquisition, params: {
12
12
  currentHeld(): unknown;
13
- lockPath: string;
14
- normalizedTargetPath: string;
15
13
  options: FileLockSyncAcquireOptions<TPayload>;
16
14
  parsePayload?: (raw: string) => unknown;
17
15
  reclaimGuardPath: string;
18
- retryLockFileDenial(error: unknown): boolean;
19
16
  staleMs: number;
20
17
  staleOptions: SyncStaleOptionsState<TPayload>;
21
18
  staleRecovery?: SidecarLockStaleRecovery;
22
- waitForRetry(): void;
23
19
  }): void;
24
- //# sourceMappingURL=file-lock-sync-stale-admission.d.ts.map