swarm-deploy 0.0.0 → 0.2.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 (148) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/LICENSE.md +201 -0
  3. package/NOTICE.md +13 -0
  4. package/README.md +1283 -0
  5. package/RELEASING.md +71 -0
  6. package/SECURITY.md +40 -0
  7. package/dist/abort.d.ts +16 -0
  8. package/dist/abort.js +52 -0
  9. package/dist/abort.js.map +1 -0
  10. package/dist/allowlist.d.ts +2 -0
  11. package/dist/allowlist.js +21 -0
  12. package/dist/allowlist.js.map +1 -0
  13. package/dist/bin/swarm-deploy.d.ts +2 -0
  14. package/dist/bin/swarm-deploy.js +41 -0
  15. package/dist/bin/swarm-deploy.js.map +1 -0
  16. package/dist/cli.d.ts +27 -0
  17. package/dist/cli.js +751 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/client.d.ts +111 -0
  20. package/dist/client.js +276 -0
  21. package/dist/client.js.map +1 -0
  22. package/dist/direct-dht.d.ts +81 -0
  23. package/dist/direct-dht.js +254 -0
  24. package/dist/direct-dht.js.map +1 -0
  25. package/dist/error-code.d.ts +15 -0
  26. package/dist/error-code.js +30 -0
  27. package/dist/error-code.js.map +1 -0
  28. package/dist/errors.d.ts +31 -0
  29. package/dist/errors.js +37 -0
  30. package/dist/errors.js.map +1 -0
  31. package/dist/events-node.d.ts +2 -0
  32. package/dist/events-node.js +7 -0
  33. package/dist/events-node.js.map +1 -0
  34. package/dist/files.d.ts +32 -0
  35. package/dist/files.js +85 -0
  36. package/dist/files.js.map +1 -0
  37. package/dist/fs-node.d.ts +2 -0
  38. package/dist/fs-node.js +7 -0
  39. package/dist/fs-node.js.map +1 -0
  40. package/dist/hooks-module.d.ts +9 -0
  41. package/dist/hooks-module.js +118 -0
  42. package/dist/hooks-module.js.map +1 -0
  43. package/dist/hooks.d.ts +69 -0
  44. package/dist/hooks.js +88 -0
  45. package/dist/hooks.js.map +1 -0
  46. package/dist/identity.d.ts +7 -0
  47. package/dist/identity.js +50 -0
  48. package/dist/identity.js.map +1 -0
  49. package/dist/index.d.ts +12 -0
  50. package/dist/index.js +21 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/os-node.d.ts +2 -0
  53. package/dist/os-node.js +7 -0
  54. package/dist/os-node.js.map +1 -0
  55. package/dist/path-node.d.ts +2 -0
  56. package/dist/path-node.js +7 -0
  57. package/dist/path-node.js.map +1 -0
  58. package/dist/process-node.d.ts +2 -0
  59. package/dist/process-node.js +7 -0
  60. package/dist/process-node.js.map +1 -0
  61. package/dist/release.d.ts +26 -0
  62. package/dist/release.js +419 -0
  63. package/dist/release.js.map +1 -0
  64. package/dist/server.d.ts +239 -0
  65. package/dist/server.js +928 -0
  66. package/dist/server.js.map +1 -0
  67. package/dist/storage/atomic-file.d.ts +15 -0
  68. package/dist/storage/atomic-file.js +172 -0
  69. package/dist/storage/atomic-file.js.map +1 -0
  70. package/dist/storage/commit-journal.d.ts +120 -0
  71. package/dist/storage/commit-journal.js +417 -0
  72. package/dist/storage/commit-journal.js.map +1 -0
  73. package/dist/storage/commit-store.d.ts +307 -0
  74. package/dist/storage/commit-store.js +1691 -0
  75. package/dist/storage/commit-store.js.map +1 -0
  76. package/dist/storage/layout.d.ts +16 -0
  77. package/dist/storage/layout.js +409 -0
  78. package/dist/storage/layout.js.map +1 -0
  79. package/dist/storage/link-store.d.ts +70 -0
  80. package/dist/storage/link-store.js +363 -0
  81. package/dist/storage/link-store.js.map +1 -0
  82. package/dist/storage/recovery.d.ts +100 -0
  83. package/dist/storage/recovery.js +260 -0
  84. package/dist/storage/recovery.js.map +1 -0
  85. package/dist/storage/retention.d.ts +183 -0
  86. package/dist/storage/retention.js +619 -0
  87. package/dist/storage/retention.js.map +1 -0
  88. package/dist/storage/root-coordinator.d.ts +7 -0
  89. package/dist/storage/root-coordinator.js +27 -0
  90. package/dist/storage/root-coordinator.js.map +1 -0
  91. package/dist/storage/session-store.d.ts +2 -0
  92. package/dist/storage/session-store.js +7 -0
  93. package/dist/storage/session-store.js.map +1 -0
  94. package/dist/storage/tar-session-store.d.ts +147 -0
  95. package/dist/storage/tar-session-store.js +1044 -0
  96. package/dist/storage/tar-session-store.js.map +1 -0
  97. package/dist/storage/tree-fs.d.ts +44 -0
  98. package/dist/storage/tree-fs.js +580 -0
  99. package/dist/storage/tree-fs.js.map +1 -0
  100. package/dist/storage/tree-staging.d.ts +9 -0
  101. package/dist/storage/tree-staging.js +64 -0
  102. package/dist/storage/tree-staging.js.map +1 -0
  103. package/dist/storage/types.d.ts +77 -0
  104. package/dist/storage/types.js +3 -0
  105. package/dist/storage/types.js.map +1 -0
  106. package/dist/symlinks.d.ts +36 -0
  107. package/dist/symlinks.js +128 -0
  108. package/dist/symlinks.js.map +1 -0
  109. package/dist/tar-protocol/controls.d.ts +73 -0
  110. package/dist/tar-protocol/controls.js +291 -0
  111. package/dist/tar-protocol/controls.js.map +1 -0
  112. package/dist/tar-protocol/direct-wire.d.ts +43 -0
  113. package/dist/tar-protocol/direct-wire.js +194 -0
  114. package/dist/tar-protocol/direct-wire.js.map +1 -0
  115. package/dist/tar-protocol/extract.d.ts +18 -0
  116. package/dist/tar-protocol/extract.js +124 -0
  117. package/dist/tar-protocol/extract.js.map +1 -0
  118. package/dist/tar-protocol/hash.d.ts +10 -0
  119. package/dist/tar-protocol/hash.js +44 -0
  120. package/dist/tar-protocol/hash.js.map +1 -0
  121. package/dist/tar-protocol/lifecycle.d.ts +13 -0
  122. package/dist/tar-protocol/lifecycle.js +90 -0
  123. package/dist/tar-protocol/lifecycle.js.map +1 -0
  124. package/dist/tar-protocol/manifest.d.ts +58 -0
  125. package/dist/tar-protocol/manifest.js +312 -0
  126. package/dist/tar-protocol/manifest.js.map +1 -0
  127. package/dist/tar-protocol/tree-extract.d.ts +37 -0
  128. package/dist/tar-protocol/tree-extract.js +240 -0
  129. package/dist/tar-protocol/tree-extract.js.map +1 -0
  130. package/dist/tar-protocol/tree-manifest.d.ts +45 -0
  131. package/dist/tar-protocol/tree-manifest.js +277 -0
  132. package/dist/tar-protocol/tree-manifest.js.map +1 -0
  133. package/dist/tar-protocol/tree-path.d.ts +15 -0
  134. package/dist/tar-protocol/tree-path.js +68 -0
  135. package/dist/tar-protocol/tree-path.js.map +1 -0
  136. package/dist/tar-protocol/tree.d.ts +68 -0
  137. package/dist/tar-protocol/tree.js +269 -0
  138. package/dist/tar-protocol/tree.js.map +1 -0
  139. package/dist/tar-protocol/ustar.d.ts +36 -0
  140. package/dist/tar-protocol/ustar.js +167 -0
  141. package/dist/tar-protocol/ustar.js.map +1 -0
  142. package/dist/types.d.ts +61 -0
  143. package/dist/types.js +3 -0
  144. package/dist/types.js.map +1 -0
  145. package/dist/validation.d.ts +4 -0
  146. package/dist/validation.js +26 -0
  147. package/dist/validation.js.map +1 -0
  148. package/package.json +103 -1
