Create sessions through the user session manager

Sign-in now creates and stores its session through the
UserSessionManagerProtocol rather than the UserSessionStore, so the
AppCoordinator no longer holds the store.

- The manager forwards clientSessionDelegate and
  userSession(for:sessionDirectories:passphrase:) to its store. As with
  restoring, the new session isn't registered until the AppCoordinator
  adds it.
- AuthenticationService takes the manager, for both sign-in and soft
  logout.
- The store mock's configuration moves to the manager mock.
This commit is contained in:
Mauro Romito
2026-10-08 21:09:09 +02:00
committed by Mauro
parent 60db364436
commit 5792a8ba5c
11 changed files with 91 additions and 30 deletions
@@ -7,6 +7,7 @@
import Combine
import Foundation
import MatrixRustSDK
import OrderedCollections
/// Owns the live session of every account signed in on this device, most recently active first.
@@ -37,6 +38,10 @@ final class UserSessionManager: UserSessionManagerProtocol {
accounts.values.first ?? nil
}
var clientSessionDelegate: ClientSessionDelegate {
userSessionStore.clientSessionDelegate
}
init(userSessionStore: UserSessionStoreProtocol, appSettings: AppSettings) {
self.userSessionStore = userSessionStore
self.appSettings = appSettings
@@ -79,6 +84,10 @@ final class UserSessionManager: UserSessionManagerProtocol {
return .failure(.failedRestoringSessions)
}
func userSession(for client: ClientProtocol, sessionDirectories: SessionDirectories, passphrase: Data) async -> Result<UserSessionProtocol, UserSessionStoreError> {
await userSessionStore.userSession(for: client, sessionDirectories: sessionDirectories, passphrase: passphrase)
}
func add(_ userSession: UserSessionProtocol) {
let userID = userSession.clientProxy.userID
@@ -7,6 +7,7 @@
import Combine
import Foundation
import MatrixRustSDK
enum UserSessionManagerError: Error {
/// There are no signed in accounts to restore.
@@ -23,6 +24,8 @@ protocol UserSessionManagerProtocol: AnyObject {
var sessionsPublisher: CurrentValuePublisher<[UserSessionProtocol], Never> { get }
/// The session of the account whose UI is on screen.
var activeSession: UserSessionProtocol? { get }
/// The delegate that stores changes to a client's session, such as refreshed tokens.
var clientSessionDelegate: ClientSessionDelegate { get }
func session(for userID: String) -> UserSessionProtocol?
@@ -32,6 +35,10 @@ protocol UserSessionManagerProtocol: AnyObject {
///
/// The session isn't registered: `add` it once it's ready to be used, e.g. after any migrations.
func restoreActiveSession() async -> Result<UserSessionProtocol, UserSessionManagerError>
/// Creates the session of an account that has just signed in, and stores its credentials.
///
/// The session isn't registered: `add` it once it's ready to be used.
func userSession(for client: ClientProtocol, sessionDirectories: SessionDirectories, passphrase: Data) async -> Result<UserSessionProtocol, UserSessionStoreError>
/// Registers a session that's ready to be used, replacing any previous session for its account.
/// A new account becomes the active one, a known account keeps its place.
func add(_ userSession: UserSessionProtocol)