swarm-deploy 0.1.0 → 0.3.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.
- package/CHANGELOG.md +60 -0
- package/README.md +780 -50
- package/RELEASING.md +2 -2
- package/SECURITY.md +2 -3
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +182 -25
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +32 -27
- package/dist/client.js +103 -54
- package/dist/client.js.map +1 -1
- package/dist/errors.d.ts +6 -0
- package/dist/errors.js +6 -0
- package/dist/errors.js.map +1 -1
- package/dist/files.d.ts +13 -28
- package/dist/files.js +13 -78
- package/dist/files.js.map +1 -1
- package/dist/hooks-module.d.ts +9 -0
- package/dist/hooks-module.js +118 -0
- package/dist/hooks-module.js.map +1 -0
- package/dist/hooks.d.ts +69 -0
- package/dist/hooks.js +88 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +8 -4
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/release.d.ts +26 -0
- package/dist/release.js +419 -0
- package/dist/release.js.map +1 -0
- package/dist/server.d.ts +97 -0
- package/dist/server.js +527 -53
- package/dist/server.js.map +1 -1
- package/dist/storage/commit-journal.d.ts +39 -2
- package/dist/storage/commit-journal.js +140 -2
- package/dist/storage/commit-journal.js.map +1 -1
- package/dist/storage/commit-store.d.ts +69 -8
- package/dist/storage/commit-store.js +374 -22
- package/dist/storage/commit-store.js.map +1 -1
- package/dist/storage/layout.js +7 -1
- package/dist/storage/layout.js.map +1 -1
- package/dist/storage/link-store.d.ts +88 -0
- package/dist/storage/link-store.js +448 -0
- package/dist/storage/link-store.js.map +1 -0
- package/dist/storage/recovery.d.ts +2 -1
- package/dist/storage/recovery.js +8 -1
- package/dist/storage/recovery.js.map +1 -1
- package/dist/storage/retention.d.ts +41 -21
- package/dist/storage/retention.js +162 -8
- package/dist/storage/retention.js.map +1 -1
- package/dist/storage/tar-session-store.d.ts +36 -5
- package/dist/storage/tar-session-store.js +283 -55
- package/dist/storage/tar-session-store.js.map +1 -1
- package/dist/storage/tree-fs.d.ts +44 -0
- package/dist/storage/tree-fs.js +580 -0
- package/dist/storage/tree-fs.js.map +1 -0
- package/dist/storage/tree-staging.d.ts +9 -0
- package/dist/storage/tree-staging.js +64 -0
- package/dist/storage/tree-staging.js.map +1 -0
- package/dist/storage/types.d.ts +15 -0
- package/dist/symlinks.d.ts +44 -0
- package/dist/symlinks.js +153 -0
- package/dist/symlinks.js.map +1 -0
- package/dist/tar-protocol/controls.d.ts +52 -0
- package/dist/tar-protocol/controls.js +160 -2
- package/dist/tar-protocol/controls.js.map +1 -1
- package/dist/tar-protocol/direct-wire.d.ts +8 -3
- package/dist/tar-protocol/direct-wire.js +14 -3
- package/dist/tar-protocol/direct-wire.js.map +1 -1
- package/dist/tar-protocol/manifest.d.ts +13 -1
- package/dist/tar-protocol/manifest.js +26 -1
- package/dist/tar-protocol/manifest.js.map +1 -1
- package/dist/tar-protocol/tree-extract.d.ts +37 -0
- package/dist/tar-protocol/tree-extract.js +240 -0
- package/dist/tar-protocol/tree-extract.js.map +1 -0
- package/dist/tar-protocol/tree-manifest.d.ts +45 -0
- package/dist/tar-protocol/tree-manifest.js +277 -0
- package/dist/tar-protocol/tree-manifest.js.map +1 -0
- package/dist/tar-protocol/tree-path.d.ts +15 -0
- package/dist/tar-protocol/tree-path.js +68 -0
- package/dist/tar-protocol/tree-path.js.map +1 -0
- package/dist/tar-protocol/tree.d.ts +68 -0
- package/dist/tar-protocol/tree.js +269 -0
- package/dist/tar-protocol/tree.js.map +1 -0
- package/dist/tar-protocol/ustar.d.ts +14 -0
- package/dist/tar-protocol/ustar.js +81 -1
- package/dist/tar-protocol/ustar.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/package.json +3 -1
|
@@ -0,0 +1,448 @@
|
|
|
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.LinkStore = 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 sodium_native_1 = __importDefault(require("sodium-native"));
|
|
12
|
+
const errors_js_1 = require("../errors.js");
|
|
13
|
+
const files_js_1 = require("../files.js");
|
|
14
|
+
const hash_js_1 = require("../tar-protocol/hash.js");
|
|
15
|
+
const atomic_file_js_1 = require("./atomic-file.js");
|
|
16
|
+
const layout_js_1 = require("./layout.js");
|
|
17
|
+
const tree_fs_js_1 = require("./tree-fs.js");
|
|
18
|
+
const MAX_LINK_RECORD_BYTES = 4 * 1024;
|
|
19
|
+
const RECORD_FILENAME = /^[0-9a-f]{64}\.json$/;
|
|
20
|
+
const V1_RECORD_KEYS = 'name,target,targetKind,transferId,version';
|
|
21
|
+
const V2_RECORD_KEYS = 'mode,name,target,targetKind,transferId,version';
|
|
22
|
+
function conflict(message) {
|
|
23
|
+
return new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.LINK_CONFLICT, message);
|
|
24
|
+
}
|
|
25
|
+
function failure(message, cause = null) {
|
|
26
|
+
return new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.LINK_FAILED, message, cause);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Maps every failure to a stable link error. The raw error, which may carry an
|
|
30
|
+
* errno or an absolute path, is kept only as the `cause`, never in the message.
|
|
31
|
+
*/
|
|
32
|
+
function asLinkError(error) {
|
|
33
|
+
if (error instanceof errors_js_1.SwarmDeployError &&
|
|
34
|
+
(error.code === errors_js_1.ERRORS.LINK_CONFLICT ||
|
|
35
|
+
error.code === errors_js_1.ERRORS.LINK_FAILED ||
|
|
36
|
+
error.code === errors_js_1.ERRORS.UNSUPPORTED_STORAGE)) {
|
|
37
|
+
return error;
|
|
38
|
+
}
|
|
39
|
+
return failure('Managed link operation failed', error);
|
|
40
|
+
}
|
|
41
|
+
/** A link or target name: one safe basename, never reserved, never the internal directory. */
|
|
42
|
+
function assertSafeName(value, message) {
|
|
43
|
+
if (typeof value !== 'string' ||
|
|
44
|
+
value.includes('/') ||
|
|
45
|
+
value.includes('\\') ||
|
|
46
|
+
value.includes('\u0000') ||
|
|
47
|
+
value === '.' ||
|
|
48
|
+
value === '..' ||
|
|
49
|
+
value === '.swarm-deploy') {
|
|
50
|
+
throw failure(message);
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
(0, files_js_1.validateBasename)(value);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
throw failure(message, error);
|
|
57
|
+
}
|
|
58
|
+
if ((0, files_js_1.isReservedHistoryName)(value))
|
|
59
|
+
throw failure(message);
|
|
60
|
+
return value;
|
|
61
|
+
}
|
|
62
|
+
function assertRecord(value, expectedName) {
|
|
63
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
64
|
+
throw failure('Invalid managed link record');
|
|
65
|
+
}
|
|
66
|
+
const candidate = value;
|
|
67
|
+
const keys = Object.keys(candidate).sort().join(',');
|
|
68
|
+
const v1 = candidate.version === 1 && keys === V1_RECORD_KEYS;
|
|
69
|
+
const v2 = candidate.version === 2 &&
|
|
70
|
+
keys === V2_RECORD_KEYS &&
|
|
71
|
+
(candidate.mode === 'automatic' || candidate.mode === 'manual');
|
|
72
|
+
if ((!v1 && !v2) ||
|
|
73
|
+
candidate.name !== expectedName ||
|
|
74
|
+
(candidate.targetKind !== 'file' && candidate.targetKind !== 'directory') ||
|
|
75
|
+
typeof candidate.transferId !== 'string' ||
|
|
76
|
+
!/^[0-9a-f]{64}$/.test(candidate.transferId)) {
|
|
77
|
+
throw failure('Invalid managed link record');
|
|
78
|
+
}
|
|
79
|
+
const name = assertSafeName(candidate.name, 'Invalid managed link record');
|
|
80
|
+
const target = assertSafeName(candidate.target, 'Invalid managed link record');
|
|
81
|
+
return {
|
|
82
|
+
version: candidate.version,
|
|
83
|
+
mode: v1 ? 'automatic' : candidate.mode,
|
|
84
|
+
name,
|
|
85
|
+
target,
|
|
86
|
+
transferId: candidate.transferId,
|
|
87
|
+
targetKind: candidate.targetKind
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function randomSuffix() {
|
|
91
|
+
const bytes = b4a_1.default.allocUnsafe(16);
|
|
92
|
+
sodium_native_1.default.randombytes_buf(bytes);
|
|
93
|
+
return b4a_1.default.toString(bytes, 'hex');
|
|
94
|
+
}
|
|
95
|
+
async function syncDirectory(directory, storage) {
|
|
96
|
+
const handle = await storage.open(directory, 'r');
|
|
97
|
+
try {
|
|
98
|
+
await handle.sync();
|
|
99
|
+
}
|
|
100
|
+
finally {
|
|
101
|
+
await handle.close();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Owns every server-managed symlink in the storage root.
|
|
106
|
+
*
|
|
107
|
+
* A destination is replaceable only when a valid ownership record exists, the
|
|
108
|
+
* visible destination is a symbolic link, and `readlink()` returns either the
|
|
109
|
+
* recorded target or the desired target. Anything else is unmanaged: it is left
|
|
110
|
+
* untouched and the operation fails closed. A link target is always exactly a
|
|
111
|
+
* sibling basename, and `readlink()` output is only ever compared, never used
|
|
112
|
+
* to build a path.
|
|
113
|
+
*/
|
|
114
|
+
class LinkStore {
|
|
115
|
+
layout;
|
|
116
|
+
storage;
|
|
117
|
+
constructor({ layout, storage = _fs_1.default.promises }) {
|
|
118
|
+
if (!layout || typeof layout !== 'object')
|
|
119
|
+
throw failure('Invalid storage layout');
|
|
120
|
+
(0, tree_fs_js_1.assertSymlinkCapable)(storage);
|
|
121
|
+
this.layout = layout;
|
|
122
|
+
this.storage = storage;
|
|
123
|
+
}
|
|
124
|
+
recordPath(name) {
|
|
125
|
+
return _path_1.default.join(this.layout.links, `${b4a_1.default.toString((0, hash_js_1.sodiumSha256)(b4a_1.default.from(name)), 'hex')}.json`);
|
|
126
|
+
}
|
|
127
|
+
finalPath(name) {
|
|
128
|
+
return _path_1.default.join(this.layout.root, name);
|
|
129
|
+
}
|
|
130
|
+
async read(name) {
|
|
131
|
+
try {
|
|
132
|
+
return await this.readRecord(assertSafeName(name, 'Invalid managed link name'));
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
throw asLinkError(error);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/** Every persisted ownership record, keyed by its proven link name. */
|
|
139
|
+
async list() {
|
|
140
|
+
try {
|
|
141
|
+
return await this.listRecords();
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
throw asLinkError(error);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async readRecord(name) {
|
|
148
|
+
try {
|
|
149
|
+
return assertRecord(await (0, atomic_file_js_1.readJson)(this.recordPath(name), this.storage, MAX_LINK_RECORD_BYTES), name);
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
if ((0, error_code_js_1.isMissing)(error))
|
|
153
|
+
return null;
|
|
154
|
+
if (error instanceof atomic_file_js_1.MetadataFormatError) {
|
|
155
|
+
throw failure('Malformed managed link record', error);
|
|
156
|
+
}
|
|
157
|
+
throw error;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async listRecords() {
|
|
161
|
+
const filenames = await (0, layout_js_1.withSafeDirectoryIdentity)(this.layout.links, this.storage, () => this.storage.readdir(this.layout.links));
|
|
162
|
+
const records = [];
|
|
163
|
+
for (const filename of filenames.sort()) {
|
|
164
|
+
if (!RECORD_FILENAME.test(filename))
|
|
165
|
+
continue;
|
|
166
|
+
let parsed;
|
|
167
|
+
try {
|
|
168
|
+
parsed = await (0, atomic_file_js_1.readJson)(_path_1.default.join(this.layout.links, filename), this.storage, MAX_LINK_RECORD_BYTES);
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
throw failure('Malformed managed link record', error);
|
|
172
|
+
}
|
|
173
|
+
const record = assertRecord(parsed, typeof parsed.name === 'string' ? parsed.name : '');
|
|
174
|
+
if (_path_1.default.basename(this.recordPath(record.name)) !== filename) {
|
|
175
|
+
throw failure('Foreign managed link record');
|
|
176
|
+
}
|
|
177
|
+
records.push(record);
|
|
178
|
+
}
|
|
179
|
+
return records;
|
|
180
|
+
}
|
|
181
|
+
classify(name) {
|
|
182
|
+
const finalPath = this.finalPath(name);
|
|
183
|
+
return (0, layout_js_1.withSafeDirectoryIdentity)(this.layout.root, this.storage, async () => {
|
|
184
|
+
let stat;
|
|
185
|
+
try {
|
|
186
|
+
stat = await this.storage.lstat(finalPath);
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
if ((0, error_code_js_1.isMissing)(error))
|
|
190
|
+
return { state: 'MISSING' };
|
|
191
|
+
throw error;
|
|
192
|
+
}
|
|
193
|
+
if (!stat.isSymbolicLink())
|
|
194
|
+
return { state: 'UNMANAGED' };
|
|
195
|
+
return { state: 'SYMLINK', target: await this.storage.readlink(finalPath) };
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
async writeRecord(link, mode) {
|
|
199
|
+
const record = {
|
|
200
|
+
version: 2,
|
|
201
|
+
mode,
|
|
202
|
+
name: link.name,
|
|
203
|
+
target: link.target,
|
|
204
|
+
transferId: link.transferId,
|
|
205
|
+
targetKind: link.targetKind
|
|
206
|
+
};
|
|
207
|
+
assertRecord(record, link.name);
|
|
208
|
+
await (0, atomic_file_js_1.writeAtomic)(this.recordPath(link.name), b4a_1.default.from(JSON.stringify(record)), this.storage);
|
|
209
|
+
}
|
|
210
|
+
async removeRecord(name) {
|
|
211
|
+
await (0, layout_js_1.withSafeDirectoryIdentity)(this.layout.links, this.storage, async () => {
|
|
212
|
+
try {
|
|
213
|
+
await this.storage.unlink(this.recordPath(name));
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
if (!(0, error_code_js_1.isMissing)(error))
|
|
217
|
+
throw error;
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
await (0, layout_js_1.withSafeDirectoryIdentity)(this.layout.links, this.storage, () => syncDirectory(this.layout.links, this.storage));
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Creates a link where nothing exists. The ownership record is durable first,
|
|
224
|
+
* so a crash after the link appears never leaves an unrecorded link; the
|
|
225
|
+
* link itself is created without overwriting, so a path that appeared since
|
|
226
|
+
* classification is never replaced and its record is withdrawn.
|
|
227
|
+
*/
|
|
228
|
+
async createLink(link, mode) {
|
|
229
|
+
await this.writeRecord(link, mode);
|
|
230
|
+
try {
|
|
231
|
+
await (0, layout_js_1.withSafeDirectoryIdentity)(this.layout.root, this.storage, () => this.storage.symlink(link.target, this.finalPath(link.name)));
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
await this.removeRecord(link.name).catch(() => { });
|
|
235
|
+
if ((0, error_code_js_1.errorCode)(error) === 'EEXIST') {
|
|
236
|
+
throw conflict('Unmanaged path at a configured managed link name');
|
|
237
|
+
}
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
await (0, layout_js_1.withSafeDirectoryIdentity)(this.layout.root, this.storage, () => syncDirectory(this.layout.root, this.storage));
|
|
241
|
+
}
|
|
242
|
+
/** Removes a temporary symlink with `lstat`/`unlink`, never a regular-file helper. */
|
|
243
|
+
async removeTemporary(temporary) {
|
|
244
|
+
await (0, layout_js_1.withSafeDirectoryIdentity)(this.layout.publications, this.storage, async () => {
|
|
245
|
+
try {
|
|
246
|
+
await this.storage.lstat(temporary);
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
if ((0, error_code_js_1.isMissing)(error))
|
|
250
|
+
return;
|
|
251
|
+
throw error;
|
|
252
|
+
}
|
|
253
|
+
await this.storage.unlink(temporary);
|
|
254
|
+
}).catch(() => { });
|
|
255
|
+
}
|
|
256
|
+
/** Atomically swaps an owned link by renaming a private temporary link over it. */
|
|
257
|
+
async replaceLink(link, mode) {
|
|
258
|
+
const temporary = _path_1.default.join(this.layout.publications, `.link-${randomSuffix()}`);
|
|
259
|
+
try {
|
|
260
|
+
await (0, layout_js_1.withSafeDirectoryIdentity)(this.layout.publications, this.storage, () => this.storage.symlink(link.target, temporary));
|
|
261
|
+
await (0, layout_js_1.withSafeDirectoryIdentity)(this.layout.publications, this.storage, () => syncDirectory(this.layout.publications, this.storage));
|
|
262
|
+
await (0, layout_js_1.withSafeDirectoryIdentity)(this.layout.root, this.storage, () => (0, layout_js_1.withSafeDirectoryIdentity)(this.layout.publications, this.storage, () => this.storage.rename(temporary, this.finalPath(link.name))));
|
|
263
|
+
await (0, layout_js_1.withSafeDirectoryIdentity)(this.layout.root, this.storage, () => syncDirectory(this.layout.root, this.storage));
|
|
264
|
+
await this.writeRecord(link, mode);
|
|
265
|
+
}
|
|
266
|
+
finally {
|
|
267
|
+
await this.removeTemporary(temporary);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
async removeLink(record, desiredTarget) {
|
|
271
|
+
const destination = await this.classify(record.name);
|
|
272
|
+
const allowed = new Set([record.target]);
|
|
273
|
+
if (desiredTarget)
|
|
274
|
+
allowed.add(desiredTarget);
|
|
275
|
+
if (destination.state === 'SYMLINK' && allowed.has(destination.target)) {
|
|
276
|
+
await (0, layout_js_1.withSafeDirectoryIdentity)(this.layout.root, this.storage, () => this.storage.unlink(this.finalPath(record.name)));
|
|
277
|
+
await (0, layout_js_1.withSafeDirectoryIdentity)(this.layout.root, this.storage, () => syncDirectory(this.layout.root, this.storage));
|
|
278
|
+
}
|
|
279
|
+
else if (destination.state !== 'MISSING') {
|
|
280
|
+
throw conflict('Unmanaged path at a removed managed link name');
|
|
281
|
+
}
|
|
282
|
+
await this.removeRecord(record.name);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Converges every desired link and removes the record and visible link of
|
|
286
|
+
* every name no rule owns. Level-triggered: the same input always produces
|
|
287
|
+
* the same output, whatever the previous attempt's crash point.
|
|
288
|
+
*/
|
|
289
|
+
async reconcile(desired, ruleNames, options = {}) {
|
|
290
|
+
try {
|
|
291
|
+
return await this.converge(desired, ruleNames, options);
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
throw asLinkError(error);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Atomically creates, keeps, or repoints one explicitly requested manual
|
|
299
|
+
* link. The caller supplies the current namespace so manual ownership cannot
|
|
300
|
+
* claim artifact or automatic-link destinations.
|
|
301
|
+
*/
|
|
302
|
+
async linkManual(link, options) {
|
|
303
|
+
try {
|
|
304
|
+
return await this.convergeManual(link, options);
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
throw asLinkError(error);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
async sweepTemporaryLinks() {
|
|
311
|
+
const names = await (0, layout_js_1.withSafeDirectoryIdentity)(this.layout.publications, this.storage, () => this.storage.readdir(this.layout.publications));
|
|
312
|
+
for (const name of names) {
|
|
313
|
+
if (!/^\.link-[0-9a-f]{32}$/.test(name))
|
|
314
|
+
continue;
|
|
315
|
+
await this.removeTemporary(_path_1.default.join(this.layout.publications, name));
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
async converge(desired, ruleNames, { managedArtifactNames } = {}) {
|
|
319
|
+
await this.sweepTemporaryLinks();
|
|
320
|
+
const result = { created: [], updated: [], removed: [], unchanged: [] };
|
|
321
|
+
const desiredByName = new Map(desired.map((link) => [link.name, link]));
|
|
322
|
+
for (const record of await this.listRecords()) {
|
|
323
|
+
if (record.mode === 'manual')
|
|
324
|
+
continue;
|
|
325
|
+
if (ruleNames.has(record.name)) {
|
|
326
|
+
if (!desiredByName.has(record.name)) {
|
|
327
|
+
const destination = await this.classify(record.name);
|
|
328
|
+
const desiredTarget = destination.state === 'SYMLINK' && destination.target !== record.target
|
|
329
|
+
? destination.target
|
|
330
|
+
: undefined;
|
|
331
|
+
await this.removeLink(record, desiredTarget);
|
|
332
|
+
result.removed.push(record.name);
|
|
333
|
+
}
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
const destination = await this.classify(record.name);
|
|
337
|
+
let desiredTarget;
|
|
338
|
+
if (destination.state === 'SYMLINK' && destination.target !== record.target) {
|
|
339
|
+
const pending = desiredByName.get(record.name);
|
|
340
|
+
if (pending)
|
|
341
|
+
desiredTarget = pending.target;
|
|
342
|
+
else if (managedArtifactNames?.has(destination.target)) {
|
|
343
|
+
desiredTarget = destination.target;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
await this.removeLink(record, desiredTarget);
|
|
347
|
+
result.removed.push(record.name);
|
|
348
|
+
}
|
|
349
|
+
for (const link of desired) {
|
|
350
|
+
if (!ruleNames.has(link.name))
|
|
351
|
+
throw failure('Desired link is not a configured rule');
|
|
352
|
+
assertSafeName(link.name, 'Invalid managed link name');
|
|
353
|
+
assertSafeName(link.target, 'Invalid managed link target');
|
|
354
|
+
if (link.target === link.name)
|
|
355
|
+
throw failure('Managed link cannot target itself');
|
|
356
|
+
const record = await this.readRecord(link.name);
|
|
357
|
+
const destination = await this.classify(link.name);
|
|
358
|
+
if (record?.mode === 'manual') {
|
|
359
|
+
throw conflict('Manual managed link at a configured automatic link name');
|
|
360
|
+
}
|
|
361
|
+
if (destination.state === 'UNMANAGED') {
|
|
362
|
+
throw conflict('Unmanaged path at a configured managed link name');
|
|
363
|
+
}
|
|
364
|
+
if (destination.state === 'MISSING') {
|
|
365
|
+
await this.createLink(link, 'automatic');
|
|
366
|
+
result.created.push(link.name);
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
if (record === null)
|
|
370
|
+
throw conflict('Unrecorded symlink at a configured managed link name');
|
|
371
|
+
// Ownership proof: a record exists and the visible link is either the
|
|
372
|
+
// recorded target or the desired one (a crash after the visible swap).
|
|
373
|
+
if (destination.target !== record.target && destination.target !== link.target) {
|
|
374
|
+
throw conflict('Managed link does not match its ownership record');
|
|
375
|
+
}
|
|
376
|
+
if (destination.target === link.target) {
|
|
377
|
+
if (record.target === link.target &&
|
|
378
|
+
record.transferId === link.transferId &&
|
|
379
|
+
record.targetKind === link.targetKind) {
|
|
380
|
+
result.unchanged.push(link.name);
|
|
381
|
+
continue;
|
|
382
|
+
}
|
|
383
|
+
await this.writeRecord(link, 'automatic');
|
|
384
|
+
result.updated.push(link.name);
|
|
385
|
+
continue;
|
|
386
|
+
}
|
|
387
|
+
await this.replaceLink(link, 'automatic');
|
|
388
|
+
result.updated.push(link.name);
|
|
389
|
+
}
|
|
390
|
+
return result;
|
|
391
|
+
}
|
|
392
|
+
async convergeManual(link, { managedArtifactNames, automaticLinkNames }) {
|
|
393
|
+
if (!managedArtifactNames ||
|
|
394
|
+
typeof managedArtifactNames.has !== 'function' ||
|
|
395
|
+
!automaticLinkNames ||
|
|
396
|
+
typeof automaticLinkNames.has !== 'function') {
|
|
397
|
+
throw failure('Invalid manual link options');
|
|
398
|
+
}
|
|
399
|
+
assertSafeName(link.name, 'Invalid managed link name');
|
|
400
|
+
assertSafeName(link.target, 'Invalid managed link target');
|
|
401
|
+
if (link.target === link.name)
|
|
402
|
+
throw failure('Managed link cannot target itself');
|
|
403
|
+
if ((link.targetKind !== 'file' && link.targetKind !== 'directory') ||
|
|
404
|
+
!/^[0-9a-f]{64}$/.test(link.transferId)) {
|
|
405
|
+
throw failure('Invalid manual managed link');
|
|
406
|
+
}
|
|
407
|
+
if (!managedArtifactNames.has(link.target)) {
|
|
408
|
+
throw conflict('Manual managed link target is not a current artifact');
|
|
409
|
+
}
|
|
410
|
+
if (managedArtifactNames.has(link.name) || automaticLinkNames.has(link.name)) {
|
|
411
|
+
throw conflict('Manual managed link name is reserved');
|
|
412
|
+
}
|
|
413
|
+
await this.sweepTemporaryLinks();
|
|
414
|
+
const record = await this.readRecord(link.name);
|
|
415
|
+
if (record !== null && record.mode !== 'manual') {
|
|
416
|
+
throw conflict('Automatic managed link at a requested manual link name');
|
|
417
|
+
}
|
|
418
|
+
const destination = await this.classify(link.name);
|
|
419
|
+
if (destination.state === 'UNMANAGED') {
|
|
420
|
+
throw conflict('Unmanaged path at a requested manual link name');
|
|
421
|
+
}
|
|
422
|
+
if (destination.state === 'MISSING') {
|
|
423
|
+
await this.createLink(link, 'manual');
|
|
424
|
+
return { status: 'LINKED' };
|
|
425
|
+
}
|
|
426
|
+
if (record === null) {
|
|
427
|
+
throw conflict('Unrecorded symlink at a requested manual link name');
|
|
428
|
+
}
|
|
429
|
+
if (destination.target !== record.target && destination.target !== link.target) {
|
|
430
|
+
throw conflict('Managed link does not match its ownership record');
|
|
431
|
+
}
|
|
432
|
+
if (destination.target === link.target) {
|
|
433
|
+
if (record.target === link.target) {
|
|
434
|
+
if (record.transferId === link.transferId && record.targetKind === link.targetKind) {
|
|
435
|
+
return { status: 'UNCHANGED' };
|
|
436
|
+
}
|
|
437
|
+
await this.writeRecord(link, 'manual');
|
|
438
|
+
return { status: 'UNCHANGED' };
|
|
439
|
+
}
|
|
440
|
+
await this.writeRecord(link, 'manual');
|
|
441
|
+
return { status: 'LINKED' };
|
|
442
|
+
}
|
|
443
|
+
await this.replaceLink(link, 'manual');
|
|
444
|
+
return { status: 'LINKED' };
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
exports.LinkStore = LinkStore;
|
|
448
|
+
//# sourceMappingURL=link-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-store.js","sourceRoot":"","sources":["../../src/storage/link-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,6 +50,7 @@ interface CommitStore {
|
|
|
50
50
|
purged: true;
|
|
51
51
|
preservedPath: boolean;
|
|
52
52
|
}>;
|
|
53
|
+
sweepTrash(): Promise<number>;
|
|
53
54
|
}
|
|
54
55
|
type RecoveryEvent = {
|
|
55
56
|
type: 'recovery';
|
|
@@ -70,7 +71,7 @@ type RecoveryEvent = {
|
|
|
70
71
|
type: 'cleanup';
|
|
71
72
|
transfer: string;
|
|
72
73
|
name: null;
|
|
73
|
-
reason: 'corrupt-journal';
|
|
74
|
+
reason: 'corrupt-journal' | 'trash-residue';
|
|
74
75
|
} | {
|
|
75
76
|
type: 'scrub';
|
|
76
77
|
status: 'started';
|
package/dist/storage/recovery.js
CHANGED
|
@@ -55,7 +55,9 @@ async function assertRecoveryLayout(layout, storage) {
|
|
|
55
55
|
layout.staging,
|
|
56
56
|
layout.sessions,
|
|
57
57
|
layout.commits,
|
|
58
|
-
layout.journals
|
|
58
|
+
layout.journals,
|
|
59
|
+
layout.links,
|
|
60
|
+
layout.trash
|
|
59
61
|
]) {
|
|
60
62
|
await (0, layout_js_1.assertSafeDirectory)(directory, storage);
|
|
61
63
|
}
|
|
@@ -222,6 +224,11 @@ async function recoverStorage({ layout, sessionStore, commitStore, logger = null
|
|
|
222
224
|
await sessionStore.delete(b4a_1.default.from(id, 'hex'));
|
|
223
225
|
}
|
|
224
226
|
}
|
|
227
|
+
const sweptTrash = await commitStore.sweepTrash();
|
|
228
|
+
if (sweptTrash > 0) {
|
|
229
|
+
report(logger, 'warn', 'Swept managed directory trash residue', { trees: sweptTrash });
|
|
230
|
+
emit(onEvent, { type: 'cleanup', transfer: 'trash', name: null, reason: 'trash-residue' });
|
|
231
|
+
}
|
|
225
232
|
const retention = new retention_js_1.RetentionManager({
|
|
226
233
|
layout,
|
|
227
234
|
sessionStore,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../src/storage/recovery.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../src/storage/recovery.ts"],"names":[],"mappings":"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"}
|