@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,10 +5,10 @@ import { readFileDescriptorBoundedSync, readFileHandleBounded } from "./bounded-
5
5
  import { normalizeMaxBytes } from "./byte-budget.js";
6
6
  import { assertNoUnsafeDeviceReadPath } from "./device-path.js";
7
7
  import { FsSafeError } from "./errors.js";
8
- import { inspectFileIdentity, inspectFileIdentitySync } from "./strict-file-identity.js";
8
+ import { inspectFileIdentitySync } from "./strict-file-identity.js";
9
9
  import { isNotFoundPathError } from "./path.js";
10
10
  import { resolveReadOpenFlags } from "./read-open-flags.js";
11
- import { assertNoSymlinkParents, assertNoSymlinkParentsSync } from "./symlink-parents.js";
11
+ import { assertNoSymlinkParentsSync } from "./symlink-parents.js";
12
12
  import { getFsSafeTestHooks } from "./test-hooks.js";
13
13
  import { isNonRegularWriteOpenError, isNonRegularWriteOpenErrorSync, resolveNonblockingWriteFlag, } from "./write-open-flags.js";
14
14
  import { assertNoWindowsPathAlias, resolvePathPreservingWindowsRoot, } from "./windows-path-alias.js";
@@ -50,18 +50,7 @@ export function statRegularFileSync(filePath) {
50
50
  return { missing: false, stat };
51
51
  }
