@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.
Files changed (705) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/README.md +8 -1
  3. package/dist/absolute-path.d.ts +0 -1
  4. package/dist/absolute-path.js +2 -8
  5. package/dist/advanced.d.ts +2 -1
  6. package/dist/advanced.js +2 -0
  7. package/dist/archive-crc32.d.ts +0 -1
  8. package/dist/archive-deadline.d.ts +0 -1
  9. package/dist/archive-deadline.js +22 -23
  10. package/dist/archive-durability.d.ts +0 -1
  11. package/dist/archive-entry.d.ts +0 -1
  12. package/dist/archive-errors.d.ts +0 -1
  13. package/dist/archive-gzip-tail.d.ts +0 -1
  14. package/dist/archive-input.d.ts +0 -1
  15. package/dist/archive-kind.d.ts +0 -1
  16. package/dist/archive-limits.d.ts +0 -1
  17. package/dist/archive-merge.d.ts +3 -4
  18. package/dist/archive-merge.js +17 -7
  19. package/dist/archive-native.d.ts +3 -14
  20. package/dist/archive-native.js +46 -70
  21. package/dist/archive-options.d.ts +9 -2
  22. package/dist/archive-parser-errors.d.ts +0 -1
  23. package/dist/archive-parser.wasm +0 -0
  24. package/dist/archive-plan.d.ts +10 -1
  25. package/dist/archive-plan.js +31 -21
  26. package/dist/archive-policy.d.ts +0 -1
  27. package/dist/archive-read.d.ts +0 -1
  28. package/dist/archive-staging.d.ts +0 -1
  29. package/dist/archive-tar-inspect.d.ts +0 -1
  30. package/dist/archive-tar-stream.d.ts +0 -1
  31. package/dist/archive-tar-wasm.d.ts +0 -1
  32. package/dist/archive-tar.d.ts +0 -1
  33. package/dist/archive-zip-admission.d.ts +0 -1
  34. package/dist/archive-zip-count.d.ts +0 -1
  35. package/dist/archive-zip-count.js +21 -1
  36. package/dist/archive-zip-directory.d.ts +0 -1
  37. package/dist/archive-zip-directory.js +23 -1
  38. package/dist/archive-zip-entry.d.ts +0 -1
  39. package/dist/archive-zip-integrity.d.ts +0 -1
  40. package/dist/archive-zip-loader.d.ts +2 -1
  41. package/dist/archive-zip-loader.js +7 -0
  42. package/dist/archive-zip-manifest.d.ts +0 -1
  43. package/dist/archive-zip-names.d.ts +0 -1
  44. package/dist/archive-zip-names.js +7 -2
  45. package/dist/archive-zip-preflight.d.ts +0 -1
  46. package/dist/archive.d.ts +0 -1
  47. package/dist/archive.js +93 -164
  48. package/dist/async-lock.d.ts +0 -1
  49. package/dist/atomic.d.ts +0 -1
  50. package/dist/bounded-read-stream.d.ts +0 -1
  51. package/dist/bounded-read.d.ts +0 -1
  52. package/dist/byte-budget.d.ts +0 -1
  53. package/dist/byte-view.d.ts +2 -0
  54. package/dist/byte-view.js +13 -0
  55. package/dist/clone-metadata.d.ts +0 -1
  56. package/dist/config.d.ts +0 -1
  57. package/dist/containment.d.ts +0 -1
  58. package/dist/copy-file-input.d.ts +0 -1
  59. package/dist/copy-policy.d.ts +0 -1
  60. package/dist/copy-publication.d.ts +0 -1
  61. package/dist/copy-tree-portable.d.ts +0 -1
  62. package/dist/copy-tree-portable.js +9 -6
  63. package/dist/copy.d.ts +0 -1
  64. package/dist/copy.js +5 -5
  65. package/dist/create-directory.d.ts +0 -2
  66. package/dist/create-directory.js +3 -22
  67. package/dist/create-file-async.d.ts +0 -1
  68. package/dist/create-file.d.ts +0 -1
  69. package/dist/create-file.js +3 -14
  70. package/dist/create-owned-file.d.ts +0 -1
  71. package/dist/create.d.ts +1 -2
  72. package/dist/create.js +1 -1
  73. package/dist/creation-darwin.d.ts +0 -2
  74. package/dist/creation-darwin.js +0 -9
  75. package/dist/creation-file-state.d.ts +0 -1
  76. package/dist/creation-path.d.ts +2 -1
  77. package/dist/creation-path.js +12 -0
  78. package/dist/creation-permissions.d.ts +0 -1
  79. package/dist/creation-permissions.js +28 -38
  80. package/dist/deny-mutations.d.ts +2 -3
  81. package/dist/deny-mutations.js +55 -35
  82. package/dist/device-path.d.ts +0 -1
  83. package/dist/directory-durability.d.ts +6 -7
  84. package/dist/directory-entry-path.d.ts +0 -1
  85. package/dist/directory-guard.d.ts +2 -7
  86. package/dist/directory-guard.js +25 -56
  87. package/dist/directory-mode-node.d.ts +0 -1
  88. package/dist/directory-mode-owner.d.ts +0 -1
  89. package/dist/directory-receipt.d.ts +2 -3
  90. package/dist/directory-receipt.js +15 -19
  91. package/dist/durability.d.ts +0 -1
  92. package/dist/effective-uid.d.ts +0 -1
  93. package/dist/error-detail.d.ts +0 -1
  94. package/dist/errors.d.ts +0 -1
  95. package/dist/file-cleanup.d.ts +1 -1
  96. package/dist/file-cleanup.js +7 -4
  97. package/dist/file-contents.d.ts +5 -0
  98. package/dist/file-contents.js +40 -0
  99. package/dist/file-handle-transfer.d.ts +0 -1
  100. package/dist/file-hash.d.ts +0 -1
  101. package/dist/file-hash.js +186 -70
  102. package/dist/file-identity.d.ts +0 -1
  103. package/dist/file-lock-sync-acquisition.d.ts +22 -0
  104. package/dist/file-lock-sync-acquisition.js +98 -0
  105. package/dist/file-lock-sync-admission.d.ts +0 -2
  106. package/dist/file-lock-sync-admission.js +9 -48
  107. package/dist/file-lock-sync-root-acquire.d.ts +0 -1
  108. package/dist/file-lock-sync-root-acquire.js +35 -98
  109. package/dist/file-lock-sync-root-arbitration.d.ts +0 -1
  110. package/dist/file-lock-sync-root-held.d.ts +1 -3
  111. package/dist/file-lock-sync-root-held.js +7 -5
  112. package/dist/file-lock-sync-root-io.d.ts +0 -1
  113. package/dist/file-lock-sync-root-mutation.d.ts +4 -5
  114. package/dist/file-lock-sync-root-mutation.js +7 -9
  115. package/dist/file-lock-sync-root-options.d.ts +0 -1
  116. package/dist/file-lock-sync-root-registration.d.ts +0 -1
  117. package/dist/file-lock-sync-root.d.ts +1 -2
  118. package/dist/file-lock-sync-root.js +14 -87
  119. package/dist/file-lock-sync-stale-admission.d.ts +2 -7
  120. package/dist/file-lock-sync-stale-admission.js +24 -23
  121. package/dist/file-lock-sync.d.ts +0 -1
  122. package/dist/file-lock-sync.js +46 -128
  123. package/dist/file-lock.d.ts +0 -1
  124. package/dist/file-observation.d.ts +0 -1
  125. package/dist/file-store-boundary.d.ts +0 -2
  126. package/dist/file-store-boundary.js +6 -26
  127. package/dist/file-store-copy-source.d.ts +1 -2
  128. package/dist/file-store-copy-source.js +1 -1
  129. package/dist/file-store-limit.d.ts +1 -2
  130. package/dist/file-store-limit.js +2 -3
  131. package/dist/file-store-path.d.ts +0 -1
  132. package/dist/file-store-prune.d.ts +0 -1
  133. package/dist/file-store-sync-directory.d.ts +0 -1
  134. package/dist/file-store-sync-directory.js +194 -231
  135. package/dist/file-store-sync-write.d.ts +0 -1
  136. package/dist/file-store-sync-write.js +16 -26
  137. package/dist/file-store.d.ts +0 -1
  138. package/dist/file-store.js +6 -7
  139. package/dist/file-sync.d.ts +0 -1
  140. package/dist/filename.d.ts +0 -1
  141. package/dist/filename.js +1 -7
  142. package/dist/fs.d.ts +0 -1
  143. package/dist/guarded-mkdir.d.ts +0 -1
  144. package/dist/guarded-mkdir.js +6 -27
  145. package/dist/guarded-mutation.d.ts +0 -7
  146. package/dist/guarded-mutation.js +6 -11
  147. package/dist/guest-dispatch-python.d.ts +0 -1
  148. package/dist/guest-dispatch-python.js +41 -90
  149. package/dist/guest-native-python.d.ts +0 -1
  150. package/dist/guest.d.ts +0 -1
  151. package/dist/home-dir.d.ts +0 -1
  152. package/dist/index.d.ts +0 -1
  153. package/dist/install-path.d.ts +0 -1
  154. package/dist/install-path.js +2 -5
  155. package/dist/json-document-store.d.ts +0 -1
  156. package/dist/json-durable-queue-directory.d.ts +13 -1
  157. package/dist/json-durable-queue-directory.js +134 -0
  158. package/dist/json-durable-queue-ownership.d.ts +0 -1
  159. package/dist/json-durable-queue-ownership.js +43 -66
  160. package/dist/json-durable-queue-read.d.ts +0 -1
  161. package/dist/json-durable-queue-read.js +6 -6
  162. package/dist/json-durable-queue.d.ts +0 -1
  163. package/dist/json-durable-queue.js +17 -139
  164. package/dist/json-store.d.ts +0 -1
  165. package/dist/json-stringify.d.ts +0 -1
  166. package/dist/json.d.ts +0 -1
  167. package/dist/json.js +38 -90
  168. package/dist/local-file-access.d.ts +0 -1
  169. package/dist/local-file-access.js +3 -10
  170. package/dist/local-file-descriptor.d.ts +0 -1
  171. package/dist/local-roots.d.ts +0 -1
  172. package/dist/local-roots.js +19 -21
  173. package/dist/lock-config.d.ts +0 -1
  174. package/dist/move-path-cleanup.d.ts +5 -20
  175. package/dist/move-path-cleanup.js +57 -21
  176. package/dist/move-path-stage.d.ts +0 -1
  177. package/dist/move-path.d.ts +0 -1
  178. package/dist/move-path.js +62 -39
  179. package/dist/mutation-authority.d.ts +0 -1
  180. package/dist/native-binding.d.ts +0 -1
  181. package/dist/native-config.d.ts +0 -1
  182. package/dist/native-directory-observation.d.ts +0 -1
  183. package/dist/native-fallback-warning.d.ts +0 -1
  184. package/dist/native-operations.d.ts +1 -5
  185. package/dist/native-operations.js +2 -6
  186. package/dist/native-parent-admission.d.ts +0 -1
  187. package/dist/native-pinned-write-windows.d.ts +0 -1
  188. package/dist/native-pinned-write.d.ts +0 -1
  189. package/dist/native-pinned-write.js +4 -10
  190. package/dist/native-policy-directory-observation.d.ts +0 -1
  191. package/dist/native-policy-parent-windows.d.ts +0 -1
  192. package/dist/native-rename-outcome.d.ts +0 -1
  193. package/dist/native-staged-file.d.ts +17 -4
  194. package/dist/native-staged-file.js +63 -68
  195. package/dist/native.d.ts +0 -1
  196. package/dist/native.js +2 -2
  197. package/dist/opened-file-failure.d.ts +0 -1
  198. package/dist/opened-realpath.d.ts +0 -1
  199. package/dist/opened-realpath.js +11 -2
  200. package/dist/output.d.ts +0 -1
  201. package/dist/overwrite-file-handle.d.ts +0 -1
  202. package/dist/owner-dacl.d.ts +0 -1
  203. package/dist/path-case.d.ts +0 -1
  204. package/dist/path-policy.d.ts +0 -1
  205. package/dist/path-prefix.d.ts +0 -1
  206. package/dist/path-scope-lexical.d.ts +0 -1
  207. package/dist/path-segment-route.d.ts +0 -1
  208. package/dist/path-suffix-aliases.d.ts +0 -1
  209. package/dist/path.d.ts +0 -1
  210. package/dist/path.js +2 -1
  211. package/dist/permission-exec.d.ts +0 -1
  212. package/dist/permission-exec.js +19 -25
  213. package/dist/permissions-public.d.ts +0 -1
  214. package/dist/permissions-windows.d.ts +2 -10
  215. package/dist/permissions-windows.js +10 -30
  216. package/dist/permissions.d.ts +0 -1
  217. package/dist/permissions.js +11 -33
  218. package/dist/pinned-mutation-admission.d.ts +0 -1
  219. package/dist/pinned-mutation-observation.d.ts +0 -1
  220. package/dist/pinned-mutation-shared-route.d.ts +0 -1
  221. package/dist/pinned-open.d.ts +1 -1
  222. package/dist/pinned-open.js +1 -1
  223. package/dist/pinned-operation.d.ts +0 -1
  224. package/dist/pinned-write-input.d.ts +0 -1
  225. package/dist/pinned-write-input.js +11 -1
  226. package/dist/pinned-write-mode.d.ts +3 -4
  227. package/dist/pinned-write-mode.js +15 -8
  228. package/dist/pinned-write-staged.d.ts +0 -1
  229. package/dist/pinned-write-staged.js +10 -11
  230. package/dist/pinned-write-types.d.ts +9 -21
  231. package/dist/pinned-write.d.ts +0 -1
  232. package/dist/pinned-write.js +17 -13
  233. package/dist/positional-read.d.ts +0 -1
  234. package/dist/private-directory.d.ts +0 -1
  235. package/dist/private-producer-handoff-sync.d.ts +0 -1
  236. package/dist/private-producer-handoff-sync.js +9 -51
  237. package/dist/private-producer-handoff.d.ts +20 -1
  238. package/dist/private-producer-handoff.js +69 -46
  239. package/dist/private-temp-workspace.d.ts +0 -1
  240. package/dist/private-temp-workspace.js +11 -36
  241. package/dist/publish-copy-stage.d.ts +0 -1
  242. package/dist/publish-file-failure.d.ts +0 -1
  243. package/dist/publish-file.d.ts +2 -3
  244. package/dist/publish-file.js +56 -96
  245. package/dist/read-open-flags.d.ts +0 -1
  246. package/dist/read-opened-file.d.ts +0 -1
  247. package/dist/realpath.d.ts +0 -1
  248. package/dist/recursive-mkdir-path.d.ts +0 -1
  249. package/dist/regular-file.d.ts +0 -1
  250. package/dist/regular-file.js +107 -178
  251. package/dist/replace-directory.d.ts +0 -1
  252. package/dist/replace-file-copy-fallback.d.ts +0 -1
  253. package/dist/replace-file-copy-fallback.js +42 -29
  254. package/dist/replace-file-copy-source.d.ts +0 -1
  255. package/dist/replace-file-copy-source.js +19 -23
  256. package/dist/replace-file-descriptor.d.ts +0 -1
  257. package/dist/replace-file-descriptor.js +16 -17
  258. package/dist/replace-file-mode.d.ts +0 -1
  259. package/dist/replace-file-rename-policy.d.ts +0 -1
  260. package/dist/replace-file-temp-owner.d.ts +12 -13
  261. package/dist/replace-file-temp-owner.js +72 -91
  262. package/dist/replace-file.d.ts +0 -1
  263. package/dist/replace-file.js +9 -13
  264. package/dist/retained-directory-replacement.d.ts +0 -1
  265. package/dist/root-boundary.d.ts +0 -1
  266. package/dist/root-context.d.ts +0 -1
  267. package/dist/root-create-input.d.ts +0 -1
  268. package/dist/root-directory-creation.d.ts +0 -1
  269. package/dist/root-directory-list.d.ts +0 -1
  270. package/dist/root-directory-list.js +20 -3
  271. package/dist/root-directory.d.ts +0 -1
  272. package/dist/root-entries.d.ts +0 -1
  273. package/dist/root-errors.d.ts +0 -1
  274. package/dist/root-file-final-admission.d.ts +1 -2
  275. package/dist/root-file-final-admission.js +5 -2
  276. package/dist/root-file.d.ts +0 -1
  277. package/dist/root-file.js +3 -2
  278. package/dist/root-impl.d.ts +2 -10
  279. package/dist/root-impl.js +164 -111
  280. package/dist/root-move-noreplace.d.ts +2 -1
  281. package/dist/root-move-noreplace.js +2 -2
  282. package/dist/root-move-preflight.d.ts +0 -1
  283. package/dist/root-observed-path.d.ts +0 -1
  284. package/dist/root-options.d.ts +0 -1
  285. package/dist/root-path-errors.d.ts +0 -1
  286. package/dist/root-path-existing.d.ts +3 -1
  287. package/dist/root-path-existing.js +39 -18
  288. package/dist/root-path-observation.d.ts +0 -1
  289. package/dist/root-path-stat.d.ts +0 -1
  290. package/dist/root-path.d.ts +0 -1
  291. package/dist/root-path.js +60 -188
  292. package/dist/root-paths-lexical.d.ts +0 -1
  293. package/dist/root-paths.d.ts +0 -1
  294. package/dist/root-read-admission.d.ts +0 -1
  295. package/dist/root-read-admission.js +31 -39
  296. package/dist/root-remove-identity.d.ts +0 -1
  297. package/dist/root-remove-receipt.d.ts +0 -1
  298. package/dist/root-remove.d.ts +0 -1
  299. package/dist/root-remove.js +15 -1
  300. package/dist/root-symlink-policy.d.ts +0 -1
  301. package/dist/root-walk.d.ts +0 -1
  302. package/dist/root-write-admission.d.ts +0 -1
  303. package/dist/root-write-compatibility.d.ts +0 -1
  304. package/dist/root-write-complete-parent.d.ts +0 -1
  305. package/dist/root-write-lock-binding.d.ts +0 -1
  306. package/dist/root-write-mode.d.ts +0 -1
  307. package/dist/root-write-publication.d.ts +0 -1
  308. package/dist/root-write-verification.d.ts +0 -1
  309. package/dist/root.d.ts +0 -1
  310. package/dist/safe-path-segment.d.ts +1 -2
  311. package/dist/safe-path-segment.js +2 -5
  312. package/dist/secret-file.d.ts +0 -1
  313. package/dist/secret-file.js +7 -17
  314. package/dist/secret-read-async.d.ts +0 -1
  315. package/dist/secret-read-async.js +5 -5
  316. package/dist/secret-read-policy.d.ts +0 -1
  317. package/dist/secret.d.ts +0 -1
  318. package/dist/secure-file-windows.d.ts +0 -6
  319. package/dist/secure-file-windows.js +13 -28
  320. package/dist/secure-file.d.ts +0 -1
  321. package/dist/secure-file.js +9 -9
  322. package/dist/secure-temp-dir.d.ts +0 -1
  323. package/dist/secure-temp-repair.d.ts +0 -1
  324. package/dist/sibling-staged-file.d.ts +0 -1
  325. package/dist/sibling-staged-file.js +32 -39
  326. package/dist/sibling-temp.d.ts +0 -1
  327. package/dist/sidecar-lock-acquire.d.ts +1 -2
  328. package/dist/sidecar-lock-acquire.js +35 -58
  329. package/dist/sidecar-lock-admission-context.d.ts +0 -1
  330. package/dist/sidecar-lock-admission-parser.d.ts +0 -1
  331. package/dist/sidecar-lock-admission.d.ts +1 -5
  332. package/dist/sidecar-lock-admission.js +1 -7
  333. package/dist/sidecar-lock-handle.d.ts +3 -1
  334. package/dist/sidecar-lock-handle.js +6 -0
  335. package/dist/sidecar-lock-policy.d.ts +3 -1
  336. package/dist/sidecar-lock-policy.js +16 -0
  337. package/dist/sidecar-lock-reclaim.d.ts +1 -2
  338. package/dist/sidecar-lock-reclaim.js +11 -8
  339. package/dist/sidecar-lock-registration.d.ts +13 -0
  340. package/dist/sidecar-lock-registration.js +47 -0
  341. package/dist/sidecar-lock-root.d.ts +0 -1
  342. package/dist/sidecar-lock-stale-admission.d.ts +0 -1
  343. package/dist/sidecar-lock-target.d.ts +0 -1
  344. package/dist/sidecar-lock-types.d.ts +0 -1
  345. package/dist/sidecar-lock.d.ts +0 -1
  346. package/dist/sidecar-lock.js +19 -88
  347. package/dist/staged-directory.d.ts +2 -3
  348. package/dist/staged-file-settlement.d.ts +0 -1
  349. package/dist/staged-file-types.d.ts +0 -1
  350. package/dist/standalone-publication-path.d.ts +0 -1
  351. package/dist/stat-observation.d.ts +0 -1
  352. package/dist/store.d.ts +0 -1
  353. package/dist/strict-file-identity.d.ts +1 -2
  354. package/dist/strict-file-identity.js +9 -9
  355. package/dist/string-coerce.d.ts +0 -1
  356. package/dist/suppressed-error.d.ts +0 -1
  357. package/dist/symlink-parents.d.ts +0 -1
  358. package/dist/symlink-parents.js +2 -27
  359. package/dist/temp-cleanup.d.ts +0 -1
  360. package/dist/temp-target.d.ts +0 -1
  361. package/dist/temp-target.js +7 -46
  362. package/dist/temp-workspace-admission.d.ts +0 -8
  363. package/dist/temp-workspace-admission.js +0 -4
  364. package/dist/temp-workspace-child-admission.d.ts +0 -4
  365. package/dist/temp-workspace-child-admission.js +0 -12
  366. package/dist/temp-workspace-descriptor.d.ts +0 -6
  367. package/dist/temp-workspace-descriptor.js +0 -2
  368. package/dist/temp-workspace-identity.d.ts +0 -1
  369. package/dist/temp-workspace-owner.d.ts +1 -1
  370. package/dist/temp-workspace-owner.js +49 -26
  371. package/dist/temp-workspace-permissions.d.ts +0 -1
  372. package/dist/temp-workspace-types.d.ts +0 -1
  373. package/dist/temp.d.ts +0 -1
  374. package/dist/test-hooks.d.ts +0 -1
  375. package/dist/text-atomic.d.ts +0 -1
  376. package/dist/timing.d.ts +0 -1
  377. package/dist/trash.d.ts +0 -1
  378. package/dist/types.d.ts +0 -1
  379. package/dist/unicode-path.d.ts +0 -1
  380. package/dist/unicode-path.js +3 -0
  381. package/dist/walk.d.ts +0 -1
  382. package/dist/walk.js +4 -2
  383. package/dist/windows-command.d.ts +0 -1
  384. package/dist/windows-owner.d.ts +0 -1
  385. package/dist/windows-owner.js +4 -1
  386. package/dist/windows-path-alias.d.ts +0 -1
  387. package/dist/windows-path-alias.js +7 -43
  388. package/dist/windows-path-syntax.d.ts +5 -0
  389. package/dist/windows-path-syntax.js +21 -0
  390. package/dist/windows-security-command.d.ts +0 -1
  391. package/dist/windows-security-facts.d.ts +0 -1
  392. package/dist/write-file-handle.d.ts +7 -1
  393. package/dist/write-file-handle.js +23 -0
  394. package/dist/write-open-flags.d.ts +0 -1
  395. package/dist/write-open-flags.js +1 -8
  396. package/dist/write-queue.d.ts +0 -1
  397. package/dist/write-queue.js +1 -4
  398. package/docs/advanced.md +68 -1
  399. package/docs/archive.md +41 -2
  400. package/docs/atomic.md +43 -5
  401. package/docs/contributing.md +4 -0
  402. package/docs/copy.md +2 -0
  403. package/docs/creation.md +8 -4
  404. package/docs/durability.md +35 -0
  405. package/docs/file-contents.md +68 -0
  406. package/docs/json.md +5 -4
  407. package/docs/local-roots.md +2 -0
  408. package/docs/mutation-policy-proof.md +11 -7
  409. package/docs/native.md +9 -8
  410. package/docs/path.md +4 -4
  411. package/docs/permissions.md +6 -0
  412. package/docs/public-api.md +5 -0
  413. package/docs/quickstart.md +1 -1
  414. package/docs/reading.md +2 -2
  415. package/docs/regular-file.md +3 -0
  416. package/docs/root.md +19 -0
  417. package/docs/secret-file.md +4 -0
  418. package/docs/sidecar-lock.md +9 -1
  419. package/docs/staged-file.md +4 -3
  420. package/docs/store.md +3 -1
  421. package/docs/temp.md +4 -1
  422. package/docs/types.md +18 -2
  423. package/docs/walk.md +7 -0
  424. package/docs/writing.md +18 -5
  425. package/package.json +8 -9
  426. package/dist/absolute-path.d.ts.map +0 -1
  427. package/dist/advanced.d.ts.map +0 -1
  428. package/dist/archive-crc32.d.ts.map +0 -1
  429. package/dist/archive-deadline.d.ts.map +0 -1
  430. package/dist/archive-durability.d.ts.map +0 -1
  431. package/dist/archive-entry.d.ts.map +0 -1
  432. package/dist/archive-errors.d.ts.map +0 -1
  433. package/dist/archive-gzip-tail.d.ts.map +0 -1
  434. package/dist/archive-input.d.ts.map +0 -1
  435. package/dist/archive-kind.d.ts.map +0 -1
  436. package/dist/archive-limits.d.ts.map +0 -1
  437. package/dist/archive-merge.d.ts.map +0 -1
  438. package/dist/archive-native.d.ts.map +0 -1
  439. package/dist/archive-options.d.ts.map +0 -1
  440. package/dist/archive-parser-errors.d.ts.map +0 -1
  441. package/dist/archive-plan.d.ts.map +0 -1
  442. package/dist/archive-policy.d.ts.map +0 -1
  443. package/dist/archive-read.d.ts.map +0 -1
  444. package/dist/archive-staging.d.ts.map +0 -1
  445. package/dist/archive-tar-inspect.d.ts.map +0 -1
  446. package/dist/archive-tar-stream.d.ts.map +0 -1
  447. package/dist/archive-tar-wasm.d.ts.map +0 -1
  448. package/dist/archive-tar.d.ts.map +0 -1
  449. package/dist/archive-zip-admission.d.ts.map +0 -1
  450. package/dist/archive-zip-count.d.ts.map +0 -1
  451. package/dist/archive-zip-directory.d.ts.map +0 -1
  452. package/dist/archive-zip-entry.d.ts.map +0 -1
  453. package/dist/archive-zip-integrity.d.ts.map +0 -1
  454. package/dist/archive-zip-loader.d.ts.map +0 -1
  455. package/dist/archive-zip-manifest.d.ts.map +0 -1
  456. package/dist/archive-zip-names.d.ts.map +0 -1
  457. package/dist/archive-zip-preflight.d.ts.map +0 -1
  458. package/dist/archive.d.ts.map +0 -1
  459. package/dist/async-lock.d.ts.map +0 -1
  460. package/dist/atomic.d.ts.map +0 -1
  461. package/dist/bounded-read-stream.d.ts.map +0 -1
  462. package/dist/bounded-read.d.ts.map +0 -1
  463. package/dist/byte-budget.d.ts.map +0 -1
  464. package/dist/clone-metadata.d.ts.map +0 -1
  465. package/dist/config.d.ts.map +0 -1
  466. package/dist/containment.d.ts.map +0 -1
  467. package/dist/copy-file-input.d.ts.map +0 -1
  468. package/dist/copy-policy.d.ts.map +0 -1
  469. package/dist/copy-publication.d.ts.map +0 -1
  470. package/dist/copy-tree-portable.d.ts.map +0 -1
  471. package/dist/copy.d.ts.map +0 -1
  472. package/dist/create-directory.d.ts.map +0 -1
  473. package/dist/create-file-async.d.ts.map +0 -1
  474. package/dist/create-file.d.ts.map +0 -1
  475. package/dist/create-owned-file.d.ts.map +0 -1
  476. package/dist/create.d.ts.map +0 -1
  477. package/dist/creation-darwin.d.ts.map +0 -1
  478. package/dist/creation-file-state.d.ts.map +0 -1
  479. package/dist/creation-path.d.ts.map +0 -1
  480. package/dist/creation-permissions.d.ts.map +0 -1
  481. package/dist/deny-mutations.d.ts.map +0 -1
  482. package/dist/device-path.d.ts.map +0 -1
  483. package/dist/directory-durability.d.ts.map +0 -1
  484. package/dist/directory-entry-path.d.ts.map +0 -1
  485. package/dist/directory-guard.d.ts.map +0 -1
  486. package/dist/directory-mode-node.d.ts.map +0 -1
  487. package/dist/directory-mode-owner.d.ts.map +0 -1
  488. package/dist/directory-receipt.d.ts.map +0 -1
  489. package/dist/durability.d.ts.map +0 -1
  490. package/dist/effective-uid.d.ts.map +0 -1
  491. package/dist/error-detail.d.ts.map +0 -1
  492. package/dist/errors.d.ts.map +0 -1
  493. package/dist/file-cleanup.d.ts.map +0 -1
  494. package/dist/file-handle-transfer.d.ts.map +0 -1
  495. package/dist/file-hash.d.ts.map +0 -1
  496. package/dist/file-identity.d.ts.map +0 -1
  497. package/dist/file-lock-sync-admission.d.ts.map +0 -1
  498. package/dist/file-lock-sync-root-acquire.d.ts.map +0 -1
  499. package/dist/file-lock-sync-root-arbitration.d.ts.map +0 -1
  500. package/dist/file-lock-sync-root-held.d.ts.map +0 -1
  501. package/dist/file-lock-sync-root-io.d.ts.map +0 -1
  502. package/dist/file-lock-sync-root-mutation.d.ts.map +0 -1
  503. package/dist/file-lock-sync-root-options.d.ts.map +0 -1
  504. package/dist/file-lock-sync-root-registration.d.ts.map +0 -1
  505. package/dist/file-lock-sync-root.d.ts.map +0 -1
  506. package/dist/file-lock-sync-stale-admission.d.ts.map +0 -1
  507. package/dist/file-lock-sync.d.ts.map +0 -1
  508. package/dist/file-lock.d.ts.map +0 -1
  509. package/dist/file-observation.d.ts.map +0 -1
  510. package/dist/file-store-boundary.d.ts.map +0 -1
  511. package/dist/file-store-copy-source.d.ts.map +0 -1
  512. package/dist/file-store-limit.d.ts.map +0 -1
  513. package/dist/file-store-path.d.ts.map +0 -1
  514. package/dist/file-store-prune.d.ts.map +0 -1
  515. package/dist/file-store-sync-directory.d.ts.map +0 -1
  516. package/dist/file-store-sync-write.d.ts.map +0 -1
  517. package/dist/file-store.d.ts.map +0 -1
  518. package/dist/file-sync.d.ts.map +0 -1
  519. package/dist/filename.d.ts.map +0 -1
  520. package/dist/fs.d.ts.map +0 -1
  521. package/dist/guarded-mkdir.d.ts.map +0 -1
  522. package/dist/guarded-mutation.d.ts.map +0 -1
  523. package/dist/guest-dispatch-python.d.ts.map +0 -1
  524. package/dist/guest-native-python.d.ts.map +0 -1
  525. package/dist/guest.d.ts.map +0 -1
  526. package/dist/home-dir.d.ts.map +0 -1
  527. package/dist/index.d.ts.map +0 -1
  528. package/dist/install-path.d.ts.map +0 -1
  529. package/dist/json-document-store.d.ts.map +0 -1
  530. package/dist/json-durable-queue-directory.d.ts.map +0 -1
  531. package/dist/json-durable-queue-ownership.d.ts.map +0 -1
  532. package/dist/json-durable-queue-paths.d.ts +0 -11
  533. package/dist/json-durable-queue-paths.d.ts.map +0 -1
  534. package/dist/json-durable-queue-paths.js +0 -42
  535. package/dist/json-durable-queue-read.d.ts.map +0 -1
  536. package/dist/json-durable-queue.d.ts.map +0 -1
  537. package/dist/json-store.d.ts.map +0 -1
  538. package/dist/json-stringify.d.ts.map +0 -1
  539. package/dist/json.d.ts.map +0 -1
  540. package/dist/local-file-access.d.ts.map +0 -1
  541. package/dist/local-file-descriptor.d.ts.map +0 -1
  542. package/dist/local-roots.d.ts.map +0 -1
  543. package/dist/lock-config.d.ts.map +0 -1
  544. package/dist/move-path-cleanup.d.ts.map +0 -1
  545. package/dist/move-path-stage.d.ts.map +0 -1
  546. package/dist/move-path.d.ts.map +0 -1
  547. package/dist/mutation-authority.d.ts.map +0 -1
  548. package/dist/native-binding.d.ts.map +0 -1
  549. package/dist/native-config.d.ts.map +0 -1
  550. package/dist/native-directory-observation.d.ts.map +0 -1
  551. package/dist/native-fallback-warning.d.ts.map +0 -1
  552. package/dist/native-operations.d.ts.map +0 -1
  553. package/dist/native-parent-admission.d.ts.map +0 -1
  554. package/dist/native-pinned-write-windows.d.ts.map +0 -1
  555. package/dist/native-pinned-write.d.ts.map +0 -1
  556. package/dist/native-policy-directory-observation.d.ts.map +0 -1
  557. package/dist/native-policy-parent-windows.d.ts.map +0 -1
  558. package/dist/native-rename-outcome.d.ts.map +0 -1
  559. package/dist/native-staged-file.d.ts.map +0 -1
  560. package/dist/native.d.ts.map +0 -1
  561. package/dist/opened-file-failure.d.ts.map +0 -1
  562. package/dist/opened-realpath.d.ts.map +0 -1
  563. package/dist/output.d.ts.map +0 -1
  564. package/dist/overwrite-file-handle.d.ts.map +0 -1
  565. package/dist/owner-dacl.d.ts.map +0 -1
  566. package/dist/path-case.d.ts.map +0 -1
  567. package/dist/path-policy.d.ts.map +0 -1
  568. package/dist/path-prefix.d.ts.map +0 -1
  569. package/dist/path-scope-lexical.d.ts.map +0 -1
  570. package/dist/path-segment-route.d.ts.map +0 -1
  571. package/dist/path-suffix-aliases.d.ts.map +0 -1
  572. package/dist/path.d.ts.map +0 -1
  573. package/dist/permission-exec.d.ts.map +0 -1
  574. package/dist/permissions-public.d.ts.map +0 -1
  575. package/dist/permissions-windows.d.ts.map +0 -1
  576. package/dist/permissions.d.ts.map +0 -1
  577. package/dist/pinned-mutation-admission.d.ts.map +0 -1
  578. package/dist/pinned-mutation-observation.d.ts.map +0 -1
  579. package/dist/pinned-mutation-shared-route.d.ts.map +0 -1
  580. package/dist/pinned-open.d.ts.map +0 -1
  581. package/dist/pinned-operation.d.ts.map +0 -1
  582. package/dist/pinned-write-input.d.ts.map +0 -1
  583. package/dist/pinned-write-mode.d.ts.map +0 -1
  584. package/dist/pinned-write-staged.d.ts.map +0 -1
  585. package/dist/pinned-write-types.d.ts.map +0 -1
  586. package/dist/pinned-write.d.ts.map +0 -1
  587. package/dist/positional-read.d.ts.map +0 -1
  588. package/dist/private-directory.d.ts.map +0 -1
  589. package/dist/private-producer-handoff-sync.d.ts.map +0 -1
  590. package/dist/private-producer-handoff.d.ts.map +0 -1
  591. package/dist/private-temp-workspace.d.ts.map +0 -1
  592. package/dist/publish-copy-stage.d.ts.map +0 -1
  593. package/dist/publish-file-failure.d.ts.map +0 -1
  594. package/dist/publish-file.d.ts.map +0 -1
  595. package/dist/read-open-flags.d.ts.map +0 -1
  596. package/dist/read-opened-file.d.ts.map +0 -1
  597. package/dist/realpath.d.ts.map +0 -1
  598. package/dist/recursive-mkdir-path.d.ts.map +0 -1
  599. package/dist/regular-file.d.ts.map +0 -1
  600. package/dist/replace-directory.d.ts.map +0 -1
  601. package/dist/replace-file-copy-fallback.d.ts.map +0 -1
  602. package/dist/replace-file-copy-source.d.ts.map +0 -1
  603. package/dist/replace-file-descriptor.d.ts.map +0 -1
  604. package/dist/replace-file-mode.d.ts.map +0 -1
  605. package/dist/replace-file-rename-policy.d.ts.map +0 -1
  606. package/dist/replace-file-temp-owner.d.ts.map +0 -1
  607. package/dist/replace-file.d.ts.map +0 -1
  608. package/dist/retained-directory-replacement.d.ts.map +0 -1
  609. package/dist/root-boundary.d.ts.map +0 -1
  610. package/dist/root-context.d.ts.map +0 -1
  611. package/dist/root-create-input.d.ts.map +0 -1
  612. package/dist/root-directory-creation.d.ts.map +0 -1
  613. package/dist/root-directory-list.d.ts.map +0 -1
  614. package/dist/root-directory.d.ts.map +0 -1
  615. package/dist/root-entries.d.ts.map +0 -1
  616. package/dist/root-errors.d.ts.map +0 -1
  617. package/dist/root-file-final-admission.d.ts.map +0 -1
  618. package/dist/root-file.d.ts.map +0 -1
  619. package/dist/root-impl.d.ts.map +0 -1
  620. package/dist/root-move-noreplace.d.ts.map +0 -1
  621. package/dist/root-move-preflight.d.ts.map +0 -1
  622. package/dist/root-observed-path.d.ts.map +0 -1
  623. package/dist/root-options.d.ts.map +0 -1
  624. package/dist/root-path-errors.d.ts.map +0 -1
  625. package/dist/root-path-existing.d.ts.map +0 -1
  626. package/dist/root-path-observation.d.ts.map +0 -1
  627. package/dist/root-path-stat.d.ts.map +0 -1
  628. package/dist/root-path-symlink.d.ts +0 -7
  629. package/dist/root-path-symlink.d.ts.map +0 -1
  630. package/dist/root-path-symlink.js +0 -55
  631. package/dist/root-path.d.ts.map +0 -1
  632. package/dist/root-paths-lexical.d.ts.map +0 -1
  633. package/dist/root-paths.d.ts.map +0 -1
  634. package/dist/root-read-admission.d.ts.map +0 -1
  635. package/dist/root-remove-identity.d.ts.map +0 -1
  636. package/dist/root-remove-receipt.d.ts.map +0 -1
  637. package/dist/root-remove.d.ts.map +0 -1
  638. package/dist/root-symlink-policy.d.ts.map +0 -1
  639. package/dist/root-walk.d.ts.map +0 -1
  640. package/dist/root-write-admission.d.ts.map +0 -1
  641. package/dist/root-write-compatibility.d.ts.map +0 -1
  642. package/dist/root-write-complete-parent.d.ts.map +0 -1
  643. package/dist/root-write-lock-binding.d.ts.map +0 -1
  644. package/dist/root-write-mode.d.ts.map +0 -1
  645. package/dist/root-write-publication.d.ts.map +0 -1
  646. package/dist/root-write-verification.d.ts.map +0 -1
  647. package/dist/root.d.ts.map +0 -1
  648. package/dist/safe-path-segment.d.ts.map +0 -1
  649. package/dist/secret-file.d.ts.map +0 -1
  650. package/dist/secret-read-async.d.ts.map +0 -1
  651. package/dist/secret-read-policy.d.ts.map +0 -1
  652. package/dist/secret.d.ts.map +0 -1
  653. package/dist/secure-file-windows.d.ts.map +0 -1
  654. package/dist/secure-file.d.ts.map +0 -1
  655. package/dist/secure-temp-dir.d.ts.map +0 -1
  656. package/dist/secure-temp-repair.d.ts.map +0 -1
  657. package/dist/sibling-staged-file.d.ts.map +0 -1
  658. package/dist/sibling-temp.d.ts.map +0 -1
  659. package/dist/sidecar-lock-acquire.d.ts.map +0 -1
  660. package/dist/sidecar-lock-admission-context.d.ts.map +0 -1
  661. package/dist/sidecar-lock-admission-parser.d.ts.map +0 -1
  662. package/dist/sidecar-lock-admission.d.ts.map +0 -1
  663. package/dist/sidecar-lock-handle.d.ts.map +0 -1
  664. package/dist/sidecar-lock-policy.d.ts.map +0 -1
  665. package/dist/sidecar-lock-reclaim.d.ts.map +0 -1
  666. package/dist/sidecar-lock-root.d.ts.map +0 -1
  667. package/dist/sidecar-lock-stale-admission.d.ts.map +0 -1
  668. package/dist/sidecar-lock-target.d.ts.map +0 -1
  669. package/dist/sidecar-lock-types.d.ts.map +0 -1
  670. package/dist/sidecar-lock.d.ts.map +0 -1
  671. package/dist/staged-directory.d.ts.map +0 -1
  672. package/dist/staged-file-settlement.d.ts.map +0 -1
  673. package/dist/staged-file-types.d.ts.map +0 -1
  674. package/dist/standalone-publication-path.d.ts.map +0 -1
  675. package/dist/stat-observation.d.ts.map +0 -1
  676. package/dist/store.d.ts.map +0 -1
  677. package/dist/strict-file-identity.d.ts.map +0 -1
  678. package/dist/string-coerce.d.ts.map +0 -1
  679. package/dist/suppressed-error.d.ts.map +0 -1
  680. package/dist/symlink-parents.d.ts.map +0 -1
  681. package/dist/temp-cleanup.d.ts.map +0 -1
  682. package/dist/temp-target.d.ts.map +0 -1
  683. package/dist/temp-workspace-admission.d.ts.map +0 -1
  684. package/dist/temp-workspace-child-admission.d.ts.map +0 -1
  685. package/dist/temp-workspace-descriptor.d.ts.map +0 -1
  686. package/dist/temp-workspace-identity.d.ts.map +0 -1
  687. package/dist/temp-workspace-owner.d.ts.map +0 -1
  688. package/dist/temp-workspace-permissions.d.ts.map +0 -1
  689. package/dist/temp-workspace-types.d.ts.map +0 -1
  690. package/dist/temp.d.ts.map +0 -1
  691. package/dist/test-hooks.d.ts.map +0 -1
  692. package/dist/text-atomic.d.ts.map +0 -1
  693. package/dist/timing.d.ts.map +0 -1
  694. package/dist/trash.d.ts.map +0 -1
  695. package/dist/types.d.ts.map +0 -1
  696. package/dist/unicode-path.d.ts.map +0 -1
  697. package/dist/walk.d.ts.map +0 -1
  698. package/dist/windows-command.d.ts.map +0 -1
  699. package/dist/windows-owner.d.ts.map +0 -1
  700. package/dist/windows-path-alias.d.ts.map +0 -1
  701. package/dist/windows-security-command.d.ts.map +0 -1
  702. package/dist/windows-security-facts.d.ts.map +0 -1
  703. package/dist/write-file-handle.d.ts.map +0 -1
  704. package/dist/write-open-flags.d.ts.map +0 -1
  705. package/dist/write-queue.d.ts.map +0 -1
