@openclaw/fs-safe 0.15.0 → 0.17.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 (311) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/README.md +36 -7
  3. package/dist/absolute-path.d.ts.map +1 -1
  4. package/dist/absolute-path.js +2 -8
  5. package/dist/advanced.d.ts +3 -0
  6. package/dist/advanced.d.ts.map +1 -1
  7. package/dist/advanced.js +3 -0
  8. package/dist/archive-deadline.d.ts.map +1 -1
  9. package/dist/archive-deadline.js +22 -23
  10. package/dist/archive-kind.d.ts +0 -1
  11. package/dist/archive-kind.d.ts.map +1 -1
  12. package/dist/archive-kind.js +5 -17
  13. package/dist/archive-merge.d.ts +1 -0
  14. package/dist/archive-merge.d.ts.map +1 -1
  15. package/dist/archive-merge.js +4 -4
  16. package/dist/archive-native.d.ts +1 -0
  17. package/dist/archive-native.d.ts.map +1 -1
  18. package/dist/archive-native.js +1 -0
  19. package/dist/archive-options.d.ts +2 -0
  20. package/dist/archive-options.d.ts.map +1 -1
  21. package/dist/archive-parser.wasm +0 -0
  22. package/dist/archive-read.d.ts.map +1 -1
  23. package/dist/archive-read.js +6 -7
  24. package/dist/archive-tar-stream.d.ts +3 -0
  25. package/dist/archive-tar-stream.d.ts.map +1 -1
  26. package/dist/archive-tar-stream.js +56 -37
  27. package/dist/archive-tar-wasm.d.ts +16 -4
  28. package/dist/archive-tar-wasm.d.ts.map +1 -1
  29. package/dist/archive-tar-wasm.js +134 -34
  30. package/dist/archive-zip-count.d.ts.map +1 -1
  31. package/dist/archive-zip-count.js +21 -1
  32. package/dist/archive-zip-directory.d.ts.map +1 -1
  33. package/dist/archive-zip-directory.js +23 -1
  34. package/dist/archive-zip-loader.d.ts +2 -0
  35. package/dist/archive-zip-loader.d.ts.map +1 -1
  36. package/dist/archive-zip-loader.js +7 -0
  37. package/dist/archive-zip-names.d.ts.map +1 -1
  38. package/dist/archive-zip-names.js +7 -2
  39. package/dist/archive.d.ts.map +1 -1
  40. package/dist/archive.js +14 -9
  41. package/dist/byte-view.d.ts +3 -0
  42. package/dist/byte-view.d.ts.map +1 -0
  43. package/dist/byte-view.js +13 -0
  44. package/dist/clone-metadata.d.ts +1 -0
  45. package/dist/clone-metadata.d.ts.map +1 -1
  46. package/dist/clone-metadata.js +6 -2
  47. package/dist/create-directory.d.ts +20 -0
  48. package/dist/create-directory.d.ts.map +1 -0
  49. package/dist/create-directory.js +130 -0
  50. package/dist/create-file-async.d.ts +7 -0
  51. package/dist/create-file-async.d.ts.map +1 -0
  52. package/dist/create-file-async.js +121 -0
  53. package/dist/create-file.d.ts +8 -0
  54. package/dist/create-file.d.ts.map +1 -0
  55. package/dist/create-file.js +190 -0
  56. package/dist/create-owned-file.d.ts +8 -0
  57. package/dist/create-owned-file.d.ts.map +1 -0
  58. package/dist/create-owned-file.js +16 -0
  59. package/dist/create.d.ts +4 -0
  60. package/dist/create.d.ts.map +1 -0
  61. package/dist/create.js +2 -0
  62. package/dist/creation-darwin.d.ts +6 -0
  63. package/dist/creation-darwin.d.ts.map +1 -0
  64. package/dist/creation-darwin.js +70 -0
  65. package/dist/creation-file-state.d.ts +19 -0
  66. package/dist/creation-file-state.d.ts.map +1 -0
  67. package/dist/creation-file-state.js +118 -0
  68. package/dist/creation-path.d.ts +21 -0
  69. package/dist/creation-path.d.ts.map +1 -0
  70. package/dist/creation-path.js +71 -0
  71. package/dist/creation-permissions.d.ts +19 -0
  72. package/dist/creation-permissions.d.ts.map +1 -0
  73. package/dist/creation-permissions.js +125 -0
  74. package/dist/directory-durability.d.ts +7 -7
  75. package/dist/directory-durability.d.ts.map +1 -1
  76. package/dist/directory-durability.js +22 -80
  77. package/dist/directory-guard.d.ts +3 -0
  78. package/dist/directory-guard.d.ts.map +1 -1
  79. package/dist/directory-mode-node.d.ts +2 -0
  80. package/dist/directory-mode-node.d.ts.map +1 -1
  81. package/dist/directory-mode-node.js +8 -0
  82. package/dist/directory-receipt.d.ts +24 -0
  83. package/dist/directory-receipt.d.ts.map +1 -0
  84. package/dist/directory-receipt.js +123 -0
  85. package/dist/file-cleanup.d.ts +20 -0
  86. package/dist/file-cleanup.d.ts.map +1 -0
  87. package/dist/file-cleanup.js +81 -0
  88. package/dist/file-contents.d.ts +6 -0
  89. package/dist/file-contents.d.ts.map +1 -0
  90. package/dist/file-contents.js +40 -0
  91. package/dist/file-hash.d.ts.map +1 -1
  92. package/dist/file-hash.js +16 -4
  93. package/dist/file-lock-sync-root-acquire.d.ts.map +1 -1
  94. package/dist/file-lock-sync-root-acquire.js +3 -0
  95. package/dist/file-lock-sync-root-held.d.ts +1 -2
  96. package/dist/file-lock-sync-root-held.d.ts.map +1 -1
  97. package/dist/file-lock-sync-root-held.js +7 -5
  98. package/dist/file-lock-sync-stale-admission.d.ts.map +1 -1
  99. package/dist/file-lock-sync-stale-admission.js +3 -0
  100. package/dist/file-lock-sync.d.ts.map +1 -1
  101. package/dist/file-lock-sync.js +8 -11
  102. package/dist/file-observation.d.ts +1 -1
  103. package/dist/file-observation.d.ts.map +1 -1
  104. package/dist/file-store-boundary.d.ts +2 -6
  105. package/dist/file-store-boundary.d.ts.map +1 -1
  106. package/dist/file-store-boundary.js +3 -9
  107. package/dist/file-store-sync-write.d.ts.map +1 -1
  108. package/dist/file-store-sync-write.js +2 -5
  109. package/dist/file-store.js +3 -3
  110. package/dist/guarded-mkdir.d.ts +1 -0
  111. package/dist/guarded-mkdir.d.ts.map +1 -1
  112. package/dist/guarded-mkdir.js +27 -19
  113. package/dist/install-path.d.ts.map +1 -1
  114. package/dist/install-path.js +2 -5
  115. package/dist/json-durable-queue-ownership.d.ts.map +1 -1
  116. package/dist/json-durable-queue-ownership.js +2 -6
  117. package/dist/json-durable-queue-paths.d.ts.map +1 -1
  118. package/dist/json-durable-queue-paths.js +2 -24
  119. package/dist/json-durable-queue.d.ts.map +1 -1
  120. package/dist/json-durable-queue.js +10 -9
  121. package/dist/json.d.ts.map +1 -1
  122. package/dist/json.js +32 -75
  123. package/dist/local-roots.d.ts.map +1 -1
  124. package/dist/local-roots.js +19 -21
  125. package/dist/move-path-cleanup.d.ts +5 -19
  126. package/dist/move-path-cleanup.d.ts.map +1 -1
  127. package/dist/move-path-cleanup.js +57 -21
  128. package/dist/move-path.d.ts.map +1 -1
  129. package/dist/move-path.js +63 -40
  130. package/dist/native-binding.d.ts +11 -1
  131. package/dist/native-binding.d.ts.map +1 -1
  132. package/dist/native-fallback-warning.d.ts +4 -0
  133. package/dist/native-fallback-warning.d.ts.map +1 -0
  134. package/dist/native-fallback-warning.js +11 -0
  135. package/dist/native-operations.d.ts +0 -2
  136. package/dist/native-operations.d.ts.map +1 -1
  137. package/dist/native-operations.js +0 -24
  138. package/dist/native-parent-admission.d.ts +2 -0
  139. package/dist/native-parent-admission.d.ts.map +1 -1
  140. package/dist/native-parent-admission.js +3 -2
  141. package/dist/native-pinned-write-windows.d.ts +1 -1
  142. package/dist/native-pinned-write-windows.d.ts.map +1 -1
  143. package/dist/native-pinned-write-windows.js +173 -28
  144. package/dist/native-pinned-write.d.ts.map +1 -1
  145. package/dist/native-pinned-write.js +19 -3
  146. package/dist/native-policy-parent-windows.d.ts.map +1 -1
  147. package/dist/native-policy-parent-windows.js +15 -6
  148. package/dist/native-staged-file.d.ts +5 -3
  149. package/dist/native-staged-file.d.ts.map +1 -1
  150. package/dist/native-staged-file.js +90 -40
  151. package/dist/native.js +2 -2
  152. package/dist/opened-realpath.d.ts.map +1 -1
  153. package/dist/opened-realpath.js +11 -2
  154. package/dist/owner-dacl.d.ts.map +1 -1
  155. package/dist/owner-dacl.js +10 -4
  156. package/dist/path.d.ts.map +1 -1
  157. package/dist/path.js +2 -1
  158. package/dist/permissions.d.ts.map +1 -1
  159. package/dist/permissions.js +3 -17
  160. package/dist/pinned-write-input.d.ts +4 -0
  161. package/dist/pinned-write-input.d.ts.map +1 -0
  162. package/dist/pinned-write-input.js +35 -0
  163. package/dist/pinned-write-mode.d.ts +5 -0
  164. package/dist/pinned-write-mode.d.ts.map +1 -0
  165. package/dist/pinned-write-mode.js +31 -0
  166. package/dist/pinned-write-staged.d.ts +6 -0
  167. package/dist/pinned-write-staged.d.ts.map +1 -0
  168. package/dist/pinned-write-staged.js +186 -0
  169. package/dist/pinned-write-types.d.ts +3 -0
  170. package/dist/pinned-write-types.d.ts.map +1 -1
  171. package/dist/pinned-write.d.ts.map +1 -1
  172. package/dist/pinned-write.js +41 -147
  173. package/dist/private-directory.d.ts.map +1 -1
  174. package/dist/private-directory.js +18 -4
  175. package/dist/private-producer-handoff-sync.d.ts +14 -0
  176. package/dist/private-producer-handoff-sync.d.ts.map +1 -0
  177. package/dist/private-producer-handoff-sync.js +114 -0
  178. package/dist/private-producer-handoff.d.ts +22 -4
  179. package/dist/private-producer-handoff.d.ts.map +1 -1
  180. package/dist/private-producer-handoff.js +140 -77
  181. package/dist/publish-copy-stage.d.ts +2 -1
  182. package/dist/publish-copy-stage.d.ts.map +1 -1
  183. package/dist/publish-copy-stage.js +16 -7
  184. package/dist/publish-file.d.ts +2 -2
  185. package/dist/publish-file.d.ts.map +1 -1
  186. package/dist/publish-file.js +58 -98
  187. package/dist/regular-file.d.ts.map +1 -1
  188. package/dist/regular-file.js +35 -44
  189. package/dist/replace-file-copy-fallback.d.ts.map +1 -1
  190. package/dist/replace-file-copy-fallback.js +28 -26
  191. package/dist/replace-file-copy-source.d.ts.map +1 -1
  192. package/dist/replace-file-copy-source.js +13 -22
  193. package/dist/replace-file-descriptor.d.ts.map +1 -1
  194. package/dist/replace-file-descriptor.js +10 -16
  195. package/dist/replace-file-temp-owner.d.ts +0 -7
  196. package/dist/replace-file-temp-owner.d.ts.map +1 -1
  197. package/dist/replace-file-temp-owner.js +9 -60
  198. package/dist/replace-file.d.ts.map +1 -1
  199. package/dist/replace-file.js +9 -13
  200. package/dist/root-create-input.d.ts +2 -1
  201. package/dist/root-create-input.d.ts.map +1 -1
  202. package/dist/root-create-input.js +13 -4
  203. package/dist/root-directory-creation.d.ts +3 -3
  204. package/dist/root-directory-creation.d.ts.map +1 -1
  205. package/dist/root-directory-creation.js +15 -3
  206. package/dist/root-directory-list.d.ts.map +1 -1
  207. package/dist/root-directory-list.js +20 -3
  208. package/dist/root-file-final-admission.d.ts +1 -1
  209. package/dist/root-file-final-admission.d.ts.map +1 -1
  210. package/dist/root-file-final-admission.js +5 -2
  211. package/dist/root-file.d.ts.map +1 -1
  212. package/dist/root-file.js +3 -2
  213. package/dist/root-impl.d.ts.map +1 -1
  214. package/dist/root-impl.js +78 -27
  215. package/dist/root-move-noreplace.d.ts +2 -0
  216. package/dist/root-move-noreplace.d.ts.map +1 -1
  217. package/dist/root-move-noreplace.js +22 -13
  218. package/dist/root-options.d.ts +12 -4
  219. package/dist/root-options.d.ts.map +1 -1
  220. package/dist/root-path-stat.d.ts.map +1 -1
  221. package/dist/root-path-stat.js +59 -7
  222. package/dist/root-read-admission.d.ts.map +1 -1
  223. package/dist/root-read-admission.js +7 -2
  224. package/dist/root-remove.d.ts.map +1 -1
  225. package/dist/root-remove.js +15 -1
  226. package/dist/root-write-publication.js +1 -1
  227. package/dist/secret-file.d.ts.map +1 -1
  228. package/dist/secret-file.js +1 -0
  229. package/dist/secure-file-windows.d.ts +6 -0
  230. package/dist/secure-file-windows.d.ts.map +1 -1
  231. package/dist/secure-file-windows.js +34 -117
  232. package/dist/secure-file.js +2 -2
  233. package/dist/sidecar-lock-acquire.d.ts.map +1 -1
  234. package/dist/sidecar-lock-acquire.js +4 -6
  235. package/dist/sidecar-lock-handle.d.ts +3 -0
  236. package/dist/sidecar-lock-handle.d.ts.map +1 -1
  237. package/dist/sidecar-lock-handle.js +6 -0
  238. package/dist/sidecar-lock-reclaim.d.ts +1 -1
  239. package/dist/sidecar-lock-reclaim.d.ts.map +1 -1
  240. package/dist/sidecar-lock-reclaim.js +11 -8
  241. package/dist/sidecar-lock-root.d.ts.map +1 -1
  242. package/dist/sidecar-lock-root.js +2 -1
  243. package/dist/sidecar-lock.d.ts.map +1 -1
  244. package/dist/sidecar-lock.js +3 -5
  245. package/dist/staged-directory.d.ts +2 -2
  246. package/dist/staged-directory.d.ts.map +1 -1
  247. package/dist/staged-directory.js +6 -6
  248. package/dist/staged-file-settlement.d.ts +17 -0
  249. package/dist/staged-file-settlement.d.ts.map +1 -0
  250. package/dist/staged-file-settlement.js +57 -0
  251. package/dist/strict-file-identity.d.ts +1 -1
  252. package/dist/strict-file-identity.d.ts.map +1 -1
  253. package/dist/strict-file-identity.js +9 -9
  254. package/dist/symlink-parents.d.ts.map +1 -1
  255. package/dist/symlink-parents.js +2 -27
  256. package/dist/temp-workspace-owner.js +4 -4
  257. package/dist/unicode-path.d.ts.map +1 -1
  258. package/dist/unicode-path.js +3 -0
  259. package/dist/walk.d.ts.map +1 -1
  260. package/dist/walk.js +4 -2
  261. package/dist/windows-owner.d.ts.map +1 -1
  262. package/dist/windows-owner.js +2 -1
  263. package/dist/windows-security-bridge.cs +336 -0
  264. package/dist/windows-security-bridge.ps1 +15 -0
  265. package/dist/windows-security-command.d.ts +26 -0
  266. package/dist/windows-security-command.d.ts.map +1 -0
  267. package/dist/windows-security-command.js +363 -0
  268. package/dist/windows-security-facts.d.ts +6 -0
  269. package/dist/windows-security-facts.d.ts.map +1 -0
  270. package/dist/windows-security-facts.js +108 -0
  271. package/dist/write-file-handle.d.ts +7 -0
  272. package/dist/write-file-handle.d.ts.map +1 -1
  273. package/dist/write-file-handle.js +23 -0
  274. package/dist/write-open-flags.d.ts.map +1 -1
  275. package/dist/write-open-flags.js +1 -8
  276. package/dist/write-queue.d.ts.map +1 -1
  277. package/dist/write-queue.js +1 -4
  278. package/docs/advanced.md +71 -2
  279. package/docs/archive.md +102 -39
  280. package/docs/atomic.md +29 -5
  281. package/docs/config.md +6 -2
  282. package/docs/contributing.md +48 -4
  283. package/docs/copy.md +2 -0
  284. package/docs/creation.md +132 -0
  285. package/docs/durability.md +59 -0
  286. package/docs/file-contents.md +68 -0
  287. package/docs/install.md +31 -7
  288. package/docs/json.md +5 -4
  289. package/docs/local-roots.md +2 -0
  290. package/docs/migrating-to-0.5.md +15 -6
  291. package/docs/migrating-to-0.6.md +9 -4
  292. package/docs/mutation-policy-proof.md +5 -3
  293. package/docs/native-helper.md +22 -9
  294. package/docs/native.md +47 -15
  295. package/docs/path.md +4 -4
  296. package/docs/permissions.md +37 -14
  297. package/docs/public-api.md +5 -0
  298. package/docs/quickstart.md +1 -1
  299. package/docs/reading.md +2 -2
  300. package/docs/regular-file.md +3 -0
  301. package/docs/root.md +43 -0
  302. package/docs/secret-file.md +11 -2
  303. package/docs/secure-file.md +9 -4
  304. package/docs/sidecar-lock.md +14 -5
  305. package/docs/staged-file.md +9 -3
  306. package/docs/store.md +3 -1
  307. package/docs/temp.md +4 -1
  308. package/docs/types.md +18 -2
  309. package/docs/walk.md +7 -0
  310. package/docs/writing.md +80 -7
  311. package/package.json +18 -15
