@amalgm/live 0.2.9 → 0.2.11
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 -0
- package/dist/contracts/content.d.ts +11 -6
- package/dist/contracts/content.d.ts.map +1 -1
- package/dist/contracts/content.js +24 -9
- package/dist/contracts/content.js.map +1 -1
- package/dist/transfer/artifacts.d.ts +3 -0
- package/dist/transfer/artifacts.d.ts.map +1 -1
- package/dist/transfer/artifacts.js +25 -4
- package/dist/transfer/artifacts.js.map +1 -1
- package/dist/transfer/download.d.ts +1 -1
- package/dist/transfer/download.d.ts.map +1 -1
- package/dist/transfer/download.js +2 -0
- package/dist/transfer/download.js.map +1 -1
- package/dist/transfer/upload.d.ts +1 -1
- package/dist/transfer/upload.d.ts.map +1 -1
- package/dist/transfer/upload.js +31 -3
- package/dist/transfer/upload.js.map +1 -1
- package/package.json +1 -1
package/PURPOSE.md
CHANGED
|
@@ -127,6 +127,11 @@ its cutover.
|
|
|
127
127
|
only objects the prior state cannot supply; download follows and imports
|
|
128
128
|
only the missing links, oldest first. A one-file commit can never cause the
|
|
129
129
|
previously uploaded repository history to travel again.
|
|
130
|
+
27. **Registered type selects transfer.** Upload and download dispatch only
|
|
131
|
+
from the registered entity type according to `docs/transfer.md`. They
|
|
132
|
+
never re-detect type from a path or contents. Graph-only types perform no
|
|
133
|
+
content effects; text and binary files use the same block law; Git alone
|
|
134
|
+
uses Git object negotiation.
|
|
130
135
|
|
|
131
136
|
## Five surfaces, one behavior
|
|
132
137
|
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Content manifests — the wire shape of immutable entity bytes.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* manifest
|
|
6
|
-
* `amalgm-entity-content@1`). Every writer derives the same manifest from
|
|
4
|
+
* An entity artifact travels as bounded, content-addressed blocks named by a
|
|
5
|
+
* manifest. Every writer derives the same manifest from
|
|
7
6
|
* the same bytes, so manifests are idempotent facts, never negotiations.
|
|
8
7
|
*
|
|
9
8
|
* The chunk rule is `bytes <= CHUNK_BYTES`, never an exact size — older,
|
|
@@ -11,9 +10,12 @@
|
|
|
11
10
|
* host effects; this file owns the shape and its laws.
|
|
12
11
|
*/
|
|
13
12
|
import { type Checked } from './validate.js';
|
|
14
|
-
export declare const CONTENT_CONTRACT = "amalgm-entity-content@
|
|
15
|
-
|
|
13
|
+
export declare const CONTENT_CONTRACT = "amalgm-entity-content@2";
|
|
14
|
+
export declare const MIN_CONTENT_BLOCK_BYTES: number;
|
|
15
|
+
export declare const MAX_CONTENT_BLOCK_BYTES: number;
|
|
16
|
+
/** Maximum accepted block size. Kept as the public manifest-bound name. */
|
|
16
17
|
export declare const CHUNK_BYTES: number;
|
|
18
|
+
export declare const MAX_CONTENT_BLOCKS = 2000;
|
|
17
19
|
export interface ContentChunk {
|
|
18
20
|
readonly sha256: string;
|
|
19
21
|
readonly bytes: number;
|
|
@@ -37,6 +39,9 @@ export declare function checkContentManifest(input: unknown, expectedHash?: stri
|
|
|
37
39
|
* hand-built manifest cannot drift from the derivation rule.
|
|
38
40
|
*/
|
|
39
41
|
export declare function manifestFromChunks(contentHash: string, chunks: readonly ContentChunk[]): Checked<ContentManifest>;
|
|
40
|
-
/**
|
|
42
|
+
/** Syncthing's adaptive fixed-block rule: the smallest power of two that
|
|
43
|
+
* keeps the manifest at no more than 2,000 blocks, capped at 16 MiB. */
|
|
44
|
+
export declare function contentBlockSize(totalBytes: number): number;
|
|
45
|
+
/** Split a byte count into adaptive full blocks, then the remainder. */
|
|
41
46
|
export declare function chunkSizes(totalBytes: number): number[];
|
|
42
47
|
//# sourceMappingURL=content.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/contracts/content.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/contracts/content.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,KAAK,OAAO,EAAwB,MAAM,eAAe,CAAC;AAEnE,eAAO,MAAM,gBAAgB,4BAA4B,CAAC;AAE1D,eAAO,MAAM,uBAAuB,QAAa,CAAC;AAClD,eAAO,MAAM,uBAAuB,QAAmB,CAAC;AACxD,2EAA2E;AAC3E,eAAO,MAAM,WAAW,QAA0B,CAAC;AACnD,eAAO,MAAM,kBAAkB,OAAQ,CAAC;AAIxC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,OAAO,gBAAgB,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;CAC1C;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,GAAE,MAAM,GAAG,IAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CAmCjH;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,SAAS,YAAY,EAAE,GAC9B,OAAO,CAAC,eAAe,CAAC,CAK1B;AAED;wEACwE;AACxE,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAO3D;AAED,wEAAwE;AACxE,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAQvD"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Content manifests — the wire shape of immutable entity bytes.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* manifest
|
|
6
|
-
* `amalgm-entity-content@1`). Every writer derives the same manifest from
|
|
4
|
+
* An entity artifact travels as bounded, content-addressed blocks named by a
|
|
5
|
+
* manifest. Every writer derives the same manifest from
|
|
7
6
|
* the same bytes, so manifests are idempotent facts, never negotiations.
|
|
8
7
|
*
|
|
9
8
|
* The chunk rule is `bytes <= CHUNK_BYTES`, never an exact size — older,
|
|
@@ -11,9 +10,12 @@
|
|
|
11
10
|
* host effects; this file owns the shape and its laws.
|
|
12
11
|
*/
|
|
13
12
|
import { pass, fail, isRecord } from './validate.js';
|
|
14
|
-
export const CONTENT_CONTRACT = 'amalgm-entity-content@
|
|
15
|
-
|
|
16
|
-
export const
|
|
13
|
+
export const CONTENT_CONTRACT = 'amalgm-entity-content@2';
|
|
14
|
+
export const MIN_CONTENT_BLOCK_BYTES = 128 * 1024;
|
|
15
|
+
export const MAX_CONTENT_BLOCK_BYTES = 16 * 1024 * 1024;
|
|
16
|
+
/** Maximum accepted block size. Kept as the public manifest-bound name. */
|
|
17
|
+
export const CHUNK_BYTES = MAX_CONTENT_BLOCK_BYTES;
|
|
18
|
+
export const MAX_CONTENT_BLOCKS = 2_000;
|
|
17
19
|
const HASH = /^[0-9a-f]{64}$/;
|
|
18
20
|
/**
|
|
19
21
|
* Validate and normalize a manifest. The laws, in conviction order:
|
|
@@ -29,6 +31,7 @@ export function checkContentManifest(input, expectedHash = null) {
|
|
|
29
31
|
!Number.isSafeInteger(input.bytes) ||
|
|
30
32
|
input.bytes < 0 ||
|
|
31
33
|
!Array.isArray(input.chunks) ||
|
|
34
|
+
input.chunks.length > MAX_CONTENT_BLOCKS ||
|
|
32
35
|
input.chunks.some((chunk) => !isRecord(chunk) ||
|
|
33
36
|
!HASH.test(String(chunk.sha256 ?? '')) ||
|
|
34
37
|
!Number.isSafeInteger(chunk.bytes) ||
|
|
@@ -59,13 +62,25 @@ export function checkContentManifest(input, expectedHash = null) {
|
|
|
59
62
|
export function manifestFromChunks(contentHash, chunks) {
|
|
60
63
|
return checkContentManifest({ contract: CONTENT_CONTRACT, contentHash, bytes: chunks.reduce((t, c) => t + c.bytes, 0), chunks }, contentHash);
|
|
61
64
|
}
|
|
62
|
-
/**
|
|
65
|
+
/** Syncthing's adaptive fixed-block rule: the smallest power of two that
|
|
66
|
+
* keeps the manifest at no more than 2,000 blocks, capped at 16 MiB. */
|
|
67
|
+
export function contentBlockSize(totalBytes) {
|
|
68
|
+
if (!Number.isSafeInteger(totalBytes) || totalBytes < 0)
|
|
69
|
+
return MIN_CONTENT_BLOCK_BYTES;
|
|
70
|
+
let bytes = MIN_CONTENT_BLOCK_BYTES;
|
|
71
|
+
while (Math.ceil(totalBytes / bytes) > MAX_CONTENT_BLOCKS && bytes < MAX_CONTENT_BLOCK_BYTES) {
|
|
72
|
+
bytes *= 2;
|
|
73
|
+
}
|
|
74
|
+
return bytes;
|
|
75
|
+
}
|
|
76
|
+
/** Split a byte count into adaptive full blocks, then the remainder. */
|
|
63
77
|
export function chunkSizes(totalBytes) {
|
|
64
78
|
if (!Number.isSafeInteger(totalBytes) || totalBytes < 0)
|
|
65
79
|
return [];
|
|
80
|
+
const blockBytes = contentBlockSize(totalBytes);
|
|
66
81
|
const sizes = [];
|
|
67
|
-
for (let remaining = totalBytes; remaining > 0; remaining -=
|
|
68
|
-
sizes.push(Math.min(remaining,
|
|
82
|
+
for (let remaining = totalBytes; remaining > 0; remaining -= blockBytes) {
|
|
83
|
+
sizes.push(Math.min(remaining, blockBytes));
|
|
69
84
|
}
|
|
70
85
|
return sizes;
|
|
71
86
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/contracts/content.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/contracts/content.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,9 @@ export interface TransferArtifact {
|
|
|
14
14
|
readonly kind: ArtifactKind;
|
|
15
15
|
readonly contentHash: string;
|
|
16
16
|
}
|
|
17
|
+
/** Registration's type is the only transfer selector. */
|
|
18
|
+
export declare function artifactKindForType(type: EntityType): ArtifactKind | null;
|
|
19
|
+
export declare function assertTransferArtifact(artifact: TransferArtifact): void;
|
|
17
20
|
/**
|
|
18
21
|
* Select the one immutable artifact carried by a cloud entity record.
|
|
19
22
|
* Deleted records are tombstones. A not-yet-captured leaf has no artifact yet.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/transfer/artifacts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIvD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,gBAAgB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/transfer/artifacts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIvD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,yDAAyD;AACzD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAczE;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAKvE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,gBAAgB,GAAG,IAAI,CAiCpF"}
|
|
@@ -6,6 +6,28 @@
|
|
|
6
6
|
* no independent byte artifact: their portable state is already in the graph.
|
|
7
7
|
*/
|
|
8
8
|
const CONTENT_HEAD = /^[0-9a-f]{64}$/;
|
|
9
|
+
/** Registration's type is the only transfer selector. */
|
|
10
|
+
export function artifactKindForType(type) {
|
|
11
|
+
switch (type) {
|
|
12
|
+
case 'file.text':
|
|
13
|
+
case 'file.binary':
|
|
14
|
+
return 'file';
|
|
15
|
+
case 'link':
|
|
16
|
+
return 'link';
|
|
17
|
+
case 'repo.git':
|
|
18
|
+
return 'git';
|
|
19
|
+
case 'workspace':
|
|
20
|
+
case 'folder':
|
|
21
|
+
case 'reference':
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function assertTransferArtifact(artifact) {
|
|
26
|
+
const expected = artifactKindForType(artifact.entityType);
|
|
27
|
+
if (expected === null || artifact.kind !== expected) {
|
|
28
|
+
throw new Error(`entity type ${artifact.entityType} cannot use ${artifact.kind} transfer`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
9
31
|
/**
|
|
10
32
|
* Select the one immutable artifact carried by a cloud entity record.
|
|
11
33
|
* Deleted records are tombstones. A not-yet-captured leaf has no artifact yet.
|
|
@@ -13,20 +35,19 @@ const CONTENT_HEAD = /^[0-9a-f]{64}$/;
|
|
|
13
35
|
export function artifactForRecord(record) {
|
|
14
36
|
if (record.status === 'deleted')
|
|
15
37
|
return null;
|
|
16
|
-
|
|
38
|
+
const kind = artifactKindForType(record.type);
|
|
39
|
+
if (kind === null)
|
|
40
|
+
return null;
|
|
17
41
|
let contentHash;
|
|
18
42
|
switch (record.type) {
|
|
19
43
|
case 'file.text':
|
|
20
44
|
case 'file.binary':
|
|
21
|
-
kind = 'file';
|
|
22
45
|
contentHash = record.payloadVersion;
|
|
23
46
|
break;
|
|
24
47
|
case 'link':
|
|
25
|
-
kind = 'link';
|
|
26
48
|
contentHash = record.payloadVersion;
|
|
27
49
|
break;
|
|
28
50
|
case 'repo.git':
|
|
29
|
-
kind = 'git';
|
|
30
51
|
contentHash = record.transportVersion;
|
|
31
52
|
break;
|
|
32
53
|
case 'workspace':
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/transfer/artifacts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAWtC;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAyB;IACzD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAE7C,IAAI,
|
|
1
|
+
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/transfer/artifacts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAWtC,yDAAyD;AACzD,MAAM,UAAU,mBAAmB,CAAC,IAAgB;IAClD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,WAAW,CAAC;QACjB,KAAK,aAAa;YAChB,OAAO,MAAM,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB,KAAK,UAAU;YACb,OAAO,KAAK,CAAC;QACf,KAAK,WAAW,CAAC;QACjB,KAAK,QAAQ,CAAC;QACd,KAAK,WAAW;YACd,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAA0B;IAC/D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC1D,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,eAAe,QAAQ,CAAC,UAAU,eAAe,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAyB;IACzD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAE7C,MAAM,IAAI,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,WAA0B,CAAC;IAC/B,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,WAAW,CAAC;QACjB,KAAK,aAAa;YAChB,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC;YACpC,MAAM;QACR,KAAK,MAAM;YACT,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC;YACpC,MAAM;QACR,KAAK,UAAU;YACb,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC;YACtC,MAAM;QACR,KAAK,WAAW,CAAC;QACjB,KAAK,QAAQ,CAAC;QACd,KAAK,WAAW;YACd,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,WAAW,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,UAAU,MAAM,CAAC,IAAI,+BAA+B,CAAC,CAAC;IACxE,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,IAAI;QACrB,UAAU,EAAE,MAAM,CAAC,IAAI;QACvB,IAAI;QACJ,WAAW;KACZ,CAAC;AACJ,CAAC"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { type ContentChunk, type ContentManifest } from '../contracts/content.js';
|
|
10
10
|
import type { Sha256Hex } from '../entities/types.js';
|
|
11
|
-
import type
|
|
11
|
+
import { type TransferArtifact } from './artifacts.js';
|
|
12
12
|
export interface DownloadPorts<LocalArtifact> {
|
|
13
13
|
readonly sha256Hex: Sha256Hex;
|
|
14
14
|
getManifest(artifact: TransferArtifact): Promise<unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/transfer/download.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAwB,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACxG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/transfer/download.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAwB,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACxG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAG/E,MAAM,WAAW,aAAa,CAAC,aAAa;IAC1C,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,QAAQ,CACN,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,UAAU,CAAC,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,8EAA8E;IAC9E,YAAY,CACV,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,cAAc,CAAC,aAAa;IAC3C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe,CAAC,aAAa;IAC5C,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,yEAAyE;AACzE,wBAAsB,QAAQ,CAAC,aAAa,EAC1C,QAAQ,EAAE,gBAAgB,EAC1B,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,EACnC,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAqCzC"}
|
|
@@ -7,9 +7,11 @@
|
|
|
7
7
|
* hash before returning a local handle.
|
|
8
8
|
*/
|
|
9
9
|
import { checkContentManifest } from '../contracts/content.js';
|
|
10
|
+
import { assertTransferArtifact } from './artifacts.js';
|
|
10
11
|
import { parallelForEach } from './parallel.js';
|
|
11
12
|
/** Download one immutable artifact, fetching only machine-cache gaps. */
|
|
12
13
|
export async function download(artifact, ports, options = {}) {
|
|
14
|
+
assertTransferArtifact(artifact);
|
|
13
15
|
const checked = checkContentManifest(await ports.getManifest(artifact), artifact.contentHash);
|
|
14
16
|
if (!checked.ok)
|
|
15
17
|
throw new Error(checked.error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/transfer/download.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,oBAAoB,EAA2C,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/transfer/download.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,oBAAoB,EAA2C,MAAM,yBAAyB,CAAC;AAExG,OAAO,EAAE,sBAAsB,EAAyB,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAsChD,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAA0B,EAC1B,KAAmC,EACnC,UAA2B,EAAE;IAE7B,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,oBAAoB,CAClC,MAAM,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,EACjC,QAAQ,CAAC,WAAW,CACrB,CAAC;IACF,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;IAE/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACvE,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,QAAQ,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAC9F,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC9D,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC;eAC7B,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,KAAK;eACnC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,sBAAsB,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC5D,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,IAAI,MAAM,CAAC,WAAW,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,WAAW,sBAAsB,CAAC,CAAC;IACrF,CAAC;IACD,OAAO;QACL,QAAQ;QACR,QAAQ;QACR,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,gBAAgB,EAAE,OAAO,CAAC,MAAM;QAChC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM;KACtD,CAAC;AACJ,CAAC"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { type ContentManifest } from '../contracts/content.js';
|
|
9
9
|
import type { Sha256Hex } from '../entities/types.js';
|
|
10
|
-
import type
|
|
10
|
+
import { type TransferArtifact } from './artifacts.js';
|
|
11
11
|
export interface UploadSource {
|
|
12
12
|
/** Exact byte count of the captured artifact named by `contentHash`. */
|
|
13
13
|
readonly bytes: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/transfer/upload.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/transfer/upload.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAG/E,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,iFAAiF;IACjF,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,0DAA0D;IAC1D,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,oEAAoE;IACpE,aAAa,CACX,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IAC9B,QAAQ,CACN,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,8EAA8E;IAC9E,WAAW,CAAC,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnF;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAiDD,2EAA2E;AAC3E,wBAAsB,MAAM,CAC1B,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,aAAa,CAAC,CAuDxB"}
|
package/dist/transfer/upload.js
CHANGED
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
* then reread only the chunks the authority reports missing. The manifest is
|
|
6
6
|
* committed last; until then a partial upload is invisible.
|
|
7
7
|
*/
|
|
8
|
-
import { checkContentManifest, chunkSizes, manifestFromChunks, } from '../contracts/content.js';
|
|
8
|
+
import { checkContentManifest, MAX_CONTENT_BLOCK_BYTES, chunkSizes, manifestFromChunks, } from '../contracts/content.js';
|
|
9
|
+
import { assertTransferArtifact } from './artifacts.js';
|
|
9
10
|
import { parallelForEach } from './parallel.js';
|
|
10
11
|
const planChunks = (sizes) => {
|
|
11
12
|
let offset = 0;
|
|
@@ -15,6 +16,29 @@ const planChunks = (sizes) => {
|
|
|
15
16
|
return chunk;
|
|
16
17
|
});
|
|
17
18
|
};
|
|
19
|
+
const fixedSizes = (totalBytes, partBytes) => {
|
|
20
|
+
const sizes = [];
|
|
21
|
+
for (let remaining = totalBytes; remaining > 0; remaining -= partBytes) {
|
|
22
|
+
sizes.push(Math.min(remaining, partBytes));
|
|
23
|
+
}
|
|
24
|
+
return sizes;
|
|
25
|
+
};
|
|
26
|
+
/** Entity type selects semantic transfer framing. Files use reusable
|
|
27
|
+
* Syncthing-style blocks. A link target is one literal value. A Git transport
|
|
28
|
+
* is already a native incremental pack/state parcel, so the outer wire only
|
|
29
|
+
* segments it at the maximum frame size instead of re-chunking it as a file. */
|
|
30
|
+
const artifactPartSizes = (artifact, totalBytes) => {
|
|
31
|
+
switch (artifact.kind) {
|
|
32
|
+
case 'file':
|
|
33
|
+
return chunkSizes(totalBytes);
|
|
34
|
+
case 'link':
|
|
35
|
+
if (totalBytes > MAX_CONTENT_BLOCK_BYTES)
|
|
36
|
+
throw new Error('link target exceeds the transfer frame bound');
|
|
37
|
+
return totalBytes === 0 ? [] : [totalBytes];
|
|
38
|
+
case 'git':
|
|
39
|
+
return fixedSizes(totalBytes, MAX_CONTENT_BLOCK_BYTES);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
18
42
|
const readExact = async (source, chunk) => {
|
|
19
43
|
const bytes = await source.read(chunk.offset, chunk.bytes);
|
|
20
44
|
if (!(bytes instanceof Uint8Array) || bytes.byteLength !== chunk.bytes) {
|
|
@@ -24,21 +48,25 @@ const readExact = async (source, chunk) => {
|
|
|
24
48
|
};
|
|
25
49
|
/** Upload one immutable artifact, sending only authority-declared gaps. */
|
|
26
50
|
export async function upload(artifact, source, ports, options = {}) {
|
|
51
|
+
assertTransferArtifact(artifact);
|
|
27
52
|
if (!Number.isSafeInteger(source.bytes) || source.bytes < 0) {
|
|
28
53
|
throw new Error('upload source byte count is invalid');
|
|
29
54
|
}
|
|
55
|
+
const expectedSizes = artifactPartSizes(artifact, source.bytes);
|
|
30
56
|
let plan;
|
|
31
57
|
let manifest;
|
|
32
58
|
if (source.manifest !== undefined) {
|
|
33
59
|
const cached = checkContentManifest(source.manifest, artifact.contentHash);
|
|
34
|
-
if (!cached.ok || cached.value.bytes !== source.bytes
|
|
60
|
+
if (!cached.ok || cached.value.bytes !== source.bytes
|
|
61
|
+
|| cached.value.chunks.some((chunk, index) => chunk.bytes !== expectedSizes[index])
|
|
62
|
+
|| cached.value.chunks.length !== expectedSizes.length) {
|
|
35
63
|
throw new Error('cached upload manifest is invalid');
|
|
36
64
|
}
|
|
37
65
|
manifest = cached.value;
|
|
38
66
|
plan = planChunks(manifest.chunks.map((chunk) => chunk.bytes));
|
|
39
67
|
}
|
|
40
68
|
else {
|
|
41
|
-
plan = planChunks(
|
|
69
|
+
plan = planChunks(expectedSizes);
|
|
42
70
|
const chunks = [];
|
|
43
71
|
for (const chunk of plan) {
|
|
44
72
|
const bytes = await readExact(source, chunk);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/transfer/upload.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,oBAAoB,EACpB,UAAU,EACV,kBAAkB,GAEnB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/transfer/upload.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amalgm/live",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.11",
|
|
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
|
"license": "UNLICENSED",
|