@@ -0,0 +1,619 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MAX_CLEANUP_INTERVAL = exports.DEFAULT_CLEANUP_INTERVAL = exports.DEFAULT_RESUME_TTL = exports.RetentionManager = void 0;
7
+ const b4a_1 = __importDefault(require("b4a"));
8
+ const error_code_js_1 = require("../error-code.js");
9
+ const _fs_1 = __importDefault(require("#fs"));
10
+ const _path_1 = __importDefault(require("#path"));
11
+ const errors_js_1 = require("../errors.js");
12
+ const layout_js_1 = require("./layout.js");
13
+ const hash_js_1 = require("../tar-protocol/hash.js");
14
+ const validation_js_1 = require("../validation.js");
15
+ const root_coordinator_js_1 = require("./root-coordinator.js");
16
+ const release_js_1 = require("../release.js");
17
+ const commit_journal_js_1 = require("./commit-journal.js");
18
+ const tree_fs_js_1 = require("./tree-fs.js");
19
+ const DEFAULT_RESUME_TTL = 7 * 24 * 60 * 60 * 1000;
20
+ exports.DEFAULT_RESUME_TTL = DEFAULT_RESUME_TTL;
21
+ const DEFAULT_CLEANUP_INTERVAL = 15 * 60 * 1000;
22
+ exports.DEFAULT_CLEANUP_INTERVAL = DEFAULT_CLEANUP_INTERVAL;
23
+ const MAX_CLEANUP_INTERVAL = 0x7fffffff;
24
+ exports.MAX_CLEANUP_INTERVAL = MAX_CLEANUP_INTERVAL;
25
+ function unrefTimer(timer) {
26
+ if (typeof timer !== 'object' || timer === null || !('unref' in timer))
27
+ return;
28
+ if (typeof timer.unref === 'function')
29
+ timer.unref();
30
+ }
31
+ function errorMessage(error) {
32
+ return error instanceof Error ? error.message : String(error);
33
+ }
34
+ function storageError(message, cause = null) {
35
+ return new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.PROTOCOL_INVALID, message, cause);
36
+ }
37
+ function cleanupError(message, cause = null) {
38
+ return new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.CLEANUP_FAILED, message, cause);
39
+ }
40
+ function assertPositiveSafeUint(value, name) {
41
+ (0, validation_js_1.assertSafeUint)(value, name);
42
+ if (value === 0)
43
+ throw storageError(`Invalid ${name}`);
44
+ }
45
+ function report(logger, level, message, details) {
46
+ if (!logger || typeof logger[level] !== 'function')
47
+ return;
48
+ try {
49
+ logger[level]?.(message, details);
50
+ }
51
+ catch { }
52
+ }
53
+ function compareRecords(left, right) {
54
+ if (left.committedAt !== right.committedAt)
55
+ return left.committedAt - right.committedAt;
56
+ return left.name < right.name ? -1 : left.name > right.name ? 1 : 0;
57
+ }
58
+ function bySeries(records) {
59
+ const groups = new Map();
60
+ for (const record of records) {
61
+ if (!record.release)
62
+ continue;
63
+ const group = groups.get(record.release.series);
64
+ if (group)
65
+ group.push(record);
66
+ else
67
+ groups.set(record.release.series, [record]);
68
+ }
69
+ return groups;
70
+ }
71
+ /** Transfer IDs of the newest `maxCount` released records in every series. */
72
+ function countKeepSet(records, maxCount) {
73
+ const keep = new Set();
74
+ for (const group of bySeries(records).values()) {
75
+ for (const record of group.sort(commit_journal_js_1.compareCommitOrder).slice(0, maxCount)) {
76
+ keep.add(record.transferId);
77
+ }
78
+ }
79
+ return keep;
80
+ }
81
+ /** Transfer IDs of every versioned record in each series' newest `maxVersions` groups. */
82
+ function versionKeepSet(records, maxVersions, granularity) {
83
+ const keep = new Set();
84
+ for (const group of bySeries(records).values()) {
85
+ const versioned = group.filter((record) => record.release?.version !== undefined);
86
+ versioned.sort((left, right) => {
87
+ const order = (0, release_js_1.compareReleaseVersions)(right.release.version, left.release.version);
88
+ return order !== 0 ? order : (0, commit_journal_js_1.compareCommitOrder)(left, right);
89
+ });
90
+ const groups = new Set();
91
+ for (const record of versioned) {
92
+ const key = (0, release_js_1.releaseVersionGroup)(record.release.version, granularity);
93
+ if (!groups.has(key) && groups.size >= maxVersions)
94
+ continue;
95
+ groups.add(key);
96
+ keep.add(record.transferId);
97
+ }
98
+ }
99
+ return keep;
100
+ }
101
+ function identityMatches(left, right) {
102
+ return left.dev === right.dev && left.ino === right.ino;
103
+ }
104
+ async function readExactly(handle, bytes, position) {
105
+ let offset = 0;
106
+ while (offset < bytes.byteLength) {
107
+ const read = await handle.read(bytes, offset, bytes.byteLength - offset, position + offset);
108
+ const count = typeof read === 'number' ? read : read.bytesRead;
109
+ if (!Number.isSafeInteger(count) || count <= 0)
110
+ return false;
111
+ offset += count;
112
+ }
113
+ return true;
114
+ }
115
+ function inspectManagedFinal(record, { layout, storage, hash }) {
116
+ const finalPath = _path_1.default.join(layout.root, record.name);
117
+ return (0, layout_js_1.withSafeDirectoryIdentity)(layout.root, storage, async () => {
118
+ let initial;
119
+ try {
120
+ initial = await storage.lstat(finalPath);
121
+ }
122
+ catch (err) {
123
+ if ((0, error_code_js_1.isMissing)(err))
124
+ return 'MISSING';
125
+ throw err;
126
+ }
127
+ if (initial.isSymbolicLink())
128
+ return 'SYMLINK';
129
+ if ((0, commit_journal_js_1.commitRecordKind)(record) === 'directory') {
130
+ if (initial.isSymbolicLink() || !initial.isDirectory())
131
+ return 'NON_REGULAR';
132
+ if (!hash)
133
+ return 'VALID';
134
+ let digested;
135
+ try {
136
+ digested = await (0, tree_fs_js_1.digestTree)(finalPath, storage);
137
+ }
138
+ catch {
139
+ return 'DIGEST_INVALID';
140
+ }
141
+ if (digested.entryCount !== record.entryCount || digested.payloadBytes !== record.size) {
142
+ return 'WRONG_SIZE';
143
+ }
144
+ return (0, hash_js_1.digestMatches)(digested.treeSha256, b4a_1.default.from(record.sha256, 'hex'))
145
+ ? 'VALID'
146
+ : 'DIGEST_INVALID';
147
+ }
148
+ if (!initial.isFile())
149
+ return 'NON_REGULAR';
150
+ if (initial.size !== record.size)
151
+ return 'WRONG_SIZE';
152
+ if (!hash)
153
+ return 'VALID';
154
+ const digest = new hash_js_1.SodiumSha256();
155
+ let handle = null;
156
+ try {
157
+ handle = await (0, layout_js_1.openSafeRegularFile)(finalPath, 'read', storage);
158
+ const before = await handle.stat();
159
+ if (!before.isFile() || before.size !== record.size || !identityMatches(initial, before)) {
160
+ return 'CHANGED';
161
+ }
162
+ let position = 0;
163
+ while (position < record.size) {
164
+ const bytes = b4a_1.default.alloc(Math.min(64 * 1024, record.size - position));
165
+ if (!(await readExactly(handle, bytes, position)))
166
+ return 'TRUNCATED';
167
+ digest.update(bytes);
168
+ position += bytes.byteLength;
169
+ }
170
+ const after = await handle.stat();
171
+ if (!after.isFile() || after.size !== record.size || !identityMatches(before, after)) {
172
+ return 'CHANGED';
173
+ }
174
+ if (!(0, hash_js_1.digestMatches)(digest.digest(), b4a_1.default.from(record.sha256, 'hex')))
175
+ return 'DIGEST_INVALID';
176
+ let visible;
177
+ try {
178
+ visible = await storage.lstat(finalPath);
179
+ }
180
+ catch (err) {
181
+ if ((0, error_code_js_1.isMissing)(err))
182
+ return 'CHANGED';
183
+ throw err;
184
+ }
185
+ if (!visible.isFile() || visible.size !== record.size || !identityMatches(initial, visible)) {
186
+ return 'CHANGED';
187
+ }
188
+ return 'VALID';
189
+ }
190
+ finally {
191
+ if (handle)
192
+ await handle.close();
193
+ }
194
+ });
195
+ }
196
+ class RetentionManager {
197
+ layout;
198
+ sessionStore;
199
+ commitStore;
200
+ maxAge;
201
+ maxCount;
202
+ maxVersions;
203
+ versionGranularity;
204
+ maxStorageBytes;
205
+ resumeTtl;
206
+ cleanupInterval;
207
+ clock;
208
+ storage;
209
+ isSessionActive;
210
+ hasActiveUploads;
211
+ isPinned;
212
+ reconcileLinks;
213
+ linkPinsFallback;
214
+ managedLinkNames;
215
+ logger;
216
+ timer;
217
+ cleanupFailure;
218
+ scheduler;
219
+ onEvent;
220
+ startPromise;
221
+ tickPromise;
222
+ tickQueued;
223
+ lifecycle;
224
+ constructor({ layout, sessionStore, commitStore, maxAge, maxCount, maxVersions, versionGranularity, maxStorageBytes, resumeTtl = DEFAULT_RESUME_TTL, cleanupInterval = DEFAULT_CLEANUP_INTERVAL, clock = Date, storage = commitStore?.storage || _fs_1.default.promises, isSessionActive, hasActiveUploads = () => false, isPinned = () => false, reconcileLinks, linkPinsFallback, managedLinkNames, logger = null, scheduler = { setInterval, clearInterval }, onEvent = null }) {
225
+ if (!layout || typeof layout !== 'object')
226
+ throw storageError('Invalid storage layout');
227
+ if (!sessionStore || typeof sessionStore.expire !== 'function') {
228
+ throw storageError('Invalid session store');
229
+ }
230
+ if (!commitStore ||
231
+ typeof commitStore.list !== 'function' ||
232
+ typeof commitStore.scrubRecords !== 'function' ||
233
+ typeof commitStore.delete !== 'function' ||
234
+ typeof commitStore.purge !== 'function') {
235
+ throw storageError('Invalid commit store');
236
+ }
237
+ if (!clock || typeof clock.now !== 'function')
238
+ throw storageError('Invalid clock');
239
+ if (!storage || typeof storage !== 'object')
240
+ throw storageError('Invalid storage adapter');
241
+ if (!scheduler ||
242
+ typeof scheduler.setInterval !== 'function' ||
243
+ typeof scheduler.clearInterval !== 'function') {
244
+ throw storageError('Invalid retention scheduler');
245
+ }
246
+ if (typeof isSessionActive !== 'function') {
247
+ throw storageError('Invalid session activity predicate');
248
+ }
249
+ if (typeof hasActiveUploads !== 'function') {
250
+ throw storageError('Invalid active upload predicate');
251
+ }
252
+ if (typeof isPinned !== 'function')
253
+ throw storageError('Invalid retention pin predicate');
254
+ if (reconcileLinks !== undefined && typeof reconcileLinks !== 'function') {
255
+ throw storageError('Invalid link reconciliation callback');
256
+ }
257
+ if (linkPinsFallback !== undefined && typeof linkPinsFallback !== 'function') {
258
+ throw storageError('Invalid link pin fallback callback');
259
+ }
260
+ if (managedLinkNames !== undefined && typeof managedLinkNames !== 'function') {
261
+ throw storageError('Invalid managed link name callback');
262
+ }
263
+ if (onEvent !== null && typeof onEvent !== 'function') {
264
+ throw storageError('Invalid retention event callback');
265
+ }
266
+ if (maxAge !== undefined)
267
+ (0, validation_js_1.assertSafeUint)(maxAge, 'maxAge');
268
+ if (maxStorageBytes !== undefined)
269
+ (0, validation_js_1.assertSafeUint)(maxStorageBytes, 'maxStorageBytes');
270
+ if (maxCount !== undefined)
271
+ assertPositiveSafeUint(maxCount, 'maxCount');
272
+ if (maxVersions !== undefined)
273
+ assertPositiveSafeUint(maxVersions, 'maxVersions');
274
+ if (maxVersions === undefined) {
275
+ if (versionGranularity !== undefined)
276
+ throw storageError('Invalid versionGranularity');
277
+ }
278
+ else if (versionGranularity !== 'major' && versionGranularity !== 'minor') {
279
+ throw storageError('Invalid versionGranularity');
280
+ }
281
+ assertPositiveSafeUint(resumeTtl, 'resumeTtl');
282
+ assertPositiveSafeUint(cleanupInterval, 'cleanupInterval');
283
+ if (cleanupInterval > MAX_CLEANUP_INTERVAL)
284
+ throw storageError('Invalid cleanupInterval');
285
+ this.layout = layout;
286
+ this.sessionStore = sessionStore;
287
+ this.commitStore = commitStore;
288
+ this.maxAge = maxAge;
289
+ this.maxCount = maxCount;
290
+ this.maxVersions = maxVersions;
291
+ this.versionGranularity = versionGranularity;
292
+ this.maxStorageBytes = maxStorageBytes;
293
+ this.resumeTtl = resumeTtl;
294
+ this.cleanupInterval = cleanupInterval;
295
+ this.clock = clock;
296
+ this.storage = storage;
297
+ this.isSessionActive = isSessionActive;
298
+ this.hasActiveUploads = hasActiveUploads;
299
+ this.isPinned = isPinned;
300
+ this.reconcileLinks = reconcileLinks;
301
+ this.linkPinsFallback = linkPinsFallback;
302
+ this.managedLinkNames = managedLinkNames;
303
+ this.logger = logger;
304
+ this.timer = null;
305
+ this.cleanupFailure = null;
306
+ this.scheduler = scheduler;
307
+ this.onEvent = onEvent;
308
+ this.startPromise = null;
309
+ this.tickPromise = null;
310
+ this.tickQueued = false;
311
+ this.lifecycle = 0;
312
+ }
313
+ _emit(payload) {
314
+ if (!this.onEvent)
315
+ return;
316
+ try {
317
+ this.onEvent({ type: 'retention', ...payload });
318
+ }
319
+ catch { }
320
+ }
321
+ _hasActiveReceivingUpload() {
322
+ if (this.hasActiveUploads())
323
+ return true;
324
+ if (!(this.sessionStore.sessions instanceof Map))
325
+ return false;
326
+ for (const session of this.sessionStore.sessions.values()) {
327
+ if (session.state === 'receiving' && this.isSessionActive(session))
328
+ return true;
329
+ }
330
+ return false;
331
+ }
332
+ expireSessions() {
333
+ return this.sessionStore.expire(this.resumeTtl, (session) => !this.isSessionActive(session));
334
+ }
335
+ async scrubCommitted({ hash = true } = {}) {
336
+ if (typeof hash !== 'boolean')
337
+ throw storageError('Invalid scrub hash option');
338
+ for (const directory of [this.layout.root, this.layout.internal, this.layout.commits]) {
339
+ await (0, layout_js_1.assertSafeDirectory)(directory, this.storage);
340
+ }
341
+ let scanned;
342
+ try {
343
+ scanned = await this.commitStore.scrubRecords();
344
+ }
345
+ catch (err) {
346
+ throw cleanupError('Unable to scrub managed commit metadata', err);
347
+ }
348
+ const records = scanned.records;
349
+ const knownNames = new Set(records.map((record) => record.name));
350
+ const rootNames = await (0, layout_js_1.withSafeDirectoryIdentity)(this.layout.root, this.storage, () => this.storage.readdir(this.layout.root));
351
+ const linkNames = this.managedLinkNames ? this.managedLinkNames() : new Set();
352
+ const unknown = rootNames
353
+ .filter((name) => name !== '.swarm-deploy' && !knownNames.has(name) && !linkNames.has(name))
354
+ .sort();
355
+ for (const name of unknown) {
356
+ report(this.logger, 'warn', 'Ignoring unknown committed path', { name });
357
+ }
358
+ const valid = [];
359
+ let deleted = scanned.deleted;
360
+ for (const record of records) {
361
+ const status = await inspectManagedFinal(record, {
362
+ layout: this.layout,
363
+ storage: this.storage,
364
+ hash
365
+ });
366
+ if (status === 'VALID') {
367
+ valid.push(record);
368
+ continue;
369
+ }
370
+ let purged;
371
+ try {
372
+ purged = await this.commitStore.purge(record, {
373
+ preservePath: status === 'CHANGED' || (0, commit_journal_js_1.commitRecordKind)(record) === 'directory'
374
+ });
375
+ if (!purged) {
376
+ throw storageError('Managed commit record disappeared during scrub');
377
+ }
378
+ }
379
+ catch (err) {
380
+ throw cleanupError('Unable to remove invalid managed commit', err);
381
+ }
382
+ deleted++;
383
+ if (purged.preservedPath) {
384
+ unknown.push(record.name);
385
+ report(this.logger, 'warn', 'Preserving non-empty managed directory', {
386
+ name: record.name
387
+ });
388
+ }
389
+ report(this.logger, 'warn', 'Removed invalid managed commit', {
390
+ name: record.name,
391
+ reason: status
392
+ });
393
+ }
394
+ return { records: valid, deleted, unknown: unknown.sort() };
395
+ }
396
+ async _deleteRecord(record, reason) {
397
+ try {
398
+ if (!(await this.commitStore.delete(record))) {
399
+ throw storageError('Managed commit record disappeared during retention');
400
+ }
401
+ }
402
+ catch (err) {
403
+ throw cleanupError('Unable to remove managed commit', err);
404
+ }
405
+ report(this.logger, 'info', 'Removed managed commit', { name: record.name, reason });
406
+ }
407
+ /**
408
+ * Configured mutable current records survive age and quota eviction. Their
409
+ * size still counts toward the logical total so a replacement that cannot be
410
+ * afforded fails instead of silently exceeding the limit.
411
+ */
412
+ _isPinned(record) {
413
+ return this.isPinned(record) === true;
414
+ }
415
+ _totalSize(records) {
416
+ let total = 0;
417
+ for (const record of records) {
418
+ if (total > Number.MAX_SAFE_INTEGER - record.size) {
419
+ throw storageError('Managed commit size exceeds safe integer range');
420
+ }
421
+ total += record.size;
422
+ }
423
+ return total;
424
+ }
425
+ run(options = {}) {
426
+ return (0, root_coordinator_js_1.withRootLease)(this.layout.root, () => this._runUnlocked(options));
427
+ }
428
+ async _runUnlocked(options = {}) {
429
+ const trigger = options.trigger || 'manual';
430
+ try {
431
+ const result = await this._run(options);
432
+ if (!this.cleanupFailure)
433
+ this.cleanupFailure = null;
434
+ this._emit({ trigger, status: 'completed', ...result });
435
+ return result;
436
+ }
437
+ catch (err) {
438
+ this.cleanupFailure = err;
439
+ this._emit({ trigger, status: 'failed', reason: (0, error_code_js_1.errorCode)(err) || errors_js_1.ERRORS.CLEANUP_FAILED });
440
+ throw err;
441
+ }
442
+ }
443
+ async _run({ incomingBytes = 0, trigger = 'manual' } = {}) {
444
+ (0, validation_js_1.assertSafeUint)(incomingBytes, 'incomingBytes');
445
+ if (this.maxStorageBytes !== undefined && incomingBytes > this.maxStorageBytes) {
446
+ throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.FILE_TOO_LARGE, 'Incoming artifact exceeds committed storage limit');
447
+ }
448
+ const expiredSessions = await this.expireSessions();
449
+ const scrub = await this.scrubCommitted({ hash: false });
450
+ const current = scrub.records.slice();
451
+ let linkPinned = new Set();
452
+ let linkReconcileError = null;
453
+ if (this.reconcileLinks) {
454
+ try {
455
+ linkPinned = new Set(await this.reconcileLinks(current.slice()));
456
+ }
457
+ catch (err) {
458
+ linkReconcileError = err;
459
+ if (this.linkPinsFallback) {
460
+ linkPinned = new Set(await this.linkPinsFallback(current.slice()));
461
+ }
462
+ report(this.logger, 'warn', 'Managed link reconciliation failed during retention', {
463
+ reason: errorMessage(err)
464
+ });
465
+ }
466
+ }
467
+ const pinned = (record) => this._isPinned(record) || linkPinned.has(record.transferId);
468
+ let ageDeleted = 0;
469
+ if (this.maxAge !== undefined) {
470
+ const now = this.clock.now();
471
+ (0, validation_js_1.assertSafeUint)(now, 'current timestamp');
472
+ for (const record of current.slice().sort(compareRecords)) {
473
+ if (pinned(record))
474
+ continue;
475
+ if (now < record.committedAt || now - record.committedAt < this.maxAge)
476
+ continue;
477
+ await this._deleteRecord(record, 'MAX_AGE');
478
+ current.splice(current.indexOf(record), 1);
479
+ ageDeleted++;
480
+ }
481
+ }
482
+ let countDeleted = 0;
483
+ if (this.maxCount !== undefined) {
484
+ const keep = countKeepSet(current, this.maxCount);
485
+ for (const record of current.slice().sort(compareRecords)) {
486
+ if (!record.release || keep.has(record.transferId) || pinned(record))
487
+ continue;
488
+ await this._deleteRecord(record, 'MAX_COUNT');
489
+ current.splice(current.indexOf(record), 1);
490
+ countDeleted++;
491
+ }
492
+ }
493
+ let versionDeleted = 0;
494
+ if (this.maxVersions !== undefined && this.versionGranularity !== undefined) {
495
+ const keep = versionKeepSet(current, this.maxVersions, this.versionGranularity);
496
+ for (const record of current.slice().sort(compareRecords)) {
497
+ if (record.release?.version === undefined)
498
+ continue;
499
+ if (keep.has(record.transferId) || pinned(record))
500
+ continue;
501
+ await this._deleteRecord(record, 'MAX_VERSIONS');
502
+ current.splice(current.indexOf(record), 1);
503
+ versionDeleted++;
504
+ }
505
+ }
506
+ let storageDeleted = 0;
507
+ if (this.maxStorageBytes !== undefined) {
508
+ const permitted = this.maxStorageBytes - incomingBytes;
509
+ let total = this._totalSize(current);
510
+ for (const record of current.slice().sort(compareRecords)) {
511
+ if (total <= permitted)
512
+ break;
513
+ if (pinned(record))
514
+ continue;
515
+ await this._deleteRecord(record, 'MAX_STORAGE');
516
+ total -= record.size;
517
+ storageDeleted++;
518
+ }
519
+ if (total > permitted)
520
+ throw storageError('Unable to reserve committed storage capacity');
521
+ }
522
+ if (linkReconcileError) {
523
+ this.cleanupFailure = linkReconcileError;
524
+ if (trigger !== 'commit')
525
+ throw linkReconcileError;
526
+ }
527
+ return {
528
+ expiredSessions,
529
+ scrubbed: scrub.deleted,
530
+ ageDeleted,
531
+ countDeleted,
532
+ versionDeleted,
533
+ storageDeleted
534
+ };
535
+ }
536
+ afterCommit() {
537
+ return (0, root_coordinator_js_1.withRootLease)(this.layout.root, () => this._afterCommitUnlocked());
538
+ }
539
+ async _afterCommitUnlocked() {
540
+ try {
541
+ await this._runUnlocked({ trigger: 'post-commit' });
542
+ return true;
543
+ }
544
+ catch (err) {
545
+ this.cleanupFailure = err;
546
+ report(this.logger, 'error', 'Post-commit retention failed', { message: errorMessage(err) });
547
+ return false;
548
+ }
549
+ }
550
+ start() {
551
+ if (this.timer)
552
+ return Promise.resolve();
553
+ if (this.startPromise)
554
+ return this.startPromise;
555
+ const lifecycle = ++this.lifecycle;
556
+ const start = (async () => {
557
+ await this.run({ trigger: 'startup' });
558
+ if (lifecycle !== this.lifecycle || this.timer)
559
+ return;
560
+ this.timer = this.scheduler.setInterval(() => this._scheduleTick(lifecycle), this.cleanupInterval);
561
+ unrefTimer(this.timer);
562
+ })();
563
+ this.startPromise = start;
564
+ start.then(() => {
565
+ if (this.startPromise === start)
566
+ this.startPromise = null;
567
+ }, () => {
568
+ if (this.startPromise === start)
569
+ this.startPromise = null;
570
+ });
571
+ return start;
572
+ }
573
+ _scheduleTick(lifecycle) {
574
+ if (lifecycle !== this.lifecycle || !this.timer)
575
+ return;
576
+ if (this.tickPromise) {
577
+ this.tickQueued = true;
578
+ return;
579
+ }
580
+ const tick = this._drainTicks(lifecycle);
581
+ this.tickPromise = tick;
582
+ tick.then(() => {
583
+ if (this.tickPromise === tick)
584
+ this.tickPromise = null;
585
+ }, () => {
586
+ if (this.tickPromise === tick)
587
+ this.tickPromise = null;
588
+ });
589
+ }
590
+ async _drainTicks(lifecycle) {
591
+ do {
592
+ this.tickQueued = false;
593
+ if (this._hasActiveReceivingUpload()) {
594
+ this._emit({ trigger: 'scheduled', status: 'deferred', reason: 'ACTIVE_RECEIVE' });
595
+ return;
596
+ }
597
+ try {
598
+ await this.run({ trigger: 'scheduled' });
599
+ }
600
+ catch (err) {
601
+ this.cleanupFailure = err;
602
+ report(this.logger, 'error', 'Scheduled retention failed', { message: errorMessage(err) });
603
+ }
604
+ } while (this.tickQueued && lifecycle === this.lifecycle && this.timer);
605
+ }
606
+ async stop() {
607
+ this.lifecycle++;
608
+ if (this.timer)
609
+ this.scheduler.clearInterval(this.timer);
610
+ this.timer = null;
611
+ this.tickQueued = false;
612
+ await Promise.allSettled([this.startPromise, this.tickPromise].filter(Boolean));
613
+ }
614
+ close() {
615
+ return this.stop();
616
+ }
617
+ }
618
+ exports.RetentionManager = RetentionManager;
619
+ //# sourceMappingURL=retention.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retention.js","sourceRoot":"","sources":["../../src/storage/retention.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function withRootLease<T>(root: string, operation: () => Promise<T> | T): Promise<T>;
2
+ /**
3
+ * Serializes inspection, admission, replacement, and recovery for one visible
4
+ * name. Distinct names stay concurrent. Callers that also need the root lease
5
+ * must take the name lease first.
6
+ */
7
+ export declare function withNameLease<T>(root: string, name: string, operation: () => Promise<T> | T): Promise<T>;