@amalgm/live 0.2.59 → 0.2.61

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.
@@ -2,131 +2,468 @@
2
2
  /**
3
3
  * Download a set of immutable artifacts into a machine cache.
4
4
  *
5
- * The set is the primitive: one plan phase proves every manifest and asks the
6
- * cache which chunks are gaps, one fetch phase obtains every gap across the
7
- * whole set under a single bound, and one seal phase verifies each complete
8
- * artifact. A lone artifact is a set of one there is no second path. This
9
- * shape removes per-artifact serialization: no artifact waits behind
10
- * another's plan or seal, only behind the shared fetch bound. Each chunk is
11
- * still its own storage request the set changes scheduling, not the
12
- * request count.
5
+ * The set is the primitive and the plan is physical. Wave one proves every
6
+ * manifest: locally held ones are checked in place, missing ones are
7
+ * resolved as one want-list and fetched grouped by the pack that holds
8
+ * them. Wave two reads the proven manifests, asks the cache which chunks
9
+ * are gaps, resolves the whole gap list, and fetches it the same way: all
10
+ * members of one pack collapse into a few broad byte spans approximately
11
+ * one read per packwhile standalone objects remain one read each. A
12
+ * lone artifact is a set of one; there is no second download path.
13
13
  *
14
- * Fetches complete in whatever order the network answers, but each artifact
14
+ * Spans complete in whatever order storage answers, but each artifact
15
15
  * stores its chunks in chunk order: a verified chunk waits until every
16
- * earlier gap of the same artifact has been stored. Gaps are admitted round
17
- * robin across artifacts, so one large artifact cannot occupy the whole
18
- * window while unrelated work waits. Held bytes stay inside the in-flight
19
- * byte bound.
16
+ * earlier gap of the same artifact is stored, so a host assembling a
17
+ * whole-file digest never re-reads what landed early. The scheduler admits
18
+ * fetch units strictly in fair plan order, and the plan orders units so a
19
+ * chunk's predecessor always lives in the same or an earlier unit — an
20
+ * artifact whose gaps do not line up ascending inside one pack falls back
21
+ * to per-object reads at its own positions — so ordered stores can never
22
+ * deadlock. Chains enter the plan round-robin by depth, so one multi-chunk
23
+ * artifact cannot monopolize the bounded window while unrelated artifacts
24
+ * wait. In-flight span bytes stay inside one explicit bound; raising request
25
+ * concurrency never silently raises memory.
20
26
  *
21
- * Every chunk keeps one content-addressed identity, whether its sealed
22
- * envelope lives alone or as a byte range inside an immutable pack. The
23
- * host's ports resolve and fetch those identities; parallelism, storage
24
- * layout, transport, and decryption are the host's concern, while the
25
- * verification laws here remain singular.
27
+ * Every object keeps one content-addressed identity whether its sealed
28
+ * envelope lives alone or as a byte range inside an immutable pack, and
29
+ * placement is immutable: a retried read may refresh its URL but never its
30
+ * geometry. Wrong or shifted bytes cannot leak every dispensed slice is
31
+ * still an authenticated envelope the host opens and this engine
32
+ * hash-verifies before a single byte is stored.
26
33
  */
27
34
  Object.defineProperty(exports, "__esModule", { value: true });
28
35
  exports.downloadAll = downloadAll;
29
- exports.download = download;
30
36
  const content_js_1 = require("../contracts/content.js");
31
37
  const artifacts_js_1 = require("./artifacts.js");
32
38
  const parallel_js_1 = require("./parallel.js");