@@ -0,0 +1,114 @@
1
+ import fs, {} from "node:fs";
2
+ import { ownFileDescriptorSync } from "./create-owned-file.js";
3
+ import { FsSafeError } from "./errors.js";
4
+ import { assertSynchronousCallbackResult } from "./mutation-authority.js";
5
+ import { assertInitialSource, assertParents, inspectLinkedFile, normalizeLinkError, } from "./private-producer-handoff.js";
6
+ import { resolveReadOpenFlags } from "./read-open-flags.js";
7
+ export function handoffCreatedFileSync(params) {
8
+ let retained = params.source;
9
+ const owners = new Set([retained]);
10
+ const failures = [];
11
+ let publication = "not-published";
12
+ let cleanup = "preserved";
13
+ let closeFailed = false;
14
+ function close(owner) {
15
+ // A throwing close may already have released the descriptor for reuse.
16
+ owners.delete(owner);
17
+ try {
18
+ owner.close();
19
+ }
20
+ catch (error) {
21
+ closeFailed = true;
22
+ throw error;
23
+ }
24
+ }
25
+ function assertIdentityCurrent(owner, links) {
26
+ assertParents(params);
27
+ inspectLinkedFile(() => fs.fstatSync(owner.fd, { bigint: true }), params.identity, links, "created file descriptor");
28
+ if (cleanup !== "removed") {
29
+ inspectLinkedFile(() => fs.lstatSync(params.sourcePath, { bigint: true }), params.identity, links, "created file stage");
30
+ }
31
+ if (publication === "published") {
32
+ inspectLinkedFile(() => fs.lstatSync(params.targetPath, { bigint: true }), params.identity, links, "created file destination");
33
+ }
34
+ }
35
+ function verifyCurrent(owner, descriptorPath, links) {
36
+ assertIdentityCurrent(owner, links);
37
+ params.verifyDescriptor?.(owner.fd, descriptorPath, Number(links));
38
+ }
39
+ try {
40
+ assertInitialSource(params.identity);
41
+ verifyCurrent(retained, params.sourcePath, 1n);
42
+ assertSynchronousCallbackResult(params.assertBeforeMutation?.(), "assertBeforeMutation");
43
+ assertIdentityCurrent(retained, 1n);
44
+ publication = "indeterminate";
45
+ try {
46
+ fs.linkSync(params.sourcePath, params.targetPath);
47
+ }
48
+ catch (error) {
49
+ const normalized = normalizeLinkError(error);
50
+ if (normalized instanceof FsSafeError &&
51
+ (normalized.code === "already-exists" || normalized.code === "helper-unavailable")) {
52
+ publication = "not-published";
53
+ }
54
+ throw normalized;
55
+ }
56
+ publication = "published";
57
+ try {
58
+ params.onPublished?.();
59
+ }
60
+ catch (error) {
61
+ failures.push(error);
62
+ }
63
+ if (process.platform === "win32") {
64
+ verifyCurrent(retained, params.sourcePath, 2n);
65
+ // Keep the original pin until a verified published-name pin exists, so
66
+ // Windows can retire the staging name without leaving it delete-pending.
67
+ const sibling = ownFileDescriptorSync(fs.openSync(params.targetPath, fs.constants.O_RDWR | resolveReadOpenFlags()));
68
+ owners.add(sibling);
69
+ verifyCurrent(sibling, params.targetPath, 2n);
70
+ inspectLinkedFile(() => fs.fstatSync(retained.fd, { bigint: true }), params.identity, 2n, "created file descriptor");
71
+ close(retained);
72
+ retained = sibling;
73
+ }
74
+ const descriptorPath = process.platform === "win32" ? params.targetPath : params.sourcePath;
75
+ verifyCurrent(retained, descriptorPath, 2n);
76
+ assertSynchronousCallbackResult(params.assertBeforeMutation?.(), "assertBeforeMutation");
77
+ assertIdentityCurrent(retained, 2n);
78
+ cleanup = "failed";
79
+ // Link and unlink stay in one JS turn. Only the verified stage is removed;
80
+ // publication has committed and the destination is never rollback cleanup.
81
+ fs.unlinkSync(params.sourcePath);
82
+ cleanup = "removed";
83
+ verifyCurrent(retained, params.targetPath, 1n);
84
+ }
85
+ catch (error) {
86
+ failures.push(error);
87
+ }
88
+ if (failures.length === 0)
89
+ return retained;
90
+ for (const owner of owners) {
91
+ try {
92
+ close(owner);
93
+ }
94
+ catch (error) {
95
+ failures.push(error);
96
+ }
97
+ }
98
+ const primary = failures[0];
99
+ // Collision-as-no-op callers must still observe a failed settlement.
100
+ const code = closeFailed || failures.length > 1
101
+ ? "helper-failed"
102
+ : primary instanceof FsSafeError ? primary.code : "helper-failed";
103
+ throw new FsSafeError(code, "created file publication failed", {
104
+ cause: failures.length === 1 ? primary : new AggregateError(failures, "created file publication and settlement failed"),
105
+ details: {
106
+ publication: { status: publication },
107
+ cleanup,
108
+ resources: closeFailed ? "close-failed" : "closed",
109
+ path: params.targetPath,
110
+ dev: params.identity.dev,
111
+ ino: params.identity.ino,
112
+ },
113
+ });
114
+ }
@@ -6,11 +6,29 @@ export type PrivateProducerHandoff = {
6
6
  identity: BigIntStats;
7
7
  unregister: TempPathRegistration;
8
8
  };
