@amalgm/live 0.2.79 → 0.2.82
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 +19 -4
- package/dist/apply/contracts.d.ts +21 -0
- package/dist/apply/contracts.d.ts.map +1 -1
- package/dist/apply/contracts.js.map +1 -1
- package/dist/apply/rail.d.ts.map +1 -1
- package/dist/apply/rail.js +166 -43
- package/dist/apply/rail.js.map +1 -1
- package/dist/files/index.d.ts +1 -0
- package/dist/files/index.d.ts.map +1 -1
- package/dist/files/index.js +1 -0
- package/dist/files/index.js.map +1 -1
- package/dist/files/retained-artifacts.d.ts +48 -0
- package/dist/files/retained-artifacts.d.ts.map +1 -0
- package/dist/files/retained-artifacts.js +150 -0
- package/dist/files/retained-artifacts.js.map +1 -0
- package/dist-cjs/apply/contracts.js.map +1 -1
- package/dist-cjs/apply/rail.js +166 -43
- package/dist-cjs/apply/rail.js.map +1 -1
- package/dist-cjs/files/index.js +1 -0
- package/dist-cjs/files/index.js.map +1 -1
- package/dist-cjs/files/retained-artifacts.js +154 -0
- package/dist-cjs/files/retained-artifacts.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Read-only proof that exact immutable heads retained by cloud authority are
|
|
4
|
+
* still fetchable through the product's authenticated content plane.
|
|
5
|
+
*
|
|
6
|
+
* This operation never materializes entity ground and never treats a manifest
|
|
7
|
+
* row as proof. The host must freshly read and verify every requested artifact;
|
|
8
|
+
* Live owns the type law and the complete repository dependency walk.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.checkRetainedArtifactHeads = checkRetainedArtifactHeads;
|
|
12
|
+
exports.verifyRetainedArtifacts = verifyRetainedArtifacts;
|
|
13
|
+
const types_js_1 = require("../entities/types.js");
|
|
14
|
+
const artifacts_js_1 = require("../transfer/artifacts.js");
|
|
15
|
+
const SHA256 = /^[0-9a-f]{64}$/;
|
|
16
|
+
function hash(value, label) {
|
|
17
|
+
if (typeof value !== 'string' || !SHA256.test(value)) {
|
|
18
|
+
throw new Error(`${label} must be a sha256 hex digest`);
|
|
19
|
+
}
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
function assertHead(head) {
|
|
23
|
+
if (!types_js_1.UUID_PATTERN.test(head.artifact.entityId)) {
|
|
24
|
+
throw new Error('retained artifact entity id must be a UUID');
|
|
25
|
+
}
|
|
26
|
+
(0, artifacts_js_1.assertTransferArtifact)(head.artifact);
|
|
27
|
+
hash(head.artifact.contentHash, 'retained artifact head');
|
|
28
|
+
if (head.artifact.kind === 'git') {
|
|
29
|
+
hash(head.expectedStateId, 'retained repository state');
|
|
30
|
+
}
|
|
31
|
+
else if (head.expectedStateId !== null) {
|
|
32
|
+
throw new Error('only a Git retained artifact may name an expected repository state');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** Validate the JSON boundary used by authenticated runtime adapters. */
|
|
36
|
+
function checkRetainedArtifactHeads(value) {
|
|
37
|
+
if (!Array.isArray(value))
|
|
38
|
+
throw new Error('retained artifact heads must be an array');
|
|
39
|
+
return value.map((candidate, index) => {
|
|
40
|
+
if (!candidate || typeof candidate !== 'object' || Array.isArray(candidate)) {
|
|
41
|
+
throw new Error(`retained artifact head ${index} must be an object`);
|
|
42
|
+
}
|
|
43
|
+
const artifact = candidate.artifact;
|
|
44
|
+
if (!artifact || typeof artifact !== 'object' || Array.isArray(artifact)) {
|
|
45
|
+
throw new Error(`retained artifact head ${index} has no artifact`);
|
|
46
|
+
}
|
|
47
|
+
const typedArtifact = {
|
|
48
|
+
entityId: String(artifact.entityId ?? ''),
|
|
49
|
+
entityType: String(artifact.entityType ?? ''),
|
|
50
|
+
kind: String(artifact.kind ?? ''),
|
|
51
|
+
contentHash: String(artifact.contentHash ?? ''),
|
|
52
|
+
};
|
|
53
|
+
const expected = candidate.expectedStateId;
|
|
54
|
+
const head = {
|
|
55
|
+
artifact: typedArtifact,
|
|
56
|
+
expectedStateId: expected === null ? null : String(expected ?? ''),
|
|
57
|
+
};
|
|
58
|
+
assertHead(head);
|
|
59
|
+
return head;
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function provenRead(reads, contentHash) {
|
|
63
|
+
const read = reads.get(contentHash);
|
|
64
|
+
if (!read)
|
|
65
|
+
throw new Error(`retained artifact ${contentHash} was not read`);
|
|
66
|
+
if (read.contentHash !== contentHash) {
|
|
67
|
+
throw new Error(`retained artifact ${contentHash} returned the wrong content hash`);
|
|
68
|
+
}
|
|
69
|
+
if (!Number.isSafeInteger(read.bytes) || read.bytes < 0) {
|
|
70
|
+
throw new Error(`retained artifact ${contentHash} returned an invalid byte count`);
|
|
71
|
+
}
|
|
72
|
+
return read;
|
|
73
|
+
}
|
|
74
|
+
async function readWave(artifacts, ports) {
|
|
75
|
+
const unique = new Map();
|
|
76
|
+
for (const artifact of artifacts) {
|
|
77
|
+
if (!unique.has(artifact.contentHash))
|
|
78
|
+
unique.set(artifact.contentHash, artifact);
|
|
79
|
+
}
|
|
80
|
+
const reads = await ports.readExact([...unique.values()]);
|
|
81
|
+
for (const contentHash of unique.keys())
|
|
82
|
+
provenRead(reads, contentHash);
|
|
83
|
+
return reads;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Prove exact retained heads and, for Git, every immutable parent transport.
|
|
87
|
+
* The input order is preserved in the result.
|
|
88
|
+
*/
|
|
89
|
+
async function verifyRetainedArtifacts(heads, ports) {
|
|
90
|
+
const checkedHeads = checkRetainedArtifactHeads(heads);
|
|
91
|
+
if (checkedHeads.length === 0)
|
|
92
|
+
return [];
|
|
93
|
+
const headReads = await readWave(checkedHeads.map((head) => head.artifact), ports);
|
|
94
|
+
const git = [];
|
|
95
|
+
const byInput = new Map();
|
|
96
|
+
for (const input of checkedHeads) {
|
|
97
|
+
if (input.artifact.kind !== 'git')
|
|
98
|
+
continue;
|
|
99
|
+
const head = provenRead(headReads, input.artifact.contentHash);
|
|
100
|
+
const layout = ports.inspectRepositoryTransport(head.local);
|
|
101
|
+
if (layout.stateId !== input.expectedStateId) {
|
|
102
|
+
throw new Error(`retained repository ${input.artifact.entityId} head names the wrong state`);
|
|
103
|
+
}
|
|
104
|
+
const parent = layout.parentTransportVersion;
|
|
105
|
+
if (parent !== null)
|
|
106
|
+
hash(parent, 'retained repository parent transport');
|
|
107
|
+
const walk = {
|
|
108
|
+
input,
|
|
109
|
+
head,
|
|
110
|
+
seen: new Set([input.artifact.contentHash]),
|
|
111
|
+
parentsNewestFirst: [],
|
|
112
|
+
parent,
|
|
113
|
+
};
|
|
114
|
+
git.push(walk);
|
|
115
|
+
byInput.set(input, walk);
|
|
116
|
+
}
|
|
117
|
+
for (let frontier = git.filter((walk) => walk.parent !== null); frontier.length > 0; frontier = git.filter((walk) => walk.parent !== null)) {
|
|
118
|
+
const wanted = frontier.map((walk) => ({
|
|
119
|
+
...walk.input.artifact,
|
|
120
|
+
contentHash: walk.parent,
|
|
121
|
+
}));
|
|
122
|
+
const reads = await readWave(wanted, ports);
|
|
123
|
+
for (const walk of frontier) {
|
|
124
|
+
const parentHash = walk.parent;
|
|
125
|
+
if (walk.seen.has(parentHash)) {
|
|
126
|
+
throw new Error(`retained repository ${walk.input.artifact.entityId} transport chain has a cycle`);
|
|
127
|
+
}
|
|
128
|
+
walk.seen.add(parentHash);
|
|
129
|
+
const parent = provenRead(reads, parentHash);
|
|
130
|
+
walk.parentsNewestFirst.push(parent);
|
|
131
|
+
const layout = ports.inspectRepositoryTransport(parent.local);
|
|
132
|
+
if (layout.parentTransportVersion !== null) {
|
|
133
|
+
hash(layout.parentTransportVersion, 'retained repository parent transport');
|
|
134
|
+
}
|
|
135
|
+
walk.parent = layout.parentTransportVersion;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return checkedHeads.map((input) => {
|
|
139
|
+
const head = provenRead(headReads, input.artifact.contentHash);
|
|
140
|
+
const walk = byInput.get(input);
|
|
141
|
+
return {
|
|
142
|
+
artifact: input.artifact,
|
|
143
|
+
expectedStateId: input.expectedStateId,
|
|
144
|
+
head: { contentHash: head.contentHash, bytes: head.bytes },
|
|
145
|
+
dependencyClosure: walk
|
|
146
|
+
? [...walk.parentsNewestFirst].reverse().map((parent) => ({
|
|
147
|
+
contentHash: parent.contentHash,
|
|
148
|
+
bytes: parent.bytes,
|
|
149
|
+
}))
|
|
150
|
+
: [],
|
|
151
|
+
};
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=retained-artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retained-artifacts.js","sourceRoot":"","sources":["../../src/files/retained-artifacts.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.82",
|
|
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",
|