diff --git a/Signal/Registration/RegistrationCoodinatorShims.swift b/Signal/Registration/RegistrationCoodinatorShims.swift index 7a2d664c18..626debfe4d 100644 --- a/Signal/Registration/RegistrationCoodinatorShims.swift +++ b/Signal/Registration/RegistrationCoodinatorShims.swift @@ -20,7 +20,6 @@ extension RegistrationCoordinatorImpl { public typealias MessagePipelineSupervisor = _RegistrationCoordinator_MessagePipelineSupervisorShim public typealias MessageProcessor = _RegistrationCoordinator_MessageProcessorShim public typealias OWS2FAManager = _RegistrationCoordinator_OWS2FAManagerShim - public typealias PreKeyManager = _RegistrationCoordinator_PreKeyManagerShim public typealias ProfileManager = _RegistrationCoordinator_ProfileManagerShim public typealias PushRegistrationManager = _RegistrationCoordinator_PushRegistrationManagerShim typealias QuickRestoreManager = _RegistrationCoordinator_QuickRestoreManagerShim @@ -40,7 +39,6 @@ extension RegistrationCoordinatorImpl { public typealias MessagePipelineSupervisor = _RegistrationCoordinator_MessagePipelineSupervisorWrapper public typealias MessageProcessor = _RegistrationCoordinator_MessageProcessorWrapper public typealias OWS2FAManager = _RegistrationCoordinator_OWS2FAManagerWrapper - public typealias PreKeyManager = _RegistrationCoordinator_PreKeyManagerWrapper public typealias ProfileManager = _RegistrationCoordinator_ProfileManagerWrapper public typealias PushRegistrationManager = _RegistrationCoordinator_PushRegistrationManagerWrapper typealias QuickRestoreManager = _RegistrationCoordinator_QuickRestoreManagerWrapper @@ -282,54 +280,6 @@ public class _RegistrationCoordinator_OWS2FAManagerWrapper: _RegistrationCoordin } } -// MARK: - PreKeyManager - -// TODO: Remove this layer of abstraction; it's no longer necessary. -public protocol _RegistrationCoordinator_PreKeyManagerShim { - - func createPreKeysForRegistration() async throws -> RegistrationPreKeyUploadBundles - - func finalizeRegistrationPreKeys( - _ prekeyBundles: RegistrationPreKeyUploadBundles, - uploadDidSucceed: Bool - ) async throws - - func rotateOneTimePreKeysForRegistration(auth: ChatServiceAuth) async throws - - func setIsChangingNumber(_ isChangingNumber: Bool) -} - -public class _RegistrationCoordinator_PreKeyManagerWrapper: _RegistrationCoordinator_PreKeyManagerShim { - - private let preKeyManager: PreKeyManager - - public init(_ preKeyManager: PreKeyManager) { - self.preKeyManager = preKeyManager - } - - public func createPreKeysForRegistration() async throws -> RegistrationPreKeyUploadBundles { - return try await preKeyManager.createPreKeysForRegistration().value - } - - public func finalizeRegistrationPreKeys( - _ prekeyBundles: RegistrationPreKeyUploadBundles, - uploadDidSucceed: Bool - ) async throws { - return try await preKeyManager.finalizeRegistrationPreKeys( - prekeyBundles, - uploadDidSucceed: uploadDidSucceed - ).value - } - - public func rotateOneTimePreKeysForRegistration(auth: ChatServiceAuth) async throws { - return try await preKeyManager.rotateOneTimePreKeysForRegistration(auth: auth).value - } - - public func setIsChangingNumber(_ isChangingNumber: Bool) { - preKeyManager.setIsChangingNumber(isChangingNumber) - } -} - // MARK: - ProfileManager public protocol _RegistrationCoordinator_ProfileManagerShim { diff --git a/Signal/Registration/RegistrationCoordinatorDependencies.swift b/Signal/Registration/RegistrationCoordinatorDependencies.swift index e996fd475e..7a01eba5c6 100644 --- a/Signal/Registration/RegistrationCoordinatorDependencies.swift +++ b/Signal/Registration/RegistrationCoordinatorDependencies.swift @@ -27,7 +27,7 @@ public struct RegistrationCoordinatorDependencies { let networkManager: any NetworkManagerProtocol public let ows2FAManager: RegistrationCoordinatorImpl.Shims.OWS2FAManager public let phoneNumberDiscoverabilityManager: PhoneNumberDiscoverabilityManager - public let preKeyManager: RegistrationCoordinatorImpl.Shims.PreKeyManager + public let preKeyManager: any PreKeyManager public let profileManager: RegistrationCoordinatorImpl.Shims.ProfileManager public let pushRegistrationManager: RegistrationCoordinatorImpl.Shims.PushRegistrationManager let quickRestoreManager: RegistrationCoordinatorImpl.Shims.QuickRestoreManager @@ -67,9 +67,7 @@ public struct RegistrationCoordinatorDependencies { networkManager: SSKEnvironment.shared.networkManagerRef, ows2FAManager: RegistrationCoordinatorImpl.Wrappers.OWS2FAManager(SSKEnvironment.shared.ows2FAManagerRef), phoneNumberDiscoverabilityManager: DependenciesBridge.shared.phoneNumberDiscoverabilityManager, - preKeyManager: RegistrationCoordinatorImpl.Wrappers.PreKeyManager( - DependenciesBridge.shared.preKeyManager - ), + preKeyManager: DependenciesBridge.shared.preKeyManager, profileManager: RegistrationCoordinatorImpl.Wrappers.ProfileManager(SSKEnvironment.shared.profileManagerRef), pushRegistrationManager: RegistrationCoordinatorImpl.Wrappers.PushRegistrationManager(AppEnvironment.shared.pushRegistrationManagerRef), quickRestoreManager: RegistrationCoordinatorImpl.Wrappers.QuickRestoreManager(AppEnvironment.shared.quickRestoreManager), diff --git a/Signal/Registration/RegistrationCoordinatorImpl.swift b/Signal/Registration/RegistrationCoordinatorImpl.swift index 2b4621138a..7b42273d2b 100644 --- a/Signal/Registration/RegistrationCoordinatorImpl.swift +++ b/Signal/Registration/RegistrationCoordinatorImpl.swift @@ -3293,7 +3293,7 @@ public class RegistrationCoordinatorImpl: RegistrationCoordinator { // But we should still upload one-time prekeys, as that is not part // of account creation. do { - try await deps.preKeyManager.rotateOneTimePreKeysForRegistration(auth: accountIdentity.chatServiceAuth) + try await deps.preKeyManager.rotateOneTimePreKeysForRegistration(auth: accountIdentity.chatServiceAuth).value self.db.write { tx in self.updatePersistedState(tx) { // No harm marking both down as done even though @@ -4262,7 +4262,7 @@ public class RegistrationCoordinatorImpl: RegistrationCoordinator { let prekeyBundles: RegistrationPreKeyUploadBundles do { - prekeyBundles = try await deps.preKeyManager.createPreKeysForRegistration() + prekeyBundles = try await deps.preKeyManager.createPreKeysForRegistration().value } catch { return .showErrorSheet(.genericError) } @@ -4293,7 +4293,7 @@ public class RegistrationCoordinatorImpl: RegistrationCoordinator { try await deps.preKeyManager.finalizeRegistrationPreKeys( prekeyBundles, uploadDidSucceed: isPrekeyUploadSuccess - ) + ).value } catch { // Finalizing is best effort. Logger.error("Unable to finalize prekeys, ignoring and continuing") diff --git a/Signal/test/Registration/RegistrationCoordinatorTest.swift b/Signal/test/Registration/RegistrationCoordinatorTest.swift index 99e4c387da..77893563f7 100644 --- a/Signal/test/Registration/RegistrationCoordinatorTest.swift +++ b/Signal/test/Registration/RegistrationCoordinatorTest.swift @@ -318,11 +318,11 @@ public class RegistrationCoordinatorTest { // It needs an apns token to register. pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) }) // It needs prekeys as well. - preKeyManagerMock.addCreatePreKeysMock({ return .value(Stubs.prekeyBundles()) }) + preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } }) // And will finalize prekeys after success. preKeyManagerMock.addFinalizePreKeyMock { didSucceed in #expect(didSucceed) - return .value(()) + return Task {} } let identityResponse = Stubs.accountIdentityResponse() @@ -362,7 +362,7 @@ public class RegistrationCoordinatorTest { // When registered, we should create pre-keys. preKeyManagerMock.addRotateOneTimePreKeyMock({ auth in #expect(auth == expectedAuthedAccount().chatServiceAuth) - return .value(()) + return Task {} }) if wasReglockEnabled { @@ -472,11 +472,11 @@ public class RegistrationCoordinatorTest { // It needs an apns token to register. pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) }) // Every time we register we also ask for prekeys. - preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) }) + preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } }) // And we finalize them after. preKeyManagerMock.addFinalizePreKeyMock { didSucceed in #expect(didSucceed) - return .value(()) + return Task {} } let identityResponse = Stubs.accountIdentityResponse() @@ -509,7 +509,7 @@ public class RegistrationCoordinatorTest { // When registered, we should create pre-keys. preKeyManagerMock.addRotateOneTimePreKeyMock({ auth in #expect(auth == expectedAuthedAccount().chatServiceAuth) - return .value(()) + return Task {} }) // We haven't done a SVR backup; that should happen now. @@ -613,18 +613,18 @@ public class RegistrationCoordinatorTest { pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) }) // Every time we register we also ask for prekeys. - preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) }) - preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) }) + preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } }) + preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } }) // And we finalize them after. // Set up a list of mocks that should be returned in order preKeyManagerMock.addFinalizePreKeyMock { didSucceed in #expect(didSucceed.negated) - return .value(()) + return Task {} } preKeyManagerMock.addFinalizePreKeyMock { didSucceed in #expect(didSucceed) - return .value(()) + return Task {} } // Fail the request; the reg recovery pw is invalid. @@ -718,17 +718,17 @@ public class RegistrationCoordinatorTest { pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) }) pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) }) - preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) }) - preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) }) - preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) }) + preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } }) + preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } }) + preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } }) preKeyManagerMock.addFinalizePreKeyMock { didSucceed in #expect(didSucceed.negated) - return .value(()) + return Task {} } preKeyManagerMock.addFinalizePreKeyMock { didSucceed in #expect(didSucceed.negated) - return .value(()) + return Task {} } // Fail the first request; the reglock is invalid. @@ -817,17 +817,17 @@ public class RegistrationCoordinatorTest { pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) }) // Every time we register we also ask for prekeys. - preKeyManagerMock.addCreatePreKeysMock({ return .value(Stubs.prekeyBundles()) }) - preKeyManagerMock.addCreatePreKeysMock({ return .value(Stubs.prekeyBundles()) }) + preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } }) + preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } }) // And we finalize them after. preKeyManagerMock.addFinalizePreKeyMock { didSucceed in #expect(didSucceed.negated) - return .value(()) + return Task {} } preKeyManagerMock.addFinalizePreKeyMock { didSucceed in #expect(didSucceed) - return .value(()) + return Task {} } // Fail the request with a network error. @@ -877,7 +877,7 @@ public class RegistrationCoordinatorTest { // When registered, it should try and sync pre-keys. preKeyManagerMock.addRotateOneTimePreKeyMock({ auth in #expect(auth == expectedAuthedAccount().chatServiceAuth) - return .value(()) + return Task {} }) // We haven't done a SVR backup; that should happen. @@ -1032,11 +1032,11 @@ public class RegistrationCoordinatorTest { pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) }) pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) }) - preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) }) - preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) }) + preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } }) + preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } }) - preKeyManagerMock.addFinalizePreKeyMock({ _ in .value(()) }) - preKeyManagerMock.addFinalizePreKeyMock({ _ in .value(()) }) + preKeyManagerMock.addFinalizePreKeyMock({ _ in Task {} }) + preKeyManagerMock.addFinalizePreKeyMock({ _ in Task {} }) // Fail the first request; let expectedRecoveryPwRequest = createAccountWithRecoveryPw(masterKey) @@ -1184,16 +1184,16 @@ public class RegistrationCoordinatorTest { pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) }) pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) }) - preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) }) - preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) }) + preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } }) + preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } }) preKeyManagerMock.addFinalizePreKeyMock { didSucceed in #expect(didSucceed.negated) - return .value(()) + return Task {} } preKeyManagerMock.addFinalizePreKeyMock { didSucceed in #expect(didSucceed) - return .value(()) + return Task {} } // Fail the first request; the reglock is invalid. @@ -1237,7 +1237,7 @@ public class RegistrationCoordinatorTest { // When registered, we should create pre-keys. preKeyManagerMock.addRotateOneTimePreKeyMock({ auth in #expect(auth == expectedAuthedAccount().chatServiceAuth) - return .value(()) + return Task {} }) // If we had reglock before registration, it should be re-enabled. @@ -1394,13 +1394,13 @@ public class RegistrationCoordinatorTest { pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) }) pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) }) - preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) }) - preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) }) - preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) }) + preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } }) + preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } }) + preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } }) - preKeyManagerMock.addFinalizePreKeyMock({ _ in .value(()) }) - preKeyManagerMock.addFinalizePreKeyMock({ _ in .value(()) }) - preKeyManagerMock.addFinalizePreKeyMock({ _ in .value(()) }) + preKeyManagerMock.addFinalizePreKeyMock({ _ in Task {} }) + preKeyManagerMock.addFinalizePreKeyMock({ _ in Task {} }) + preKeyManagerMock.addFinalizePreKeyMock({ _ in Task {} }) // Fail the first request; the local key is invalid. let expectedRecoveryPwRequest = createAccountWithRecoveryPw(masterKey) @@ -1523,12 +1523,12 @@ public class RegistrationCoordinatorTest { pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) }) // Every time we register we also ask for prekeys. - preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) }) + preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } }) // And we finalize them after. preKeyManagerMock.addFinalizePreKeyMock { didSucceed in #expect(didSucceed) - return .value(()) + return Task {} } // Now still at it should make a reg recovery pw request @@ -1560,7 +1560,7 @@ public class RegistrationCoordinatorTest { // When registered, it should try and create pre-keys. preKeyManagerMock.addRotateOneTimePreKeyMock({ auth in #expect(auth == expectedAuthedAccount().chatServiceAuth) - return .value(()) + return Task {} }) // Once we create pre-keys, we should back up to svr. @@ -1834,7 +1834,7 @@ public class RegistrationCoordinatorTest { pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) }) // It should also fetch the prekeys for account creation - preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles()) }) + preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } }) let expectedRequest = createAccountWithSession(newMasterKey) mockURLSession.addResponse( @@ -1861,14 +1861,14 @@ public class RegistrationCoordinatorTest { // Once we are registered, we should finalize prekeys. preKeyManagerMock.addFinalizePreKeyMock { didSucceed in #expect(didSucceed) - return .value(()) + return Task {} } // Then we should try and create one time pre-keys // with the credentials we got in the identity response. preKeyManagerMock.addRotateOneTimePreKeyMock({ auth in #expect(auth == expectedAuthedAccount().chatServiceAuth) - return .value(()) + return Task {} }) // Finish the validation. @@ -2863,9 +2863,7 @@ public class RegistrationCoordinatorTest { pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) }) // It should also fetch the prekeys for account creation - preKeyManagerMock.addCreatePreKeysMock({ - return .value(Stubs.prekeyBundles()) - }) + preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } }) let expectedRequest = createAccountWithSession(newMasterKey) mockURLSession.addResponse( @@ -2896,14 +2894,14 @@ public class RegistrationCoordinatorTest { // Once we are registered, we should finalize prekeys. preKeyManagerMock.addFinalizePreKeyMock { didSucceed in #expect(didSucceed) - return .value(()) + return Task {} } // Then we should try and create one time pre-keys // with the credentials we got in the identity response. preKeyManagerMock.addRotateOneTimePreKeyMock({ auth in #expect(auth == expectedAuthedAccount().chatServiceAuth) - return .value(()) + return Task {} }) // When we skip the pin, it should skip any SVR backups. @@ -3006,7 +3004,7 @@ public class RegistrationCoordinatorTest { pushRegistrationManagerMock.addRequestPushTokenMock({ .success(Stubs.apnsRegistrationId) }) // It should also fetch the prekeys for account creation - preKeyManagerMock.addCreatePreKeysMock({ .value(Stubs.prekeyBundles())}) + preKeyManagerMock.addCreatePreKeysMock({ Task { Stubs.prekeyBundles() } }) let expectedRequest = createAccountWithSession(newMasterKey) mockURLSession.addResponse( @@ -3033,14 +3031,14 @@ public class RegistrationCoordinatorTest { // Once we are registered, we should finalize prekeys. preKeyManagerMock.addFinalizePreKeyMock { didSucceed in #expect(didSucceed) - return .value(()) + return Task {} } // Then we should try and create one time pre-keys // with the credentials we got in the identity response. preKeyManagerMock.addRotateOneTimePreKeyMock({ auth in #expect(auth == expectedAuthedAccount().chatServiceAuth) - return .value(()) + return Task {} }) // When we skip the pin, it should skip any SVR backups. diff --git a/Signal/test/Registration/RegistrationCoordinatorTestShims.swift b/Signal/test/Registration/RegistrationCoordinatorTestShims.swift index f7849bab56..a25e153cd8 100644 --- a/Signal/test/Registration/RegistrationCoordinatorTestShims.swift +++ b/Signal/test/Registration/RegistrationCoordinatorTestShims.swift @@ -185,34 +185,41 @@ public class _RegistrationCoordinator_OWS2FAManagerMock: _RegistrationCoordinato // MARK: - PreKeyManager -public class _RegistrationCoordinator_PreKeyManagerMock: _RegistrationCoordinator_PreKeyManagerShim { +public class _RegistrationCoordinator_PreKeyManagerMock: PreKeyManager { var run: RegistrationCoordinatorTest.RegistrationTestRun init(run: RegistrationCoordinatorTest.RegistrationTestRun) { self.run = run } - public typealias CreatePreKeysMock = (() -> Promise) + public func isAppLockedDueToPreKeyUpdateFailures(tx: DBReadTransaction) -> Bool { fatalError() } + public func checkPreKeysIfNecessary(tx: DBReadTransaction) { fatalError() } + public func rotatePreKeysOnUpgradeIfNecessary(for identity: OWSIdentity) async throws { fatalError() } + public func createPreKeysForProvisioning(aciIdentityKeyPair: ECKeyPair, pniIdentityKeyPair: ECKeyPair) -> Task { fatalError() } + public func rotateSignedPreKeysIfNeeded() -> Task { fatalError() } + public func refreshOneTimePreKeys(forIdentity identity: OWSIdentity, alsoRefreshSignedPreKey shouldRefreshSignedPreKey: Bool) { fatalError() } + + public typealias CreatePreKeysMock = (() -> Task) private var createPreKeysMocks = [CreatePreKeysMock]() public func addCreatePreKeysMock(_ mock: @escaping CreatePreKeysMock) { createPreKeysMocks.append(mock) } - public func createPreKeysForRegistration() async throws -> RegistrationPreKeyUploadBundles { + public func createPreKeysForRegistration() -> Task { run.addObservedStep(.createPreKeys) - return try await createPreKeysMocks.removeFirst()().awaitable() + return createPreKeysMocks.removeFirst()() } - public typealias FinalizePreKeysMock = ((Bool) -> Promise) + public typealias FinalizePreKeysMock = ((Bool) -> Task) private var finalizePreKeysMocks = [FinalizePreKeysMock]() public func addFinalizePreKeyMock(_ mock: @escaping FinalizePreKeysMock) { finalizePreKeysMocks.append(mock) } - public func finalizeRegistrationPreKeys(_ bundles: RegistrationPreKeyUploadBundles, uploadDidSucceed: Bool) async throws { + public func finalizeRegistrationPreKeys(_ bundles: RegistrationPreKeyUploadBundles, uploadDidSucceed: Bool) -> Task { run.addObservedStep(.finalizePreKeys) - return try await finalizePreKeysMocks.removeFirst()(uploadDidSucceed).awaitable() + return finalizePreKeysMocks.removeFirst()(uploadDidSucceed) } - public typealias RotateOneTimePreKeysMock = ((ChatServiceAuth) -> Promise) + public typealias RotateOneTimePreKeysMock = ((ChatServiceAuth) -> Task) private var rotateOneTimePreKeysMocks = [RotateOneTimePreKeysMock]() public func addRotateOneTimePreKeyMock(_ mock: @escaping RotateOneTimePreKeysMock) { rotateOneTimePreKeysMocks.append(mock) } - public func rotateOneTimePreKeysForRegistration(auth: ChatServiceAuth) async throws { + public func rotateOneTimePreKeysForRegistration(auth: ChatServiceAuth) -> Task { run.addObservedStep(.rotateOneTimePreKeys) - return try await rotateOneTimePreKeysMocks.removeFirst()(auth).awaitable() + return rotateOneTimePreKeysMocks.removeFirst()(auth) } public func setIsChangingNumber(_ isChangingNumber: Bool) {