@amalgm/live 0.2.5 → 0.2.7
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 +21 -1
- package/dist/entities/repo-states.d.ts +4 -0
- package/dist/entities/repo-states.d.ts.map +1 -1
- package/dist/entities/repo-states.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/transfer/artifacts.d.ts +22 -0
- package/dist/transfer/artifacts.d.ts.map +1 -0
- package/dist/transfer/artifacts.js +49 -0
- package/dist/transfer/artifacts.js.map +1 -0
- package/dist/transfer/download.d.ts +39 -0
- package/dist/transfer/download.d.ts.map +1 -0
- package/dist/transfer/download.js +46 -0
- package/dist/transfer/download.js.map +1 -0
- package/dist/transfer/index.d.ts +5 -0
- package/dist/transfer/index.d.ts.map +1 -0
- package/dist/transfer/index.js +5 -0
- package/dist/transfer/index.js.map +1 -0
- package/dist/transfer/parallel.d.ts +3 -0
- package/dist/transfer/parallel.d.ts.map +1 -0
- package/dist/transfer/parallel.js +18 -0
- package/dist/transfer/parallel.js.map +1 -0
- package/dist/transfer/upload.d.ts +38 -0
- package/dist/transfer/upload.d.ts.map +1 -0
- package/dist/transfer/upload.js +66 -0
- package/dist/transfer/upload.js.map +1 -0
- package/package.json +5 -1
package/PURPOSE.md
CHANGED
|
@@ -98,7 +98,25 @@ its cutover.
|
|
|
98
98
|
`.git` itself is repository transport metadata and never receives an
|
|
99
99
|
entity row. Worktree children retain local UUID rows, but a proper
|
|
100
100
|
`repo.git` ancestor carries their identities and bytes in one immutable
|
|
101
|
-
Card + Checkpoint parcel rather than one cloud record per child.
|
|
101
|
+
Card + Checkpoint parcel rather than one cloud record per child. A shallow
|
|
102
|
+
repository carries its declared Git history boundary in that parcel, so a
|
|
103
|
+
new machine never depends on an object outside the transport.
|
|
104
|
+
22. **Transfer moves content; it never discovers state.** `upload` moves one
|
|
105
|
+
already-registered immutable artifact toward cloud storage and `download`
|
|
106
|
+
moves that same artifact toward a machine cache. Neither operation scans,
|
|
107
|
+
assigns identity, changes the entity graph, materializes a user path, or
|
|
108
|
+
publishes a registry snapshot.
|
|
109
|
+
23. **Entity type selects the artifact, not a second lifecycle.** Text and
|
|
110
|
+
binary files travel as file bytes, links travel as their literal target,
|
|
111
|
+
and repositories travel as their immutable Git Card + Checkpoint parcel.
|
|
112
|
+
Workspace and folder membership travels in the entity graph; references
|
|
113
|
+
carry a UUID and therefore have no separate content artifact.
|
|
114
|
+
24. **Transfer is verified, missing-only, and commit-last.** Every chunk is
|
|
115
|
+
content-addressed and verified at each boundary; an uploader sends only
|
|
116
|
+
chunks the authority reports missing, a downloader fetches only chunks its
|
|
117
|
+
machine cache lacks, and the manifest becomes visible only after all of its
|
|
118
|
+
chunks are durable. Repeating either operation is safe and moves no bytes
|
|
119
|
+
that the destination already has.
|
|
102
120
|
|
|
103
121
|
## Five surfaces, one behavior
|
|
104
122
|
|
|
@@ -131,6 +149,8 @@ src/detection/ the Detect/Watch pure cores: the adapter contract, the
|
|
|
131
149
|
verdicts, classification, refusals, enrollment policy.
|
|
132
150
|
src/registration/ the login-time user-ground convergence operation and its
|
|
133
151
|
injected local/cloud effect ports.
|
|
152
|
+
src/transfer/ type-aware immutable artifact upload/download operations;
|
|
153
|
+
chunk storage, R2, files, and Git remain injected effects.
|
|
134
154
|
src/adapters/ the ports a host injects: transport, journal store,
|
|
135
155
|
content store, clock, crypto, logger.
|
|
136
156
|
tests/ unit tests per module, in the engine wall's style: each
|
|
@@ -51,6 +51,10 @@ export interface RepoCard {
|
|
|
51
51
|
readonly branches: readonly RepoRef[];
|
|
52
52
|
readonly tags: readonly RepoRef[];
|
|
53
53
|
readonly remotes: readonly RepoRemote[];
|
|
54
|
+
/** Git's declared history horizon. These commits are present, but their
|
|
55
|
+
* parents intentionally are not; an empty receiver must install this
|
|
56
|
+
* boundary before importing the bundle. Transport metadata, not identity. */
|
|
57
|
+
readonly shallow?: readonly string[];
|
|
54
58
|
readonly bundle: RepoBundle | null;
|
|
55
59
|
}
|
|
56
60
|
/** `content: null` marks a reused (unopened) entry; ids derive from
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-states.d.ts","sourceRoot":"","sources":["../../src/entities/repo-states.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"repo-states.d.ts","sourceRoot":"","sources":["../../src/entities/repo-states.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-states.js","sourceRoot":"","sources":["../../src/entities/repo-states.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"repo-states.js","sourceRoot":"","sources":["../../src/entities/repo-states.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -15,6 +15,7 @@ export * from './entities/index.js';
|
|
|
15
15
|
export * from './detection/index.js';
|
|
16
16
|
export * from './registration/index.js';
|
|
17
17
|
export * from './files/index.js';
|
|
18
|
+
export * from './transfer/index.js';
|
|
18
19
|
export * from './merge/index.js';
|
|
19
20
|
export * from './workspace/index.js';
|
|
20
21
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -15,6 +15,7 @@ export * from './entities/index.js';
|
|
|
15
15
|
export * from './detection/index.js';
|
|
16
16
|
export * from './registration/index.js';
|
|
17
17
|
export * from './files/index.js';
|
|
18
|
+
export * from './transfer/index.js';
|
|
18
19
|
export * from './merge/index.js';
|
|
19
20
|
export * from './workspace/index.js';
|
|
20
21
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The immutable content artifact selected by an entity record.
|
|
3
|
+
*
|
|
4
|
+
* Registration owns identity and the graph. Transfer sees only the exact
|
|
5
|
+
* content head registration already produced. Containers and references have
|
|
6
|
+
* no independent byte artifact: their portable state is already in the graph.
|
|
7
|
+
*/
|
|
8
|
+
import type { CloudEntityRecord } from '../entities/cloud.js';
|
|
9
|
+
import type { EntityType } from '../entities/types.js';
|
|
10
|
+
export type ArtifactKind = 'file' | 'link' | 'git';
|
|
11
|
+
export interface TransferArtifact {
|
|
12
|
+
readonly entityId: string;
|
|
13
|
+
readonly entityType: EntityType;
|
|
14
|
+
readonly kind: ArtifactKind;
|
|
15
|
+
readonly contentHash: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Select the one immutable artifact carried by a cloud entity record.
|
|
19
|
+
* Deleted records are tombstones. A not-yet-captured leaf has no artifact yet.
|
|
20
|
+
*/
|
|
21
|
+
export declare function artifactForRecord(record: CloudEntityRecord): TransferArtifact | null;
|
|
22
|
+
//# sourceMappingURL=artifacts.d.ts.map
|
|
@@ -0,0 +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,CAmCpF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The immutable content artifact selected by an entity record.
|
|
3
|
+
*
|
|
4
|
+
* Registration owns identity and the graph. Transfer sees only the exact
|
|
5
|
+
* content head registration already produced. Containers and references have
|
|
6
|
+
* no independent byte artifact: their portable state is already in the graph.
|
|
7
|
+
*/
|
|
8
|
+
const CONTENT_HEAD = /^[0-9a-f]{64}$/;
|
|
9
|
+
/**
|
|
10
|
+
* Select the one immutable artifact carried by a cloud entity record.
|
|
11
|
+
* Deleted records are tombstones. A not-yet-captured leaf has no artifact yet.
|
|
12
|
+
*/
|
|
13
|
+
export function artifactForRecord(record) {
|
|
14
|
+
if (record.status === 'deleted')
|
|
15
|
+
return null;
|
|
16
|
+
let kind;
|
|
17
|
+
let contentHash;
|
|
18
|
+
switch (record.type) {
|
|
19
|
+
case 'file.text':
|
|
20
|
+
case 'file.binary':
|
|
21
|
+
kind = 'file';
|
|
22
|
+
contentHash = record.payloadVersion;
|
|
23
|
+
break;
|
|
24
|
+
case 'link':
|
|
25
|
+
kind = 'link';
|
|
26
|
+
contentHash = record.payloadVersion;
|
|
27
|
+
break;
|
|
28
|
+
case 'repo.git':
|
|
29
|
+
kind = 'git';
|
|
30
|
+
contentHash = record.transportVersion;
|
|
31
|
+
break;
|
|
32
|
+
case 'workspace':
|
|
33
|
+
case 'folder':
|
|
34
|
+
case 'reference':
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
if (contentHash === null)
|
|
38
|
+
return null;
|
|
39
|
+
if (!CONTENT_HEAD.test(contentHash)) {
|
|
40
|
+
throw new Error(`entity ${record.uuid} has an invalid transfer head`);
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
entityId: record.uuid,
|
|
44
|
+
entityType: record.type,
|
|
45
|
+
kind,
|
|
46
|
+
contentHash,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=artifacts.js.map
|
|
@@ -0,0 +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,IAAkB,CAAC;IACvB,IAAI,WAA0B,CAAC;IAC/B,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,WAAW,CAAC;QACjB,KAAK,aAAa;YAChB,IAAI,GAAG,MAAM,CAAC;YACd,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC;YACpC,MAAM;QACR,KAAK,MAAM;YACT,IAAI,GAAG,MAAM,CAAC;YACd,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC;YACpC,MAAM;QACR,KAAK,UAAU;YACb,IAAI,GAAG,KAAK,CAAC;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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Download one immutable artifact into a machine cache.
|
|
3
|
+
*
|
|
4
|
+
* The operation asks the cache which verified chunks it already owns, fetches
|
|
5
|
+
* only the gaps, verifies every fetched chunk, and then asks the cache to seal
|
|
6
|
+
* the complete artifact. Sealing must verify the whole byte count and content
|
|
7
|
+
* hash before returning a local handle.
|
|
8
|
+
*/
|
|
9
|
+
import { type ContentChunk, type ContentManifest } from '../contracts/content.js';
|
|
10
|
+
import type { Sha256Hex } from '../entities/types.js';
|
|
11
|
+
import type { TransferArtifact } from './artifacts.js';
|
|
12
|
+
export interface DownloadPorts<LocalArtifact> {
|
|
13
|
+
readonly sha256Hex: Sha256Hex;
|
|
14
|
+
getManifest(artifact: TransferArtifact): Promise<unknown>;
|
|
15
|
+
/** True only when this exact content-addressed chunk is locally verified. */
|
|
16
|
+
hasChunk(chunk: ContentChunk): Promise<boolean>;
|
|
17
|
+
getChunk(artifact: TransferArtifact, manifest: ContentManifest, index: number): Promise<Uint8Array>;
|
|
18
|
+
putChunk(chunk: ContentChunk, bytes: Uint8Array): Promise<void>;
|
|
19
|
+
/** Verify and expose the complete immutable artifact assembled from cache. */
|
|
20
|
+
sealArtifact(artifact: TransferArtifact, manifest: ContentManifest): Promise<SealedArtifact<LocalArtifact>>;
|
|
21
|
+
}
|
|
22
|
+
export interface SealedArtifact<LocalArtifact> {
|
|
23
|
+
readonly local: LocalArtifact;
|
|
24
|
+
readonly bytes: number;
|
|
25
|
+
readonly contentHash: string;
|
|
26
|
+
}
|
|
27
|
+
export interface DownloadOptions {
|
|
28
|
+
readonly concurrency?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface DownloadReceipt<LocalArtifact> {
|
|
31
|
+
readonly artifact: TransferArtifact;
|
|
32
|
+
readonly manifest: ContentManifest;
|
|
33
|
+
readonly local: LocalArtifact;
|
|
34
|
+
readonly downloadedChunks: number;
|
|
35
|
+
readonly reusedChunks: number;
|
|
36
|
+
}
|
|
37
|
+
/** Download one immutable artifact, fetching only machine-cache gaps. */
|
|
38
|
+
export declare function download<LocalArtifact>(artifact: TransferArtifact, ports: DownloadPorts<LocalArtifact>, options?: DownloadOptions): Promise<DownloadReceipt<LocalArtifact>>;
|
|
39
|
+
//# sourceMappingURL=download.d.ts.map
|
|
@@ -0,0 +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,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGvD,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,CAoCzC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Download one immutable artifact into a machine cache.
|
|
3
|
+
*
|
|
4
|
+
* The operation asks the cache which verified chunks it already owns, fetches
|
|
5
|
+
* only the gaps, verifies every fetched chunk, and then asks the cache to seal
|
|
6
|
+
* the complete artifact. Sealing must verify the whole byte count and content
|
|
7
|
+
* hash before returning a local handle.
|
|
8
|
+
*/
|
|
9
|
+
import { checkContentManifest } from '../contracts/content.js';
|
|
10
|
+
import { parallelForEach } from './parallel.js';
|
|
11
|
+
/** Download one immutable artifact, fetching only machine-cache gaps. */
|
|
12
|
+
export async function download(artifact, ports, options = {}) {
|
|
13
|
+
const checked = checkContentManifest(await ports.getManifest(artifact), artifact.contentHash);
|
|
14
|
+
if (!checked.ok)
|
|
15
|
+
throw new Error(checked.error);
|
|
16
|
+
const manifest = checked.value;
|
|
17
|
+
const missing = [];
|
|
18
|
+
for (const [index, chunk] of manifest.chunks.entries()) {
|
|
19
|
+
if (!await ports.hasChunk(chunk))
|
|
20
|
+
missing.push(index);
|
|
21
|
+
}
|
|
22
|
+
await parallelForEach(missing, options.concurrency ?? 4, async (index) => {
|
|
23
|
+
const expected = manifest.chunks[index];
|
|
24
|
+
if (expected === undefined)
|
|
25
|
+
throw new Error('download manifest named an unknown chunk index');
|
|
26
|
+
const bytes = await ports.getChunk(artifact, manifest, index);
|
|
27
|
+
if (!(bytes instanceof Uint8Array)
|
|
28
|
+
|| bytes.byteLength !== expected.bytes
|
|
29
|
+
|| ports.sha256Hex(bytes) !== expected.sha256) {
|
|
30
|
+
throw new Error(`downloaded content chunk ${index} failed verification`);
|
|
31
|
+
}
|
|
32
|
+
await ports.putChunk(expected, bytes);
|
|
33
|
+
});
|
|
34
|
+
const sealed = await ports.sealArtifact(artifact, manifest);
|
|
35
|
+
if (sealed.bytes !== manifest.bytes || sealed.contentHash !== manifest.contentHash) {
|
|
36
|
+
throw new Error(`downloaded artifact ${artifact.contentHash} failed verification`);
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
artifact,
|
|
40
|
+
manifest,
|
|
41
|
+
local: sealed.local,
|
|
42
|
+
downloadedChunks: missing.length,
|
|
43
|
+
reusedChunks: manifest.chunks.length - missing.length,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=download.js.map
|
|
@@ -0,0 +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;AAGxG,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAsChD,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAA0B,EAC1B,KAAmC,EACnC,UAA2B,EAAE;IAE7B,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"}
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel.d.ts","sourceRoot":"","sources":["../../src/transfer/parallel.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,wBAAsB,eAAe,CAAC,CAAC,EACrC,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC,CAgBf"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Run a bounded number of independent effects without changing item order. */
|
|
2
|
+
export async function parallelForEach(items, concurrency, effect) {
|
|
3
|
+
if (!Number.isSafeInteger(concurrency) || concurrency < 1) {
|
|
4
|
+
throw new Error('transfer concurrency must be a positive integer');
|
|
5
|
+
}
|
|
6
|
+
let cursor = 0;
|
|
7
|
+
const worker = async () => {
|
|
8
|
+
while (cursor < items.length) {
|
|
9
|
+
const index = cursor;
|
|
10
|
+
cursor += 1;
|
|
11
|
+
const item = items[index];
|
|
12
|
+
if (item !== undefined)
|
|
13
|
+
await effect(item);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, worker));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=parallel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel.js","sourceRoot":"","sources":["../../src/transfer/parallel.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAmB,EACnB,WAAmB,EACnB,MAAkC;IAElC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,MAAM,GAAG,KAAK,IAAmB,EAAE;QACvC,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,MAAM,CAAC;YACrB,MAAM,IAAI,CAAC,CAAC;YACZ,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,IAAI,KAAK,SAAS;gBAAE,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC;IACF,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CACpE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upload one already-captured immutable artifact.
|
|
3
|
+
*
|
|
4
|
+
* The source is seekable so the operation can first derive its manifest and
|
|
5
|
+
* then reread only the chunks the authority reports missing. The manifest is
|
|
6
|
+
* committed last; until then a partial upload is invisible.
|
|
7
|
+
*/
|
|
8
|
+
import { type ContentManifest } from '../contracts/content.js';
|
|
9
|
+
import type { Sha256Hex } from '../entities/types.js';
|
|
10
|
+
import type { TransferArtifact } from './artifacts.js';
|
|
11
|
+
export interface UploadSource {
|
|
12
|
+
/** Exact byte count of the captured artifact named by `contentHash`. */
|
|
13
|
+
readonly bytes: number;
|
|
14
|
+
/** Verify the complete captured artifact without requiring Live to buffer it. */
|
|
15
|
+
verify(contentHash: string): Promise<boolean>;
|
|
16
|
+
/** Return exactly `bytes` bytes beginning at `offset`. */
|
|
17
|
+
read(offset: number, bytes: number): Promise<Uint8Array>;
|
|
18
|
+
}
|
|
19
|
+
export interface UploadPorts {
|
|
20
|
+
readonly sha256Hex: Sha256Hex;
|
|
21
|
+
/** Return the manifest indexes not yet durable at the authority. */
|
|
22
|
+
missingChunks(artifact: TransferArtifact, manifest: ContentManifest): Promise<readonly number[]>;
|
|
23
|
+
putChunk(artifact: TransferArtifact, manifest: ContentManifest, index: number, bytes: Uint8Array): Promise<void>;
|
|
24
|
+
/** Make the artifact visible. Called only after every missing chunk lands. */
|
|
25
|
+
putManifest(artifact: TransferArtifact, manifest: ContentManifest): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
export interface UploadOptions {
|
|
28
|
+
readonly concurrency?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface UploadReceipt {
|
|
31
|
+
readonly artifact: TransferArtifact;
|
|
32
|
+
readonly manifest: ContentManifest;
|
|
33
|
+
readonly uploadedChunks: number;
|
|
34
|
+
readonly reusedChunks: number;
|
|
35
|
+
}
|
|
36
|
+
/** Upload one immutable artifact, sending only authority-declared gaps. */
|
|
37
|
+
export declare function upload(artifact: TransferArtifact, source: UploadSource, ports: UploadPorts, options?: UploadOptions): Promise<UploadReceipt>;
|
|
38
|
+
//# sourceMappingURL=upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/transfer/upload.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAkC,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGvD,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,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;AAyBD,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,CAyCxB"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upload one already-captured immutable artifact.
|
|
3
|
+
*
|
|
4
|
+
* The source is seekable so the operation can first derive its manifest and
|
|
5
|
+
* then reread only the chunks the authority reports missing. The manifest is
|
|
6
|
+
* committed last; until then a partial upload is invisible.
|
|
7
|
+
*/
|
|
8
|
+
import { chunkSizes, manifestFromChunks } from '../contracts/content.js';
|
|
9
|
+
import { parallelForEach } from './parallel.js';
|
|
10
|
+
const planChunks = (bytes) => {
|
|
11
|
+
let offset = 0;
|
|
12
|
+
return chunkSizes(bytes).map((size, index) => {
|
|
13
|
+
const chunk = { index, offset, bytes: size };
|
|
14
|
+
offset += size;
|
|
15
|
+
return chunk;
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
const readExact = async (source, chunk) => {
|
|
19
|
+
const bytes = await source.read(chunk.offset, chunk.bytes);
|
|
20
|
+
if (!(bytes instanceof Uint8Array) || bytes.byteLength !== chunk.bytes) {
|
|
21
|
+
throw new Error(`upload source returned the wrong byte count for chunk ${chunk.index}`);
|
|
22
|
+
}
|
|
23
|
+
return bytes;
|
|
24
|
+
};
|
|
25
|
+
/** Upload one immutable artifact, sending only authority-declared gaps. */
|
|
26
|
+
export async function upload(artifact, source, ports, options = {}) {
|
|
27
|
+
if (!Number.isSafeInteger(source.bytes) || source.bytes < 0) {
|
|
28
|
+
throw new Error('upload source byte count is invalid');
|
|
29
|
+
}
|
|
30
|
+
if (!await source.verify(artifact.contentHash)) {
|
|
31
|
+
throw new Error(`upload source does not match ${artifact.contentHash}`);
|
|
32
|
+
}
|
|
33
|
+
const plan = planChunks(source.bytes);
|
|
34
|
+
const chunks = [];
|
|
35
|
+
for (const chunk of plan) {
|
|
36
|
+
const bytes = await readExact(source, chunk);
|
|
37
|
+
chunks.push({ sha256: ports.sha256Hex(bytes), bytes: chunk.bytes });
|
|
38
|
+
}
|
|
39
|
+
const checked = manifestFromChunks(artifact.contentHash, chunks);
|
|
40
|
+
if (!checked.ok)
|
|
41
|
+
throw new Error(checked.error);
|
|
42
|
+
const manifest = checked.value;
|
|
43
|
+
const missing = [...await ports.missingChunks(artifact, manifest)];
|
|
44
|
+
if (new Set(missing).size !== missing.length
|
|
45
|
+
|| missing.some((index) => !Number.isSafeInteger(index) || index < 0 || index >= plan.length)) {
|
|
46
|
+
throw new Error('upload authority returned invalid missing chunk indexes');
|
|
47
|
+
}
|
|
48
|
+
await parallelForEach(missing, options.concurrency ?? 4, async (index) => {
|
|
49
|
+
const chunk = plan[index];
|
|
50
|
+
if (chunk === undefined)
|
|
51
|
+
throw new Error('upload authority returned an unknown chunk index');
|
|
52
|
+
const bytes = await readExact(source, chunk);
|
|
53
|
+
if (ports.sha256Hex(bytes) !== manifest.chunks[index]?.sha256) {
|
|
54
|
+
throw new Error(`upload source changed while reading chunk ${index}`);
|
|
55
|
+
}
|
|
56
|
+
await ports.putChunk(artifact, manifest, index, bytes);
|
|
57
|
+
});
|
|
58
|
+
await ports.putManifest(artifact, manifest);
|
|
59
|
+
return {
|
|
60
|
+
artifact,
|
|
61
|
+
manifest,
|
|
62
|
+
uploadedChunks: missing.length,
|
|
63
|
+
reusedChunks: manifest.chunks.length - missing.length,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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.7",
|
|
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",
|
|
@@ -39,6 +39,10 @@
|
|
|
39
39
|
"./files": {
|
|
40
40
|
"types": "./dist/files/index.d.ts",
|
|
41
41
|
"default": "./dist/files/index.js"
|
|
42
|
+
},
|
|
43
|
+
"./transfer": {
|
|
44
|
+
"types": "./dist/transfer/index.d.ts",
|
|
45
|
+
"default": "./dist/transfer/index.js"
|
|
42
46
|
}
|
|
43
47
|
},
|
|
44
48
|
"files": [
|