@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
@@ -1,26 +1,25 @@
1
1
  import fs from "node:fs";
2
- import { defaultSyncShouldReclaim, syncLockTimeout } from "./file-lock-sync-admission.js";
2
+ import { defaultSyncShouldReclaim } from "./file-lock-sync-admission.js";
3
3
  import { parseSidecarLockSnapshot, readSidecarLockRawSnapshotSync, removeSidecarLockIfUnchangedSync, } from "./sidecar-lock-reclaim.js";
4
+ import { assertSynchronousCallbackResult } from "./mutation-authority.js";
4
5
  /** Handle one exclusive-create conflict without surrendering canonical admission. */
5
- export function handleSyncStaleAdmission(params) {
6
+ export function handleSyncStaleAdmission(acquisition, params) {
6
7
  const holderChanged = {};
7
8
  const assertUnheld = () => {
8
- if (!params.hasToken()) {
9
- throw syncLockTimeout(params.lockPath, params.normalizedTargetPath);
10
- }
9
+ acquisition.assert();
11
10
  if (params.currentHeld())
12
11
  throw holderChanged;
13
12
  };
14
13
  const retryHolderChange = (error) => {
15
14
  if (error !== holderChanged)
16
15
  return false;
17
- params.waitForRetry();
16
+ acquisition.waitForRetry();
18
17
  return true;
19
18
  };
20
19
  let rawSnapshot;
21
20
  let lockFileOpenDenied = false;
22
21
  try {
23
- rawSnapshot = readSidecarLockRawSnapshotSync(params.lockPath, {
22
+ rawSnapshot = readSidecarLockRawSnapshotSync(acquisition.lockPath, {
24
23
  rejectNonFile: true,
25
24
  onOpenFailure: (error) => {
26
25
  lockFileOpenDenied = true;
@@ -40,7 +39,7 @@ export function handleSyncStaleAdmission(params) {
40
39
  return;
41
40
  throw boundaryError;
42
41
  }
43
- if (lockFileOpenDenied && params.retryLockFileDenial(error))
42
+ if (lockFileOpenDenied && acquisition.retryDenial(error))
44
43
  return;
45
44
  throw error;
46
45
  }
@@ -92,7 +91,7 @@ export function handleSyncStaleAdmission(params) {
92
91
  throw error;
93
92
  }
94
93
  if (!snapshot) {
95
- params.waitForRetry();
94
+ acquisition.waitForRetry();
96
95
  return;
97
96
  }
98
97
  const nowMs = Date.now();
@@ -102,14 +101,15 @@ export function handleSyncStaleAdmission(params) {
102
101
  try {
103
102
  reclaim = stale.shouldReclaim
104
103
  ? Reflect.apply(stale.shouldReclaim, params.options, [{
105
- lockPath: params.lockPath,
106
- normalizedTargetPath: params.normalizedTargetPath,
104
+ lockPath: acquisition.lockPath,
105
+ normalizedTargetPath: acquisition.normalizedTargetPath,
107
106
  payload: snapshot.payload,
108
107
  staleMs: params.staleMs,
109
108
  nowMs,
110
109
  heldByThisProcess: false,
111
110
  }])
112
111
  : defaultSyncShouldReclaim(snapshot, params.staleMs, nowMs);
112
+ assertSynchronousCallbackResult(reclaim, "shouldReclaim");
113
113
  }
114
114
  finally {
115
115
  assertUnheld();
@@ -121,7 +121,7 @@ export function handleSyncStaleAdmission(params) {
121
121
  throw error;
122
122
  }
123
123
  if (!reclaim) {
124
- params.waitForRetry();
124
+ acquisition.waitForRetry();
125
125
  return;
126
126
  }
127
127
  if (params.staleRecovery === "remove-if-unchanged" &&
@@ -132,11 +132,12 @@ export function handleSyncStaleAdmission(params) {
132
132
  assertUnheld();
133
133
  try {
134
134
  approved = Reflect.apply(stale.shouldRemove, params.options, [{
135
- lockPath: params.lockPath,
136
- normalizedTargetPath: params.normalizedTargetPath,
135
+ lockPath: acquisition.lockPath,
136
+ normalizedTargetPath: acquisition.normalizedTargetPath,
137
137
  raw: snapshot.raw,
138
138
  payload: snapshot.payload,
139
139
  }]);
140
+ assertSynchronousCallbackResult(approved, "shouldRemoveStaleLock");
140
141
  }
141
142
  finally {
142
143
  assertUnheld();
@@ -148,10 +149,10 @@ export function handleSyncStaleAdmission(params) {
148
149
  throw error;
149
150
  }
150
151
  if (!approved) {
151
- throw Object.assign(new Error(`file lock stale for ${params.normalizedTargetPath}`), {
152
+ throw Object.assign(new Error(`file lock stale for ${acquisition.normalizedTargetPath}`), {
152
153
  code: "file_lock_stale",
153
- lockPath: params.lockPath,
154
- normalizedTargetPath: params.normalizedTargetPath,
154
+ lockPath: acquisition.lockPath,
155
+ normalizedTargetPath: acquisition.normalizedTargetPath,
155
156
  });
156
157
  }
157
158
  try {
@@ -167,7 +168,7 @@ export function handleSyncStaleAdmission(params) {
167
168
  throw boundaryError;
168
169
  }
169
170
  if (error.code === "EEXIST") {
170
- params.waitForRetry();
171
+ acquisition.waitForRetry();
171
172
  return;
172
173
  }
173
174
  throw error;
@@ -175,7 +176,7 @@ export function handleSyncStaleAdmission(params) {
175
176
  let holderInterrupted = false;
176
177
  try {
177
178
  assertUnheld();
178
- if (removeSidecarLockIfUnchangedSync(params.lockPath, snapshot, assertUnheld))
179
+ if (removeSidecarLockIfUnchangedSync(acquisition.lockPath, snapshot, assertUnheld))
179
180
  return;
180
181
  }
181
182
  catch (error) {
@@ -193,13 +194,13 @@ export function handleSyncStaleAdmission(params) {
193
194
  }
194
195
  }
195
196
  if (holderInterrupted) {
196
- params.waitForRetry();
197
+ acquisition.waitForRetry();
197
198
  return;
198
199
  }
199
200
  }
200
- throw Object.assign(new Error(`file lock stale for ${params.normalizedTargetPath}`), {
201
+ throw Object.assign(new Error(`file lock stale for ${acquisition.normalizedTargetPath}`), {
201
202
  code: "file_lock_stale",
202
- lockPath: params.lockPath,
203
- normalizedTargetPath: params.normalizedTargetPath,
203
+ lockPath: acquisition.lockPath,
204
+ normalizedTargetPath: acquisition.normalizedTargetPath,
204
205
  });
205
206
  }
@@ -32,4 +32,3 @@ export type FileLockSyncHandle = {
32
32
  };
33
33
  export declare function acquireFileLockSync<TPayload extends Record<string, unknown>>(targetPath: string, options: FileLockSyncAcquireOptions<TPayload>): FileLockSyncHandle;
34
34
  export declare function withFileLockSync<T, TPayload extends Record<string, unknown>>(targetPath: string, options: FileLockSyncAcquireOptions<TPayload>, fn: () => T): T;
35
- //# sourceMappingURL=file-lock-sync.d.ts.map
@@ -1,16 +1,16 @@
1
1
  import fs from "node:fs";
2
2
  import { acquireFileLockSyncWithRoot } from "./file-lock-sync-root-acquire.js";
3
- import { isRootSyncHeldLockHandle, withRootSyncHeldLockHandle } from "./file-lock-sync-root-held.js";
3
+ import { withSyncHeldLockHandle } from "./file-lock-sync-root-held.js";
4
4
  import path from "node:path";
5
- import { readSidecarLockSnapshotSync, removeSidecarLockIfUnchangedSync, serializeSidecarLockPayload, sidecarLockSnapshotMatches, } from "./sidecar-lock-reclaim.js";
6
- import { computeSidecarLockDelayMs, isTransientLockFileDenial, maxTransientLockDenials, validateSidecarLockStaleMs, validateSidecarLockCompromiseCheckIntervalMs, validateSidecarLockRetryOptions, validateSidecarLockTimeoutMs, } from "./sidecar-lock-policy.js";
5
+ import { readSidecarLockRawSnapshotSync, readSidecarLockSnapshotSync, removeSidecarLockIfUnchangedSync, serializeSidecarLockPayload, sidecarLockSnapshotMatches, } from "./sidecar-lock-reclaim.js";
6
+ import { sidecarLockTimeout, isTransientLockFileDenial, validateSidecarLockStaleMs, validateSidecarLockCompromiseCheckIntervalMs, validateSidecarLockRetryOptions, validateSidecarLockTimeoutMs, } from "./sidecar-lock-policy.js";
7
7
  import { getFsSafeLockConfig } from "./lock-config.js";
8
- import { sleepSync } from "./timing.js";
8
+ import { SyncLockAcquisition } from "./file-lock-sync-acquisition.js";
9
9
  import { assertNoWindowsPathAlias } from "./windows-path-alias.js";
10
10
  import { realpathSync } from "./realpath.js";
11
11
  import { recursiveMkdirPath } from "./recursive-mkdir-path.js";
12
12
  import { createSuppressedError } from "./suppressed-error.js";
13
- import { ensureSyncLockExitCleanupRegistered, getSyncHeldLocks, foreignSyncHeldLock, getSyncLockAdmissions, syncReclaimGuardExists, syncLockTimeout, } from "./file-lock-sync-admission.js";
13
+ import { ensureSyncLockExitCleanupRegistered, getSyncHeldLocks, foreignSyncHeldLock, getSyncLockAdmissions, syncReclaimGuardExists, } from "./file-lock-sync-admission.js";
14
14
  import { handleSyncStaleAdmission, } from "./file-lock-sync-stale-admission.js";
15
15
  function releaseAllSyncHeldLocks() {
16
16
  const heldLocks = getSyncHeldLocks();
@@ -37,7 +37,11 @@ function releaseAllSyncHeldLocks() {
37
37
  getSyncLockAdmissions().clear();
38
38
  }
39
39
  function verifySyncHeldLock(held) {
40
- const current = readSidecarLockSnapshotSync(held.lockPath, held.parsePayload);
40
+ const lockPath = held.lockPath;
41
+ const parsePayload = held.parsePayload;
42
+ const current = parsePayload
43
+ ? readSidecarLockSnapshotSync(lockPath, parsePayload)
44
+ : readSidecarLockRawSnapshotSync(lockPath);
41
45
  return !!current && sidecarLockSnapshotMatches(current, held.snapshot);
42
46
  }
43
47
  function releaseSyncHeldLock(held) {
@@ -131,15 +135,7 @@ export function acquireFileLockSync(targetPath, options) {
131
135
  initiallyHeld.refCount += 1;
132
136
  return createSyncHeldLockHandle(initiallyHeld);
133
137
  }
134
- const admissions = getSyncLockAdmissions();
135
- const admissionToken = {};
136
- let ownsAdmission = false;
137
- const hasAdmissionToken = () => admissions.get(normalizedTargetPath) === admissionToken;
138
- const releaseAdmission = () => {
139
- if (ownsAdmission && hasAdmissionToken())
140
- admissions.delete(normalizedTargetPath);
141
- ownsAdmission = false;
142
- };
138
+ const acquisition = new SyncLockAcquisition(lockPath, normalizedTargetPath, retry, timeoutMs);
143
139
  let payloadCallback;
144
140
  let onCompromised = undefined;
145
141
  let onCompromisedObserved = false;
@@ -148,54 +144,10 @@ export function acquireFileLockSync(targetPath, options) {
148
144
  let staleRecovery = undefined;
149
145
  let staleRecoveryObserved = false;
150
146
  const staleOptions = {};
151
- const startedAt = Date.now();
152
- let attempt = 0;
153
- let transientDenials = 0;
154
147
  const reclaimGuardPath = `${lockPath}.reclaim`;
155
- const waitForRetry = () => {
156
- releaseAdmission();
157
- const elapsed = Date.now() - startedAt;
158
- const timedOut = timeoutMs !== undefined && elapsed >= timeoutMs;
159
- if (timedOut || (retry.retries !== undefined && attempt >= retry.retries)) {
160
- throw syncLockTimeout(lockPath, normalizedTargetPath);
161
- }
162
- const remaining = timeoutMs === undefined || timeoutMs === Number.POSITIVE_INFINITY
163
- ? Number.POSITIVE_INFINITY
164
- : Math.max(0, timeoutMs - elapsed);
165
- sleepSync(Math.min(computeSidecarLockDelayMs(retry, attempt), remaining));
166
- attempt += 1;
167
- };
168
- const retryLockFileDenial = (error) => {
169
- if (!isTransientLockFileDenial(error, lockPath) ||
170
- ++transientDenials > maxTransientLockDenials)
171
- return false;
172
- try {
173
- waitForRetry();
174
- }
175
- catch (waitError) {
176
- // Preserve the filesystem diagnosis when the caller's budget runs out.
177
- if (waitError.code === "file_lock_timeout")
178
- throw error;
179
- throw waitError;
180
- }
181
- return true;
182
- };
183
- const assertAdmissionToken = () => {
184
- if (!hasAdmissionToken())
185
- throw syncLockTimeout(lockPath, normalizedTargetPath);
186
- };
187
- const runAdmissionBoundary = (callback) => {
188
- assertAdmissionToken();
189
- try {
190
- return callback();
191
- }
192
- finally {
193
- assertAdmissionToken();
194
- }
195
- };
196
148
  try {
197
149
  while (true) {
198
- if (!ownsAdmission) {
150
+ if (!acquisition.owns) {
199
151
  const held = heldLocks.get(normalizedTargetPath);
200
152
  if (held && !foreignSyncHeldLock("raw", normalizedTargetPath) &&
201
153
  requestedReentrantOwner !== undefined &&
@@ -204,12 +156,7 @@ export function acquireFileLockSync(targetPath, options) {
204
156
  held.refCount += 1;
205
157
  return createSyncHeldLockHandle(held);
206
158
  }
207
- if (admissions.has(normalizedTargetPath)) {
208
- // The owner can only finish after this synchronous callback unwinds.
209
- throw syncLockTimeout(lockPath, normalizedTargetPath);
210
- }
211
- admissions.set(normalizedTargetPath, admissionToken);
212
- ownsAdmission = true;
159
+ acquisition.reserve();
213
160
  }
214
161
  const attemptHeld = currentTargetHolder();
215
162
  const holderWasReplaced = () => {
@@ -217,60 +164,60 @@ export function acquireFileLockSync(targetPath, options) {
217
164
  return current !== undefined && current !== attemptHeld;
218
165
  };
219
166
  if (!staleRecoveryObserved) {
220
- staleRecovery = runAdmissionBoundary(() => options.staleRecovery ?? defaults.staleRecovery);
167
+ staleRecovery = acquisition.run(() => options.staleRecovery ?? defaults.staleRecovery);
221
168
  staleRecoveryObserved = true;
222
169
  if (holderWasReplaced()) {
223
- waitForRetry();
170
+ acquisition.waitForRetry();
224
171
  continue;
225
172
  }
226
173
  }
227
174
  const reclaimGuardExists = syncReclaimGuardExists(reclaimGuardPath);
228
- if (!hasAdmissionToken())
229
- throw syncLockTimeout(lockPath, normalizedTargetPath);
175
+ if (!acquisition.hasToken())
176
+ throw sidecarLockTimeout(lockPath, normalizedTargetPath);
230
177
  if (holderWasReplaced()) {
231
- waitForRetry();
178
+ acquisition.waitForRetry();
232
179
  continue;
233
180
  }
234
181
  if (reclaimGuardExists) {
235
- waitForRetry();
182
+ acquisition.waitForRetry();
236
183
  continue;
237
184
  }
238
185
  let fd;
239
186
  let createdHeld;
240
187
  let createdSnapshot;
241
188
  if (!payloadCallback)
242
- payloadCallback = runAdmissionBoundary(() => options.payload);
189
+ payloadCallback = acquisition.run(() => options.payload);
243
190
  if (holderWasReplaced()) {
244
- waitForRetry();
191
+ acquisition.waitForRetry();
245
192
  continue;
246
193
  }
247
- const payload = runAdmissionBoundary(() => Reflect.apply(payloadCallback, options, []));
194
+ const payload = acquisition.run(() => Reflect.apply(payloadCallback, options, []));
248
195
  if (holderWasReplaced()) {
249
- waitForRetry();
196
+ acquisition.waitForRetry();
250
197
  continue;
251
198
  }
252
- const { raw, ownershipToken } = runAdmissionBoundary(() => serializeSidecarLockPayload(payload));
199
+ const { raw, ownershipToken } = acquisition.run(() => serializeSidecarLockPayload(payload));
253
200
  if (holderWasReplaced()) {
254
- waitForRetry();
201
+ acquisition.waitForRetry();
255
202
  continue;
256
203
  }
257
204
  if (currentTargetHolder() !== undefined) {
258
- waitForRetry();
205
+ acquisition.waitForRetry();
259
206
  continue;
260
207
  }
261
208
  if (!onCompromisedObserved) {
262
- onCompromised = runAdmissionBoundary(() => options.onCompromised);
209
+ onCompromised = acquisition.run(() => options.onCompromised);
263
210
  onCompromisedObserved = true;
264
211
  if (currentTargetHolder() !== undefined) {
265
- waitForRetry();
212
+ acquisition.waitForRetry();
266
213
  continue;
267
214
  }
268
215
  }
269
216
  if (!parsePayloadObserved) {
270
- parsePayload = runAdmissionBoundary(() => options.parsePayload);
217
+ parsePayload = acquisition.run(() => options.parsePayload);
271
218
  parsePayloadObserved = true;
272
219
  if (currentTargetHolder() !== undefined) {
273
- waitForRetry();
220
+ acquisition.waitForRetry();
274
221
  continue;
275
222
  }
276
223
  }
@@ -307,34 +254,17 @@ export function acquireFileLockSync(targetPath, options) {
307
254
  };
308
255
  const candidateHeld = createdHeld;
309
256
  ensureSyncLockExitCleanupRegistered(releaseAllSyncHeldLocks, lockPath, normalizedTargetPath);
310
- if (!hasAdmissionToken() || currentTargetHolder() !== undefined) {
311
- throw syncLockTimeout(lockPath, normalizedTargetPath);
257
+ if (!acquisition.hasToken() || currentTargetHolder() !== undefined) {
258
+ throw sidecarLockTimeout(lockPath, normalizedTargetPath);
312
259
  }
313
260
  const returnedHandle = createSyncHeldLockHandle(candidateHeld);
314
- if (onCompromised && (compromiseCheckIntervalMs ?? 0) > 0) {
315
- const compromisedCallback = onCompromised;
316
- candidateHeld.timer = setInterval(() => {
317
- let stillHeld;
318
- try {
319
- stillHeld = returnedHandle.verifyStillHeld();
320
- }
321
- catch {
322
- stillHeld = false;
323
- }
324
- if (!stillHeld && candidateHeld.timer) {
325
- clearInterval(candidateHeld.timer);
326
- candidateHeld.timer = undefined;
327
- Reflect.apply(compromisedCallback, options, [{ lockPath, normalizedTargetPath }]);
328
- }
329
- }, compromiseCheckIntervalMs);
330
- candidateHeld.timer.unref();
331
- }
332
- if (!hasAdmissionToken() ||
261
+ acquisition.monitor(candidateHeld, returnedHandle, onCompromised, compromiseCheckIntervalMs, options);
262
+ if (!acquisition.hasToken() ||
333
263
  currentTargetHolder() !== undefined) {
334
- throw syncLockTimeout(lockPath, normalizedTargetPath);
264
+ throw sidecarLockTimeout(lockPath, normalizedTargetPath);
335
265
  }
336
266
  heldLocks.set(normalizedTargetPath, candidateHeld);
337
- releaseAdmission();
267
+ acquisition.release();
338
268
  fd = undefined;
339
269
  return returnedHandle;
340
270
  }
@@ -370,54 +300,42 @@ export function acquireFileLockSync(targetPath, options) {
370
300
  }
371
301
  }
372
302
  if (lockFileCreateDenied) {
373
- if (!hasAdmissionToken())
374
- throw syncLockTimeout(lockPath, normalizedTargetPath);
303
+ if (!acquisition.hasToken())
304
+ throw sidecarLockTimeout(lockPath, normalizedTargetPath);
375
305
  if (currentTargetHolder() !== undefined) {
376
- waitForRetry();
306
+ acquisition.waitForRetry();
377
307
  continue;
378
308
  }
379
- if (retryLockFileDenial(error))
309
+ if (acquisition.retryDenial(error))
380
310
  continue;
381
311
  throw error;
382
312
  }
383
313
  if (!exclusiveCreateConflict)
384
314
  throw error;
385
- if (!hasAdmissionToken())
386
- throw syncLockTimeout(lockPath, normalizedTargetPath);
315
+ if (!acquisition.hasToken())
316
+ throw sidecarLockTimeout(lockPath, normalizedTargetPath);
387
317
  if (currentTargetHolder() !== undefined) {
388
- waitForRetry();
318
+ acquisition.waitForRetry();
389
319
  continue;
390
320
  }
391
- handleSyncStaleAdmission({
392
- hasToken: hasAdmissionToken,
321
+ handleSyncStaleAdmission(acquisition, {
393
322
  currentHeld: currentTargetHolder,
394
- lockPath,
395
- normalizedTargetPath,
396
323
  options,
397
324
  parsePayload,
398
325
  reclaimGuardPath,
399
- retryLockFileDenial,
400
326
  staleMs,
401
327
  staleOptions,
402
328
  staleRecovery,
403
- waitForRetry,
404
329
  });
405
330
  continue;
406
331
  }
407
332
  }
408
333
  }
409
334
  finally {
410
- releaseAdmission();
335
+ acquisition.release();
411
336
  }
412
337
  }
413
338
  export function withFileLockSync(targetPath, options, fn) {
414
339
  const lock = acquireFileLockSync(targetPath, options);
415
- if (isRootSyncHeldLockHandle(lock))
416
- return withRootSyncHeldLockHandle(lock, fn);
417
- try {
418
- return fn();
419
- }
420
- finally {
421
- lock.release();
422
- }
340
+ return withSyncHeldLockHandle(lock, fn);
423
341
  }
@@ -21,4 +21,3 @@ export declare function withFileLock<T, TPayload extends Record<string, unknown>
21
21
  export declare function createFileLockManager(key: string): FileLockManager;
22
22
  export declare function drainFileLockManagerForTest(targetPath: string, managerKey?: string): Promise<void>;
23
23
  export declare function resetFileLockManagerForTest(targetPath: string, managerKey?: string): void;
24
- //# sourceMappingURL=file-lock.d.ts.map
@@ -6,4 +6,3 @@ export declare function fileObservation(): {
6
6
  has(error: unknown, kind: FailureKind): boolean;
7
7
  };
8
8
  export {};
9
- //# sourceMappingURL=file-observation.d.ts.map
@@ -18,7 +18,6 @@ export declare function writeStreamToTempSource(params: {
18
18
  path: string;
19
19
  cleanup: () => Promise<void>;
20
20
  }>;
21
- export declare function assertSyncDirectoryGuard(guard: SyncParentGuard): void;
22
21
  export declare function ensureParentSync(params: {
23
22
  rootDir: string;
24
23
  filePath: string;
@@ -30,4 +29,3 @@ export declare function ensureStoreDirectorySync(params: {
30
29
  mode: number;
31
30
  messagePrefix: "private store" | "store";
32
31
  }): SyncParentGuard;
33
- //# sourceMappingURL=file-store-boundary.d.ts.map
@@ -2,7 +2,6 @@ import syncFs from "node:fs";
2
2
  import fs from "node:fs/promises";
3
3
  import path from "node:path";
4
4
  import { createByteLimitTransform } from "./bounded-read-stream.js";
5
- import { normalizeMaxBytes } from "./byte-budget.js";
6
5
  import { pipeline } from "node:stream/promises";
7
6
  import { FsSafeError } from "./errors.js";
8
7
  import { assertSyncStoreDirectoryReceipt, ensureSyncStoreDirectory, } from "./file-store-sync-directory.js";
@@ -14,13 +13,9 @@ import { prepareSecretFileWrite } from "./secret-file.js";
14
13
  import { resolveSecureTempRoot } from "./secure-temp-dir.js";
15
14
  import { recursiveMkdirPath } from "./recursive-mkdir-path.js";
16
15
  import { assertNoWindowsPathAlias } from "./windows-path-alias.js";
17
- function parentRelativePath(relativePath) {
18
- const parent = path.posix.dirname(relativePath);
19
- return parent === "." ? "" : parent;
20
- }
21
16
  export async function ensureParentInRoot(scopedRoot, relativePath, mode) {
22
- const parent = parentRelativePath(relativePath);
23
- if (!parent) {
17
+ const parent = path.posix.dirname(relativePath);
18
+ if (parent === ".") {
24
19
  return;
25
20
  }
26
21
  await scopedRoot.mkdir(parent);
@@ -28,10 +23,9 @@ export async function ensureParentInRoot(scopedRoot, relativePath, mode) {
28
23
  }
29
24
  export async function openWritableStoreRoot(params) {
30
25
  assertNoWindowsPathAlias(params.rootDir, "filesystem", "store root uses a Windows filesystem namespace alias");
31
- const maxBytes = normalizeMaxBytes(params.maxBytes);
32
26
  await fs.mkdir(recursiveMkdirPath(params.rootDir), { recursive: true, mode: params.dirMode });
33
27
  await fs.chmod(params.rootDir, params.dirMode).catch(() => undefined);
34
- return await root(params.rootDir, { hardlinks: "reject", maxBytes });
28
+ return await root(params.rootDir, { hardlinks: "reject", maxBytes: params.maxBytes });
35
29
  }
36
30
  export async function openPrivateStoreLockRoot(params) {
37
31
  const { parentGuard } = await prepareSecretFileWrite(params);
@@ -66,15 +60,8 @@ async function chmodDirectoryInRootBestEffort(scopedRoot, relativePath, mode) {
66
60
  await handle.close().catch(() => undefined);
67
61
  }
68
62
  }
69
- function createMaxBytesTransform(maxBytes) {
70
- const limit = normalizeMaxBytes(maxBytes);
71
- if (limit === undefined) {
72
- return undefined;
73
- }
74
- return createByteLimitTransform(limit, () => new FsSafeError("too-large", `file exceeds maximum size of ${limit} bytes`));
75
- }
76
63
  export async function writeStreamToTempSource(params) {
77
- const maxBytes = normalizeMaxBytes(params.maxBytes);
64
+ const maxBytes = params.maxBytes;
78
65
  const tempRoot = resolveSecureTempRoot({
79
66
  fallbackPrefix: "fs-safe-file-store",
80
67
  unsafeFallbackLabel: "file store temp dir",
@@ -90,7 +77,7 @@ export async function writeStreamToTempSource(params) {
90
77
  writable.once("close", () => {
91
78
  handleClosedByStream = true;
92
79
  });
93
- const limiter = createMaxBytesTransform(maxBytes);
80
+ const limiter = maxBytes === undefined ? undefined : createByteLimitTransform(maxBytes, () => new FsSafeError("too-large", `file exceeds maximum size of ${maxBytes} bytes`));
94
81
  if (limiter) {
95
82
  await pipeline(params.stream, limiter, writable);
96
83
  }
@@ -116,13 +103,6 @@ export async function writeStreamToTempSource(params) {
116
103
  throw err;
117
104
  }
118
105
  }
119
- export function assertSyncDirectoryGuard(guard) {
120
- assertSyncStoreDirectoryReceipt({
121
- dir: guard.dir,
122
- realPath: guard.realPath,
123
- exactStat: guard.exactStat,
124
- });
125
- }
126
106
  export function ensureParentSync(params) {
127
107
  assertNoWindowsPathAlias(params.rootDir, "filesystem", "store root uses a Windows filesystem namespace alias");
128
108
  assertNoWindowsPathAlias(params.filePath, "filesystem", "store path uses a Windows filesystem namespace alias");
@@ -135,6 +115,6 @@ export function ensureParentSync(params) {
135
115
  }
136
116
  export function ensureStoreDirectorySync(params) {
137
117
  const guard = ensureSyncStoreDirectory(params);
138
- assertSyncDirectoryGuard(guard);
118
+ assertSyncStoreDirectoryReceipt(guard);
139
119
  return guard;
140
120
  }
@@ -1,5 +1,4 @@
1
1
  export declare function readFileStoreCopySource(params: {
2
2
  sourcePath: string;
3
- maxBytes?: number;
3
+ maxBytes: number;
4
4
  }): Promise<Buffer>;
5
- //# sourceMappingURL=file-store-copy-source.d.ts.map
@@ -21,7 +21,7 @@ export async function readFileStoreCopySource(params) {
21
21
  cause: error instanceof Error ? error : undefined,
22
22
  });
23
23
  }
24
- if (params.maxBytes !== undefined && message.includes(`exceeds ${params.maxBytes} bytes`)) {
24
+ if (message.includes(`exceeds ${params.maxBytes} bytes`)) {
25
25
  throw new FsSafeError("too-large", `file exceeds maximum size of ${params.maxBytes} bytes`, {
26
26
  cause: error instanceof Error ? error : undefined,
27
27
  });
@@ -1,2 +1 @@
1
- export declare function assertFileStoreMaxBytes(size: number, maxBytes?: number): void;
2
- //# sourceMappingURL=file-store-limit.d.ts.map
1
+ export declare function assertFileStoreMaxBytes(size: number, limit: number | undefined): void;
@@ -1,7 +1,6 @@
1
- import { normalizeMaxBytes } from "./byte-budget.js";
2
1
  import { FsSafeError } from "./errors.js";
3
- export function assertFileStoreMaxBytes(size, maxBytes) {
4
- const limit = normalizeMaxBytes(maxBytes);
2
+ // Store operation boundaries admit the primitive limit before reaching this helper.
3
+ export function assertFileStoreMaxBytes(size, limit) {
5
4
  if (limit !== undefined && size > limit) {
6
5
  throw new FsSafeError("too-large", `file exceeds maximum size of ${limit} bytes`);
7
6
  }
@@ -1,3 +1,2 @@
1
1
  export declare function assertRelativePath(relativePath: string): string;
2
2
  export declare function resolveStorePath(rootDir: string, relativePath: string): string;
3
- //# sourceMappingURL=file-store-path.d.ts.map
@@ -9,4 +9,3 @@ export declare function pruneExpiredStoreEntries(params: {
9
9
  dirMode: number;
10
10
  options: FileStorePruneOptions;
11
11
  }): Promise<void>;
12
- //# sourceMappingURL=file-store-prune.d.ts.map
@@ -13,4 +13,3 @@ export declare function ensureSyncStoreDirectory(params: {
13
13
  }): SyncStoreDirectoryReceipt;
14
14
  export declare function assertSyncStoreDirectoryReceipt(receipt: SyncStoreDirectoryReceipt): void;
15
15
  export {};
16
- //# sourceMappingURL=file-store-sync-directory.d.ts.map