Attempt to fix various session verification related crashes

This commit is contained in:
Stefan Ceriu
2024-01-05 16:50:32 +02:00
committed by Stefan Ceriu
parent 4e53c4f690
commit c40435b419
@@ -19,7 +19,10 @@ import Foundation
class UserSession: UserSessionProtocol { class UserSession: UserSessionProtocol {
private var cancellables = Set<AnyCancellable>() private var cancellables = Set<AnyCancellable>()
private var checkForSessionVerificationControllerCancellable: AnyCancellable?
private var checkSessionVerificationStateCancellable: AnyCancellable?
private var checkSessionVerificationStateTask: Task<Void, Never>?
private var authErrorCancellable: AnyCancellable? private var authErrorCancellable: AnyCancellable?
var userID: String { clientProxy.userID } var userID: String { clientProxy.userID }
@@ -32,7 +35,19 @@ class UserSession: UserSessionProtocol {
let callbacks = PassthroughSubject<UserSessionCallback, Never>() let callbacks = PassthroughSubject<UserSessionCallback, Never>()
private(set) var sessionVerificationController: SessionVerificationControllerProxyProtocol? private(set) var sessionVerificationController: SessionVerificationControllerProxyProtocol? {
didSet {
sessionVerificationController?.callbacks.sink { [weak self] callback in
switch callback {
case .finished:
self?.sessionVerificationStateSubject.send(true)
default:
break
}
}
.store(in: &cancellables)
}
}
private var sessionVerificationStateSubject: CurrentValueSubject<Bool?, Never> = .init(nil) private var sessionVerificationStateSubject: CurrentValueSubject<Bool?, Never> = .init(nil)
var sessionVerificationState: CurrentValuePublisher<Bool?, Never> { var sessionVerificationState: CurrentValuePublisher<Bool?, Never> {
@@ -51,19 +66,30 @@ class UserSession: UserSessionProtocol {
// MARK: - Private // MARK: - Private
private func setupSessionVerificationWatchdog() { private func setupSessionVerificationWatchdog() {
checkForSessionVerificationControllerCancellable = clientProxy.callbacks checkSessionVerificationStateCancellable = clientProxy.callbacks
.receive(on: DispatchQueue.main) .receive(on: DispatchQueue.main)
.sink { [weak self] callback in .sink { [weak self] callback in
if case .receivedSyncUpdate = callback { if callback.isSyncUpdate {
self?.attemptSessionVerification() self?.attemptSessionVerification()
} }
} }
} }
private func attemptSessionVerification() { private func attemptSessionVerification() {
Task { guard checkSessionVerificationStateTask == nil else {
MXLog.info("Session verification state check already in progress")
return
}
MXLog.info("Checking session verification state")
checkSessionVerificationStateTask = Task {
MXLog.info("Retrieving session verification controller")
switch await clientProxy.sessionVerificationControllerProxy() { switch await clientProxy.sessionVerificationControllerProxy() {
case .success(let sessionVerificationController): case .success(let sessionVerificationController):
MXLog.info("Retrieving session verification state")
guard case let .success(isVerified) = await sessionVerificationController.isVerified() else { guard case let .success(isVerified) = await sessionVerificationController.isVerified() else {
MXLog.error("Failed checking verification state. Will retry on the next sync update.") MXLog.error("Failed checking verification state. Will retry on the next sync update.")
return return
@@ -73,18 +99,11 @@ class UserSession: UserSessionProtocol {
self.sessionVerificationController = sessionVerificationController self.sessionVerificationController = sessionVerificationController
MXLog.info("Session verified: \(isVerified)")
sessionVerificationStateSubject.send(isVerified) sessionVerificationStateSubject.send(isVerified)
sessionVerificationController.callbacks.sink { [weak self] callback in checkSessionVerificationStateTask = nil
switch callback {
case .finished:
self?.sessionVerificationStateSubject.send(true)
default:
break
}
}
.store(in: &cancellables)
case .failure(let error): case .failure(let error):
MXLog.info("Failed getting session verification controller with error: \(error). Will retry on the next sync update.") MXLog.info("Failed getting session verification controller with error: \(error). Will retry on the next sync update.")
} }
@@ -92,7 +111,7 @@ class UserSession: UserSessionProtocol {
} }
private func tearDownSessionVerificationControllerWatchdog() { private func tearDownSessionVerificationControllerWatchdog() {
checkForSessionVerificationControllerCancellable = nil checkSessionVerificationStateCancellable = nil
} }
// MARK: Auth Error Watchdog // MARK: Auth Error Watchdog