@serve.zone/interfaces 23.2.0 → 24.1.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.
@@ -1,2 +1,421 @@
1
1
  import * as plugins from '../plugins.js';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3Rlcm5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2NsdXN0ZXJub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDIn0=
2
+ const runtimeIdentifierRegex = /^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/;
3
+ const runtimeDigestRegex = /^sha256:[a-f0-9]{64}$/;
4
+ const runtimePlatforms = new Set([
5
+ 'linux/amd64',
6
+ 'linux/arm64',
7
+ ]);
8
+ const maximumSwarmNodes = 1024;
9
+ const isRuntimeRecord = (valueArg) => (Boolean(valueArg) && typeof valueArg === 'object' && !Array.isArray(valueArg));
10
+ const hasExactRuntimeKeys = (valueArg, keysArg) => JSON.stringify(Object.keys(valueArg).sort()) === JSON.stringify([...keysArg].sort());
11
+ const isRuntimeIdentifier = (valueArg) => (typeof valueArg === 'string' && runtimeIdentifierRegex.test(valueArg));
12
+ const isPositiveSafeInteger = (valueArg) => (Number.isSafeInteger(valueArg) && valueArg > 0);
13
+ const computeSha256 = async (inputArg) => {
14
+ const digest = new Uint8Array(await globalThis.crypto.subtle.digest('SHA-256', new TextEncoder().encode(inputArg)));
15
+ return `sha256:${[...digest]
16
+ .map((byteArg) => byteArg.toString(16).padStart(2, '0'))
17
+ .join('')}`;
18
+ };
19
+ const canonicalSwarmNode = (nodeArg) => ({
20
+ swarmNodeId: nodeArg.swarmNodeId,
21
+ nodeName: nodeArg.nodeName,
22
+ platform: nodeArg.platform,
23
+ role: nodeArg.role,
24
+ availability: nodeArg.availability,
25
+ state: nodeArg.state,
26
+ managerStatus: nodeArg.managerStatus
27
+ ? {
28
+ leader: nodeArg.managerStatus.leader,
29
+ reachability: nodeArg.managerStatus.reachability,
30
+ }
31
+ : null,
32
+ });
33
+ export const createSwarmManagerSnapshotDigestInput = (swarmClusterIdArg, snapshotArg) => JSON.stringify({
34
+ schemaVersion: 1,
35
+ purpose: 'serve.zone/swarm-manager-snapshot',
36
+ swarmClusterId: swarmClusterIdArg,
37
+ snapshotVersion: snapshotArg.snapshotVersion,
38
+ nodeCount: snapshotArg.nodeCount,
39
+ managerCount: snapshotArg.managerCount,
40
+ nodes: snapshotArg.nodes.map(canonicalSwarmNode),
41
+ });
42
+ export const computeSwarmManagerSnapshotDigest = async (swarmClusterIdArg, snapshotArg) => computeSha256(createSwarmManagerSnapshotDigestInput(swarmClusterIdArg, snapshotArg));
43
+ const validateSwarmManagerSnapshot = async (swarmClusterIdArg, localSwarmNodeIdArg, snapshotArg) => {
44
+ if (!isRuntimeRecord(snapshotArg)
45
+ || !hasExactRuntimeKeys(snapshotArg, [
46
+ 'snapshotVersion',
47
+ 'snapshotDigest',
48
+ 'nodeCount',
49
+ 'managerCount',
50
+ 'nodes',
51
+ ])) {
52
+ return ['Spark Swarm manager snapshot must use its exact schema'];
53
+ }
54
+ const errors = [];
55
+ if (snapshotArg.snapshotVersion !== 1) {
56
+ errors.push('Spark Swarm manager snapshotVersion must be 1');
57
+ }
58
+ if (typeof snapshotArg.snapshotDigest !== 'string'
59
+ || !runtimeDigestRegex.test(snapshotArg.snapshotDigest)) {
60
+ errors.push('Spark Swarm manager snapshot digest must be canonical');
61
+ }
62
+ if (!Array.isArray(snapshotArg.nodes)
63
+ || snapshotArg.nodes.length === 0
64
+ || snapshotArg.nodes.length > maximumSwarmNodes) {
65
+ errors.push('Spark Swarm manager snapshot nodes must be a non-empty bounded array');
66
+ return errors;
67
+ }
68
+ if (snapshotArg.nodeCount !== snapshotArg.nodes.length
69
+ || !isPositiveSafeInteger(snapshotArg.nodeCount)) {
70
+ errors.push('Spark Swarm manager snapshot nodeCount must match nodes');
71
+ }
72
+ const nodeIds = new Set();
73
+ const nodeNames = new Set();
74
+ let managerCount = 0;
75
+ let leaderCount = 0;
76
+ let previousSortKey;
77
+ for (const [index, nodeArg] of snapshotArg.nodes.entries()) {
78
+ if (!isRuntimeRecord(nodeArg)) {
79
+ errors.push(`Spark Swarm manager snapshot nodes[${index}] must be an object`);
80
+ continue;
81
+ }
82
+ const isManager = nodeArg.role === 'manager';
83
+ const expectedKeys = [
84
+ 'swarmNodeId',
85
+ 'nodeName',
86
+ 'platform',
87
+ 'role',
88
+ 'availability',
89
+ 'state',
90
+ ...(isManager ? ['managerStatus'] : []),
91
+ ];
92
+ if (!hasExactRuntimeKeys(nodeArg, expectedKeys)) {
93
+ errors.push(`Spark Swarm manager snapshot nodes[${index}] must use its exact role schema`);
94
+ }
95
+ if (!isRuntimeIdentifier(nodeArg.swarmNodeId) || !isRuntimeIdentifier(nodeArg.nodeName)) {
96
+ errors.push(`Spark Swarm manager snapshot nodes[${index}] identity must be canonical`);
97
+ }
98
+ if (!runtimePlatforms.has(nodeArg.platform)) {
99
+ errors.push(`Spark Swarm manager snapshot nodes[${index}] platform must be supported`);
100
+ }
101
+ if (!['manager', 'worker'].includes(nodeArg.role)
102
+ || !['active', 'pause', 'drain'].includes(nodeArg.availability)
103
+ || !['unknown', 'down', 'ready', 'disconnected'].includes(nodeArg.state)) {
104
+ errors.push(`Spark Swarm manager snapshot nodes[${index}] scheduler state must be canonical`);
105
+ }
106
+ if (isManager) {
107
+ managerCount++;
108
+ if (!isRuntimeRecord(nodeArg.managerStatus)
109
+ || !hasExactRuntimeKeys(nodeArg.managerStatus, ['leader', 'reachability'])
110
+ || typeof nodeArg.managerStatus.leader !== 'boolean'
111
+ || !['unknown', 'unreachable', 'reachable']
112
+ .includes(nodeArg.managerStatus.reachability)) {
113
+ errors.push(`Spark Swarm manager snapshot nodes[${index}] managerStatus must be canonical`);
114
+ }
115
+ else if (nodeArg.managerStatus.leader) {
116
+ leaderCount++;
117
+ }
118
+ }
119
+ if (isRuntimeIdentifier(nodeArg.swarmNodeId)) {
120
+ if (nodeIds.has(nodeArg.swarmNodeId)) {
121
+ errors.push('Spark Swarm manager snapshot node IDs must be unique');
122
+ }
123
+ nodeIds.add(nodeArg.swarmNodeId);
124
+ }
125
+ if (isRuntimeIdentifier(nodeArg.nodeName)) {
126
+ if (nodeNames.has(nodeArg.nodeName)) {
127
+ errors.push('Spark Swarm manager snapshot node names must be unique');
128
+ }
129
+ nodeNames.add(nodeArg.nodeName);
130
+ }
131
+ if (isRuntimeIdentifier(nodeArg.swarmNodeId) && isRuntimeIdentifier(nodeArg.nodeName)) {
132
+ const sortKey = `${nodeArg.swarmNodeId}\0${nodeArg.nodeName}\0${nodeArg.platform}`;
133
+ if (previousSortKey !== undefined && sortKey <= previousSortKey) {
134
+ errors.push('Spark Swarm manager snapshot nodes must be uniquely sorted');
135
+ }
136
+ previousSortKey = sortKey;
137
+ }
138
+ }
139
+ if (snapshotArg.managerCount !== managerCount || !isPositiveSafeInteger(snapshotArg.managerCount)) {
140
+ errors.push('Spark Swarm manager snapshot managerCount must match nodes');
141
+ }
142
+ if (leaderCount > 1)
143
+ errors.push('Spark Swarm manager snapshot may contain at most one leader');
144
+ const sourceNode = snapshotArg.nodes.find((nodeArg) => (isRuntimeRecord(nodeArg) && nodeArg.swarmNodeId === localSwarmNodeIdArg));
145
+ if (!isRuntimeRecord(sourceNode)
146
+ || sourceNode.role !== 'manager'
147
+ || sourceNode.availability !== 'active'
148
+ || sourceNode.state !== 'ready'
149
+ || !isRuntimeRecord(sourceNode.managerStatus)
150
+ || sourceNode.managerStatus.reachability !== 'reachable') {
151
+ errors.push('Spark Swarm manager snapshot source must be an active reachable manager');
152
+ }
153
+ if (errors.length === 0
154
+ && snapshotArg.snapshotDigest !== await computeSwarmManagerSnapshotDigest(swarmClusterIdArg, snapshotArg)) {
155
+ errors.push('Spark Swarm manager snapshot digest does not match');
156
+ }
157
+ return errors;
158
+ };
159
+ export const validateSparkSwarmObservation = async (observationArg) => {
160
+ try {
161
+ if (!isRuntimeRecord(observationArg))
162
+ return ['Spark Swarm observation must be an object'];
163
+ const observation = observationArg;
164
+ const commonKeys = [
165
+ 'schemaVersion',
166
+ 'reporterSessionId',
167
+ 'observationSequence',
168
+ 'observedAt',
169
+ 'state',
170
+ ];
171
+ const expectedKeys = observation.state === 'unknown'
172
+ ? [...commonKeys, 'reason']
173
+ : observation.state === 'not-member'
174
+ ? commonKeys
175
+ : observation.state === 'member'
176
+ ? [
177
+ ...commonKeys,
178
+ 'swarmClusterId',
179
+ 'localSwarmNodeId',
180
+ 'controlAvailable',
181
+ ...(observation.managerSnapshot === undefined ? [] : ['managerSnapshot']),
182
+ ]
183
+ : [];
184
+ if (expectedKeys.length === 0 || !hasExactRuntimeKeys(observation, expectedKeys)) {
185
+ return ['Spark Swarm observation must use its exact state schema'];
186
+ }
187
+ const errors = [];
188
+ if (observation.schemaVersion !== 1)
189
+ errors.push('Spark Swarm observation schemaVersion must be 1');
190
+ if (!isRuntimeIdentifier(observation.reporterSessionId)
191
+ || !isPositiveSafeInteger(observation.observationSequence)
192
+ || !isPositiveSafeInteger(observation.observedAt)) {
193
+ errors.push('Spark Swarm observation identity, sequence, and timestamp must be canonical');
194
+ }
195
+ if (observation.state === 'unknown'
196
+ && !['docker-unavailable', 'query-failed', 'not-initialized']
197
+ .includes(observation.reason)) {
198
+ errors.push('Spark Swarm observation unknown reason must be canonical');
199
+ }
200
+ if (observation.state === 'member') {
201
+ if (!isRuntimeIdentifier(observation.swarmClusterId)
202
+ || !isRuntimeIdentifier(observation.localSwarmNodeId)
203
+ || typeof observation.controlAvailable !== 'boolean') {
204
+ errors.push('Spark Swarm member observation must have canonical local authority');
205
+ }
206
+ if (observation.managerSnapshot !== undefined) {
207
+ if (observation.controlAvailable !== true) {
208
+ errors.push('Spark Swarm manager snapshot requires controlAvailable');
209
+ }
210
+ else if (isRuntimeIdentifier(observation.swarmClusterId)
211
+ && isRuntimeIdentifier(observation.localSwarmNodeId)) {
212
+ errors.push(...await validateSwarmManagerSnapshot(observation.swarmClusterId, observation.localSwarmNodeId, observation.managerSnapshot));
213
+ }
214
+ }
215
+ }
216
+ return errors;
217
+ }
218
+ catch {
219
+ return ['Spark Swarm observation must be safely inspectable'];
220
+ }
221
+ };
222
+ export const validateSparkSwarmObservationV2 = async (observationArg) => {
223
+ try {
224
+ if (!isRuntimeRecord(observationArg))
225
+ return ['Spark Swarm observation v2 must be an object'];
226
+ const observation = observationArg;
227
+ const commonKeys = [
228
+ 'schemaVersion',
229
+ 'reporterSessionId',
230
+ 'observationSequence',
231
+ 'observedAt',
232
+ 'state',
233
+ ];
234
+ const expectedKeys = observation.state === 'unknown'
235
+ ? [...commonKeys, 'reason']
236
+ : observation.state === 'not-member'
237
+ ? commonKeys
238
+ : observation.state === 'member' && observation.controlAvailable === false
239
+ ? [...commonKeys, 'localSwarmNodeId', 'controlAvailable']
240
+ : observation.state === 'member' && observation.controlAvailable === true
241
+ ? [
242
+ ...commonKeys,
243
+ 'swarmClusterId',
244
+ 'localSwarmNodeId',
245
+ 'controlAvailable',
246
+ ...(observation.managerSnapshot === undefined ? [] : ['managerSnapshot']),
247
+ ]
248
+ : [];
249
+ if (expectedKeys.length === 0 || !hasExactRuntimeKeys(observation, expectedKeys)) {
250
+ return ['Spark Swarm observation v2 must use its exact state schema'];
251
+ }
252
+ const errors = [];
253
+ if (observation.schemaVersion !== 2) {
254
+ errors.push('Spark Swarm observation v2 schemaVersion must be 2');
255
+ }
256
+ if (!isRuntimeIdentifier(observation.reporterSessionId)
257
+ || !isPositiveSafeInteger(observation.observationSequence)
258
+ || !isPositiveSafeInteger(observation.observedAt)) {
259
+ errors.push('Spark Swarm observation v2 identity, sequence, and timestamp must be canonical');
260
+ }
261
+ if (observation.state === 'unknown'
262
+ && !['docker-unavailable', 'query-failed', 'not-initialized']
263
+ .includes(observation.reason)) {
264
+ errors.push('Spark Swarm observation v2 unknown reason must be canonical');
265
+ }
266
+ if (observation.state === 'member') {
267
+ if (!isRuntimeIdentifier(observation.localSwarmNodeId)
268
+ || typeof observation.controlAvailable !== 'boolean') {
269
+ errors.push('Spark Swarm member observation v2 must have canonical local authority');
270
+ }
271
+ if (observation.controlAvailable === true) {
272
+ if (!isRuntimeIdentifier(observation.swarmClusterId)) {
273
+ errors.push('Spark Swarm manager observation v2 must have canonical cluster authority');
274
+ }
275
+ else if (observation.managerSnapshot !== undefined
276
+ && isRuntimeIdentifier(observation.localSwarmNodeId)) {
277
+ errors.push(...await validateSwarmManagerSnapshot(observation.swarmClusterId, observation.localSwarmNodeId, observation.managerSnapshot));
278
+ }
279
+ }
280
+ }
281
+ return errors;
282
+ }
283
+ catch {
284
+ return ['Spark Swarm observation v2 must be safely inspectable'];
285
+ }
286
+ };
287
+ const canonicalRuntimeTarget = (targetArg) => ({
288
+ cloudlyNodeId: targetArg.cloudlyNodeId,
289
+ swarmClusterId: targetArg.swarmClusterId,
290
+ swarmNodeId: targetArg.swarmNodeId,
291
+ nodeName: targetArg.nodeName,
292
+ platform: targetArg.platform,
293
+ });
294
+ export const createClusterRuntimeTargetSetDigestInput = (targetSetArg) => JSON.stringify({
295
+ schemaVersion: targetSetArg.schemaVersion,
296
+ purpose: 'serve.zone/cluster-runtime-target-set',
297
+ cloudlyClusterId: targetSetArg.cloudlyClusterId,
298
+ swarmClusterId: targetSetArg.swarmClusterId,
299
+ generation: targetSetArg.generation,
300
+ targets: targetSetArg.targets.map(canonicalRuntimeTarget),
301
+ });
302
+ export const computeClusterRuntimeTargetSetDigest = async (targetSetArg) => computeSha256(createClusterRuntimeTargetSetDigestInput(targetSetArg));
303
+ export const validateClusterRuntimeTargetSet = async (targetSetArg) => {
304
+ try {
305
+ if (!isRuntimeRecord(targetSetArg))
306
+ return ['cluster runtime target set must be an object'];
307
+ if (targetSetArg.state === 'unavailable') {
308
+ if (!hasExactRuntimeKeys(targetSetArg, [
309
+ 'schemaVersion',
310
+ 'state',
311
+ 'cloudlyClusterId',
312
+ 'generation',
313
+ 'changedAt',
314
+ 'reason',
315
+ ])) {
316
+ return ['unavailable cluster runtime target set must use its exact schema'];
317
+ }
318
+ const errors = [];
319
+ if (targetSetArg.schemaVersion !== 1
320
+ || !isRuntimeIdentifier(targetSetArg.cloudlyClusterId)
321
+ || !Number.isSafeInteger(targetSetArg.generation)
322
+ || targetSetArg.generation < 0
323
+ || !isPositiveSafeInteger(targetSetArg.changedAt)
324
+ || ![
325
+ 'never-observed',
326
+ 'stale',
327
+ 'no-manager-consensus',
328
+ 'identity-conflict',
329
+ 'no-schedulable-targets',
330
+ ].includes(targetSetArg.reason)) {
331
+ errors.push('unavailable cluster runtime target set fields must be canonical');
332
+ }
333
+ if (targetSetArg.reason === 'never-observed' && targetSetArg.generation !== 0) {
334
+ errors.push('never-observed target state must use generation zero');
335
+ }
336
+ return errors;
337
+ }
338
+ if (targetSetArg.state !== 'ready'
339
+ || !hasExactRuntimeKeys(targetSetArg, [
340
+ 'schemaVersion',
341
+ 'state',
342
+ 'cloudlyClusterId',
343
+ 'swarmClusterId',
344
+ 'generation',
345
+ 'targetSetDigest',
346
+ 'acceptedAt',
347
+ 'freshUntil',
348
+ 'targets',
349
+ ])) {
350
+ return ['ready cluster runtime target set must use its exact schema'];
351
+ }
352
+ const errors = [];
353
+ if (targetSetArg.schemaVersion !== 1
354
+ || !isRuntimeIdentifier(targetSetArg.cloudlyClusterId)
355
+ || !isRuntimeIdentifier(targetSetArg.swarmClusterId)
356
+ || !isPositiveSafeInteger(targetSetArg.generation)
357
+ || !isPositiveSafeInteger(targetSetArg.acceptedAt)
358
+ || !isPositiveSafeInteger(targetSetArg.freshUntil)
359
+ || targetSetArg.freshUntil <= targetSetArg.acceptedAt
360
+ || typeof targetSetArg.targetSetDigest !== 'string'
361
+ || !runtimeDigestRegex.test(targetSetArg.targetSetDigest)) {
362
+ errors.push('ready cluster runtime target set authority fields must be canonical');
363
+ }
364
+ if (!Array.isArray(targetSetArg.targets)
365
+ || targetSetArg.targets.length === 0
366
+ || targetSetArg.targets.length > maximumSwarmNodes) {
367
+ errors.push('ready cluster runtime target set targets must be a non-empty bounded array');
368
+ return errors;
369
+ }
370
+ const cloudlyNodeIds = new Set();
371
+ const swarmNodeScopes = new Set();
372
+ const nodeNames = new Set();
373
+ let previousSortKey;
374
+ for (const [index, targetArg] of targetSetArg.targets.entries()) {
375
+ if (!isRuntimeRecord(targetArg)
376
+ || !hasExactRuntimeKeys(targetArg, [
377
+ 'cloudlyNodeId',
378
+ 'swarmClusterId',
379
+ 'swarmNodeId',
380
+ 'nodeName',
381
+ 'platform',
382
+ ])
383
+ || !isRuntimeIdentifier(targetArg.cloudlyNodeId)
384
+ || !isRuntimeIdentifier(targetArg.swarmClusterId)
385
+ || !isRuntimeIdentifier(targetArg.swarmNodeId)
386
+ || !isRuntimeIdentifier(targetArg.nodeName)
387
+ || targetArg.swarmClusterId !== targetSetArg.swarmClusterId
388
+ || !runtimePlatforms.has(targetArg.platform)) {
389
+ errors.push(`cluster runtime target set targets[${index}] must be canonical`);
390
+ continue;
391
+ }
392
+ const sortKey = `${targetArg.cloudlyNodeId}\0${targetArg.swarmClusterId}\0${targetArg.swarmNodeId}\0${targetArg.nodeName}\0${targetArg.platform}`;
393
+ if (previousSortKey !== undefined && sortKey <= previousSortKey) {
394
+ errors.push('cluster runtime target set targets must be uniquely sorted');
395
+ }
396
+ previousSortKey = sortKey;
397
+ const swarmScope = `${targetArg.swarmClusterId}\0${targetArg.swarmNodeId}`;
398
+ if (cloudlyNodeIds.has(targetArg.cloudlyNodeId)
399
+ || swarmNodeScopes.has(swarmScope)
400
+ || nodeNames.has(targetArg.nodeName)) {
401
+ errors.push('cluster runtime target identities must be unique');
402
+ }
403
+ cloudlyNodeIds.add(targetArg.cloudlyNodeId);
404
+ swarmNodeScopes.add(swarmScope);
405
+ nodeNames.add(targetArg.nodeName);
406
+ }
407
+ if (errors.length === 0
408
+ && targetSetArg.targetSetDigest !== await computeClusterRuntimeTargetSetDigest(targetSetArg)) {
409
+ errors.push('cluster runtime target set digest does not match');
410
+ }
411
+ return errors;
412
+ }
413
+ catch {
414
+ return ['cluster runtime target set must be safely inspectable'];
415
+ }
416
+ };
417
+ export const isClusterRuntimeTargetSetFresh = (targetSetArg, nowArg) => (targetSetArg.state === 'ready'
418
+ && Number.isSafeInteger(nowArg)
419
+ && nowArg >= targetSetArg.acceptedAt
420
+ && nowArg < targetSetArg.freshUntil);
421
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3Rlcm5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2NsdXN0ZXJub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBME56QyxNQUFNLHNCQUFzQixHQUFHLHFDQUFxQyxDQUFDO0FBQ3JFLE1BQU0sa0JBQWtCLEdBQUcsdUJBQXVCLENBQUM7QUFDbkQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBOEI7SUFDNUQsYUFBYTtJQUNiLGFBQWE7Q0FDZCxDQUFDLENBQUM7QUFDSCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUUvQixNQUFNLGVBQWUsR0FBRyxDQUFDLFFBQWlCLEVBQXVDLEVBQUUsQ0FBQyxDQUNsRixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FDOUUsQ0FBQztBQUVGLE1BQU0sbUJBQW1CLEdBQUcsQ0FDMUIsUUFBaUMsRUFDakMsT0FBaUIsRUFDUixFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUVuRyxNQUFNLG1CQUFtQixHQUFHLENBQUMsUUFBaUIsRUFBc0IsRUFBRSxDQUFDLENBQ3JFLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ3RFLENBQUM7QUFFRixNQUFNLHFCQUFxQixHQUFHLENBQUMsUUFBaUIsRUFBc0IsRUFBRSxDQUFDLENBQ3ZFLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUssUUFB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
@@ -2,7 +2,7 @@ import * as plugins from '../plugins.js';
2
2
  import type { TSha256Digest } from './immutableimage.js';
