@serve.zone/interfaces 19.8.0 → 20.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.
Files changed (44) hide show
  1. package/changelog.md +28 -0
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/data/immutableimage.d.ts +2 -0
  4. package/dist_ts/data/immutableimage.js +1 -1
  5. package/dist_ts/data/index.d.ts +1 -0
  6. package/dist_ts/data/index.js +2 -1
  7. package/dist_ts/data/isolatedrestore.js +7 -82
  8. package/dist_ts/data/secret.d.ts +205 -0
  9. package/dist_ts/data/secret.js +469 -0
  10. package/dist_ts/data/secretbundle.d.ts +4 -0
  11. package/dist_ts/data/secretgroup.d.ts +4 -0
  12. package/dist_ts/data/service.d.ts +18 -6
  13. package/dist_ts/data/service.js +1 -1
  14. package/dist_ts/platform/index.d.ts +3 -1
  15. package/dist_ts/platform/index.js +4 -2
  16. package/dist_ts/platform/storagemigration.d.ts +346 -0
  17. package/dist_ts/platform/storagemigration.golden.d.ts +49 -0
  18. package/dist_ts/platform/storagemigration.golden.js +207 -0
  19. package/dist_ts/platform/storagemigration.js +1554 -0
  20. package/dist_ts/private/canonicaljson.d.ts +14 -0
  21. package/dist_ts/private/canonicaljson.js +154 -0
  22. package/dist_ts/requests/index.d.ts +2 -1
  23. package/dist_ts/requests/index.js +3 -2
  24. package/dist_ts/requests/secret.d.ts +198 -0
  25. package/dist_ts/requests/secret.js +2 -0
  26. package/dist_ts/runtime.d.ts +41 -0
  27. package/dist_ts/runtime.js +33 -0
  28. package/package.json +9 -2
  29. package/readme.md +162 -2
  30. package/ts/00_commitinfo_data.ts +1 -1
  31. package/ts/data/immutableimage.ts +2 -0
  32. package/ts/data/index.ts +1 -0
  33. package/ts/data/isolatedrestore.ts +12 -93
  34. package/ts/data/secret.ts +835 -0
  35. package/ts/data/secretbundle.ts +4 -0
  36. package/ts/data/secretgroup.ts +4 -0
  37. package/ts/data/service.ts +26 -6
  38. package/ts/platform/index.ts +3 -0
  39. package/ts/platform/storagemigration.golden.ts +241 -0
  40. package/ts/platform/storagemigration.ts +3082 -0
  41. package/ts/private/canonicaljson.ts +221 -0
  42. package/ts/requests/index.ts +2 -0
  43. package/ts/requests/secret.ts +256 -0
  44. package/ts/runtime.ts +80 -0
