45 lines
1.7 KiB
Swift
45 lines
1.7 KiB
Swift
//
|
|
// Copyright 2023 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
import Foundation
|
|
import SignalServiceKit
|
|
|
|
/**
|
|
* Manages the series of network requests and state changes required to provision
|
|
* a linked device.
|
|
*
|
|
* At time of writing, despite appearing superficially similar, this class does **not**
|
|
* mirror RegistrationCoordinator. This class does not deal at all with UI or steps
|
|
* that require user input; it simply completes the sequence of mutations and
|
|
* requests required behind the scenes for a device to be fully provisioned
|
|
* _after_ it received a provisioning proto message from the primary device.
|
|
*
|
|
* See ProvisioningController for the sequence of UI steps that lead up to
|
|
* this point.
|
|
*
|
|
* Eventually, it would be nice to mirror RegistrationCoordinator and have this
|
|
* class behave like a state machine that handles the preceding steps as well.
|
|
*/
|
|
protocol ProvisioningCoordinator {
|
|
|
|
func completeProvisioning(
|
|
provisionMessage: ProvisionMessage,
|
|
deviceName: String,
|
|
progressViewModel: LinkAndSyncProgressViewModel,
|
|
shouldRetry: @escaping (SecondaryLinkNSyncError) async -> Bool
|
|
) async -> CompleteProvisioningResult
|
|
}
|
|
|
|
enum CompleteProvisioningResult {
|
|
case success
|
|
/// This device was previously linked (or was previously a registered primary)
|
|
/// but the new linking was being done with a different account, which is disallowed.
|
|
case previouslyLinkedWithDifferentAccount
|
|
/// The server told us the app or OS is obsolete and needs updating.
|
|
case obsoleteLinkedDeviceError
|
|
/// The server told us the number of devices on the account has exceeded the limit.
|
|
case deviceLimitExceededError(DeviceLimitExceededError)
|
|
case genericError(Error)
|
|
}
|