9
- export declare function handoffPrivateProducerFile(params: {
10
- sourcePath: string;
11
- targetPath: string;
9
+ type HandoffParents = {
12
10
  assertSourceParent: () => void;
13
11
  assertTargetParent: () => void;
12
+ };
13
+ type HandoffPaths = HandoffParents & {
14
+ sourcePath: string;
15
+ targetPath: string;
16
+ };
17
+ type ProducerHandoffParams = HandoffPaths & {
14
18
  readWrite: boolean;
15
- }): Promise<PrivateProducerHandoff>;
19
+ };
20
+ type CreatedHandoffParams = HandoffPaths & {
21
+ source: FileHandle;
22
+ identity: BigIntStats;
23
+ assertBeforeMutation?: () => void;
24
+ verifyDescriptor?: (fd: number, path: string, links: number) => Promise<void>;
25
+ onPublished?: () => void;
26
+ };
27
+ export declare function assertInitialSource(stat: BigIntStats): void;
28
+ export declare function inspectLinkedFile(inspect: () => BigIntStats, expected: BigIntStats, links: bigint, label: string): BigIntStats;
29
+ export declare function assertParents(params: HandoffParents): void;
30
+ export declare function normalizeLinkError(error: unknown): unknown;
31
+ export declare function handoffPrivateProducerFile(params: ProducerHandoffParams): Promise<PrivateProducerHandoff>;
32
+ export declare function handoffCreatedFile(params: CreatedHandoffParams): Promise<FileHandle>;
33
+ export {};
16
34
  //# sourceMappingURL=private-producer-handoff.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"private-producer-handoff.d.ts","sourceRoot":"","sources":["../src/private-producer-handoff.ts"],"names":[],"mappings":"AAAA,OAAe,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AACnD,OAAW,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAKvD,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,EAAE,oBAAoB,CAAC;CAClC,CAAC;AA2OF,wBAAsB,0BAA0B,CAAC,MAAM,EAAE;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,SAAS,EAAE,OAAO,CAAC;CACpB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA6HlC"}