39
+ const ranges_js_1 = require("./ranges.js");
40
+ const refs_js_1 = require("./refs.js");
41
+ /** Partition one concurrent phase by active work rather than summing
42
+ * overlapping operation durations. Counts, rather than booleans, keep a bit
43
+ * active until the last concurrent operation of that kind settles. */
44
+ class BlockActivityClock {
45
+ counts = [0, 0, 0];
46
+ totals = Array.from({ length: 8 }, () => 0);
47
+ state = 0;
48
+ changedAt = performance.now();
49
+ async time(activity, work) {
50
+ const bit = activity === 'network' ? 0 : activity === 'transform' ? 1 : 2;
51
+ this.transition(bit, 1);
52
+ try {
53
+ return await work();
54
+ }
55
+ finally {
56
+ this.transition(bit, -1);
57
+ }
58
+ }
59
+ timeSync(activity, work) {
60
+ const bit = activity === 'network' ? 0 : activity === 'transform' ? 1 : 2;
61
+ this.transition(bit, 1);
62
+ try {
63
+ return work();
64
+ }
65
+ finally {
66
+ this.transition(bit, -1);
67
+ }
68
+ }
69
+ report() {
70
+ this.record(performance.now());
71
+ const rounded = this.totals.map((duration) => Math.round(duration));
72
+ return {
73
+ blockNeitherMs: rounded[0] ?? 0,
74
+ blockNetworkOnlyMs: rounded[1] ?? 0,
75
+ blockTransformOnlyMs: rounded[2] ?? 0,
76
+ blockStoreOnlyMs: rounded[4] ?? 0,
77
+ blockNetworkTransformMs: rounded[3] ?? 0,
78
+ blockNetworkStoreMs: rounded[5] ?? 0,
79
+ blockTransformStoreMs: rounded[6] ?? 0,
80
+ blockAllActiveMs: rounded[7] ?? 0,
81
+ };
82
+ }
83
+ transition(bit, delta) {
84
+ const now = performance.now();
85
+ this.record(now);
86
+ const next = (this.counts[bit] ?? 0) + delta;
87
+ if (next < 0)
88
+ throw new Error('download activity clock lost an operation');
89
+ this.counts[bit] = next;
90
+ this.state = this.counts.reduce((mask, count, index) => count > 0 ? mask | (1 << index) : mask, 0);
91
+ }
92
+ record(now) {
93
+ this.totals[this.state] = (this.totals[this.state] ?? 0) + (now - this.changedAt);
94
+ this.changedAt = now;
95
+ }
96
+ }
97
+ function checkRefLocation(ref, object) {
98
+ if (ref === undefined || typeof ref.url !== 'string' || ref.url.length === 0) {
99
+ throw new Error(`content ref for ${object.kind} ${object.sha256} named no location`);
100
+ }
101
+ if ((ref.offset === undefined) !== (ref.length === undefined)) {
102
+ throw new Error(`content ref for ${object.kind} ${object.sha256} named half a byte range`);
103
+ }
104
+ if (ref.offset === undefined || ref.length === undefined)
105
+ return { url: ref.url, span: null };
106
+ if (!Number.isSafeInteger(ref.offset) || ref.offset < 0
107
+ || !Number.isSafeInteger(ref.length) || ref.length < 1) {
108
+ throw new Error(`content ref for ${object.kind} ${object.sha256} named an invalid byte range`);
109
+ }
110
+ return { url: ref.url, span: { offset: ref.offset, length: ref.length } };
111
+ }
112
+ /** Resolve one wave's want-list and fetch it as planned units: pack members
113
+ * as broad spans, standalone objects whole. Deadlock-frame law: dependencies
114
+ * only run backward along a chain, chains join pack grouping only when their
115
+ * refs ascend inside one pack, a pack's spans stay contiguous in ascending
116
+ * offset order, and admission is strictly FIFO — so a chunk's predecessor is
117
+ * always in the same unit earlier, or in an already-admitted one. */
118
+ async function fetchWave(ports, chains, concurrency, maxInFlightBytes) {
119
+ // Fair admission is part of the set law: take one dependency depth from
120
+ // every artifact before taking the next. This preserves predecessor-first
121
+ // ordering within each chain without letting one large artifact occupy the
122
+ // whole byte window while unrelated work waits.
123
+ const flat = [];
124
+ const maxDepth = chains.reduce((maximum, chain) => Math.max(maximum, chain.length), 0);
125
+ for (let depth = 0; depth < maxDepth; depth += 1) {
126
+ chains.forEach((items, chain) => {
127
+ const item = items[depth];
128
+ if (item !== undefined)
129
+ flat.push({ chain, item });
130
+ });
131
+ }
132
+ if (flat.length === 0)
133
+ return { rangedReads: 0, packedObjects: 0, standaloneObjects: 0 };
134
+ const refs = await (0, refs_js_1.resolveContentRefs)(ports, flat.map(({ item }) => item.object));
135
+ const byChain = chains.map(() => []);
136
+ flat.forEach(({ chain, item }, order) => {
137
+ const members = byChain[chain];
138
+ if (members === undefined)
139
+ throw new Error('download wave lost a chain');
140
+ members.push({ item, order, ...checkRefLocation(refs[order], item.object) });
141
+ });
142
+ // A chain rides pack grouping only when every gap sits in one pack with
143
+ // non-descending offsets; anything else falls back to per-object reads so
144
+ // store order can never depend on a later fetch unit.
145
+ const groups = new Map();
146
+ const singles = [];
147
+ for (const chain of byChain) {
148
+ const first = chain[0];
149
+ if (first === undefined)
150
+ continue;
151
+ const coherent = chain.every((member, index) => {
152
+ if (member.span === null || member.url !== first.url)
153
+ return false;
154
+ const previous = chain[index - 1];
155
+ return previous?.span == null || member.span.offset >= previous.span.offset;
156
+ });
157
+ if (!coherent) {
158
+ singles.push(...chain);
159
+ continue;
160
+ }
161
+ const members = groups.get(first.url);
162
+ if (members === undefined)
163
+ groups.set(first.url, [...chain]);
164
+ else
165
+ members.push(...chain);
166
+ }
167
+ const units = [];
168
+ let packedObjects = 0;
169
+ let standaloneObjects = 0;
170
+ for (const members of groups.values()) {
171
+ packedObjects += members.length;
172
+ members.sort((a, b) => (a.span?.offset ?? 0) - (b.span?.offset ?? 0) || a.order - b.order);
173
+ const spans = members.map((member) => {
174
+ if (member.span === null)
175
+ throw new Error('download wave grouped a standalone object');
176
+ return member.span;
177
+ });
178
+ const plan = (0, ranges_js_1.planPackSpans)(spans, ranges_js_1.RANGE_MERGE_GAP_BYTES, maxInFlightBytes);
179
+ const perSpan = plan.spans.map(() => []);
180
+ members.forEach((member, index) => {
181
+ const spanIndex = plan.memberSpan[index];
182
+ const list = spanIndex === undefined ? undefined : perSpan[spanIndex];
183
+ if (list === undefined)
184
+ throw new Error('download wave lost a span member');
185
+ list.push(member);
186
+ });
187
+ const primary = members.reduce((least, member) => Math.min(least, member.order), Number.MAX_SAFE_INTEGER);
188
+ plan.spans.forEach((span, index) => {
189
+ const list = perSpan[index];
190
+ const anchor = list?.[0];
191
+ if (list === undefined || anchor === undefined) {
192
+ throw new Error('download wave planned an empty span');
193
+ }
194
+ units.push({
195
+ url: anchor.url,
196
+ span,
197
+ members: list.map((member) => {
198
+ if (member.span === null)
199
+ throw new Error('download wave grouped a standalone object');
200
+ return {
201
+ item: member.item,
202
+ offset: member.span.offset - span.offset,
203
+ length: member.span.length,
204
+ };
205
+ }),
206
+ refresh: anchor,
207
+ weight: Math.min(span.length, maxInFlightBytes),
208
+ primary,
209
+ secondary: index,
210
+ ranged: true,
211
+ });
212
+ });
213
+ }
214
+ for (const member of singles) {
215
+ if (member.span !== null) {
216
+ packedObjects += 1;
217
+ units.push({
218
+ url: member.url,
219
+ span: member.span,
220
+ members: [{ item: member.item, offset: 0, length: member.span.length }],
221
+ refresh: member,
222
+ weight: Math.min(member.span.length, maxInFlightBytes),
223
+ primary: member.order,
224
+ secondary: 0,
225
+ ranged: true,
226
+ });
227
+ }
228
+ else {
229
+ standaloneObjects += 1;
230
+ units.push({
231
+ url: member.url,
232
+ span: null,
233
+ members: [{ item: member.item, offset: 0, length: null }],
234
+ refresh: member,
235
+ weight: Math.max(1, Math.min(member.item.standaloneWeight, maxInFlightBytes)),
236
+ primary: member.order,
237
+ secondary: 0,
238
+ ranged: false,
239
+ });
240
+ }
241
+ }
242
+ units.sort((a, b) => a.primary - b.primary || a.secondary - b.secondary);
243
+ await (0, parallel_js_1.weightedParallelForEach)(units, concurrency, maxInFlightBytes, (unit) => unit.weight, async (unit) => {
244
+ let delivered = 0;
245
+ try {
246
+ const refresh = async () => {
247
+ const [fresh] = await ports.requestRefs([unit.refresh.item.object]);
248
+ const location = checkRefLocation(fresh, unit.refresh.item.object);
249
+ const before = unit.refresh.span;
250
+ const moved = (location.span === null) !== (before === null)
251
+ || (location.span !== null && before !== null
252
+ && (location.span.offset !== before.offset
253
+ || location.span.length !== before.length));
254
+ if (moved) {
255
+ throw new Error(`content ${unit.refresh.item.object.kind} `
256
+ + `${unit.refresh.item.object.sha256} changed placement between fetch attempts`);
257
+ }
258
+ return location.url;
259
+ };
260
+ const bytes = await ports.fetchSpan(unit.url, unit.span, refresh);
261
+ if (!(bytes instanceof Uint8Array))
262
+ throw new Error('storage fetch answered no bytes');
263
+ if (unit.span !== null && bytes.byteLength !== unit.span.length) {
264
+ throw new Error('storage fetch answered the wrong byte count');
265
+ }
266
+ for (const member of unit.members) {
267
+ const sealed = member.length === null
268
+ ? bytes
269
+ : bytes.subarray(member.offset, member.offset + member.length);
270
+ if (member.length !== null && sealed.byteLength !== member.length) {
271
+ throw new Error('storage span cannot cover a planned member');
272
+ }
273
+ await member.item.deliver(sealed);
274
+ delivered += 1;
275
+ }
276
+ }
277
+ catch (error) {
278
+ for (const member of unit.members.slice(delivered))
279
+ member.item.fail(error);
280
+ throw error;
281
+ }
282
+ });
283
+ return {
284
+ rangedReads: units.reduce((count, unit) => count + (unit.ranged ? 1 : 0), 0),
285
+ packedObjects,
286
+ standaloneObjects,
287
+ };
288
+ }
33
289
  /** Download a set of immutable artifacts, fetching only machine-cache gaps.
34
290
  * Receipts return in input order; any failure fails the whole set after
35
291
  * letting in-flight effects settle. */
