@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
package/dist/archive.js CHANGED
@@ -6,24 +6,23 @@ import fs from "node:fs/promises";
6
6
  import path from "node:path";
7
7
  import { Readable } from "node:stream";
8
8
  import { pipeline } from "node:stream/promises";
9
- import { createArchiveOutputPathTracker, resolveArchiveOutputPath, stripArchivePath, validateArchiveEntryPath, } from "./archive-entry.js";
9
+ import { createArchiveEntrySelector } from "./archive-plan.js";
10
10
  import { createPipelineTimeoutError, waitForDeadline, withExtractionDeadline, } from "./archive-deadline.js";
11
- import { assertArchiveEntryCountWithinLimit, assertArchiveEntryPathComponentsWithinLimit, createByteBudgetTracker, createExtractBudgetTransform, resolveExtractLimits, resolveTarMeterLimits, } from "./archive-limits.js";
11
+ import { assertArchiveEntryCountWithinLimit, createByteBudgetTracker, createExtractBudgetTransform, resolveExtractLimits, resolveTarMeterLimits, } from "./archive-limits.js";
12
12
  import { resolveArchiveKind } from "./archive-kind.js";
13
- import { prepareArchiveDestinationGuard, preparePrivateArchiveOutputPath, withStagedArchiveDestination, } from "./archive-staging.js";
14
- import { mergePlannedArchiveIntoDestination } from "./archive-merge.js";
13
+ import { prepareArchiveDestinationGuard, preparePrivateArchiveOutputPath, } from "./archive-staging.js";
14
+ import { withStagedArchivePublication } from "./archive-merge.js";
15
15
  import { loadZipArchiveWithPreflight } from "./archive-zip-preflight.js";
16
+ import { admittedZipEntries } from "./archive-zip-loader.js";
16
17
  import { zipEntryKind, zipEntryDeclaredSize, zipEntryMode, } from "./archive-zip-entry.js";
17
18
  import { createZipIntegrityTransform, normalizeZipIntegrityError, } from "./archive-zip-integrity.js";
18
- import { FsSafeError } from "./errors.js";
19
19
  import { ArchiveSecurityError } from "./archive-errors.js";
20
20
  import { extractNativeArchive } from "./archive-native.js";
21
21
  import { stageArchiveFileForExtraction } from "./archive-input.js";
22
22
  import { getNativeBinding } from "./native.js";
23
- import { resolveArchiveFilteredEntryPolicy, shouldExtractArchiveEntry, } from "./archive-policy.js";
23
+ import { resolveArchiveFilteredEntryPolicy } from "./archive-policy.js";
24
24
  import { writeSiblingTempFile } from "./sibling-temp.js";
25
25
  import { assertNoWindowsPathAlias } from "./windows-path-alias.js";
26
- import { realpathSync } from "./realpath.js";
27
26
  export { isWindowsDrivePath, normalizeArchiveEntryPath, resolveArchiveOutputPath, stripArchivePath, validateArchiveEntryPath, } from "./archive-entry.js";
28
27
  export { resolveArchiveKind, resolvePackedRootDir } from "./archive-kind.js";
29
28
  export { readArchiveEntry } from "./archive-read.js";
@@ -47,26 +46,6 @@ async function readZipEntryStream(entry) {
47
46
  const buf = await entry.async("nodebuffer");
48
47
  return Readable.from(buf);
49
48
  }
50
- function resolveZipOutputPath(params) {
51
- validateArchiveEntryPath(params.entryPath);
52
- const canonicalPath = stripArchivePath(params.entryPath, 0);
53
- if (!canonicalPath)
54
- return null;
55
- const relPath = params.strip === 0 ? canonicalPath : stripArchivePath(canonicalPath, params.strip);
56
- if (!relPath) {
57
- return null;
58
- }
59
- validateArchiveEntryPath(relPath);
60
- return {
61
- canonicalPath,
62
- relPath,
63
- outPath: resolveArchiveOutputPath({
64
- rootDir: params.destinationDir,
65
- relPath,
66
- originalPath: params.entryPath,
67
- }),
68
- };
69
- }
70
49
  async function writeZipFileEntry(params) {
71
50
  params.deadline.check();
72
51
  params.budget.startEntry();
@@ -117,96 +96,56 @@ async function writeZipFileEntry(params) {
117
96
  }
118
97
  }