1
+ {"version":3,"file":"private-producer-handoff.d.ts","sourceRoot":"","sources":["../src/private-producer-handoff.ts"],"names":[],"mappings":"AAAA,OAAe,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AACnD,OAAW,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAMvD,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,EAAE,oBAAoB,CAAC;CAClC,CAAC;AASF,KAAK,cAAc,GAAG;IACpB,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,kBAAkB,EAAE,MAAM,IAAI,CAAC;CAChC,CAAC;AAEF,KAAK,YAAY,GAAG,cAAc,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAChF,KAAK,qBAAqB,GAAG,YAAY,GAAG;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AACnE,KAAK,oBAAoB,GAAG,YAAY,GAAG;IACzC,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,WAAW,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;IAClC,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B,CAAC;AAMF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAU3D;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,WAAW,EAC1B,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,WAAW,CAQb;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAG1D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAmB1D;AAiUD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAEzG;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,CAEpF"}
@@ -2,13 +2,14 @@ import fsSync, {} from "node:fs";
2
2
  import fs, {} from "node:fs/promises";
3
3
  import { FsSafeError } from "./errors.js";
4
4
  import { sameFileIdentityForCleanup } from "./file-identity.js";
5
+ import { assertSynchronousCallbackResult } from "./mutation-authority.js";
5
6
  import { resolveReadOpenFlags } from "./read-open-flags.js";