@@ -0,0 +1,346 @@
1
+ import type { IAppStoreObjectStorageRequest, IAppStoreStorageClass } from '../appstore/types.js';
2
+ import type { IResolvedObjectStorageBinding, IResolvedStoragePolicyRef, IStorageObjectCredentialsRef } from './storage.js';
3
+ export declare const storageMigrationContractLimits: Readonly<{
4
+ version: 1;
5
+ maximumControlJsonBytes: number;
6
+ maximumConfiguredStringBytes: 2048;
7
+ maximumIssueMessageBytes: 4096;
8
+ maximumAbortReasonBytes: 4096;
9
+ maximumEnvironmentKeyBytes: 256;
10
+ maximumSecretPathBytes: 2048;
11
+ }>;
12
+ export declare const storageMigrationCanonicalJsonRules: Readonly<{
13
+ version: 1;
14
+ encoding: "utf-8";
15
+ objectKeyOrdering: "utf-16-code-unit-ascending";
16
+ arrayOrdering: "preserved-dense";
17
+ unicodeNormalization: "preserved";
18
+ numberEncoding: "safe-integer-json-no-negative-zero";
19
+ digest: "sha256-lowercase-hex";
20
+ }>;
21
+ export declare class StorageMigrationContractError extends Error {
22
+ constructor(reasonArg: string);
23
+ }
24
+ export type TStagedObjectStorageBinding = Omit<IResolvedObjectStorageBinding, 'failure' | 'status'> & {
25
+ status: 'provisioning';
26
+ };
27
+ export type TActiveObjectStorageBinding = Omit<IResolvedObjectStorageBinding, 'failure' | 'status'> & {
28
+ status: 'ready';
29
+ };
30
+ export interface IStorageBindingMigrationOwner {
31
+ migrationId: string;
32
+ migrationDigest: string;
33
+ }
34
+ export interface IUnfencedObjectStorageBindingControlSnapshot {
35
+ schemaVersion: 1;
36
+ binding: TActiveObjectStorageBinding;
37
+ recordRevision: number;
38
+ snapshotDigest: string;
39
+ capturedAt: number;
40
+ activeMigration?: never;
41
+ }
42
+ export interface IFencedObjectStorageBindingControlSnapshot {
43
+ schemaVersion: 1;
44
+ binding: TActiveObjectStorageBinding;
45
+ recordRevision: number;
46
+ snapshotDigest: string;
47
+ capturedAt: number;
48
+ activeMigration: IStorageBindingMigrationOwner;
49
+ }
50
+ export type TUnfencedObjectStorageBindingControlSnapshotDigestPayload = Omit<IUnfencedObjectStorageBindingControlSnapshot, 'snapshotDigest'>;
51
+ export type TFencedObjectStorageBindingControlSnapshotDigestPayload = Omit<IFencedObjectStorageBindingControlSnapshot, 'snapshotDigest'>;
52
+ export interface IObjectStorageMigrationTarget {
53
+ policy: IResolvedStoragePolicyRef;
54
+ storageClass: IAppStoreStorageClass & {
55
+ kind: 'objectStorage';
56
+ };
57
+ request: IAppStoreObjectStorageRequest;
58
+ credentials: IStorageObjectCredentialsRef;
59
+ }
60
+ export interface IObjectStorageMigrationPrepareRequest {
61
+ schemaVersion: 1;
62
+ migrationId: string;
63
+ sourceControlSnapshot: IUnfencedObjectStorageBindingControlSnapshot;
64
+ workloadGeneration: number;
65
+ target: IObjectStorageMigrationTarget;
66
+ }
67
+ export interface IStorageMigrationSourceEvidence {
68
+ preparationSnapshot: IUnfencedObjectStorageBindingControlSnapshot;
69
+ fencedSnapshot: IFencedObjectStorageBindingControlSnapshot;
70
+ }
71
+ export interface IStorageMigrationProgress {
72
+ objectsCopied: number;
73
+ logicalBytesCopied: number;
74
+ physicalBytesCopied?: number;
75
+ objectsTotal?: number;
76
+ logicalBytesTotal?: number;
77
+ physicalBytesTotal?: number;
78
+ updatedAt: number;
79
+ }
80
+ export type TStorageMigrationPreCutoverRecoveryAction = 'retry' | 'abort';
81
+ export type TStorageMigrationPostCutoverRecoveryAction = 'retry' | 'rollForward';
82
+ export interface IStorageMigrationIssueBase {
83
+ code: string;
84
+ message: string;
85
+ retryable: boolean;
86
+ observedAt: number;
87
+ }
88
+ export interface IStorageMigrationPreCutoverIssue extends IStorageMigrationIssueBase {
89
+ allowedRecoveryActions: TStorageMigrationPreCutoverRecoveryAction[];
90
+ }
91
+ export interface IStorageMigrationPostCutoverIssue extends IStorageMigrationIssueBase {
92
+ allowedRecoveryActions: TStorageMigrationPostCutoverRecoveryAction[];
93
+ }
94
+ export interface IStorageMigrationMutationFence {
95
+ schemaVersion: 1;
96
+ migrationId: string;
97
+ migrationDigest: string;
98
+ expectedMigrationRevision: number;
99
+ mutationId: string;
100
+ }
101
+ export interface IObjectStorageMigrationConsumerQuiesceRequest extends IStorageMigrationMutationFence {
102
+ sourceRecordRevision: number;
103
+ sourceControlSnapshotDigest: string;
104
+ candidateDigest: string;
105
+ workloadGeneration: number;
106
+ persistedStagingDigest: string;
107
+ persistedStagingRevision: number;
108
+ consumerStoppedAt: number;
109
+ }
110
+ export type TObjectStorageMigrationPersistedStagingDigestPayload = Omit<IObjectStorageMigrationConsumerQuiesceRequest, 'persistedStagingDigest'>;
111
+ export interface IStorageMigrationConsumerQuiesceEvidence {
112
+ request: IObjectStorageMigrationConsumerQuiesceRequest;
113
+ acceptedMigrationRevision: number;
114
+ acceptedAt: number;
115
+ }
116
+ export interface IObjectStorageMigrationConsumerActivationRequest extends IStorageMigrationMutationFence {
117
+ candidateDigest: string;
118
+ activeBindingDigest: string;
119
+ workloadGeneration: number;
120
+ persistedActivationDigest: string;
121
+ persistedActivationRevision: number;
122
+ consumerStartedAt: number;
123
+ }
124
+ export type TObjectStorageMigrationPersistedActivationDigestPayload = Omit<IObjectStorageMigrationConsumerActivationRequest, 'persistedActivationDigest'>;
125
+ export interface IStorageMigrationConsumerActivationEvidence {
126
+ request: IObjectStorageMigrationConsumerActivationRequest;
127
+ acceptedMigrationRevision: number;
128
+ acceptedAt: number;
129
+ }
130
+ export interface IObjectStorageMigrationAbortRequest extends IStorageMigrationMutationFence {
131
+ reason: string;
132
+ }
133
+ export interface IObjectStorageMigrationResumeRequest extends IStorageMigrationMutationFence {
134
+ action: TStorageMigrationPreCutoverRecoveryAction | TStorageMigrationPostCutoverRecoveryAction;
135
+ }
136
+ export interface IObjectStorageMigrationCleanupRequest extends IStorageMigrationMutationFence {
137
+ }
138
+ export interface IStorageMigrationStatusBase {
139
+ schemaVersion: 1;
140
+ migrationId: string;
141
+ migrationDigest: string;
142
+ migrationRevision: number;
143
+ bindingId: string;
144
+ serviceId: string;
145
+ requestId: string;
146
+ workloadGeneration: number;
147
+ target: IObjectStorageMigrationTarget;
148
+ source: IStorageMigrationSourceEvidence;
149
+ progress?: IStorageMigrationProgress;
150
+ createdAt: number;
151
+ updatedAt: number;
152
+ }
153
+ interface IStorageMigrationLiveStatusBase extends IStorageMigrationStatusBase {
154
+ bindingFenceActive: true;
155
+ }
156
+ interface IStorageMigrationTerminalStatusBase extends IStorageMigrationStatusBase {
157
+ bindingFenceActive: false;
158
+ terminalAt: number;
159
+ }
160
+ interface IStorageMigrationCandidateStatusBase extends IStorageMigrationLiveStatusBase {
161
+ candidateIssued: true;
162
+ candidateBinding: TStagedObjectStorageBinding;
163
+ candidateDigest: string;
164
+ }
165
+ interface IStorageMigrationQuiescedCandidateStatusBase extends IStorageMigrationCandidateStatusBase {
166
+ consumerQuiesceEvidence: IStorageMigrationConsumerQuiesceEvidence;
167
+ }
168
+ interface IStorageMigrationDestinationAuthorizedStatusBase extends IStorageMigrationQuiescedCandidateStatusBase {
169
+ destinationBindingStartAuthorized: true;
170
+ authority: 'destination';
171
+ activeBinding: TActiveObjectStorageBinding;
172
+ activeBindingDigest: string;
173
+ }
174
+ export interface IStorageMigrationPreparingStatus extends IStorageMigrationLiveStatusBase {
175
+ phase: 'preparing';
176
+ candidateIssued: false;
177
+ candidateBinding?: never;
178
+ candidateDigest?: never;
179
+ consumerQuiesceEvidence?: never;
180
+ consumerActivationEvidence?: never;
181
+ commitPointCrossed: false;
182
+ destinationBindingStartAuthorized: false;
183
+ authority: 'source';
184
+ consumerAction: 'wait';
185
+ issue?: IStorageMigrationPreCutoverIssue;
186
+ }
187
+ export interface IStorageMigrationTransferringStatus extends IStorageMigrationLiveStatusBase {
188
+ phase: 'transferring';
189
+ candidateIssued: false;
190
+ candidateBinding?: never;
191
+ candidateDigest?: never;
192
+ consumerQuiesceEvidence?: never;
193
+ consumerActivationEvidence?: never;
194
+ commitPointCrossed: false;
195
+ destinationBindingStartAuthorized: false;
196
+ authority: 'source';
197
+ consumerAction: 'wait';
198
+ issue?: IStorageMigrationPreCutoverIssue;
199
+ }
200
+ export interface IStorageMigrationAwaitingConsumerQuiesceStatus extends IStorageMigrationCandidateStatusBase {
201
+ phase: 'awaitingConsumerQuiesce';
202
+ consumerQuiesceEvidence?: never;
203
+ consumerActivationEvidence?: never;
204
+ commitPointCrossed: false;
205
+ destinationBindingStartAuthorized: false;
206
+ authority: 'source';
207
+ consumerAction: 'stageCandidateAndStop';
208
+ issue?: IStorageMigrationPreCutoverIssue;
209
+ }
210
+ export interface IStorageMigrationFinalizingStatus extends IStorageMigrationQuiescedCandidateStatusBase {
211
+ phase: 'finalizing';
212
+ consumerActivationEvidence?: never;
213
+ commitPointCrossed: false;
214
+ destinationBindingStartAuthorized: false;
215
+ authority: 'source';
216
+ consumerAction: 'wait';
217
+ issue?: IStorageMigrationPreCutoverIssue;
218
+ }
219
+ export interface IStorageMigrationCommittingStatus extends IStorageMigrationQuiescedCandidateStatusBase {
220
+ phase: 'committing';
221
+ consumerActivationEvidence?: never;
222
+ commitPointCrossed: true;
223
+ destinationBindingStartAuthorized: false;
224
+ authority: 'transitioning';
225
+ consumerAction: 'wait';
226
+ issue?: IStorageMigrationPostCutoverIssue;
227
+ }
228
+ /**
229
+ * Destination authority is durable, but Corestore must continue returning
230
+ * `startDestination` until the exact activation acknowledgement is accepted.
231
+ */
232
+ export interface IStorageMigrationReadyToStartStatus extends IStorageMigrationDestinationAuthorizedStatusBase {
233
+ phase: 'readyToStart';
234
+ consumerActivationEvidence?: never;
235
+ commitPointCrossed: true;
236
+ consumerAction: 'startDestination';
237
+ issue?: IStorageMigrationPostCutoverIssue;
238
+ }
239
+ export interface IStorageMigrationCleanupPendingStatus extends IStorageMigrationDestinationAuthorizedStatusBase {
240
+ phase: 'cleanupPending';
241
+ consumerActivationEvidence: IStorageMigrationConsumerActivationEvidence;
242
+ commitPointCrossed: true;
243
+ consumerAction: 'none';
244
+ issue?: IStorageMigrationPostCutoverIssue;
245
+ }
246
+ export interface IStorageMigrationCompleteStatus extends IStorageMigrationTerminalStatusBase {
247
+ phase: 'complete';
248
+ candidateIssued: true;
249
+ candidateBinding: TStagedObjectStorageBinding;
250
+ candidateDigest: string;
251
+ consumerQuiesceEvidence: IStorageMigrationConsumerQuiesceEvidence;
252
+ consumerActivationEvidence: IStorageMigrationConsumerActivationEvidence;
253
+ commitPointCrossed: true;
254
+ destinationBindingStartAuthorized: true;
255
+ authority: 'destination';
256
+ consumerAction: 'none';
257
+ activeBinding: TActiveObjectStorageBinding;
258
+ activeBindingDigest: string;
259
+ }
260
+ interface IStorageMigrationAbortingStatusBase extends IStorageMigrationLiveStatusBase {
261
+ phase: 'aborting';
262
+ commitPointCrossed: false;
263
+ destinationBindingStartAuthorized: false;
264
+ authority: 'source';
265
+ consumerAction: 'wait';
266
+ consumerQuiesceEvidence?: IStorageMigrationConsumerQuiesceEvidence;
267
+ consumerActivationEvidence?: never;
268
+ issue?: IStorageMigrationPreCutoverIssue;
269
+ }
270
+ export interface IStorageMigrationAbortingWithoutCandidateStatus extends IStorageMigrationAbortingStatusBase {
271
+ candidateIssued: false;
272
+ candidateBinding?: never;
273
+ candidateDigest?: never;
274
+ consumerQuiesceEvidence?: never;
275
+ }
276
+ export interface IStorageMigrationAbortingWithCandidateStatus extends IStorageMigrationAbortingStatusBase {
277
+ candidateIssued: true;
278
+ candidateBinding?: never;
279
+ candidateDigest: string;
280
+ }
281
+ interface IStorageMigrationAbortedStatusBase extends IStorageMigrationTerminalStatusBase {
282
+ phase: 'aborted';
283
+ commitPointCrossed: false;
284
+ destinationBindingStartAuthorized: false;
285
+ authority: 'source';
286
+ consumerAction: 'startSource';
287
+ activeBinding: TActiveObjectStorageBinding;
288
+ activeBindingDigest: string;
289
+ consumerQuiesceEvidence?: IStorageMigrationConsumerQuiesceEvidence;
290
+ consumerActivationEvidence?: never;
291
+ }
292
+ export interface IStorageMigrationAbortedWithoutCandidateStatus extends IStorageMigrationAbortedStatusBase {
293
+ candidateIssued: false;
294
+ candidateBinding?: never;
295
+ candidateDigest?: never;
296
+ consumerQuiesceEvidence?: never;
297
+ }
298
+ export interface IStorageMigrationAbortedWithCandidateStatus extends IStorageMigrationAbortedStatusBase {
299
+ candidateIssued: true;
300
+ candidateBinding?: never;
301
+ candidateDigest: string;
302
+ }
303
+ export type TObjectStorageMigrationStatus = IStorageMigrationPreparingStatus | IStorageMigrationTransferringStatus | IStorageMigrationAwaitingConsumerQuiesceStatus | IStorageMigrationFinalizingStatus | IStorageMigrationCommittingStatus | IStorageMigrationReadyToStartStatus | IStorageMigrationCleanupPendingStatus | IStorageMigrationCompleteStatus | IStorageMigrationAbortingWithoutCandidateStatus | IStorageMigrationAbortingWithCandidateStatus | IStorageMigrationAbortedWithoutCandidateStatus | IStorageMigrationAbortedWithCandidateStatus;
304
+ /**
305
+ * Enforce this against Content-Length and the running request byte count
306
+ * before buffering or decoding a storage-migration control body.
307
+ */
308
+ export declare const assertStorageMigrationControlIngressByteLength: (valueArg: unknown) => number;
309
+ export declare const normalizeStorageBindingMigrationOwner: (valueArg: unknown) => Readonly<IStorageBindingMigrationOwner>;
310
+ export declare const canonicalizeUnfencedObjectStorageBindingControlSnapshotPayload: (valueArg: unknown) => string;
311
+ export declare const canonicalizeFencedObjectStorageBindingControlSnapshotPayload: (valueArg: unknown) => string;
312
+ export declare const createUnfencedObjectStorageBindingControlSnapshotSha256: (valueArg: unknown) => Promise<string>;
313
+ export declare const createFencedObjectStorageBindingControlSnapshotSha256: (valueArg: unknown) => Promise<string>;
314
+ export declare const normalizeUnfencedObjectStorageBindingControlSnapshot: (valueArg: unknown) => Promise<Readonly<IUnfencedObjectStorageBindingControlSnapshot>>;
315
+ export declare const normalizeFencedObjectStorageBindingControlSnapshot: (valueArg: unknown) => Promise<Readonly<IFencedObjectStorageBindingControlSnapshot>>;
316
+ export declare const normalizeObjectStorageMigrationTarget: (valueArg: unknown) => Readonly<IObjectStorageMigrationTarget>;
317
+ export declare const normalizeStagedObjectStorageBinding: (valueArg: unknown) => Readonly<TStagedObjectStorageBinding>;
318
+ export declare const normalizeActiveObjectStorageBinding: (valueArg: unknown) => Readonly<TActiveObjectStorageBinding>;
319
+ export declare const canonicalizeObjectStorageMigrationTargetRequest: (valueArg: unknown) => string;
320
+ export declare const createObjectStorageMigrationTargetRequestSha256: (valueArg: unknown) => Promise<string>;
321
+ export declare const canonicalizeObjectStorageMigrationBinding: (valueArg: unknown) => string;
322
+ export declare const createObjectStorageMigrationBindingSha256: (valueArg: unknown) => Promise<string>;
323
+ export declare const normalizeObjectStorageMigrationPrepareRequest: (valueArg: unknown) => Promise<Readonly<IObjectStorageMigrationPrepareRequest>>;
324
+ export declare const canonicalizeObjectStorageMigrationPrepareRequest: (valueArg: unknown) => Promise<string>;
325
+ export declare const createObjectStorageMigrationSha256: (valueArg: unknown) => Promise<string>;
326
+ export declare const normalizeStorageMigrationMutationFence: (valueArg: unknown) => Readonly<IStorageMigrationMutationFence>;
327
+ export declare const createObjectStorageMigrationPersistedStagingSha256: (valueArg: unknown) => Promise<string>;
328
+ export declare const normalizeObjectStorageMigrationConsumerQuiesceRequest: (valueArg: unknown) => Promise<Readonly<IObjectStorageMigrationConsumerQuiesceRequest>>;
329
+ export declare const createObjectStorageMigrationPersistedActivationSha256: (valueArg: unknown) => Promise<string>;
330
+ export declare const normalizeObjectStorageMigrationConsumerActivationRequest: (valueArg: unknown) => Promise<Readonly<IObjectStorageMigrationConsumerActivationRequest>>;
331
+ export declare const normalizeStorageMigrationConsumerQuiesceEvidence: (valueArg: unknown) => Promise<Readonly<IStorageMigrationConsumerQuiesceEvidence>>;
332
+ export declare const normalizeStorageMigrationConsumerActivationEvidence: (valueArg: unknown) => Promise<Readonly<IStorageMigrationConsumerActivationEvidence>>;
333
+ export declare const normalizeObjectStorageMigrationAbortRequest: (valueArg: unknown) => Readonly<IObjectStorageMigrationAbortRequest>;
334
+ export declare const normalizeObjectStorageMigrationResumeRequest: (valueArg: unknown) => Readonly<IObjectStorageMigrationResumeRequest>;
335
+ export declare const normalizeObjectStorageMigrationCleanupRequest: (valueArg: unknown) => Readonly<IObjectStorageMigrationCleanupRequest>;
336
+ export declare const normalizeStorageMigrationSourceEvidence: (valueArg: unknown) => Promise<Readonly<IStorageMigrationSourceEvidence>>;
337
+ export declare const normalizeObjectStorageMigrationStatus: (valueArg: unknown) => Promise<Readonly<TObjectStorageMigrationStatus>>;
338
+ export declare const bindObjectStorageMigrationConsumerQuiesceRequest: (requestArg: unknown, statusArg: unknown) => Promise<Readonly<IObjectStorageMigrationConsumerQuiesceRequest>>;
339
+ export declare const bindObjectStorageMigrationConsumerActivationRequest: (requestArg: unknown, statusArg: unknown) => Promise<Readonly<IObjectStorageMigrationConsumerActivationRequest>>;
340
+ export declare const bindObjectStorageMigrationAbortRequest: (requestArg: unknown, statusArg: unknown) => Promise<Readonly<IObjectStorageMigrationAbortRequest>>;
341
+ export declare const bindObjectStorageMigrationResumeRequest: (requestArg: unknown, statusArg: unknown) => Promise<Readonly<IObjectStorageMigrationResumeRequest>>;
342
+ export declare const bindObjectStorageMigrationCleanupRequest: (requestArg: unknown, statusArg: unknown) => Promise<Readonly<IObjectStorageMigrationCleanupRequest>>;
343
+ export declare const normalizeStorageMigrationProgress: (valueArg: unknown) => Readonly<IStorageMigrationProgress>;
344
+ export declare const normalizeStorageMigrationPreCutoverIssue: (valueArg: unknown) => Readonly<IStorageMigrationPreCutoverIssue>;
345
+ export declare const normalizeStorageMigrationPostCutoverIssue: (valueArg: unknown) => Readonly<IStorageMigrationPostCutoverIssue>;
346
+ export { storageMigrationCanonicalDigestGoldenVectors, type IStorageMigrationCanonicalDigestGoldenVector, } from './storagemigration.golden.js';
@@ -0,0 +1,49 @@
1
+ import type { IObjectStorageMigrationPrepareRequest, TStagedObjectStorageBinding, TUnfencedObjectStorageBindingControlSnapshotDigestPayload } from './storagemigration.js';
2
+ export interface IStorageMigrationCanonicalDigestGoldenVector<TInput> {
3
+ input: TInput;
4
+ canonicalJson: string;
5
+ sha256: string;
6
+ }
7
+ export declare const storageMigrationCanonicalDigestGoldenVectors: {
8
+ version: 1;
9
+ targetRequest: {
10
+ input: {
11
+ readonly id: "object-data";
12
+ readonly kind: "objectStorage";
13
+ readonly storageClass: "backupCapacity";
14
+ readonly capacity: {
15
+ readonly request: "500GiB";
16
+ readonly limit: "1TiB";
17
+ };
18
+ readonly reclaimPolicy: "retain";
19
+ readonly accessMode: "readWrite";
20
+ readonly delivery: {
21
+ readonly type: "environment";
22
+ readonly keys: {
23
+ readonly endpoint: "APP_S3_ENDPOINT";
24
+ readonly bucket: "APP_S3_BUCKET";
25
+ readonly region: "APP_S3_REGION";
26
+ readonly accessKeyId: "APP_S3_ACCESS_KEY";
27
+ readonly secretAccessKey: "APP_S3_SECRET_KEY";
28
+ };
29
+ };
30
+ };
31
+ canonicalJson: string;
32
+ sha256: string;
33
+ };
34
+ preparationSnapshot: {
35
+ input: TUnfencedObjectStorageBindingControlSnapshotDigestPayload;
36
+ canonicalJson: string;
37
+ sha256: string;
38
+ };
39
+ prepareRequest: {
40
+ input: IObjectStorageMigrationPrepareRequest;
41
+ canonicalJson: string;
42
+ sha256: string;
43
+ };
44
+ candidateBinding: {
45
+ input: TStagedObjectStorageBinding;
46
+ canonicalJson: string;
47
+ sha256: string;
48
+ };
49
+ };
@@ -0,0 +1,207 @@
1
+ import { deepFreezeValue } from '../private/canonicaljson.js';
2
+ const capabilities = {
3
+ performanceTier: 'capacity',
4
+ durability: 'persistent',
5
+ topology: 'singleNode',
6
+ hardQuota: true,
7
+ snapshots: 'none',
8
+ backup: true,
9
+ encryptedInTransit: true,
10
+ };
11
+ const delivery = {
12
+ type: 'environment',
13
+ keys: {
14
+ endpoint: 'APP_S3_ENDPOINT',
15
+ bucket: 'APP_S3_BUCKET',
16
+ region: 'APP_S3_REGION',
17
+ accessKeyId: 'APP_S3_ACCESS_KEY',
18
+ secretAccessKey: 'APP_S3_SECRET_KEY',
19
+ },
20
+ };
21
+ const credentials = {
22
+ secretBundleId: 'service-storage',
23
+ accessKeyIdKey: 'object.accessKeyId',
24
+ secretAccessKeyKey: 'object.secretAccessKey',
25
+ };
26
+ const sourceBinding = {
27
+ schemaVersion: 1,
28
+ id: 'binding-object',
29
+ serviceId: 'service-app',
30
+ requestId: 'object-data',
31
+ requestDigest: '1111111111111111111111111111111111111111111111111111111111111111',
32
+ kind: 'objectStorage',
33
+ generation: 3,
34
+ observedGeneration: 3,
35
+ status: 'ready',
36
+ policy: {
37
+ classId: 'source-object',
38
+ revision: '1',
39
+ },
40
+ capabilities,
41
+ resourceRef: 'source-resource',
42
+ accessMode: 'readWrite',
43
+ connection: {
44
+ endpoint: 'https://source.example.test',
45
+ bucket: 'source-bucket',
46
+ region: 'local',
47
+ },
48
+ credentials,
49
+ delivery,
50
+ versioning: false,
51
+ createdAt: 1_700_000_000_000,
52
+ updatedAt: 1_700_000_000_001,
53
+ };
54
+ const target = {
55
+ policy: {
56
+ classId: 'capacity-object',
57
+ revision: '4',
58
+ },
59
+ storageClass: {
60
+ kind: 'objectStorage',
61
+ purpose: 'backup',
62
+ required: {
63
+ performanceTier: 'capacity',
64
+ durability: 'persistent',
65
+ backup: true,
66
+ },
67
+ },
68
+ request: {
69
+ id: 'object-data',
70
+ kind: 'objectStorage',
71
+ storageClass: 'backupCapacity',
72
+ capacity: {
73
+ request: '500GiB',
74
+ limit: '1TiB',
75
+ },
76
+ reclaimPolicy: 'retain',
77
+ accessMode: 'readWrite',
78
+ delivery,
79
+ },
80
+ credentials,
81
+ };
82
+ const preparationSnapshotPayload = {
83
+ schemaVersion: 1,
84
+ binding: sourceBinding,
85
+ recordRevision: 12,
86
+ capturedAt: 1_700_000_000_010,
87
+ };
88
+ const preparationSnapshot = {
89
+ ...preparationSnapshotPayload,
90
+ snapshotDigest: '35870a0c3ca7f2ee70d0ae7f83109bec23a8ce59bf8efef1c94221a496210439',
91
+ };
92
+ const prepareRequest = {
93
+ schemaVersion: 1,
94
+ migrationId: 'migration-object-capacity',
95
+ sourceControlSnapshot: preparationSnapshot,
96
+ workloadGeneration: 8,
97
+ target,
98
+ };
99
+ const candidateBinding = {
100
+ ...sourceBinding,
101
+ requestDigest: '2096dfa1f6db50d670cbb4d6436f38c2eec383435c99346e31d0d1a9e0b1beba',
102
+ generation: 4,
103
+ observedGeneration: 3,
104
+ status: 'provisioning',
105
+ policy: target.policy,
106
+ resourceRef: 'destination-resource',
107
+ capacity: {
108
+ requested: '500GiB',
109
+ granted: '500GiB',
110
+ limit: '1TiB',
111
+ },
112
+ connection: {
113
+ endpoint: 'https://destination.example.test',
114
+ bucket: 'destination-bucket',
115
+ region: 'local',
116
+ },
117
+ updatedAt: 1_700_000_000_020,
118
+ };
119
+ export const storageMigrationCanonicalDigestGoldenVectors = deepFreezeValue({
120
+ version: 1,
121
+ targetRequest: {
122
+ input: target.request,
123
+ canonicalJson: '{"accessMode":"readWrite","capacity":{"limit":"1TiB","request":"500GiB"},' +
124
+ '"delivery":{"keys":{"accessKeyId":"APP_S3_ACCESS_KEY","bucket":"APP_S3_BUCKET",' +
125
+ '"endpoint":"APP_S3_ENDPOINT","region":"APP_S3_REGION",' +
126
+ '"secretAccessKey":"APP_S3_SECRET_KEY"},"type":"environment"},' +
127
+ '"id":"object-data","kind":"objectStorage","reclaimPolicy":"retain",' +
128
+ '"storageClass":"backupCapacity"}',
129
+ sha256: '2096dfa1f6db50d670cbb4d6436f38c2eec383435c99346e31d0d1a9e0b1beba',
130
+ },
131
+ preparationSnapshot: {
132
+ input: preparationSnapshotPayload,
133
+ canonicalJson: '{"binding":{"accessMode":"readWrite","capabilities":{"backup":true,' +
134
+ '"durability":"persistent","encryptedInTransit":true,"hardQuota":true,' +
135
+ '"performanceTier":"capacity","snapshots":"none","topology":"singleNode"},' +
136
+ '"connection":{"bucket":"source-bucket","endpoint":"https://source.example.test",' +
137
+ '"region":"local"},"createdAt":1700000000000,"credentials":' +
138
+ '{"accessKeyIdKey":"object.accessKeyId","secretAccessKeyKey":"object.secretAccessKey",' +
139
+ '"secretBundleId":"service-storage"},"delivery":{"keys":' +
140
+ '{"accessKeyId":"APP_S3_ACCESS_KEY","bucket":"APP_S3_BUCKET",' +
141
+ '"endpoint":"APP_S3_ENDPOINT","region":"APP_S3_REGION",' +
142
+ '"secretAccessKey":"APP_S3_SECRET_KEY"},"type":"environment"},' +
143
+ '"generation":3,"id":"binding-object","kind":"objectStorage",' +
144
+ '"observedGeneration":3,"policy":{"classId":"source-object","revision":"1"},' +
145
+ '"requestDigest":"1111111111111111111111111111111111111111111111111111111111111111",' +
146
+ '"requestId":"object-data","resourceRef":"source-resource","schemaVersion":1,' +
147
+ '"serviceId":"service-app","status":"ready","updatedAt":1700000000001,' +
148
+ '"versioning":false},"capturedAt":1700000000010,"recordRevision":12,"schemaVersion":1}',
149
+ sha256: '35870a0c3ca7f2ee70d0ae7f83109bec23a8ce59bf8efef1c94221a496210439',
150
+ },
151
+ prepareRequest: {
152
+ input: prepareRequest,
153
+ canonicalJson: '{"migrationId":"migration-object-capacity","schemaVersion":1,' +
154
+ '"sourceControlSnapshot":{"binding":{"accessMode":"readWrite",' +
155
+ '"capabilities":{"backup":true,"durability":"persistent",' +
156
+ '"encryptedInTransit":true,"hardQuota":true,"performanceTier":"capacity",' +
157
+ '"snapshots":"none","topology":"singleNode"},"connection":' +
158
+ '{"bucket":"source-bucket","endpoint":"https://source.example.test","region":"local"},' +
159
+ '"createdAt":1700000000000,"credentials":{"accessKeyIdKey":"object.accessKeyId",' +
160
+ '"secretAccessKeyKey":"object.secretAccessKey","secretBundleId":"service-storage"},' +
161
+ '"delivery":{"keys":{"accessKeyId":"APP_S3_ACCESS_KEY","bucket":"APP_S3_BUCKET",' +
162
+ '"endpoint":"APP_S3_ENDPOINT","region":"APP_S3_REGION",' +
163
+ '"secretAccessKey":"APP_S3_SECRET_KEY"},"type":"environment"},' +
164
+ '"generation":3,"id":"binding-object","kind":"objectStorage",' +
165
+ '"observedGeneration":3,"policy":{"classId":"source-object","revision":"1"},' +
166
+ '"requestDigest":"1111111111111111111111111111111111111111111111111111111111111111",' +
167
+ '"requestId":"object-data","resourceRef":"source-resource","schemaVersion":1,' +
168
+ '"serviceId":"service-app","status":"ready","updatedAt":1700000000001,' +
169
+ '"versioning":false},"capturedAt":1700000000010,"recordRevision":12,' +
170
+ '"schemaVersion":1,"snapshotDigest":' +
171
+ '"35870a0c3ca7f2ee70d0ae7f83109bec23a8ce59bf8efef1c94221a496210439"},' +
172
+ '"target":{"credentials":{"accessKeyIdKey":"object.accessKeyId",' +
173
+ '"secretAccessKeyKey":"object.secretAccessKey","secretBundleId":"service-storage"},' +
174
+ '"policy":{"classId":"capacity-object","revision":"4"},"request":' +
175
+ '{"accessMode":"readWrite","capacity":{"limit":"1TiB","request":"500GiB"},' +
176
+ '"delivery":{"keys":{"accessKeyId":"APP_S3_ACCESS_KEY","bucket":"APP_S3_BUCKET",' +
177
+ '"endpoint":"APP_S3_ENDPOINT","region":"APP_S3_REGION",' +
178
+ '"secretAccessKey":"APP_S3_SECRET_KEY"},"type":"environment"},' +
179
+ '"id":"object-data","kind":"objectStorage","reclaimPolicy":"retain",' +
180
+ '"storageClass":"backupCapacity"},"storageClass":{"kind":"objectStorage",' +
181
+ '"purpose":"backup","required":{"backup":true,"durability":"persistent",' +
182
+ '"performanceTier":"capacity"}}},"workloadGeneration":8}',
183
+ sha256: 'ecbb40ec9bfa20b9f4372eb0d00eaf79c3e84dd3132c5bde7e65ba3fec55e595',
184
+ },
185
+ candidateBinding: {
186
+ input: candidateBinding,
187
+ canonicalJson: '{"accessMode":"readWrite","capabilities":{"backup":true,' +
188
+ '"durability":"persistent","encryptedInTransit":true,"hardQuota":true,' +
189
+ '"performanceTier":"capacity","snapshots":"none","topology":"singleNode"},' +
190
+ '"capacity":{"granted":"500GiB","limit":"1TiB","requested":"500GiB"},' +
191
+ '"connection":{"bucket":"destination-bucket",' +
192
+ '"endpoint":"https://destination.example.test","region":"local"},' +
193
+ '"createdAt":1700000000000,"credentials":{"accessKeyIdKey":"object.accessKeyId",' +
194
+ '"secretAccessKeyKey":"object.secretAccessKey","secretBundleId":"service-storage"},' +
195
+ '"delivery":{"keys":{"accessKeyId":"APP_S3_ACCESS_KEY","bucket":"APP_S3_BUCKET",' +
196
+ '"endpoint":"APP_S3_ENDPOINT","region":"APP_S3_REGION",' +
197
+ '"secretAccessKey":"APP_S3_SECRET_KEY"},"type":"environment"},' +
198
+ '"generation":4,"id":"binding-object","kind":"objectStorage",' +
199
+ '"observedGeneration":3,"policy":{"classId":"capacity-object","revision":"4"},' +
200
+ '"requestDigest":"2096dfa1f6db50d670cbb4d6436f38c2eec383435c99346e31d0d1a9e0b1beba",' +
201
+ '"requestId":"object-data","resourceRef":"destination-resource",' +
202
+ '"schemaVersion":1,"serviceId":"service-app","status":"provisioning",' +
203
+ '"updatedAt":1700000000020,"versioning":false}',
204
+ sha256: 'b49017f41cd86626ccb05ffa5fb591994a5e20fad9856182b1a1d4c964c6177c',
205
+ },
206
+ });
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZW1pZ3JhdGlvbi5nb2xkZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9wbGF0Zm9ybS9zdG9yYWdlbWlncmF0aW9uLmdvbGRlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFlOUQsTUFBTSxZQUFZLEdBQUc7SUFDbkIsZUFBZSxFQUFFLFVBQVU7SUFDM0IsVUFBVSxFQUFFLFlBQVk7SUFDeEIsUUFBUSxFQUFFLFlBQVk7SUFDdEIsU0FBUyxFQUFFLElBQUk7SUFDZixTQUFTLEVBQUUsTUFBTTtJQUNqQixNQUFNLEVBQUUsSUFBSTtJQUNaLGtCQUFrQixFQUFFLElBQUk7Q0FDaEIsQ0FBQztBQUVYLE1BQU0sUUFBUSxHQUFHO0lBQ2YsSUFBSSxFQUFFLGFBQWE7SUFDbkIsSUFBSSxFQUFFO1FBQ0osUUFBUSxFQUFFLGlCQUFpQjtRQUMzQixNQUFNLEVBQUUsZUFBZTtRQUN2QixNQUFNLEVBQUUsZUFBZTtRQUN2QixXQUFXLEVBQUUsbUJBQW1CO1FBQ2hDLGVBQWUsRUFBRSxtQkFBbUI7S0FDckM7Q0FDTyxDQUFDO0FBRVgsTUFBTSxXQUFXLEdBQUc7SUFDbEIsY0FBYyxFQUFFLGlCQUFpQjtJQUNqQyxjQUFjLEVBQUUsb0JBQW9CO0lBQ3BDLGtCQUFrQixFQUFFLHdCQUF3QjtDQUM3QyxDQUFDO0FBRUYsTUFBTSxhQUFhLEdBQWdDO0lBQ2pELGFBQWEsRUFBRSxDQUFDO0lBQ2hCLEVBQUUsRUFBRSxnQkFBZ0I7SUFDcEIsU0FBUyxFQUFFLGFBQWE7SUFDeEIsU0FBUyxFQUFFLGFBQWE7SUFDeEIsYUFBYSxFQUNYLGtFQUFrRTtJQUNwRSxJQUFJLEVBQUUsZUFBZTtJQUNyQixVQUFVLEVBQUUsQ0FBQztJQUNiLGtCQUFrQixFQUFFLENBQUM7SUFDckIsTUFBTSxFQUFFLE9BQU87SUFDZixNQUFNLEVBQUU7UUFDTixPQUFPLEVBQUUsZUFB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