36
292
  async function downloadAll(artifacts, ports, options = {}) {
293
+ const downloadStarted = performance.now();
37
294
  const concurrency = options.concurrency ?? parallel_js_1.DEFAULT_TRANSFER_CONCURRENCY;
38
295
  const maxInFlightBytes = options.maxInFlightBytes
39
296
  ?? parallel_js_1.DEFAULT_TRANSFER_CONCURRENCY * content_js_1.CHUNK_BYTES;
40
297
  for (const artifact of artifacts)
41
298
  (0, artifacts_js_1.assertTransferArtifact)(artifact);
42
- const plans = new Array(artifacts.length);
299
+ // Wave one: prove every manifest. Held manifests are checked in place;
300
+ // missing ones fetch as one planned wave grouped by pack.
301
+ const manifestPhaseStarted = performance.now();
302
+ const manifests = new Array(artifacts.length);
303
+ let localManifests = 0;
304
+ const manifestChains = [];
305
+ artifacts.forEach((artifact, slot) => {
306
+ const local = ports.localManifest(artifact);
307
+ if (local !== null && local !== undefined) {
308
+ const checked = (0, content_js_1.checkContentManifest)(local, artifact.contentHash);
309
+ if (!checked.ok)
310
+ throw new Error(checked.error);
311
+ manifests[slot] = checked.value;
312
+ localManifests += 1;
313
+ return;
314
+ }
315
+ const object = { kind: 'manifest', sha256: artifact.contentHash };
316
+ manifestChains.push([{
317
+ object,
318
+ standaloneWeight: 1,
319
+ deliver: async (sealed) => {
320
+ const plain = await ports.openEnvelope(object, sealed);
321
+ let parsed;
322
+ try {
323
+ parsed = JSON.parse(new TextDecoder().decode(plain));
324
+ }
325
+ catch {
326
+ throw new Error(`downloaded manifest for ${artifact.contentHash} is not valid JSON`);
327
+ }
328
+ const checked = (0, content_js_1.checkContentManifest)(parsed, artifact.contentHash);
329
+ if (!checked.ok)
330
+ throw new Error(checked.error);
331
+ manifests[slot] = checked.value;
332
+ await ports.manifestProven(artifact, checked.value);
333
+ },
334
+ fail: () => { },
335
+ }]);
336
+ });
337
+ const manifestWave = await fetchWave(ports, manifestChains, concurrency, maxInFlightBytes);
338
+ const manifestPhaseMs = performance.now() - manifestPhaseStarted;
339
+ // Ask the cache which chunks are gaps, now that every manifest is proven.
340
+ const gapCheckStarted = performance.now();
341
+ const gaps = new Array(artifacts.length);
43
342
  await (0, parallel_js_1.parallelForEach)([...artifacts.keys()], concurrency, async (slot) => {
44
343
  const artifact = artifacts[slot];
45
- if (artifact === undefined)
46
- return;
47
- const checked = (0, content_js_1.checkContentManifest)(await ports.getManifest(artifact), artifact.contentHash);
48
- if (!checked.ok)
49
- throw new Error(checked.error);
50
- const manifest = checked.value;
344
+ const manifest = manifests[slot];
345
+ if (artifact === undefined || manifest === undefined) {
346
+ throw new Error('download set lost a manifest');
347
+ }
51
348
  const missing = [];
52
349
  for (const index of manifest.chunks.keys()) {
53
350
  if (!await ports.hasChunk(artifact, manifest, index))
54
351
  missing.push(index);
55
352
  }
56
- plans[slot] = { artifact, manifest, missing };
353
+ gaps[slot] = missing;
57
354
  });
58
- const gaps = [];
59
- const priorByPlan = new Map();
60
- const maxGaps = plans.reduce((maximum, plan) => Math.max(maximum, plan?.missing.length ?? 0), 0);
61
- for (let depth = 0; depth < maxGaps; depth += 1) {
62
- for (const plan of plans) {
63
- if (plan === undefined)
64
- continue;
65
- const index = plan.missing[depth];
66
- if (index === undefined)
67
- continue;
355
+ const gapCheckMs = performance.now() - gapCheckStarted;
356
+ // Wave two: fetch every gap as one planned wave. Each artifact's gaps form
357
+ // one chain so chunks store in chunk order; `delivered` settles when a gap
358
+ // is stored, or rejects so no later chunk waits forever.
359
+ const blockPhaseStarted = performance.now();
360
+ const blockActivity = new BlockActivityClock();
361
+ const blockChains = [];
362
+ artifacts.forEach((artifact, slot) => {
363
+ const manifest = manifests[slot];
364
+ const missing = gaps[slot];
365
+ if (manifest === undefined || missing === undefined || missing.length === 0)
366
+ return;
367
+ let prior;
368
+ const chain = [];
369
+ for (const index of missing) {
370
+ const expected = manifest.chunks[index];
371
+ if (expected === undefined)
372
+ throw new Error('download manifest named an unknown chunk index');
68
373
  let stored;
69
374
  let failed;
70
375
  const delivered = new Promise((resolve, reject) => {
71
376
  stored = resolve;
72
377
  failed = reject;
73
378
  });
74
- // A failed effect may leave no later chunk admitted to observe the
75
- // rejection; the set still fails through the effect's own throw.
379
+ // A failed unit may leave no later chunk admitted to observe the
380
+ // rejection; the set still fails through the unit's own throw.
76
381
  delivered.catch(() => { });
77
- gaps.push({ plan, index, priorStored: priorByPlan.get(plan), stored, failed });
78
- priorByPlan.set(plan, delivered);
79
- }
80
- }
81
- await (0, parallel_js_1.weightedParallelForEach)(gaps, concurrency, maxInFlightBytes, ({ plan, index }) => plan.manifest.chunks[index]?.bytes ?? 0, async ({ plan, index, priorStored, stored, failed }) => {
82
- try {
83
- const expected = plan.manifest.chunks[index];
84
- if (expected === undefined)
85
- throw new Error('download manifest named an unknown chunk index');
86
- const bytes = await ports.getChunk(plan.artifact, plan.manifest, index);
87
- if (!(bytes instanceof Uint8Array)
88
- || bytes.byteLength !== expected.bytes
89
- || ports.sha256Hex(bytes) !== expected.sha256) {
90
- throw new Error(`downloaded content chunk ${index} failed verification`);
91
- }
92
- if (priorStored !== undefined)
93
- await priorStored;
94
- await ports.putChunk(plan.artifact, plan.manifest, index, bytes);
95
- stored();
96
- }
97
- catch (error) {
98
- failed(error);
99
- throw error;
382
+ const priorStored = prior;
383
+ chain.push({
384
+ object: { kind: 'block', sha256: expected.sha256 },
385
+ standaloneWeight: expected.bytes,
386
+ deliver: async (sealed) => {
387
+ try {
388
+ const plain = await blockActivity.time('transform', async () => {
389
+ const opened = await ports.openEnvelope({ kind: 'block', sha256: expected.sha256 }, sealed);
390
+ if (!(opened instanceof Uint8Array)
391
+ || opened.byteLength !== expected.bytes
392
+ || ports.sha256Hex(opened) !== expected.sha256) {
393
+ throw new Error(`downloaded content chunk ${index} failed verification`);
394
+ }
395
+ return opened;
396
+ });
397
+ if (priorStored !== undefined)
398
+ await priorStored;
399
+ await blockActivity.time('store', () => ports.putChunk(artifact, manifest, index, plain));
400
+ stored();
401
+ }
402
+ catch (error) {
403
+ failed(error);
404
+ throw error;
405
+ }
406
+ },
407
+ fail: failed,
408
+ });
409
+ prior = delivered;
100
410
  }
411
+ blockChains.push(chain);
101
412
  });
413
+ const blockWave = await fetchWave({
414
+ requestRefs: (objects) => blockActivity.time('network', () => ports.requestRefs(objects)),
415
+ fetchSpan: (url, span, refresh) => blockActivity.time('network', () => ports.fetchSpan(url, span, refresh)),
416
+ }, blockChains, concurrency, maxInFlightBytes);
417
+ const blockActivityReport = blockActivity.report();
418
+ const blockPhaseMs = performance.now() - blockPhaseStarted;
419
+ const sealPassStarted = performance.now();
102
420
  const receipts = new Array(artifacts.length);
103
- await (0, parallel_js_1.parallelForEach)([...plans.keys()], concurrency, async (slot) => {
104
- const plan = plans[slot];
105
- if (plan === undefined)
106
- return;
107
- const sealed = await ports.sealArtifact(plan.artifact, plan.manifest);
108
- if (sealed.bytes !== plan.manifest.bytes || sealed.contentHash !== plan.manifest.contentHash) {
109
- throw new Error(`downloaded artifact ${plan.artifact.contentHash} failed verification`);
421
+ await (0, parallel_js_1.parallelForEach)([...artifacts.keys()], concurrency, async (slot) => {
422
+ const artifact = artifacts[slot];
423
+ const manifest = manifests[slot];
424
+ const missing = gaps[slot];
425
+ if (artifact === undefined || manifest === undefined || missing === undefined) {
426
+ throw new Error('download set lost a manifest');
427
+ }
428
+ const sealed = await ports.sealArtifact(artifact, manifest);
429
+ if (sealed.bytes !== manifest.bytes || sealed.contentHash !== manifest.contentHash) {
430
+ throw new Error(`downloaded artifact ${artifact.contentHash} failed verification`);
110
431
  }
111
432
  receipts[slot] = {
112
- artifact: plan.artifact,
113
- manifest: plan.manifest,
433
+ artifact,
434
+ manifest,
114
435
  local: sealed.local,
115
- downloadedChunks: plan.missing.length,
116
- reusedChunks: plan.manifest.chunks.length - plan.missing.length,
436
+ downloadedChunks: missing.length,
437
+ reusedChunks: manifest.chunks.length - missing.length,
117
438
  };
118
439
  });
119
- return receipts.map((receipt) => {
440
+ const sealPassMs = performance.now() - sealPassStarted;
441
+ const orderedReceipts = receipts.map((receipt) => {
120
442
  if (receipt === undefined)
121
443
  throw new Error('download set lost an artifact receipt');
122
444
  return receipt;
123
445
  });
124
- }
125
- /** Download one immutable artifact a set of one. */
126
- async function download(artifact, ports, options = {}) {
127
- const [receipt] = await downloadAll([artifact], ports, options);
128
- if (receipt === undefined)
129
- throw new Error('download set lost an artifact receipt');
130
- return receipt;
446
+ const downloadTotalMs = performance.now() - downloadStarted;
447
+ const orchestrationMs = Math.max(0, downloadTotalMs - manifestPhaseMs - gapCheckMs - blockPhaseMs - sealPassMs);
448
+ return {
449
+ receipts: orderedReceipts,
450
+ shape: {
451
+ localManifests,
452
+ fetchedManifests: manifestChains.length,
453
+ packedManifests: manifestWave.packedObjects,
454
+ standaloneManifests: manifestWave.standaloneObjects,
455
+ manifestSpans: manifestWave.rangedReads,
456
+ packedBlocks: blockWave.packedObjects,
457
+ standaloneBlocks: blockWave.standaloneObjects,
458
+ blockSpans: blockWave.rangedReads,
459
+ manifestPhaseMs: Math.round(manifestPhaseMs),
460
+ gapCheckMs: Math.round(gapCheckMs),
461
+ blockPhaseMs: Math.round(blockPhaseMs),
462
+ sealPassMs: Math.round(sealPassMs),
463
+ orchestrationMs: Math.round(orchestrationMs),
464
+ downloadTotalMs: Math.round(downloadTotalMs),
465
+ ...blockActivityReport,
466
+ },
467
+ };
131
468
  }
132
469
  //# sourceMappingURL=download.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/transfer/download.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/transfer/download.ts"],"names":[],"mappings":"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"}