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.
- package/CHANGELOG.md +76 -0
- package/LICENSE.md +201 -0
- package/NOTICE.md +13 -0
- package/README.md +1283 -0
- package/RELEASING.md +71 -0
- package/SECURITY.md +40 -0
- package/dist/abort.d.ts +16 -0
- package/dist/abort.js +52 -0
- package/dist/abort.js.map +1 -0
- package/dist/allowlist.d.ts +2 -0
- package/dist/allowlist.js +21 -0
- package/dist/allowlist.js.map +1 -0
- package/dist/bin/swarm-deploy.d.ts +2 -0
- package/dist/bin/swarm-deploy.js +41 -0
- package/dist/bin/swarm-deploy.js.map +1 -0
- package/dist/cli.d.ts +27 -0
- package/dist/cli.js +751 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +111 -0
- package/dist/client.js +276 -0
- package/dist/client.js.map +1 -0
- package/dist/direct-dht.d.ts +81 -0
- package/dist/direct-dht.js +254 -0
- package/dist/direct-dht.js.map +1 -0
- package/dist/error-code.d.ts +15 -0
- package/dist/error-code.js +30 -0
- package/dist/error-code.js.map +1 -0
- package/dist/errors.d.ts +31 -0
- package/dist/errors.js +37 -0
- package/dist/errors.js.map +1 -0
- package/dist/events-node.d.ts +2 -0
- package/dist/events-node.js +7 -0
- package/dist/events-node.js.map +1 -0
- package/dist/files.d.ts +32 -0
- package/dist/files.js +85 -0
- package/dist/files.js.map +1 -0
- package/dist/fs-node.d.ts +2 -0
- package/dist/fs-node.js +7 -0
- package/dist/fs-node.js.map +1 -0
- 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/identity.d.ts +7 -0
- package/dist/identity.js +50 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/os-node.d.ts +2 -0
- package/dist/os-node.js +7 -0
- package/dist/os-node.js.map +1 -0
- package/dist/path-node.d.ts +2 -0
- package/dist/path-node.js +7 -0
- package/dist/path-node.js.map +1 -0
- package/dist/process-node.d.ts +2 -0
- package/dist/process-node.js +7 -0
- package/dist/process-node.js.map +1 -0
- 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 +239 -0
- package/dist/server.js +928 -0
- package/dist/server.js.map +1 -0
- package/dist/storage/atomic-file.d.ts +15 -0
- package/dist/storage/atomic-file.js +172 -0
- package/dist/storage/atomic-file.js.map +1 -0
- package/dist/storage/commit-journal.d.ts +120 -0
- package/dist/storage/commit-journal.js +417 -0
- package/dist/storage/commit-journal.js.map +1 -0
- package/dist/storage/commit-store.d.ts +307 -0
- package/dist/storage/commit-store.js +1691 -0
- package/dist/storage/commit-store.js.map +1 -0
- package/dist/storage/layout.d.ts +16 -0
- package/dist/storage/layout.js +409 -0
- package/dist/storage/layout.js.map +1 -0
- package/dist/storage/link-store.d.ts +70 -0
- package/dist/storage/link-store.js +363 -0
- package/dist/storage/link-store.js.map +1 -0
- package/dist/storage/recovery.d.ts +100 -0
- package/dist/storage/recovery.js +260 -0
- package/dist/storage/recovery.js.map +1 -0
- package/dist/storage/retention.d.ts +183 -0
- package/dist/storage/retention.js +619 -0
- package/dist/storage/retention.js.map +1 -0
- package/dist/storage/root-coordinator.d.ts +7 -0
- package/dist/storage/root-coordinator.js +27 -0
- package/dist/storage/root-coordinator.js.map +1 -0
- package/dist/storage/session-store.d.ts +2 -0
- package/dist/storage/session-store.js +7 -0
- package/dist/storage/session-store.js.map +1 -0
- package/dist/storage/tar-session-store.d.ts +147 -0
- package/dist/storage/tar-session-store.js +1044 -0
- package/dist/storage/tar-session-store.js.map +1 -0
- 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 +77 -0
- package/dist/storage/types.js +3 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/symlinks.d.ts +36 -0
- package/dist/symlinks.js +128 -0
- package/dist/symlinks.js.map +1 -0
- package/dist/tar-protocol/controls.d.ts +73 -0
- package/dist/tar-protocol/controls.js +291 -0
- package/dist/tar-protocol/controls.js.map +1 -0
- package/dist/tar-protocol/direct-wire.d.ts +43 -0
- package/dist/tar-protocol/direct-wire.js +194 -0
- package/dist/tar-protocol/direct-wire.js.map +1 -0
- package/dist/tar-protocol/extract.d.ts +18 -0
- package/dist/tar-protocol/extract.js +124 -0
- package/dist/tar-protocol/extract.js.map +1 -0
- package/dist/tar-protocol/hash.d.ts +10 -0
- package/dist/tar-protocol/hash.js +44 -0
- package/dist/tar-protocol/hash.js.map +1 -0
- package/dist/tar-protocol/lifecycle.d.ts +13 -0
- package/dist/tar-protocol/lifecycle.js +90 -0
- package/dist/tar-protocol/lifecycle.js.map +1 -0
- package/dist/tar-protocol/manifest.d.ts +58 -0
- package/dist/tar-protocol/manifest.js +312 -0
- package/dist/tar-protocol/manifest.js.map +1 -0
- 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 +36 -0
- package/dist/tar-protocol/ustar.js +167 -0
- package/dist/tar-protocol/ustar.js.map +1 -0
- package/dist/types.d.ts +61 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +4 -0
- package/dist/validation.js +26 -0
- package/dist/validation.js.map +1 -0
- package/package.json +103 -1
|
@@ -0,0 +1,269 @@
|
|
|
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.TREE_DIGEST_DOMAIN = exports.tarEntryName = exports.MAX_TREE_NAME_BYTES = exports.MAX_TREE_ENTRIES = exports.MAX_TREE_DEPTH = exports.compareTreePaths = exports.assertTreeStoredName = exports.assertTreeEntryPath = void 0;
|
|
7
|
+
exports.assertCanonicalTreeEntries = assertCanonicalTreeEntries;
|
|
8
|
+
exports.hashField = hashField;
|
|
9
|
+
exports.treeDigest = treeDigest;
|
|
10
|
+
exports.classifyTreeEntry = classifyTreeEntry;
|
|
11
|
+
exports.treeDirectoryReadError = treeDirectoryReadError;
|
|
12
|
+
exports.normalizeRevalidateFailure = normalizeRevalidateFailure;
|
|
13
|
+
exports.snapshotTree = snapshotTree;
|
|
14
|
+
exports.assertSameTreeIdentity = assertSameTreeIdentity;
|
|
15
|
+
exports.revalidateTreeSnapshot = revalidateTreeSnapshot;
|
|
16
|
+
const b4a_1 = __importDefault(require("b4a"));
|
|
17
|
+
const _fs_1 = __importDefault(require("#fs"));
|
|
18
|
+
const _path_1 = __importDefault(require("#path"));
|
|
19
|
+
const abort_js_1 = require("../abort.js");
|
|
20
|
+
const errors_js_1 = require("../errors.js");
|
|
21
|
+
const hash_js_1 = require("./hash.js");
|
|
22
|
+
const tree_path_js_1 = require("./tree-path.js");
|
|
23
|
+
const ustar_js_1 = require("./ustar.js");
|
|
24
|
+
var tree_path_js_2 = require("./tree-path.js");
|
|
25
|
+
Object.defineProperty(exports, "assertTreeEntryPath", { enumerable: true, get: function () { return tree_path_js_2.assertTreeEntryPath; } });
|
|
26
|
+
Object.defineProperty(exports, "assertTreeStoredName", { enumerable: true, get: function () { return tree_path_js_2.assertTreeStoredName; } });
|
|
27
|
+
Object.defineProperty(exports, "compareTreePaths", { enumerable: true, get: function () { return tree_path_js_2.compareTreePaths; } });
|
|
28
|
+
Object.defineProperty(exports, "MAX_TREE_DEPTH", { enumerable: true, get: function () { return tree_path_js_2.MAX_TREE_DEPTH; } });
|
|
29
|
+
Object.defineProperty(exports, "MAX_TREE_ENTRIES", { enumerable: true, get: function () { return tree_path_js_2.MAX_TREE_ENTRIES; } });
|
|
30
|
+
Object.defineProperty(exports, "MAX_TREE_NAME_BYTES", { enumerable: true, get: function () { return tree_path_js_2.MAX_TREE_NAME_BYTES; } });
|
|
31
|
+
Object.defineProperty(exports, "tarEntryName", { enumerable: true, get: function () { return tree_path_js_2.tarEntryName; } });
|
|
32
|
+
exports.TREE_DIGEST_DOMAIN = 'swarm-deploy/tree/v1';
|
|
33
|
+
function invalid(message, cause = null) {
|
|
34
|
+
return new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.PROTOCOL_INVALID, message, cause);
|
|
35
|
+
}
|
|
36
|
+
function unsafeName(message) {
|
|
37
|
+
return new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.INVALID_FILENAME, message);
|
|
38
|
+
}
|
|
39
|
+
function fileBusy(message) {
|
|
40
|
+
return new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.FILE_BUSY, message);
|
|
41
|
+
}
|
|
42
|
+
function isTreeFileDigest(value) {
|
|
43
|
+
if (!b4a_1.default.isBuffer(value) || value.byteLength !== 32)
|
|
44
|
+
return false;
|
|
45
|
+
if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value))
|
|
46
|
+
return true;
|
|
47
|
+
return value.constructor.name === 'Buffer';
|
|
48
|
+
}
|
|
49
|
+
const REVALIDATE_BUSY_MESSAGE = 'Tree changed during TAR generation';
|
|
50
|
+
function finishRevalidate(error) {
|
|
51
|
+
if (error instanceof errors_js_1.SwarmDeployError && error.code === errors_js_1.ERRORS.ABORTED)
|
|
52
|
+
throw error;
|
|
53
|
+
throw fileBusy(REVALIDATE_BUSY_MESSAGE);
|
|
54
|
+
}
|
|
55
|
+
function assertCanonicalTreeEntries(entries) {
|
|
56
|
+
if (!Array.isArray(entries))
|
|
57
|
+
throw invalid('Invalid tree entry list');
|
|
58
|
+
if (entries.length > tree_path_js_1.MAX_TREE_ENTRIES)
|
|
59
|
+
throw invalid('Tree has too many entries');
|
|
60
|
+
const directories = new Set();
|
|
61
|
+
const folded = new Set();
|
|
62
|
+
let previous = null;
|
|
63
|
+
for (const entry of entries) {
|
|
64
|
+
if (entry.kind !== 'file' && entry.kind !== 'directory') {
|
|
65
|
+
throw invalid('Invalid tree entry kind');
|
|
66
|
+
}
|
|
67
|
+
if (entry.kind === 'directory' && entry.size !== 0)
|
|
68
|
+
throw invalid('Invalid tree directory size');
|
|
69
|
+
if (typeof entry.size !== 'number' || !Number.isSafeInteger(entry.size) || entry.size < 0) {
|
|
70
|
+
throw invalid('Invalid tree entry size');
|
|
71
|
+
}
|
|
72
|
+
if (entry.kind === 'file' && entry.size > ustar_js_1.MAX_USTAR_FILE_BYTES) {
|
|
73
|
+
throw invalid('Tree file exceeds canonical USTAR capacity');
|
|
74
|
+
}
|
|
75
|
+
(0, tree_path_js_1.assertTreeEntryPath)(entry.path, entry.kind);
|
|
76
|
+
if (previous !== null && (0, tree_path_js_1.compareTreePaths)(previous, entry.path) >= 0) {
|
|
77
|
+
throw invalid('Noncanonical tree entry order');
|
|
78
|
+
}
|
|
79
|
+
const fold = entry.path.toLowerCase();
|
|
80
|
+
if (folded.has(fold))
|
|
81
|
+
throw invalid('Case-folded duplicate tree entry path');
|
|
82
|
+
folded.add(fold);
|
|
83
|
+
const separator = entry.path.lastIndexOf('/');
|
|
84
|
+
if (separator !== -1 && !directories.has(entry.path.slice(0, separator))) {
|
|
85
|
+
throw invalid('Tree entry has no parent directory entry');
|
|
86
|
+
}
|
|
87
|
+
if (entry.kind === 'directory')
|
|
88
|
+
directories.add(entry.path);
|
|
89
|
+
previous = entry.path;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** Length-prefixed, labelled field framing shared by tree digests and tree transfer IDs. */
|
|
93
|
+
function hashField(hash, label, value) {
|
|
94
|
+
const valueBytes = typeof value === 'number' ? b4a_1.default.from(String(value)) : b4a_1.default.from(value);
|
|
95
|
+
hash
|
|
96
|
+
.update(b4a_1.default.from(`${label}\u0000`))
|
|
97
|
+
.update(b4a_1.default.from(`${valueBytes.byteLength}:`))
|
|
98
|
+
.update(valueBytes);
|
|
99
|
+
}
|
|
100
|
+
function treeDigest(entries) {
|
|
101
|
+
assertCanonicalTreeEntries(entries.map((value) => value.entry));
|
|
102
|
+
const hash = new hash_js_1.SodiumSha256();
|
|
103
|
+
hashField(hash, 'domain', exports.TREE_DIGEST_DOMAIN);
|
|
104
|
+
hashField(hash, 'entryCount', entries.length);
|
|
105
|
+
for (const { entry, sha256 } of entries) {
|
|
106
|
+
hashField(hash, 'kind', entry.kind);
|
|
107
|
+
hashField(hash, 'path', entry.path);
|
|
108
|
+
hashField(hash, 'size', entry.size);
|
|
109
|
+
if (entry.kind === 'directory') {
|
|
110
|
+
if (sha256 !== undefined)
|
|
111
|
+
throw invalid('Unexpected tree directory digest');
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (!isTreeFileDigest(sha256))
|
|
115
|
+
throw invalid('Invalid tree file digest');
|
|
116
|
+
hashField(hash, 'sha256', sha256);
|
|
117
|
+
}
|
|
118
|
+
return hash.digest();
|
|
119
|
+
}
|
|
120
|
+
function identityOf(stat) {
|
|
121
|
+
return { dev: stat.dev, ino: stat.ino, size: stat.size, mtimeMs: stat.mtimeMs };
|
|
122
|
+
}
|
|
123
|
+
function classifyTreeEntry(stat) {
|
|
124
|
+
if (stat.isSymbolicLink())
|
|
125
|
+
throw unsafeName('Tree entries cannot be symbolic links');
|
|
126
|
+
if (stat.isDirectory())
|
|
127
|
+
return 'directory';
|
|
128
|
+
if (!stat.isFile())
|
|
129
|
+
throw unsafeName('Tree entries must be regular files or directories');
|
|
130
|
+
if (typeof stat.nlink === 'number' && stat.nlink > 1) {
|
|
131
|
+
throw unsafeName('Tree entries cannot be hard links');
|
|
132
|
+
}
|
|
133
|
+
return 'file';
|
|
134
|
+
}
|
|
135
|
+
function classify(stat) {
|
|
136
|
+
return classifyTreeEntry(stat);
|
|
137
|
+
}
|
|
138
|
+
/** Stable error for unreadable directory listings during snapshot walks. */
|
|
139
|
+
function treeDirectoryReadError() {
|
|
140
|
+
return invalid('Unable to read tree directory');
|
|
141
|
+
}
|
|
142
|
+
/** Maps revalidation failures to FILE_BUSY while preserving ABORTED. */
|
|
143
|
+
function normalizeRevalidateFailure(error) {
|
|
144
|
+
finishRevalidate(error);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Walks `rootPath` recursively and returns the canonical entry list with one
|
|
148
|
+
* snapshotted identity per entry. Any unsafe or non-regular member rejects the
|
|
149
|
+
* whole directory; nothing is ever silently dropped.
|
|
150
|
+
*/
|
|
151
|
+
async function snapshotTree(rootPath, { signal = null } = {}) {
|
|
152
|
+
(0, abort_js_1.throwIfAborted)(signal);
|
|
153
|
+
const rootStat = await _fs_1.default.promises.lstat(rootPath);
|
|
154
|
+
if (classify(rootStat) !== 'directory')
|
|
155
|
+
throw unsafeName('Tree root must be a directory');
|
|
156
|
+
const seen = new Set([`${rootStat.dev}:${rootStat.ino}`]);
|
|
157
|
+
const entries = [];
|
|
158
|
+
let payloadBytes = 0;
|
|
159
|
+
const walk = async (absolute, prefix) => {
|
|
160
|
+
let names;
|
|
161
|
+
try {
|
|
162
|
+
names = await _fs_1.default.promises.readdir(absolute);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
throw treeDirectoryReadError();
|
|
166
|
+
}
|
|
167
|
+
names.sort((left, right) => (0, tree_path_js_1.compareTreePaths)(left, right));
|
|
168
|
+
for (const name of names) {
|
|
169
|
+
(0, abort_js_1.throwIfAborted)(signal);
|
|
170
|
+
const entryPath = prefix === '' ? name : `${prefix}/${name}`;
|
|
171
|
+
const entryAbsolute = _path_1.default.join(absolute, name);
|
|
172
|
+
const stat = await _fs_1.default.promises.lstat(entryAbsolute);
|
|
173
|
+
const kind = classify(stat);
|
|
174
|
+
(0, tree_path_js_1.assertTreeEntryPath)(entryPath, kind);
|
|
175
|
+
if (entries.length >= tree_path_js_1.MAX_TREE_ENTRIES)
|
|
176
|
+
throw invalid('Tree has too many entries');
|
|
177
|
+
if (kind === 'directory') {
|
|
178
|
+
const identity = `${stat.dev}:${stat.ino}`;
|
|
179
|
+
if (seen.has(identity))
|
|
180
|
+
throw unsafeName('Tree contains a filesystem cycle');
|
|
181
|
+
seen.add(identity);
|
|
182
|
+
entries.push({
|
|
183
|
+
kind,
|
|
184
|
+
path: entryPath,
|
|
185
|
+
size: 0,
|
|
186
|
+
absolutePath: entryAbsolute,
|
|
187
|
+
identity: identityOf(stat)
|
|
188
|
+
});
|
|
189
|
+
await walk(entryAbsolute, entryPath);
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (stat.size > ustar_js_1.MAX_USTAR_FILE_BYTES) {
|
|
193
|
+
throw invalid('Tree file exceeds canonical USTAR capacity');
|
|
194
|
+
}
|
|
195
|
+
if (payloadBytes > Number.MAX_SAFE_INTEGER - stat.size) {
|
|
196
|
+
throw invalid('Tree payload exceeds safe integer range');
|
|
197
|
+
}
|
|
198
|
+
payloadBytes += stat.size;
|
|
199
|
+
entries.push({
|
|
200
|
+
kind,
|
|
201
|
+
path: entryPath,
|
|
202
|
+
size: stat.size,
|
|
203
|
+
absolutePath: entryAbsolute,
|
|
204
|
+
identity: identityOf(stat)
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
await walk(rootPath, '');
|
|
209
|
+
entries.sort((left, right) => (0, tree_path_js_1.compareTreePaths)(left.path, right.path));
|
|
210
|
+
assertCanonicalTreeEntries(entries);
|
|
211
|
+
return {
|
|
212
|
+
rootPath,
|
|
213
|
+
root: identityOf(rootStat),
|
|
214
|
+
entries,
|
|
215
|
+
entryCount: entries.length,
|
|
216
|
+
payloadBytes
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
function assertSameTreeIdentity(expected, actual, message) {
|
|
220
|
+
if (actual.dev !== expected.dev ||
|
|
221
|
+
actual.ino !== expected.ino ||
|
|
222
|
+
actual.size !== expected.size ||
|
|
223
|
+
actual.mtimeMs !== expected.mtimeMs) {
|
|
224
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.FILE_BUSY, message);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Reproves every snapshotted identity and re-walks the source tree before a resume
|
|
229
|
+
* regenerates the archive. Any mutation, disappearance, unreadable path, collision,
|
|
230
|
+
* limit breach, or newly unsafe member becomes FILE_BUSY; ABORTED is preserved.
|
|
231
|
+
*/
|
|
232
|
+
async function revalidateTreeSnapshot(snapshot, { signal = null } = {}) {
|
|
233
|
+
(0, abort_js_1.throwIfAborted)(signal);
|
|
234
|
+
try {
|
|
235
|
+
const rootStat = await _fs_1.default.promises.lstat(snapshot.rootPath);
|
|
236
|
+
if (classify(rootStat) !== 'directory')
|
|
237
|
+
throw unsafeName('Tree root must be a directory');
|
|
238
|
+
if (rootStat.dev !== snapshot.root.dev || rootStat.ino !== snapshot.root.ino) {
|
|
239
|
+
throw fileBusy(REVALIDATE_BUSY_MESSAGE);
|
|
240
|
+
}
|
|
241
|
+
for (const entry of snapshot.entries) {
|
|
242
|
+
(0, abort_js_1.throwIfAborted)(signal);
|
|
243
|
+
const stat = await _fs_1.default.promises.lstat(entry.absolutePath);
|
|
244
|
+
const kind = classify(stat);
|
|
245
|
+
if (kind !== entry.kind)
|
|
246
|
+
throw fileBusy(REVALIDATE_BUSY_MESSAGE);
|
|
247
|
+
if (entry.kind === 'directory') {
|
|
248
|
+
if (stat.dev !== entry.identity.dev || stat.ino !== entry.identity.ino) {
|
|
249
|
+
throw fileBusy(REVALIDATE_BUSY_MESSAGE);
|
|
250
|
+
}
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
assertSameTreeIdentity(entry.identity, stat, REVALIDATE_BUSY_MESSAGE);
|
|
254
|
+
}
|
|
255
|
+
const refreshed = await snapshotTree(snapshot.rootPath, { signal });
|
|
256
|
+
if (refreshed.entryCount !== snapshot.entryCount)
|
|
257
|
+
throw fileBusy(REVALIDATE_BUSY_MESSAGE);
|
|
258
|
+
for (let index = 0; index < refreshed.entries.length; index++) {
|
|
259
|
+
if (refreshed.entries[index].path !== snapshot.entries[index].path ||
|
|
260
|
+
refreshed.entries[index].kind !== snapshot.entries[index].kind) {
|
|
261
|
+
throw fileBusy(REVALIDATE_BUSY_MESSAGE);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
finishRevalidate(error);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/tar-protocol/tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export declare const TAR_BLOCK_BYTES = 512;
|
|
2
|
+
export declare const MAX_USTAR_FILE_BYTES = 8589934591;
|
|
3
|
+
/**
|
|
4
|
+
* Every USTAR metadata field is pinned to a constant so that the same content
|
|
5
|
+
* always frames to the same bytes. The transfer ID commits to these values, so
|
|
6
|
+
* changing one changes every transfer ID.
|
|
7
|
+
*/
|
|
8
|
+
export declare const TAR_MODE = 420;
|
|
9
|
+
export declare const TAR_DIRECTORY_MODE = 493;
|
|
10
|
+
export declare const TAR_UID = 0;
|
|
11
|
+
export declare const TAR_GID = 0;
|
|
12
|
+
export declare const TAR_MTIME_MS = 0;
|
|
13
|
+
export declare const TAR_UNAME = "";
|
|
14
|
+
export declare const TAR_GNAME = "";
|
|
15
|
+
export declare function assertUstarFileSize(size: unknown): asserts size is number;
|
|
16
|
+
export declare function deterministicTarSize(fileSize: number): number;
|
|
17
|
+
/**
|
|
18
|
+
* Builds the single canonical USTAR header block for `name`/`fileSize`.
|
|
19
|
+
*
|
|
20
|
+
* Both the send path and receive validator use this exact block. A test also
|
|
21
|
+
* pins it byte-for-byte against tar-stream's portable USTAR representation.
|
|
22
|
+
*/
|
|
23
|
+
export declare function canonicalUstarHeader(name: string, fileSize: number): Buffer;
|
|
24
|
+
/**
|
|
25
|
+
* Builds the canonical USTAR header block for one tree entry.
|
|
26
|
+
*
|
|
27
|
+
* `storedName` is the exact TAR name field: the relative path for a file and
|
|
28
|
+
* the relative path plus `/` for a directory. For a one-component file name
|
|
29
|
+
* this returns exactly `canonicalUstarHeader(storedName, size)`.
|
|
30
|
+
*/
|
|
31
|
+
export declare function canonicalUstarTreeHeader(storedName: string, kind: 'file' | 'directory', size: number): Buffer;
|
|
32
|
+
/** The exact deterministic archive length for an ordered canonical entry list. */
|
|
33
|
+
export declare function deterministicTreeTarSize(entries: readonly {
|
|
34
|
+
kind: 'file' | 'directory';
|
|
35
|
+
size: number;
|
|
36
|
+
}[]): number;
|
|
@@ -0,0 +1,167 @@
|
|
|
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.TAR_GNAME = exports.TAR_UNAME = exports.TAR_MTIME_MS = exports.TAR_GID = exports.TAR_UID = exports.TAR_DIRECTORY_MODE = exports.TAR_MODE = exports.MAX_USTAR_FILE_BYTES = exports.TAR_BLOCK_BYTES = void 0;
|
|
7
|
+
exports.assertUstarFileSize = assertUstarFileSize;
|
|
8
|
+
exports.deterministicTarSize = deterministicTarSize;
|
|
9
|
+
exports.canonicalUstarHeader = canonicalUstarHeader;
|
|
10
|
+
exports.canonicalUstarTreeHeader = canonicalUstarTreeHeader;
|
|
11
|
+
exports.deterministicTreeTarSize = deterministicTreeTarSize;
|
|
12
|
+
const b4a_1 = __importDefault(require("b4a"));
|
|
13
|
+
const errors_js_1 = require("../errors.js");
|
|
14
|
+
const tree_path_js_1 = require("./tree-path.js");
|
|
15
|
+
exports.TAR_BLOCK_BYTES = 512;
|
|
16
|
+
exports.MAX_USTAR_FILE_BYTES = 0o77777777777;
|
|
17
|
+
const TAR_END_BYTES = 2 * exports.TAR_BLOCK_BYTES;
|
|
18
|
+
/**
|
|
19
|
+
* Every USTAR metadata field is pinned to a constant so that the same content
|
|
20
|
+
* always frames to the same bytes. The transfer ID commits to these values, so
|
|
21
|
+
* changing one changes every transfer ID.
|
|
22
|
+
*/
|
|
23
|
+
exports.TAR_MODE = 0o644;
|
|
24
|
+
exports.TAR_DIRECTORY_MODE = 0o755;
|
|
25
|
+
exports.TAR_UID = 0;
|
|
26
|
+
exports.TAR_GID = 0;
|
|
27
|
+
exports.TAR_MTIME_MS = 0;
|
|
28
|
+
exports.TAR_UNAME = '';
|
|
29
|
+
exports.TAR_GNAME = '';
|
|
30
|
+
function invalidSize() {
|
|
31
|
+
return new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.PROTOCOL_INVALID, 'Invalid deterministic TAR file size');
|
|
32
|
+
}
|
|
33
|
+
function assertUstarFileSize(size) {
|
|
34
|
+
if (typeof size !== 'number' ||
|
|
35
|
+
!Number.isSafeInteger(size) ||
|
|
36
|
+
size < 0 ||
|
|
37
|
+
size > exports.MAX_USTAR_FILE_BYTES) {
|
|
38
|
+
throw invalidSize();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function deterministicTarSize(fileSize) {
|
|
42
|
+
assertUstarFileSize(fileSize);
|
|
43
|
+
const padding = (exports.TAR_BLOCK_BYTES - (fileSize % exports.TAR_BLOCK_BYTES)) % exports.TAR_BLOCK_BYTES;
|
|
44
|
+
const total = exports.TAR_BLOCK_BYTES + fileSize + padding + TAR_END_BYTES;
|
|
45
|
+
if (!Number.isSafeInteger(total))
|
|
46
|
+
throw invalidSize();
|
|
47
|
+
return total;
|
|
48
|
+
}
|
|
49
|
+
function assertCanonicalTreeStoredName(storedName, kind) {
|
|
50
|
+
try {
|
|
51
|
+
(0, tree_path_js_1.assertTreeStoredName)(storedName, kind);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (error instanceof errors_js_1.SwarmDeployError && error.code === errors_js_1.ERRORS.INVALID_FILENAME) {
|
|
55
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.PROTOCOL_INVALID, 'Invalid canonical TAR name');
|
|
56
|
+
}
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function octal(value, digits) {
|
|
61
|
+
const encoded = value.toString(8);
|
|
62
|
+
if (encoded.length > digits) {
|
|
63
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.PROTOCOL_INVALID, 'Canonical TAR field overflow');
|
|
64
|
+
}
|
|
65
|
+
return b4a_1.default.from(`${'0'.repeat(digits - encoded.length)}${encoded} `);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Builds the single canonical USTAR header block for `name`/`fileSize`.
|
|
69
|
+
*
|
|
70
|
+
* Both the send path and receive validator use this exact block. A test also
|
|
71
|
+
* pins it byte-for-byte against tar-stream's portable USTAR representation.
|
|
72
|
+
*/
|
|
73
|
+
function canonicalUstarHeader(name, fileSize) {
|
|
74
|
+
assertUstarFileSize(fileSize);
|
|
75
|
+
const header = b4a_1.default.alloc(exports.TAR_BLOCK_BYTES);
|
|
76
|
+
const set = (offset, value) => {
|
|
77
|
+
header.set(value, offset);
|
|
78
|
+
};
|
|
79
|
+
set(0, b4a_1.default.from(name));
|
|
80
|
+
set(100, octal(exports.TAR_MODE, 6));
|
|
81
|
+
set(108, octal(exports.TAR_UID, 6));
|
|
82
|
+
set(116, octal(exports.TAR_GID, 6));
|
|
83
|
+
set(124, octal(fileSize, 11));
|
|
84
|
+
set(136, octal(exports.TAR_MTIME_MS / 1000, 11));
|
|
85
|
+
header[156] = 48;
|
|
86
|
+
set(257, b4a_1.default.from([0x75, 0x73, 0x74, 0x61, 0x72, 0]));
|
|
87
|
+
set(263, b4a_1.default.from('00'));
|
|
88
|
+
if (exports.TAR_UNAME)
|
|
89
|
+
set(265, b4a_1.default.from(exports.TAR_UNAME));
|
|
90
|
+
if (exports.TAR_GNAME)
|
|
91
|
+
set(297, b4a_1.default.from(exports.TAR_GNAME));
|
|
92
|
+
set(329, octal(0, 6));
|
|
93
|
+
set(337, octal(0, 6));
|
|
94
|
+
let checksum = 8 * 32;
|
|
95
|
+
for (let index = 0; index < 148; index++)
|
|
96
|
+
checksum += header[index];
|
|
97
|
+
for (let index = 156; index < exports.TAR_BLOCK_BYTES; index++)
|
|
98
|
+
checksum += header[index];
|
|
99
|
+
set(148, octal(checksum, 6));
|
|
100
|
+
return header;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Builds the canonical USTAR header block for one tree entry.
|
|
104
|
+
*
|
|
105
|
+
* `storedName` is the exact TAR name field: the relative path for a file and
|
|
106
|
+
* the relative path plus `/` for a directory. For a one-component file name
|
|
107
|
+
* this returns exactly `canonicalUstarHeader(storedName, size)`.
|
|
108
|
+
*/
|
|
109
|
+
function canonicalUstarTreeHeader(storedName, kind, size) {
|
|
110
|
+
if (kind !== 'file' && kind !== 'directory') {
|
|
111
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.PROTOCOL_INVALID, 'Invalid canonical TAR entry kind');
|
|
112
|
+
}
|
|
113
|
+
if (kind === 'directory' && size !== 0) {
|
|
114
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.PROTOCOL_INVALID, 'Invalid canonical TAR directory size');
|
|
115
|
+
}
|
|
116
|
+
assertUstarFileSize(size);
|
|
117
|
+
assertCanonicalTreeStoredName(storedName, kind);
|
|
118
|
+
if (kind === 'file')
|
|
119
|
+
return canonicalUstarHeader(storedName, size);
|
|
120
|
+
const encoded = b4a_1.default.from(storedName);
|
|
121
|
+
const header = b4a_1.default.alloc(exports.TAR_BLOCK_BYTES);
|
|
122
|
+
const set = (offset, value) => {
|
|
123
|
+
header.set(value, offset);
|
|
124
|
+
};
|
|
125
|
+
set(0, encoded);
|
|
126
|
+
set(100, octal(exports.TAR_DIRECTORY_MODE, 6));
|
|
127
|
+
set(108, octal(exports.TAR_UID, 6));
|
|
128
|
+
set(116, octal(exports.TAR_GID, 6));
|
|
129
|
+
set(124, octal(size, 11));
|
|
130
|
+
set(136, octal(exports.TAR_MTIME_MS / 1000, 11));
|
|
131
|
+
header[156] = 53;
|
|
132
|
+
set(257, b4a_1.default.from([0x75, 0x73, 0x74, 0x61, 0x72, 0]));
|
|
133
|
+
set(263, b4a_1.default.from('00'));
|
|
134
|
+
if (exports.TAR_UNAME)
|
|
135
|
+
set(265, b4a_1.default.from(exports.TAR_UNAME));
|
|
136
|
+
if (exports.TAR_GNAME)
|
|
137
|
+
set(297, b4a_1.default.from(exports.TAR_GNAME));
|
|
138
|
+
set(329, octal(0, 6));
|
|
139
|
+
set(337, octal(0, 6));
|
|
140
|
+
let checksum = 8 * 32;
|
|
141
|
+
for (let index = 0; index < 148; index++)
|
|
142
|
+
checksum += header[index];
|
|
143
|
+
for (let index = 156; index < exports.TAR_BLOCK_BYTES; index++)
|
|
144
|
+
checksum += header[index];
|
|
145
|
+
set(148, octal(checksum, 6));
|
|
146
|
+
return header;
|
|
147
|
+
}
|
|
148
|
+
/** The exact deterministic archive length for an ordered canonical entry list. */
|
|
149
|
+
function deterministicTreeTarSize(entries) {
|
|
150
|
+
let total = TAR_END_BYTES;
|
|
151
|
+
for (const entry of entries) {
|
|
152
|
+
if (entry.kind !== 'file' && entry.kind !== 'directory') {
|
|
153
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.PROTOCOL_INVALID, 'Invalid canonical TAR entry kind');
|
|
154
|
+
}
|
|
155
|
+
if (entry.kind === 'directory' && entry.size !== 0) {
|
|
156
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.PROTOCOL_INVALID, 'Invalid canonical TAR directory size');
|
|
157
|
+
}
|
|
158
|
+
assertUstarFileSize(entry.size);
|
|
159
|
+
const payload = entry.kind === 'directory' ? 0 : entry.size;
|
|
160
|
+
const padding = (exports.TAR_BLOCK_BYTES - (payload % exports.TAR_BLOCK_BYTES)) % exports.TAR_BLOCK_BYTES;
|
|
161
|
+
total += exports.TAR_BLOCK_BYTES + payload + padding;
|
|
162
|
+
if (!Number.isSafeInteger(total))
|
|
163
|
+
throw invalidSize();
|
|
164
|
+
}
|
|
165
|
+
return total;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=ustar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ustar.js","sourceRoot":"","sources":["../../src/tar-protocol/ustar.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { ErrorCode } from './errors.js';
|
|
2
|
+
/**
|
|
3
|
+
* A byte buffer accepted by identity, transport, and file APIs. Values that
|
|
4
|
+
* represent keys, digests, or transfer IDs must be exactly 32 bytes.
|
|
5
|
+
*/
|
|
6
|
+
export type Binary = Buffer;
|
|
7
|
+
/** Whether a managed artifact is one regular file or one recursive directory. */
|
|
8
|
+
export type ArtifactKind = 'file' | 'directory';
|
|
9
|
+
/** Byte input accepted by APIs that normalize values to a b4a/Node Buffer. */
|
|
10
|
+
export type BinaryInput = Uint8Array;
|
|
11
|
+
/** A 32-byte seed used to derive a HyperDHT identity. */
|
|
12
|
+
export type Seed = Binary;
|
|
13
|
+
/** A 32-byte buffer or canonical lowercase 64-character hex seed string. */
|
|
14
|
+
export type SeedInput = BinaryInput | string;
|
|
15
|
+
/** A 32-byte HyperDHT public key. */
|
|
16
|
+
export type PublicKey = Binary;
|
|
17
|
+
/** A 32-byte public key accepted by identity, constructor, and allowlist APIs. */
|
|
18
|
+
export type PublicKeyInput = BinaryInput;
|
|
19
|
+
/** A SHA-256 digest. */
|
|
20
|
+
export type Digest = Binary;
|
|
21
|
+
/** A SHA-256-derived transfer identifier. */
|
|
22
|
+
export type TransferId = Binary;
|
|
23
|
+
export interface KeyPair {
|
|
24
|
+
publicKey: PublicKey;
|
|
25
|
+
secretKey: Binary;
|
|
26
|
+
}
|
|
27
|
+
export interface Logger {
|
|
28
|
+
info?(message: string, details?: Record<string, unknown>): void;
|
|
29
|
+
warn?(message: string, details?: Record<string, unknown>): void;
|
|
30
|
+
error?(message: string, details?: Record<string, unknown>): void;
|
|
31
|
+
}
|
|
32
|
+
export interface Scheduler {
|
|
33
|
+
setTimeout(callback: () => void, delay: number): unknown;
|
|
34
|
+
clearTimeout(handle: unknown): void;
|
|
35
|
+
}
|
|
36
|
+
export interface ServerScheduler extends Scheduler {
|
|
37
|
+
setInterval(callback: () => void, delay: number): unknown;
|
|
38
|
+
clearInterval(handle: unknown): void;
|
|
39
|
+
}
|
|
40
|
+
export interface Clock {
|
|
41
|
+
now(): number;
|
|
42
|
+
}
|
|
43
|
+
export interface FingerprintEvent {
|
|
44
|
+
/** First 12 lowercase hexadecimal characters of SHA-256(public key). */
|
|
45
|
+
fingerprint: string;
|
|
46
|
+
}
|
|
47
|
+
export interface AuthenticationEvent extends FingerprintEvent {
|
|
48
|
+
status: 'accepted' | 'rejected';
|
|
49
|
+
reason?: ErrorCode;
|
|
50
|
+
}
|
|
51
|
+
export interface TransferEvent {
|
|
52
|
+
/** A 12-character SHA-256 fingerprint of the transfer ID. */
|
|
53
|
+
transfer: string;
|
|
54
|
+
name: string;
|
|
55
|
+
kind: ArtifactKind;
|
|
56
|
+
size: number;
|
|
57
|
+
}
|
|
58
|
+
export interface TransferLifecycleEvent extends TransferEvent {
|
|
59
|
+
status: 'started' | 'succeeded' | 'failed';
|
|
60
|
+
reason?: string;
|
|
61
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function isFixed32(value: unknown): value is Uint8Array;
|
|
2
|
+
export declare function assertFixed32(value: unknown, name: string): asserts value is Uint8Array;
|
|
3
|
+
export declare function assertSafeUint(value: unknown, name: string): asserts value is number;
|
|
4
|
+
export declare function assertPositiveSafeUint(value: unknown, name: string): asserts value is number;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isFixed32 = isFixed32;
|
|
4
|
+
exports.assertFixed32 = assertFixed32;
|
|
5
|
+
exports.assertSafeUint = assertSafeUint;
|
|
6
|
+
exports.assertPositiveSafeUint = assertPositiveSafeUint;
|
|
7
|
+
const errors_js_1 = require("./errors.js");
|
|
8
|
+
function isFixed32(value) {
|
|
9
|
+
return value instanceof Uint8Array && value.byteLength === 32;
|
|
10
|
+
}
|
|
11
|
+
function assertFixed32(value, name) {
|
|
12
|
+
if (!isFixed32(value)) {
|
|
13
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.PROTOCOL_INVALID, `Invalid ${name}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function assertSafeUint(value, name) {
|
|
17
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0) {
|
|
18
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.PROTOCOL_INVALID, `Invalid ${name}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function assertPositiveSafeUint(value, name) {
|
|
22
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value <= 0) {
|
|
23
|
+
throw new errors_js_1.SwarmDeployError(errors_js_1.ERRORS.PROTOCOL_INVALID, `Invalid ${name}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":";;;;;;AAAA,2CAAsD;AAEtD,mBAA0B,KAAc;IACtC,OAAO,KAAK,YAAY,UAAU,IAAI,KAAK,CAAC,UAAU,KAAK,EAAE,CAAA;AAC/D,CAAC;AAED,uBAA8B,KAAc,EAAE,IAAY;IACxD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,4BAAgB,CAAC,kBAAM,CAAC,gBAAgB,EAAE,WAAW,IAAI,EAAE,CAAC,CAAA;IACxE,CAAC;AACH,CAAC;AAED,wBAA+B,KAAc,EAAE,IAAY;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,4BAAgB,CAAC,kBAAM,CAAC,gBAAgB,EAAE,WAAW,IAAI,EAAE,CAAC,CAAA;IACxE,CAAC;AACH,CAAC;AAED,gCAAuC,KAAc,EAAE,IAAY;IACjE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,4BAAgB,CAAC,kBAAM,CAAC,gBAAgB,EAAE,WAAW,IAAI,EAAE,CAAC,CAAA;IACxE,CAAC;AACH,CAAC"}
|