119
98
  async function extractZip(params) {
120
- const limits = resolveExtractLimits(params.limits);
121
- const stagedArchive = await stageArchiveFileForExtraction({
122
- archivePath: params.archivePath,
123
- limits,
124
- deadline: params.deadline,
99
+ const { limits, deadline } = params;
100
+ const destinationGuard = await prepareArchiveDestinationGuard(params.destDir);
101
+ deadline.check();
102
+ const buffer = await fs.readFile(params.archivePath, { signal: deadline.signal });
103
+ deadline.check();
104
+ const zip = await waitForDeadline(loadZipArchiveWithPreflight(buffer, limits), deadline);
105
+ deadline.check();
106
+ const entries = admittedZipEntries(zip);
107
+ assertArchiveEntryCountWithinLimit(entries.length, limits);
108
+ const budget = createByteBudgetTracker(limits);
109
+ await withStagedArchivePublication({ ...params, destinationGuard }, async (stagingDir) => {
110
+ const { select } = createArchiveEntrySelector({ ...params, rootDir: stagingDir });
111
+ const acceptedEntries = [];
112
+ for (const entry of entries) {
113
+ deadline.check();
114
+ const entryKind = zipEntryKind(entry);
115
+ const relPath = select({ path: entry.name, kind: entryKind, size: zipEntryDeclaredSize(entry) });
116
+ if (relPath === null)
117
+ continue;
118
+ if (entryKind === "symlink") {
119
+ throw new ArchiveSecurityError("entry-link", `zip entry is a link: ${entry.name}`);
120
+ }
121
+ if (entryKind === "other")
122
+ continue;
123
+ const mode = zipEntryMode(entry, params.entryModes);
124
+ acceptedEntries.push({ path: relPath, kind: entry.dir ? "directory" : "file", mode });
125
+ const outPath = path.join(stagingDir, relPath);
126
+ await preparePrivateArchiveOutputPath({
127
+ destinationDir: stagingDir,
128
+ destinationRealDir: stagingDir,
129
+ relPath,
130
+ outPath,
131
+ originalPath: entry.name,
132
+ isDirectory: entry.dir,
133
+ deadline,
134
+ });
135
+ if (!entry.dir) {
136
+ await writeZipFileEntry({ entry, outPath, budget, deadline });
137
+ }
138
+ }
139
+ return acceptedEntries;
125
140
  });
126
- try {
127
- const destinationGuard = await prepareArchiveDestinationGuard(params.destDir);
128
- const destinationRealDir = destinationGuard.realPath;
129
- params.deadline.check();
130
- const buffer = await fs.readFile(stagedArchive.path, { signal: params.deadline.signal });
131
- params.deadline.check();
132
- const zip = await waitForDeadline(loadZipArchiveWithPreflight(buffer, limits), params.deadline);
133
- params.deadline.check();
134
- const entries = Object.values(zip.files);
135
- const strip = Math.max(0, Math.floor(params.stripComponents ?? 0));
136
- assertArchiveEntryCountWithinLimit(entries.length, limits);
137
- const budget = createByteBudgetTracker(limits);
138
- const trackOutputPath = createArchiveOutputPathTracker();
139
- await withStagedArchiveDestination({
140
- destinationRealDir,
141
- run: async (stagingDir) => {
142
- const stagingRealDir = realpathSync.native(stagingDir);
143
- const acceptedEntries = [];
144
- for (const entry of entries) {
145
- params.deadline.check();
146
- const output = resolveZipOutputPath({
147
- entryPath: entry.name,
148
- strip,
149
- destinationDir: stagingRealDir,
150
- });
151
- if (!output) {
152
- continue;
153
- }
154
- assertArchiveEntryPathComponentsWithinLimit(output.relPath, limits);
155
- trackOutputPath(output.relPath, entry.name);
156
- const entryKind = zipEntryKind(entry);
157
- const entrySize = zipEntryDeclaredSize(entry);
158
- if (!shouldExtractArchiveEntry({
159
- filter: params.entryFilter,
160
- onFiltered: params.onFiltered,
161
- entry: { path: output.canonicalPath, kind: entryKind, size: entrySize },
162
- })) {
163
- continue;
164
- }
165
- if (entryKind === "symlink") {
166
- throw new ArchiveSecurityError("entry-link", `zip entry is a link: ${entry.name}`);
167
- }
168
- if (entryKind === "other")
169
- continue;
170
- const mode = zipEntryMode(entry, params.entryModes);
171
- acceptedEntries.push({ path: output.relPath, kind: entry.dir ? "directory" : "file", mode });
172
- await preparePrivateArchiveOutputPath({
173
- destinationDir: stagingRealDir,
174
- destinationRealDir: stagingRealDir,
175
- relPath: output.relPath,
176
- outPath: output.outPath,
177
- originalPath: entry.name,
178
- isDirectory: entry.dir,
179
- deadline: params.deadline,
180
- });
181
- if (entry.dir) {
182
- continue;
183
- }
184
- await writeZipFileEntry({
185
- entry,
186
- outPath: output.outPath,
187
- budget,
188
- deadline: params.deadline,
189
- });
190
- }
191
- params.deadline.check();
192
- await mergePlannedArchiveIntoDestination({
193
- entries: acceptedEntries,
194
- durable: params.durable,
195
- sourceDir: stagingRealDir,
196
- destinationGuard,
197
- deadline: params.deadline,
198
- });
199
- params.deadline.check();
200
- },
201
- });
202
- }
203
- finally {
204
- await stagedArchive.cleanup();
205
- }
206
141
  }
207
142
  export async function extractArchive(params) {
208
143
  const archivePath = params.archivePath;
209
144
  const destDir = params.destDir;
145
+ const { entryUmask = 0 } = params;
146
+ if (!Number.isInteger(entryUmask) || entryUmask < 0 || entryUmask > 0o777) {
147
+ throw new RangeError("archive entryUmask must be an integer between 0 and 0o777");
148
+ }
210
149
  const onFiltered = resolveArchiveFilteredEntryPolicy(params.onFiltered);
211
150
  const kind = params.kind ?? resolveArchiveKind(archivePath);
212
151
  if (!kind) {
@@ -224,64 +163,54 @@ export async function extractArchive(params) {
224
163
  archivePath, destDir,
225
164
  durable: params.durable,
226
165
  stripComponents: params.stripComponents, limits,
227
- entryModes: params.entryModes, entryFilter: params.entryFilter, onFiltered,
166
+ entryModes: params.entryModes, entryUmask, entryFilter: params.entryFilter, onFiltered,
228
167
  };
229
- if (native) {
230
- await withExtractionDeadline(params.timeoutMs, label, async (deadline) => extractNativeArchive({ ...options, binding: native, kind, tarLimits, deadline }));
231
- return;
232
- }
233
- if (kind !== "zip") {
234
- await withExtractionDeadline(params.timeoutMs, label, async (deadline) => {
235
- const stagedArchive = await stageArchiveFileForExtraction({
236
- archivePath: options.archivePath,
237
- limits,
238
- deadline,
239
- });
240
- try {
241
- await extractWasmTar({ archivePath: stagedArchive.path, kind, options, limits, tarLimits, deadline });
242
- }
243
- finally {
244
- await stagedArchive.cleanup();
245
- }
246
- });
247
- return;
248
- }
249
- await withExtractionDeadline(params.timeoutMs, label, async (deadline) => extractZip({ ...options, deadline }));
168
+ await withExtractionDeadline(params.timeoutMs, label, async (deadline) => {
169
+ const stagedArchive = await stageArchiveFileForExtraction({ archivePath, limits, deadline });
170
+ try {
171
+ deadline.check();
172
+ const stagedOptions = { ...options, archivePath: stagedArchive.path, deadline };
173
+ if (native)
174
+ await extractNativeArchive({ ...stagedOptions, binding: native, kind, tarLimits });
175
+ else if (kind === "zip")
176
+ await extractZip(stagedOptions);
177
+ else
178
+ await extractWasmTar({ ...stagedOptions, kind, tarLimits });
179
+ }
180
+ finally {
181
+ await stagedArchive.cleanup();
182
+ }
183
+ });
250
184
  }
251
185
  async function extractWasmTar(params) {
252
- const { options, deadline, tarLimits } = params;
186
+ const { deadline, tarLimits } = params;
253
187
  const manifest = [];
254
188
  await inspectTar({ archivePath: params.archivePath, kind: params.kind, limits: tarLimits, signal: deadline.signal,
255
189
  onMember: (entry) => { manifest.push(entry); } });
256
190
  deadline.check();
257
- const destinationGuard = await prepareArchiveDestinationGuard(options.destDir);
258
- const destinationRealDir = destinationGuard.realPath;
259
- await withStagedArchiveDestination({ destinationRealDir, run: async (stagingPath) => {
260
- const stagingDir = realpathSync.native(stagingPath);
261
- const planEntry = createTarEntryPlanner({ ...options, rootDir: destinationRealDir, limits: params.limits });
262
- const accepted = manifest.flatMap((entry) => {
263
- deadline.check();
264
- const planned = planEntry(entry);
265
- return planned ? [{ ...entry, ...planned }] : [];
266
- });
267
- await replayTar({ archivePath: params.archivePath, kind: params.kind, limits: tarLimits, signal: deadline.signal, members: accepted,
268
- async consume(member, payload) {
269
- deadline.check();
270
- await preparePrivateArchiveOutputPath({ destinationDir: stagingDir, destinationRealDir: stagingDir,
271
- relPath: member.path, outPath: path.join(stagingDir, member.path), originalPath: member.path,
272
- isDirectory: member.kind === "directory", deadline });
273
- if (member.kind === "file") {
274
- await runPinnedWriteHelper({ rootPath: stagingDir, relativeParentPath: path.posix.dirname(member.path),
275
- basename: path.posix.basename(member.path), mkdir: false, mode: 0o600, overwrite: false,
276
- sync: false,
277
- maxBytes: member.size, input: { kind: "stream", stream: Readable.from(payload) } });
278
- }
279
- deadline.check();
280
- },
281
- });
191
+ const destinationGuard = await prepareArchiveDestinationGuard(params.destDir);
192
+ await withStagedArchivePublication({ ...params, destinationGuard }, async (stagingDir) => {
193
+ const planEntry = createTarEntryPlanner({ ...params, rootDir: destinationGuard.realPath });
194
+ const accepted = manifest.flatMap((entry) => {
282
195
  deadline.check();
283
- await mergePlannedArchiveIntoDestination({ entries: accepted, sourceDir: stagingDir, destinationGuard,
284
- deadline, durable: options.durable });
285
- deadline.check();
286
- } });
196
+ const planned = planEntry(entry);
197
+ return planned ? [{ ...entry, ...planned }] : [];
198
+ });
199
+ await replayTar({ archivePath: params.archivePath, kind: params.kind, limits: tarLimits, signal: deadline.signal, members: accepted,
200
+ async consume(member, payload) {
201
+ deadline.check();
202
+ await preparePrivateArchiveOutputPath({ destinationDir: stagingDir, destinationRealDir: stagingDir,
203
+ relPath: member.path, outPath: path.join(stagingDir, member.path), originalPath: member.path,
204
+ isDirectory: member.kind === "directory", deadline });
205
+ if (member.kind === "file") {
206
+ await runPinnedWriteHelper({ rootPath: stagingDir, relativeParentPath: path.posix.dirname(member.path),
207
+ basename: path.posix.basename(member.path), mkdir: false, mode: 0o600, overwrite: false,
208
+ sync: false,
209
+ maxBytes: member.size, input: { kind: "stream", stream: Readable.from(payload) } });
210
+ }
211
+ deadline.check();
212
+ },
213
+ });
214
+ return accepted;
215
+ });
287
216
  }
@@ -1,2 +1 @@
1
1
  export declare function createAsyncLock(): <T>(fn: () => Promise<T>) => Promise<T>;
2
- //# sourceMappingURL=async-lock.d.ts.map
package/dist/atomic.d.ts CHANGED
@@ -2,4 +2,3 @@ export { replaceFileAtomic, replaceFileAtomicSync, type RenameIdentityPolicy, ty
2
2
  export { writeTextAtomic, type WriteTextAtomicOptions } from "./text-atomic.js";
3
3
  export { replaceDirectoryAtomic, type ReplaceDirectoryAtomicOptions } from "./replace-directory.js";
4
4
  export { movePathWithCopyFallback, type MovePathPublicationReceipt, type MovePathWithCopyFallbackOptions, } from "./move-path.js";
5
- //# sourceMappingURL=atomic.d.ts.map
@@ -1,3 +1,2 @@
1
1
  import { Transform } from "node:stream";
2
2
  export declare function createByteLimitTransform(maxBytes: number, overflowError: (bytes: number) => Error): Transform;
3
- //# sourceMappingURL=bounded-read-stream.d.ts.map
@@ -23,4 +23,3 @@ export declare function readBoundedSync(maxBytes: number, readChunk: (scratch: B
23
23
  /** Sync bounded read from a numeric descriptor. The caller owns the descriptor. */
24
24
  export declare function readFileDescriptorBoundedSync(fd: number, maxBytes: number): Buffer;
25
25
  export {};
26
- //# sourceMappingURL=bounded-read.d.ts.map
@@ -1,4 +1,3 @@
1
1
  export declare function normalizeMaxBytes(value: number | undefined, options?: {
2
2
  defaultValue?: number;
3
3
  }): number | undefined;
4
- //# sourceMappingURL=byte-budget.d.ts.map
@@ -0,0 +1,2 @@
1
+ /** Snapshot intrinsic view bounds without copying the borrowed payload. */
2
+ export declare function snapshotByteView(bytes: Uint8Array): Uint8Array;
@@ -0,0 +1,13 @@
1
+ const ByteView = Uint8Array;
2
+ const typedArray = Object.getPrototypeOf(ByteView.prototype);
3
+ const viewLength = Object.getOwnPropertyDescriptor(typedArray, "byteLength").get;
4
+ const viewOffset = Object.getOwnPropertyDescriptor(typedArray, "byteOffset").get;
5
+ const viewBuffer = Object.getOwnPropertyDescriptor(typedArray, "buffer").get;
6
+ /** Snapshot intrinsic view bounds without copying the borrowed payload. */
7
+ export function snapshotByteView(bytes) {
8
+ const length = Reflect.apply(viewLength, bytes, []);
9
+ // Preserve empty, detached, and out-of-bounds views as zero-byte inputs.
10
+ if (length === 0)
11
+ return new ByteView(0);
12
+ return new ByteView(Reflect.apply(viewBuffer, bytes, []), Reflect.apply(viewOffset, bytes, []), length);
13
+ }
@@ -17,4 +17,3 @@ export type CloneFileMetadata = {
17
17
  * These are point-in-time facts, not authorization or a guarantee against later edits.
18
18
  */
19
19
  export declare function readCloneFileMetadata(files: readonly string[]): Promise<(CloneFileMetadata | undefined)[]>;
20
- //# sourceMappingURL=clone-metadata.d.ts.map
package/dist/config.d.ts CHANGED
@@ -1,3 +1,2 @@
1
1
  export { configureFsSafePython, configureFsSafeNative, getFsSafeNativeConfig, type FsSafePythonConfig, type FsSafeNativeConfig, type FsSafeNativeMode, } from "./native-config.js";
2
2
  export { configureFsSafeLocks, getFsSafeLockConfig, type FsSafeLockConfig, } from "./lock-config.js";
3
- //# sourceMappingURL=config.d.ts.map
@@ -1,2 +1 @@
1
1
  export type ContainmentGuarantee = "kernel-atomic" | "best-effort";
2
- //# sourceMappingURL=containment.d.ts.map
@@ -19,4 +19,3 @@ export declare function assertCopySourceCurrent(source: {
19
19
  export declare function writeCopyFileToFd(fd: number, input: CopyFileInput, maxBytes?: number, assertBeforeMutation?: () => void): Promise<void>;
20
20
  export declare function createNativeCopyFile(native: NativeBinding, input: CopyFileInput, parentFd: number, basename: string, maxBytes: number | undefined, sync: boolean): Promise<NativeFileCopyResult | undefined>;
21
21
  export declare function assertNativeCopyCompleted(input: CopyFileInput, copied?: NativeFileCopyResult): void;
22
- //# sourceMappingURL=copy-file-input.d.ts.map
@@ -1,3 +1,2 @@
1
1
  export type CopyCloneMode = "auto" | "always" | "never";
2
2
  export declare function resolveCopyCloneMode(mode: CopyCloneMode | undefined, defaultMode: CopyCloneMode): CopyCloneMode;
3
- //# sourceMappingURL=copy-policy.d.ts.map
@@ -18,4 +18,3 @@ export type CopyPublicationOptions = {
18
18
  verify(): void;
19
19
  };
20
20
  };
21
- //# sourceMappingURL=copy-publication.d.ts.map
@@ -6,4 +6,3 @@ export declare function copyOwnedTree(source: ReturnType<typeof openStagedDirect
6
6
  concurrency: number;
7
7
  copyFileContents?: NativeBinding["copyFileContents"];
8
8
  }): Promise<void>;
9
- //# sourceMappingURL=copy-tree-portable.d.ts.map
@@ -11,7 +11,7 @@ function timestampSeconds(nanoseconds) {
11
11
  }
12
12
  /** Byte-copy adapter for the shared immutable-source, caller-owned namespace contract. */
13
13
  export async function copyOwnedTree(source, destination, options) {
14
- options.signal?.throwIfAborted();
14
+ const callerSignal = options.signal ? AbortSignal.any([options.signal]) : undefined;
15
15
  const cancellation = new AbortController();
16
16
  const signal = cancellation.signal;
17
17
  setMaxListeners(options.concurrency, signal);
@@ -23,8 +23,8 @@ export async function copyOwnedTree(source, destination, options) {
23
23
  failure ??= { value };
24
24
  cancellation.abort(failure);
25
25
  }
26
- const abort = () => recordFailure(options.signal?.reason);
27
- options.signal?.addEventListener("abort", abort, { once: true });
26
+ if (callerSignal)
27
+ callerSignal.onabort = () => recordFailure(callerSignal.reason);
28
28
  async function schedule(operation, children) {
29
29
  signal.throwIfAborted();
30
30
  const task = operation()
@@ -51,8 +51,8 @@ export async function copyOwnedTree(source, destination, options) {
51
51
  }
52
52
  output = await fsp.open(to, "wx", 0o600);
53
53
  if (options.copyFileContents) {
54
- // napi-rs owns onabort. Each admitted file gets a separate signal so
55
- // concurrent native copies cannot replace one another's cancellation.
54
+ // napi-rs owns onabort. Each admitted file gets a separate signal; the
55
+ // shared failure signal is private, so callers cannot intercept its relay.
56
56
  const fileCancellation = new AbortController();
57
57
  const abortFile = () => fileCancellation.abort();
58
58
  signal.addEventListener("abort", abortFile, { once: true });
@@ -62,6 +62,7 @@ export async function copyOwnedTree(source, destination, options) {
62
62
  }
63
63
  finally {
64
64
  signal.removeEventListener("abort", abortFile);
65
+ fileCancellation.signal.onabort = null;
65
66
  }
66
67
  }
67
68
  else {
@@ -224,6 +225,7 @@ export async function copyOwnedTree(source, destination, options) {
224
225
  signal.throwIfAborted();
225
226
  }
226
227
  try {
228
+ callerSignal?.throwIfAborted();
227
229
  await copyDirectory(source.receipt.realPath, destination);
228
230
  await Promise.all(finishing);
229
231
  signal.throwIfAborted();
@@ -233,7 +235,8 @@ export async function copyOwnedTree(source, destination, options) {
233
235
  }
234
236
  finally {
235
237
  await Promise.all(finishing);
236
- options.signal?.removeEventListener("abort", abort);
238
+ if (callerSignal)
239
+ callerSignal.onabort = null;
237
240
  }
238
241
  if (failure)
239
242
  throw failure.value;
package/dist/copy.d.ts CHANGED
@@ -13,4 +13,3 @@ export declare function probeTreeClone(parentPath: string): TreeCloneBackend | u
13
13
  export declare function createCloneSource(destination: string, options?: Pick<CopyTreeOptions, "signal">): Promise<void>;
14
14
  /** Copy an immutable, caller-owned tree, preferring native cloning unless configured otherwise. */
15
15
  export declare function copyTree(source: string, destination: string, options?: CopyTreeOptions): Promise<void>;
16
- //# sourceMappingURL=copy.d.ts.map
package/dist/copy.js CHANGED
@@ -94,12 +94,11 @@ async function materializeTree(source, destination, options, policy) {
94
94
  let cloned = false;
95
95
  // napi-rs uses the supplied signal's onabort property. Give it a private
96
96
  // signal so caller handlers and other admitted native operations stay intact.
97
- const cancellation = options.signal && supported ? new AbortController() : undefined;
98
- const abort = () => cancellation?.abort();
99
- options.signal?.addEventListener("abort", abort, { once: true });
97
+ const nativeSignal = options.signal && supported ? AbortSignal.any([options.signal]) : undefined;
100
98
  try {
101
99
  if (native && supported) {
102
- await native.cloneTree(original?.fd ?? null, parent.fd, name, concurrency, cancellation?.signal);
100
+ nativeSignal?.throwIfAborted();
101
+ await native.cloneTree(original?.fd ?? null, parent.fd, name, concurrency, nativeSignal);
103
102
  cloned = true;
104
103
  }
105
104
  }
@@ -113,7 +112,8 @@ async function materializeTree(source, destination, options, policy) {
113
112
  }
114
113
  }
115
114
  finally {
116
- options.signal?.removeEventListener("abort", abort);
115
+ if (nativeSignal)
116
+ nativeSignal.onabort = null;
117
117
  }
118
118
  options.signal?.throwIfAborted();
119
119
  assertStagedDirectoryCurrent(parent.receipt);
@@ -15,6 +15,4 @@ export declare function createDirectory(targetPath: string, options?: CreateDire
15
15
  export declare function createDirectoryWithAdmission(targetPath: string, options?: CreateDirectoryOptions, admission?: CreationAdmission): Promise<void>;
16
16
  export declare function createDirectoryWithReceipt(targetPath: string, options?: CreateDirectoryOptions, admission?: CreationAdmission): Promise<CreationDirectoryReceipt>;
17
17
  export declare function createDirectorySync(targetPath: string, options?: CreateDirectoryOptions): void;
18
- export declare function createDirectorySyncWithAdmission(targetPath: string, options?: CreateDirectoryOptions, admission?: CreationAdmission): void;
19
18
  export declare function createDirectoryWithReceiptSync(targetPath: string, options?: CreateDirectoryOptions, admission?: CreationAdmission): CreationDirectoryReceipt;
20
- //# sourceMappingURL=create-directory.d.ts.map
@@ -3,13 +3,11 @@ import fs from "node:fs/promises";
3
3
  import { FsSafeError } from "./errors.js";
4
4
  import { getNativeBinding } from "./native.js";
5
5
  import { getFsSafeNativeConfig } from "./native-config.js";
6
- import { assertSynchronousCallbackResult } from "./mutation-authority.js";
7
6
  import { assertPrivateDirectory, assertPrivateDirectorySync, inspectCreationDirectory, inspectCreationDirectorySync, resolveCreationPermissions, } from "./creation-permissions.js";
8
- import { creationCollision, prepareCreationPath } from "./creation-path.js";
7
+ import { assertBeforeCreation, creationCollision, prepareCreationPath } from "./creation-path.js";
9
8
  import { createPrivateWindowsDirectoryCommand, createPrivateWindowsDirectoryCommandSync, } from "./windows-security-command.js";
10
9
  import { warnNativeFallback } from "./native-fallback-warning.js";
11
10
  import { inspectDirectoryIdentitySync } from "./directory-guard.js";
12
- import { assertDarwinCreationDirectoryAcl, assertDarwinPrivateDirectoryMode } from "./creation-darwin.js";
13
11
  function directoryAdoptionFailure(error, target, windowsIdentity) {
14
12
  return new FsSafeError("helper-failed", "created directory admission failed", {
15
13
  cause: error,
@@ -43,14 +41,7 @@ export async function createDirectoryWithReceipt(targetPath, options = {}, admis
43
41
  const backend = permissions.private && process.platform === "win32" ? privateDirectoryBackend() : undefined;
44
42
  const parentIdentity = permissions.private && process.platform === "win32"
45
43
  ? await inspectCreationDirectory(selected.parent.dir, false) : undefined;
46
- if (permissions.private)
47
- assertDarwinCreationDirectoryAcl(selected.parent.dir, selected.parent.stat, "directory");
48
- assertSynchronousCallbackResult(assertion?.(), "assertBeforeMutation");
49
- selected.assertParent();
50
- if (permissions.private)
51
- assertDarwinPrivateDirectoryMode(permissions.mode);
52
- if (permissions.private)
53
- assertDarwinCreationDirectoryAcl(selected.parent.dir, selected.parent.stat, "directory");
44
+ assertBeforeCreation(selected, permissions, assertion, "directory");
54
45
  let created = false;
55
46
  let windowsIdentity;
56
47
  try {
@@ -82,9 +73,6 @@ export async function createDirectoryWithReceipt(targetPath, options = {}, admis
82
73
  export function createDirectorySync(targetPath, options = {}) {
83
74
  createDirectoryWithReceiptSync(targetPath, options, {});
84
75
  }
85
- export function createDirectorySyncWithAdmission(targetPath, options = {}, admission = {}) {
86
- createDirectoryWithReceiptSync(targetPath, options, admission);
87
- }
88
76
  export function createDirectoryWithReceiptSync(targetPath, options = {}, admission = {}) {
89
77
  const permissions = resolveCreationPermissions(options, true);
90
78
  const assertion = options.assertBeforeMutation;
@@ -92,14 +80,7 @@ export function createDirectoryWithReceiptSync(targetPath, options = {}, admissi
92
80
  const backend = permissions.private && process.platform === "win32" ? privateDirectoryBackend() : undefined;
93
81
  const parentIdentity = permissions.private && process.platform === "win32"
94
82
  ? inspectCreationDirectorySync(selected.parent.dir, false) : undefined;
95
- if (permissions.private)
96
- assertDarwinCreationDirectoryAcl(selected.parent.dir, selected.parent.stat, "directory");
97
- assertSynchronousCallbackResult(assertion?.(), "assertBeforeMutation");
98
- selected.assertParent();
99
- if (permissions.private)
100
- assertDarwinPrivateDirectoryMode(permissions.mode);
101
- if (permissions.private)
102
- assertDarwinCreationDirectoryAcl(selected.parent.dir, selected.parent.stat, "directory");
83
+ assertBeforeCreation(selected, permissions, assertion, "directory");
103
84
  let created = false;
104
85
  let windowsIdentity;
105
86
  try {
@@ -4,4 +4,3 @@ export declare function createPrivateWindowsFileHandle(selected: CreationPath, o
4
4
  mode: number;
5
5
  assertBeforeMutation?: () => void;
6
6
  }): Promise<FileHandle>;
7
- //# sourceMappingURL=create-file-async.d.ts.map
@@ -5,4 +5,3 @@ export type CreateFileOptions = CreateDirectoryOptions;
5
5
  export declare function createFileSync(targetPath: string, options?: CreateFileOptions): OwnedFileDescriptorSync;
6
6
  /** Internal async writer; Windows preparation uses the nonblocking stage owner. */
7
7
  export declare function createFileHandle(targetPath: string, options?: CreateFileOptions, admission?: CreationAdmission): Promise<FileHandle>;
8
- //# sourceMappingURL=create-file.d.ts.map
@@ -8,12 +8,11 @@ import { assertDirectoryIdentitySync } from "./directory-guard.js";
8
8
  import { FsSafeError } from "./errors.js";
9
9
  import { assertSynchronousCallbackResult } from "./mutation-authority.js";
10
10
  import { assertPrivateFileCreationAvailable, inspectCreationDirectorySync, protectCreatedFileSync, resolveCreationPermissions, verifyCreatedFileSync, } from "./creation-permissions.js";
11
- import { creationCollision, prepareCreationPath, removeCreationDirectory } from "./creation-path.js";
11
+ import { assertBeforeCreation, creationCollision, prepareCreationPath, removeCreationDirectory } from "./creation-path.js";
12
12
  import { handoffCreatedFileSync } from "./private-producer-handoff-sync.js";
13
13
  import { resolveReadOpenFlags } from "./read-open-flags.js";
14
14
  import { assertCreationFile, assertPrivateCreationFile, creationPublicationAfterFailure, privateFileSettlementFailure, rethrowPrivateStageCreationFailure, removeRecordedCreationFileSync, } from "./creation-file-state.js";
15
15
  import { createPrivateWindowsFileHandle } from "./create-file-async.js";
16
- import { assertDarwinCreationDirectoryAcl } from "./creation-darwin.js";
17
16
  function createPrivateWindowsFile(selected, options, mode) {
18
17
  const assertion = options.assertBeforeMutation;
19
18
  if (fs.lstatSync(selected.target, { throwIfNoEntry: false })) {
@@ -113,12 +112,7 @@ function createFileCore(targetPath, options, admission) {
113
112
  assertPrivateFileCreationAvailable();
114
113
  return createPrivateWindowsFile(selected, { ...permissions, assertBeforeMutation: assertion }, permissions.mode);
115
114
  }
116
- if (permissions.private)
117
- assertDarwinCreationDirectoryAcl(selected.parent.dir, selected.parent.stat, "file");
118
- assertSynchronousCallbackResult(assertion?.(), "assertBeforeMutation");
119
- selected.assertParent();
120
- if (permissions.private)
121
- assertDarwinCreationDirectoryAcl(selected.parent.dir, selected.parent.stat, "file");
115
+ assertBeforeCreation(selected, permissions, assertion, "file");
122
116
  let file;
123
117
  try {
124
118
  file = ownFileDescriptorSync(fs.openSync(selected.target, fs.constants.O_RDWR | fs.constants.O_CREAT |
@@ -156,12 +150,7 @@ export async function createFileHandle(targetPath, options = {}, admission = {})
156
150
  const assertion = options.assertBeforeMutation;
157
151
  if (process.platform !== "win32" || !permissions.private) {
158
152
  const selected = prepareCreationPath(targetPath, admission.expectedParentIdentity);
159
- if (permissions.private)
160
- assertDarwinCreationDirectoryAcl(selected.parent.dir, selected.parent.stat, "file");
161
- assertSynchronousCallbackResult(assertion?.(), "assertBeforeMutation");
162
- selected.assertParent();
163
- if (permissions.private)
164
- assertDarwinCreationDirectoryAcl(selected.parent.dir, selected.parent.stat, "file");
153
+ assertBeforeCreation(selected, permissions, assertion, "file");
165
154
  const handle = await fsAsync.open(selected.target, fs.constants.O_RDWR | fs.constants.O_CREAT |
166
155
  fs.constants.O_EXCL | resolveReadOpenFlags(), permissions.mode ?? 0o666)
167
156
  .catch(error => { throw creationCollision(error); });
@@ -5,4 +5,3 @@ export type OwnedFileDescriptorSync = {
5
5
  };
6
6
  /** Capture the descriptor's creator-owned closer before it can be reused. */
7
7
  export declare function ownFileDescriptorSync(fd: number, closeFd?: (fd: number) => void): OwnedFileDescriptorSync;
8
- //# sourceMappingURL=create-owned-file.d.ts.map
package/dist/create.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- export { createDirectory, createDirectorySync, createDirectoryWithAdmission, createDirectorySyncWithAdmission, type CreateDirectoryOptions, type CreationAdmission, } from "./create-directory.js";
1
+ export { createDirectory, createDirectorySync, createDirectoryWithAdmission, type CreateDirectoryOptions, type CreationAdmission, } from "./create-directory.js";
2
2
  export { createFileSync, createFileHandle, type CreateFileOptions } from "./create-file.js";
3
3
  export type { OwnedFileDescriptorSync } from "./create-owned-file.js";
4
- //# sourceMappingURL=create.d.ts.map
package/dist/create.js CHANGED
@@ -1,2 +1,2 @@
1
- export { createDirectory, createDirectorySync, createDirectoryWithAdmission, createDirectorySyncWithAdmission, } from "./create-directory.js";
1
+ export { createDirectory, createDirectorySync, createDirectoryWithAdmission, } from "./create-directory.js";
2
2
  export { createFileSync, createFileHandle } from "./create-file.js";
@@ -3,5 +3,3 @@ export declare function assertDarwinPrivateCreationAvailable(): void;
3
3
  export declare function assertDarwinPrivateDirectoryMode(mode: number): void;
4
4
  export declare function assertDarwinCreationAcl(fd: number, inheritanceTarget?: "file" | "directory"): void;
5
5
  export declare function assertDarwinCreationDirectoryAcl(pathname: string, expected: BigIntStats, inheritanceTarget?: "file" | "directory"): void;
6
- export declare function privateFileMutationAssertion(fd: number, assertion?: () => void): (() => void) | undefined;
7
- //# sourceMappingURL=creation-darwin.d.ts.map