52
52
  export async function readRegularFile(params) {
53
- const maxBytes = normalizeMaxBytes(params.maxBytes);
54
- const filePath = params.filePath;
55
- assertNoWindowsPathAlias(filePath, "filesystem", "file path uses a Windows filesystem namespace alias");
56
- assertNoUnsafeDeviceReadPath(filePath);
57
- const before = await inspectFileIdentity(async () => {
58
- const stat = fsSync.lstatSync(filePath, { bigint: true });
59
- assertRegularReadStat(stat, filePath, true);
60
- return stat;
61
- }).catch((error) => throwReadPreviewError(error, filePath));
62
- if (maxBytes !== undefined && before.size > maxBytes) {
63
- throw regularFileTooLargeError(filePath, maxBytes);
64
- }
53
+ const { filePath, maxBytes, before } = prepareRegularRead(params);
65
54
  let handle;
66
55
  try {
67
56
  handle = await fs.open(filePath, resolveReadOpenFlags());
@@ -73,28 +62,7 @@ export async function readRegularFile(params) {
73
62
  throw err;
74
63
  }
75
64
  try {
76
- const stat = fsSync.fstatSync(handle.fd);
77
- const identity = await inspectFileIdentity(async () => {
78
- const exact = fsSync.fstatSync(handle.fd, { bigint: true });
79
- assertRegularReadStat(exact, filePath);
80
- return exact;
81
- }, before);
82
- try {
83
- await inspectFileIdentity(async () => {
84
- const current = fsSync.lstatSync(filePath, { bigint: true });
85
- assertRegularReadStat(current, filePath);
86
- return current;
87
- }, identity);
88
- }
89
- catch (err) {
90
- if (isNotFoundPathError(err)) {
91
- throw new FsSafeError("path-mismatch", `File changed during read: ${filePath}`);
92
- }
93
- throw err;
94
- }
95
- if (maxBytes !== undefined && stat.size > maxBytes) {
96
- throw regularFileTooLargeError(filePath, maxBytes);
97
- }
65
+ const stat = inspectOpenedRegularRead(handle.fd, filePath, before, maxBytes);
98
66
  // With a byte cap, avoid readFile(): a raced file growth would allocate
99
67
  // the oversized content before the post-read check could reject it.
100
68
  let buffer;
@@ -127,47 +95,7 @@ function assertRegularReadStat(stat, filePath, preview = false) {
127
95
  throw new Error(preview ? "path must be a regular file" : `File is not a regular file: ${filePath}`);
128
96
  }
129
97
  }
130
- function readOpenedRegularFileSync(params) {
131
- const stat = fsSync.fstatSync(params.fd);
132
- const identity = inspectFileIdentitySync(() => {
133
- const exact = fsSync.fstatSync(params.fd, { bigint: true });
134
- assertRegularReadStat(exact, params.filePath);
135
- return exact;
136
- }, params.preOpenStat);
137
- try {
138
- inspectFileIdentitySync(() => {
139
- const current = fsSync.lstatSync(params.filePath, { bigint: true });
140
- assertRegularReadStat(current, params.filePath);
141
- return current;
142
- }, identity);
143
- }
144
- catch (error) {
145
- if (isNotFoundPathError(error)) {
146
- throw new FsSafeError("path-mismatch", `File changed during read: ${params.filePath}`);
147
- }
148
- throw error;
149
- }
150
- if (params.maxBytes !== undefined && stat.size > params.maxBytes) {
151
- throw regularFileTooLargeError(params.filePath, params.maxBytes);
152
- }
153
- // Keep capped sync reads incremental for the same reason as async reads:
154
- // readFileSync(fd) would buffer a raced oversized file before throwing.
155
- let buffer;
156
- try {
157
- buffer =
158
- params.maxBytes === undefined
159
- ? fsSync.readFileSync(params.fd)
160
- : readFileDescriptorBoundedSync(params.fd, params.maxBytes);
161
- }
162
- catch (error) {
163
- if (params.maxBytes !== undefined) {
164
- translateBoundedReadOverflow(error, params.filePath, params.maxBytes);
165
- }
166
- throw error;
167
- }
168
- return { buffer, stat };
169
- }
170
- export function readRegularFileSync(params) {
98
+ function prepareRegularRead(params) {
171
99
  const maxBytes = normalizeMaxBytes(params.maxBytes);
172
100
  const filePath = params.filePath;
173
101
  assertNoWindowsPathAlias(filePath, "filesystem", "file path uses a Windows filesystem namespace alias");
@@ -186,6 +114,35 @@ export function readRegularFileSync(params) {
186
114
  if (maxBytes !== undefined && before.size > maxBytes) {
187
115
  throw regularFileTooLargeError(filePath, maxBytes);
188
116
  }
117
+ return { filePath, maxBytes, before };
118
+ }
119
+ function inspectOpenedRegularRead(fd, filePath, preOpenStat, maxBytes) {
120
+ const stat = fsSync.fstatSync(fd);
121
+ const identity = inspectFileIdentitySync(() => {
122
+ const exact = fsSync.fstatSync(fd, { bigint: true });
123
+ assertRegularReadStat(exact, filePath);
124
+ return exact;
125
+ }, preOpenStat);
126
+ try {
127
+ inspectFileIdentitySync(() => {
128
+ const current = fsSync.lstatSync(filePath, { bigint: true });
129
+ assertRegularReadStat(current, filePath);
130
+ return current;
131
+ }, identity);
132
+ }
133
+ catch (error) {
134
+ if (isNotFoundPathError(error)) {
135
+ throw new FsSafeError("path-mismatch", `File changed during read: ${filePath}`);
136
+ }
137
+ throw error;
138
+ }
139
+ if (maxBytes !== undefined && stat.size > maxBytes) {
140
+ throw regularFileTooLargeError(filePath, maxBytes);
141
+ }
142
+ return stat;
143
+ }
144
+ export function readRegularFileSync(params) {
145
+ const { filePath, maxBytes, before } = prepareRegularRead(params);
189
146
  let fd;
190
147
  try {
191
148
  fd = fsSync.openSync(filePath, resolveReadOpenFlags());
@@ -197,12 +154,21 @@ export function readRegularFileSync(params) {
197
154
  throw error;
198
155
  }
199
156
  try {
200
- return readOpenedRegularFileSync({
201
- fd,
202
- filePath,
203
- preOpenStat: before,
204
- maxBytes,
205
- });
157
+ const stat = inspectOpenedRegularRead(fd, filePath, before, maxBytes);
158
+ // Keep capped reads incremental so raced growth cannot allocate unbounded content.
159
+ let buffer;
160
+ try {
161
+ buffer = maxBytes === undefined
162
+ ? fsSync.readFileSync(fd)
163
+ : readFileDescriptorBoundedSync(fd, maxBytes);
164
+ }
165
+ catch (error) {
166
+ if (maxBytes !== undefined) {
167
+ translateBoundedReadOverflow(error, filePath, maxBytes);
168
+ }
169
+ throw error;
170
+ }
171
+ return { buffer, stat };
206
172
  }
207
173
  finally {
208
174
  fsSync.closeSync(fd);
@@ -223,12 +189,27 @@ function throwAppendIdentityError(error, filePath) {
223
189
  }
224
190
  throw error;
225
191
  }
226
- export async function appendRegularFile(options) {
192
+ function captureAppendOptions(options) {
227
193
  const filePath = options.filePath;
228
194
  assertNoWindowsPathAlias(filePath, "filesystem", "file path uses a Windows filesystem namespace alias");
229
- if (options.rejectSymlinkParents === true) {
195
+ return {
196
+ filePath, content: options.content, encoding: options.encoding ?? "utf8",
197
+ mode: options.mode ?? 0o600, maxFileBytes: options.maxFileBytes,
198
+ rejectSymlinkParents: options.rejectSymlinkParents,
199
+ };
200
+ }
201
+ function inspectAppendPath(filePath) {
202
+ const stat = fsSync.lstatSync(filePath, { bigint: true });
203
+ if (stat.isSymbolicLink())
204
+ throw new Error(`Refusing to append through symlink: ${filePath}`);
205
+ if (!stat.isFile())
206
+ throw new Error(`Refusing to append to non-file: ${filePath}`);
207
+ return stat;
208
+ }
209
+ function prepareRegularAppend(filePath, rejectSymlinkParents) {
210
+ if (rejectSymlinkParents === true) {
230
211
  const resolvedDir = resolvePathPreservingWindowsRoot(path.dirname(filePath));
231
- await assertNoSymlinkParents({
212
+ assertNoSymlinkParentsSync({
232
213
  rootDir: path.parse(resolvedDir).root,
233
214
  targetPath: resolvedDir,
234
215
  allowMissing: false,
@@ -237,35 +218,45 @@ export async function appendRegularFile(options) {
237
218
  messagePrefix: "Refusing to append under",
238
219
  });
239
220
  }
240
- let preOpenStat;
241
221
  try {
242
- preOpenStat = await inspectFileIdentity(async () => {
243
- const stat = fsSync.lstatSync(filePath, { bigint: true });
244
- if (stat.isSymbolicLink()) {
245
- throw new Error(`Refusing to append through symlink: ${filePath}`);
246
- }
247
- if (!stat.isFile()) {
248
- throw new Error(`Refusing to append to non-file: ${filePath}`);
249
- }
250
- return stat;
251
- });
222
+ return inspectFileIdentitySync(() => inspectAppendPath(filePath));
252
223
  }
253
224
  catch (error) {
254
225
  if (!isNotFoundPathError(error))
255
226
  throw error;
256
227
  }
257
- const contentBytes = Buffer.isBuffer(options.content)
258
- ? options.content.byteLength
259
- : Buffer.byteLength(options.content, options.encoding ?? "utf8");
260
- if (options.maxFileBytes !== undefined &&
261
- Number(preOpenStat?.size ?? 0n) + contentBytes > options.maxFileBytes) {
228
+ }
229
+ function inspectOpenedRegularAppend(fd, filePath, preOpenStat) {
230
+ try {
231
+ const identity = inspectFileIdentitySync(() => {
232
+ const stat = fsSync.fstatSync(fd, { bigint: true });
233
+ assertRegularAppendStat(stat, filePath);
234
+ return stat;
235
+ }, preOpenStat);
236
+ inspectFileIdentitySync(() => {
237
+ const current = fsSync.lstatSync(filePath, { bigint: true });
238
+ assertRegularAppendStat(current, filePath);
239
+ return current;
240
+ }, identity);
241
+ return identity;
242
+ }
243
+ catch (error) {
244
+ throwAppendIdentityError(error, filePath);
245
+ }
246
+ }
247
+ export async function appendRegularFile(options) {
248
+ const { filePath, content, encoding, mode, maxFileBytes, rejectSymlinkParents } = captureAppendOptions(options);
249
+ const preOpenStat = prepareRegularAppend(filePath, rejectSymlinkParents);
250
+ const contentBytes = Buffer.isBuffer(content) ? content.byteLength : Buffer.byteLength(content, encoding);
251
+ if (maxFileBytes !== undefined &&
252
+ Number(preOpenStat?.size ?? 0n) + contentBytes > maxFileBytes) {
262
253
  return;
263
254
  }
264
255
  await getFsSafeTestHooks()?.beforeRegularFileAppendOpen?.(filePath);
265
256
  const flags = resolveRegularFileAppendFlags();
266
257
  let handle;
267
258
  try {
268
- handle = await fs.open(filePath, flags, options.mode ?? 0o600);
259
+ handle = await fs.open(filePath, flags, mode);
269
260
  }
270
261
  catch (error) {
271
262
  if (await isNonRegularWriteOpenError(error, filePath, flags)) {
@@ -274,30 +265,14 @@ export async function appendRegularFile(options) {
274
265
  throw error;
275
266
  }
276
267
  try {
277
- let identity;
278
- try {
279
- identity = await inspectFileIdentity(async () => {
280
- const stat = fsSync.fstatSync(handle.fd, { bigint: true });
281
- assertRegularAppendStat(stat, filePath);
282
- return stat;
283
- }, preOpenStat);
284
- await inspectFileIdentity(async () => {
285
- const current = fsSync.lstatSync(filePath, { bigint: true });
286
- assertRegularAppendStat(current, filePath);
287
- return current;
288
- }, identity);
289
- }
290
- catch (error) {
291
- throwAppendIdentityError(error, filePath);
292
- }
293
- if (options.maxFileBytes !== undefined &&
294
- Number(identity.size) + contentBytes > options.maxFileBytes) {
268
+ const identity = inspectOpenedRegularAppend(handle.fd, filePath, preOpenStat);
269
+ if (maxFileBytes !== undefined &&
270
+ Number(identity.size) + contentBytes > maxFileBytes) {
295
271
  return;
296
272
  }
297
- const mode = options.mode ?? 0o600;
298
273
  // Tighten before writing; restore explicit special bits only after content is complete.
299
274
  await handle.chmod(mode);
300
- await handle.appendFile(options.content, options.encoding ?? "utf8");
275
+ await handle.appendFile(content, encoding);
301
276
  if (mode & 0o7000)
302
277
  await handle.chmod(mode);
303
278
  }
@@ -306,48 +281,18 @@ export async function appendRegularFile(options) {
306
281
  }
307
282
  }
308
283
  export function appendRegularFileSync(options) {
309
- const filePath = options.filePath;
310
- assertNoWindowsPathAlias(filePath, "filesystem", "file path uses a Windows filesystem namespace alias");
311
- if (options.rejectSymlinkParents === true) {
312
- const resolvedDir = resolvePathPreservingWindowsRoot(path.dirname(filePath));
313
- assertNoSymlinkParentsSync({
314
- rootDir: path.parse(resolvedDir).root,
315
- targetPath: resolvedDir,
316
- allowMissing: false,
317
- allowRootChildSymlink: true,
318
- requireDirectories: true,
319
- messagePrefix: "Refusing to append under",
320
- });
321
- }
322
- let preOpenStat;
323
- try {
324
- preOpenStat = inspectFileIdentitySync(() => {
325
- const stat = fsSync.lstatSync(filePath, { bigint: true });
326
- if (stat.isSymbolicLink()) {
327
- throw new Error(`Refusing to append through symlink: ${filePath}`);
328
- }
329
- if (!stat.isFile()) {
330
- throw new Error(`Refusing to append to non-file: ${filePath}`);
331
- }
332
- return stat;
333
- });
334
- }
335
- catch (error) {
336
- if (!isNotFoundPathError(error))
337
- throw error;
338
- }
339
- const contentBuffer = typeof options.content === "string"
340
- ? Buffer.from(options.content, options.encoding ?? "utf8")
341
- : Buffer.from(options.content);
342
- if (options.maxFileBytes !== undefined &&
343
- Number(preOpenStat?.size ?? 0n) + contentBuffer.byteLength > options.maxFileBytes) {
284
+ const { filePath, content, encoding, mode, maxFileBytes, rejectSymlinkParents } = captureAppendOptions(options);
285
+ const preOpenStat = prepareRegularAppend(filePath, rejectSymlinkParents);
286
+ const contentBuffer = typeof content === "string" ? Buffer.from(content, encoding) : Buffer.from(content);
287
+ if (maxFileBytes !== undefined &&
288
+ Number(preOpenStat?.size ?? 0n) + contentBuffer.byteLength > maxFileBytes) {
344
289
  return;
345
290
  }
346
291
  getFsSafeTestHooks()?.beforeRegularFileAppendOpenSync?.(filePath);
347
292
  const flags = resolveRegularFileAppendFlags();
348
293
  let fd;
349
294
  try {
350
- fd = fsSync.openSync(filePath, flags, options.mode ?? 0o600);
295
+ fd = fsSync.openSync(filePath, flags, mode);
351
296
  }
352
297
  catch (error) {
353
298
  if (isNonRegularWriteOpenErrorSync(error, filePath, flags)) {
@@ -356,27 +301,11 @@ export function appendRegularFileSync(options) {
356
301
  throw error;
357
302
  }
358
303
  try {
359
- let identity;
360
- try {
361
- identity = inspectFileIdentitySync(() => {
362
- const stat = fsSync.fstatSync(fd, { bigint: true });
363
- assertRegularAppendStat(stat, filePath);
364
- return stat;
365
- }, preOpenStat);
366
- inspectFileIdentitySync(() => {
367
- const current = fsSync.lstatSync(filePath, { bigint: true });
368
- assertRegularAppendStat(current, filePath);
369
- return current;
370
- }, identity);
371
- }
372
- catch (error) {
373
- throwAppendIdentityError(error, filePath);
374
- }
375
- if (options.maxFileBytes !== undefined &&
376
- Number(identity.size) + contentBuffer.byteLength > options.maxFileBytes) {
304
+ const identity = inspectOpenedRegularAppend(fd, filePath, preOpenStat);
305
+ if (maxFileBytes !== undefined &&
306
+ Number(identity.size) + contentBuffer.byteLength > maxFileBytes) {
377
307
  return;
378
308
  }
379
- const mode = options.mode ?? 0o600;
380
309
  fsSync.fchmodSync(fd, mode);
381
310
  fsSync.appendFileSync(fd, contentBuffer);
382
311
  if (mode & 0o7000)
@@ -4,4 +4,3 @@ export type ReplaceDirectoryAtomicOptions = {
4
4
  backupPrefix?: string;
5
5
  };
6
6
  export declare function replaceDirectoryAtomic(options: ReplaceDirectoryAtomicOptions): Promise<void>;
7
- //# sourceMappingURL=replace-directory.d.ts.map
@@ -36,4 +36,3 @@ export declare function copyFallbackReplaceSync(params: {
36
36
  sync: boolean;
37
37
  }): void;
38
38
  export {};
39
- //# sourceMappingURL=replace-file-copy-fallback.d.ts.map
@@ -2,9 +2,10 @@ import syncFs, {} from "node:fs";
2
2
  import fs, {} from "node:fs/promises";
3
3
  import { readBoundedAsync, readBoundedSync } from "./bounded-read.js";
4
4
  import { FsSafeError } from "./errors.js";
5
- import { sameFileIdentity } from "./file-identity.js";
5
+ import { inspectFileIdentity, inspectFileIdentitySync } from "./strict-file-identity.js";
6
6
  import { readOwnedCopySource, readOwnedCopySourceSync } from "./replace-file-copy-source.js";
7
7
  import { resolveReadOpenFlags } from "./read-open-flags.js";
8
+ import { hasErrorCode } from "./file-cleanup.js";
8
9
  const SUPPORTS_NOFOLLOW = process.platform !== "win32" && "O_NOFOLLOW" in syncFs.constants;
9
10
  const NOFOLLOW = SUPPORTS_NOFOLLOW ? syncFs.constants.O_NOFOLLOW : 0;
10
11
  const OPEN_READ_FLAGS = resolveReadOpenFlags();
@@ -19,39 +20,37 @@ function closeSyncAfterAdmissionFailure(fsModule, fd, error) {
19
20
  }
20
21
  throw error;
21
22
  }
22
- function notFound(error) {
23
- return error.code === "ENOENT";
24
- }
25
- function assertPinnedDestination(pathname, opened, dest, hardlinks, admission) {
23
+ function admitDestinationKind(pathname, opened, dest, admission) {
26
24
  if (admission === "hardlinks") {
27
- if (pathname.isSymbolicLink() || !pathname.isFile() || !sameFileIdentity(pathname, opened)) {
25
+ if (pathname.isSymbolicLink() || !pathname.isFile()) {
28
26
  throw new FsSafeError("path-mismatch", `Atomic replace destination changed while opening: ${dest}`);
29
27
  }
30
- if (opened.nlink > 1) {
31
- throw new FsSafeError("hardlink", `Hardlinked atomic replace destination not allowed: ${dest}`);
32
- }
33
- return;
34
28
  }
35
- if (pathname.isSymbolicLink()) {
29
+ else if (pathname.isSymbolicLink()) {
36
30
  throw new FsSafeError("symlink", `Refusing copy fallback through symlink destination: ${dest}`);
37
31
  }
38
- if (!pathname.isFile() || !opened.isFile()) {
32
+ else if (!pathname.isFile() || !opened.isFile()) {
39
33
  throw new FsSafeError("not-file", `Copy fallback destination must be a regular file: ${dest}`);
40
34
  }
41
- if (!sameFileIdentity(pathname, opened)) {
42
- throw new FsSafeError("path-mismatch", `Copy fallback destination changed while opening: ${dest}`);
43
- }
44
- if (hardlinks === "reject" && opened.nlink > 1) {
45
- throw new FsSafeError("hardlink", `Hardlinked copy fallback destination not allowed: ${dest}`);
35
+ return pathname;
36
+ }
37
+ function assertDestinationLinks(opened, dest, admission, hardlinks) {
38
+ if ((admission === "hardlinks" || hardlinks === "reject") && opened.nlink > 1n) {
39
+ throw new FsSafeError("hardlink", `Hardlinked ${admission === "hardlinks" ? "atomic replace" : "copy fallback"} destination not allowed: ${dest}`);
46
40
  }
47
41
  }
42
+ function inspectPinnedDestinationSync(fsModule, fd, dest, admission, hardlinks) {
43
+ const opened = inspectFileIdentitySync(() => fsModule.fstatSync(fd, { bigint: true }));
44
+ inspectFileIdentitySync(() => admitDestinationKind(fsModule.lstatSync(dest, { bigint: true }), opened, dest, admission), opened);
45
+ assertDestinationLinks(opened, dest, admission, hardlinks);
46
+ }
48
47
  async function openPinnedDestination(fsModule, dest, admission, hardlinks) {
49
48
  let preview;
50
49
  try {
51
50
  preview = fsModule === fs ? syncFs.lstatSync(dest) : await fsModule.lstat(dest);
52
51
  }
53
52
  catch (error) {
54
- if (notFound(error))
53
+ if (hasErrorCode(error, "ENOENT"))
55
54
  return null;
56
55
  throw error;
57
56
  }
@@ -64,13 +63,22 @@ async function openPinnedDestination(fsModule, dest, admission, hardlinks) {
64
63
  }
65
64
  const handle = await fsModule.open(dest, admission === "restore" ? OPEN_READ_WRITE_FLAGS : OPEN_READ_FLAGS);
66
65
  try {
67
- const opened = fsModule === fs ? syncFs.fstatSync(handle.fd) : await handle.stat();
68
- const current = fsModule === fs ? syncFs.lstatSync(dest) : await fsModule.lstat(dest);
69
- assertPinnedDestination(current, opened, dest, hardlinks, admission);
66
+ if (fsModule === fs)
67
+ inspectPinnedDestinationSync(syncFs, handle.fd, dest, admission, hardlinks);
68
+ else {
69
+ const opened = await inspectFileIdentity(() => handle.stat({ bigint: true }));
70
+ await inspectFileIdentity(async () => admitDestinationKind(await fsModule.lstat(dest, { bigint: true }), opened, dest, admission), opened);
71
+ assertDestinationLinks(opened, dest, admission, hardlinks);
72
+ }
70
73
  return handle;
71
74
  }
72
75
  catch (error) {
73
- await handle.close().catch(() => undefined);
76
+ try {
77
+ await handle.close();
78
+ }
79
+ catch {
80
+ // Preserve the already-selected admission failure.
81
+ }
74
82
  throw error;
75
83
  }
76
84
  }
@@ -80,7 +88,7 @@ function openPinnedDestinationSync(fsModule, dest, admission, hardlinks) {
80
88
  preview = fsModule.lstatSync(dest);
81
89
  }
82
90
  catch (error) {
83
- if (notFound(error))
91
+ if (hasErrorCode(error, "ENOENT"))
84
92
  return null;
85
93
  throw error;
86
94
  }
@@ -91,8 +99,7 @@ function openPinnedDestinationSync(fsModule, dest, admission, hardlinks) {
91
99
  }
92
100
  const fd = fsModule.openSync(dest, admission === "restore" ? OPEN_READ_WRITE_FLAGS : OPEN_READ_FLAGS);
93
101
  try {
94
- const opened = fsModule.fstatSync(fd);
95
- assertPinnedDestination(fsModule.lstatSync(dest), opened, dest, hardlinks, admission);
102
+ inspectPinnedDestinationSync(fsModule, fd, dest, admission, hardlinks);
96
103
  return fd;
97
104
  }
98
105
  catch (error) {
@@ -103,8 +110,14 @@ export async function assertDestinationHardlinkPolicy(fsModule, dest, policy) {
103
110
  if (policy !== "reject")
104
111
  return;
105
112
  const handle = await openPinnedDestination(fsModule, dest, "hardlinks");
106
- if (handle)
107
- await handle.close().catch(() => undefined);
113
+ if (!handle)
114
+ return;
115
+ try {
116
+ await handle.close();
117
+ }
118
+ catch {
119
+ // The asynchronous admission pin has best-effort close semantics.
120
+ }
108
121
  }
109
122
  export function assertDestinationHardlinkPolicySync(fsModule, dest, policy) {
110
123
  if (policy !== "reject")
@@ -239,7 +252,7 @@ export async function copyFallbackReplace(params) {
239
252
  ? syncFs.lstatSync(params.dest) : await params.fsModule.lstat(params.dest);
240
253
  }
241
254
  catch (error) {
242
- if (!notFound(error))
255
+ if (!hasErrorCode(error, "ENOENT"))
243
256
  throw error;
244
257
  }
245
258
  if (destStat?.isSymbolicLink()) {
@@ -294,7 +307,7 @@ export function copyFallbackReplaceSync(params) {
294
307
  destStat = params.fsModule.lstatSync(params.dest);
295
308
  }
296
309
  catch (error) {
297
- if (!notFound(error))
310
+ if (!hasErrorCode(error, "ENOENT"))
298
311
  throw error;
299
312
  }
300
313
  if (destStat?.isSymbolicLink()) {
@@ -18,4 +18,3 @@ export declare function readOwnedCopySourceSync(params: {
18
18
  mode: number;
19
19
  };
20
20
  export {};
21
- //# sourceMappingURL=replace-file-copy-source.d.ts.map
@@ -3,8 +3,8 @@ import fs, {} from "node:fs/promises";
3
3
  import { readBoundedSync } from "./bounded-read.js";
4
4
  import { resolveReadOpenFlags } from "./read-open-flags.js";
5
5
  import { FsSafeError } from "./errors.js";
6
- import { sameFileIdentity } from "./file-identity.js";
7
6
  import { inspectFileIdentity, inspectFileIdentitySync } from "./strict-file-identity.js";
7
+ import { hasErrorCode } from "./file-cleanup.js";
8
8
  const OPEN_READ_FLAGS = resolveReadOpenFlags();
9
9
  function assertSourcePreview(source, src) {
10
10
  if (source.isSymbolicLink()) {
@@ -18,10 +18,10 @@ function assertSourcePreview(source, src) {
18
18
  }
19
19
  }
20
20
  function assertOpenedSource(opened, current, src) {
21
- if (!opened.isFile() || current.isSymbolicLink() || !sameFileIdentity(opened, current)) {
21
+ if (!opened.isFile() || current.isSymbolicLink()) {
22
22
  throw new FsSafeError("path-mismatch", `Copy fallback source changed while opening: ${src}`);
23
23
  }
24
- if (opened.nlink !== 1) {
24
+ if (opened.nlink !== 1n) {
25
25
  throw new FsSafeError("hardlink", `Hardlinked copy fallback source not allowed: ${src}`);
26
26
  }
27
27
  }
@@ -35,7 +35,7 @@ async function openSource(fsModule, src) {
35
35
  return await fsModule.open(src, OPEN_READ_FLAGS);
36
36
  }
37
37
  catch (error) {
38
- if (error.code === "ELOOP") {
38
+ if (hasErrorCode(error, "ELOOP")) {
39
39
  throw sourceSymlinkError(src, error);
40
40
  }
41
41
  throw error;
@@ -46,7 +46,7 @@ function openSourceSync(fsModule, src) {
46
46
  return fsModule.openSync(src, OPEN_READ_FLAGS);
47
47
  }
48
48
  catch (error) {
49
- if (error.code === "ELOOP") {
49
+ if (hasErrorCode(error, "ELOOP")) {
50
50
  throw sourceSymlinkError(src, error);
51
51
  }
52
52
  throw error;
@@ -65,34 +65,30 @@ export async function readOwnedCopySource(params) {
65
65
  ? syncFs.lstatSync(params.src) : await params.fsModule.lstat(params.src), params.src);
66
66
  const handle = await openSource(params.fsModule, params.src);
67
67
  try {
68
- if (params.expectedIdentity) {
69
- const exact = await inspectFileIdentity(() => params.fsModule === fs
70
- ? syncFs.fstatSync(handle.fd, { bigint: true }) : handle.stat({ bigint: true }), params.expectedIdentity);
71
- await inspectFileIdentity(() => params.fsModule === fs
72
- ? syncFs.lstatSync(params.src, { bigint: true }) : params.fsModule.lstat(params.src, { bigint: true }), exact);
73
- }
74
- const opened = params.fsModule === fs ? syncFs.fstatSync(handle.fd) : await handle.stat();
75
- const current = params.fsModule === fs
76
- ? syncFs.lstatSync(params.src) : await params.fsModule.lstat(params.src);
68
+ const opened = await inspectFileIdentity(() => params.fsModule === fs
69
+ ? syncFs.fstatSync(handle.fd, { bigint: true }) : handle.stat({ bigint: true }), params.expectedIdentity);
70
+ const current = await inspectFileIdentity(() => params.fsModule === fs
71
+ ? syncFs.lstatSync(params.src, { bigint: true }) : params.fsModule.lstat(params.src, { bigint: true }), opened);
77
72
  assertOpenedSource(opened, current, params.src);
78
- return { replacement: await handle.readFile(), mode: opened.mode };
73
+ return { replacement: await handle.readFile(), mode: Number(opened.mode) };
79
74
  }
80
75
  finally {
81
- await handle.close().catch(() => undefined);
76
+ try {
77
+ await handle.close();
78
+ }
79
+ catch {
80
+ // Best-effort close includes synchronous adapter throws.
81
+ }
82
82
  }
83
83
  }
84
84
  export function readOwnedCopySourceSync(params) {
85
85
  assertSourcePreview(params.fsModule.lstatSync(params.src), params.src);
86
86
  const fd = openSourceSync(params.fsModule, params.src);
87
87
  try {
88
- if (params.expectedIdentity) {
89
- const exact = inspectFileIdentitySync(() => params.fsModule.fstatSync(fd, { bigint: true }), params.expectedIdentity);
90
- inspectFileIdentitySync(() => params.fsModule.lstatSync(params.src, { bigint: true }), exact);
91
- }
92
- const opened = params.fsModule.fstatSync(fd);
93
- const current = params.fsModule.lstatSync(params.src);
88
+ const opened = inspectFileIdentitySync(() => params.fsModule.fstatSync(fd, { bigint: true }), params.expectedIdentity);
89
+ const current = inspectFileIdentitySync(() => params.fsModule.lstatSync(params.src, { bigint: true }), opened);
94
90
  assertOpenedSource(opened, current, params.src);
95
- return { replacement: readAllSync(params.fsModule, fd, opened.size), mode: opened.mode };
91
+ return { replacement: readAllSync(params.fsModule, fd, Number(opened.size)), mode: Number(opened.mode) };
96
92
  }
97
93
  finally {
98
94
  try {
@@ -48,4 +48,3 @@ export declare function writeTempFileSync(params: {
48
48
  identity: BigIntStats;
49
49
  };
50
50
  export {};
51
- //# sourceMappingURL=replace-file-descriptor.d.ts.map