3
3
  export type TSecretEnvironment = string;
4
4
  export type TSecretLifecycleState = 'active' | 'retired' | 'revoked' | 'deleted';
5
- export type TSecretVersionLifecycleState = 'active' | 'retired' | 'revoked' | 'purged';
5
+ export type TSecretVersionLifecycleState = 'active' | 'retired' | 'revoked' | 'purge-pending' | 'purged';
6
6
  /** Retired versions remain usable only through an already-accepted manifest. */
7
7
  export declare const isSecretVersionMaterialIssuable: (lifecycleStateArg: TSecretVersionLifecycleState, referencedByAcceptedManifestArg: boolean) => boolean;
8
8
  export type TSecretManagementSource = 'operator' | 'appstore' | 'mail' | 'oidc' | 'webpush' | 'platform' | 'system';
@@ -36,6 +36,9 @@ export interface ISecretVersionRetentionReference {
36
36
  resourceId: string;
37
37
  expiresAt?: number;
38
38
  }
39
+ export declare const secretVersionRetentionReferenceLimits: Readonly<{
40
+ pageSizeMaximum: 256;
41
+ }>;
39
42
  /** Browser-safe logical secret metadata. It never contains value material. */
40
43
  export interface ISecretMetadata {
41
44
  id: string;
@@ -65,14 +68,53 @@ export interface ISecretMetadata {
65
68
  export interface ISecretVersionMetadata {
66
69
  id: string;
67
70
  secretId: string;
71
+ revision: number;
68
72
  lifecycleState: TSecretVersionLifecycleState;
69
73
  createdAt: number;
70
74
  createdBy: string;
71
75
  source: TSecretManagementSource;
72
76
  retiredAt?: number;
73
77
  revokedAt?: number;
78
+ purgeOperationId?: string;
74
79
  purgedAt?: number;
75
80
  }
81
+ /** Irreversibly erases every platform-managed copy after all references are gone. */
82
+ export interface ISecretVersionPurgeIntentV1 {
83
+ schemaVersion: 1;
84
+ mutationId: string;
85
+ secretId: string;
86
+ secretVersionId: string;
87
+ expectedSecretRevision: number;
88
+ expectedSecretVersionRevision: number;
89
+ expectedTargetSecretsRevision: number;
90
+ }
91
+ export interface ISecretVersionPurgeFailureV1 {
92
+ code: string;
93
+ retryable: boolean;
94
+ failedAt: number;
95
+ }
96
+ interface ISecretVersionPurgeOperationBaseV1 {
97
+ schemaVersion: 1;
98
+ id: string;
99
+ revision: number;
100
+ intent: ISecretVersionPurgeIntentV1;
101
+ intentDigest: TSha256Digest;
102
+ createdAt: number;
103
+ updatedAt: number;
104
+ }
105
+ export type TSecretVersionPurgeOperationV1 = (ISecretVersionPurgeOperationBaseV1 & {
106
+ state: 'pending' | 'erasing';
107
+ failure?: never;
108
+ purgedAt?: never;
109
+ }) | (ISecretVersionPurgeOperationBaseV1 & {
110
+ state: 'failed';
111
+ failure: ISecretVersionPurgeFailureV1;
112
+ purgedAt?: never;
113
+ }) | (ISecretVersionPurgeOperationBaseV1 & {
114
+ state: 'succeeded';
115
+ failure?: never;
116
+ purgedAt: number;
117
+ });
76
118
  export interface ISecretSetMetadata {
77
119
  id: string;
78
120
  organizationId: string;
@@ -219,9 +261,17 @@ export interface IServiceSecretDeploymentPlan {
219
261
  export declare const resolvedSecretManifestReferencesEqual: (leftArg: IResolvedSecretManifestReference | undefined, rightArg: IResolvedSecretManifestReference | undefined) => boolean;
220
262
  export declare const isResolvedSecretManifestReferenceAccepted: (stateArg: IClusterSecretDeploymentState, referenceArg: IResolvedSecretManifestReference, nowArg: number) => boolean;
221
263
  export declare const validateSecretMutationId: (mutationIdArg: unknown) => string[];
264
+ export declare const validateSecretVersionRetentionReferences: (referencesArg: unknown) => string[];
265
+ export declare const validateSecretVersionMetadata: (versionArg: unknown) => string[];
266
+ export declare const validateSecretVersionPurgeIntent: (intentArg: unknown) => string[];
267
+ export declare const createSecretVersionPurgeIntentDigestInput: (intentArg: ISecretVersionPurgeIntentV1) => string;
268
+ export declare const computeSecretVersionPurgeIntentDigest: (intentArg: ISecretVersionPurgeIntentV1) => Promise<TSha256Digest>;
269
+ export declare const verifySecretVersionPurgeIntentDigest: (intentArg: ISecretVersionPurgeIntentV1, digestArg: unknown) => Promise<boolean>;
270
+ export declare const validateSecretVersionPurgeOperation: (operationArg: unknown) => Promise<string[]>;
222
271
  export declare const validateSecretOwner: (ownerArg: unknown) => string[];
223
272
  export declare const validateSecretManagementScope: (sourceArg: TSecretManagementSource, scopeArg: unknown) => string[];
224
273
  export declare const validateSecretDelivery: (deliveryArg: unknown) => string[];
274
+ export declare const validateSecretMetadata: (secretArg: unknown) => string[];
225
275
  export declare const validateSecretValueInput: (valueInputArg: unknown) => string[];
226
276
  /** Checks the SmartCrypto context digest without opening or decrypting the envelope. */
227
277
  export declare const verifySecretEnvelopeContext: (envelopeArg: unknown, contextArg: unknown) => Promise<boolean>;
@@ -316,7 +366,6 @@ export interface IRevokedSecretRecipientMetadata extends ISecretRecipientMetadat
316
366
  revokedAt: number;
317
367
  }
318
368
  export type TSecretRecipientMetadata = IActiveSecretRecipientMetadata | IRetiringSecretRecipientMetadata | IRevokedSecretRecipientMetadata;
319
- export type TSecretIngressRecipient = TSecretRecipientMetadata;
320
369
  export declare const secretRecipientLimits: Readonly<{
321
370
  maximumRecipients: 64;
322
371
  }>;
@@ -325,8 +374,6 @@ export declare const validateSecretRecipientSet: (recipientsArg: unknown) => str
325
374
  /** New envelopes target only active recipients. */
326
375
  export declare const canIssueNewSecretEnvelope: (recipientArg: TSecretRecipientMetadata) => boolean;
327
376
  export declare const validateSecretValueInputForRecipient: (valueInputArg: unknown, recipientArg: TSecretRecipientMetadata, expectedContextArg: Uint8Array) => Promise<string[]>;
328
- /** Retiring recipients open only already-issued envelopes before their deadline. */
329
- export declare const canOpenIssuedSecretEnvelope: (recipientArg: TSecretRecipientMetadata, issuedAtArg: number, nowArg: number) => boolean;
330
377
  export declare const createSecretCreateEnvelopeContext: (contextArg: {
331
378
  mutationId: string;
332
379
  target: TSecretMutationTarget;