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,419 @@
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.ReleaseMatcher = exports.MAX_RELEASE_COMPONENT_BYTES = void 0;
7
+ exports.fixedSeriesKey = fixedSeriesKey;
8
+ exports.compareReleaseVersions = compareReleaseVersions;
9
+ exports.releaseVersionGroup = releaseVersionGroup;
10
+ const b4a_1 = __importDefault(require("b4a"));
11
+ const semver_1 = require("semver");
12
+ const files_js_1 = require("./files.js");
13
+ const hash_js_1 = require("./tar-protocol/hash.js");
14
+ const PLACEHOLDER_SERIES = '{series}';
15
+ const PLACEHOLDER_VERSION = '{version}';
16
+ /** Protocol: artifact basenames are one safe path component, max 100 UTF-8 bytes (`+` disallowed). */
17
+ exports.MAX_RELEASE_COMPONENT_BYTES = 100;
18
+ const SAFE_ARTIFACT = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
19
+ /** Immediate source parent: same 100-byte single-component rule; `+` allowed for SemVer build metadata. */
20
+ const SAFE_SOURCE_PARENT = /^[A-Za-z0-9][A-Za-z0-9._+-]*$/;
21
+ const FIXED_SERIES_PREFIX = 'fixed-';
22
+ /** The exact shape `fixedSeriesKey` produces; captures may not occupy it. */
23
+ const RESERVED_FIXED_SERIES = /^fixed-[0-9a-f]{64}$/;
24
+ /**
25
+ * The persisted series of a template that captures no `{series}`.
26
+ *
27
+ * The template text itself cannot be the key: braces and slashes fail the
28
+ * commit-record basename rules, so every version-only pattern would reject at
29
+ * commit time. Hashing gives a safe 70-byte basename that is stable across
30
+ * restarts and identical on Node and Bare, and distinct templates that happen
31
+ * to describe the same literals stay distinct releases.
32
+ */
33
+ function fixedSeriesKey(template) {
34
+ return `${FIXED_SERIES_PREFIX}${b4a_1.default.toString((0, hash_js_1.sodiumSha256)(b4a_1.default.from(template)), 'hex')}`;
35
+ }
36
+ function placeholderCount(template, placeholder) {
37
+ let count = 0;
38
+ let index = 0;
39
+ while ((index = template.indexOf(placeholder, index)) !== -1) {
40
+ count++;
41
+ index += placeholder.length;
42
+ }
43
+ return count;
44
+ }
45
+ function assertPlaceholderLayout(template) {
46
+ if (template.includes(`${PLACEHOLDER_SERIES}${PLACEHOLDER_VERSION}`) ||
47
+ template.includes(`${PLACEHOLDER_VERSION}${PLACEHOLDER_SERIES}`)) {
48
+ throw new Error('Invalid release template: adjacent placeholder');
49
+ }
50
+ }
51
+ /** Literal text is matched verbatim, so a stray brace is always a typo, not a literal. */
52
+ function assertNoResidualBraces(template) {
53
+ const literals = template.split(PLACEHOLDER_SERIES).join('').split(PLACEHOLDER_VERSION).join('');
54
+ if (literals.includes('{') || literals.includes('}')) {
55
+ throw new Error('Invalid release template: unexpected brace');
56
+ }
57
+ }
58
+ function componentByteLength(value) {
59
+ return b4a_1.default.from(value).byteLength;
60
+ }
61
+ function isSafeArtifactName(value) {
62
+ return (typeof value === 'string' &&
63
+ value.length > 0 &&
64
+ SAFE_ARTIFACT.test(value) &&
65
+ componentByteLength(value) <= exports.MAX_RELEASE_COMPONENT_BYTES);
66
+ }
67
+ function isSafeSourceParent(value) {
68
+ return (typeof value === 'string' &&
69
+ value.length > 0 &&
70
+ SAFE_SOURCE_PARENT.test(value) &&
71
+ componentByteLength(value) <= exports.MAX_RELEASE_COMPONENT_BYTES &&
72
+ !value.includes('/') &&
73
+ !value.includes('\\'));
74
+ }
75
+ /**
76
+ * A captured `{series}` may not take the shape of a derived fixed-series key,
77
+ * so an upload cannot name itself into the rotation group of a version-only
78
+ * pattern. The namespace is reserved rather than escaped: a collision is a
79
+ * non-match, which fails closed as an unmatched offer.
80
+ */
81
+ function isSafeSeriesCapture(value) {
82
+ return (SAFE_ARTIFACT.test(value) &&
83
+ componentByteLength(value) <= exports.MAX_RELEASE_COMPONENT_BYTES &&
84
+ !RESERVED_FIXED_SERIES.test(value));
85
+ }
86
+ function validateStrictReleaseVersion(raw) {
87
+ if (raw.length === 0 || componentByteLength(raw) > exports.MAX_RELEASE_COMPONENT_BYTES) {
88
+ return undefined;
89
+ }
90
+ if (raw.trim() !== raw)
91
+ return undefined;
92
+ if (/^[vV]/.test(raw))
93
+ return undefined;
94
+ if (/[/\\]/.test(raw))
95
+ return undefined;
96
+ try {
97
+ const parsed = new semver_1.SemVer(raw, { loose: false });
98
+ const core = raw.split('+', 1)[0];
99
+ if (core !== parsed.version)
100
+ return undefined;
101
+ return parsed;
102
+ }
103
+ catch {
104
+ return undefined;
105
+ }
106
+ }
107
+ function normalizeCapturedVersion(raw) {
108
+ return validateStrictReleaseVersion(raw)?.version;
109
+ }
110
+ function parseReleaseVersion(raw) {
111
+ const parsed = validateStrictReleaseVersion(raw);
112
+ if (!parsed)
113
+ throw new Error('Invalid release version');
114
+ return parsed;
115
+ }
116
+ function parseSegmentParts(template) {
117
+ const parts = [];
118
+ let cursor = 0;
119
+ while (cursor < template.length) {
120
+ const seriesAt = template.indexOf(PLACEHOLDER_SERIES, cursor);
121
+ const versionAt = template.indexOf(PLACEHOLDER_VERSION, cursor);
122
+ let next = -1;
123
+ let kind = null;
124
+ if (seriesAt !== -1 && (versionAt === -1 || seriesAt < versionAt)) {
125
+ next = seriesAt;
126
+ kind = 'series';
127
+ }
128
+ else if (versionAt !== -1) {
129
+ next = versionAt;
130
+ kind = 'version';
131
+ }
132
+ if (next === -1) {
133
+ parts.push({ kind: 'literal', text: template.slice(cursor) });
134
+ break;
135
+ }
136
+ if (next > cursor) {
137
+ parts.push({ kind: 'literal', text: template.slice(cursor, next) });
138
+ }
139
+ parts.push({ kind: kind });
140
+ cursor = next + (kind === 'series' ? PLACEHOLDER_SERIES.length : PLACEHOLDER_VERSION.length);
141
+ }
142
+ return parts;
143
+ }
144
+ function compileSegmentPlan(template) {
145
+ const seriesCount = placeholderCount(template, PLACEHOLDER_SERIES);
146
+ const versionCount = placeholderCount(template, PLACEHOLDER_VERSION);
147
+ if (seriesCount > 1 || versionCount > 1) {
148
+ throw new Error('Invalid release template: repeated placeholder');
149
+ }
150
+ const parts = parseSegmentParts(template);
151
+ return {
152
+ plan: { parts },
153
+ hasSeries: seriesCount > 0,
154
+ hasVersion: versionCount > 0
155
+ };
156
+ }
157
+ function compileParentMatcher(parent) {
158
+ if (placeholderCount(parent, PLACEHOLDER_SERIES) === 0 &&
159
+ placeholderCount(parent, PLACEHOLDER_VERSION) === 0) {
160
+ return { literal: parent, plan: null, hasVersion: false };
161
+ }
162
+ const compiled = compileSegmentPlan(parent);
163
+ return { literal: null, plan: compiled.plan, hasVersion: compiled.hasVersion };
164
+ }
165
+ function compileTemplate(template) {
166
+ assertNoResidualBraces(template);
167
+ assertPlaceholderLayout(template);
168
+ const seriesCount = placeholderCount(template, PLACEHOLDER_SERIES);
169
+ const versionCount = placeholderCount(template, PLACEHOLDER_VERSION);
170
+ if (seriesCount === 0 && versionCount === 0) {
171
+ throw new Error('Invalid release template: missing placeholder');
172
+ }
173
+ if (seriesCount > 1 || versionCount > 1) {
174
+ throw new Error('Invalid release template: repeated placeholder');
175
+ }
176
+ const segments = template.split('/');
177
+ if (segments.some((segment) => segment.length === 0)) {
178
+ throw new Error('Invalid release template: empty segment');
179
+ }
180
+ if (segments.length > 2) {
181
+ throw new Error('Invalid release template: path separator outside parent boundary');
182
+ }
183
+ const fixedSeries = seriesCount === 0 ? fixedSeriesKey(template) : null;
184
+ if (fixedSeries !== null) {
185
+ try {
186
+ (0, files_js_1.validateBasename)(fixedSeries);
187
+ }
188
+ catch (error) {
189
+ throw new Error('Invalid release template: unusable fixed series key', { cause: error });
190
+ }
191
+ }
192
+ if (segments.length === 1) {
193
+ const basename = compileSegmentPlan(template);
194
+ return {
195
+ fixedSeries,
196
+ versionInParent: false,
197
+ versionInBasename: basename.hasVersion,
198
+ parent: null,
199
+ basename: basename.plan
200
+ };
201
+ }
202
+ const parentSegment = segments[0];
203
+ const basenameSegment = segments[1];
204
+ const parent = compileParentMatcher(parentSegment);
205
+ const basename = compileSegmentPlan(basenameSegment);
206
+ return {
207
+ fixedSeries,
208
+ versionInParent: parent.hasVersion,
209
+ versionInBasename: basename.hasVersion,
210
+ parent,
211
+ basename: basename.plan
212
+ };
213
+ }
214
+ function assignPlaceholderPair(first, second, left, right) {
215
+ if (first === 'series' && second === 'version') {
216
+ if (!isSafeSeriesCapture(left))
217
+ return null;
218
+ const version = normalizeCapturedVersion(right);
219
+ return version ? { series: left, version } : null;
220
+ }
221
+ if (first === 'version' && second === 'series') {
222
+ const version = normalizeCapturedVersion(left);
223
+ if (!version)
224
+ return null;
225
+ if (!isSafeSeriesCapture(right))
226
+ return null;
227
+ return { series: right, version };
228
+ }
229
+ return null;
230
+ }
231
+ function splitSeriesThenVersion(stem) {
232
+ for (let index = stem.lastIndexOf('-'); index > 0; index = stem.lastIndexOf('-', index - 1)) {
233
+ const groups = assignPlaceholderPair('series', 'version', stem.slice(0, index), stem.slice(index + 1));
234
+ if (groups)
235
+ return groups;
236
+ }
237
+ return null;
238
+ }
239
+ function splitVersionThenSeries(stem) {
240
+ for (let index = stem.indexOf('-'); index > 0; index = stem.indexOf('-', index + 1)) {
241
+ const groups = assignPlaceholderPair('version', 'series', stem.slice(0, index), stem.slice(index + 1));
242
+ if (groups)
243
+ return groups;
244
+ }
245
+ return null;
246
+ }
247
+ function tryLiteralSeparator(stem, separator, first, second) {
248
+ if (separator.length === 0)
249
+ return null;
250
+ let index = stem.indexOf(separator);
251
+ while (index !== -1) {
252
+ const left = stem.slice(0, index);
253
+ const right = stem.slice(index + separator.length);
254
+ const groups = assignPlaceholderPair(first, second, left, right);
255
+ if (groups)
256
+ return groups;
257
+ index = stem.indexOf(separator, index + 1);
258
+ }
259
+ return null;
260
+ }
261
+ function matchStem(middle, stem) {
262
+ if (middle.length === 1) {
263
+ const part = middle[0];
264
+ if (part.kind === 'series') {
265
+ return isSafeSeriesCapture(stem) ? { series: stem } : null;
266
+ }
267
+ const version = normalizeCapturedVersion(stem);
268
+ return version ? { version } : null;
269
+ }
270
+ if (middle.length === 3 &&
271
+ middle[0].kind !== 'literal' &&
272
+ middle[1].kind === 'literal' &&
273
+ middle[2].kind !== 'literal') {
274
+ const first = middle[0].kind;
275
+ const separator = middle[1].text;
276
+ const second = middle[2].kind;
277
+ if (first === 'series' && second === 'version' && separator === '-') {
278
+ const split = splitSeriesThenVersion(stem);
279
+ if (split)
280
+ return split;
281
+ }
282
+ if (first === 'version' && second === 'series' && separator === '-') {
283
+ const split = splitVersionThenSeries(stem);
284
+ if (split)
285
+ return split;
286
+ }
287
+ return tryLiteralSeparator(stem, separator, first, second);
288
+ }
289
+ return null;
290
+ }
291
+ function matchSegmentPlan(plan, value) {
292
+ const { parts } = plan;
293
+ if (parts.length === 0)
294
+ return null;
295
+ let prefix = '';
296
+ let start = 0;
297
+ while (start < parts.length && parts[start].kind === 'literal') {
298
+ prefix += parts[start].text;
299
+ start++;
300
+ }
301
+ let suffix = '';
302
+ let end = parts.length - 1;
303
+ while (end >= start && parts[end].kind === 'literal') {
304
+ suffix = parts[end].text + suffix;
305
+ end--;
306
+ }
307
+ if (!value.startsWith(prefix) || !value.endsWith(suffix))
308
+ return null;
309
+ const stem = value.slice(prefix.length, value.length - suffix.length);
310
+ if (componentByteLength(stem) > exports.MAX_RELEASE_COMPONENT_BYTES)
311
+ return null;
312
+ const middle = parts.slice(start, end + 1);
313
+ if (middle.length === 0) {
314
+ return stem.length === 0 ? {} : null;
315
+ }
316
+ return matchStem(middle, stem);
317
+ }
318
+ function matchWithParent(pattern, sourceParent, name) {
319
+ if (!isSafeArtifactName(name))
320
+ return null;
321
+ let parentGroups = {};
322
+ const parent = pattern.parent;
323
+ if (parent.literal !== null) {
324
+ if (parent.literal !== sourceParent)
325
+ return null;
326
+ }
327
+ else {
328
+ const matched = matchSegmentPlan(parent.plan, sourceParent);
329
+ if (matched === null)
330
+ return null;
331
+ parentGroups = matched;
332
+ }
333
+ const basenameGroups = matchSegmentPlan(pattern.basename, name);
334
+ if (basenameGroups === null)
335
+ return null;
336
+ return { ...parentGroups, ...basenameGroups };
337
+ }
338
+ function coordinatesFromGroups(pattern, groups, mode) {
339
+ const series = pattern.fixedSeries ??
340
+ (typeof groups.series === 'string' && groups.series.length > 0 ? groups.series : null);
341
+ if (series === null)
342
+ return null;
343
+ if (pattern.fixedSeries === null && !isSafeSeriesCapture(series))
344
+ return null;
345
+ const normalized = groups.version;
346
+ const requiresVersion = mode === 'basename'
347
+ ? pattern.versionInBasename
348
+ : pattern.versionInBasename || pattern.versionInParent;
349
+ if (requiresVersion && normalized === undefined)
350
+ return null;
351
+ if (normalized !== undefined) {
352
+ return { series, version: normalized };
353
+ }
354
+ return { series };
355
+ }
356
+ class ReleaseMatcher {
357
+ #patterns;
358
+ constructor(patterns) {
359
+ const seen = new Set();
360
+ const compiled = [];
361
+ for (const template of patterns) {
362
+ if (typeof template !== 'string') {
363
+ throw new Error('Invalid release template');
364
+ }
365
+ if (seen.has(template)) {
366
+ throw new Error('Invalid release template: duplicate template');
367
+ }
368
+ seen.add(template);
369
+ compiled.push(compileTemplate(template));
370
+ }
371
+ this.#patterns = compiled;
372
+ }
373
+ get size() {
374
+ return this.#patterns.length;
375
+ }
376
+ get hasVersionPattern() {
377
+ return this.#patterns.some((pattern) => pattern.versionInBasename || pattern.versionInParent);
378
+ }
379
+ match(name, sourceParent) {
380
+ if (!isSafeArtifactName(name))
381
+ return null;
382
+ if (sourceParent !== undefined && !isSafeSourceParent(sourceParent))
383
+ return null;
384
+ for (const pattern of this.#patterns) {
385
+ if (pattern.parent !== null) {
386
+ if (sourceParent === undefined)
387
+ continue;
388
+ const groups = matchWithParent(pattern, sourceParent, name);
389
+ if (groups) {
390
+ const coords = coordinatesFromGroups(pattern, groups, 'full');
391
+ if (coords)
392
+ return coords;
393
+ }
394
+ continue;
395
+ }
396
+ const basenameGroups = matchSegmentPlan(pattern.basename, name);
397
+ if (basenameGroups) {
398
+ const coords = coordinatesFromGroups(pattern, basenameGroups, 'basename');
399
+ if (coords)
400
+ return coords;
401
+ }
402
+ }
403
+ return null;
404
+ }
405
+ }
406
+ exports.ReleaseMatcher = ReleaseMatcher;
407
+ function compareReleaseVersions(left, right) {
408
+ return (0, semver_1.compare)(parseReleaseVersion(left), parseReleaseVersion(right));
409
+ }
410
+ function releaseVersionGroup(version, granularity) {
411
+ if (granularity !== 'major' && granularity !== 'minor') {
412
+ throw new Error('Invalid version granularity');
413
+ }
414
+ const parsed = parseReleaseVersion(version);
415
+ if (granularity === 'major')
416
+ return String(parsed.major);
417
+ return `${parsed.major}.${parsed.minor}`;
418
+ }
419
+ //# sourceMappingURL=release.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release.js","sourceRoot":"","sources":["../src/release.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,239 @@
1
+ import events from '#events';
2
+ import { type DirectDhtFactory, type DirectDhtNode } from './direct-dht.js';
3
+ import { type ErrorCode } from './errors.js';
4
+ import { type ServerHooks } from './hooks.js';
5
+ import { type VersionGranularity } from './release.js';
6
+ import type { StorageAdapter } from './storage/types.js';
7
+ import { type CompiledSymlinkRule, type SymlinkRule } from './symlinks.js';
8
+ import type { AuthenticationEvent, FingerprintEvent, Logger, PublicKey, PublicKeyInput, SeedInput, ServerScheduler, TransferEvent, TransferLifecycleEvent } from './types.js';
9
+ declare const EventEmitter: typeof events;
10
+ declare const DEFAULT_MAX_CONNECTIONS = 64;
11
+ declare const DEFAULT_MAX_ACTIVE_UPLOADS = 8;
12
+ declare const DEFAULT_MIN_FREE_BYTES: number;
13
+ declare const MAX_CONNECTIONS = 1024;
14
+ declare const MAX_ACTIVE_UPLOADS = 1024;
15
+ declare const FINGERPRINT_LENGTH = 12;
16
+ /**
17
+ * How many transfers may owe a deferred post-commit retention pass at once.
18
+ *
19
+ * The set grows only when an `afterCommit` hook fails after a durable commit,
20
+ * and entries are removed as soon as a retry succeeds, so reaching the bound
21
+ * means a persistently failing hook. Capping it at the connection ceiling
22
+ * keeps a broken deployment step from growing server memory without limit.
23
+ */
24
+ export declare const MAX_OWED_POST_COMMIT_RETENTION = 1024;
25
+ export type ServerLogger = Logger;
26
+ export type AllowlistKey = PublicKeyInput | string;
27
+ export interface ServerOptions {
28
+ seed: SeedInput;
29
+ storageDir: string;
30
+ allowedKeys: Iterable<AllowlistKey>;
31
+ maxFileBytes: number;
32
+ maxStagingBytes: number;
33
+ maxConnections?: number;
34
+ maxActiveUploads?: number;
35
+ idleTimeout?: number;
36
+ cleanupInterval?: number;
37
+ resumeTtl?: number;
38
+ minFreeBytes?: number;
39
+ maxAge?: number;
40
+ maxStorageBytes?: number;
41
+ /** Ordered release templates; when non-empty every new offer must match one. */
42
+ artifactPatterns?: Iterable<string>;
43
+ maxCount?: number;
44
+ maxVersions?: number;
45
+ versionGranularity?: VersionGranularity;
46
+ dht?: DirectDhtNode;
47
+ dhtFactory?: DirectDhtFactory;
48
+ storage?: StorageAdapter;
49
+ scheduler?: ServerScheduler;
50
+ logger?: Logger | null;
51
+ replaceNames?: Iterable<string>;
52
+ /** Optional deployment lifecycle callbacks; snapshotted at construction. */
53
+ hooks?: ServerHooks | null;
54
+ /** Repeatable managed-symlink rules; snapshotted and validated at construction. */
55
+ symlinks?: Iterable<SymlinkRule>;
56
+ }
57
+ export interface ServerConnectionEvent extends FingerprintEvent {
58
+ connections: number;
59
+ }
60
+ export interface ServerListeningEvent {
61
+ fingerprint: string;
62
+ }
63
+ export interface ServerOfferEvent extends TransferEvent, FingerprintEvent {
64
+ status: 'accepted' | 'resumed' | 'reset' | 'rejected' | 'already-committed';
65
+ offset?: number;
66
+ reason?: ErrorCode;
67
+ }
68
+ export interface ServerProgressEvent extends TransferEvent, FingerprintEvent {
69
+ bytesReceived: number;
70
+ totalBytes: number;
71
+ }
72
+ export type ServerTransferLifecycleEvent = TransferLifecycleEvent & FingerprintEvent;
73
+ export interface RecoveryEvent {
74
+ status: 'started' | 'completed' | 'failed' | 'CORRUPT' | 'COMMITTED' | 'ABORTED' | 'RESUMABLE' | 'MISSING' | 'FILE_EXISTS';
75
+ transfer?: string;
76
+ phase?: 'classification' | 'sessions' | 'journal';
77
+ reason?: string;
78
+ journals?: number;
79
+ purgedSessions?: number;
80
+ }
81
+ export interface RetentionEvent {
82
+ trigger: 'startup' | 'scheduled' | 'manual' | 'commit' | 'post-commit';
83
+ status: 'completed' | 'deferred' | 'failed';
84
+ reason?: string;
85
+ expiredSessions?: number;
86
+ scrubbed?: number;
87
+ ageDeleted?: number;
88
+ countDeleted?: number;
89
+ versionDeleted?: number;
90
+ storageDeleted?: number;
91
+ }
92
+ export interface ServerCloseEvent {
93
+ status: 'closed' | 'failed';
94
+ }
95
+ export interface ServerEventMap {
96
+ authentication: AuthenticationEvent;
97
+ connection: ServerConnectionEvent;
98
+ 'connection-open': ServerConnectionEvent;
99
+ 'connection-close': ServerConnectionEvent;
100
+ offer: ServerOfferEvent;
101
+ progress: ServerProgressEvent;
102
+ verification: ServerTransferLifecycleEvent;
103
+ commit: ServerTransferLifecycleEvent;
104
+ recovery: RecoveryEvent;
105
+ retention: RetentionEvent;
106
+ failure: FingerprintEvent & {
107
+ reason: ErrorCode;
108
+ };
109
+ listening: ServerListeningEvent;
110
+ close: ServerCloseEvent;
111
+ }
112
+ export type ServerEventName = keyof ServerEventMap;
113
+ export type ServerEvent = ServerEventMap[ServerEventName];
114
+ type SafeLogger = Required<Logger>;
115
+ declare function fingerprint(value: Uint8Array): string;
116
+ /** A static-allowlist direct HyperDHT artifact receiver. */
117
+ export interface Server {
118
+ on<EventName extends ServerEventName>(event: EventName, listener: (event: ServerEventMap[EventName]) => void): this;
119
+ on(event: string | symbol, listener: (...args: never[]) => void): this;
120
+ }
121
+ export declare class Server extends EventEmitter {
122
+ readonly publicKey: PublicKey;
123
+ readonly storageDir: string;
124
+ readonly maxFileBytes: number;
125
+ readonly maxStagingBytes: number;
126
+ readonly maxConnections: number;
127
+ readonly maxActiveUploads: number;
128
+ readonly idleTimeout: number;
129
+ readonly cleanupInterval: number;
130
+ readonly resumeTtl: number;
131
+ readonly minFreeBytes: number;
132
+ readonly maxAge: number | undefined;
133
+ readonly maxStorageBytes: number | undefined;
134
+ readonly artifactPatterns: readonly string[];
135
+ readonly maxCount: number | undefined;
136
+ readonly maxVersions: number | undefined;
137
+ readonly versionGranularity: VersionGranularity | undefined;
138
+ private readonly releaseMatcher;
139
+ private readonly allowedKeySnapshot;
140
+ readonly logger: SafeLogger;
141
+ readonly dht: DirectDhtNode | undefined;
142
+ readonly dhtFactory: DirectDhtFactory | undefined;
143
+ readonly storage: StorageAdapter;
144
+ readonly scheduler: ServerScheduler;
145
+ readonly replaceNames: ReadonlySet<string>;
146
+ readonly hooks: Readonly<ServerHooks>;
147
+ readonly symlinks: readonly CompiledSymlinkRule[];
148
+ readonly linkNames: ReadonlySet<string>;
149
+ private links;
150
+ listening: boolean;
151
+ closed: boolean;
152
+ private readonly keyPair;
153
+ private readonly signal;
154
+ private readonly abort;
155
+ private readonly active;
156
+ private readonly activeUploads;
157
+ /**
158
+ * Transfer IDs this process committed but whose deferred post-commit
159
+ * retention is still owed because `afterCommit` has not yet succeeded. Only
160
+ * these may start a retention pass from an already-committed retry, so an
161
+ * ordinary duplicate offer cannot be used to force repeated full passes.
162
+ * The set is in-memory only and bounded by `MAX_OWED_POST_COMMIT_RETENTION`;
163
+ * a restart or an eviction loses an entry, and the documented fallback is the
164
+ * next startup, scheduled, or commit-triggered pass.
165
+ */
166
+ private readonly pendingAfterCommit;
167
+ /**
168
+ * Authenticated transfer IDs a connection currently owns. One connection
169
+ * holds at most one entry and releases it in a `finally`, so the set is
170
+ * bounded by `maxConnections`. A second connection offering the same
171
+ * transfer is rejected with `FILE_BUSY` rather than running the lifecycle
172
+ * and its hooks concurrently against one staging and commit identity.
173
+ */
174
+ private readonly activeTransfers;
175
+ private readonly receives;
176
+ private layout;
177
+ private sessions;
178
+ private commits;
179
+ private retention;
180
+ private transport;
181
+ private releaseLock;
182
+ private listenPromise;
183
+ private closePromise;
184
+ constructor(options: ServerOptions);
185
+ private artifactKind;
186
+ private payloadBytes;
187
+ private payloadDigest;
188
+ private emitSafe;
189
+ private allowed;
190
+ private transfer;
191
+ private rejectOffer;
192
+ private hookArtifact;
193
+ /**
194
+ * Computes and converges the desired links from durable commit records.
195
+ * Called with the root lease already held.
196
+ */
197
+ private reconcileLinksUnlocked;
198
+ /** Pins link targets when reconciliation fails but retention must continue. */
199
+ private linkPinsFallbackUnlocked;
200
+ /** Reconciles after a durable commit; this is the only caller that leases the root. */
201
+ private reconcileAfterCommit;
202
+ /** Runs a gating callback; only callback exceptions become HOOK_FAILED. */
203
+ private runHook;
204
+ /** Runs onFailure once; its own failure is logged and never replaces the original. */
205
+ private runFailureHook;
206
+ private receive;
207
+ /**
208
+ * Records that a transfer still owes its deferred post-commit retention
209
+ * pass, keeping at most `MAX_OWED_POST_COMMIT_RETENTION` entries.
210
+ *
211
+ * `Set` preserves insertion order, so the oldest owed transfer is evicted
212
+ * first and eviction is deterministic. An evicted transfer loses nothing
213
+ * durable: its artifact is already committed and its rotation falls back to
214
+ * the next startup, scheduled, or commit-triggered pass.
215
+ */
216
+ private owePostCommitRetention;
217
+ /**
218
+ * Runs the post-commit retention pass that a configured `afterCommit` hook
219
+ * deferred, only after that hook succeeded, and then stops owing it. The
220
+ * retention manager already reports its own failures as non-fatal, so
221
+ * nothing here can fail the upload; the pass is attempted exactly once per
222
+ * successful hook, which is why the transfer is cleared either way.
223
+ */
224
+ private settleDeferredRetention;
225
+ /**
226
+ * Retires a committed session without letting cleanup undo a durable commit.
227
+ *
228
+ * The artifact is already published at this point, so a failure to unlink the
229
+ * session leaves recoverable residue that `init()` purges on the next start.
230
+ * Propagating it here would abort before the terminal record and tell the
231
+ * client its upload failed after it had in fact succeeded.
232
+ */
233
+ private retireQuietly;
234
+ private start;
235
+ listen(): Promise<this>;
236
+ private dispose;
237
+ close(): Promise<void>;
238
+ }
239
+ export { DEFAULT_MAX_CONNECTIONS, DEFAULT_MAX_ACTIVE_UPLOADS, DEFAULT_MIN_FREE_BYTES, MAX_CONNECTIONS, MAX_ACTIVE_UPLOADS, FINGERPRINT_LENGTH, fingerprint };