@serve.zone/interfaces 32.16.0 → 32.18.0
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/changelog.md +60 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/data/cluster.d.ts +50 -7
- package/dist_ts/data/cluster.js +72 -11
- package/dist_ts/data/clusternode.d.ts +24 -1
- package/dist_ts/data/clusternode.js +19 -1
- package/dist_ts/data/clusterrelaycredential.d.ts +141 -0
- package/dist_ts/data/clusterrelaycredential.js +192 -0
- package/dist_ts/data/index.d.ts +3 -0
- package/dist_ts/data/index.js +4 -1
- package/dist_ts/{private → data}/releaseversion.js +1 -1
- package/dist_ts/data/sparklegacyretirement.d.ts +186 -0
- package/dist_ts/data/sparklegacyretirement.js +244 -0
- package/dist_ts/data/sparknodereport.js +2 -2
- package/dist_ts/protocol.js +2 -2
- package/dist_ts/requests/cluster.d.ts +54 -0
- package/dist_ts/requests/cluster.js +1 -1
- package/package.json +1 -1
- package/readme.md +178 -7
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/data/cluster.ts +147 -17
- package/ts/data/clusternode.ts +50 -1
- package/ts/data/clusterrelaycredential.ts +361 -0
- package/ts/data/index.ts +3 -0
- package/ts/data/sparklegacyretirement.ts +436 -0
- package/ts/data/sparknodereport.ts +1 -1
- package/ts/protocol.ts +1 -1
- package/ts/requests/cluster.ts +69 -0
- /package/dist_ts/{private → data}/releaseversion.d.ts +0 -0
- /package/ts/{private → data}/releaseversion.ts +0 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { snapshotClusterRelayAcceptedRegistration, validateClusterRelayAcceptedRegistration, } from './cluster.js';
|
|
2
|
+
import { captureNetwork, networkCounter, networkDigest, networkEqual, networkHash, networkId, networkRecord, networkReference, networkReferenceOf, requireNetwork, } from '../private/networkcontract.js';
|
|
3
|
+
export const clusterRelayCredentialContract = Object.freeze({
|
|
4
|
+
credentialDigestDomain: 'serve.zone/cluster-relay-credential',
|
|
5
|
+
legacyCredentialDigestDomain: 'serve.zone/cluster-relay-legacy-credential',
|
|
6
|
+
legacyInvalidationDigestDomain: 'serve.zone/cluster-relay-legacy-credential-invalidation',
|
|
7
|
+
});
|
|
8
|
+
/** Every reason Cloudly answers instead of mutating or retiring a cluster relay authority. */
|
|
9
|
+
export const clusterRelayCredentialRefusals = Object.freeze([
|
|
10
|
+
/** A rotation named a cluster that has no relay credential yet. */
|
|
11
|
+
'relay-credential-absent',
|
|
12
|
+
/** A retirement named a cluster whose shared authority no record names. */
|
|
13
|
+
'legacy-credential-absent',
|
|
14
|
+
/** The shared authority is already revoked; its invalidation is written once. */
|
|
15
|
+
'legacy-credential-already-retired',
|
|
16
|
+
/** The named replacement is not the cluster's relay credential at its current generation. */
|
|
17
|
+
'legacy-retirement-replacement-not-current',
|
|
18
|
+
/** The named registration is not current, or it was made under another credential generation. */
|
|
19
|
+
'legacy-retirement-registration-not-current',
|
|
20
|
+
/** No verified socket carries the named registration at the instant of acceptance. */
|
|
21
|
+
'legacy-retirement-relay-not-live',
|
|
22
|
+
/** An expected generation was not the exact current one, or a mutation ID met a changed body. */
|
|
23
|
+
'conflict',
|
|
24
|
+
]);
|
|
25
|
+
const fail = () => { throw new Error('Cluster relay credential contract rejected.'); };
|
|
26
|
+
const safe = (operationArg) => {
|
|
27
|
+
try {
|
|
28
|
+
return operationArg();
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return fail();
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const secretVersionReference = (valueArg) => {
|
|
35
|
+
const value = networkRecord(valueArg, ['secretId', 'secretVersionId']);
|
|
36
|
+
return {
|
|
37
|
+
secretId: networkId(value.secretId),
|
|
38
|
+
secretVersionId: networkId(value.secretVersionId),
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
/** Structural copy only; whether the record is the cluster's current one is Cloudly's to decide. */
|
|
42
|
+
export const snapshotClusterRelayCredential = (valueArg) => safe(() => {
|
|
43
|
+
const value = networkRecord(captureNetwork(valueArg), [
|
|
44
|
+
'id', 'clusterId', 'generation', 'userId', 'delivery', 'actorId', 'acceptedAt', 'digest',
|
|
45
|
+
]);
|
|
46
|
+
return {
|
|
47
|
+
id: networkId(value.id),
|
|
48
|
+
clusterId: networkId(value.clusterId),
|
|
49
|
+
generation: networkCounter(value.generation),
|
|
50
|
+
userId: networkId(value.userId),
|
|
51
|
+
delivery: secretVersionReference(value.delivery),
|
|
52
|
+
actorId: networkId(value.actorId),
|
|
53
|
+
acceptedAt: networkCounter(value.acceptedAt),
|
|
54
|
+
digest: networkDigest(value.digest),
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
export const computeClusterRelayCredentialDigest = async (valueArg) => networkHash(clusterRelayCredentialContract.credentialDigestDomain, snapshotClusterRelayCredential(valueArg));
|
|
58
|
+
export const validateClusterRelayCredential = async (valueArg) => {
|
|
59
|
+
try {
|
|
60
|
+
const value = snapshotClusterRelayCredential(valueArg);
|
|
61
|
+
return value.digest === await computeClusterRelayCredentialDigest(value)
|
|
62
|
+
? [] : ['cluster relay credential digest does not match'];
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return ['cluster relay credential must use its exact canonical schema'];
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
export const snapshotClusterRelayCredentialMutation = (valueArg) => safe(() => {
|
|
69
|
+
const value = networkRecord(captureNetwork(valueArg), [
|
|
70
|
+
'clusterId', 'mutationId', 'operation', 'expectedGeneration',
|
|
71
|
+
]);
|
|
72
|
+
const base = { clusterId: networkId(value.clusterId), mutationId: networkId(value.mutationId) };
|
|
73
|
+
const operation = value.operation;
|
|
74
|
+
requireNetwork(operation === 'ensure' || operation === 'rotate');
|
|
75
|
+
if (operation === 'ensure') {
|
|
76
|
+
requireNetwork(value.expectedGeneration === null);
|
|
77
|
+
return { ...base, operation, expectedGeneration: null };
|
|
78
|
+
}
|
|
79
|
+
return { ...base, operation, expectedGeneration: networkCounter(value.expectedGeneration) };
|
|
80
|
+
});
|
|
81
|
+
export const snapshotClusterLegacyRelayCredential = (valueArg) => safe(() => {
|
|
82
|
+
const value = networkRecord(captureNetwork(valueArg), [
|
|
83
|
+
'id', 'clusterId', 'userId', 'generation', 'state', 'invalidation', 'recordedAt', 'digest',
|
|
84
|
+
]);
|
|
85
|
+
const state = value.state;
|
|
86
|
+
requireNetwork(state === 'active' || state === 'revoked');
|
|
87
|
+
const generation = networkCounter(value.generation);
|
|
88
|
+
const invalidation = value.invalidation === null ? null : networkReference(value.invalidation);
|
|
89
|
+
// Revoked exactly when an invalidation names it, and only as the successor of an active record.
|
|
90
|
+
requireNetwork(state === 'active'
|
|
91
|
+
? invalidation === null
|
|
92
|
+
: invalidation !== null && invalidation.generation === 1 && generation > 1);
|
|
93
|
+
return {
|
|
94
|
+
id: networkId(value.id),
|
|
95
|
+
clusterId: networkId(value.clusterId),
|
|
96
|
+
userId: networkId(value.userId),
|
|
97
|
+
generation,
|
|
98
|
+
state,
|
|
99
|
+
invalidation,
|
|
100
|
+
recordedAt: networkCounter(value.recordedAt),
|
|
101
|
+
digest: networkDigest(value.digest),
|
|
102
|
+
};
|
|
103
|
+
});
|
|
104
|
+
export const computeClusterLegacyRelayCredentialDigest = async (valueArg) => networkHash(clusterRelayCredentialContract.legacyCredentialDigestDomain, snapshotClusterLegacyRelayCredential(valueArg));
|
|
105
|
+
export const validateClusterLegacyRelayCredential = async (valueArg) => {
|
|
106
|
+
try {
|
|
107
|
+
const value = snapshotClusterLegacyRelayCredential(valueArg);
|
|
108
|
+
return value.digest === await computeClusterLegacyRelayCredentialDigest(value)
|
|
109
|
+
? [] : ['cluster legacy relay credential digest does not match'];
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return ['cluster legacy relay credential must use its exact canonical schema'];
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
export const snapshotClusterLegacyRelayCredentialRetirementRequest = (valueArg) => safe(() => {
|
|
116
|
+
const value = networkRecord(captureNetwork(valueArg), [
|
|
117
|
+
'mutationId', 'clusterId', 'expectedLegacyGeneration', 'replacement', 'acceptedRegistration',
|
|
118
|
+
]);
|
|
119
|
+
return {
|
|
120
|
+
mutationId: networkId(value.mutationId),
|
|
121
|
+
clusterId: networkId(value.clusterId),
|
|
122
|
+
expectedLegacyGeneration: networkCounter(value.expectedLegacyGeneration),
|
|
123
|
+
replacement: networkReference(value.replacement),
|
|
124
|
+
acceptedRegistration: networkReference(value.acceptedRegistration),
|
|
125
|
+
};
|
|
126
|
+
});
|
|
127
|
+
export const snapshotClusterLegacyRelayCredentialInvalidation = (valueArg) => safe(() => {
|
|
128
|
+
const value = networkRecord(captureNetwork(valueArg), [
|
|
129
|
+
'id', 'generation', 'clusterId', 'credential', 'replacement', 'acceptedRegistration',
|
|
130
|
+
'actorId', 'acceptedAt', 'digest',
|
|
131
|
+
]);
|
|
132
|
+
requireNetwork(value.generation === 1);
|
|
133
|
+
return {
|
|
134
|
+
id: networkId(value.id),
|
|
135
|
+
generation: 1,
|
|
136
|
+
clusterId: networkId(value.clusterId),
|
|
137
|
+
credential: networkReference(value.credential),
|
|
138
|
+
replacement: networkReference(value.replacement),
|
|
139
|
+
acceptedRegistration: networkReference(value.acceptedRegistration),
|
|
140
|
+
actorId: networkId(value.actorId),
|
|
141
|
+
acceptedAt: networkCounter(value.acceptedAt),
|
|
142
|
+
digest: networkDigest(value.digest),
|
|
143
|
+
};
|
|
144
|
+
});
|
|
145
|
+
export const computeClusterLegacyRelayCredentialInvalidationDigest = async (valueArg) => networkHash(clusterRelayCredentialContract.legacyInvalidationDigestDomain, snapshotClusterLegacyRelayCredentialInvalidation(valueArg));
|
|
146
|
+
export const validateClusterLegacyRelayCredentialInvalidation = async (valueArg) => {
|
|
147
|
+
try {
|
|
148
|
+
const value = snapshotClusterLegacyRelayCredentialInvalidation(valueArg);
|
|
149
|
+
return value.digest === await computeClusterLegacyRelayCredentialInvalidationDigest(value)
|
|
150
|
+
? [] : ['cluster legacy relay credential invalidation digest does not match'];
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return ['cluster legacy relay credential invalidation must use its exact canonical schema'];
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* The active record is named exactly. The revoked one is that record's successor, so it is named
|
|
158
|
+
* by identity and the generation before it, and it names the invalidation back.
|
|
159
|
+
*/
|
|
160
|
+
const invalidationNamesLegacyCredential = (invalidationArg, legacyCredentialArg) => legacyCredentialArg.state === 'active'
|
|
161
|
+
? networkEqual(invalidationArg.credential, networkReferenceOf(legacyCredentialArg))
|
|
162
|
+
: invalidationArg.credential.id === legacyCredentialArg.id
|
|
163
|
+
&& invalidationArg.credential.generation === legacyCredentialArg.generation - 1
|
|
164
|
+
&& networkEqual(legacyCredentialArg.invalidation, networkReferenceOf(invalidationArg));
|
|
165
|
+
/**
|
|
166
|
+
* Joins an invalidation to the shared authority it revoked and to the registration that justified
|
|
167
|
+
* it, which must have been made under the very replacement the invalidation names.
|
|
168
|
+
*
|
|
169
|
+
* Content join only. Cloudly must still dereference each record as its cluster's current one and
|
|
170
|
+
* require a live verified socket for the registration while holding its compare-and-swap.
|
|
171
|
+
*/
|
|
172
|
+
export const bindClusterLegacyRelayCredentialInvalidation = async (invalidationArg, legacyCredentialArg, acceptedRegistrationArg) => {
|
|
173
|
+
try {
|
|
174
|
+
const invalidation = snapshotClusterLegacyRelayCredentialInvalidation(invalidationArg);
|
|
175
|
+
const legacyCredential = snapshotClusterLegacyRelayCredential(legacyCredentialArg);
|
|
176
|
+
const acceptedRegistration = snapshotClusterRelayAcceptedRegistration(acceptedRegistrationArg);
|
|
177
|
+
if ((await validateClusterLegacyRelayCredentialInvalidation(invalidation)).length
|
|
178
|
+
|| (await validateClusterLegacyRelayCredential(legacyCredential)).length
|
|
179
|
+
|| (await validateClusterRelayAcceptedRegistration(acceptedRegistration)).length)
|
|
180
|
+
fail();
|
|
181
|
+
requireNetwork(legacyCredential.clusterId === invalidation.clusterId
|
|
182
|
+
&& acceptedRegistration.clusterId === invalidation.clusterId
|
|
183
|
+
&& invalidationNamesLegacyCredential(invalidation, legacyCredential)
|
|
184
|
+
&& networkEqual(invalidation.acceptedRegistration, networkReferenceOf(acceptedRegistration))
|
|
185
|
+
&& networkEqual(invalidation.replacement, acceptedRegistration.credential));
|
|
186
|
+
return { invalidation, legacyCredential, acceptedRegistration };
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return fail();
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3RlcnJlbGF5Y3JlZGVudGlhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvY2x1c3RlcnJlbGF5Y3JlZGVudGlhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0wsd0NBQXdDLEVBQ3hDLHdDQUF3QyxHQUN6QyxNQUFNLGNBQWMsQ0FBQztBQUt0QixPQUFPLEVBQ0wsY0FBYyxFQUNkLGNBQWMsRUFDZCxhQUFhLEVBQ2IsWUFBWSxFQUNaLFdBQVcsRUFDWCxTQUFTLEVBQ1QsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsY0FBYyxHQUNmLE1BQU0sK0JBQStCLENBQUM7QUE4R3ZDLE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDMUQsc0JBQXNCLEVBQUUscUNBQXFDO0lBQzdELDRCQUE0QixFQUFFLDRDQUE0QztJQUMxRSw4QkFBOEIsRUFBRSx5REFBeUQ7Q0FDakYsQ0FBQyxDQUFDO0FBRVosOEZBQThGO0FBQzlGLE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDMUQsbUVBQW1FO0lBQ25FLHlCQUF5QjtJQUN6QiwyRUFBMkU7SUFDM0UsMEJBQTBCO0lBQzFCLGlGQUFpRjtJQUNqRixtQ0FBbUM7SUFDbkMsNkZBQTZGO0lBQzdGLDJDQUEyQztJQUMzQyxpR0FBaUc7SUFDakcsNENBQTRDO0lBQzVDLHNGQUFzRjtJQUN0RixrQ0FBa0M7SUFDbEMsaUdBQWlHO0lBQ2pHLFVBQVU7Q0FDRixDQUFDLENBQUM7QUFJWixNQUFNLElBQUksR0FBRyxHQUFVLEVBQUUsR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUYsTUFBTSxJQUFJLEdBQUcsQ0FBSSxZQUFxQixFQUFLLEVBQUU7SUFDM0MsSUFBSSxDQUFDO1FBQUMsT0FBTyxZQUFZ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
|
package/dist_ts/data/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export * from './cluster.js';
|
|
|
3
3
|
export * from './clusterruntime.js';
|
|
4
4
|
export * from './clustervpn.js';
|
|
5
5
|
export * from './clusteringress.js';
|
|
6
|
+
export * from './clusterrelaycredential.js';
|
|
6
7
|
export * from './config.js';
|
|
7
8
|
export * from './corestore.js';
|
|
8
9
|
export * from './coremail.js';
|
|
@@ -41,6 +42,7 @@ export * from './networkprotection.js';
|
|
|
41
42
|
export * from './networksigning.js';
|
|
42
43
|
export * from './privatenetwork.js';
|
|
43
44
|
export * from './registry.js';
|
|
45
|
+
export * from './releaseversion.js';
|
|
44
46
|
export * from './runtimeassignment.js';
|
|
45
47
|
export * from './runtimeconfig.js';
|
|
46
48
|
export * from './runtimestorageclaim.js';
|
|
@@ -52,6 +54,7 @@ export * from './baseos.js';
|
|
|
52
54
|
export * from './backup.js';
|
|
53
55
|
export * from './clusternode.js';
|
|
54
56
|
export * from './settings.js';
|
|
57
|
+
export * from './sparklegacyretirement.js';
|
|
55
58
|
export * from './sparknodereport.js';
|
|
56
59
|
export * from './service.js';
|
|
57
60
|
export * from './servicecredential.js';
|
package/dist_ts/data/index.js
CHANGED
|
@@ -3,6 +3,7 @@ export * from './cluster.js';
|
|
|
3
3
|
export * from './clusterruntime.js';
|
|
4
4
|
export * from './clustervpn.js';
|
|
5
5
|
export * from './clusteringress.js';
|
|
6
|
+
export * from './clusterrelaycredential.js';
|
|
6
7
|
export * from './config.js';
|
|
7
8
|
export * from './corestore.js';
|
|
8
9
|
export * from './coremail.js';
|
|
@@ -40,6 +41,7 @@ export * from './networkprotection.js';
|
|
|
40
41
|
export * from './networksigning.js';
|
|
41
42
|
export * from './privatenetwork.js';
|
|
42
43
|
export * from './registry.js';
|
|
44
|
+
export * from './releaseversion.js';
|
|
43
45
|
export * from './runtimeassignment.js';
|
|
44
46
|
export * from './runtimeconfig.js';
|
|
45
47
|
export * from './runtimestorageclaim.js';
|
|
@@ -51,6 +53,7 @@ export * from './baseos.js';
|
|
|
51
53
|
export * from './backup.js';
|
|
52
54
|
export * from './clusternode.js';
|
|
53
55
|
export * from './settings.js';
|
|
56
|
+
export * from './sparklegacyretirement.js';
|
|
54
57
|
export * from './sparknodereport.js';
|
|
55
58
|
export * from './service.js';
|
|
56
59
|
export * from './servicecredential.js';
|
|
@@ -62,4 +65,4 @@ export * from './traffic.js';
|
|
|
62
65
|
export * from './user.js';
|
|
63
66
|
export * from './version.js';
|
|
64
67
|
export * from './webpush.js';
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyx3QkFBd0IsQ0FBQztBQUV2QyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxjQUFjLENBQUMifQ==
|
|
@@ -45,4 +45,4 @@ export const compareReleaseVersions = (leftArg, rightArg) => {
|
|
|
45
45
|
}
|
|
46
46
|
return leftArg.patch - rightArg.patch;
|
|
47
47
|
};
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsZWFzZXZlcnNpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL3JlbGVhc2V2ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWNBLDRFQUE0RTtBQUM1RSxNQUFNLHFCQUFxQixHQUFHLHFEQUFxRCxDQUFDO0FBRXBGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxDQUFDO0FBRTlDOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsUUFBaUIsRUFBMEIsRUFBRTtJQUMvRSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLDJCQUEyQixFQUFFLENBQUM7UUFDbEYsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hELElBQUksVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqRyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNqQyxDQUFDLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsUUFBaUIsRUFBc0IsRUFBRSxDQUFDLENBQ3pFLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksQ0FDdkMsQ0FBQztBQUVGLGdHQUFnRztBQUNoRyxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUNwQyxPQUF3QixFQUN4QixRQUF5QixFQUNqQixFQUFFO0lBQ1YsSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNyQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUN4QyxDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNyQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUN4QyxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7QUFDeEMsQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import type { IFleetCutoverAcceptedEvidenceReference } from './fleetcutover.js';
|
|
2
|
+
import type { TSha256Digest } from './immutableimage.js';
|
|
3
|
+
/** The two runtimes a released Spark could be put into by its `mode` configuration key. */
|
|
4
|
+
export declare const sparkLegacyRuntimeModes: readonly ["cloudly", "coreflow-node"];
|
|
5
|
+
export type TSparkLegacyRuntimeMode = typeof sparkLegacyRuntimeModes[number];
|
|
6
|
+
/**
|
|
7
|
+
* Which Docker services a released mode owns, sorted, so a refusal names a mode instead of
|
|
8
|
+
* restating a set. A record over the mode union: a mode cannot be added without naming its
|
|
9
|
+
* services, and a reader can never meet a mode whose services it does not know.
|
|
10
|
+
*/
|
|
11
|
+
export declare const sparkLegacyRuntimeModeServices: Readonly<{
|
|
12
|
+
cloudly: readonly string[];
|
|
13
|
+
'coreflow-node': readonly string[];
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* Which verified Spark code is installed on one host and which systemd unit will boot it.
|
|
17
|
+
*
|
|
18
|
+
* Every member is read back from the installed tree and the installed unit file, never from the
|
|
19
|
+
* running process's own build constants: a build can state its own version, it cannot state that
|
|
20
|
+
* the host will start that same code again.
|
|
21
|
+
*/
|
|
22
|
+
export interface ISparkNodeBundleIdentity {
|
|
23
|
+
/** The installed bundle's release, exactly as its verified manifest names it. */
|
|
24
|
+
version: string;
|
|
25
|
+
/** The commit that manifest was built from, in the 40-hex form the manifest carries. */
|
|
26
|
+
sourceCommit: string;
|
|
27
|
+
/** The manifest digest the installed tree was verified against, in its bare 64-hex form. */
|
|
28
|
+
manifestSha256: string;
|
|
29
|
+
/** The systemd unit that starts this bundle at boot. */
|
|
30
|
+
unitName: string;
|
|
31
|
+
/** SHA-256 of the exact installed unit-file bytes. */
|
|
32
|
+
unitDigest: TSha256Digest;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* What became of the released configuration source once this node stopped reading it.
|
|
36
|
+
*
|
|
37
|
+
* A tuple beside the union, exactly like `sparkLegacyRuntimeModes`: a reader that has to name the
|
|
38
|
+
* two states — a form, a migration, a refusal message — reads them from the contract instead of
|
|
39
|
+
* restating two string literals the contract could later disagree with.
|
|
40
|
+
*/
|
|
41
|
+
export declare const sparkLegacyConfigurationDispositions: readonly ["retained-inert", "removed"];
|
|
42
|
+
export type TSparkLegacyConfigurationDisposition = typeof sparkLegacyConfigurationDispositions[number];
|
|
43
|
+
/**
|
|
44
|
+
* The released key-value configuration source, by digest and disposition only.
|
|
45
|
+
*
|
|
46
|
+
* Never its bytes and never a decoded member: that file carries this node's released bearer and
|
|
47
|
+
* its jump code. `sourceSha256` covers the whole file, whose smallest unguessable part is a
|
|
48
|
+
* 256-bit token, so it identifies the file without stating anything that is in it.
|
|
49
|
+
*/
|
|
50
|
+
export interface ISparkLegacyConfigurationState {
|
|
51
|
+
/** The node's own monotonic counter; one accepted local disposition change advances it by one. */
|
|
52
|
+
ownerGeneration: number;
|
|
53
|
+
/** SHA-256 of the exact source bytes this node imported, once, under its fenced read. */
|
|
54
|
+
sourceSha256: string;
|
|
55
|
+
/** On disk and read by nothing, or unlinked. Erasure is not a cutover requirement. */
|
|
56
|
+
disposition: TSparkLegacyConfigurationDisposition;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* What one node states about the released Spark runtime it is replacing, on one observation.
|
|
60
|
+
*
|
|
61
|
+
* Observed values and one statement the owner makes about its own behaviour. It names no node:
|
|
62
|
+
* Cloudly binds it to the reporter it already authenticated, so there is nothing to disagree
|
|
63
|
+
* with. It carries no digest of its own either, because the whole observation is digested by
|
|
64
|
+
* `computeSparkSwarmObservationDigest`.
|
|
65
|
+
*/
|
|
66
|
+
export interface ISparkLegacyRuntimeRetirement {
|
|
67
|
+
/** The released mode this process is configured in and no longer serves. */
|
|
68
|
+
refusedMode: TSparkLegacyRuntimeMode;
|
|
69
|
+
bundle: ISparkNodeBundleIdentity;
|
|
70
|
+
configuration: ISparkLegacyConfigurationState;
|
|
71
|
+
}
|
|
72
|
+
interface ISparkLegacyRetirementReceiptBase {
|
|
73
|
+
id: string;
|
|
74
|
+
generation: number;
|
|
75
|
+
previous: IFleetCutoverAcceptedEvidenceReference | null;
|
|
76
|
+
clusterId: string;
|
|
77
|
+
nodeId: string;
|
|
78
|
+
/** The accepted observation this was derived from; Cloudly read it, the node never named it. */
|
|
79
|
+
observation: IFleetCutoverAcceptedEvidenceReference;
|
|
80
|
+
reporterSessionId: string;
|
|
81
|
+
observationSequence: number;
|
|
82
|
+
acceptedAt: number;
|
|
83
|
+
digest: TSha256Digest;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Cloudly's accepted record that one node refuses its released owning mode.
|
|
87
|
+
*
|
|
88
|
+
* It is revisioned rather than written once: a node restates the refusal on every observation,
|
|
89
|
+
* and a bundle upgrade changes what the boot path is, which is a new fact about the same node.
|
|
90
|
+
*/
|
|
91
|
+
export interface ISparkLegacyModeRefusal extends ISparkLegacyRetirementReceiptBase {
|
|
92
|
+
refusedMode: TSparkLegacyRuntimeMode;
|
|
93
|
+
bundle: ISparkNodeBundleIdentity;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Cloudly's accepted record of one node's released configuration source at an exact generation.
|
|
97
|
+
*
|
|
98
|
+
* Two counters, deliberately: `generation` is contiguous because it is this record's own
|
|
99
|
+
* revision, while `configuration.ownerGeneration` is the node's and may skip — an observation
|
|
100
|
+
* that never arrived must not look like a skipped revision here.
|
|
101
|
+
*/
|
|
102
|
+
export interface ISparkLegacyConfigurationRetirement extends ISparkLegacyRetirementReceiptBase {
|
|
103
|
+
configuration: ISparkLegacyConfigurationState;
|
|
104
|
+
}
|
|
105
|
+
export declare const sparkLegacyRetirementContract: Readonly<{
|
|
106
|
+
readonly modeRefusalDigestDomain: "serve.zone/spark-legacy-mode-refusal";
|
|
107
|
+
readonly configurationRetirementDigestDomain: "serve.zone/spark-legacy-configuration-retirement";
|
|
108
|
+
}>;
|
|
109
|
+
/** Every reason Cloudly answers instead of advancing a node's legacy retirement state. */
|
|
110
|
+
export declare const sparkLegacyRetirementRefusals: readonly ["legacy-retirement-generation-stale", "legacy-retirement-generation-conflict", "legacy-retirement-source-changed", "legacy-retirement-disposition-reversed", "legacy-retirement-bundle-below-minimum"];
|
|
111
|
+
export type TSparkLegacyRetirementRefusal = typeof sparkLegacyRetirementRefusals[number];
|
|
112
|
+
/**
|
|
113
|
+
* What the server did with the statement one observation carried, answered on that observation's
|
|
114
|
+
* own accepted receipt.
|
|
115
|
+
*
|
|
116
|
+
* The statement is judged against records, not against the message: a malformed one is already
|
|
117
|
+
* refused by `validateSparkLegacyRuntimeRetirement` before any of this, so everything left is a
|
|
118
|
+
* fact about this node's history. That is why a refusal here does not reject the observation —
|
|
119
|
+
* the node's liveness and census are true whatever its released runtime states — and why an
|
|
120
|
+
* accepted observation is the only place this outcome appears.
|
|
121
|
+
*
|
|
122
|
+
* `generation` is the revision both node-owned records stand at once the observation is accepted:
|
|
123
|
+
* `accepted` advanced it, `restated` is the replay that renewed nothing and left it where it was.
|
|
124
|
+
* A refusal carries no generation, because the counter a refused node has to reconcile with is
|
|
125
|
+
* its own `ownerGeneration`, which it already holds.
|
|
126
|
+
*/
|
|
127
|
+
export type TSparkLegacyRetirementOutcome = {
|
|
128
|
+
state: 'accepted';
|
|
129
|
+
/** The revision this observation advanced both records to. */
|
|
130
|
+
generation: number;
|
|
131
|
+
} | {
|
|
132
|
+
state: 'restated';
|
|
133
|
+
/** The revision that stands; this observation added nothing to it. */
|
|
134
|
+
generation: number;
|
|
135
|
+
} | {
|
|
136
|
+
state: 'refused';
|
|
137
|
+
refusal: TSparkLegacyRetirementRefusal;
|
|
138
|
+
/**
|
|
139
|
+
* Always false, and stated anyway.
|
|
140
|
+
*
|
|
141
|
+
* Every refusal of this family answers one exact statement, so resending it cannot change
|
|
142
|
+
* the answer; a server-side race is refused one level up, as the observation's own
|
|
143
|
+
* `acceptance-race`. It travels on the wire for the reason the rejected receipt carries its
|
|
144
|
+
* own flag: a node that meets a refusal name a later minor added still learns it must stop.
|
|
145
|
+
*/
|
|
146
|
+
retryable: false;
|
|
147
|
+
};
|
|
148
|
+
/** Structural copy only; whether the tree it describes is installed is the node's to observe. */
|
|
149
|
+
export declare const snapshotSparkNodeBundleIdentity: (valueArg: unknown) => ISparkNodeBundleIdentity;
|
|
150
|
+
export declare const snapshotSparkLegacyConfigurationState: (valueArg: unknown) => ISparkLegacyConfigurationState;
|
|
151
|
+
export declare const snapshotSparkLegacyRuntimeRetirement: (valueArg: unknown) => ISparkLegacyRuntimeRetirement;
|
|
152
|
+
/**
|
|
153
|
+
* Synchronous because the member carries no digest: the observation that transports it is
|
|
154
|
+
* digested as a whole, so a second domain here would only be a second thing to keep in step.
|
|
155
|
+
*/
|
|
156
|
+
export declare const validateSparkLegacyRuntimeRetirement: (valueArg: unknown) => string[];
|
|
157
|
+
/** Exact-key per state, like every other shape here: an outcome states one answer and no other. */
|
|
158
|
+
export declare const snapshotSparkLegacyRetirementOutcome: (valueArg: unknown) => TSparkLegacyRetirementOutcome;
|
|
159
|
+
/** Synchronous for the same reason: the receipt that carries it is what a reader binds. */
|
|
160
|
+
export declare const validateSparkLegacyRetirementOutcome: (valueArg: unknown) => string[];
|
|
161
|
+
export declare const snapshotSparkLegacyModeRefusal: (valueArg: unknown) => ISparkLegacyModeRefusal;
|
|
162
|
+
export declare const computeSparkLegacyModeRefusalDigest: (valueArg: unknown) => Promise<TSha256Digest>;
|
|
163
|
+
export declare const validateSparkLegacyModeRefusal: (valueArg: unknown) => Promise<string[]>;
|
|
164
|
+
export declare const snapshotSparkLegacyConfigurationRetirement: (valueArg: unknown) => ISparkLegacyConfigurationRetirement;
|
|
165
|
+
export declare const computeSparkLegacyConfigurationRetirementDigest: (valueArg: unknown) => Promise<TSha256Digest>;
|
|
166
|
+
export declare const validateSparkLegacyConfigurationRetirement: (valueArg: unknown) => Promise<string[]>;
|
|
167
|
+
/**
|
|
168
|
+
* Whether one observed configuration state is a legal successor of the accepted one.
|
|
169
|
+
*
|
|
170
|
+
* `null` is a node's first accepted state. A replay states the accepted generation again and is
|
|
171
|
+
* therefore not an advance: it renews nothing, which is what keeps `acceptedAt` and the named
|
|
172
|
+
* observation from aging forward on a node that has stopped changing.
|
|
173
|
+
*/
|
|
174
|
+
export declare const advancesSparkLegacyConfigurationState: (currentArg: ISparkLegacyConfigurationState | null, nextArg: ISparkLegacyConfigurationState) => boolean;
|
|
175
|
+
/**
|
|
176
|
+
* Joins the two accepted receipts a Coreflow retirement cites to the one observation they were
|
|
177
|
+
* derived from.
|
|
178
|
+
*
|
|
179
|
+
* Content join only. Whether each receipt is its node's current revision, and whether the
|
|
180
|
+
* observation it names is still fresh, remain Cloudly's to decide against its own records.
|
|
181
|
+
*/
|
|
182
|
+
export declare const bindSparkLegacyRetirement: (modeRefusalArg: unknown, configurationRetirementArg: unknown) => Promise<{
|
|
183
|
+
modeRefusal: ISparkLegacyModeRefusal;
|
|
184
|
+
configurationRetirement: ISparkLegacyConfigurationRetirement;
|
|
185
|
+
}>;
|
|
186
|
+
export {};
|