6
7
  import { inspectFileIdentitySync } from "./strict-file-identity.js";
7
8
  import { registerTempPathForExit, } from "./temp-cleanup.js";
8
9
  function pathMismatch(message) {
9
10
  return new FsSafeError("path-mismatch", message);
10
11
  }
11
- function assertInitialSource(stat) {
12
+ export function assertInitialSource(stat) {
12
13
  if (stat.isSymbolicLink()) {
13
14
  throw new FsSafeError("path-alias", "isolated producer output must not be a symlink");
14
15
  }
@@ -19,7 +20,7 @@ function assertInitialSource(stat) {
19
20
  throw new FsSafeError("hardlink", "isolated producer output must have exactly one link");
20
21
  }
21
22
  }
22
- function inspectLinkedFile(inspect, expected, links, label) {
23
+ export function inspectLinkedFile(inspect, expected, links, label) {
23
24
  return inspectFileIdentitySync(() => {
24
25
  const stat = inspect();
25
26
  if (stat.isSymbolicLink() || !stat.isFile() || stat.nlink !== links) {
@@ -28,11 +29,11 @@ function inspectLinkedFile(inspect, expected, links, label) {
28
29
  return stat;
29
30
  }, expected);
30
31
  }
31
- function assertParents(params) {
32
+ export function assertParents(params) {
32
33
  params.assertTargetParent();
33
34
  params.assertSourceParent();
34
35
  }
35
- function normalizeLinkError(error) {
36
+ export function normalizeLinkError(error) {
36
37
  const code = error?.code;
37
38
  if (code === "EEXIST") {
38
39
  return new FsSafeError("already-exists", "isolated producer sibling already exists", {
@@ -101,7 +102,7 @@ async function throwAfterClosing(primary, handles) {
101
102
  throw combinedFailure(primary, settlement);
102
103
  }
103
104
  function inspectSourceDescriptor(handle, identity, links = 1n) {
104
- inspectLinkedFile(() => fsSync.fstatSync(handle.fd, { bigint: true }), identity, links, "isolated producer descriptor");
105
+ return inspectLinkedFile(() => fsSync.fstatSync(handle.fd, { bigint: true }), identity, links, "isolated producer descriptor");
105
106
  }
106
107
  function historicalOpenFlags(readWrite) {
107
108
  const access = readWrite ? fsSync.constants.O_RDWR : fsSync.constants.O_RDONLY;
@@ -164,109 +165,171 @@ async function openProducerSource(params, identity, links = 1n) {
164
165
  }
165
166
  return fallback;
166
167
  }
167
- function assertLinkedHandoff(params, handle, identity) {
168
+ function inspectHandoff(params, handle, identity, state, links) {
168
169
  assertParents(params);
169
- inspectSourceDescriptor(handle, identity, 2n);
170
- inspectLinkedFile(() => fsSync.lstatSync(params.sourcePath, { bigint: true }), identity, 2n, "isolated producer path");
171
- inspectLinkedFile(() => fsSync.lstatSync(params.targetPath, { bigint: true }), identity, 2n, "isolated producer sibling");
170
+ const opened = inspectSourceDescriptor(handle, identity, links);
171
+ if (state.cleanup !== "removed") {
172
+ inspectLinkedFile(() => fsSync.lstatSync(params.sourcePath, { bigint: true }), identity, links, "isolated producer path");
173
+ }
174
+ const named = state.publication === "published" ? inspectLinkedFile(() => fsSync.lstatSync(params.targetPath, { bigint: true }), identity, links, "isolated producer sibling") : undefined;
175
+ return { opened, named };
172
176
  }
173
- export async function handoffPrivateProducerFile(params) {
174
- assertParents(params);
175
- const identity = inspectFileIdentitySync(() => {
177
+ async function handoffFile(params) {
178
+ const created = "source" in params ? params : undefined;
179
+ const identity = created?.identity ?? inspectFileIdentitySync(() => {
180
+ assertParents(params);
176
181
  const stat = fsSync.lstatSync(params.sourcePath, { bigint: true });
177
182
  assertInitialSource(stat);
178
183
  return stat;
179
184
  });
180
- let handle;
181
- let siblingHandle;
185
+ let handle = created?.source;
186
+ const owners = new Set(handle ? [handle] : []);
187
+ const failures = [];
182
188
  let unregister;
183
- const state = { siblingOwned: false };
189
+ const state = {
190
+ siblingOwned: false, publication: "not-published", cleanup: "preserved", closeFailed: false,
191
+ };
192
+ async function close(owned) {
193
+ // Final creation consumes its pin before close can release and recycle it.
194
+ // Legacy temporary handoff retains its historical FileHandle close retry.
195
+ if (created)
196
+ owners.delete(owned);
197
+ try {
198
+ await owned.close();
199
+ owners.delete(owned);
200
+ }
201
+ catch (error) {
202
+ state.closeFailed = true;
203
+ throw error;
204
+ }
205
+ }
184
206
  try {
185
- handle = await openProducerSource(params, identity);
186
- inspectLinkedFile(() => fsSync.lstatSync(params.sourcePath, { bigint: true }), identity, 1n, "isolated producer path");
187
- assertParents(params);
188
- unregister = registerTempPathForExit(params.targetPath, {
189
- cleanupSync: () => removeSiblingIfOwned({
190
- assertTargetParent: params.assertTargetParent,
191
- identity,
192
- state,
193
- targetPath: params.targetPath,
194
- }),
195
- });
196
- assertParents(params);
207
+ assertInitialSource(identity);
208
+ if (!handle) {
209
+ handle = await openProducerSource({ ...params, readWrite: "readWrite" in params && params.readWrite }, identity);
210
+ owners.add(handle);
211
+ }
212
+ inspectHandoff(params, handle, identity, state, 1n);
213
+ if (created?.verifyDescriptor)
214
+ await created.verifyDescriptor(handle.fd, params.sourcePath, 1);
215
+ if (!created) {
216
+ unregister = registerTempPathForExit(params.targetPath, {
217
+ cleanupSync: () => removeSiblingIfOwned({
218
+ assertTargetParent: params.assertTargetParent, identity, state, targetPath: params.targetPath,
219
+ }),
220
+ });
221
+ }
222
+ assertSynchronousCallbackResult(created?.assertBeforeMutation?.(), "assertBeforeMutation");
223
+ inspectHandoff(params, handle, identity, state, 1n);
224
+ state.publication = "indeterminate";
197
225
  try {
198
226
  fsSync.linkSync(params.sourcePath, params.targetPath);
199
227
  }
200
228
  catch (error) {
201
- throw normalizeLinkError(error);
229
+ const normalized = normalizeLinkError(error);
230
+ if (normalized instanceof FsSafeError &&
231
+ (normalized.code === "already-exists" || normalized.code === "helper-unavailable")) {
232
+ state.publication = "not-published";
233
+ }
234
+ throw normalized;
202
235
  }
203
- state.siblingOwned = true;
204
- assertLinkedHandoff(params, handle, identity);
236
+ state.publication = "published";
237
+ state.siblingOwned = !created;
238
+ try {
239
+ assertSynchronousCallbackResult(created?.onPublished?.(), "onPublished");
240
+ }
241
+ catch (error) {
242
+ failures.push(error);
243
+ }
244
+ inspectHandoff(params, handle, identity, state, 2n);
205
245
  if (process.platform === "win32") {
206
246
  // Legacy Windows unlink retains a delete-pending name until handles
207
247
  // opened through that name close. Transfer the pin before retiring it.
208
- siblingHandle = await openProducerSource({ ...params, sourcePath: params.targetPath }, identity, 2n);
209
- assertLinkedHandoff(params, siblingHandle, identity);
248
+ const sibling = created
249
+ ? await fs.open(params.targetPath, historicalOpenFlags(true))
250
+ : await openProducerSource({ ...params, sourcePath: params.targetPath,
251
+ readWrite: "readWrite" in params && params.readWrite }, identity, 2n);
252
+ owners.add(sibling);
253
+ inspectHandoff(params, sibling, identity, state, 2n);
254
+ if (created?.verifyDescriptor)
255
+ await created.verifyDescriptor(sibling.fd, params.targetPath, 2);
256
+ inspectHandoff(params, sibling, identity, state, 2n);
210
257
  inspectSourceDescriptor(handle, identity, 2n);
211
- await handle.close();
212
- handle = siblingHandle;
213
- siblingHandle = undefined;
258
+ await close(handle);
259
+ handle = sibling;
214
260
  // The old handle's close yielded; both names must still be ours.
215
- assertLinkedHandoff(params, handle, identity);
261
+ inspectHandoff(params, handle, identity, state, 2n);
216
262
  }
217
- assertParents(params);
263
+ if (created?.verifyDescriptor)
264
+ await created.verifyDescriptor(handle.fd, process.platform === "win32" ? params.targetPath : params.sourcePath, 2);
265
+ assertSynchronousCallbackResult(created?.assertBeforeMutation?.(), "assertBeforeMutation");
266
+ inspectHandoff(params, handle, identity, state, 2n);
267
+ state.cleanup = "failed";
218
268
  fsSync.unlinkSync(params.sourcePath);
219
- assertParents(params);
220
- const opened = inspectLinkedFile(() => fsSync.fstatSync(handle.fd, { bigint: true }), identity, 1n, "isolated producer descriptor");
221
- const sibling = inspectLinkedFile(() => fsSync.lstatSync(params.targetPath, { bigint: true }), identity, 1n, "isolated producer sibling");
269
+ state.cleanup = "removed";
270
+ if (created?.verifyDescriptor)
271
+ await created.verifyDescriptor(handle.fd, params.targetPath, 1);
272
+ const { opened, named } = inspectHandoff(params, handle, identity, state, 1n);
222
273
  const originalMode = identity.mode & 511n;
223
- if (process.platform === "win32" && (originalMode & 128n) === 0n &&
224
- ((opened.mode & 511n) !== originalMode || (sibling.mode & 511n) !== originalMode)) {
274
+ if (!created && process.platform === "win32" && (originalMode & 128n) === 0n &&
275
+ ((opened.mode & 511n) !== originalMode || (named.mode & 511n) !== originalMode)) {
225
276
  // Legacy unlink clears the shared read-only attribute. Repair only the
226
277
  // admitted sibling inode, without reopening or chmodding its pathname.
227
278
  assertParents(params);
228
279
  fsSync.fchmodSync(handle.fd, Number(originalMode));
229
- assertParents(params);
230
- const restored = inspectLinkedFile(() => fsSync.fstatSync(handle.fd, { bigint: true }), identity, 1n, "isolated producer descriptor");
231
- const restoredSibling = inspectLinkedFile(() => fsSync.lstatSync(params.targetPath, { bigint: true }), identity, 1n, "isolated producer sibling");
232
- if ((restored.mode & 511n) !== originalMode || (restoredSibling.mode & 511n) !== originalMode) {
280
+ const restored = inspectHandoff(params, handle, identity, state, 1n);
281
+ if ((restored.opened.mode & 511n) !== originalMode || (restored.named.mode & 511n) !== originalMode) {
233
282
  throw pathMismatch("isolated producer read-only mode could not be restored");
234
283
  }
235
284
  }
236
- const registered = unregister;
237
- const release = (() => {
238
- state.siblingOwned = false;
239
- registered();
240
- });
241
- release.setIdentity = registered.setIdentity;
242
- return { handle, identity, unregister: release };
285
+ if (!created) {
286
+ const registered = unregister;
287
+ const release = (() => {
288
+ state.siblingOwned = false;
289
+ registered();
290
+ });
291
+ release.setIdentity = registered.setIdentity;
292
+ return { handle, identity, unregister: release };
293
+ }
243
294
  }
244
295
  catch (error) {
245
- const settlement = [];
246
- if (unregister) {
247
- try {
248
- removeSiblingIfOwned({
249
- assertTargetParent: params.assertTargetParent,
250
- identity,
251
- state,
252
- targetPath: params.targetPath,
253
- });
254
- unregister();
255
- }
256
- catch (cleanupError) {
257
- settlement.push(cleanupError);
258
- }
296
+ failures.push(error);
297
+ }
298
+ if (failures.length === 0)
299
+ return handle;
300
+ if (unregister) {
301
+ try {
302
+ removeSiblingIfOwned({ assertTargetParent: params.assertTargetParent, identity, state, targetPath: params.targetPath });
303
+ unregister();
259
304
  }
260
- for (const retained of new Set([siblingHandle, handle])) {
261
- if (!retained)
262
- continue;
263
- try {
264
- await retained.close();
265
- }
266
- catch (closeError) {
267
- settlement.push(closeError);
268
- }
305
+ catch (error) {
306
+ failures.push(error);
307
+ }
308
+ }
309
+ for (const owned of [...owners].reverse()) {
310
+ try {
311
+ await close(owned);
312
+ }
313
+ catch (error) {
314
+ failures.push(error);
269
315
  }
270
- throw combinedFailure(error, settlement);
271
316
  }
317
+ const primary = failures[0];
318
+ const cause = combinedFailure(primary, failures.slice(1));
319
+ if (!created)
320
+ throw cause;
321
+ throw new FsSafeError(state.closeFailed || failures.length > 1 ? "helper-failed" : primary instanceof FsSafeError ? primary.code : "helper-failed", "created file publication failed", {
322
+ cause,
323
+ details: {
324
+ publication: { status: state.publication }, cleanup: state.cleanup,
325
+ resources: state.closeFailed ? "close-failed" : "closed",
326
+ path: params.targetPath, dev: identity.dev, ino: identity.ino,
327
+ },
328
+ });
329
+ }
330
+ export function handoffPrivateProducerFile(params) {
331
+ return handoffFile(params);
332
+ }
333
+ export function handoffCreatedFile(params) {
334
+ return handoffFile(params);
272
335
  }
@@ -1,5 +1,5 @@
1
1
  import { type BigIntStats } from "node:fs";
2
- import type { AnyAsyncDirectoryGuard } from "./directory-guard.js";
2
+ import { type AnyAsyncDirectoryGuard } from "./directory-guard.js";
3
3
  import type { PublishedWriteIdentity } from "./pinned-write.js";
4
4
  export declare function publishCopyStage(params: {
5
5
  temporaryPath: string;
@@ -8,6 +8,7 @@ export declare function publishCopyStage(params: {
8
8
  identity: BigIntStats;
9
9
  parentGuard: AnyAsyncDirectoryGuard;
10
10
  assertBeforeMutation?: () => void;
11
+ onPublicationAttempt?: () => void;
11
12
  onPublished?: (identity: PublishedWriteIdentity) => void;
12
13
  }): void;
13
14
  //# sourceMappingURL=publish-copy-stage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"publish-copy-stage.d.ts","sourceRoot":"","sources":["../src/publish-copy-stage.ts"],"names":[],"mappings":"AAAA,OAAW,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAGnE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAIhE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,WAAW,CAAC;IACtB,WAAW,EAAE,sBAAsB,CAAC;IACpC,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,sBAAsB,KAAK,IAAI,CAAC;CAC1D,GAAG,IAAI,CAqCP"}
1
+ {"version":3,"file":"publish-copy-stage.d.ts","sourceRoot":"","sources":["../src/publish-copy-stage.ts"],"names":[],"mappings":"AAAA,OAAW,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,EAA4B,KAAK,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAG7F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAIhE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,WAAW,CAAC;IACtB,WAAW,EAAE,sBAAsB,CAAC;IACpC,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;IAClC,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,sBAAsB,KAAK,IAAI,CAAC;CAC1D,GAAG,IAAI,CA4CP"}
@@ -1,19 +1,28 @@
1
1
  import fs, {} from "node:fs";
2
2
  import path from "node:path";
3
+ import { assertSyncDirectoryGuard } from "./directory-guard.js";
3
4
  import { FsSafeError } from "./errors.js";
4
5
  import { sameFileIdentityForCleanup } from "./file-identity.js";
5
6
  // Node has no portable no-replace rename. Link only our completed private stage,
6
7
  // then unlink it in the same JS turn so local readers never observe two names.
7
8
  export function publishCopyStage(params) {
8
9
  const { identity, temporaryPath, targetPath } = params;
9
- const staged = fs.lstatSync(temporaryPath, { bigint: true });
10
- const opened = fs.fstatSync(params.fd, { bigint: true });
11
- if (!staged.isFile() || staged.isSymbolicLink() || staged.nlink !== 1n ||
12
- !sameFileIdentityForCleanup(staged, identity) ||
13
- !sameFileIdentityForCleanup(opened, identity)) {
14
- throw new FsSafeError("path-mismatch", "exclusive copy stage changed before publication");
15
- }
10
+ const assertCurrent = () => {
11
+ assertSyncDirectoryGuard(params.parentGuard);
12
+ const staged = fs.lstatSync(temporaryPath, { bigint: true });
13
+ const opened = fs.fstatSync(params.fd, { bigint: true });
14
+ if (!staged.isFile() || staged.isSymbolicLink() || staged.nlink !== 1n ||
15
+ !sameFileIdentityForCleanup(staged, identity) ||
16
+ !sameFileIdentityForCleanup(opened, identity)) {
17
+ throw new FsSafeError("path-mismatch", "exclusive copy stage changed before publication");
18
+ }
19
+ };
20
+ assertCurrent();
16
21
  params.assertBeforeMutation?.();
22
+ // Caller authority checks can synchronously replace a parent or staged entry.
23
+ if (params.assertBeforeMutation)
24
+ assertCurrent();
25
+ params.onPublicationAttempt?.();
17
26
  fs.linkSync(temporaryPath, targetPath);
18
27
  let observerRejected = false;
19
28
  let observerError;
@@ -1,4 +1,4 @@
1
- import { type Stats } from "node:fs";
1
+ import { type BigIntStats, type Stats } from "node:fs";
2
2
  import { type DirectoryReceipt, type DirectorySyncOutcome } from "./directory-durability.js";
3
3
  import { type FileIdentityStat } from "./file-identity.js";
4
4
  import { type PublishFileExclusiveSyncFailurePolicy } from "./publish-file-failure.js";
@@ -16,6 +16,6 @@ export declare function publishFileExclusive(params: {
16
16
  expectedSourceIdentity?: FileIdentityStat;
17
17
  strategy: PublishFileExclusiveStrategy;
18
18
  onSyncFailure?: PublishFileExclusiveSyncFailurePolicy;
19
- parentReceipt?: DirectoryReceipt;
19
+ parentReceipt?: DirectoryReceipt<Stats | BigIntStats>;
20
20
  }): Promise<PublishFileExclusiveResult>;
21
21
  //# sourceMappingURL=publish-file.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"publish-file.d.ts","sourceRoot":"","sources":["../src/publish-file.ts"],"names":[],"mappings":"AACA,OAAe,EAAoB,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AAG/D,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EAC1B,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAML,KAAK,qCAAqC,EAC3C,MAAM,2BAA2B,CAAC;AAKnC,YAAY,EACV,2BAA2B,EAC3B,wCAAwC,EACxC,kCAAkC,EAClC,gCAAgC,EAChC,qCAAqC,GACtC,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,4BAA4B,GAAG,cAAc,GAAG,eAAe,GAAG,kBAAkB,CAAC;AAEjG,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,UAAU,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;IAC3D,QAAQ,EAAE,KAAK,CAAC;IAChB,aAAa,EAAE,oBAAoB,CAAC;CACrC,CAAC;AAIF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE/D;AA0ND,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB,CAAC,EAAE,gBAAgB,CAAC;IAC1C,QAAQ,EAAE,4BAA4B,CAAC;IACvC,aAAa,CAAC,EAAE,qCAAqC,CAAC;IACtD,aAAa,CAAC,EAAE,gBAAgB,CAAC;CAClC,GAAG,OAAO,CAAC,0BAA0B,CAAC,CA6NtC"}
1
+ {"version":3,"file":"publish-file.d.ts","sourceRoot":"","sources":["../src/publish-file.ts"],"names":[],"mappings":"AACA,OAAe,EAAE,KAAK,WAAW,EAAE,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AAG/D,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EAC1B,MAAM,2BAA2B,CAAC;AAInC,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAML,KAAK,qCAAqC,EAC3C,MAAM,2BAA2B,CAAC;AAOnC,YAAY,EACV,2BAA2B,EAC3B,wCAAwC,EACxC,kCAAkC,EAClC,gCAAgC,EAChC,qCAAqC,GACtC,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,4BAA4B,GAAG,cAAc,GAAG,eAAe,GAAG,kBAAkB,CAAC;AAEjG,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,UAAU,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;IAC3D,QAAQ,EAAE,KAAK,CAAC;IAChB,aAAa,EAAE,oBAAoB,CAAC;CACrC,CAAC;AAIF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE/D;AAgOD,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB,CAAC,EAAE,gBAAgB,CAAC;IAC1C,QAAQ,EAAE,4BAA4B,CAAC;IACvC,aAAa,CAAC,EAAE,qCAAqC,CAAC;IACtD,aAAa,CAAC,EAAE,gBAAgB,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC;CACvD,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAsKtC"}