@serve.zone/interfaces 25.1.0 → 25.2.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.
@@ -0,0 +1,1378 @@
1
+ import * as plugins from './plugins.runtime.js';
2
+ import { canonicalizeStrictJson, deepFreezeValue, } from './private/canonicaljson.js';
3
+ export const cloudlyLegacyDeploymentSettlementLimits = Object.freeze({
4
+ maximumIdentifierLength: 200,
5
+ maximumSourceDocuments: 2000,
6
+ maximumOperations: 500,
7
+ maximumPlanBytes: 512 * 1024,
8
+ maximumSafeResultBytes: 16 * 1024,
9
+ maximumReceiptBytes: 512 * 1024,
10
+ maximumAuthorityBytes: 16 * 1024,
11
+ maximumAuthenticatedArtifactBytes: 768 * 1024,
12
+ maximumAuthorityLifetimeMs: 24 * 60 * 60 * 1000,
13
+ maximumFailureReasons: 32,
14
+ });
15
+ export const cloudlyLegacyDeploymentSettlementDomains = Object.freeze({
16
+ authorityAad: 'serve.zone/cloudly-legacy-deployment-settlement/authority-aad-v1\0',
17
+ rehearsalBindingHmac: 'serve.zone/cloudly-legacy-deployment-settlement/rehearsal-binding-hmac-v1\0',
18
+ planHmac: 'serve.zone/cloudly-legacy-deployment-settlement/plan-hmac-v1\0',
19
+ productionRequestHmac: 'serve.zone/cloudly-legacy-deployment-settlement/production-request-hmac-v1\0',
20
+ checkResultHmac: 'serve.zone/cloudly-legacy-deployment-settlement/check-result-hmac-v1\0',
21
+ applyResultHmac: 'serve.zone/cloudly-legacy-deployment-settlement/apply-result-hmac-v1\0',
22
+ stableOutcomeHmac: 'serve.zone/cloudly-legacy-deployment-settlement/stable-outcome-hmac-v1\0',
23
+ scratchReceiptHmac: 'serve.zone/cloudly-legacy-deployment-settlement/scratch-receipt-hmac-v1\0',
24
+ productionReceiptHmac: 'serve.zone/cloudly-legacy-deployment-settlement/production-receipt-hmac-v1\0',
25
+ });
26
+ /** Safe error surface: code and schema path are finite and never contain values. */
27
+ export class CloudlyLegacyDeploymentSettlementCodecError extends Error {
28
+ code;
29
+ path;
30
+ constructor(codeArg, pathArg) {
31
+ super(`${codeArg}:${pathArg}`);
32
+ this.name = 'CloudlyLegacyDeploymentSettlementCodecError';
33
+ this.code = codeArg;
34
+ this.path = pathArg;
35
+ }
36
+ }
37
+ const authorityCoreKeys = ['operationId', 'authorityId', 'keyId', 'keyVersion'];
38
+ const authorityReferenceKeys = [...authorityCoreKeys, 'authorityMetadataSha256'];
39
+ const authorityMetadataKeys = [
40
+ 'schemaVersion',
41
+ ...authorityCoreKeys,
42
+ 'settlementId',
43
+ 'issuedAt',
44
+ 'expiresAt',
45
+ 'maintenanceImageDigest',
46
+ 'sourceImageDigest',
47
+ 'targetImageDigest',
48
+ 'targetVersion',
49
+ 'targetManifestSha256',
50
+ 'targetConfigSha256',
51
+ 'backupId',
52
+ 'backupSnapshotIdSha256',
53
+ 'backupProofSha256',
54
+ 'runId',
55
+ 'rehearsalId',
56
+ 'scratchServiceId',
57
+ 'allocationId',
58
+ 'allocationGeneration',
59
+ 'allocationBindingSha256',
60
+ 'allocationReceiptSha256',
61
+ 'sourceDataSha256',
62
+ 'restoredDataSha256',
63
+ 'digestProofSha256',
64
+ ];
65
+ const classificationKeys = [
66
+ 'image-recorded-not-current',
67
+ 'image-recorded-current-failed',
68
+ 'rolling-out-current-failed',
69
+ 'rolling-out-superseded',
70
+ ];
71
+ const censusKeys = [
72
+ 'operations',
73
+ 'services',
74
+ 'images',
75
+ 'releases',
76
+ 'rolloutOperations',
77
+ 'routeClaims',
78
+ 'resourceClaims',
79
+ ];
80
+ const mutationCountKeys = [
81
+ 'operationCount',
82
+ 'routeClaimsStabilized',
83
+ 'routeClaimsRemoved',
84
+ 'resourceClaimsRemoved',
85
+ ];
86
+ const planEntryKeys = [
87
+ 'operationId',
88
+ 'serviceId',
89
+ 'sourceRevision',
90
+ 'sourceState',
91
+ 'classification',
92
+ 'finalRevision',
93
+ 'sourceDocumentHmac',
94
+ 'finalDocumentHmac',
95
+ 'routeClaimsStabilized',
96
+ 'routeClaimsRemoved',
97
+ 'resourceClaimsRemoved',
98
+ ];
99
+ const failureReasons = new Set([
100
+ 'AUTHORITY_INVALID',
101
+ 'AUTHORITY_EXPIRED',
102
+ 'REQUEST_MISMATCH',
103
+ 'PLAN_MISMATCH',
104
+ 'SOURCE_STATE_MISMATCH',
105
+ 'FINAL_STATE_MISMATCH',
106
+ 'TRANSACTIONS_UNSUPPORTED',
107
+ 'OPERATION_DRIFT',
108
+ 'CLAIM_DRIFT',
109
+ 'CLASSIFICATION_MISMATCH',
110
+ ]);
111
+ const identifierPattern = /^[A-Za-z0-9][A-Za-z0-9:._@-]{0,199}$/;
112
+ const sha256Pattern = /^[a-f0-9]{64}$/;
113
+ const ociDigestPattern = /^sha256:[a-f0-9]{64}$/;
114
+ const stateHmacPattern = /^hmac-sha256:[a-f0-9]{64}$/;
115
+ const macPattern = /^[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$/;
116
+ const raw32ByteBase64UrlPattern = /^[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$/;
117
+ const fail = (codeArg, pathArg) => {
118
+ throw new CloudlyLegacyDeploymentSettlementCodecError(codeArg, pathArg);
119
+ };
120
+ const readRecord = (valueArg, pathArg) => {
121
+ if (!valueArg || typeof valueArg !== 'object' || Array.isArray(valueArg)) {
122
+ return fail('INVALID_DATA', pathArg);
123
+ }
124
+ const prototype = Object.getPrototypeOf(valueArg);
125
+ if (prototype !== Object.prototype && prototype !== null) {
126
+ return fail('INVALID_DATA', pathArg);
127
+ }
128
+ const record = valueArg;
129
+ for (const key of Reflect.ownKeys(record)) {
130
+ if (typeof key !== 'string')
131
+ return fail('INVALID_DATA', pathArg);
132
+ const descriptor = Object.getOwnPropertyDescriptor(record, key);
133
+ if (!descriptor || !descriptor.enumerable || !Object.hasOwn(descriptor, 'value')) {
134
+ return fail('INVALID_DATA', pathArg);
135
+ }
136
+ }
137
+ return record;
138
+ };
139
+ const readArray = (valueArg, pathArg, maximumLengthArg, minimumLengthArg = 0) => {
140
+ if (!Array.isArray(valueArg) || Object.getPrototypeOf(valueArg) !== Array.prototype) {
141
+ return fail('INVALID_DATA', pathArg);
142
+ }
143
+ if (valueArg.length < minimumLengthArg || valueArg.length > maximumLengthArg) {
144
+ return fail('LIMIT_EXCEEDED', pathArg);
145
+ }
146
+ for (let index = 0; index < valueArg.length; index++) {
147
+ if (!Object.hasOwn(valueArg, index))
148
+ return fail('INVALID_DATA', `${pathArg}[${index}]`);
149
+ const descriptor = Object.getOwnPropertyDescriptor(valueArg, String(index));
150
+ if (!descriptor || !descriptor.enumerable || !Object.hasOwn(descriptor, 'value')) {
151
+ return fail('INVALID_DATA', `${pathArg}[${index}]`);
152
+ }
153
+ }
154
+ for (const key of Reflect.ownKeys(valueArg)) {
155
+ if (key === 'length')
156
+ continue;
157
+ if (typeof key !== 'string'
158
+ || !/^(?:0|[1-9][0-9]*)$/.test(key)
159
+ || Number(key) >= valueArg.length) {
160
+ return fail('INVALID_DATA', pathArg);
161
+ }
162
+ }
163
+ return valueArg;
164
+ };
165
+ const assertExactKeys = (valueArg, keysArg, pathArg) => {
166
+ const actual = Object.keys(valueArg).sort((leftArg, rightArg) => (leftArg < rightArg ? -1 : leftArg > rightArg ? 1 : 0));
167
+ const expected = [...keysArg].sort((leftArg, rightArg) => (leftArg < rightArg ? -1 : leftArg > rightArg ? 1 : 0));
168
+ if (actual.length !== expected.length
169
+ || actual.some((keyArg, indexArg) => keyArg !== expected[indexArg])) {
170
+ fail('INVALID_SCHEMA', pathArg);
171
+ }
172
+ };
173
+ const readIdentifier = (valueArg, pathArg) => {
174
+ if (typeof valueArg !== 'string' || !identifierPattern.test(valueArg)) {
175
+ return fail('INVALID_VALUE', pathArg);
176
+ }
177
+ return valueArg;
178
+ };
179
+ const readSha256 = (valueArg, pathArg) => {
180
+ if (typeof valueArg !== 'string' || !sha256Pattern.test(valueArg)) {
181
+ return fail('INVALID_VALUE', pathArg);
182
+ }
183
+ return valueArg;
184
+ };
185
+ const readOciDigest = (valueArg, pathArg) => {
186
+ if (typeof valueArg !== 'string' || !ociDigestPattern.test(valueArg)) {
187
+ return fail('INVALID_VALUE', pathArg);
188
+ }
189
+ return valueArg;
190
+ };
191
+ const readStateHmac = (valueArg, pathArg) => {
192
+ if (typeof valueArg !== 'string' || !stateHmacPattern.test(valueArg)) {
193
+ return fail('INVALID_VALUE', pathArg);
194
+ }
195
+ return valueArg;
196
+ };
197
+ const readMac = (valueArg, pathArg) => {
198
+ if (typeof valueArg !== 'string' || !macPattern.test(valueArg)) {
199
+ return fail('INVALID_VALUE', pathArg);
200
+ }
201
+ const bytes = Buffer.from(valueArg, 'base64url');
202
+ if (bytes.byteLength !== 32 || bytes.toString('base64url') !== valueArg) {
203
+ return fail('INVALID_VALUE', pathArg);
204
+ }
205
+ return valueArg;
206
+ };
207
+ const readInteger = (valueArg, pathArg, minimumArg = 0, maximumArg = Number.MAX_SAFE_INTEGER) => {
208
+ if (typeof valueArg !== 'number'
209
+ || !Number.isSafeInteger(valueArg)
210
+ || Object.is(valueArg, -0)
211
+ || valueArg < minimumArg
212
+ || valueArg > maximumArg) {
213
+ return fail('INVALID_VALUE', pathArg);
214
+ }
215
+ return valueArg;
216
+ };
217
+ const readBoolean = (valueArg, pathArg) => {
218
+ if (typeof valueArg !== 'boolean')
219
+ return fail('INVALID_VALUE', pathArg);
220
+ return valueArg;
221
+ };
222
+ const readLiteral = (valueArg, literalsArg, pathArg) => {
223
+ if (typeof valueArg !== 'string' || !literalsArg.includes(valueArg)) {
224
+ return fail('INVALID_VALUE', pathArg);
225
+ }
226
+ return valueArg;
227
+ };
228
+ const canonicalize = (valueArg, pathArg) => (canonicalizeStrictJson(valueArg, () => fail('INVALID_DATA', pathArg), pathArg));
229
+ const finalize = (valueArg, maximumBytesArg, pathArg) => {
230
+ const json = canonicalize(valueArg, pathArg);
231
+ if (Buffer.byteLength(json, 'utf8') > maximumBytesArg) {
232
+ return fail('LIMIT_EXCEEDED', pathArg);
233
+ }
234
+ return deepFreezeValue(valueArg);
235
+ };
236
+ const encodeNormalized = (valueArg, pathArg) => (new Uint8Array(Buffer.from(canonicalize(valueArg, pathArg), 'utf8')));
237
+ const frame = (domainArg, payloadArg) => {
238
+ const domain = Buffer.from(domainArg, 'utf8');
239
+ const output = new Uint8Array(domain.byteLength + payloadArg.byteLength);
240
+ output.set(domain, 0);
241
+ output.set(new Uint8Array(payloadArg), domain.byteLength);
242
+ return output;
243
+ };
244
+ const digestBytes = (valueArg) => (plugins.crypto.createHash('sha256').update(new Uint8Array(valueArg)).digest('hex'));
245
+ const normalizeAuthorityReferenceInternal = (valueArg, pathArg) => {
246
+ const value = readRecord(valueArg, pathArg);
247
+ assertExactKeys(value, authorityReferenceKeys, pathArg);
248
+ if (value.keyVersion !== 1)
249
+ fail('INVALID_VALUE', `${pathArg}.keyVersion`);
250
+ return {
251
+ operationId: readIdentifier(value.operationId, `${pathArg}.operationId`),
252
+ authorityId: readIdentifier(value.authorityId, `${pathArg}.authorityId`),
253
+ keyId: readIdentifier(value.keyId, `${pathArg}.keyId`),
254
+ keyVersion: 1,
255
+ authorityMetadataSha256: readSha256(value.authorityMetadataSha256, `${pathArg}.authorityMetadataSha256`),
256
+ };
257
+ };
258
+ export const normalizeCloudlyLegacyDeploymentSettlementAuthorityReference = (valueArg) => finalize(normalizeAuthorityReferenceInternal(valueArg, 'authorityReference'), cloudlyLegacyDeploymentSettlementLimits.maximumAuthorityBytes, 'authorityReference');
259
+ const normalizeAuthorityMetadataInternal = (valueArg, pathArg) => {
260
+ const value = readRecord(valueArg, pathArg);
261
+ assertExactKeys(value, authorityMetadataKeys, pathArg);
262
+ if (value.schemaVersion !== 1 || value.keyVersion !== 1) {
263
+ fail('INVALID_VALUE', `${pathArg}.schemaVersion`);
264
+ }
265
+ const issuedAt = readInteger(value.issuedAt, `${pathArg}.issuedAt`, 1);
266
+ const expiresAt = readInteger(value.expiresAt, `${pathArg}.expiresAt`, 1);
267
+ if (expiresAt <= issuedAt
268
+ || expiresAt - issuedAt
269
+ > cloudlyLegacyDeploymentSettlementLimits.maximumAuthorityLifetimeMs) {
270
+ fail('CROSS_FIELD_MISMATCH', `${pathArg}.expiresAt`);
271
+ }
272
+ const sourceDataSha256 = readSha256(value.sourceDataSha256, `${pathArg}.sourceDataSha256`);
273
+ const restoredDataSha256 = readSha256(value.restoredDataSha256, `${pathArg}.restoredDataSha256`);
274
+ if (sourceDataSha256 !== restoredDataSha256) {
275
+ fail('CROSS_FIELD_MISMATCH', `${pathArg}.restoredDataSha256`);
276
+ }
277
+ return {
278
+ schemaVersion: 1,
279
+ operationId: readIdentifier(value.operationId, `${pathArg}.operationId`),
280
+ authorityId: readIdentifier(value.authorityId, `${pathArg}.authorityId`),
281
+ keyId: readIdentifier(value.keyId, `${pathArg}.keyId`),
282
+ keyVersion: 1,
283
+ settlementId: readIdentifier(value.settlementId, `${pathArg}.settlementId`),
284
+ issuedAt,
285
+ expiresAt,
286
+ maintenanceImageDigest: readOciDigest(value.maintenanceImageDigest, `${pathArg}.maintenanceImageDigest`),
287
+ sourceImageDigest: readOciDigest(value.sourceImageDigest, `${pathArg}.sourceImageDigest`),
288
+ targetImageDigest: readOciDigest(value.targetImageDigest, `${pathArg}.targetImageDigest`),
289
+ targetVersion: readIdentifier(value.targetVersion, `${pathArg}.targetVersion`),
290
+ targetManifestSha256: readSha256(value.targetManifestSha256, `${pathArg}.targetManifestSha256`),
291
+ targetConfigSha256: readSha256(value.targetConfigSha256, `${pathArg}.targetConfigSha256`),
292
+ backupId: readIdentifier(value.backupId, `${pathArg}.backupId`),
293
+ backupSnapshotIdSha256: readSha256(value.backupSnapshotIdSha256, `${pathArg}.backupSnapshotIdSha256`),
294
+ backupProofSha256: readSha256(value.backupProofSha256, `${pathArg}.backupProofSha256`),
295
+ runId: readIdentifier(value.runId, `${pathArg}.runId`),
296
+ rehearsalId: readIdentifier(value.rehearsalId, `${pathArg}.rehearsalId`),
297
+ scratchServiceId: readIdentifier(value.scratchServiceId, `${pathArg}.scratchServiceId`),
298
+ allocationId: readIdentifier(value.allocationId, `${pathArg}.allocationId`),
299
+ allocationGeneration: readInteger(value.allocationGeneration, `${pathArg}.allocationGeneration`, 1),
300
+ allocationBindingSha256: readSha256(value.allocationBindingSha256, `${pathArg}.allocationBindingSha256`),
301
+ allocationReceiptSha256: readSha256(value.allocationReceiptSha256, `${pathArg}.allocationReceiptSha256`),
302
+ sourceDataSha256,
303
+ restoredDataSha256,
304
+ digestProofSha256: readSha256(value.digestProofSha256, `${pathArg}.digestProofSha256`),
305
+ };
306
+ };
307
+ export const normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata = (valueArg) => finalize(normalizeAuthorityMetadataInternal(valueArg, 'authorityMetadata'), cloudlyLegacyDeploymentSettlementLimits.maximumAuthorityBytes, 'authorityMetadata');
308
+ export const encodeCloudlyLegacyDeploymentSettlementAuthorityMetadata = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(valueArg), 'authorityMetadata');
309
+ export const encodeCloudlyLegacyDeploymentSettlementAuthorityMetadataAad = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.authorityAad, encodeCloudlyLegacyDeploymentSettlementAuthorityMetadata(valueArg));
310
+ export const digestCloudlyLegacyDeploymentSettlementAuthorityMetadata = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementAuthorityMetadata(valueArg));
311
+ export const createCloudlyLegacyDeploymentSettlementAuthorityReference = (metadataArg) => {
312
+ const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
313
+ return finalize({
314
+ operationId: metadata.operationId,
315
+ authorityId: metadata.authorityId,
316
+ keyId: metadata.keyId,
317
+ keyVersion: metadata.keyVersion,
318
+ authorityMetadataSha256: digestCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadata),
319
+ }, cloudlyLegacyDeploymentSettlementLimits.maximumAuthorityBytes, 'authorityReference');
320
+ };
321
+ export const normalizeCloudlyLegacyDeploymentSettlementAuthorityReferenceForMetadata = (referenceArg, metadataArg) => {
322
+ const reference = normalizeCloudlyLegacyDeploymentSettlementAuthorityReference(referenceArg);
323
+ const expected = createCloudlyLegacyDeploymentSettlementAuthorityReference(metadataArg);
324
+ if (canonicalize(reference, 'authorityReference')
325
+ !== canonicalize(expected, 'authorityReference.expected')) {
326
+ fail('CROSS_FIELD_MISMATCH', 'authorityReference');
327
+ }
328
+ return reference;
329
+ };
330
+ export const normalizeCloudlyLegacyDeploymentSettlementAuthorityHandoffPlaintext = (valueArg) => {
331
+ const value = readRecord(valueArg, 'authorityHandoffPlaintext');
332
+ assertExactKeys(value, [
333
+ 'schemaVersion',
334
+ 'kind',
335
+ 'authorityMetadata',
336
+ 'authorityReference',
337
+ 'hmacKeyPlaintext',
338
+ ], 'authorityHandoffPlaintext');
339
+ if (value.schemaVersion !== 1
340
+ || value.kind
341
+ !== 'cloudly-legacy-deployment-settlement-authority-handoff-plaintext') {
342
+ fail('INVALID_VALUE', 'authorityHandoffPlaintext.kind');
343
+ }
344
+ const authorityMetadata = normalizeAuthorityMetadataInternal(value.authorityMetadata, 'authorityHandoffPlaintext.authorityMetadata');
345
+ const authorityReference = normalizeCloudlyLegacyDeploymentSettlementAuthorityReferenceForMetadata(value.authorityReference, authorityMetadata);
346
+ const key = readRecord(value.hmacKeyPlaintext, 'authorityHandoffPlaintext.hmacKeyPlaintext');
347
+ assertExactKeys(key, ['format', 'value'], 'authorityHandoffPlaintext.hmacKeyPlaintext');
348
+ const keyValue = typeof key.value === 'string'
349
+ ? key.value
350
+ : fail('INVALID_VALUE', 'authorityHandoffPlaintext.hmacKeyPlaintext.value');
351
+ if (key.format !== 'raw-32-byte-base64url'
352
+ || !raw32ByteBase64UrlPattern.test(keyValue)) {
353
+ fail('INVALID_VALUE', 'authorityHandoffPlaintext.hmacKeyPlaintext');
354
+ }
355
+ const keyBytes = Buffer.from(keyValue, 'base64url');
356
+ if (keyBytes.byteLength !== 32 || keyBytes.toString('base64url') !== keyValue) {
357
+ fail('INVALID_VALUE', 'authorityHandoffPlaintext.hmacKeyPlaintext.value');
358
+ }
359
+ return finalize({
360
+ schemaVersion: 1,
361
+ kind: 'cloudly-legacy-deployment-settlement-authority-handoff-plaintext',
362
+ authorityMetadata,
363
+ authorityReference,
364
+ hmacKeyPlaintext: { format: 'raw-32-byte-base64url', value: keyValue },
365
+ }, cloudlyLegacyDeploymentSettlementLimits.maximumAuthorityBytes, 'authorityHandoffPlaintext');
366
+ };
367
+ export const encodeCloudlyLegacyDeploymentSettlementAuthorityHandoffPlaintext = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementAuthorityHandoffPlaintext(valueArg), 'authorityHandoffPlaintext');
368
+ const normalizeClassificationCounts = (valueArg, pathArg) => {
369
+ const value = readRecord(valueArg, pathArg);
370
+ assertExactKeys(value, classificationKeys, pathArg);
371
+ return {
372
+ 'image-recorded-not-current': readInteger(value['image-recorded-not-current'], `${pathArg}.image-recorded-not-current`, 0, cloudlyLegacyDeploymentSettlementLimits.maximumOperations),
373
+ 'image-recorded-current-failed': readInteger(value['image-recorded-current-failed'], `${pathArg}.image-recorded-current-failed`, 0, cloudlyLegacyDeploymentSettlementLimits.maximumOperations),
374
+ 'rolling-out-current-failed': readInteger(value['rolling-out-current-failed'], `${pathArg}.rolling-out-current-failed`, 0, cloudlyLegacyDeploymentSettlementLimits.maximumOperations),
375
+ 'rolling-out-superseded': readInteger(value['rolling-out-superseded'], `${pathArg}.rolling-out-superseded`, 0, cloudlyLegacyDeploymentSettlementLimits.maximumOperations),
376
+ };
377
+ };
378
+ const sumClassificationCounts = (valueArg) => classificationKeys.reduce((sumArg, keyArg) => sumArg + valueArg[keyArg], 0);
379
+ const normalizeSourceCensus = (valueArg, pathArg) => {
380
+ const value = readRecord(valueArg, pathArg);
381
+ assertExactKeys(value, censusKeys, pathArg);
382
+ const output = Object.fromEntries(censusKeys.map((keyArg) => [
383
+ keyArg,
384
+ readInteger(value[keyArg], `${pathArg}.${keyArg}`, 0, cloudlyLegacyDeploymentSettlementLimits.maximumSourceDocuments),
385
+ ]));
386
+ if (censusKeys.reduce((sumArg, keyArg) => sumArg + output[keyArg], 0)
387
+ > cloudlyLegacyDeploymentSettlementLimits.maximumSourceDocuments) {
388
+ fail('LIMIT_EXCEEDED', pathArg);
389
+ }
390
+ return output;
391
+ };
392
+ const normalizeMutationCounts = (valueArg, pathArg) => {
393
+ const value = readRecord(valueArg, pathArg);
394
+ assertExactKeys(value, mutationCountKeys, pathArg);
395
+ return {
396
+ operationCount: readInteger(value.operationCount, `${pathArg}.operationCount`, 0, cloudlyLegacyDeploymentSettlementLimits.maximumOperations),
397
+ routeClaimsStabilized: readInteger(value.routeClaimsStabilized, `${pathArg}.routeClaimsStabilized`),
398
+ routeClaimsRemoved: readInteger(value.routeClaimsRemoved, `${pathArg}.routeClaimsRemoved`),
399
+ resourceClaimsRemoved: readInteger(value.resourceClaimsRemoved, `${pathArg}.resourceClaimsRemoved`),
400
+ };
401
+ };
402
+ const assertCountsMatchClassifications = (countsArg, classificationsArg, pathArg) => {
403
+ if (countsArg.operationCount !== sumClassificationCounts(classificationsArg)) {
404
+ fail('CROSS_FIELD_MISMATCH', pathArg);
405
+ }
406
+ };
407
+ const normalizePlanEntry = (valueArg, pathArg) => {
408
+ const value = readRecord(valueArg, pathArg);
409
+ assertExactKeys(value, planEntryKeys, pathArg);
410
+ const sourceRevision = readInteger(value.sourceRevision, `${pathArg}.sourceRevision`, 0);
411
+ const finalRevision = readInteger(value.finalRevision, `${pathArg}.finalRevision`, 0);
412
+ if (finalRevision !== sourceRevision + 3 || !Number.isSafeInteger(sourceRevision + 3)) {
413
+ fail('CROSS_FIELD_MISMATCH', `${pathArg}.finalRevision`);
414
+ }
415
+ const sourceState = readLiteral(value.sourceState, ['image-recorded', 'rolling-out'], `${pathArg}.sourceState`);
416
+ const classification = readLiteral(value.classification, classificationKeys, `${pathArg}.classification`);
417
+ if ((classification.startsWith('image-recorded-') && sourceState !== 'image-recorded')
418
+ || (classification.startsWith('rolling-out-') && sourceState !== 'rolling-out')) {
419
+ fail('CROSS_FIELD_MISMATCH', `${pathArg}.classification`);
420
+ }
421
+ return {
422
+ operationId: readIdentifier(value.operationId, `${pathArg}.operationId`),
423
+ serviceId: readIdentifier(value.serviceId, `${pathArg}.serviceId`),
424
+ sourceRevision,
425
+ sourceState,
426
+ classification,
427
+ finalRevision,
428
+ sourceDocumentHmac: readStateHmac(value.sourceDocumentHmac, `${pathArg}.sourceDocumentHmac`),
429
+ finalDocumentHmac: readStateHmac(value.finalDocumentHmac, `${pathArg}.finalDocumentHmac`),
430
+ routeClaimsStabilized: readInteger(value.routeClaimsStabilized, `${pathArg}.routeClaimsStabilized`),
431
+ routeClaimsRemoved: readInteger(value.routeClaimsRemoved, `${pathArg}.routeClaimsRemoved`),
432
+ resourceClaimsRemoved: readInteger(value.resourceClaimsRemoved, `${pathArg}.resourceClaimsRemoved`),
433
+ };
434
+ };
435
+ export const normalizeCloudlyLegacyDeploymentSettlementPlan = (valueArg) => {
436
+ const value = readRecord(valueArg, 'plan');
437
+ assertExactKeys(value, [
438
+ 'schemaVersion',
439
+ 'kind',
440
+ 'authority',
441
+ 'settlementId',
442
+ 'effectiveAt',
443
+ 'sourceStateHmac',
444
+ 'finalStateHmac',
445
+ 'sourceCensus',
446
+ 'entries',
447
+ 'classificationCounts',
448
+ 'operationCount',
449
+ ], 'plan');
450
+ if (value.schemaVersion !== 1
451
+ || value.kind !== 'cloudly-legacy-deployment-settlement-plan') {
452
+ fail('INVALID_VALUE', 'plan.kind');
453
+ }
454
+ const entries = readArray(value.entries, 'plan.entries', cloudlyLegacyDeploymentSettlementLimits.maximumOperations).map((entryArg, indexArg) => normalizePlanEntry(entryArg, `plan.entries[${indexArg}]`));
455
+ for (let index = 1; index < entries.length; index++) {
456
+ if (entries[index - 1].operationId >= entries[index].operationId) {
457
+ fail('ORDERING_REQUIRED', `plan.entries[${index}].operationId`);
458
+ }
459
+ }
460
+ const classificationCounts = normalizeClassificationCounts(value.classificationCounts, 'plan.classificationCounts');
461
+ const operationCount = readInteger(value.operationCount, 'plan.operationCount', 0, cloudlyLegacyDeploymentSettlementLimits.maximumOperations);
462
+ if (operationCount !== entries.length
463
+ || operationCount !== sumClassificationCounts(classificationCounts)) {
464
+ fail('CROSS_FIELD_MISMATCH', 'plan.operationCount');
465
+ }
466
+ const actualCounts = Object.fromEntries(classificationKeys.map((keyArg) => [
467
+ keyArg,
468
+ entries.filter((entryArg) => entryArg.classification === keyArg).length,
469
+ ]));
470
+ if (classificationKeys.some((keyArg) => actualCounts[keyArg] !== classificationCounts[keyArg])) {
471
+ fail('CROSS_FIELD_MISMATCH', 'plan.classificationCounts');
472
+ }
473
+ return finalize({
474
+ schemaVersion: 1,
475
+ kind: 'cloudly-legacy-deployment-settlement-plan',
476
+ authority: normalizeAuthorityReferenceInternal(value.authority, 'plan.authority'),
477
+ settlementId: readIdentifier(value.settlementId, 'plan.settlementId'),
478
+ effectiveAt: readInteger(value.effectiveAt, 'plan.effectiveAt', 1),
479
+ sourceStateHmac: readStateHmac(value.sourceStateHmac, 'plan.sourceStateHmac'),
480
+ finalStateHmac: readStateHmac(value.finalStateHmac, 'plan.finalStateHmac'),
481
+ sourceCensus: normalizeSourceCensus(value.sourceCensus, 'plan.sourceCensus'),
482
+ entries,
483
+ classificationCounts,
484
+ operationCount,
485
+ }, cloudlyLegacyDeploymentSettlementLimits.maximumPlanBytes, 'plan');
486
+ };
487
+ export const encodeCloudlyLegacyDeploymentSettlementPlan = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementPlan(valueArg), 'plan');
488
+ export const encodeCloudlyLegacyDeploymentSettlementPlanHmacInput = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.planHmac, encodeNormalized(normalizeUnsignedAuthenticatedPlanInternal(valueArg, 'unsignedAuthenticatedPlan'), 'unsignedAuthenticatedPlan'));
489
+ export const digestCloudlyLegacyDeploymentSettlementPlan = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementPlan(valueArg));
490
+ const normalizeFailureReasons = (valueArg, pathArg) => {
491
+ const values = readArray(valueArg, pathArg, cloudlyLegacyDeploymentSettlementLimits.maximumFailureReasons, 1);
492
+ const output = values.map((entryArg, indexArg) => {
493
+ if (typeof entryArg !== 'string'
494
+ || !failureReasons.has(entryArg)) {
495
+ return fail('INVALID_VALUE', `${pathArg}[${indexArg}]`);
496
+ }
497
+ return entryArg;
498
+ });
499
+ for (let index = 1; index < output.length; index++) {
500
+ if (output[index - 1] >= output[index]) {
501
+ fail('ORDERING_REQUIRED', `${pathArg}[${index}]`);
502
+ }
503
+ }
504
+ return output;
505
+ };
506
+ const normalizeSafeResultBase = (valueArg, pathArg) => {
507
+ const counts = normalizeMutationCounts(valueArg.counts, `${pathArg}.counts`);
508
+ const classificationCounts = normalizeClassificationCounts(valueArg.classificationCounts, `${pathArg}.classificationCounts`);
509
+ assertCountsMatchClassifications(counts, classificationCounts, `${pathArg}.counts.operationCount`);
510
+ return {
511
+ requestSha256: readSha256(valueArg.requestSha256, `${pathArg}.requestSha256`),
512
+ planSha256: readSha256(valueArg.planSha256, `${pathArg}.planSha256`),
513
+ settlementId: readIdentifier(valueArg.settlementId, `${pathArg}.settlementId`),
514
+ sourceStateHmac: readStateHmac(valueArg.sourceStateHmac, `${pathArg}.sourceStateHmac`),
515
+ finalStateHmac: readStateHmac(valueArg.finalStateHmac, `${pathArg}.finalStateHmac`),
516
+ transactionSupported: readBoolean(valueArg.transactionSupported, `${pathArg}.transactionSupported`),
517
+ counts,
518
+ classificationCounts,
519
+ };
520
+ };
521
+ export const normalizeCloudlyLegacyDeploymentSettlementCheckResult = (valueArg) => {
522
+ const value = readRecord(valueArg, 'checkResult');
523
+ const status = readLiteral(value.status, ['ready', 'blocked'], 'checkResult.status');
524
+ assertExactKeys(value, [
525
+ 'schemaVersion',
526
+ 'kind',
527
+ 'status',
528
+ 'requestSha256',
529
+ 'planSha256',
530
+ 'settlementId',
531
+ 'sourceStateHmac',
532
+ 'finalStateHmac',
533
+ 'transactionSupported',
534
+ 'disposition',
535
+ 'counts',
536
+ 'classificationCounts',
537
+ ...(status === 'blocked' ? ['failureReasons'] : []),
538
+ 'checkedAt',
539
+ ], 'checkResult');
540
+ if (value.schemaVersion !== 1
541
+ || value.kind !== 'cloudly-legacy-deployment-settlement-check-result') {
542
+ fail('INVALID_VALUE', 'checkResult.kind');
543
+ }
544
+ const base = normalizeSafeResultBase(value, 'checkResult');
545
+ const result = status === 'ready'
546
+ ? {
547
+ schemaVersion: 1,
548
+ kind: 'cloudly-legacy-deployment-settlement-check-result',
549
+ status,
550
+ ...base,
551
+ disposition: readLiteral(value.disposition, ['unapplied', 'exact-replay', 'no-op'], 'checkResult.disposition'),
552
+ checkedAt: readInteger(value.checkedAt, 'checkResult.checkedAt', 1),
553
+ }
554
+ : {
555
+ schemaVersion: 1,
556
+ kind: 'cloudly-legacy-deployment-settlement-check-result',
557
+ status,
558
+ ...base,
559
+ disposition: readLiteral(value.disposition, ['unapplied'], 'checkResult.disposition'),
560
+ failureReasons: normalizeFailureReasons(value.failureReasons, 'checkResult.failureReasons'),
561
+ checkedAt: readInteger(value.checkedAt, 'checkResult.checkedAt', 1),
562
+ };
563
+ const transactionFailurePresent = result.status === 'blocked'
564
+ && result.failureReasons.includes('TRANSACTIONS_UNSUPPORTED');
565
+ if ((result.status === 'ready' && !result.transactionSupported)
566
+ || (result.status === 'blocked'
567
+ && transactionFailurePresent === result.transactionSupported)) {
568
+ fail('CROSS_FIELD_MISMATCH', 'checkResult.transactionSupported');
569
+ }
570
+ return finalize(result, cloudlyLegacyDeploymentSettlementLimits.maximumSafeResultBytes, 'checkResult');
571
+ };
572
+ export const encodeCloudlyLegacyDeploymentSettlementCheckResult = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementCheckResult(valueArg), 'checkResult');
573
+ export const encodeCloudlyLegacyDeploymentSettlementCheckResultHmacInput = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.checkResultHmac, encodeNormalized(normalizeUnsignedAuthenticatedCheckResultInternal(valueArg, 'unsignedAuthenticatedCheckResult'), 'unsignedAuthenticatedCheckResult'));
574
+ export const digestCloudlyLegacyDeploymentSettlementCheckResult = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementCheckResult(valueArg));
575
+ export const normalizeCloudlyLegacyDeploymentSettlementApplyResult = (valueArg) => {
576
+ const value = readRecord(valueArg, 'applyResult');
577
+ const status = readLiteral(value.status, ['completed', 'rejected'], 'applyResult.status');
578
+ assertExactKeys(value, [
579
+ 'schemaVersion',
580
+ 'kind',
581
+ 'status',
582
+ 'requestSha256',
583
+ 'planSha256',
584
+ 'settlementId',
585
+ 'sourceStateHmac',
586
+ 'finalStateHmac',
587
+ 'transactionSupported',
588
+ 'disposition',
589
+ 'counts',
590
+ 'classificationCounts',
591
+ ...(status === 'rejected' ? ['failureReasons', 'rejectedAt'] : ['completedAt']),
592
+ ], 'applyResult');
593
+ if (value.schemaVersion !== 1
594
+ || value.kind !== 'cloudly-legacy-deployment-settlement-apply-result') {
595
+ fail('INVALID_VALUE', 'applyResult.kind');
596
+ }
597
+ const base = normalizeSafeResultBase(value, 'applyResult');
598
+ const result = status === 'completed'
599
+ ? {
600
+ schemaVersion: 1,
601
+ kind: 'cloudly-legacy-deployment-settlement-apply-result',
602
+ status,
603
+ ...base,
604
+ disposition: readLiteral(value.disposition, ['applied', 'exact-replay', 'no-op'], 'applyResult.disposition'),
605
+ completedAt: readInteger(value.completedAt, 'applyResult.completedAt', 1),
606
+ }
607
+ : {
608
+ schemaVersion: 1,
609
+ kind: 'cloudly-legacy-deployment-settlement-apply-result',
610
+ status,
611
+ ...base,
612
+ disposition: readLiteral(value.disposition, ['unapplied'], 'applyResult.disposition'),
613
+ failureReasons: normalizeFailureReasons(value.failureReasons, 'applyResult.failureReasons'),
614
+ rejectedAt: readInteger(value.rejectedAt, 'applyResult.rejectedAt', 1),
615
+ };
616
+ const transactionFailurePresent = result.status === 'rejected'
617
+ && result.failureReasons.includes('TRANSACTIONS_UNSUPPORTED');
618
+ if ((result.status === 'completed' && !result.transactionSupported)
619
+ || (result.status === 'rejected'
620
+ && transactionFailurePresent === result.transactionSupported)) {
621
+ fail('CROSS_FIELD_MISMATCH', 'applyResult.transactionSupported');
622
+ }
623
+ return finalize(result, cloudlyLegacyDeploymentSettlementLimits.maximumSafeResultBytes, 'applyResult');
624
+ };
625
+ export const encodeCloudlyLegacyDeploymentSettlementApplyResult = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementApplyResult(valueArg), 'applyResult');
626
+ export const encodeCloudlyLegacyDeploymentSettlementApplyResultHmacInput = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.applyResultHmac, encodeNormalized(normalizeUnsignedAuthenticatedApplyResultInternal(valueArg, 'unsignedAuthenticatedApplyResult'), 'unsignedAuthenticatedApplyResult'));
627
+ export const digestCloudlyLegacyDeploymentSettlementApplyResult = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementApplyResult(valueArg));
628
+ const rehearsalBindingKeys = [
629
+ 'schemaVersion',
630
+ 'kind',
631
+ 'settlementId',
632
+ 'runId',
633
+ 'rehearsalId',
634
+ 'scratchServiceId',
635
+ 'allocationId',
636
+ 'allocationGeneration',
637
+ 'allocationBindingSha256',
638
+ 'allocationReceiptSha256',
639
+ 'backupId',
640
+ 'backupSnapshotIdSha256',
641
+ 'backupProofSha256',
642
+ 'sourceDataSha256',
643
+ 'restoredDataSha256',
644
+ 'digestProofSha256',
645
+ 'targetImageDigest',
646
+ 'targetVersion',
647
+ 'targetManifestSha256',
648
+ 'targetConfigSha256',
649
+ ];
650
+ const normalizeRehearsalBindingInternal = (valueArg, pathArg) => {
651
+ const value = readRecord(valueArg, pathArg);
652
+ assertExactKeys(value, rehearsalBindingKeys, pathArg);
653
+ if (value.schemaVersion !== 1
654
+ || value.kind !== 'cloudly-legacy-deployment-settlement-rehearsal-binding') {
655
+ fail('INVALID_VALUE', `${pathArg}.kind`);
656
+ }
657
+ const sourceDataSha256 = readSha256(value.sourceDataSha256, `${pathArg}.sourceDataSha256`);
658
+ const restoredDataSha256 = readSha256(value.restoredDataSha256, `${pathArg}.restoredDataSha256`);
659
+ if (sourceDataSha256 !== restoredDataSha256) {
660
+ fail('CROSS_FIELD_MISMATCH', `${pathArg}.restoredDataSha256`);
661
+ }
662
+ return {
663
+ schemaVersion: 1,
664
+ kind: 'cloudly-legacy-deployment-settlement-rehearsal-binding',
665
+ settlementId: readIdentifier(value.settlementId, `${pathArg}.settlementId`),
666
+ runId: readIdentifier(value.runId, `${pathArg}.runId`),
667
+ rehearsalId: readIdentifier(value.rehearsalId, `${pathArg}.rehearsalId`),
668
+ scratchServiceId: readIdentifier(value.scratchServiceId, `${pathArg}.scratchServiceId`),
669
+ allocationId: readIdentifier(value.allocationId, `${pathArg}.allocationId`),
670
+ allocationGeneration: readInteger(value.allocationGeneration, `${pathArg}.allocationGeneration`, 1),
671
+ allocationBindingSha256: readSha256(value.allocationBindingSha256, `${pathArg}.allocationBindingSha256`),
672
+ allocationReceiptSha256: readSha256(value.allocationReceiptSha256, `${pathArg}.allocationReceiptSha256`),
673
+ backupId: readIdentifier(value.backupId, `${pathArg}.backupId`),
674
+ backupSnapshotIdSha256: readSha256(value.backupSnapshotIdSha256, `${pathArg}.backupSnapshotIdSha256`),
675
+ backupProofSha256: readSha256(value.backupProofSha256, `${pathArg}.backupProofSha256`),
676
+ sourceDataSha256,
677
+ restoredDataSha256,
678
+ digestProofSha256: readSha256(value.digestProofSha256, `${pathArg}.digestProofSha256`),
679
+ targetImageDigest: readOciDigest(value.targetImageDigest, `${pathArg}.targetImageDigest`),
680
+ targetVersion: readIdentifier(value.targetVersion, `${pathArg}.targetVersion`),
681
+ targetManifestSha256: readSha256(value.targetManifestSha256, `${pathArg}.targetManifestSha256`),
682
+ targetConfigSha256: readSha256(value.targetConfigSha256, `${pathArg}.targetConfigSha256`),
683
+ };
684
+ };
685
+ export const normalizeCloudlyLegacyDeploymentSettlementRehearsalBinding = (valueArg) => finalize(normalizeRehearsalBindingInternal(valueArg, 'rehearsalBinding'), cloudlyLegacyDeploymentSettlementLimits.maximumAuthorityBytes, 'rehearsalBinding');
686
+ export const encodeCloudlyLegacyDeploymentSettlementRehearsalBinding = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementRehearsalBinding(valueArg), 'rehearsalBinding');
687
+ export const encodeCloudlyLegacyDeploymentSettlementRehearsalBindingHmacInput = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.rehearsalBindingHmac, encodeNormalized(normalizeUnsignedAuthenticatedRehearsalBindingInternal(valueArg, 'unsignedAuthenticatedRehearsalBinding'), 'unsignedAuthenticatedRehearsalBinding'));
688
+ export const digestCloudlyLegacyDeploymentSettlementRehearsalBinding = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementRehearsalBinding(valueArg));
689
+ export const normalizeCloudlyLegacyDeploymentSettlementProductionRequest = (valueArg) => {
690
+ const value = readRecord(valueArg, 'productionRequest');
691
+ assertExactKeys(value, [
692
+ 'schemaVersion',
693
+ 'kind',
694
+ 'authority',
695
+ 'plan',
696
+ 'planSha256',
697
+ 'rehearsalBinding',
698
+ 'rehearsalBindingSha256',
699
+ 'requestedAt',
700
+ ], 'productionRequest');
701
+ if (value.schemaVersion !== 1
702
+ || value.kind !== 'cloudly-legacy-deployment-settlement-production-request') {
703
+ fail('INVALID_VALUE', 'productionRequest.kind');
704
+ }
705
+ const authority = normalizeAuthorityReferenceInternal(value.authority, 'productionRequest.authority');
706
+ const plan = normalizeCloudlyLegacyDeploymentSettlementPlan(value.plan);
707
+ const planSha256 = readSha256(value.planSha256, 'productionRequest.planSha256');
708
+ const rehearsalBinding = normalizeRehearsalBindingInternal(value.rehearsalBinding, 'productionRequest.rehearsalBinding');
709
+ const rehearsalBindingSha256 = readSha256(value.rehearsalBindingSha256, 'productionRequest.rehearsalBindingSha256');
710
+ if (canonicalize(authority, 'productionRequest.authority')
711
+ !== canonicalize(plan.authority, 'productionRequest.plan.authority')) {
712
+ fail('CROSS_FIELD_MISMATCH', 'productionRequest.authority');
713
+ }
714
+ if (planSha256 !== digestCloudlyLegacyDeploymentSettlementPlan(plan)) {
715
+ fail('CROSS_FIELD_MISMATCH', 'productionRequest.planSha256');
716
+ }
717
+ if (rehearsalBindingSha256
718
+ !== digestCloudlyLegacyDeploymentSettlementRehearsalBinding(rehearsalBinding)) {
719
+ fail('CROSS_FIELD_MISMATCH', 'productionRequest.rehearsalBindingSha256');
720
+ }
721
+ if (plan.settlementId !== rehearsalBinding.settlementId) {
722
+ fail('CROSS_FIELD_MISMATCH', 'productionRequest.rehearsalBinding.settlementId');
723
+ }
724
+ const requestedAt = readInteger(value.requestedAt, 'productionRequest.requestedAt', 1);
725
+ if (requestedAt < plan.effectiveAt) {
726
+ fail('CROSS_FIELD_MISMATCH', 'productionRequest.requestedAt');
727
+ }
728
+ return finalize({
729
+ schemaVersion: 1,
730
+ kind: 'cloudly-legacy-deployment-settlement-production-request',
731
+ authority,
732
+ plan,
733
+ planSha256,
734
+ rehearsalBinding,
735
+ rehearsalBindingSha256,
736
+ requestedAt,
737
+ }, cloudlyLegacyDeploymentSettlementLimits.maximumAuthenticatedArtifactBytes, 'productionRequest');
738
+ };
739
+ export const encodeCloudlyLegacyDeploymentSettlementProductionRequest = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementProductionRequest(valueArg), 'productionRequest');
740
+ export const digestCloudlyLegacyDeploymentSettlementProductionRequest = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementProductionRequest(valueArg));
741
+ const stableOutcomeKeys = [
742
+ 'schemaVersion',
743
+ 'kind',
744
+ 'settlementId',
745
+ 'runId',
746
+ 'rehearsalBindingSha256',
747
+ 'effectiveAt',
748
+ 'planSha256',
749
+ 'sourceStateHmac',
750
+ 'finalStateHmac',
751
+ 'settlements',
752
+ 'counts',
753
+ 'classificationCounts',
754
+ ];
755
+ const normalizeStableOutcomeInternal = (valueArg, pathArg) => {
756
+ const value = readRecord(valueArg, pathArg);
757
+ assertExactKeys(value, stableOutcomeKeys, pathArg);
758
+ if (value.schemaVersion !== 1
759
+ || value.kind !== 'cloudly-legacy-deployment-settlement-stable-outcome') {
760
+ fail('INVALID_VALUE', `${pathArg}.kind`);
761
+ }
762
+ const counts = normalizeMutationCounts(value.counts, `${pathArg}.counts`);
763
+ const classificationCounts = normalizeClassificationCounts(value.classificationCounts, `${pathArg}.classificationCounts`);
764
+ assertCountsMatchClassifications(counts, classificationCounts, `${pathArg}.counts.operationCount`);
765
+ const settlements = readArray(value.settlements, `${pathArg}.settlements`, cloudlyLegacyDeploymentSettlementLimits.maximumOperations).map((entryArg, indexArg) => {
766
+ const entryPath = `${pathArg}.settlements[${indexArg}]`;
767
+ const entry = readRecord(entryArg, entryPath);
768
+ assertExactKeys(entry, ['operationId', 'finalRevision', 'finalDocumentHmac'], entryPath);
769
+ return {
770
+ operationId: readIdentifier(entry.operationId, `${entryPath}.operationId`),
771
+ finalRevision: readInteger(entry.finalRevision, `${entryPath}.finalRevision`, 1),
772
+ finalDocumentHmac: readStateHmac(entry.finalDocumentHmac, `${entryPath}.finalDocumentHmac`),
773
+ };
774
+ });
775
+ for (let index = 1; index < settlements.length; index++) {
776
+ if (settlements[index - 1].operationId >= settlements[index].operationId) {
777
+ fail('ORDERING_REQUIRED', `${pathArg}.settlements[${index}].operationId`);
778
+ }
779
+ }
780
+ if (settlements.length !== counts.operationCount) {
781
+ fail('CROSS_FIELD_MISMATCH', `${pathArg}.settlements`);
782
+ }
783
+ return {
784
+ schemaVersion: 1,
785
+ kind: 'cloudly-legacy-deployment-settlement-stable-outcome',
786
+ settlementId: readIdentifier(value.settlementId, `${pathArg}.settlementId`),
787
+ runId: readIdentifier(value.runId, `${pathArg}.runId`),
788
+ rehearsalBindingSha256: readSha256(value.rehearsalBindingSha256, `${pathArg}.rehearsalBindingSha256`),
789
+ effectiveAt: readInteger(value.effectiveAt, `${pathArg}.effectiveAt`, 1),
790
+ planSha256: readSha256(value.planSha256, `${pathArg}.planSha256`),
791
+ sourceStateHmac: readStateHmac(value.sourceStateHmac, `${pathArg}.sourceStateHmac`),
792
+ finalStateHmac: readStateHmac(value.finalStateHmac, `${pathArg}.finalStateHmac`),
793
+ settlements,
794
+ counts,
795
+ classificationCounts,
796
+ };
797
+ };
798
+ export const normalizeCloudlyLegacyDeploymentSettlementStableOutcome = (valueArg) => finalize(normalizeStableOutcomeInternal(valueArg, 'stableOutcome'), cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes, 'stableOutcome');
799
+ export const encodeCloudlyLegacyDeploymentSettlementStableOutcome = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementStableOutcome(valueArg), 'stableOutcome');
800
+ export const encodeCloudlyLegacyDeploymentSettlementStableOutcomeHmacInput = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.stableOutcomeHmac, encodeNormalized(normalizeUnsignedAuthenticatedStableOutcomeInternal(valueArg, 'unsignedAuthenticatedStableOutcome'), 'unsignedAuthenticatedStableOutcome'));
801
+ export const digestCloudlyLegacyDeploymentSettlementStableOutcome = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementStableOutcome(valueArg));
802
+ const authenticatedArtifactKeys = [
803
+ 'schemaVersion',
804
+ 'kind',
805
+ 'authority',
806
+ 'payload',
807
+ 'payloadSha256',
808
+ 'mac',
809
+ ];
810
+ const unsignedAuthenticatedArtifactKeys = authenticatedArtifactKeys.filter((keyArg) => keyArg !== 'mac');
811
+ const normalizeUnsignedAuthenticatedArtifactInternal = (valueArg, pathArg, kindArg, normalizePayloadArg, getPayloadAuthorityArg) => {
812
+ const value = readRecord(valueArg, pathArg);
813
+ assertExactKeys(value, unsignedAuthenticatedArtifactKeys, pathArg);
814
+ if (value.schemaVersion !== 1 || value.kind !== kindArg) {
815
+ fail('INVALID_VALUE', `${pathArg}.kind`);
816
+ }
817
+ const authority = normalizeAuthorityReferenceInternal(value.authority, `${pathArg}.authority`);
818
+ const payload = normalizePayloadArg(value.payload);
819
+ const payloadSha256 = readSha256(value.payloadSha256, `${pathArg}.payloadSha256`);
820
+ if (payloadSha256 !== digestBytes(encodeNormalized(payload, `${pathArg}.payload`))) {
821
+ fail('CROSS_FIELD_MISMATCH', `${pathArg}.payloadSha256`);
822
+ }
823
+ if (getPayloadAuthorityArg
824
+ && canonicalize(authority, `${pathArg}.authority`)
825
+ !== canonicalize(getPayloadAuthorityArg(payload), `${pathArg}.payload.authority`)) {
826
+ fail('CROSS_FIELD_MISMATCH', `${pathArg}.authority`);
827
+ }
828
+ return {
829
+ schemaVersion: 1,
830
+ kind: kindArg,
831
+ authority,
832
+ payload: payload,
833
+ payloadSha256,
834
+ };
835
+ };
836
+ const normalizeAuthenticatedArtifactInternal = (valueArg, pathArg, kindArg, normalizePayloadArg, getPayloadAuthorityArg) => {
837
+ const value = readRecord(valueArg, pathArg);
838
+ assertExactKeys(value, authenticatedArtifactKeys, pathArg);
839
+ const unsignedInput = Object.fromEntries(unsignedAuthenticatedArtifactKeys.map((keyArg) => [
840
+ keyArg,
841
+ value[keyArg],
842
+ ]));
843
+ return {
844
+ ...normalizeUnsignedAuthenticatedArtifactInternal(unsignedInput, `${pathArg}.unsigned`, kindArg, normalizePayloadArg, getPayloadAuthorityArg),
845
+ mac: readMac(value.mac, `${pathArg}.mac`),
846
+ };
847
+ };
848
+ const normalizeUnsignedAuthenticatedRehearsalBindingInternal = (valueArg, pathArg) => normalizeUnsignedAuthenticatedArtifactInternal(valueArg, pathArg, 'authenticated-cloudly-legacy-deployment-settlement-rehearsal-binding', normalizeCloudlyLegacyDeploymentSettlementRehearsalBinding);
849
+ const normalizeUnsignedAuthenticatedPlanInternal = (valueArg, pathArg) => normalizeUnsignedAuthenticatedArtifactInternal(valueArg, pathArg, 'authenticated-cloudly-legacy-deployment-settlement-plan', normalizeCloudlyLegacyDeploymentSettlementPlan, (payloadArg) => payloadArg.authority);
850
+ const normalizeUnsignedAuthenticatedProductionRequestInternal = (valueArg, pathArg) => normalizeUnsignedAuthenticatedArtifactInternal(valueArg, pathArg, 'authenticated-cloudly-legacy-deployment-settlement-production-request', normalizeCloudlyLegacyDeploymentSettlementProductionRequest, (payloadArg) => payloadArg.authority);
851
+ const normalizeUnsignedAuthenticatedCheckResultInternal = (valueArg, pathArg) => normalizeUnsignedAuthenticatedArtifactInternal(valueArg, pathArg, 'authenticated-cloudly-legacy-deployment-settlement-check-result', normalizeCloudlyLegacyDeploymentSettlementCheckResult);
852
+ const normalizeUnsignedAuthenticatedApplyResultInternal = (valueArg, pathArg) => normalizeUnsignedAuthenticatedArtifactInternal(valueArg, pathArg, 'authenticated-cloudly-legacy-deployment-settlement-apply-result', normalizeCloudlyLegacyDeploymentSettlementApplyResult);
853
+ const normalizeUnsignedAuthenticatedStableOutcomeInternal = (valueArg, pathArg) => normalizeUnsignedAuthenticatedArtifactInternal(valueArg, pathArg, 'authenticated-cloudly-legacy-deployment-settlement-stable-outcome', normalizeCloudlyLegacyDeploymentSettlementStableOutcome);
854
+ const finalizeAuthenticatedArtifact = (valueArg, pathArg) => finalize(valueArg, cloudlyLegacyDeploymentSettlementLimits.maximumAuthenticatedArtifactBytes, pathArg);
855
+ /** Structural only. Use the async ForAuthority variant to authenticate its MAC. */
856
+ export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedRehearsalBindingStructure = (valueArg) => (finalizeAuthenticatedArtifact(normalizeAuthenticatedArtifactInternal(valueArg, 'authenticatedRehearsalBinding', 'authenticated-cloudly-legacy-deployment-settlement-rehearsal-binding', normalizeCloudlyLegacyDeploymentSettlementRehearsalBinding), 'authenticatedRehearsalBinding'));
857
+ export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedPlanStructure = (valueArg) => (finalizeAuthenticatedArtifact(normalizeAuthenticatedArtifactInternal(valueArg, 'authenticatedPlan', 'authenticated-cloudly-legacy-deployment-settlement-plan', normalizeCloudlyLegacyDeploymentSettlementPlan, (payloadArg) => payloadArg.authority), 'authenticatedPlan'));
858
+ export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure = (valueArg) => (finalizeAuthenticatedArtifact(normalizeAuthenticatedArtifactInternal(valueArg, 'authenticatedProductionRequest', 'authenticated-cloudly-legacy-deployment-settlement-production-request', normalizeCloudlyLegacyDeploymentSettlementProductionRequest, (payloadArg) => payloadArg.authority), 'authenticatedProductionRequest'));
859
+ export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedCheckResultStructure = (valueArg) => (finalizeAuthenticatedArtifact(normalizeAuthenticatedArtifactInternal(valueArg, 'authenticatedCheckResult', 'authenticated-cloudly-legacy-deployment-settlement-check-result', normalizeCloudlyLegacyDeploymentSettlementCheckResult), 'authenticatedCheckResult'));
860
+ export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedApplyResultStructure = (valueArg) => (finalizeAuthenticatedArtifact(normalizeAuthenticatedArtifactInternal(valueArg, 'authenticatedApplyResult', 'authenticated-cloudly-legacy-deployment-settlement-apply-result', normalizeCloudlyLegacyDeploymentSettlementApplyResult), 'authenticatedApplyResult'));
861
+ export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedStableOutcomeStructure = (valueArg) => (finalizeAuthenticatedArtifact(normalizeAuthenticatedArtifactInternal(valueArg, 'authenticatedStableOutcome', 'authenticated-cloudly-legacy-deployment-settlement-stable-outcome', normalizeCloudlyLegacyDeploymentSettlementStableOutcome), 'authenticatedStableOutcome'));
862
+ export const encodeCloudlyLegacyDeploymentSettlementProductionRequestHmacInput = (valueArg) => frame(cloudlyLegacyDeploymentSettlementDomains.productionRequestHmac, encodeNormalized(normalizeUnsignedAuthenticatedProductionRequestInternal(valueArg, 'unsignedAuthenticatedProductionRequest'), 'unsignedAuthenticatedProductionRequest'));
863
+ const encodeAuthenticatedArtifact = (valueArg, normalizeArg, pathArg) => encodeNormalized(normalizeArg(valueArg), pathArg);
864
+ export const encodeAuthenticatedCloudlyLegacyDeploymentSettlementRehearsalBinding = (valueArg) => encodeAuthenticatedArtifact(valueArg, normalizeCloudlyLegacyDeploymentSettlementAuthenticatedRehearsalBindingStructure, 'authenticatedRehearsalBinding');
865
+ export const encodeAuthenticatedCloudlyLegacyDeploymentSettlementPlan = (valueArg) => encodeAuthenticatedArtifact(valueArg, normalizeCloudlyLegacyDeploymentSettlementAuthenticatedPlanStructure, 'authenticatedPlan');
866
+ export const encodeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequest = (valueArg) => encodeAuthenticatedArtifact(valueArg, normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure, 'authenticatedProductionRequest');
867
+ export const encodeAuthenticatedCloudlyLegacyDeploymentSettlementCheckResult = (valueArg) => encodeAuthenticatedArtifact(valueArg, normalizeCloudlyLegacyDeploymentSettlementAuthenticatedCheckResultStructure, 'authenticatedCheckResult');
868
+ export const encodeAuthenticatedCloudlyLegacyDeploymentSettlementApplyResult = (valueArg) => encodeAuthenticatedArtifact(valueArg, normalizeCloudlyLegacyDeploymentSettlementAuthenticatedApplyResultStructure, 'authenticatedApplyResult');
869
+ export const encodeAuthenticatedCloudlyLegacyDeploymentSettlementStableOutcome = (valueArg) => encodeAuthenticatedArtifact(valueArg, normalizeCloudlyLegacyDeploymentSettlementAuthenticatedStableOutcomeStructure, 'authenticatedStableOutcome');
870
+ export const digestAuthenticatedCloudlyLegacyDeploymentSettlementRehearsalBinding = (valueArg) => digestBytes(encodeAuthenticatedCloudlyLegacyDeploymentSettlementRehearsalBinding(valueArg));
871
+ export const digestAuthenticatedCloudlyLegacyDeploymentSettlementPlan = (valueArg) => digestBytes(encodeAuthenticatedCloudlyLegacyDeploymentSettlementPlan(valueArg));
872
+ export const digestAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequest = (valueArg) => digestBytes(encodeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequest(valueArg));
873
+ export const digestAuthenticatedCloudlyLegacyDeploymentSettlementCheckResult = (valueArg) => digestBytes(encodeAuthenticatedCloudlyLegacyDeploymentSettlementCheckResult(valueArg));
874
+ export const digestAuthenticatedCloudlyLegacyDeploymentSettlementApplyResult = (valueArg) => digestBytes(encodeAuthenticatedCloudlyLegacyDeploymentSettlementApplyResult(valueArg));
875
+ export const digestAuthenticatedCloudlyLegacyDeploymentSettlementStableOutcome = (valueArg) => digestBytes(encodeAuthenticatedCloudlyLegacyDeploymentSettlementStableOutcome(valueArg));
876
+ const scratchReceiptKeys = [
877
+ 'schemaVersion',
878
+ 'kind',
879
+ 'authority',
880
+ 'requestSha256',
881
+ 'stableOutcome',
882
+ 'stableOutcomeSha256',
883
+ 'transactionCommitted',
884
+ 'disposition',
885
+ 'completedAt',
886
+ 'payloadSha256',
887
+ 'mac',
888
+ ];
889
+ const scratchReceiptPayloadKeys = scratchReceiptKeys.filter((keyArg) => (keyArg !== 'payloadSha256' && keyArg !== 'mac'));
890
+ const unsignedScratchReceiptKeys = scratchReceiptKeys.filter((keyArg) => keyArg !== 'mac');
891
+ const scratchReceiptPayload = (valueArg) => ({
892
+ schemaVersion: valueArg.schemaVersion,
893
+ kind: valueArg.kind,
894
+ authority: valueArg.authority,
895
+ requestSha256: valueArg.requestSha256,
896
+ stableOutcome: valueArg.stableOutcome,
897
+ stableOutcomeSha256: valueArg.stableOutcomeSha256,
898
+ transactionCommitted: valueArg.transactionCommitted,
899
+ disposition: valueArg.disposition,
900
+ completedAt: valueArg.completedAt,
901
+ });
902
+ const normalizeScratchReceiptPayloadInternal = (valueArg, pathArg) => {
903
+ const value = readRecord(valueArg, pathArg);
904
+ assertExactKeys(value, scratchReceiptPayloadKeys, pathArg);
905
+ if (value.schemaVersion !== 1
906
+ || value.kind !== 'cloudly-legacy-deployment-settlement-scratch-receipt'
907
+ || value.transactionCommitted !== true) {
908
+ fail('INVALID_VALUE', `${pathArg}.kind`);
909
+ }
910
+ const output = {
911
+ schemaVersion: 1,
912
+ kind: 'cloudly-legacy-deployment-settlement-scratch-receipt',
913
+ authority: normalizeAuthorityReferenceInternal(value.authority, `${pathArg}.authority`),
914
+ requestSha256: readSha256(value.requestSha256, `${pathArg}.requestSha256`),
915
+ stableOutcome: normalizeStableOutcomeInternal(value.stableOutcome, `${pathArg}.stableOutcome`),
916
+ stableOutcomeSha256: readSha256(value.stableOutcomeSha256, `${pathArg}.stableOutcomeSha256`),
917
+ transactionCommitted: true,
918
+ disposition: readLiteral(value.disposition, ['applied', 'exact-replay', 'no-op'], `${pathArg}.disposition`),
919
+ completedAt: readInteger(value.completedAt, `${pathArg}.completedAt`, 1),
920
+ };
921
+ if (output.stableOutcomeSha256
922
+ !== digestBytes(encodeNormalized(output.stableOutcome, `${pathArg}.stableOutcome`))) {
923
+ fail('CROSS_FIELD_MISMATCH', `${pathArg}.stableOutcomeSha256`);
924
+ }
925
+ return output;
926
+ };
927
+ const normalizeUnsignedScratchReceiptInternal = (valueArg, pathArg) => {
928
+ const value = readRecord(valueArg, pathArg);
929
+ assertExactKeys(value, unsignedScratchReceiptKeys, pathArg);
930
+ const payloadInput = Object.fromEntries(scratchReceiptPayloadKeys.map((keyArg) => [
931
+ keyArg,
932
+ value[keyArg],
933
+ ]));
934
+ const payload = normalizeScratchReceiptPayloadInternal(payloadInput, `${pathArg}.payload`);
935
+ const payloadSha256 = readSha256(value.payloadSha256, `${pathArg}.payloadSha256`);
936
+ if (payloadSha256 !== digestBytes(encodeNormalized(scratchReceiptPayload(payload), `${pathArg}.payload`))) {
937
+ fail('CROSS_FIELD_MISMATCH', `${pathArg}.payloadSha256`);
938
+ }
939
+ return { ...payload, payloadSha256 };
940
+ };
941
+ const normalizeScratchReceiptInternal = (valueArg, pathArg) => {
942
+ const value = readRecord(valueArg, pathArg);
943
+ assertExactKeys(value, scratchReceiptKeys, pathArg);
944
+ const unsignedInput = Object.fromEntries(unsignedScratchReceiptKeys.map((keyArg) => [
945
+ keyArg,
946
+ value[keyArg],
947
+ ]));
948
+ const unsigned = normalizeUnsignedScratchReceiptInternal(unsignedInput, `${pathArg}.unsigned`);
949
+ return {
950
+ ...unsigned,
951
+ mac: readMac(value.mac, `${pathArg}.mac`),
952
+ };
953
+ };
954
+ export const digestCloudlyLegacyDeploymentSettlementScratchReceiptPayload = (valueArg) => {
955
+ const payload = normalizeScratchReceiptPayloadInternal(valueArg, 'scratchReceiptPayload');
956
+ return digestBytes(encodeNormalized(scratchReceiptPayload(payload), 'scratchReceiptPayload'));
957
+ };
958
+ export const normalizeCloudlyLegacyDeploymentSettlementScratchReceipt = (valueArg) => finalize(normalizeScratchReceiptInternal(valueArg, 'scratchReceipt'), cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes, 'scratchReceipt');
959
+ export const encodeCloudlyLegacyDeploymentSettlementScratchReceipt = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementScratchReceipt(valueArg), 'scratchReceipt');
960
+ export const encodeCloudlyLegacyDeploymentSettlementScratchReceiptHmacInput = (valueArg) => {
961
+ const authenticated = finalize(normalizeUnsignedScratchReceiptInternal(valueArg, 'unsignedScratchReceipt'), cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes, 'unsignedScratchReceipt');
962
+ return frame(cloudlyLegacyDeploymentSettlementDomains.scratchReceiptHmac, encodeNormalized(authenticated, 'scratchReceipt.authenticated'));
963
+ };
964
+ export const digestCloudlyLegacyDeploymentSettlementScratchReceipt = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementScratchReceipt(valueArg));
965
+ const productionReceiptKeys = [
966
+ 'schemaVersion',
967
+ 'kind',
968
+ 'authority',
969
+ 'requestSha256',
970
+ 'scratchReceipt',
971
+ 'scratchReceiptSha256',
972
+ 'stableOutcome',
973
+ 'stableOutcomeSha256',
974
+ 'transactionCommitted',
975
+ 'disposition',
976
+ 'completedAt',
977
+ 'payloadSha256',
978
+ 'mac',
979
+ ];
980
+ const productionReceiptPayloadKeys = productionReceiptKeys.filter((keyArg) => (keyArg !== 'payloadSha256' && keyArg !== 'mac'));
981
+ const unsignedProductionReceiptKeys = productionReceiptKeys.filter((keyArg) => keyArg !== 'mac');
982
+ const productionReceiptPayload = (valueArg) => ({
983
+ schemaVersion: valueArg.schemaVersion,
984
+ kind: valueArg.kind,
985
+ authority: valueArg.authority,
986
+ requestSha256: valueArg.requestSha256,
987
+ scratchReceipt: valueArg.scratchReceipt,
988
+ scratchReceiptSha256: valueArg.scratchReceiptSha256,
989
+ stableOutcome: valueArg.stableOutcome,
990
+ stableOutcomeSha256: valueArg.stableOutcomeSha256,
991
+ transactionCommitted: valueArg.transactionCommitted,
992
+ disposition: valueArg.disposition,
993
+ completedAt: valueArg.completedAt,
994
+ });
995
+ const normalizeProductionReceiptPayloadInternal = (valueArg, pathArg) => {
996
+ const value = readRecord(valueArg, pathArg);
997
+ assertExactKeys(value, productionReceiptPayloadKeys, pathArg);
998
+ if (value.schemaVersion !== 1
999
+ || value.kind !== 'cloudly-legacy-deployment-settlement-production-receipt'
1000
+ || value.transactionCommitted !== true) {
1001
+ fail('INVALID_VALUE', `${pathArg}.kind`);
1002
+ }
1003
+ const scratchReceipt = normalizeScratchReceiptInternal(value.scratchReceipt, `${pathArg}.scratchReceipt`);
1004
+ const stableOutcome = normalizeStableOutcomeInternal(value.stableOutcome, `${pathArg}.stableOutcome`);
1005
+ const stableOutcomeSha256 = readSha256(value.stableOutcomeSha256, `${pathArg}.stableOutcomeSha256`);
1006
+ const authority = normalizeAuthorityReferenceInternal(value.authority, `${pathArg}.authority`);
1007
+ if (canonicalize(authority, `${pathArg}.authority`)
1008
+ !== canonicalize(scratchReceipt.authority, `${pathArg}.scratchReceipt.authority`)) {
1009
+ fail('CROSS_FIELD_MISMATCH', `${pathArg}.authority`);
1010
+ }
1011
+ const requestSha256 = readSha256(value.requestSha256, `${pathArg}.requestSha256`);
1012
+ const disposition = readLiteral(value.disposition, ['applied', 'exact-replay', 'no-op'], `${pathArg}.disposition`);
1013
+ if (requestSha256 !== scratchReceipt.requestSha256
1014
+ || disposition !== scratchReceipt.disposition) {
1015
+ fail('CROSS_FIELD_MISMATCH', `${pathArg}.scratchReceipt`);
1016
+ }
1017
+ if (canonicalize(stableOutcome, `${pathArg}.stableOutcome`)
1018
+ !== canonicalize(scratchReceipt.stableOutcome, `${pathArg}.scratchReceipt.stableOutcome`)
1019
+ || stableOutcomeSha256 !== scratchReceipt.stableOutcomeSha256
1020
+ || stableOutcomeSha256
1021
+ !== digestBytes(encodeNormalized(stableOutcome, `${pathArg}.stableOutcome`))) {
1022
+ fail('CROSS_FIELD_MISMATCH', `${pathArg}.stableOutcome`);
1023
+ }
1024
+ const scratchReceiptSha256 = readSha256(value.scratchReceiptSha256, `${pathArg}.scratchReceiptSha256`);
1025
+ if (scratchReceiptSha256
1026
+ !== digestBytes(encodeNormalized(scratchReceipt, `${pathArg}.scratchReceipt`))) {
1027
+ fail('CROSS_FIELD_MISMATCH', `${pathArg}.scratchReceiptSha256`);
1028
+ }
1029
+ return {
1030
+ schemaVersion: 1,
1031
+ kind: 'cloudly-legacy-deployment-settlement-production-receipt',
1032
+ authority,
1033
+ requestSha256,
1034
+ scratchReceipt,
1035
+ scratchReceiptSha256,
1036
+ stableOutcome,
1037
+ stableOutcomeSha256,
1038
+ transactionCommitted: true,
1039
+ disposition,
1040
+ completedAt: readInteger(value.completedAt, `${pathArg}.completedAt`, scratchReceipt.completedAt),
1041
+ };
1042
+ };
1043
+ const normalizeUnsignedProductionReceiptInternal = (valueArg, pathArg) => {
1044
+ const value = readRecord(valueArg, pathArg);
1045
+ assertExactKeys(value, unsignedProductionReceiptKeys, pathArg);
1046
+ const payloadInput = Object.fromEntries(productionReceiptPayloadKeys.map((keyArg) => [
1047
+ keyArg,
1048
+ value[keyArg],
1049
+ ]));
1050
+ const payload = normalizeProductionReceiptPayloadInternal(payloadInput, `${pathArg}.payload`);
1051
+ const payloadSha256 = readSha256(value.payloadSha256, `${pathArg}.payloadSha256`);
1052
+ if (payloadSha256 !== digestBytes(encodeNormalized(productionReceiptPayload(payload), `${pathArg}.payload`))) {
1053
+ fail('CROSS_FIELD_MISMATCH', `${pathArg}.payloadSha256`);
1054
+ }
1055
+ return { ...payload, payloadSha256 };
1056
+ };
1057
+ export const digestCloudlyLegacyDeploymentSettlementProductionReceiptPayload = (valueArg) => {
1058
+ const payload = normalizeProductionReceiptPayloadInternal(valueArg, 'productionReceiptPayload');
1059
+ return digestBytes(encodeNormalized(productionReceiptPayload(payload), 'productionReceiptPayload'));
1060
+ };
1061
+ export const normalizeCloudlyLegacyDeploymentSettlementProductionReceipt = (valueArg) => {
1062
+ const value = readRecord(valueArg, 'productionReceipt');
1063
+ assertExactKeys(value, productionReceiptKeys, 'productionReceipt');
1064
+ const unsignedInput = Object.fromEntries(unsignedProductionReceiptKeys.map((keyArg) => [
1065
+ keyArg,
1066
+ value[keyArg],
1067
+ ]));
1068
+ const unsigned = normalizeUnsignedProductionReceiptInternal(unsignedInput, 'productionReceipt.unsigned');
1069
+ return finalize({
1070
+ ...unsigned,
1071
+ mac: readMac(value.mac, 'productionReceipt.mac'),
1072
+ }, cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes, 'productionReceipt');
1073
+ };
1074
+ export const encodeCloudlyLegacyDeploymentSettlementProductionReceipt = (valueArg) => encodeNormalized(normalizeCloudlyLegacyDeploymentSettlementProductionReceipt(valueArg), 'productionReceipt');
1075
+ export const encodeCloudlyLegacyDeploymentSettlementProductionReceiptHmacInput = (valueArg) => {
1076
+ const authenticated = finalize(normalizeUnsignedProductionReceiptInternal(valueArg, 'unsignedProductionReceipt'), cloudlyLegacyDeploymentSettlementLimits.maximumReceiptBytes, 'unsignedProductionReceipt');
1077
+ return frame(cloudlyLegacyDeploymentSettlementDomains.productionReceiptHmac, encodeNormalized(authenticated, 'productionReceipt.authenticated'));
1078
+ };
1079
+ export const digestCloudlyLegacyDeploymentSettlementProductionReceipt = (valueArg) => digestBytes(encodeCloudlyLegacyDeploymentSettlementProductionReceipt(valueArg));
1080
+ const withoutArtifactMac = (artifactArg) => {
1081
+ const { mac: _mac, ...unsigned } = artifactArg;
1082
+ return unsigned;
1083
+ };
1084
+ const requireConsumerVerifiedHmac = async (authorityArg, domainArg, hmacInputArg, macArg, verifierArg, pathArg) => {
1085
+ let verified = false;
1086
+ try {
1087
+ verified = await verifierArg({
1088
+ authority: authorityArg,
1089
+ domain: domainArg,
1090
+ hmacInput: new Uint8Array(hmacInputArg),
1091
+ mac: macArg,
1092
+ });
1093
+ }
1094
+ catch {
1095
+ verified = false;
1096
+ }
1097
+ if (!verified)
1098
+ fail('INVALID_VALUE', pathArg);
1099
+ };
1100
+ const assertAuthorityTimestamp = (timestampArg, metadataArg, pathArg) => {
1101
+ if (timestampArg < metadataArg.issuedAt || timestampArg >= metadataArg.expiresAt) {
1102
+ fail('CROSS_FIELD_MISMATCH', pathArg);
1103
+ }
1104
+ };
1105
+ const assertAuthorityReferenceMatchesMetadata = (referenceArg, metadataArg, pathArg) => {
1106
+ try {
1107
+ normalizeCloudlyLegacyDeploymentSettlementAuthorityReferenceForMetadata(referenceArg, metadataArg);
1108
+ }
1109
+ catch {
1110
+ fail('CROSS_FIELD_MISMATCH', pathArg);
1111
+ }
1112
+ };
1113
+ const assertRehearsalBindingMatchesAuthorityMetadata = (bindingArg, metadataArg, pathArg) => {
1114
+ const expected = {
1115
+ settlementId: metadataArg.settlementId,
1116
+ runId: metadataArg.runId,
1117
+ rehearsalId: metadataArg.rehearsalId,
1118
+ scratchServiceId: metadataArg.scratchServiceId,
1119
+ allocationId: metadataArg.allocationId,
1120
+ allocationGeneration: metadataArg.allocationGeneration,
1121
+ allocationBindingSha256: metadataArg.allocationBindingSha256,
1122
+ allocationReceiptSha256: metadataArg.allocationReceiptSha256,
1123
+ backupId: metadataArg.backupId,
1124
+ backupSnapshotIdSha256: metadataArg.backupSnapshotIdSha256,
1125
+ backupProofSha256: metadataArg.backupProofSha256,
1126
+ sourceDataSha256: metadataArg.sourceDataSha256,
1127
+ restoredDataSha256: metadataArg.restoredDataSha256,
1128
+ digestProofSha256: metadataArg.digestProofSha256,
1129
+ targetImageDigest: metadataArg.targetImageDigest,
1130
+ targetVersion: metadataArg.targetVersion,
1131
+ targetManifestSha256: metadataArg.targetManifestSha256,
1132
+ targetConfigSha256: metadataArg.targetConfigSha256,
1133
+ };
1134
+ const actual = {
1135
+ settlementId: bindingArg.settlementId,
1136
+ runId: bindingArg.runId,
1137
+ rehearsalId: bindingArg.rehearsalId,
1138
+ scratchServiceId: bindingArg.scratchServiceId,
1139
+ allocationId: bindingArg.allocationId,
1140
+ allocationGeneration: bindingArg.allocationGeneration,
1141
+ allocationBindingSha256: bindingArg.allocationBindingSha256,
1142
+ allocationReceiptSha256: bindingArg.allocationReceiptSha256,
1143
+ backupId: bindingArg.backupId,
1144
+ backupSnapshotIdSha256: bindingArg.backupSnapshotIdSha256,
1145
+ backupProofSha256: bindingArg.backupProofSha256,
1146
+ sourceDataSha256: bindingArg.sourceDataSha256,
1147
+ restoredDataSha256: bindingArg.restoredDataSha256,
1148
+ digestProofSha256: bindingArg.digestProofSha256,
1149
+ targetImageDigest: bindingArg.targetImageDigest,
1150
+ targetVersion: bindingArg.targetVersion,
1151
+ targetManifestSha256: bindingArg.targetManifestSha256,
1152
+ targetConfigSha256: bindingArg.targetConfigSha256,
1153
+ };
1154
+ if (canonicalize(actual, pathArg) !== canonicalize(expected, `${pathArg}.expected`)) {
1155
+ fail('CROSS_FIELD_MISMATCH', pathArg);
1156
+ }
1157
+ };
1158
+ export const normalizeCloudlyLegacyDeploymentSettlementRehearsalBindingForAuthority = (bindingArg, metadataArg) => {
1159
+ const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
1160
+ const binding = normalizeCloudlyLegacyDeploymentSettlementRehearsalBinding(bindingArg);
1161
+ assertRehearsalBindingMatchesAuthorityMetadata(binding, metadata, 'rehearsalBinding.authority');
1162
+ return binding;
1163
+ };
1164
+ export const normalizeCloudlyLegacyDeploymentSettlementPlanForAuthority = (planArg, metadataArg) => {
1165
+ const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
1166
+ const plan = normalizeCloudlyLegacyDeploymentSettlementPlan(planArg);
1167
+ assertAuthorityReferenceMatchesMetadata(plan.authority, metadata, 'plan.authority');
1168
+ if (plan.settlementId !== metadata.settlementId) {
1169
+ fail('CROSS_FIELD_MISMATCH', 'plan.settlementId');
1170
+ }
1171
+ assertAuthorityTimestamp(plan.effectiveAt, metadata, 'plan.effectiveAt');
1172
+ return plan;
1173
+ };
1174
+ export const normalizeCloudlyLegacyDeploymentSettlementProductionRequestForAuthority = (requestArg, metadataArg) => {
1175
+ const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
1176
+ const request = normalizeCloudlyLegacyDeploymentSettlementProductionRequest(requestArg);
1177
+ assertAuthorityReferenceMatchesMetadata(request.authority, metadata, 'productionRequest.authority');
1178
+ normalizeCloudlyLegacyDeploymentSettlementPlanForAuthority(request.plan, metadata);
1179
+ normalizeCloudlyLegacyDeploymentSettlementRehearsalBindingForAuthority(request.rehearsalBinding, metadata);
1180
+ assertAuthorityTimestamp(request.requestedAt, metadata, 'productionRequest.requestedAt');
1181
+ return request;
1182
+ };
1183
+ export const normalizeAuthenticatedCloudlyLegacyDeploymentSettlementRehearsalBindingForAuthority = async (bindingArg, metadataArg, verifierArg) => {
1184
+ const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
1185
+ const binding = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedRehearsalBindingStructure(bindingArg);
1186
+ assertAuthorityReferenceMatchesMetadata(binding.authority, metadata, 'rehearsalBinding.authority');
1187
+ normalizeCloudlyLegacyDeploymentSettlementRehearsalBindingForAuthority(binding.payload, metadata);
1188
+ await requireConsumerVerifiedHmac(binding.authority, cloudlyLegacyDeploymentSettlementDomains.rehearsalBindingHmac, encodeCloudlyLegacyDeploymentSettlementRehearsalBindingHmacInput(withoutArtifactMac(binding)), binding.mac, verifierArg, 'rehearsalBinding.mac');
1189
+ return binding;
1190
+ };
1191
+ export const normalizeAuthenticatedCloudlyLegacyDeploymentSettlementPlanForAuthority = async (planArg, metadataArg, verifierArg) => {
1192
+ const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
1193
+ const plan = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedPlanStructure(planArg);
1194
+ assertAuthorityReferenceMatchesMetadata(plan.authority, metadata, 'plan.authority');
1195
+ normalizeCloudlyLegacyDeploymentSettlementPlanForAuthority(plan.payload, metadata);
1196
+ await requireConsumerVerifiedHmac(plan.authority, cloudlyLegacyDeploymentSettlementDomains.planHmac, encodeCloudlyLegacyDeploymentSettlementPlanHmacInput(withoutArtifactMac(plan)), plan.mac, verifierArg, 'plan.mac');
1197
+ return plan;
1198
+ };
1199
+ export const normalizeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequestForAuthority = async (requestArg, metadataArg, verifierArg) => {
1200
+ const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
1201
+ const request = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure(requestArg);
1202
+ assertAuthorityReferenceMatchesMetadata(request.authority, metadata, 'productionRequest.authority');
1203
+ normalizeCloudlyLegacyDeploymentSettlementProductionRequestForAuthority(request.payload, metadata);
1204
+ await requireConsumerVerifiedHmac(request.authority, cloudlyLegacyDeploymentSettlementDomains.productionRequestHmac, encodeCloudlyLegacyDeploymentSettlementProductionRequestHmacInput(withoutArtifactMac(request)), request.mac, verifierArg, 'productionRequest.mac');
1205
+ return request;
1206
+ };
1207
+ export const normalizeAuthenticatedCloudlyLegacyDeploymentSettlementCheckResultForAuthority = async (resultArg, metadataArg, requestArg, verifierArg) => {
1208
+ const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
1209
+ const request = await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequestForAuthority(requestArg, metadata, verifierArg);
1210
+ const result = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedCheckResultStructureForRequest(resultArg, request);
1211
+ assertAuthorityReferenceMatchesMetadata(result.authority, metadata, 'checkResult.authority');
1212
+ assertAuthorityTimestamp(result.payload.checkedAt, metadata, 'checkResult.checkedAt');
1213
+ await requireConsumerVerifiedHmac(result.authority, cloudlyLegacyDeploymentSettlementDomains.checkResultHmac, encodeCloudlyLegacyDeploymentSettlementCheckResultHmacInput(withoutArtifactMac(result)), result.mac, verifierArg, 'checkResult.mac');
1214
+ return result;
1215
+ };
1216
+ export const normalizeAuthenticatedCloudlyLegacyDeploymentSettlementApplyResultForAuthority = async (resultArg, metadataArg, requestArg, verifierArg) => {
1217
+ const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
1218
+ const request = await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequestForAuthority(requestArg, metadata, verifierArg);
1219
+ const result = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedApplyResultStructureForRequest(resultArg, request);
1220
+ assertAuthorityReferenceMatchesMetadata(result.authority, metadata, 'applyResult.authority');
1221
+ assertAuthorityTimestamp(result.payload.status === 'completed'
1222
+ ? result.payload.completedAt
1223
+ : result.payload.rejectedAt, metadata, 'applyResult.completedAt');
1224
+ await requireConsumerVerifiedHmac(result.authority, cloudlyLegacyDeploymentSettlementDomains.applyResultHmac, encodeCloudlyLegacyDeploymentSettlementApplyResultHmacInput(withoutArtifactMac(result)), result.mac, verifierArg, 'applyResult.mac');
1225
+ return result;
1226
+ };
1227
+ export const normalizeAuthenticatedCloudlyLegacyDeploymentSettlementStableOutcomeForAuthority = async (outcomeArg, metadataArg, requestArg, verifierArg) => {
1228
+ const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
1229
+ const request = await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequestForAuthority(requestArg, metadata, verifierArg);
1230
+ const outcome = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedStableOutcomeStructureForRequest(outcomeArg, request);
1231
+ assertAuthorityReferenceMatchesMetadata(outcome.authority, metadata, 'stableOutcome.authority');
1232
+ if (outcome.payload.settlementId !== metadata.settlementId
1233
+ || outcome.payload.runId !== metadata.runId) {
1234
+ fail('CROSS_FIELD_MISMATCH', 'stableOutcome.authority');
1235
+ }
1236
+ assertAuthorityTimestamp(outcome.payload.effectiveAt, metadata, 'stableOutcome.effectiveAt');
1237
+ await requireConsumerVerifiedHmac(outcome.authority, cloudlyLegacyDeploymentSettlementDomains.stableOutcomeHmac, encodeCloudlyLegacyDeploymentSettlementStableOutcomeHmacInput(withoutArtifactMac(outcome)), outcome.mac, verifierArg, 'stableOutcome.mac');
1238
+ return outcome;
1239
+ };
1240
+ export const normalizeCloudlyLegacyDeploymentSettlementScratchReceiptForAuthority = async (receiptArg, metadataArg, requestArg, verifierArg) => {
1241
+ const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
1242
+ const request = await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequestForAuthority(requestArg, metadata, verifierArg);
1243
+ const receipt = normalizeCloudlyLegacyDeploymentSettlementScratchReceiptStructureForRequest(receiptArg, request);
1244
+ assertAuthorityReferenceMatchesMetadata(receipt.authority, metadata, 'scratchReceipt.authority');
1245
+ if (receipt.stableOutcome.settlementId !== metadata.settlementId
1246
+ || receipt.stableOutcome.runId !== metadata.runId) {
1247
+ fail('CROSS_FIELD_MISMATCH', 'scratchReceipt.stableOutcome');
1248
+ }
1249
+ assertAuthorityTimestamp(receipt.stableOutcome.effectiveAt, metadata, 'scratchReceipt.effectiveAt');
1250
+ assertAuthorityTimestamp(receipt.completedAt, metadata, 'scratchReceipt.completedAt');
1251
+ await requireConsumerVerifiedHmac(receipt.authority, cloudlyLegacyDeploymentSettlementDomains.scratchReceiptHmac, encodeCloudlyLegacyDeploymentSettlementScratchReceiptHmacInput(withoutArtifactMac(receipt)), receipt.mac, verifierArg, 'scratchReceipt.mac');
1252
+ return receipt;
1253
+ };
1254
+ export const normalizeCloudlyLegacyDeploymentSettlementProductionReceiptForAuthority = async (receiptArg, metadataArg, requestArg, verifierArg) => {
1255
+ const metadata = normalizeCloudlyLegacyDeploymentSettlementAuthorityMetadata(metadataArg);
1256
+ const request = await normalizeAuthenticatedCloudlyLegacyDeploymentSettlementProductionRequestForAuthority(requestArg, metadata, verifierArg);
1257
+ const receipt = normalizeCloudlyLegacyDeploymentSettlementProductionReceiptStructureForRequest(receiptArg, request);
1258
+ assertAuthorityReferenceMatchesMetadata(receipt.authority, metadata, 'productionReceipt.authority');
1259
+ await normalizeCloudlyLegacyDeploymentSettlementScratchReceiptForAuthority(receipt.scratchReceipt, metadata, request, verifierArg);
1260
+ if (receipt.stableOutcome.settlementId !== metadata.settlementId
1261
+ || receipt.stableOutcome.runId !== metadata.runId) {
1262
+ fail('CROSS_FIELD_MISMATCH', 'productionReceipt.stableOutcome');
1263
+ }
1264
+ assertAuthorityTimestamp(receipt.completedAt, metadata, 'productionReceipt.completedAt');
1265
+ await requireConsumerVerifiedHmac(receipt.authority, cloudlyLegacyDeploymentSettlementDomains.productionReceiptHmac, encodeCloudlyLegacyDeploymentSettlementProductionReceiptHmacInput(withoutArtifactMac(receipt)), receipt.mac, verifierArg, 'productionReceipt.mac');
1266
+ return receipt;
1267
+ };
1268
+ const assertAuthenticatedAuthorityMatches = (authorityArg, expectedArg, pathArg) => {
1269
+ if (canonicalize(authorityArg, pathArg) !== canonicalize(expectedArg, `${pathArg}.expected`)) {
1270
+ fail('CROSS_FIELD_MISMATCH', pathArg);
1271
+ }
1272
+ };
1273
+ const assertSummaryMatchesProductionRequest = (summaryArg, requestArg, pathArg) => {
1274
+ if (summaryArg.requestSha256
1275
+ !== digestCloudlyLegacyDeploymentSettlementProductionRequest(requestArg)
1276
+ || summaryArg.planSha256 !== requestArg.planSha256
1277
+ || summaryArg.settlementId !== requestArg.plan.settlementId
1278
+ || summaryArg.sourceStateHmac !== requestArg.plan.sourceStateHmac
1279
+ || summaryArg.finalStateHmac !== requestArg.plan.finalStateHmac
1280
+ || canonicalize(summaryArg.counts, `${pathArg}.counts`)
1281
+ !== canonicalize({
1282
+ operationCount: requestArg.plan.operationCount,
1283
+ routeClaimsStabilized: requestArg.plan.entries.reduce((sumArg, entryArg) => sumArg + entryArg.routeClaimsStabilized, 0),
1284
+ routeClaimsRemoved: requestArg.plan.entries.reduce((sumArg, entryArg) => sumArg + entryArg.routeClaimsRemoved, 0),
1285
+ resourceClaimsRemoved: requestArg.plan.entries.reduce((sumArg, entryArg) => sumArg + entryArg.resourceClaimsRemoved, 0),
1286
+ }, `${pathArg}.expectedCounts`)
1287
+ || canonicalize(summaryArg.classificationCounts, `${pathArg}.classificationCounts`)
1288
+ !== canonicalize(requestArg.plan.classificationCounts, `${pathArg}.expectedClassificationCounts`)) {
1289
+ fail('CROSS_FIELD_MISMATCH', pathArg);
1290
+ }
1291
+ };
1292
+ const assertStableOutcomeMatchesProductionRequest = (stableOutcomeArg, requestArg, pathArg) => {
1293
+ const expectedSettlements = requestArg.plan.entries.map((entryArg) => ({
1294
+ operationId: entryArg.operationId,
1295
+ finalRevision: entryArg.finalRevision,
1296
+ finalDocumentHmac: entryArg.finalDocumentHmac,
1297
+ }));
1298
+ if (stableOutcomeArg.settlementId !== requestArg.plan.settlementId
1299
+ || stableOutcomeArg.runId !== requestArg.rehearsalBinding.runId
1300
+ || stableOutcomeArg.rehearsalBindingSha256 !== requestArg.rehearsalBindingSha256
1301
+ || stableOutcomeArg.effectiveAt !== requestArg.plan.effectiveAt
1302
+ || stableOutcomeArg.planSha256 !== requestArg.planSha256
1303
+ || stableOutcomeArg.sourceStateHmac !== requestArg.plan.sourceStateHmac
1304
+ || stableOutcomeArg.finalStateHmac !== requestArg.plan.finalStateHmac
1305
+ || canonicalize(stableOutcomeArg.settlements, `${pathArg}.settlements`)
1306
+ !== canonicalize(expectedSettlements, `${pathArg}.expectedSettlements`)) {
1307
+ fail('CROSS_FIELD_MISMATCH', pathArg);
1308
+ }
1309
+ assertSummaryMatchesProductionRequest({
1310
+ schemaVersion: 1,
1311
+ requestSha256: digestCloudlyLegacyDeploymentSettlementProductionRequest(requestArg),
1312
+ planSha256: stableOutcomeArg.planSha256,
1313
+ settlementId: stableOutcomeArg.settlementId,
1314
+ sourceStateHmac: stableOutcomeArg.sourceStateHmac,
1315
+ finalStateHmac: stableOutcomeArg.finalStateHmac,
1316
+ transactionSupported: true,
1317
+ counts: stableOutcomeArg.counts,
1318
+ classificationCounts: stableOutcomeArg.classificationCounts,
1319
+ }, requestArg, pathArg);
1320
+ };
1321
+ /** Structural/request binding only; this function does not authenticate MACs. */
1322
+ export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedCheckResultStructureForRequest = (resultArg, requestArg) => {
1323
+ const request = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure(requestArg);
1324
+ const result = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedCheckResultStructure(resultArg);
1325
+ assertAuthenticatedAuthorityMatches(result.authority, request.authority, 'checkResult.authority');
1326
+ assertSummaryMatchesProductionRequest(result.payload, request.payload, 'checkResult.payload');
1327
+ if (result.payload.checkedAt < request.payload.requestedAt) {
1328
+ fail('CROSS_FIELD_MISMATCH', 'checkResult.payload.checkedAt');
1329
+ }
1330
+ return result;
1331
+ };
1332
+ export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedApplyResultStructureForRequest = (resultArg, requestArg) => {
1333
+ const request = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure(requestArg);
1334
+ const result = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedApplyResultStructure(resultArg);
1335
+ assertAuthenticatedAuthorityMatches(result.authority, request.authority, 'applyResult.authority');
1336
+ assertSummaryMatchesProductionRequest(result.payload, request.payload, 'applyResult.payload');
1337
+ const resultAt = result.payload.status === 'completed'
1338
+ ? result.payload.completedAt
1339
+ : result.payload.rejectedAt;
1340
+ if (resultAt < request.payload.requestedAt) {
1341
+ fail('CROSS_FIELD_MISMATCH', 'applyResult.payload.completedAt');
1342
+ }
1343
+ return result;
1344
+ };
1345
+ export const normalizeCloudlyLegacyDeploymentSettlementAuthenticatedStableOutcomeStructureForRequest = (outcomeArg, requestArg) => {
1346
+ const request = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure(requestArg);
1347
+ const outcome = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedStableOutcomeStructure(outcomeArg);
1348
+ assertAuthenticatedAuthorityMatches(outcome.authority, request.authority, 'stableOutcome.authority');
1349
+ assertStableOutcomeMatchesProductionRequest(outcome.payload, request.payload, 'stableOutcome.payload');
1350
+ return outcome;
1351
+ };
1352
+ /** Structural/request binding only; this function does not authenticate MACs. */
1353
+ export const normalizeCloudlyLegacyDeploymentSettlementScratchReceiptStructureForRequest = (receiptArg, requestArg) => {
1354
+ const request = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure(requestArg);
1355
+ const receipt = normalizeCloudlyLegacyDeploymentSettlementScratchReceipt(receiptArg);
1356
+ assertAuthenticatedAuthorityMatches(receipt.authority, request.authority, 'scratchReceipt.authority');
1357
+ if (receipt.requestSha256
1358
+ !== digestCloudlyLegacyDeploymentSettlementProductionRequest(request.payload)
1359
+ || receipt.completedAt < request.payload.requestedAt) {
1360
+ fail('CROSS_FIELD_MISMATCH', 'scratchReceipt.requestSha256');
1361
+ }
1362
+ assertStableOutcomeMatchesProductionRequest(receipt.stableOutcome, request.payload, 'scratchReceipt.stableOutcome');
1363
+ return receipt;
1364
+ };
1365
+ export const normalizeCloudlyLegacyDeploymentSettlementProductionReceiptStructureForRequest = (receiptArg, requestArg) => {
1366
+ const request = normalizeCloudlyLegacyDeploymentSettlementAuthenticatedProductionRequestStructure(requestArg);
1367
+ const receipt = normalizeCloudlyLegacyDeploymentSettlementProductionReceipt(receiptArg);
1368
+ normalizeCloudlyLegacyDeploymentSettlementScratchReceiptStructureForRequest(receipt.scratchReceipt, request);
1369
+ assertAuthenticatedAuthorityMatches(receipt.authority, request.authority, 'productionReceipt.authority');
1370
+ if (receipt.requestSha256
1371
+ !== digestCloudlyLegacyDeploymentSettlementProductionRequest(request.payload)
1372
+ || receipt.completedAt < request.payload.requestedAt) {
1373
+ fail('CROSS_FIELD_MISMATCH', 'productionReceipt.requestSha256');
1374
+ }
1375
+ return receipt;
1376
+ };
1377
+ export { cloudlyLegacyDeploymentSettlementGoldenVectors } from './runtime.cloudlylegacydeploymentsettlement.golden.js';
1378
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5jbG91ZGx5bGVnYWN5ZGVwbG95bWVudHNldHRsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9ydW50aW1lLmNsb3VkbHlsZWdhY3lkZXBsb3ltZW50c2V0dGxlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHNCQUFzQixDQUFDO0FBRWhELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsZUFBZSxHQUNoQixNQUFNLDRCQUE0QixDQUFDO0FBRXBDLE1BQU0sQ0FBQyxNQUFNLHVDQUF1QyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbkUsdUJBQXVCLEVBQUUsR0FBRztJQUM1QixzQkFBc0IsRUFBRSxJQUFJO0lBQzVCLGlCQUFpQixFQUFFLEdBQUc7SUFDdEIsZ0JBQWdCLEVBQUUsR0FBRyxHQUFHLElBQUk7SUFDNUIsc0JBQXNCLEVBQUUsRUFBRSxHQUFHLElBQUk7SUFDakMsbUJBQW1CLEVBQUUsR0FBRyxHQUFHLElBQUk7SUFDL0IscUJBQXFCLEVBQUUsRUFBRSxHQUFHLElBQUk7SUFDaEMsaUNBQWlDLEVBQUUsR0FBRyxHQUFHLElBQUk7SUFDN0MsMEJBQTBCLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtJQUMvQyxxQkFBcUIsRUFBRSxFQUFFO0NBQzFCLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLHdDQUF3QyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDcEUsWUFBWSxFQUNWLG9FQUFvRTtJQUN0RSxvQkFBb0IsRUFDbEIsNkVBQTZFO0lBQy9FLFFBQVEsRUFDTixnRUFBZ0U7SUFDbEUscUJBQXFCLEVBQ25CLDhFQUE4RTtJQUNoRixlQUFlLEVBQ2Isd0VBQXdFO0lBQzFFLGVBQWUsRUFDYix3RUFBd0U7SUFDMUUsaUJBQWlCLEVBQ2YsMEVBQTBFO0lBQzVFLGtCQUFrQixFQUNoQiwyRUFBMkU7SUFDN0UscUJB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