@amalgm/live 0.2.50 → 0.2.52
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/PURPOSE.md +5 -3
- package/dist/contracts/protection.d.ts.map +1 -1
- package/dist/contracts/protection.js +8 -3
- package/dist/contracts/protection.js.map +1 -1
- package/dist/transfer/cargo.d.ts +26 -0
- package/dist/transfer/cargo.d.ts.map +1 -0
- package/dist/transfer/cargo.js +43 -0
- package/dist/transfer/cargo.js.map +1 -0
- package/dist/transfer/index.d.ts +1 -0
- package/dist/transfer/index.d.ts.map +1 -1
- package/dist/transfer/index.js +1 -0
- package/dist/transfer/index.js.map +1 -1
- package/dist-cjs/contracts/protection.js +8 -3
- package/dist-cjs/contracts/protection.js.map +1 -1
- package/dist-cjs/transfer/cargo.js +47 -0
- package/dist-cjs/transfer/cargo.js.map +1 -0
- package/dist-cjs/transfer/index.js +1 -0
- package/dist-cjs/transfer/index.js.map +1 -1
- package/package.json +1 -1
package/PURPOSE.md
CHANGED
|
@@ -190,9 +190,11 @@ its cutover.
|
|
|
190
190
|
Reopening a complete artifact to recreate or repeat an earlier integrity
|
|
191
191
|
proof is redundant work, not additional correctness.
|
|
192
192
|
31. **A content block is not a round trip.** Text and binary retain independent
|
|
193
|
-
content-addressed block identities
|
|
194
|
-
|
|
195
|
-
|
|
193
|
+
content-addressed block identities. Cold upload may move complete small
|
|
194
|
+
artifacts in bounded cargo waves, while cold upload and download move
|
|
195
|
+
adjacent missing blocks in bounded binary batches. Packing may reduce
|
|
196
|
+
transport work but can never weaken per-block verification, durable sealing,
|
|
197
|
+
or commit order.
|
|
196
198
|
32. **A content layout owns a cloud namespace.** A writer change that derives
|
|
197
199
|
different block identities for the same complete bytes advances the
|
|
198
200
|
content contract and storage namespace together. Readers remain additive;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protection.d.ts","sourceRoot":"","sources":["../../src/contracts/protection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,yBAAyB,gDAAgD,CAAC;AACvF,eAAO,MAAM,wBAAwB,aAAa,CAAC;AAEnD,+EAA+E;AAC/E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAOD;;;iBAGiB;AACjB,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"protection.d.ts","sourceRoot":"","sources":["../../src/contracts/protection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,yBAAyB,gDAAgD,CAAC;AACvF,eAAO,MAAM,wBAAwB,aAAa,CAAC;AAEnD,+EAA+E;AAC/E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAOD;;;iBAGiB;AACjB,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,UAAU,CAAC,CA8BrB"}
|
|
@@ -36,9 +36,14 @@ export async function openProtectedEnvelopeBytes(key, bytes, binding) {
|
|
|
36
36
|
const ivStart = MAGIC_BYTES.byteLength;
|
|
37
37
|
const tagStart = ivStart + IV_BYTES;
|
|
38
38
|
const dataStart = tagStart + TAG_BYTES;
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
// Views keep the fetched envelope singular. A full-size block is 16 MiB;
|
|
40
|
+
// copying its ciphertext before constructing WebCrypto's required
|
|
41
|
+
// `ciphertext | tag` input silently multiplies every in-flight block.
|
|
42
|
+
// WebCrypto's TypeScript surface requires an ArrayBuffer-backed view;
|
|
43
|
+
// copying the fixed 12-byte IV satisfies it without copying payload data.
|
|
44
|
+
const iv = new Uint8Array(bytes.subarray(ivStart, tagStart));
|
|
45
|
+
const tag = bytes.subarray(tagStart, dataStart);
|
|
46
|
+
const data = bytes.subarray(dataStart);
|
|
42
47
|
const sealed = new Uint8Array(data.length + tag.length);
|
|
43
48
|
sealed.set(data, 0);
|
|
44
49
|
sealed.set(tag, data.length);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protection.js","sourceRoot":"","sources":["../../src/contracts/protection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG,6CAA6C,CAAC;AACvF,MAAM,CAAC,MAAM,wBAAwB,GAAG,UAAU,CAAC;AASnD,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;AACvE,MAAM,QAAQ,GAAG,EAAE,CAAC;AACpB,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,YAAY,GAAG,WAAW,CAAC,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEnE;;;iBAGiB;AACjB,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,GAAe,EACf,KAAiB,EACjB,OAA0B;IAE1B,IAAI,GAAG,CAAC,UAAU,KAAK,EAAE;QAAE,MAAM,IAAI,eAAe,CAAC,yCAAyC,CAAC,CAAC;IAChG,IAAI,KAAK,CAAC,UAAU,GAAG,YAAY;WAC9B,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,eAAe,CAAC,qCAAqC,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC;QACvC,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;QACpC,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;QACvC,MAAM,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"protection.js","sourceRoot":"","sources":["../../src/contracts/protection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG,6CAA6C,CAAC;AACvF,MAAM,CAAC,MAAM,wBAAwB,GAAG,UAAU,CAAC;AASnD,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;AACvE,MAAM,QAAQ,GAAG,EAAE,CAAC;AACpB,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,YAAY,GAAG,WAAW,CAAC,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEnE;;;iBAGiB;AACjB,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,GAAe,EACf,KAAiB,EACjB,OAA0B;IAE1B,IAAI,GAAG,CAAC,UAAU,KAAK,EAAE;QAAE,MAAM,IAAI,eAAe,CAAC,yCAAyC,CAAC,CAAC;IAChG,IAAI,KAAK,CAAC,UAAU,GAAG,YAAY;WAC9B,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,eAAe,CAAC,qCAAqC,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC;QACvC,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;QACpC,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;QACvC,yEAAyE;QACzE,kEAAkE;QAClE,sEAAsE;QACtE,sEAAsE;QACtE,0EAA0E;QAC1E,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACpB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,cAAc,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAC7C,GAAG,yBAAyB,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAC5F,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QAChG,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACnG,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,eAAe,CAAC,0CAA0C,CAAC,CAAC;IACxE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cargo waves — cold transport of many complete small artifacts.
|
|
3
|
+
*
|
|
4
|
+
* A register journey moves file counts, not just bytes: tens of thousands
|
|
5
|
+
* of small artifacts whose per-artifact negotiation frames would dwarf the
|
|
6
|
+
* payload. A wave carries whole artifacts — every chunk and the manifest
|
|
7
|
+
* identity — so the frame count scales with bytes moved, never with file
|
|
8
|
+
* count. Only artifacts at or below the wave byte bound ride waves; larger
|
|
9
|
+
* artifacts keep per-artifact transfer where chunk reuse pays.
|
|
10
|
+
*/
|
|
11
|
+
export declare const CARGO_WAVE_BYTES: number;
|
|
12
|
+
/** Bounded by the 64KiB binary-frame header law: every artifact declaration
|
|
13
|
+
* (content hash, bytes, chunk list) rides the JSON header, and 256 worst-case
|
|
14
|
+
* declarations stay under the bound with margin. The byte bound, not this
|
|
15
|
+
* count, decides the wave tally on real grounds. */
|
|
16
|
+
export declare const CARGO_WAVE_ARTIFACTS = 256;
|
|
17
|
+
export interface CargoWaveItem {
|
|
18
|
+
readonly bytes: number;
|
|
19
|
+
}
|
|
20
|
+
export interface CargoWave<T extends CargoWaveItem> {
|
|
21
|
+
readonly items: readonly T[];
|
|
22
|
+
readonly bytes: number;
|
|
23
|
+
}
|
|
24
|
+
/** Pack items in order into waves within the byte and artifact bounds. */
|
|
25
|
+
export declare function planCargoWaves<T extends CargoWaveItem>(items: readonly T[]): readonly CargoWave<T>[];
|
|
26
|
+
//# sourceMappingURL=cargo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cargo.d.ts","sourceRoot":"","sources":["../../src/transfer/cargo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,eAAO,MAAM,gBAAgB,QAA4B,CAAC;AAC1D;;;oDAGoD;AACpD,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,aAAa;IAChD,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,CAAC,SAAS,aAAa,EACpD,KAAK,EAAE,SAAS,CAAC,EAAE,GAClB,SAAS,SAAS,CAAC,CAAC,CAAC,EAAE,CAsBzB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cargo waves — cold transport of many complete small artifacts.
|
|
3
|
+
*
|
|
4
|
+
* A register journey moves file counts, not just bytes: tens of thousands
|
|
5
|
+
* of small artifacts whose per-artifact negotiation frames would dwarf the
|
|
6
|
+
* payload. A wave carries whole artifacts — every chunk and the manifest
|
|
7
|
+
* identity — so the frame count scales with bytes moved, never with file
|
|
8
|
+
* count. Only artifacts at or below the wave byte bound ride waves; larger
|
|
9
|
+
* artifacts keep per-artifact transfer where chunk reuse pays.
|
|
10
|
+
*/
|
|
11
|
+
import { FILE_TRANSFER_BATCH_BYTES } from './batches.js';
|
|
12
|
+
export const CARGO_WAVE_BYTES = FILE_TRANSFER_BATCH_BYTES;
|
|
13
|
+
/** Bounded by the 64KiB binary-frame header law: every artifact declaration
|
|
14
|
+
* (content hash, bytes, chunk list) rides the JSON header, and 256 worst-case
|
|
15
|
+
* declarations stay under the bound with margin. The byte bound, not this
|
|
16
|
+
* count, decides the wave tally on real grounds. */
|
|
17
|
+
export const CARGO_WAVE_ARTIFACTS = 256;
|
|
18
|
+
/** Pack items in order into waves within the byte and artifact bounds. */
|
|
19
|
+
export function planCargoWaves(items) {
|
|
20
|
+
const waves = [];
|
|
21
|
+
let current = [];
|
|
22
|
+
let bytes = 0;
|
|
23
|
+
for (const item of items) {
|
|
24
|
+
if (!Number.isSafeInteger(item.bytes) || item.bytes < 0) {
|
|
25
|
+
throw new Error('cargo wave item byte count is invalid');
|
|
26
|
+
}
|
|
27
|
+
if (item.bytes > CARGO_WAVE_BYTES) {
|
|
28
|
+
throw new Error('cargo wave item exceeds the wave byte bound');
|
|
29
|
+
}
|
|
30
|
+
if (current.length > 0
|
|
31
|
+
&& (bytes + item.bytes > CARGO_WAVE_BYTES || current.length >= CARGO_WAVE_ARTIFACTS)) {
|
|
32
|
+
waves.push({ items: current, bytes });
|
|
33
|
+
current = [];
|
|
34
|
+
bytes = 0;
|
|
35
|
+
}
|
|
36
|
+
current.push(item);
|
|
37
|
+
bytes += item.bytes;
|
|
38
|
+
}
|
|
39
|
+
if (current.length > 0)
|
|
40
|
+
waves.push({ items: current, bytes });
|
|
41
|
+
return waves;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=cargo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cargo.js","sourceRoot":"","sources":["../../src/transfer/cargo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,CAAC,MAAM,gBAAgB,GAAG,yBAAyB,CAAC;AAC1D;;;oDAGoD;AACpD,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAWxC,0EAA0E;AAC1E,MAAM,UAAU,cAAc,CAC5B,KAAmB;IAEnB,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,IAAI,OAAO,GAAQ,EAAE,CAAC;IACtB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,GAAG,gBAAgB,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;eACjB,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,gBAAgB,IAAI,OAAO,CAAC,MAAM,IAAI,oBAAoB,CAAC,EAAE,CAAC;YACvF,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACtC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,GAAG,CAAC,CAAC;QACZ,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/transfer/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transfer/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAExD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transfer/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAExD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
|
package/dist/transfer/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transfer/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAExD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transfer/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAExD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
|
|
@@ -41,9 +41,14 @@ async function openProtectedEnvelopeBytes(key, bytes, binding) {
|
|
|
41
41
|
const ivStart = MAGIC_BYTES.byteLength;
|
|
42
42
|
const tagStart = ivStart + IV_BYTES;
|
|
43
43
|
const dataStart = tagStart + TAG_BYTES;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
// Views keep the fetched envelope singular. A full-size block is 16 MiB;
|
|
45
|
+
// copying its ciphertext before constructing WebCrypto's required
|
|
46
|
+
// `ciphertext | tag` input silently multiplies every in-flight block.
|
|
47
|
+
// WebCrypto's TypeScript surface requires an ArrayBuffer-backed view;
|
|
48
|
+
// copying the fixed 12-byte IV satisfies it without copying payload data.
|
|
49
|
+
const iv = new Uint8Array(bytes.subarray(ivStart, tagStart));
|
|
50
|
+
const tag = bytes.subarray(tagStart, dataStart);
|
|
51
|
+
const data = bytes.subarray(dataStart);
|
|
47
52
|
const sealed = new Uint8Array(data.length + tag.length);
|
|
48
53
|
sealed.set(data, 0);
|
|
49
54
|
sealed.set(tag, data.length);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protection.js","sourceRoot":"","sources":["../../src/contracts/protection.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AA4BH,
|
|
1
|
+
{"version":3,"file":"protection.js","sourceRoot":"","sources":["../../src/contracts/protection.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AA4BH,gEAkCC;AA5DY,QAAA,yBAAyB,GAAG,6CAA6C,CAAC;AAC1E,QAAA,wBAAwB,GAAG,UAAU,CAAC;AASnD,MAAa,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AALD,0CAKC;AAED,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,gCAAwB,CAAC,CAAC;AACvE,MAAM,QAAQ,GAAG,EAAE,CAAC;AACpB,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,YAAY,GAAG,WAAW,CAAC,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEnE;;;iBAGiB;AACV,KAAK,UAAU,0BAA0B,CAC9C,GAAe,EACf,KAAiB,EACjB,OAA0B;IAE1B,IAAI,GAAG,CAAC,UAAU,KAAK,EAAE;QAAE,MAAM,IAAI,eAAe,CAAC,yCAAyC,CAAC,CAAC;IAChG,IAAI,KAAK,CAAC,UAAU,GAAG,YAAY;WAC9B,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,eAAe,CAAC,qCAAqC,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC;QACvC,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;QACpC,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;QACvC,yEAAyE;QACzE,kEAAkE;QAClE,sEAAsE;QACtE,sEAAsE;QACtE,0EAA0E;QAC1E,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACpB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,cAAc,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAC7C,GAAG,iCAAyB,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAC5F,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QAChG,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACnG,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,eAAe,CAAC,0CAA0C,CAAC,CAAC;IACxE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cargo waves — cold transport of many complete small artifacts.
|
|
4
|
+
*
|
|
5
|
+
* A register journey moves file counts, not just bytes: tens of thousands
|
|
6
|
+
* of small artifacts whose per-artifact negotiation frames would dwarf the
|
|
7
|
+
* payload. A wave carries whole artifacts — every chunk and the manifest
|
|
8
|
+
* identity — so the frame count scales with bytes moved, never with file
|
|
9
|
+
* count. Only artifacts at or below the wave byte bound ride waves; larger
|
|
10
|
+
* artifacts keep per-artifact transfer where chunk reuse pays.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.CARGO_WAVE_ARTIFACTS = exports.CARGO_WAVE_BYTES = void 0;
|
|
14
|
+
exports.planCargoWaves = planCargoWaves;
|
|
15
|
+
const batches_js_1 = require("./batches.js");
|
|
16
|
+
exports.CARGO_WAVE_BYTES = batches_js_1.FILE_TRANSFER_BATCH_BYTES;
|
|
17
|
+
/** Bounded by the 64KiB binary-frame header law: every artifact declaration
|
|
18
|
+
* (content hash, bytes, chunk list) rides the JSON header, and 256 worst-case
|
|
19
|
+
* declarations stay under the bound with margin. The byte bound, not this
|
|
20
|
+
* count, decides the wave tally on real grounds. */
|
|
21
|
+
exports.CARGO_WAVE_ARTIFACTS = 256;
|
|
22
|
+
/** Pack items in order into waves within the byte and artifact bounds. */
|
|
23
|
+
function planCargoWaves(items) {
|
|
24
|
+
const waves = [];
|
|
25
|
+
let current = [];
|
|
26
|
+
let bytes = 0;
|
|
27
|
+
for (const item of items) {
|
|
28
|
+
if (!Number.isSafeInteger(item.bytes) || item.bytes < 0) {
|
|
29
|
+
throw new Error('cargo wave item byte count is invalid');
|
|
30
|
+
}
|
|
31
|
+
if (item.bytes > exports.CARGO_WAVE_BYTES) {
|
|
32
|
+
throw new Error('cargo wave item exceeds the wave byte bound');
|
|
33
|
+
}
|
|
34
|
+
if (current.length > 0
|
|
35
|
+
&& (bytes + item.bytes > exports.CARGO_WAVE_BYTES || current.length >= exports.CARGO_WAVE_ARTIFACTS)) {
|
|
36
|
+
waves.push({ items: current, bytes });
|
|
37
|
+
current = [];
|
|
38
|
+
bytes = 0;
|
|
39
|
+
}
|
|
40
|
+
current.push(item);
|
|
41
|
+
bytes += item.bytes;
|
|
42
|
+
}
|
|
43
|
+
if (current.length > 0)
|
|
44
|
+
waves.push({ items: current, bytes });
|
|
45
|
+
return waves;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=cargo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cargo.js","sourceRoot":"","sources":["../../src/transfer/cargo.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAqBH,wCAwBC;AA3CD,6CAAyD;AAE5C,QAAA,gBAAgB,GAAG,sCAAyB,CAAC;AAC1D;;;oDAGoD;AACvC,QAAA,oBAAoB,GAAG,GAAG,CAAC;AAWxC,0EAA0E;AAC1E,SAAgB,cAAc,CAC5B,KAAmB;IAEnB,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,IAAI,OAAO,GAAQ,EAAE,CAAC;IACtB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,GAAG,wBAAgB,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;eACjB,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,wBAAgB,IAAI,OAAO,CAAC,MAAM,IAAI,4BAAoB,CAAC,EAAE,CAAC;YACvF,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACtC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,GAAG,CAAC,CAAC;QACZ,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -16,6 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
};
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
__exportStar(require("./artifacts.js"), exports);
|
|
19
|
+
__exportStar(require("./cargo.js"), exports);
|
|
19
20
|
__exportStar(require("./upload.js"), exports);
|
|
20
21
|
__exportStar(require("./download.js"), exports);
|
|
21
22
|
__exportStar(require("./presign.js"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transfer/index.ts"],"names":[],"mappings":";AAAA,wDAAwD;;;;;;;;;;;;;;;;AAExD,iDAA+B;AAC/B,8CAA4B;AAC5B,gDAA8B;AAC9B,+CAA6B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transfer/index.ts"],"names":[],"mappings":";AAAA,wDAAwD;;;;;;;;;;;;;;;;AAExD,iDAA+B;AAC/B,6CAA2B;AAC3B,8CAA4B;AAC5B,gDAA8B;AAC9B,+CAA6B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amalgm/live",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.52",
|
|
4
4
|
"description": "Portable realtime SDK for Amalgm — wire contracts, mutation discipline, and delivery state machines behind host-injected adapters.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist-cjs/index.js",
|