@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
@@ -6,7 +6,7 @@ import path from "node:path";
6
6
  import { syncDirectory } from "./directory-durability.js";
7
7
  import { FsSafeError } from "./errors.js";
8
8
  import { sameFileIdentityForCleanup, sha256Hex } from "./file-identity.js";
9
- import { inspectFileIdentity } from "./strict-file-identity.js";
9
+ import { inspectFileIdentitySync } from "./strict-file-identity.js";
10
10
  import { serializePathWrite } from "./write-queue.js";
11
11
  import { assertNoWindowsPathAlias } from "./windows-path-alias.js";
12
12
  const validatedDurableQueueEntryPaths = new WeakSet();
@@ -45,12 +45,14 @@ function processingPathFromJsonPath(jsonPath) {
45
45
  ? `${jsonPath.slice(0, -".json".length)}.processing`
46
46
  : `${jsonPath}.processing`;
47
47
  }
48
- async function regularQueueFileIdentity(filePath) {
49
- const identity = await lstatOrNull(filePath);
48
+ function regularQueueFileIdentity(filePath, subject = "entry") {
49
+ const identity = lstatOrNull(filePath);
50
50
  if (!identity)
51
51
  return null;
52
52
  if (identity.isSymbolicLink() || !identity.isFile()) {
53
- throw new Error(`queue entry is not a regular file: ${filePath}`);
53
+ throw subject === "retirement"
54
+ ? new FsSafeError("path-mismatch", "queue retirement path is not a regular file")
55
+ : new Error(`queue entry is not a regular file: ${filePath}`);
54
56
  }
55
57
  return identity;
56
58
  }
@@ -62,9 +64,9 @@ async function withQueueEntryLock(paths, run) {
62
64
  async function claimDurableQueueEntryUnlocked(paths, options = {}) {
63
65
  const processingPath = paths.processingPath;
64
66
  await recoverDurableQueueRetirement({ jsonPath: paths.jsonPath, processingPath });
65
- const existingProcessing = await regularQueueFileIdentity(processingPath);
67
+ const existingProcessing = regularQueueFileIdentity(processingPath);
66
68
  if (existingProcessing) {
67
- const pending = await lstatOrNull(paths.jsonPath);
69
+ const pending = lstatOrNull(paths.jsonPath);
68
70
  const retiresPending = pending !== null &&
69
71
  !pending.isSymbolicLink() &&
70
72
  pending.isFile() &&
@@ -80,7 +82,7 @@ async function claimDurableQueueEntryUnlocked(paths, options = {}) {
80
82
  }
81
83
  return processingPath;
82
84
  }
83
- const pending = await lstatOrNull(paths.jsonPath);
85
+ const pending = lstatOrNull(paths.jsonPath);
84
86
  if (!pending || pending.isSymbolicLink() || !pending.isFile())
85
87
  return null;
86
88
  if (pending.nlink > 1n || !sameFileIdentityForCleanup(pending, pending)) {
@@ -94,7 +96,7 @@ async function claimDurableQueueEntryUnlocked(paths, options = {}) {
94
96
  }
95
97
  catch (error) {
96
98
  if (getErrorCode(error) === "EEXIST") {
97
- if (!(await regularQueueFileIdentity(processingPath)))
99
+ if (!regularQueueFileIdentity(processingPath))
98
100
  return null;
99
101
  await syncDirectory(path.dirname(processingPath));
100
102
  return processingPath;
@@ -104,7 +106,7 @@ async function claimDurableQueueEntryUnlocked(paths, options = {}) {
104
106
  throw error;
105
107
  }
106
108
  await syncDirectory(path.dirname(processingPath));
107
- const claimed = await regularQueueFileIdentity(processingPath);
109
+ const claimed = regularQueueFileIdentity(processingPath);
108
110
  if (!claimed || claimed.nlink > 2n) {
109
111
  throw new FsSafeError("path-mismatch", "queue claim is not an owned regular file");
110
112
  }
@@ -113,7 +115,7 @@ async function claimDurableQueueEntryUnlocked(paths, options = {}) {
113
115
  }
114
116
  export async function claimDurableQueueEntry(paths, options = {}) {
115
117
  const validatedPaths = ownDurableQueueEntryPaths(paths);
116
- if (!(await lstatOrNull(path.dirname(validatedPaths.jsonPath))))
118
+ if (!lstatOrNull(path.dirname(validatedPaths.jsonPath)))
117
119
  return null;
118
120
  return await withQueueEntryLock(validatedPaths, async () => await claimDurableQueueEntryUnlocked(validatedPaths, options));
119
121
  }
@@ -122,9 +124,9 @@ export async function migrateDurableQueueEntry(paths, expected, releaseReadPin,
122
124
  const validatedPaths = ownDurableQueueEntryPaths(paths);
123
125
  return await withQueueEntryLock(validatedPaths, async () => {
124
126
  const processingPath = validatedPaths.processingPath;
125
- const assertCurrent = async () => {
127
+ const assertCurrent = () => {
126
128
  try {
127
- await inspectFileIdentity(() => {
129
+ inspectFileIdentitySync(() => {
128
130
  const current = fsSync.lstatSync(processingPath, { bigint: true });
129
131
  if (current.isSymbolicLink() || !current.isFile() || current.nlink !== 1n) {
130
132
  throw new FsSafeError("path-mismatch", "queue migration requires its original processing claim");
@@ -139,26 +141,26 @@ export async function migrateDurableQueueEntry(paths, expected, releaseReadPin,
139
141
  throw error;
140
142
  }
141
143
  };
142
- await assertCurrent();
144
+ assertCurrent();
143
145
  return await run(processingPath, async () => {
144
- await assertCurrent();
146
+ assertCurrent();
145
147
  if (process.platform === "win32") {
146
148
  // Windows cannot replace our still-open target. Keep the transfer lock
147
149
  // across release and reject changes made while the async close settles.
148
150
  await releaseReadPin();
149
- await assertCurrent();
151
+ assertCurrent();
150
152
  }
151
153
  });
152
154
  });
153
155
  }
154
156
  export async function completeDeliveredQueueEntry(paths) {
155
157
  const validatedPaths = ownDurableQueueEntryPaths(paths);
156
- if (!(await lstatOrNull(path.dirname(validatedPaths.deliveredPath))))
158
+ if (!lstatOrNull(path.dirname(validatedPaths.deliveredPath)))
157
159
  return false;
158
160
  return await withQueueEntryLock(validatedPaths, async () => {
159
- if (!(await regularQueueFileIdentity(validatedPaths.deliveredPath)))
161
+ if (!regularQueueFileIdentity(validatedPaths.deliveredPath))
160
162
  return false;
161
- const processing = await regularQueueFileIdentity(validatedPaths.processingPath);
163
+ const processing = regularQueueFileIdentity(validatedPaths.processingPath);
162
164
  await fs.unlink(validatedPaths.deliveredPath);
163
165
  await syncDirectory(path.dirname(validatedPaths.deliveredPath));
164
166
  return !processing;
@@ -166,18 +168,18 @@ export async function completeDeliveredQueueEntry(paths) {
166
168
  }
167
169
  export async function acknowledgeDurableQueueEntry(paths) {
168
170
  const validatedPaths = ownDurableQueueEntryPaths(paths);
169
- if (!(await lstatOrNull(path.dirname(validatedPaths.jsonPath))))
171
+ if (!lstatOrNull(path.dirname(validatedPaths.jsonPath)))
170
172
  return;
171
173
  await withQueueEntryLock(validatedPaths, async () => {
172
174
  const processingPath = validatedPaths.processingPath;
173
- const processing = await regularQueueFileIdentity(processingPath);
174
- const delivered = await regularQueueFileIdentity(validatedPaths.deliveredPath);
175
+ const processing = regularQueueFileIdentity(processingPath);
176
+ const delivered = regularQueueFileIdentity(validatedPaths.deliveredPath);
175
177
  if (!processing) {
176
178
  if (delivered) {
177
179
  await fs.unlink(validatedPaths.deliveredPath);
178
180
  }
179
181
  await syncDirectory(path.dirname(validatedPaths.deliveredPath));
180
- if (await regularQueueFileIdentity(validatedPaths.jsonPath)) {
182
+ if (regularQueueFileIdentity(validatedPaths.jsonPath)) {
181
183
  throw new FsSafeError("path-mismatch", "queue acknowledgement requires a processing claim");
182
184
  }
183
185
  return;
@@ -198,17 +200,17 @@ export async function moveDurableQueueEntryToFailed(params) {
198
200
  assertNoWindowsPathAlias(failedPath);
199
201
  await withQueueEntryLock(paths, async () => {
200
202
  const processingPath = paths.processingPath;
201
- const processing = await regularQueueFileIdentity(processingPath);
202
- const existingFailed = await regularQueueFileIdentity(failedPath);
203
+ const processing = regularQueueFileIdentity(processingPath);
204
+ const existingFailed = regularQueueFileIdentity(failedPath);
203
205
  if (!processing && existingFailed) {
204
206
  await syncDirectory(path.dirname(failedPath));
205
207
  await syncDirectory(path.dirname(processingPath));
206
- const recoveredFailed = await regularQueueFileIdentity(failedPath);
208
+ const recoveredFailed = regularQueueFileIdentity(failedPath);
207
209
  if (!recoveredFailed ||
208
210
  !sameFileIdentityForCleanup(existingFailed, recoveredFailed)) {
209
211
  throw new FsSafeError("path-mismatch", "failed queue destination changed during recovery");
210
212
  }
211
- if (await regularQueueFileIdentity(paths.jsonPath)) {
213
+ if (regularQueueFileIdentity(paths.jsonPath)) {
212
214
  throw new FsSafeError("already-exists", "failed queue destination already exists");
213
215
  }
214
216
  return;
@@ -219,18 +221,13 @@ export async function moveDurableQueueEntryToFailed(params) {
219
221
  if (!sourcePath) {
220
222
  throw Object.assign(new Error("queue entry does not exist"), { code: "ENOENT" });
221
223
  }
222
- const source = await regularQueueFileIdentity(sourcePath);
223
- const failed = await regularQueueFileIdentity(failedPath);
224
- if (failed) {
225
- if (source && sameFileIdentityForCleanup(source, failed)) {
226
- await syncDirectory(path.dirname(failedPath));
227
- await fs.unlink(sourcePath);
228
- await syncDirectory(path.dirname(sourcePath));
229
- return;
230
- }
224
+ const source = regularQueueFileIdentity(sourcePath);
225
+ const failed = regularQueueFileIdentity(failedPath);
226
+ if (failed && (!source || !sameFileIdentityForCleanup(source, failed))) {
231
227
  throw new FsSafeError("already-exists", "failed queue destination already exists");
232
228
  }
233
- await fs.link(sourcePath, failedPath);
229
+ if (!failed)
230
+ await fs.link(sourcePath, failedPath);
234
231
  await syncDirectory(path.dirname(failedPath));
235
232
  await fs.unlink(sourcePath);
236
233
  await syncDirectory(path.dirname(sourcePath));
@@ -243,7 +240,7 @@ export function getErrorCode(error) {
243
240
  ? String(error.code)
244
241
  : null;
245
242
  }
246
- async function lstatOrNull(filePath) {
243
+ function lstatOrNull(filePath) {
247
244
  try {
248
245
  return fsSync.lstatSync(filePath, { bigint: true });
249
246
  }
@@ -258,28 +255,11 @@ function assertDirectory(identity, label) {
258
255
  throw new FsSafeError("path-mismatch", `${label} is not an owned directory`);
259
256
  }
260
257
  }
261
- async function regularFileIdentity(filePath) {
262
- const identity = await lstatOrNull(filePath);
263
- if (!identity)
264
- return null;
265
- if (identity.isSymbolicLink() || !identity.isFile()) {
266
- throw new FsSafeError("path-mismatch", "queue retirement path is not a regular file");
267
- }
268
- return identity;
269
- }
270
258
  function retirementPaths(jsonPath) {
271
259
  const rootPath = path.join(path.dirname(jsonPath), RETIREMENT_ROOT_NAME);
272
260
  const dirPath = path.join(rootPath, path.basename(jsonPath));
273
261
  return { dirPath, entryPath: path.join(dirPath, RETIREMENT_ENTRY_NAME), rootPath };
274
262
  }
275
- async function inspectRetirementRoot(jsonPath) {
276
- const rootPath = retirementPaths(jsonPath).rootPath;
277
- const root = await lstatOrNull(rootPath);
278
- if (!root)
279
- return null;
280
- assertDirectory(root, "queue retirement root");
281
- return rootPath;
282
- }
283
263
  async function ensureRetirementRoot(jsonPath) {
284
264
  const parentPath = path.dirname(jsonPath);
285
265
  const rootPath = retirementPaths(jsonPath).rootPath;
@@ -300,11 +280,12 @@ async function removeRetirementRecord(params) {
300
280
  await syncDirectory(params.rootPath);
301
281
  }
302
282
  async function recoverDurableQueueRetirement(params) {
303
- const rootPath = await inspectRetirementRoot(params.jsonPath);
304
- if (!rootPath)
283
+ const { rootPath, dirPath, entryPath } = retirementPaths(params.jsonPath);
284
+ const root = lstatOrNull(rootPath);
285
+ if (!root)
305
286
  return;
306
- const { dirPath, entryPath } = retirementPaths(params.jsonPath);
307
- const dir = await lstatOrNull(dirPath);
287
+ assertDirectory(root, "queue retirement root");
288
+ const dir = lstatOrNull(dirPath);
308
289
  if (!dir)
309
290
  return;
310
291
  assertDirectory(dir, "queue retirement record");
@@ -316,13 +297,13 @@ async function recoverDurableQueueRetirement(params) {
316
297
  if (names.length !== 1 || names[0] !== RETIREMENT_ENTRY_NAME) {
317
298
  throw new FsSafeError("path-mismatch", "queue retirement record is ambiguous");
318
299
  }
319
- const entry = await regularFileIdentity(entryPath);
320
- const processing = await regularFileIdentity(params.processingPath);
300
+ const entry = regularQueueFileIdentity(entryPath, "retirement");
301
+ const processing = regularQueueFileIdentity(params.processingPath, "retirement");
321
302
  if (!entry || !processing) {
322
303
  throw new FsSafeError("path-mismatch", "queue retirement ownership is incomplete");
323
304
  }
324
305
  if (!sameFileIdentityForCleanup(entry, processing)) {
325
- const pending = await regularFileIdentity(params.jsonPath);
306
+ const pending = regularQueueFileIdentity(params.jsonPath, "retirement");
326
307
  if (!pending) {
327
308
  await fs.link(entryPath, params.jsonPath);
328
309
  await syncDirectory(path.dirname(params.jsonPath));
@@ -3,4 +3,3 @@ export declare const DEFAULT_JSON_DURABLE_QUEUE_ENTRY_MAX_BYTES: number;
3
3
  export declare function withJsonDurableQueueEntry<T, R>(filePath: string, options: {
4
4
  maxBytes?: number;
5
5
  }, run: (entry: T, identity: BigIntStats, releaseReadPin: () => Promise<void>) => Promise<R>): Promise<R>;
6
- //# sourceMappingURL=json-durable-queue-read.d.ts.map
@@ -2,13 +2,13 @@ import fs, {} from "node:fs";
2
2
  import { normalizeMaxBytes } from "./byte-budget.js";
3
3
  import { readBoundedAsync } from "./bounded-read.js";
4
4
  import { resolveReadOpenFlags } from "./read-open-flags.js";
5
- import { inspectFileIdentity } from "./strict-file-identity.js";
5
+ import { inspectFileIdentitySync } from "./strict-file-identity.js";
6
6
  import { assertNoWindowsPathAlias } from "./windows-path-alias.js";
7
7
  export const DEFAULT_JSON_DURABLE_QUEUE_ENTRY_MAX_BYTES = 16 * 1024 * 1024;
8
- async function inspectQueueEntry(inspect, maxBytes, expected) {
8
+ function inspectQueueEntry(inspect, maxBytes, expected) {
9
9
  let inspectionFailed = false;
10
10
  try {
11
- return await inspectFileIdentity(async () => {
11
+ return inspectFileIdentitySync(() => {
12
12
  try {
13
13
  const stat = inspect();
14
14
  if (stat.isSymbolicLink() || !stat.isFile()) {
@@ -39,13 +39,14 @@ export async function withJsonDurableQueueEntry(filePath, options, run) {
39
39
  });
40
40
  assertNoWindowsPathAlias(filePath);
41
41
  const inspectPath = () => fs.lstatSync(filePath, { bigint: true });
42
- const initialStat = await inspectQueueEntry(inspectPath, maxBytes);
42
+ const initialStat = inspectQueueEntry(inspectPath, maxBytes);
43
43
  const handle = await fs.promises.open(filePath, resolveReadOpenFlags());
44
44
  let closePromise;
45
45
  const releaseReadPin = () => closePromise ??= (async () => { await handle.close(); })();
46
+ let result;
46
47
  try {
47
- const openedStat = await inspectQueueEntry(() => fs.fstatSync(handle.fd, { bigint: true }), maxBytes, initialStat);
48
- await inspectQueueEntry(inspectPath, maxBytes, openedStat);
48
+ const openedStat = inspectQueueEntry(() => fs.fstatSync(handle.fd, { bigint: true }), maxBytes, initialStat);
49
+ inspectQueueEntry(inspectPath, maxBytes, openedStat);
49
50
  const bytes = await readBoundedAsync(maxBytes, async (buffer, length) => (await handle.read(buffer, 0, length, null)).bytesRead, {
50
51
  initialSize: openedStat.size >= 0n && Number.isSafeInteger(Number(openedStat.size))
51
52
  ? Number(openedStat.size) : undefined,
@@ -53,9 +54,12 @@ export async function withJsonDurableQueueEntry(filePath, options, run) {
53
54
  });
54
55
  // The migration owner may release this pin only at the verified publication
55
56
  // boundary; until then an unlinked inode cannot be recycled into a new claim.
56
- return await run(JSON.parse(bytes.toString("utf8")), openedStat, releaseReadPin);
57
+ result = await run(JSON.parse(bytes.toString("utf8")), openedStat, releaseReadPin);
57
58
  }
58
- finally {
59
- await releaseReadPin();
59
+ catch (error) {
60
+ await releaseReadPin().catch(() => undefined);
61
+ throw error;
60
62
  }
63
+ await releaseReadPin();
64
+ return result;
61
65
  }
@@ -43,4 +43,3 @@ export declare function moveJsonDurableQueueEntryToFailed(params: {
43
43
  failedDir: string;
44
44
  id: string;
45
45
  }): Promise<void>;
46
- //# sourceMappingURL=json-durable-queue.d.ts.map
@@ -1,17 +1,13 @@
1
1
  import fs, {} from "node:fs";
2
2
  import path from "node:path";
3
3
  import { syncDirectory } from "./directory-durability.js";
4
- import { syncQueueDirectoryCreation } from "./json-durable-queue-directory.js";
5
- import { queueValidationRoot, queueValidationRoots, resolveQueueFilesystemPath, } from "./json-durable-queue-paths.js";
4
+ import { queueDirectories } from "./json-durable-queue-directory.js";
6
5
  import { getErrorCode, acknowledgeDurableQueueEntry, claimDurableQueueEntry, completeDeliveredQueueEntry, migrateDurableQueueEntry, moveDurableQueueEntryToFailed, validateDurableQueueEntryPaths, } from "./json-durable-queue-ownership.js";
7
6
  import { withJsonDurableQueueEntry } from "./json-durable-queue-read.js";
8
7
  import { stringifyJsonDocument } from "./json-stringify.js";
9
- import { realpathSync } from "./realpath.js";
10
- import { recursiveMkdirPath } from "./recursive-mkdir-path.js";
11
8
  import { replaceFileAtomicWithDirectorySync } from "./replace-file.js";
12
9
  import { assertSafePathSegment } from "./safe-path-segment.js";
13
- import { admitStandalonePublicationPath } from "./standalone-publication-path.js";
14
- import { assertNoWindowsPathAlias, hasWindowsPathAlias, } from "./windows-path-alias.js";
10
+ import { admitStandalonePublicationPath, assertNoWindowsPathAlias, hasWindowsPathAlias, } from "./windows-path-alias.js";
15
11
  export { DEFAULT_JSON_DURABLE_QUEUE_ENTRY_MAX_BYTES } from "./json-durable-queue-read.js";
16
12
  function assertSafeQueueEntryId(id) {
17
13
  assertSafePathSegment(id, { label: "queue entry id" });
@@ -61,129 +57,9 @@ export async function ensureJsonDurableQueueDirs(params) {
61
57
  const failedDir = params.failedDir;
62
58
  assertNoWindowsPathAlias(queueDir);
63
59
  assertNoWindowsPathAlias(failedDir);
64
- const roots = await queueValidationRoots(queueDir, failedDir);
65
- await ensureJsonDurableQueueDir(queueDir, roots.queueRoot);
66
- await ensureJsonDurableQueueDir(failedDir, roots.failedRoot);
67
- }
68
- async function ensureJsonDurableQueueDir(dir, validationRoot) {
69
- const root = validationRoot
70
- ? validationRoot
71
- : queueValidationRoot(dir);
72
- await assertNoSymlinkDirectorySegments(root, dir, true);
73
- await fs.promises.mkdir(recursiveMkdirPath(dir), { recursive: true, mode: 0o700 });
74
- await assertNoSymlinkDirectorySegments(root, dir, false);
75
- await chmodQueueDirectory(dir);
76
- await syncQueueDirectoryCreation(dir, root.path);
77
- }
78
- async function assertJsonDurableQueueDir(dir, validationRoot) {
79
- const root = validationRoot
80
- ? validationRoot
81
- : queueValidationRoot(dir);
82
- await assertNoSymlinkDirectorySegments(root, dir, false);
83
- }
84
- async function isDarwinSystemAlias(dir, stat) {
85
- if (process.platform !== "darwin" || !stat.isSymbolicLink()) {
86
- return false;
87
- }
88
- const resolved = path.resolve(dir);
89
- if (resolved !== "/tmp" && resolved !== "/var") {
90
- return false;
91
- }
92
- try {
93
- return realpathSync.native(resolved) === `/private${resolved}`;
94
- }
95
- catch {
96
- return false;
97
- }
98
- }
99
- async function assertNoSymlinkDirectorySegments(validationRoot, dir, allowMissing) {
100
- let base = resolveQueueFilesystemPath(validationRoot.path);
101
- let target = resolveQueueFilesystemPath(dir);
102
- let current = base;
103
- let baseStat = fs.lstatSync(base);
104
- if (baseStat.isSymbolicLink() && validationRoot.allowSymlinkBase) {
105
- const relative = path.relative(base, target);
106
- if (relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
107
- throw new Error(`durable queue path is not a directory: ${dir}`);
108
- }
109
- base = realpathSync.native(base);
110
- target = path.join(base, ...relative.split(path.sep).filter(Boolean));
111
- current = base;
112
- baseStat = fs.lstatSync(base);
113
- }
114
- if (baseStat.isSymbolicLink() || !baseStat.isDirectory()) {
115
- throw new Error(`durable queue path is not a directory: ${dir}`);
116
- }
117
- const segments = path.relative(base, target).split(path.sep).filter(Boolean);
118
- for (let index = 0; index < segments.length; index++) {
119
- const segment = segments[index];
120
- if (segment === undefined) {
121
- continue;
122
- }
123
- current = path.join(current, segment);
124
- let stat;
125
- try {
126
- stat = fs.lstatSync(current);
127
- }
128
- catch (error) {
129
- if (allowMissing && error.code === "ENOENT") {
130
- return;
131
- }
132
- throw error;
133
- }
134
- if (stat.isSymbolicLink() || !stat.isDirectory()) {
135
- if (stat.isSymbolicLink() && validationRoot.allowSymlinkBase) {
136
- if (await isDarwinSystemAlias(current, stat)) {
137
- current = realpathSync.native(current);
138
- continue;
139
- }
140
- }
141
- throw new Error(`durable queue path is not a directory: ${dir}`);
142
- }
143
- }
144
- }
145
- async function chmodQueueDirectory(dir) {
146
- const noFollow = typeof fs.constants.O_NOFOLLOW === "number" && process.platform !== "win32"
147
- ? fs.constants.O_NOFOLLOW
148
- : 0;
149
- const directoryFlag = typeof fs.constants.O_DIRECTORY === "number" && process.platform !== "win32"
150
- ? fs.constants.O_DIRECTORY
151
- : 0;
152
- if (noFollow || directoryFlag) {
153
- let handle;
154
- try {
155
- handle = await fs.promises.open(dir, fs.constants.O_RDONLY | noFollow | directoryFlag);
156
- const stat = fs.fstatSync(handle.fd);
157
- if (!stat.isDirectory()) {
158
- throw new Error(`durable queue path is not a directory: ${dir}`);
159
- }
160
- try {
161
- await handle.chmod(0o700);
162
- }
163
- catch {
164
- // Best-effort on platforms that do not enforce POSIX modes.
165
- }
166
- return;
167
- }
168
- finally {
169
- try {
170
- await handle?.close();
171
- }
172
- catch {
173
- // Best-effort cleanup after chmod/open failures.
174
- }
175
- }
176
- }
177
- const stat = fs.lstatSync(dir);
178
- if (stat.isSymbolicLink() || !stat.isDirectory()) {
179
- throw new Error(`durable queue path is not a directory: ${dir}`);
180
- }
181
- try {
182
- await fs.promises.chmod(dir, 0o700);
183
- }
184
- catch {
185
- // Best-effort on platforms that do not enforce POSIX modes.
186
- }
60
+ const directories = await queueDirectories(queueDir, failedDir);
61
+ await directories.queue.ensure();
62
+ await directories.failed.ensure();
187
63
  }
188
64
  export async function writeJsonDurableQueueEntry(params) {
189
65
  await writeQueueEntry(params);
@@ -328,9 +204,9 @@ export async function moveJsonDurableQueueEntryToFailed(params) {
328
204
  assertSafeQueueEntryId(id);
329
205
  assertNoWindowsPathAlias(queueDir);
330
206
  assertNoWindowsPathAlias(failedDir);
331
- const roots = await queueValidationRoots(queueDir, failedDir);
332
- await assertJsonDurableQueueDir(queueDir, roots.queueRoot);
333
- await ensureJsonDurableQueueDir(failedDir, roots.failedRoot);
207
+ const directories = await queueDirectories(queueDir, failedDir);
208
+ await directories.queue.assert();
209
+ await directories.failed.ensure();
334
210
  const paths = validateDurableQueueEntryPaths(resolveJsonDurableQueueEntryPaths(queueDir, id));
335
211
  await moveDurableQueueEntryToFailed({
336
212
  paths,
@@ -6,4 +6,3 @@ export type JsonStoreOptions<T> = JsonFileStoreOptions & {
6
6
  };
7
7
  export type { JsonFileStoreOptions, JsonStore, JsonStoreLockOptions };
8
8
  export declare function jsonStore<T>(options: JsonStoreOptions<T>): JsonStore<T>;
9
- //# sourceMappingURL=json-store.d.ts.map
@@ -1,8 +1,7 @@
1
1
  import path from "node:path";
2
2
  import { fileStore } from "./file-store.js";
3
3
  import {} from "./json-document-store.js";
4
- import { admitStandalonePublicationPath } from "./standalone-publication-path.js";
5
- import { assertNoWindowsPathAlias } from "./windows-path-alias.js";
4
+ import { admitStandalonePublicationPath, assertNoWindowsPathAlias } from "./windows-path-alias.js";
6
5
  export function jsonStore(options) {
7
6
  const filePathInput = admitStandalonePublicationPath(options.filePath);
8
7
  const filePath = path.resolve(filePathInput);
@@ -1,2 +1 @@
1
1
  export declare function stringifyJsonDocument(value: unknown, replacer?: Parameters<typeof JSON.stringify>[1], space?: Parameters<typeof JSON.stringify>[2]): string;
2
- //# sourceMappingURL=json-stringify.d.ts.map
package/dist/json.d.ts CHANGED
@@ -47,4 +47,3 @@ export declare function readJsonIfExists<T>(filePath: string, options?: ReadJson
47
47
  export declare function readJsonSync<T = unknown>(filePath: string, options?: ReadJsonOptions): T;
48
48
  export type WriteJsonOptions = Pick<WriteTextAtomicOptions, "dirMode" | "durable" | "mode" | "trailingNewline">;
49
49
  export declare function writeJson(filePath: string, value: unknown, options?: WriteJsonOptions): Promise<void>;
50
- //# sourceMappingURL=json.d.ts.map
package/dist/json.js CHANGED
@@ -9,31 +9,27 @@ import { openRootFileSync } from "./root-file.js";
9
9
  import { recursiveMkdirPath } from "./recursive-mkdir-path.js";
10
10
  import { writeTempFileSync } from "./replace-file-descriptor.js";
11
11
  import { SyncAtomicTempOwner } from "./replace-file-temp-owner.js";
12
- import { admitStandalonePublicationPath } from "./standalone-publication-path.js";
12
+ import { admitStandalonePublicationPath, assertNoWindowsPathAlias } from "./windows-path-alias.js";
13
13
  import { writeTextAtomic } from "./text-atomic.js";
14
14
  import { sleep } from "./timing.js";
15
- import { assertNoWindowsPathAlias } from "./windows-path-alias.js";
16
15
  const READ_RETRY_MAX_ATTEMPTS = 5;
17
16
  const READ_RETRY_BASE_DELAY_MS = 50;
18
- function isRetryableReadError(err, options) {
17
+ function isRetryableReadError(err) {
19
18
  if (err instanceof FsSafeError && err.code === "path-mismatch") {
20
19
  return true;
21
20
  }
22
- if (options.retryOpenRaceErrors !== true) {
23
- return false;
24
- }
25
21
  const code = getErrorCode(err);
26
22
  return code === "ENOENT" || code === "EPERM";
27
23
  }
28
- async function readRegularFileWithRetry(filePath, options = {}) {
24
+ async function readRegularFileWithRetry(filePath, maxBytes) {
29
25
  let lastErr;
30
26
  for (let attempt = 0; attempt < READ_RETRY_MAX_ATTEMPTS; attempt++) {
31
27
  try {
32
- return (await readRegularFile({ filePath, maxBytes: options.maxBytes })).buffer;
28
+ return (await readRegularFile({ filePath, maxBytes })).buffer;
33
29
  }
34
30
  catch (err) {
35
31
  lastErr = err;
36
- if (!isRetryableReadError(err, options) || attempt === READ_RETRY_MAX_ATTEMPTS - 1) {
32
+ if (!isRetryableReadError(err) || attempt === READ_RETRY_MAX_ATTEMPTS - 1) {
37
33
  throw err;
38
34
  }
39
35
  await sleep(READ_RETRY_BASE_DELAY_MS * Math.pow(2, attempt));
@@ -46,10 +42,7 @@ async function readRegularFileIfExistsWithRetry(filePath, options = {}) {
46
42
  if (initial.missing) {
47
43
  return null;
48
44
  }
49
- return await readRegularFileWithRetry(filePath, {
50
- maxBytes: options.maxBytes,
51
- retryOpenRaceErrors: true,
52
- });
45
+ return await readRegularFileWithRetry(filePath, options.maxBytes);
53
46
  }
54
47
  const JSON_FILE_MODE = 0o600;
55
48
  const JSON_DIR_MODE = 0o700;
@@ -269,10 +262,7 @@ export async function tryReadJson(filePath, options = {}) {
269
262
  export async function readJson(filePath, options = {}) {
270
263
  let raw;
271
264
  try {
272
- raw = (await readRegularFileWithRetry(filePath, {
273
- maxBytes: options.maxBytes,
274
- retryOpenRaceErrors: true,
275
- })).toString("utf8");
265
+ raw = (await readRegularFileWithRetry(filePath, options.maxBytes)).toString("utf8");
276
266
  }
277
267
  catch (err) {
278
268
  throw new JsonFileReadError(filePath, "read", err);
@@ -6,4 +6,3 @@ export declare function assertNoWindowsNetworkPath(filePath: string, label?: str
6
6
  export declare function safeFileURLToPath(fileUrl: string, platform?: NodeJS.Platform): string;
7
7
  export declare function trySafeFileURLToPath(fileUrl: string, platform?: NodeJS.Platform): string | undefined;
8
8
  export declare function basenameFromMediaSource(source?: string): string | undefined;
9
- //# sourceMappingURL=local-file-access.d.ts.map
@@ -2,6 +2,7 @@ import path from "node:path";
2
2
  import { fileURLToPath, URL } from "node:url";
3
3
  import { normalizeLowercaseStringOrEmpty } from "./string-coerce.js";
4
4
  import { hasWindowsPathAlias } from "./windows-path-alias.js";
5
+ import { isWindowsSeparator, rootedWindowsDriveColonIndex, windowsNamespaceMarker, } from "./windows-path-syntax.js";
5
6
  const ENCODED_FILE_URL_SEPARATOR_RE = /%(?:2f|5c)/i;
6
7
  const FILE_URL_PREFIX_RE = /^file:\/\//i;
7
8
  export function isFileUrl(input) {
@@ -18,16 +19,8 @@ export function isWindowsNetworkPath(filePath, platform = process.platform) {
18
19
  if (platform !== "win32") {
19
20
  return false;
20
21
  }
21
- const normalized = filePath.replace(/\//g, "\\");
22
- const extendedDrive = normalized.length >= 7 &&
23
- normalized.startsWith("\\\\?\\") &&
24
- /^[a-z]$/i.test(normalized[4] ?? "") &&
25
- normalized[5] === ":" &&
26
- normalized[6] === "\\";
27
- if (extendedDrive) {
28
- return false;
29
- }
30
- return normalized.startsWith("\\\\");
22
+ return isWindowsSeparator(filePath, 0) && isWindowsSeparator(filePath, 1) &&
23
+ !(windowsNamespaceMarker(filePath) === "?" && rootedWindowsDriveColonIndex(filePath) === 5);
31
24
  }
32
25
  export function isWindowsDriveLetterPath(filePath, platform = process.platform) {
33
26
  return platform === "win32" && /^[A-Za-z]:[\\/]/.test(filePath);
@@ -14,4 +14,3 @@ export declare function openLocalFileDescriptor(filePath: string, options?: {
14
14
  readWrite?: true;
15
15
  }): Promise<OwnedLocalFile>;
16
16
  export {};
17
- //# sourceMappingURL=local-file-descriptor.d.ts.map
@@ -23,4 +23,3 @@ export type ReadLocalFileFromRootsOptions = LocalRootsInputOptions & {
23
23
  };
24
24
  export declare function resolveLocalPathFromRootsSync(options: ResolveLocalPathFromRootsSyncOptions): LocalRootsPathResult | null;
25
25
  export declare function readLocalFileFromRoots(options: ReadLocalFileFromRootsOptions): Promise<LocalRootsReadResult | null>;
26
- //# sourceMappingURL=local-roots.d.ts.map
@@ -7,4 +7,3 @@ export type FsSafeLockConfig = {
7
7
  };
8
8
  export declare function configureFsSafeLocks(config: Partial<FsSafeLockConfig>): void;
9
9
  export declare function getFsSafeLockConfig(): FsSafeLockConfig;
10
- //# sourceMappingURL=lock-config.d.ts.map
@@ -28,4 +28,3 @@ export declare function assertSourceStillMatches(sourcePath: string, identity: E
28
28
  export declare function createCleanupCopiedEntryState(sourcePath: string, manifest: CopiedEntryManifest): CleanupCopiedEntryState;
29
29
  export declare function cleanupCopiedEntry(sourcePath: string, manifest: CopiedEntryManifest, state: CleanupCopiedEntryState, assertBeforeMutation: (() => void) | undefined): Promise<CleanupCopiedEntryResult>;
30
30
  export {};
31
- //# sourceMappingURL=move-path-cleanup.d.ts.map
@@ -5,4 +5,3 @@ export declare function createMoveStageOwner(staged: string): Promise<{
5
5
  published(): void;
6
6
  cleanup(): Promise<void>;
7
7
  }>;
8
- //# sourceMappingURL=move-path-stage.d.ts.map
@@ -18,4 +18,3 @@ type MoveCopyFallbackReason = "cross-device" | "windows-rename-denied";
18
18
  export declare function moveCopyFallbackReasonForRenameError(error: unknown, platform?: NodeJS.Platform): MoveCopyFallbackReason | undefined;
19
19
  export declare function movePathWithCopyFallback(options: MovePathWithCopyFallbackOptions): Promise<void>;
20
20
  export {};
21
- //# sourceMappingURL=move-path.d.ts.map