import type { IAppStoreObjectStorageRequest, IAppStoreStorageClass } from '../appstore/types.js'; import type { IResolvedObjectStorageBinding, IResolvedStoragePolicyRef } from './storage.js'; export declare const storageMigrationContractLimits: Readonly<{ version: 2; maximumControlJsonBytes: number; maximumConfiguredStringBytes: 2048; maximumIssueMessageBytes: 4096; maximumAbortReasonBytes: 4096; maximumEnvironmentKeyBytes: 256; maximumSecretPathBytes: 2048; }>; export declare const storageMigrationCanonicalJsonRules: Readonly<{ version: 1; encoding: "utf-8"; objectKeyOrdering: "utf-16-code-unit-ascending"; arrayOrdering: "preserved-dense"; unicodeNormalization: "preserved"; numberEncoding: "safe-integer-json-no-negative-zero"; digest: "sha256-lowercase-hex"; }>; export declare class StorageMigrationContractError extends Error { constructor(reasonArg: string); } export type TStagedObjectStorageBinding = Omit & { status: 'provisioning'; }; export type TActiveObjectStorageBinding = Omit & { status: 'ready'; }; export interface IStorageBindingMigrationOwner { migrationId: string; migrationDigest: string; } export interface IUnfencedObjectStorageBindingControlSnapshot { schemaVersion: 2; binding: TActiveObjectStorageBinding; recordRevision: number; snapshotDigest: string; capturedAt: number; activeMigration?: never; } export interface IFencedObjectStorageBindingControlSnapshot { schemaVersion: 2; binding: TActiveObjectStorageBinding; recordRevision: number; snapshotDigest: string; capturedAt: number; activeMigration: IStorageBindingMigrationOwner; } export type TUnfencedObjectStorageBindingControlSnapshotDigestPayload = Omit; export type TFencedObjectStorageBindingControlSnapshotDigestPayload = Omit; export interface IObjectStorageMigrationTarget { policy: IResolvedStoragePolicyRef; storageClass: IAppStoreStorageClass & { kind: 'objectStorage'; }; request: IAppStoreObjectStorageRequest; credentialManagementScope: IResolvedObjectStorageBinding['credentialManagementScope']; } export interface IObjectStorageMigrationPrepareRequest { schemaVersion: 2; migrationId: string; sourceControlSnapshot: IUnfencedObjectStorageBindingControlSnapshot; workloadGeneration: number; target: IObjectStorageMigrationTarget; } export interface IStorageMigrationSourceEvidence { preparationSnapshot: IUnfencedObjectStorageBindingControlSnapshot; fencedSnapshot: IFencedObjectStorageBindingControlSnapshot; } export interface IStorageMigrationProgress { objectsCopied: number; logicalBytesCopied: number; physicalBytesCopied?: number; objectsTotal?: number; logicalBytesTotal?: number; physicalBytesTotal?: number; updatedAt: number; } export type TStorageMigrationPreCutoverRecoveryAction = 'retry' | 'abort'; export type TStorageMigrationPostCutoverRecoveryAction = 'retry' | 'rollForward'; export interface IStorageMigrationIssueBase { code: string; message: string; retryable: boolean; observedAt: number; } export interface IStorageMigrationPreCutoverIssue extends IStorageMigrationIssueBase { allowedRecoveryActions: TStorageMigrationPreCutoverRecoveryAction[]; } export interface IStorageMigrationPostCutoverIssue extends IStorageMigrationIssueBase { allowedRecoveryActions: TStorageMigrationPostCutoverRecoveryAction[]; } export interface IStorageMigrationMutationFence { schemaVersion: 2; migrationId: string; migrationDigest: string; expectedMigrationRevision: number; mutationId: string; } export interface IObjectStorageMigrationConsumerQuiesceRequest extends IStorageMigrationMutationFence { sourceRecordRevision: number; sourceControlSnapshotDigest: string; candidateDigest: string; workloadGeneration: number; persistedStagingDigest: string; persistedStagingRevision: number; consumerStoppedAt: number; } export type TObjectStorageMigrationPersistedStagingDigestPayload = Omit; export interface IStorageMigrationConsumerQuiesceEvidence { request: IObjectStorageMigrationConsumerQuiesceRequest; acceptedMigrationRevision: number; acceptedAt: number; } export interface IObjectStorageMigrationConsumerActivationRequest extends IStorageMigrationMutationFence { candidateDigest: string; activeBindingDigest: string; workloadGeneration: number; persistedActivationDigest: string; persistedActivationRevision: number; consumerStartedAt: number; } export type TObjectStorageMigrationPersistedActivationDigestPayload = Omit; export interface IStorageMigrationConsumerActivationEvidence { request: IObjectStorageMigrationConsumerActivationRequest; acceptedMigrationRevision: number; acceptedAt: number; } export interface IObjectStorageMigrationAbortRequest extends IStorageMigrationMutationFence { reason: string; } export interface IObjectStorageMigrationResumeRequest extends IStorageMigrationMutationFence { action: TStorageMigrationPreCutoverRecoveryAction | TStorageMigrationPostCutoverRecoveryAction; } export interface IObjectStorageMigrationCleanupRequest extends IStorageMigrationMutationFence { } export interface IStorageMigrationStatusBase { schemaVersion: 2; migrationId: string; migrationDigest: string; migrationRevision: number; bindingId: string; serviceId: string; requestId: string; workloadGeneration: number; target: IObjectStorageMigrationTarget; source: IStorageMigrationSourceEvidence; progress?: IStorageMigrationProgress; createdAt: number; updatedAt: number; } interface IStorageMigrationLiveStatusBase extends IStorageMigrationStatusBase { bindingFenceActive: true; } interface IStorageMigrationTerminalStatusBase extends IStorageMigrationStatusBase { bindingFenceActive: false; terminalAt: number; } interface IStorageMigrationCandidateStatusBase extends IStorageMigrationLiveStatusBase { candidateIssued: true; candidateBinding: TStagedObjectStorageBinding; candidateDigest: string; } interface IStorageMigrationQuiescedCandidateStatusBase extends IStorageMigrationCandidateStatusBase { consumerQuiesceEvidence: IStorageMigrationConsumerQuiesceEvidence; } interface IStorageMigrationDestinationAuthorizedStatusBase extends IStorageMigrationQuiescedCandidateStatusBase { destinationBindingStartAuthorized: true; authority: 'destination'; activeBinding: TActiveObjectStorageBinding; activeBindingDigest: string; } export interface IStorageMigrationPreparingStatus extends IStorageMigrationLiveStatusBase { phase: 'preparing'; candidateIssued: false; candidateBinding?: never; candidateDigest?: never; consumerQuiesceEvidence?: never; consumerActivationEvidence?: never; commitPointCrossed: false; destinationBindingStartAuthorized: false; authority: 'source'; consumerAction: 'wait'; issue?: IStorageMigrationPreCutoverIssue; } export interface IStorageMigrationTransferringStatus extends IStorageMigrationLiveStatusBase { phase: 'transferring'; candidateIssued: false; candidateBinding?: never; candidateDigest?: never; consumerQuiesceEvidence?: never; consumerActivationEvidence?: never; commitPointCrossed: false; destinationBindingStartAuthorized: false; authority: 'source'; consumerAction: 'wait'; issue?: IStorageMigrationPreCutoverIssue; } export interface IStorageMigrationAwaitingConsumerQuiesceStatus extends IStorageMigrationCandidateStatusBase { phase: 'awaitingConsumerQuiesce'; consumerQuiesceEvidence?: never; consumerActivationEvidence?: never; commitPointCrossed: false; destinationBindingStartAuthorized: false; authority: 'source'; consumerAction: 'stageCandidateAndStop'; issue?: IStorageMigrationPreCutoverIssue; } export interface IStorageMigrationFinalizingStatus extends IStorageMigrationQuiescedCandidateStatusBase { phase: 'finalizing'; consumerActivationEvidence?: never; commitPointCrossed: false; destinationBindingStartAuthorized: false; authority: 'source'; consumerAction: 'wait'; issue?: IStorageMigrationPreCutoverIssue; } export interface IStorageMigrationCommittingStatus extends IStorageMigrationQuiescedCandidateStatusBase { phase: 'committing'; consumerActivationEvidence?: never; commitPointCrossed: true; destinationBindingStartAuthorized: false; authority: 'transitioning'; consumerAction: 'wait'; issue?: IStorageMigrationPostCutoverIssue; } /** * Destination authority is durable, but Corestore must continue returning * `startDestination` until the exact activation acknowledgement is accepted. */ export interface IStorageMigrationReadyToStartStatus extends IStorageMigrationDestinationAuthorizedStatusBase { phase: 'readyToStart'; consumerActivationEvidence?: never; commitPointCrossed: true; consumerAction: 'startDestination'; issue?: IStorageMigrationPostCutoverIssue; } export interface IStorageMigrationCleanupPendingStatus extends IStorageMigrationDestinationAuthorizedStatusBase { phase: 'cleanupPending'; consumerActivationEvidence: IStorageMigrationConsumerActivationEvidence; commitPointCrossed: true; consumerAction: 'none'; issue?: IStorageMigrationPostCutoverIssue; } export interface IStorageMigrationCompleteStatus extends IStorageMigrationTerminalStatusBase { phase: 'complete'; candidateIssued: true; candidateBinding: TStagedObjectStorageBinding; candidateDigest: string; consumerQuiesceEvidence: IStorageMigrationConsumerQuiesceEvidence; consumerActivationEvidence: IStorageMigrationConsumerActivationEvidence; commitPointCrossed: true; destinationBindingStartAuthorized: true; authority: 'destination'; consumerAction: 'none'; activeBinding: TActiveObjectStorageBinding; activeBindingDigest: string; } interface IStorageMigrationAbortingStatusBase extends IStorageMigrationLiveStatusBase { phase: 'aborting'; commitPointCrossed: false; destinationBindingStartAuthorized: false; authority: 'source'; consumerAction: 'wait'; consumerQuiesceEvidence?: IStorageMigrationConsumerQuiesceEvidence; consumerActivationEvidence?: never; issue?: IStorageMigrationPreCutoverIssue; } export interface IStorageMigrationAbortingWithoutCandidateStatus extends IStorageMigrationAbortingStatusBase { candidateIssued: false; candidateBinding?: never; candidateDigest?: never; consumerQuiesceEvidence?: never; } export interface IStorageMigrationAbortingWithCandidateStatus extends IStorageMigrationAbortingStatusBase { candidateIssued: true; candidateBinding?: never; candidateDigest: string; } interface IStorageMigrationAbortedStatusBase extends IStorageMigrationTerminalStatusBase { phase: 'aborted'; commitPointCrossed: false; destinationBindingStartAuthorized: false; authority: 'source'; consumerAction: 'startSource'; activeBinding: TActiveObjectStorageBinding; activeBindingDigest: string; consumerQuiesceEvidence?: IStorageMigrationConsumerQuiesceEvidence; consumerActivationEvidence?: never; } export interface IStorageMigrationAbortedWithoutCandidateStatus extends IStorageMigrationAbortedStatusBase { candidateIssued: false; candidateBinding?: never; candidateDigest?: never; consumerQuiesceEvidence?: never; } export interface IStorageMigrationAbortedWithCandidateStatus extends IStorageMigrationAbortedStatusBase { candidateIssued: true; candidateBinding?: never; candidateDigest: string; } export type TObjectStorageMigrationStatus = IStorageMigrationPreparingStatus | IStorageMigrationTransferringStatus | IStorageMigrationAwaitingConsumerQuiesceStatus | IStorageMigrationFinalizingStatus | IStorageMigrationCommittingStatus | IStorageMigrationReadyToStartStatus | IStorageMigrationCleanupPendingStatus | IStorageMigrationCompleteStatus | IStorageMigrationAbortingWithoutCandidateStatus | IStorageMigrationAbortingWithCandidateStatus | IStorageMigrationAbortedWithoutCandidateStatus | IStorageMigrationAbortedWithCandidateStatus; /** * Enforce this against Content-Length and the running request byte count * before buffering or decoding a storage-migration control body. */ export declare const assertStorageMigrationControlIngressByteLength: (valueArg: unknown) => number; export declare const normalizeStorageBindingMigrationOwner: (valueArg: unknown) => Readonly; export declare const canonicalizeUnfencedObjectStorageBindingControlSnapshotPayload: (valueArg: unknown) => string; export declare const canonicalizeFencedObjectStorageBindingControlSnapshotPayload: (valueArg: unknown) => string; export declare const createUnfencedObjectStorageBindingControlSnapshotSha256: (valueArg: unknown) => Promise; export declare const createFencedObjectStorageBindingControlSnapshotSha256: (valueArg: unknown) => Promise; export declare const normalizeUnfencedObjectStorageBindingControlSnapshot: (valueArg: unknown) => Promise>; export declare const normalizeFencedObjectStorageBindingControlSnapshot: (valueArg: unknown) => Promise>; export declare const normalizeObjectStorageMigrationTarget: (valueArg: unknown) => Readonly; export declare const normalizeStagedObjectStorageBinding: (valueArg: unknown) => Readonly; export declare const normalizeActiveObjectStorageBinding: (valueArg: unknown) => Readonly; export declare const canonicalizeObjectStorageMigrationTargetRequest: (valueArg: unknown) => string; export declare const createObjectStorageMigrationTargetRequestSha256: (valueArg: unknown) => Promise; export declare const canonicalizeObjectStorageMigrationBinding: (valueArg: unknown) => string; export declare const createObjectStorageMigrationBindingSha256: (valueArg: unknown) => Promise; export declare const normalizeObjectStorageMigrationPrepareRequest: (valueArg: unknown) => Promise>; export declare const canonicalizeObjectStorageMigrationPrepareRequest: (valueArg: unknown) => Promise; export declare const createObjectStorageMigrationSha256: (valueArg: unknown) => Promise; export declare const normalizeStorageMigrationMutationFence: (valueArg: unknown) => Readonly; export declare const createObjectStorageMigrationPersistedStagingSha256: (valueArg: unknown) => Promise; export declare const normalizeObjectStorageMigrationConsumerQuiesceRequest: (valueArg: unknown) => Promise>; export declare const createObjectStorageMigrationPersistedActivationSha256: (valueArg: unknown) => Promise; export declare const normalizeObjectStorageMigrationConsumerActivationRequest: (valueArg: unknown) => Promise>; export declare const normalizeStorageMigrationConsumerQuiesceEvidence: (valueArg: unknown) => Promise>; export declare const normalizeStorageMigrationConsumerActivationEvidence: (valueArg: unknown) => Promise>; export declare const normalizeObjectStorageMigrationAbortRequest: (valueArg: unknown) => Readonly; export declare const normalizeObjectStorageMigrationResumeRequest: (valueArg: unknown) => Readonly; export declare const normalizeObjectStorageMigrationCleanupRequest: (valueArg: unknown) => Readonly; export declare const normalizeStorageMigrationSourceEvidence: (valueArg: unknown) => Promise>; export declare const normalizeObjectStorageMigrationStatus: (valueArg: unknown) => Promise>; export declare const bindObjectStorageMigrationConsumerQuiesceRequest: (requestArg: unknown, statusArg: unknown) => Promise>; export declare const bindObjectStorageMigrationConsumerActivationRequest: (requestArg: unknown, statusArg: unknown) => Promise>; export declare const bindObjectStorageMigrationAbortRequest: (requestArg: unknown, statusArg: unknown) => Promise>; export declare const bindObjectStorageMigrationResumeRequest: (requestArg: unknown, statusArg: unknown) => Promise>; export declare const bindObjectStorageMigrationCleanupRequest: (requestArg: unknown, statusArg: unknown) => Promise>; export declare const normalizeStorageMigrationProgress: (valueArg: unknown) => Readonly; export declare const normalizeStorageMigrationPreCutoverIssue: (valueArg: unknown) => Readonly; export declare const normalizeStorageMigrationPostCutoverIssue: (valueArg: unknown) => Readonly; export { storageMigrationCanonicalDigestGoldenVectors, type IStorageMigrationCanonicalDigestGoldenVector, } from './storagemigration.golden.js';