@@ -5,16 +5,16 @@ import { fileObservation } from "./file-observation.js";
5
5
  import { readFileHandleBounded } from "./bounded-read.js";
6
6
  import { openSidecarRoot } from "./sidecar-lock-root.js";
7
7
  import { createNativeExclusiveFile } from "./native-operations.js";
8
- import { computeSidecarLockDelayMs, isTransientLockFileDenial, maxTransientLockDenials, validateSidecarLockStaleMs, validateSidecarLockRetryOptions, validateSidecarLockCompromiseCheckIntervalMs, validateSidecarLockTimeoutMs, } from "./sidecar-lock-policy.js";
8
+ import { sidecarLockRetryDelay, sidecarLockTimeout, isTransientLockFileDenial, maxTransientLockDenials, validateSidecarLockStaleMs, validateSidecarLockRetryOptions, validateSidecarLockCompromiseCheckIntervalMs, validateSidecarLockTimeoutMs, } from "./sidecar-lock-policy.js";
9
9
  import { relativeSidecarLockPath, removeSidecarLockIfUnchanged, serializeSidecarLockPayload, sidecarReclaimGuardExists, } from "./sidecar-lock-reclaim.js";
10
10
  import { awaitSidecarAdmissionBoundary, conditionalSidecarLockParser, observeHeldSidecarParser, observeSidecarLockParser, runSidecarAdmissionBoundary, } from "./sidecar-lock-admission-parser.js";
