Introduce a user session manager (#6295)

This commit is contained in:
Mauro
2026-10-09 14:07:39 +02:00
committed by GitHub
parent 65bab49f39
commit 60db364436
26 changed files with 594 additions and 66 deletions
@@ -14810,6 +14810,165 @@ nonisolated class UserNotificationCenterMock: UserNotificationCenterProtocol, @u
}
}
}
nonisolated class UserSessionManagerMock: UserSessionManagerProtocol, @unchecked Sendable {
nonisolated(unsafe) var userIDs: [String] = []
var sessionsPublisher: CurrentValuePublisher<[UserSessionProtocol], Never> {
get { return underlyingSessionsPublisher }
set(value) { underlyingSessionsPublisher = value }
}
nonisolated(unsafe) var underlyingSessionsPublisher: CurrentValuePublisher<[UserSessionProtocol], Never>!
nonisolated(unsafe) var activeSession: UserSessionProtocol?
//MARK: - session
private let sessionForCallsCountLock = NSLock()
private nonisolated(unsafe) var sessionForUnderlyingCallsCount = 0
var sessionForCallsCount: Int {
get { sessionForCallsCountLock.withLock { sessionForUnderlyingCallsCount } }
set { sessionForCallsCountLock.withLock { sessionForUnderlyingCallsCount = newValue } }
}
var sessionForCalled: Bool {
return sessionForCallsCount > 0
}
private let sessionForReceivedUserIDLock = NSLock()
private nonisolated(unsafe) var sessionForUnderlyingReceivedUserID: String?
var sessionForReceivedUserID: String? {
get { sessionForReceivedUserIDLock.withLock { sessionForUnderlyingReceivedUserID } }
set { sessionForReceivedUserIDLock.withLock { sessionForUnderlyingReceivedUserID = newValue } }
}
private let sessionForReceivedInvocationsLock = NSLock()
private nonisolated(unsafe) var sessionForUnderlyingReceivedInvocations: [String] = []
var sessionForReceivedInvocations: [String] {
get { sessionForReceivedInvocationsLock.withLock { sessionForUnderlyingReceivedInvocations } }
set { sessionForReceivedInvocationsLock.withLock { sessionForUnderlyingReceivedInvocations = newValue } }
}
private let sessionForReturnValueLock = NSLock()
private nonisolated(unsafe) var sessionForUnderlyingReturnValue: UserSessionProtocol?
var sessionForReturnValue: UserSessionProtocol? {
get { sessionForReturnValueLock.withLock { sessionForUnderlyingReturnValue } }
set { sessionForReturnValueLock.withLock { sessionForUnderlyingReturnValue = newValue } }
}
nonisolated(unsafe) var sessionForClosure: ((String) -> UserSessionProtocol?)?
func session(for userID: String) -> UserSessionProtocol? {
sessionForCallsCountLock.withLock { sessionForUnderlyingCallsCount += 1 }
sessionForReceivedUserID = userID
sessionForReceivedInvocationsLock.withLock { sessionForUnderlyingReceivedInvocations.append(userID) }
if let sessionForClosure = sessionForClosure {
return sessionForClosure(userID)
} else {
return sessionForReturnValue
}
}
//MARK: - restoreActiveSession
private let restoreActiveSessionCallsCountLock = NSLock()
private nonisolated(unsafe) var restoreActiveSessionUnderlyingCallsCount = 0
var restoreActiveSessionCallsCount: Int {
get { restoreActiveSessionCallsCountLock.withLock { restoreActiveSessionUnderlyingCallsCount } }
set { restoreActiveSessionCallsCountLock.withLock { restoreActiveSessionUnderlyingCallsCount = newValue } }
}
var restoreActiveSessionCalled: Bool {
return restoreActiveSessionCallsCount > 0
}
private let restoreActiveSessionReturnValueLock = NSLock()
private nonisolated(unsafe) var restoreActiveSessionUnderlyingReturnValue: Result<UserSessionProtocol, UserSessionManagerError>!
var restoreActiveSessionReturnValue: Result<UserSessionProtocol, UserSessionManagerError>! {
get { restoreActiveSessionReturnValueLock.withLock { restoreActiveSessionUnderlyingReturnValue } }
set { restoreActiveSessionReturnValueLock.withLock { restoreActiveSessionUnderlyingReturnValue = newValue } }
}
nonisolated(unsafe) var restoreActiveSessionClosure: (() async -> Result<UserSessionProtocol, UserSessionManagerError>)?
@concurrent func restoreActiveSession() async -> Result<UserSessionProtocol, UserSessionManagerError> {
restoreActiveSessionCallsCountLock.withLock { restoreActiveSessionUnderlyingCallsCount += 1 }
if let restoreActiveSessionClosure = restoreActiveSessionClosure {
return await restoreActiveSessionClosure()
} else {
return restoreActiveSessionReturnValue
}
}
//MARK: - add
private let addCallsCountLock = NSLock()
private nonisolated(unsafe) var addUnderlyingCallsCount = 0
var addCallsCount: Int {
get { addCallsCountLock.withLock { addUnderlyingCallsCount } }
set { addCallsCountLock.withLock { addUnderlyingCallsCount = newValue } }
}
var addCalled: Bool {
return addCallsCount > 0
}
private let addReceivedUserSessionLock = NSLock()
private nonisolated(unsafe) var addUnderlyingReceivedUserSession: UserSessionProtocol?
var addReceivedUserSession: UserSessionProtocol? {
get { addReceivedUserSessionLock.withLock { addUnderlyingReceivedUserSession } }
set { addReceivedUserSessionLock.withLock { addUnderlyingReceivedUserSession = newValue } }
}
private let addReceivedInvocationsLock = NSLock()
private nonisolated(unsafe) var addUnderlyingReceivedInvocations: [UserSessionProtocol] = []
var addReceivedInvocations: [UserSessionProtocol] {
get { addReceivedInvocationsLock.withLock { addUnderlyingReceivedInvocations } }
set { addReceivedInvocationsLock.withLock { addUnderlyingReceivedInvocations = newValue } }
}
nonisolated(unsafe) var addClosure: ((UserSessionProtocol) -> Void)?
func add(_ userSession: UserSessionProtocol) {
addCallsCountLock.withLock { addUnderlyingCallsCount += 1 }
addReceivedUserSession = userSession
addReceivedInvocationsLock.withLock { addUnderlyingReceivedInvocations.append(userSession) }
addClosure?(userSession)
}
//MARK: - remove
private let removeUserIDCallsCountLock = NSLock()
private nonisolated(unsafe) var removeUserIDUnderlyingCallsCount = 0
var removeUserIDCallsCount: Int {
get { removeUserIDCallsCountLock.withLock { removeUserIDUnderlyingCallsCount } }
set { removeUserIDCallsCountLock.withLock { removeUserIDUnderlyingCallsCount = newValue } }
}
var removeUserIDCalled: Bool {
return removeUserIDCallsCount > 0
}
private let removeUserIDReceivedUserIDLock = NSLock()
private nonisolated(unsafe) var removeUserIDUnderlyingReceivedUserID: String?
var removeUserIDReceivedUserID: String? {
get { removeUserIDReceivedUserIDLock.withLock { removeUserIDUnderlyingReceivedUserID } }
set { removeUserIDReceivedUserIDLock.withLock { removeUserIDUnderlyingReceivedUserID = newValue } }
}
private let removeUserIDReceivedInvocationsLock = NSLock()
private nonisolated(unsafe) var removeUserIDUnderlyingReceivedInvocations: [String] = []
var removeUserIDReceivedInvocations: [String] {
get { removeUserIDReceivedInvocationsLock.withLock { removeUserIDUnderlyingReceivedInvocations } }
set { removeUserIDReceivedInvocationsLock.withLock { removeUserIDUnderlyingReceivedInvocations = newValue } }
}
nonisolated(unsafe) var removeUserIDClosure: ((String) -> Void)?
func remove(userID: String) {
removeUserIDCallsCountLock.withLock { removeUserIDUnderlyingCallsCount += 1 }
removeUserIDReceivedUserID = userID
removeUserIDReceivedInvocationsLock.withLock { removeUserIDUnderlyingReceivedInvocations.append(userID) }
removeUserIDClosure?(userID)
}
//MARK: - reset
private let resetCallsCountLock = NSLock()
private nonisolated(unsafe) var resetUnderlyingCallsCount = 0
var resetCallsCount: Int {
get { resetCallsCountLock.withLock { resetUnderlyingCallsCount } }
set { resetCallsCountLock.withLock { resetUnderlyingCallsCount = newValue } }
}
var resetCalled: Bool {
return resetCallsCount > 0
}
nonisolated(unsafe) var resetClosure: (() -> Void)?
func reset() {
resetCallsCountLock.withLock { resetUnderlyingCallsCount += 1 }
resetClosure?()
}
}
nonisolated class UserSessionMock: UserSessionProtocol, @unchecked Sendable {
var clientProxy: ClientProxyProtocol {
get { return underlyingClientProxy }
@@ -14881,30 +15040,44 @@ nonisolated class UserSessionStoreMock: UserSessionStoreProtocol, @unchecked Sen
}
//MARK: - restoreUserSession
private let restoreUserSessionCallsCountLock = NSLock()
private nonisolated(unsafe) var restoreUserSessionUnderlyingCallsCount = 0
var restoreUserSessionCallsCount: Int {
get { restoreUserSessionCallsCountLock.withLock { restoreUserSessionUnderlyingCallsCount } }
set { restoreUserSessionCallsCountLock.withLock { restoreUserSessionUnderlyingCallsCount = newValue } }
private let restoreUserSessionUserIDCallsCountLock = NSLock()
private nonisolated(unsafe) var restoreUserSessionUserIDUnderlyingCallsCount = 0
var restoreUserSessionUserIDCallsCount: Int {
get { restoreUserSessionUserIDCallsCountLock.withLock { restoreUserSessionUserIDUnderlyingCallsCount } }
set { restoreUserSessionUserIDCallsCountLock.withLock { restoreUserSessionUserIDUnderlyingCallsCount = newValue } }
}
var restoreUserSessionCalled: Bool {
return restoreUserSessionCallsCount > 0
var restoreUserSessionUserIDCalled: Bool {
return restoreUserSessionUserIDCallsCount > 0
}
private let restoreUserSessionUserIDReceivedUserIDLock = NSLock()
private nonisolated(unsafe) var restoreUserSessionUserIDUnderlyingReceivedUserID: String?
var restoreUserSessionUserIDReceivedUserID: String? {
get { restoreUserSessionUserIDReceivedUserIDLock.withLock { restoreUserSessionUserIDUnderlyingReceivedUserID } }
set { restoreUserSessionUserIDReceivedUserIDLock.withLock { restoreUserSessionUserIDUnderlyingReceivedUserID = newValue } }
}
private let restoreUserSessionUserIDReceivedInvocationsLock = NSLock()
private nonisolated(unsafe) var restoreUserSessionUserIDUnderlyingReceivedInvocations: [String] = []
var restoreUserSessionUserIDReceivedInvocations: [String] {
get { restoreUserSessionUserIDReceivedInvocationsLock.withLock { restoreUserSessionUserIDUnderlyingReceivedInvocations } }
set { restoreUserSessionUserIDReceivedInvocationsLock.withLock { restoreUserSessionUserIDUnderlyingReceivedInvocations = newValue } }
}
private let restoreUserSessionReturnValueLock = NSLock()
private nonisolated(unsafe) var restoreUserSessionUnderlyingReturnValue: Result<UserSessionProtocol, UserSessionStoreError>!
var restoreUserSessionReturnValue: Result<UserSessionProtocol, UserSessionStoreError>! {
get { restoreUserSessionReturnValueLock.withLock { restoreUserSessionUnderlyingReturnValue } }
set { restoreUserSessionReturnValueLock.withLock { restoreUserSessionUnderlyingReturnValue = newValue } }
private let restoreUserSessionUserIDReturnValueLock = NSLock()
private nonisolated(unsafe) var restoreUserSessionUserIDUnderlyingReturnValue: Result<UserSessionProtocol, UserSessionStoreError>!
var restoreUserSessionUserIDReturnValue: Result<UserSessionProtocol, UserSessionStoreError>! {
get { restoreUserSessionUserIDReturnValueLock.withLock { restoreUserSessionUserIDUnderlyingReturnValue } }
set { restoreUserSessionUserIDReturnValueLock.withLock { restoreUserSessionUserIDUnderlyingReturnValue = newValue } }
}
nonisolated(unsafe) var restoreUserSessionClosure: (() async -> Result<UserSessionProtocol, UserSessionStoreError>)?
nonisolated(unsafe) var restoreUserSessionUserIDClosure: ((String) async -> Result<UserSessionProtocol, UserSessionStoreError>)?
@concurrent func restoreUserSession() async -> Result<UserSessionProtocol, UserSessionStoreError> {
restoreUserSessionCallsCountLock.withLock { restoreUserSessionUnderlyingCallsCount += 1 }
if let restoreUserSessionClosure = restoreUserSessionClosure {
return await restoreUserSessionClosure()
@concurrent func restoreUserSession(userID: String) async -> Result<UserSessionProtocol, UserSessionStoreError> {
restoreUserSessionUserIDCallsCountLock.withLock { restoreUserSessionUserIDUnderlyingCallsCount += 1 }
restoreUserSessionUserIDReceivedUserID = userID
restoreUserSessionUserIDReceivedInvocationsLock.withLock { restoreUserSessionUserIDUnderlyingReceivedInvocations.append(userID) }
if let restoreUserSessionUserIDClosure = restoreUserSessionUserIDClosure {
return await restoreUserSessionUserIDClosure(userID)
} else {
return restoreUserSessionReturnValue
return restoreUserSessionUserIDReturnValue
}
}
//MARK: - userSession