11
11
  import { handleStaleSidecarAdmission, } from "./sidecar-lock-stale-admission.js";
12
12
  import { ancestryHasSidecarAdmission, captureSidecarAdmissionAncestry, createSidecarAdmissionController, } from "./sidecar-lock-admission-context.js";
13
- import { sidecarLockTimeout } from "./sidecar-lock-admission.js";
14
13
  import { resolveSidecarLockPaths } from "./sidecar-lock-target.js";
15
14
  import { createSuppressedError } from "./suppressed-error.js";
16
15
  import { sleep } from "./timing.js";
17
16
  import { sidecarExclusiveCreate } from "./root-create-input.js";
17
+ import { stopSidecarLockMonitoring } from "./sidecar-lock-handle.js";
18
18
  export async function acquireSidecarLock(options, context) {
19
19
  const admissionAncestry = captureSidecarAdmissionAncestry();
20
20
  const retainOnExit = options.retainOnExit;
@@ -33,11 +33,25 @@ export async function acquireSidecarLock(options, context) {
33
33
  const requestedReentrantOwner = options.reentrantOwner;
34
34
  const { lockPath, normalizedTargetPath } = await resolveSidecarLockPaths(targetPath, explicitLockPath, lockRoot);
35
35
  const activeDescendant = ancestryHasSidecarAdmission(admissionAncestry, context.admissions, normalizedTargetPath);
36
- let held = context.held.get(normalizedTargetPath);
37
- if (held &&
36
+ const isReentrant = (candidate) => !!candidate &&
38
37
  requestedReentrantOwner !== undefined &&
39
- held.reentrantOwner !== undefined &&
40
- requestedReentrantOwner === held.reentrantOwner) {
38
+ candidate.reentrantOwner !== undefined &&
39
+ requestedReentrantOwner === candidate.reentrantOwner;
40
+ const reuseHeldLock = (candidate) => {
41
+ const lifecycle = context.ensureExitCleanupRegistered();
42
+ context.assertRetainOnExitSupported(retainOnExit);
43
+ if (context.held.get(normalizedTargetPath) !== candidate || candidate.releasePromise)
44
+ return undefined;
45
+ candidate.refCount = (candidate.refCount ?? 1) + 1;
46
+ // Any same-owner request upgrades exit retention; later requests never revoke it.
47
+ if (retainOnExit === true)
48
+ candidate.retainOnExit = true;
49
+ const returnedHandle = context.handleForHeldLock(normalizedTargetPath, candidate);
50
+ context.armExitCleanup(lifecycle);
51
+ return returnedHandle;
52
+ };
53
+ let held = context.held.get(normalizedTargetPath);
54
+ if (isReentrant(held)) {
41
55
  // Join a final release before deciding whether this completed owner remains.
42
56
  // Successful cleanup requires a fresh acquisition; failed cleanup can retry.
43
57
  if (held.releasePromise) {
@@ -46,23 +60,10 @@ export async function acquireSidecarLock(options, context) {
46
60
  await held.releasePromise.catch(() => undefined);
47
61
  held = context.held.get(normalizedTargetPath);
48
62
  }
49
- if (held &&
50
- requestedReentrantOwner !== undefined &&
51
- held.reentrantOwner !== undefined &&
52
- requestedReentrantOwner === held.reentrantOwner) {
53
- const lifecycle = context.ensureExitCleanupRegistered();
54
- context.assertRetainOnExitSupported(retainOnExit);
55
- if (context.held.get(normalizedTargetPath) === held && !held.releasePromise) {
56
- held.refCount = (held.refCount ?? 1) + 1;
57
- // Retention is monotonic: any same-owner request to keep the sidecar on
58
- // exit upgrades the held lock; a later default acquisition never revokes it.
59
- if (retainOnExit === true) {
60
- held.retainOnExit = true;
61
- }
62
- const returnedHandle = context.handleForHeldLock(normalizedTargetPath, held);
63
- context.armExitCleanup(lifecycle);
64
- return returnedHandle;
65
- }
63
+ if (isReentrant(held)) {
64
+ const reused = reuseHeldLock(held);
65
+ if (reused)
66
+ return reused;
66
67
  }
67
68
  }
68
69
  if (activeDescendant)
@@ -89,17 +90,9 @@ export async function acquireSidecarLock(options, context) {
89
90
  const withinDenialBudget = () => ++transientDenials <= maxTransientLockDenials;
90
91
  const waitForRetry = async () => {
91
92
  admission.release();
92
- const elapsed = Date.now() - startedAt;
93
- if ((timeoutMs !== undefined &&
94
- timeoutMs !== Number.POSITIVE_INFINITY &&
95
- elapsed >= timeoutMs) ||
96
- (retry.retries !== undefined && attempt >= retry.retries)) {
93
+ const delay = sidecarLockRetryDelay(retry, timeoutMs === Number.POSITIVE_INFINITY ? undefined : timeoutMs, Date.now() - startedAt, attempt);
94
+ if (delay === undefined)
97
95
  throw sidecarLockTimeout(lockPath, normalizedTargetPath);
98
- }
99
- const remaining = timeoutMs === undefined || timeoutMs === Number.POSITIVE_INFINITY
100
- ? Number.POSITIVE_INFINITY
101
- : Math.max(0, timeoutMs - elapsed);
102
- const delay = Math.min(computeSidecarLockDelayMs(retry, attempt), remaining);
103
96
  attempt += 1;
104
97
  await sleep(delay);
105
98
  };
@@ -122,29 +115,16 @@ export async function acquireSidecarLock(options, context) {
122
115
  while (true) {
123
116
  if (!admission.owns) {
124
117
  held = context.held.get(normalizedTargetPath);
125
- if (held &&
126
- requestedReentrantOwner !== undefined &&
127
- held.reentrantOwner !== undefined &&
128
- requestedReentrantOwner === held.reentrantOwner) {
118
+ if (isReentrant(held)) {
129
119
  if (held.releasePromise) {
130
120
  await held.releasePromise.catch(() => undefined);
131
121
  held = context.held.get(normalizedTargetPath);
132
122
  }
133
- if (held &&
134
- requestedReentrantOwner !== undefined &&
135
- held.reentrantOwner !== undefined &&
136
- requestedReentrantOwner === held.reentrantOwner) {
137
- const lifecycle = context.ensureExitCleanupRegistered();
138
- context.assertRetainOnExitSupported(retainOnExit);
139
- if (context.held.get(normalizedTargetPath) !== held || held.releasePromise) {
140
- continue;
141
- }
142
- held.refCount = (held.refCount ?? 1) + 1;
143
- if (retainOnExit === true)
144
- held.retainOnExit = true;
145
- const returnedHandle = context.handleForHeldLock(normalizedTargetPath, held);
146
- context.armExitCleanup(lifecycle);
147
- return returnedHandle;
123
+ if (isReentrant(held)) {
124
+ const reused = reuseHeldLock(held);
125
+ if (reused)
126
+ return reused;
127
+ continue;
148
128
  }
149
129
  }
150
130
  if (context.admissions.has(normalizedTargetPath)) {
@@ -353,8 +333,7 @@ export async function acquireSidecarLock(options, context) {
353
333
  .catch(() => false)
354
334
  .then((stillHeld) => {
355
335
  if (!stillHeld && candidateHeld.compromiseTimer) {
356
- clearInterval(candidateHeld.compromiseTimer);
357
- candidateHeld.compromiseTimer = undefined;
336
+ stopSidecarLockMonitoring(candidateHeld);
358
337
  Reflect.apply(compromisedCallback, options, [{ lockPath, normalizedTargetPath }]);
359
338
  }
360
339
  })
@@ -376,10 +355,8 @@ export async function acquireSidecarLock(options, context) {
376
355
  }
377
356
  catch (err) {
378
357
  try {
379
- if (createdHeld?.compromiseTimer) {
380
- clearInterval(createdHeld.compromiseTimer);
381
- createdHeld.compromiseTimer = undefined;
382
- }
358
+ if (createdHeld)
359
+ stopSidecarLockMonitoring(createdHeld);
383
360
  if (handle) {
384
361
  const failedSnapshot = createdSnapshot ?? { payload: null };
385
362
  try {
@@ -16,4 +16,3 @@ export declare function createSidecarAdmissionController(ancestry: SidecarAdmiss
16
16
  run<T>(callback: () => T): T;
17
17
  };
18
18
  export {};
19
- //# sourceMappingURL=sidecar-lock-admission-context.d.ts.map
@@ -40,4 +40,3 @@ export declare function observeHeldSidecarParser(params: {
40
40
  isTransientDenial(error: unknown): boolean;
41
41
  }): Promise<HeldSidecarParserObservation>;
42
42
  export {};
43
- //# sourceMappingURL=sidecar-lock-admission-parser.d.ts.map
@@ -2,11 +2,10 @@ import type { NativeFileHandle } from "./native-operations.js";
2
2
  import type { Root } from "./root-impl.js";
3
3
  import type { SidecarLockSnapshot } from "./sidecar-lock-reclaim.js";
4
4
  import type { SidecarLockHandle } from "./sidecar-lock-types.js";
5
- type SidecarFileHandle = Pick<NativeFileHandle, "fd" | "close" | "stat" | "writeFile">;
6
5
  export type HeldSidecarLock = {
7
6
  refCount: number;
8
7
  reentrantOwner?: string;
9
- handle: SidecarFileHandle;
8
+ handle: NativeFileHandle;
10
9
  lockPath: string;
11
10
  snapshot: SidecarLockSnapshot;
12
11
  acquiredAt: number;
@@ -30,6 +29,3 @@ export type SidecarLockAcquisitionContext = {
30
29
  assertRetainOnExitSupported(retainOnExit: boolean | undefined): void;
31
30
  handleForHeldLock(normalizedTargetPath: string, held: HeldSidecarLock): SidecarLockHandle;
32
31
  };
33
- export declare function sidecarLockTimeout(lockPath: string, normalizedTargetPath: string): Error;
34
- export {};
35
- //# sourceMappingURL=sidecar-lock-admission.d.ts.map
@@ -1,7 +1 @@
1
- export function sidecarLockTimeout(lockPath, normalizedTargetPath) {
2
- return Object.assign(new Error(`file lock timeout for ${normalizedTargetPath}`), {
3
- code: "file_lock_timeout",
4
- lockPath,
5
- normalizedTargetPath,
6
- });
7
- }
1
+ export {};
@@ -1,6 +1,9 @@
1
1
  import type { Root } from "./root-impl.js";
2
2
  import { type SidecarLockSnapshot } from "./sidecar-lock-reclaim.js";
3
3
  import type { SidecarLockHandle } from "./sidecar-lock-types.js";
4
+ export declare function stopSidecarLockMonitoring(held: {
5
+ compromiseTimer?: NodeJS.Timeout;
6
+ }): void;
4
7
  export declare function createSidecarLockHandle(params: {
5
8
  lockPath: string;
6
9
  normalizedTargetPath: string;
@@ -21,4 +24,3 @@ export declare function createHeldSidecarLockHandle(params: {
21
24
  retry?: boolean;
22
25
  }) => Promise<unknown>;
23
26
  }): SidecarLockHandle;
24
- //# sourceMappingURL=sidecar-lock-handle.d.ts.map
@@ -1,4 +1,10 @@
1
1
  import { sidecarLockSnapshotStillPresent, } from "./sidecar-lock-reclaim.js";
2
+ export function stopSidecarLockMonitoring(held) {
3
+ const timer = held.compromiseTimer;
4
+ held.compromiseTimer = undefined;
5
+ if (timer)
6
+ clearInterval(timer);
7
+ }
2
8
  export function createSidecarLockHandle(params) {
3
9
  let released = false;
4
10
  let releasePromise;
@@ -4,6 +4,9 @@ export declare function validateSidecarLockTimeoutMs(timeoutMs: number | undefin
4
4
  export declare function validateSidecarLockStaleMs(staleMs: number | undefined): void;
5
5
  export declare function validateSidecarLockCompromiseCheckIntervalMs(intervalMs: number | undefined): void;
6
6
  export declare function computeSidecarLockDelayMs(retry: SidecarLockRetryOptions, attempt: number): number;
7
+ export declare function sidecarLockTimeout(lockPath: string, normalizedTargetPath: string): Error;
8
+ /** Undefined means the deadline or retry count is exhausted. */
9
+ export declare function sidecarLockRetryDelay(retry: SidecarLockRetryOptions, timeoutMs: number | undefined, elapsed: number, attempt: number): number | undefined;
7
10
  export declare const maxTransientLockDenials = 8;
8
11
  export declare function isTransientLockFileDenial(error: unknown, lockPath: string): boolean;
9
12
  export declare function sidecarLockPayloadCreatedAtMs(payload: unknown): number | null;
@@ -13,4 +16,3 @@ export declare function defaultSidecarLockShouldReclaim(params: {
13
16
  staleMs: number;
14
17
  nowMs: number;
15
18
  }): Promise<boolean>;
16
- //# sourceMappingURL=sidecar-lock-policy.d.ts.map
@@ -55,6 +55,22 @@ export function computeSidecarLockDelayMs(retry, attempt) {
55
55
  const jitter = retry.randomize ? 1 + Math.random() : 1;
56
56
  return Math.min(maxTimeout, Math.round(base * jitter));
57
57
  }
58
+ export function sidecarLockTimeout(lockPath, normalizedTargetPath) {
59
+ return Object.assign(new Error(`file lock timeout for ${normalizedTargetPath}`), {
60
+ code: "file_lock_timeout",
61
+ lockPath,
62
+ normalizedTargetPath,
63
+ });
64
+ }
65
+ /** Undefined means the deadline or retry count is exhausted. */
66
+ export function sidecarLockRetryDelay(retry, timeoutMs, elapsed, attempt) {
67
+ if ((timeoutMs !== undefined && elapsed >= timeoutMs) ||
68
+ (retry.retries !== undefined && attempt >= retry.retries))
69
+ return undefined;
70
+ const remaining = timeoutMs === undefined || timeoutMs === Number.POSITIVE_INFINITY
71
+ ? Number.POSITIVE_INFINITY : Math.max(0, timeoutMs - elapsed);
72
+ return Math.min(computeSidecarLockDelayMs(retry, attempt), remaining);
73
+ }
58
74
  // Windows denies access to a lock file while a just-unlinked directory entry
59
75
  // is still being torn down, so a contended acquire sees EPERM on a name that is
60
76
  // already gone -- both when creating it exclusively and when reading the
@@ -39,7 +39,7 @@ export declare function readSidecarLockRawSnapshotSync(lockPath: string, options
39
39
  onOpenFailure?: (error: unknown) => void;
40
40
  }): SidecarLockRawSnapshot | null;
41
41
  export declare function removeSidecarLockIfUnchangedSync(lockPath: string, observed: SidecarLockSnapshot, assertAuthorized?: () => void): boolean;
42
- export declare function sidecarLockSnapshotMatches(current: SidecarLockSnapshot, observed: SidecarLockSnapshot): boolean;
42
+ export declare function sidecarLockSnapshotMatches(current: SidecarLockRawSnapshot | SidecarLockSnapshot, observed: SidecarLockSnapshot): boolean;
43
43
  export declare function removeSidecarLockIfUnchanged(lockPath: string, observed: SidecarLockSnapshot | null, options?: {
44
44
  lockRoot?: Root;
45
45
  parsePayload?: (raw: string) => unknown;
@@ -65,4 +65,3 @@ export declare function removeStaleSidecarLockIfAllowed(params: {
65
65
  assertGuardHeld?: () => Promise<void>;
66
66
  }): Promise<"removed" | "changed" | "not-approved">;
67
67
  export {};
68
- //# sourceMappingURL=sidecar-lock-reclaim.d.ts.map
@@ -71,6 +71,12 @@ function missingSnapshotPath(error) {
71
71
  export async function readSidecarLockSnapshot(lockPath, options = {}) {
72
72
  return parseSidecarLockSnapshot(await readSidecarLockRawSnapshot(lockPath, options), options.parsePayload);
73
73
  }
74
+ async function readSidecarLockComparisonSnapshot(lockPath, options) {
75
+ const snapshot = await readSidecarLockRawSnapshot(lockPath, options);
76
+ const parsePayload = options?.parsePayload;
77
+ // Ownership uses raw bytes and identity, but custom parsers retain their effects.
78
+ return parsePayload ? parseSidecarLockSnapshot(snapshot, parsePayload) : snapshot;
79
+ }
74
80
  export async function readSidecarLockRawSnapshot(lockPath, options = {}) {
75
81
  let handle;
76
82
  try {
@@ -197,7 +203,6 @@ export function readSidecarLockRawSnapshotSync(lockPath, options = {}) {
197
203
  return {
198
204
  raw,
199
205
  stat: after,
200
- ownershipToken: readSidecarLockOwnershipToken(raw),
201
206
  };
202
207
  }
203
208
  finally {
@@ -207,7 +212,7 @@ export function readSidecarLockRawSnapshotSync(lockPath, options = {}) {
207
212
  }
208
213
  export function removeSidecarLockIfUnchangedSync(lockPath, observed, assertAuthorized) {
209
214
  assertAuthorized?.();
210
- const current = readSidecarLockSnapshotSync(lockPath);
215
+ const current = readSidecarLockRawSnapshotSync(lockPath);
211
216
  assertAuthorized?.();
212
217
  if (!current || !sidecarLockSnapshotMatches(current, observed))
213
218
  return false;
@@ -219,10 +224,8 @@ export function sidecarLockSnapshotMatches(current, observed) {
219
224
  if (observed.ownershipToken !== undefined) {
220
225
  return (current.stat?.isFile() === true &&
221
226
  current.raw !== undefined &&
222
- observed.raw !== undefined &&
223
- readSidecarLockOwnershipToken(current.raw) === observed.ownershipToken &&
224
- readSidecarLockOwnershipToken(observed.raw) === observed.ownershipToken &&
225
- current.raw === observed.raw);
227
+ current.raw === observed.raw &&
228
+ readSidecarLockOwnershipToken(current.raw) === observed.ownershipToken);
226
229
  }
227
230
  if (observed.stat &&
228
231
  current.stat &&
@@ -235,7 +238,7 @@ export function sidecarLockSnapshotMatches(current, observed) {
235
238
  return observed.stat !== undefined && current.stat !== undefined;
236
239
  }
237
240
  export async function removeSidecarLockIfUnchanged(lockPath, observed, options = {}) {
238
- const current = await readSidecarLockSnapshot(lockPath, {
241
+ const current = await readSidecarLockComparisonSnapshot(lockPath, {
239
242
  ...options,
240
243
  allowDescriptorIdentityDrift: observed?.ownershipToken !== undefined,
241
244
  });
@@ -251,7 +254,7 @@ export async function removeSidecarLockIfUnchanged(lockPath, observed, options =
251
254
  return true;
252
255
  }
253
256
  export async function sidecarLockSnapshotStillPresent(lockPath, observed, options = {}) {
254
- const current = await readSidecarLockSnapshot(lockPath, {
257
+ const current = await readSidecarLockComparisonSnapshot(lockPath, {
255
258
  ...options,
256
259
  allowDescriptorIdentityDrift: observed?.ownershipToken !== undefined,
257
260
  });
@@ -0,0 +1,13 @@
1
+ type CleanupRegistration = {
2
+ event: "exit" | "beforeExit";
3
+ registered: symbol;
4
+ registering: symbol;
5
+ handler: symbol;
6
+ retainAware?: symbol;
7
+ reentryError(): Error;
8
+ };
9
+ /** Preserve the legacy, first-registration-wins protocol across package copies. */
10
+ export declare function ensureSidecarLockCleanupRegistered<T extends true | {
11
+ armed: boolean;
12
+ }>(keys: CleanupRegistration, cleanup: () => void, marker: T): T;
13
+ export {};
@@ -0,0 +1,47 @@
1
+ /** Preserve the legacy, first-registration-wins protocol across package copies. */
2
+ export function ensureSidecarLockCleanupRegistered(keys, cleanup, marker) {
3
+ const state = globalThis;
4
+ if (state[keys.registered])
5
+ return state[keys.registered];
6
+ // process.on emits newListener synchronously; reentry cannot wait for it.
7
+ if (state[keys.registering])
8
+ throw keys.reentryError();
9
+ const registration = {};
10
+ const commit = () => {
11
+ state[keys.handler] = cleanup;
12
+ if (keys.retainAware)
13
+ state[keys.retainAware] = true;
14
+ state[keys.registered] = marker;
15
+ };
16
+ state[keys.registering] = registration;
17
+ try {
18
+ process.on(keys.event, cleanup);
19
+ commit();
20
+ return marker;
21
+ }
22
+ catch (error) {
23
+ if (process.listeners(keys.event).includes(cleanup)) {
24
+ try {
25
+ process.off(keys.event, cleanup);
26
+ }
27
+ catch {
28
+ // Reconcile the marker with the actual listener below.
29
+ }
30
+ }
31
+ if (process.listeners(keys.event).includes(cleanup)) {
32
+ commit();
33
+ }
34
+ else {
35
+ if (state[keys.handler] === cleanup)
36
+ delete state[keys.handler];
37
+ // Only the before-exit lifecycle has an individually owned marker.
38
+ if (marker !== true && state[keys.registered] === marker)
39
+ delete state[keys.registered];
40
+ }
41
+ throw error;
42
+ }
43
+ finally {
44
+ if (state[keys.registering] === registration)
45
+ delete state[keys.registering];
46
+ }
47
+ }
@@ -1,3 +1,2 @@
1
1
  import type { OpenResult, Root } from "./root-impl.js";
2
2
  export declare function openSidecarRoot(lockRoot: Root, relative: string, discardObservation?: "unlinked" | "changed", onOpenFailure?: (error: unknown) => void): Promise<OpenResult | null>;
3
- //# sourceMappingURL=sidecar-lock-root.d.ts.map
@@ -36,4 +36,3 @@ export declare function handleStaleSidecarAdmission<TPayload extends Record<stri
36
36
  waitForRetry(): Promise<void>;
37
37
  }): Promise<void>;
38
38
  export {};
39
- //# sourceMappingURL=sidecar-lock-stale-admission.d.ts.map
@@ -5,4 +5,3 @@ export declare function resolveSidecarLockPaths(targetPath: string, explicitLock
5
5
  lockPath: string;
6
6
  normalizedTargetPath: string;
7
7
  }>;
8
- //# sourceMappingURL=sidecar-lock-target.d.ts.map
@@ -60,4 +60,3 @@ export type SidecarLockHeldEntry = {
60
60
  export type WithSidecarLockOptions<TPayload extends Record<string, unknown>> = Omit<SidecarLockAcquireOptions<TPayload>, "targetPath"> & {
61
61
  managerKey?: string;
62
62
  };
63
- //# sourceMappingURL=sidecar-lock-types.d.ts.map
@@ -11,4 +11,3 @@ export declare function createSidecarLockManager(key: string): {
11
11
  heldEntries: () => SidecarLockHeldEntry[];
12
12
  };
13
13
  export declare function withSidecarLock<T, TPayload extends Record<string, unknown>>(targetPath: string, options: WithSidecarLockOptions<TPayload>, fn: () => Promise<T>): Promise<T>;
14
- //# sourceMappingURL=sidecar-lock.d.ts.map
@@ -3,8 +3,9 @@ import { FsSafeError } from "./errors.js";
3
3
  import { sameFileIdentity } from "./file-identity.js";
4
4
  import { removeSidecarLockIfUnchanged, sidecarLockSnapshotMatches, } from "./sidecar-lock-reclaim.js";
5
5
  import { acquireSidecarLock } from "./sidecar-lock-acquire.js";
6
- import { createHeldSidecarLockHandle } from "./sidecar-lock-handle.js";
6
+ import { createHeldSidecarLockHandle, stopSidecarLockMonitoring } from "./sidecar-lock-handle.js";
7
7
  import { createSuppressedError } from "./suppressed-error.js";
8
+ import { ensureSidecarLockCleanupRegistered } from "./sidecar-lock-registration.js";
8
9
  const GLOBAL_STATE_KEY = Symbol.for("fsSafe.sidecarLockManagers");
9
10
  const GLOBAL_CLEANUP_KEY = Symbol.for("fsSafe.sidecarLockCleanupRegistered");
10
11
  const GLOBAL_CLEANUP_HANDLER_KEY = Symbol.for("fsSafe.sidecarLockCleanupHandler");
@@ -101,6 +102,7 @@ function releaseAllReclaimGuardsSync(state) {
101
102
  }
102
103
  function releaseAllLocksSync(state, options) {
103
104
  for (const [normalizedTargetPath, held] of state.held) {
105
+ stopSidecarLockMonitoring(held);
104
106
  void held.handle.close().catch(() => undefined);
105
107
  try {
106
108
  const retained = options?.preserveRetained === true && held.retainOnExit;
@@ -117,51 +119,19 @@ function releaseAllLocksSync(state, options) {
117
119
  releaseAllReclaimGuardsSync(state);
118
120
  }
119
121
  function ensureGlobalExitCleanupRegistered() {
120
- const globalWithCleanup = globalThis;
121
- if (globalWithCleanup[GLOBAL_CLEANUP_KEY])
122
- return;
123
- if (globalWithCleanup[GLOBAL_CLEANUP_REGISTRATION_KEY]) {
124
- throw new FsSafeError("helper-unavailable", "sidecar lock exit cleanup registration is already in progress");
125
- }
126
- const registration = {};
127
122
  const cleanup = () => {
128
123
  for (const state of getGlobalManagers().values()) {
129
124
  releaseAllLocksSync(state, { preserveRetained: true });
130
125
  }
131
126
  };
132
- globalWithCleanup[GLOBAL_CLEANUP_REGISTRATION_KEY] = registration;
133
- try {
134
- process.on("exit", cleanup);
135
- globalWithCleanup[GLOBAL_CLEANUP_HANDLER_KEY] = cleanup;
136
- globalWithCleanup[GLOBAL_RETAIN_AWARE_KEY] = true;
137
- globalWithCleanup[GLOBAL_CLEANUP_KEY] = true;
138
- }
139
- catch (error) {
140
- if (process.listeners("exit").includes(cleanup)) {
141
- try {
142
- process.off("exit", cleanup);
143
- }
144
- catch {
145
- // Reconcile the marker with the actual listener below.
146
- }
147
- }
148
- if (process.listeners("exit").includes(cleanup)) {
149
- globalWithCleanup[GLOBAL_CLEANUP_HANDLER_KEY] = cleanup;
150
- globalWithCleanup[GLOBAL_RETAIN_AWARE_KEY] = true;
151
- globalWithCleanup[GLOBAL_CLEANUP_KEY] = true;
152
- }
153
- else {
154
- if (globalWithCleanup[GLOBAL_CLEANUP_HANDLER_KEY] === cleanup) {
155
- delete globalWithCleanup[GLOBAL_CLEANUP_HANDLER_KEY];
156
- }
157
- }
158
- throw error;
159
- }
160
- finally {
161
- if (globalWithCleanup[GLOBAL_CLEANUP_REGISTRATION_KEY] === registration) {
162
- delete globalWithCleanup[GLOBAL_CLEANUP_REGISTRATION_KEY];
163
- }
164
- }
127
+ ensureSidecarLockCleanupRegistered({
128
+ event: "exit",
129
+ registered: GLOBAL_CLEANUP_KEY,
130
+ registering: GLOBAL_CLEANUP_REGISTRATION_KEY,
131
+ handler: GLOBAL_CLEANUP_HANDLER_KEY,
132
+ retainAware: GLOBAL_RETAIN_AWARE_KEY,
133
+ reentryError: () => new FsSafeError("helper-unavailable", "sidecar lock exit cleanup registration is already in progress"),
134
+ }, cleanup, true);
165
135
  }
166
136
  /** True when a retain-unaware package copy registered the process-exit handlers first. */
167
137
  export function exitCleanupCannotRetain() {
@@ -169,16 +139,8 @@ export function exitCleanupCannotRetain() {
169
139
  return globalWithCleanup[GLOBAL_CLEANUP_KEY] === true && globalWithCleanup[GLOBAL_RETAIN_AWARE_KEY] !== true;
170
140
  }
171
141
  function ensureGlobalBeforeExitCleanupRegistered() {
172
- const globalWithCleanup = globalThis;
173
- if (globalWithCleanup[GLOBAL_BEFORE_EXIT_KEY]) {
174
- return globalWithCleanup[GLOBAL_BEFORE_EXIT_KEY];
175
- }
176
- if (globalWithCleanup[GLOBAL_BEFORE_EXIT_REGISTRATION_KEY]) {
177
- throw new FsSafeError("helper-unavailable", "sidecar lock before-exit cleanup registration is already in progress");
178
- }
179
142
  // Independent of the exit registration, which an older package copy may own.
180
143
  const lifecycle = { armed: false };
181
- const registration = {};
182
144
  const cleanup = () => {
183
145
  if (!lifecycle.armed)
184
146
  return;
@@ -192,41 +154,13 @@ function ensureGlobalBeforeExitCleanupRegistered() {
192
154
  }
193
155
  }
194
156
  };
195
- globalWithCleanup[GLOBAL_BEFORE_EXIT_REGISTRATION_KEY] = registration;
196
- try {
197
- process.on("beforeExit", cleanup);
198
- globalWithCleanup[GLOBAL_BEFORE_EXIT_HANDLER_KEY] = cleanup;
199
- globalWithCleanup[GLOBAL_BEFORE_EXIT_KEY] = lifecycle;
200
- return lifecycle;
201
- }
202
- catch (error) {
203
- if (process.listeners("beforeExit").includes(cleanup)) {
204
- try {
205
- process.off("beforeExit", cleanup);
206
- }
207
- catch {
208
- // Reconcile the marker with the actual listener below.
209
- }
210
- }
211
- if (process.listeners("beforeExit").includes(cleanup)) {
212
- globalWithCleanup[GLOBAL_BEFORE_EXIT_HANDLER_KEY] = cleanup;
213
- globalWithCleanup[GLOBAL_BEFORE_EXIT_KEY] = lifecycle;
214
- }
215
- else {
216
- if (globalWithCleanup[GLOBAL_BEFORE_EXIT_HANDLER_KEY] === cleanup) {
217
- delete globalWithCleanup[GLOBAL_BEFORE_EXIT_HANDLER_KEY];
218
- }
219
- if (globalWithCleanup[GLOBAL_BEFORE_EXIT_KEY] === lifecycle) {
220
- delete globalWithCleanup[GLOBAL_BEFORE_EXIT_KEY];
221
- }
222
- }
223
- throw error;
224
- }
225
- finally {
226
- if (globalWithCleanup[GLOBAL_BEFORE_EXIT_REGISTRATION_KEY] === registration) {
227
- delete globalWithCleanup[GLOBAL_BEFORE_EXIT_REGISTRATION_KEY];
228
- }
229
- }
157
+ return ensureSidecarLockCleanupRegistered({
158
+ event: "beforeExit",
159
+ registered: GLOBAL_BEFORE_EXIT_KEY,
160
+ registering: GLOBAL_BEFORE_EXIT_REGISTRATION_KEY,
161
+ handler: GLOBAL_BEFORE_EXIT_HANDLER_KEY,
162
+ reentryError: () => new FsSafeError("helper-unavailable", "sidecar lock before-exit cleanup registration is already in progress"),
163
+ }, cleanup, lifecycle);
230
164
  }
231
165
  async function releaseHeldLock(state, normalizedTargetPath, held, options = {}) {
232
166
  const current = state.held.get(normalizedTargetPath);
@@ -257,10 +191,7 @@ async function releaseHeldLock(state, normalizedTargetPath, held, options = {})
257
191
  if (state.held.get(normalizedTargetPath) === held) {
258
192
  state.held.delete(normalizedTargetPath);
259
193
  }
260
- if (held.compromiseTimer) {
261
- clearInterval(held.compromiseTimer);
262
- held.compromiseTimer = undefined;
263
- }
194
+ stopSidecarLockMonitoring(held);
264
195
  })();
265
196
  try {
266
197
  await held.releasePromise;
@@ -1,4 +1,4 @@
1
- import { type BigIntStats } from "node:fs";
1
+ import { type BigIntStats, type Stats } from "node:fs";
2
2
  import type { DirectoryReceipt } from "./directory-durability.js";
3
3
  import type { FileIdentityStat } from "./file-identity.js";
4
4
  import type { NativeBinding } from "./native-binding.js";
@@ -21,8 +21,7 @@ export declare function assertStagedDirectoryCurrent(receipt: StagedDirectorySna
21
21
  export declare function describePolicyStagedDirectory(fd: number, pathname: string, binding?: NativeBinding): PolicyStagedDirectory;
22
22
  export declare function assertPolicyStagedDirectoryCurrent(captured: PolicyStagedDirectory): BigIntStats;
23
23
  export declare function refreshPolicyStagedDirectoryObservation(captured: PolicyStagedDirectory): MutationDirectoryObservation;
24
- export declare function openStagedDirectory(directory: string | DirectoryReceipt): {
24
+ export declare function openStagedDirectory(directory: string | DirectoryReceipt<Stats | BigIntStats>): {
25
25
  fd: number;
26
26
  receipt: StagedDirectorySnapshot;
27
27
  };
28
- //# sourceMappingURL=staged-directory.d.ts.map
@@ -14,4 +14,3 @@ export declare function settleStagedFile(params: {
14
14
  cleanup: () => Promise<StagedFileCleanupReceipt["status"]>;
15
15
  close: readonly (() => Promise<void> | void)[];
16
16
  }): Promise<void>;
17
- //# sourceMappingURL=staged-file-settlement.d.ts.map
@@ -53,4 +53,3 @@ export interface StagedFile extends AsyncDisposable {
53
53
  }): Promise<PublishedFileReceipt>;
54
54
  cleanup(): Promise<StagedFileCleanupReceipt>;
55
55
  }
56
- //# sourceMappingURL=staged-file-types.d.ts.map
@@ -1,2 +1 @@
1
1
  export declare function admitStandalonePublicationPath(value: string, message?: string): string;
2
- //# sourceMappingURL=standalone-publication-path.d.ts.map
@@ -8,4 +8,3 @@ export type StatObservationReceipt = {
8
8
  export declare function inspectStatObservationSync(inspect: (bigint: boolean) => Stats | BigIntStats, expected?: ExactStatIdentity, initial?: Stats | BigIntStats, platform?: NodeJS.Platform): StatObservationReceipt;
9
9
  /** Revalidate an exact identity without allocating a receipt that the caller will discard. */
10
10
  export declare function assertStatObservationSync(inspect: (bigint: boolean) => Stats | BigIntStats, expected: ExactStatIdentity, initial?: Stats | BigIntStats, platform?: NodeJS.Platform): Stats | BigIntStats;
11
- //# sourceMappingURL=stat-observation.d.ts.map
package/dist/store.d.ts CHANGED
@@ -1,4 +1,3 @@
1
1
  export { fileStore, fileStoreSync, type FileStore, type FileStoreOptions, type FileStorePruneOptions, type FileStoreReadOptions, type FileStoreSync, type FileStoreWriteOptions, } from "./file-store.js";
2
2
  export { jsonStore, type JsonStore, type JsonFileStoreOptions, type JsonStoreLockOptions, type JsonStoreOptions, } from "./json-store.js";
3
3
  export { ackJsonDurableQueueEntry, ensureJsonDurableQueueDirs, jsonDurableQueueEntryExists, loadJsonDurableQueueEntry, loadPendingJsonDurableQueueEntries, moveJsonDurableQueueEntryToFailed, readJsonDurableQueueEntry, resolveJsonDurableQueueEntryPaths, unlinkBestEffort, writeJsonDurableQueueEntry, type JsonDurableQueueEntryPaths, type JsonDurableQueueLoadOptions, type JsonDurableQueueReadResult, } from "./json-durable-queue.js";
4
- //# sourceMappingURL=store.d.ts.map
@@ -1,6 +1,5 @@
1
1
  import type { BigIntStats } from "node:fs";
2
2
  type ExactFileIdentity = Pick<BigIntStats, "dev" | "ino">;
3
3
  export declare function inspectFileIdentity<T extends ExactFileIdentity>(inspect: () => T | Promise<T>, expected?: ExactFileIdentity, platform?: NodeJS.Platform): Promise<T>;
4
- export declare function inspectFileIdentitySync<T extends ExactFileIdentity>(inspect: () => T, expected?: ExactFileIdentity, platform?: NodeJS.Platform): T;
4
+ export declare function inspectFileIdentitySync<T extends ExactFileIdentity>(inspect: () => T, expected?: ExactFileIdentity, platform?: NodeJS.Platform, mismatch?: () => Error): T;
5
5
  export {};
6
- //# sourceMappingURL=strict-file-identity.d.ts.map