mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 06:55:59 +00:00
Add HealthChat API and extended profile services (#9)
Expose OpenID tokens and homeserver credentials from the client proxy, and add fork-only services for the HealthChat member directory backend (api.healthchat.ch) plus a service that reads MSC4133 extended profile fields directly from the homeserver. Groundwork for the members tab and the profile screens. Claude-Session: https://claude.ai/code/session_013qdTbAWsZj2quQzEkagXaS
This commit is contained in:
@@ -3879,6 +3879,62 @@ nonisolated class ClientProxyMock: ClientProxyProtocol, @unchecked Sendable {
|
||||
return profileForReturnValue
|
||||
}
|
||||
}
|
||||
//MARK: - requestOpenIDToken
|
||||
|
||||
private let requestOpenIDTokenCallsCountLock = NSLock()
|
||||
private nonisolated(unsafe) var requestOpenIDTokenUnderlyingCallsCount = 0
|
||||
var requestOpenIDTokenCallsCount: Int {
|
||||
get { requestOpenIDTokenCallsCountLock.withLock { requestOpenIDTokenUnderlyingCallsCount } }
|
||||
set { requestOpenIDTokenCallsCountLock.withLock { requestOpenIDTokenUnderlyingCallsCount = newValue } }
|
||||
}
|
||||
var requestOpenIDTokenCalled: Bool {
|
||||
return requestOpenIDTokenCallsCount > 0
|
||||
}
|
||||
|
||||
private let requestOpenIDTokenReturnValueLock = NSLock()
|
||||
private nonisolated(unsafe) var requestOpenIDTokenUnderlyingReturnValue: Result<OpenIDToken, ClientProxyError>!
|
||||
var requestOpenIDTokenReturnValue: Result<OpenIDToken, ClientProxyError>! {
|
||||
get { requestOpenIDTokenReturnValueLock.withLock { requestOpenIDTokenUnderlyingReturnValue } }
|
||||
set { requestOpenIDTokenReturnValueLock.withLock { requestOpenIDTokenUnderlyingReturnValue = newValue } }
|
||||
}
|
||||
nonisolated(unsafe) var requestOpenIDTokenClosure: (() async -> Result<OpenIDToken, ClientProxyError>)?
|
||||
|
||||
@concurrent func requestOpenIDToken() async -> Result<OpenIDToken, ClientProxyError> {
|
||||
requestOpenIDTokenCallsCountLock.withLock { requestOpenIDTokenUnderlyingCallsCount += 1 }
|
||||
if let requestOpenIDTokenClosure = requestOpenIDTokenClosure {
|
||||
return await requestOpenIDTokenClosure()
|
||||
} else {
|
||||
return requestOpenIDTokenReturnValue
|
||||
}
|
||||
}
|
||||
//MARK: - homeserverCredentials
|
||||
|
||||
private let homeserverCredentialsCallsCountLock = NSLock()
|
||||
private nonisolated(unsafe) var homeserverCredentialsUnderlyingCallsCount = 0
|
||||
var homeserverCredentialsCallsCount: Int {
|
||||
get { homeserverCredentialsCallsCountLock.withLock { homeserverCredentialsUnderlyingCallsCount } }
|
||||
set { homeserverCredentialsCallsCountLock.withLock { homeserverCredentialsUnderlyingCallsCount = newValue } }
|
||||
}
|
||||
var homeserverCredentialsCalled: Bool {
|
||||
return homeserverCredentialsCallsCount > 0
|
||||
}
|
||||
|
||||
private let homeserverCredentialsReturnValueLock = NSLock()
|
||||
private nonisolated(unsafe) var homeserverCredentialsUnderlyingReturnValue: Result<HomeserverCredentials, ClientProxyError>!
|
||||
var homeserverCredentialsReturnValue: Result<HomeserverCredentials, ClientProxyError>! {
|
||||
get { homeserverCredentialsReturnValueLock.withLock { homeserverCredentialsUnderlyingReturnValue } }
|
||||
set { homeserverCredentialsReturnValueLock.withLock { homeserverCredentialsUnderlyingReturnValue = newValue } }
|
||||
}
|
||||
nonisolated(unsafe) var homeserverCredentialsClosure: (() -> Result<HomeserverCredentials, ClientProxyError>)?
|
||||
|
||||
func homeserverCredentials() -> Result<HomeserverCredentials, ClientProxyError> {
|
||||
homeserverCredentialsCallsCountLock.withLock { homeserverCredentialsUnderlyingCallsCount += 1 }
|
||||
if let homeserverCredentialsClosure = homeserverCredentialsClosure {
|
||||
return homeserverCredentialsClosure()
|
||||
} else {
|
||||
return homeserverCredentialsReturnValue
|
||||
}
|
||||
}
|
||||
//MARK: - roomDirectorySearchProxy
|
||||
|
||||
private let roomDirectorySearchProxyCallsCountLock = NSLock()
|
||||
@@ -5483,6 +5539,284 @@ nonisolated class ElementCallWidgetDriverMock: ElementCallWidgetDriverProtocol,
|
||||
}
|
||||
}
|
||||
}
|
||||
nonisolated class ExtendedProfileServiceMock: ExtendedProfileServiceProtocol, @unchecked Sendable {
|
||||
|
||||
//MARK: - profile
|
||||
|
||||
private let profileForCallsCountLock = NSLock()
|
||||
private nonisolated(unsafe) var profileForUnderlyingCallsCount = 0
|
||||
var profileForCallsCount: Int {
|
||||
get { profileForCallsCountLock.withLock { profileForUnderlyingCallsCount } }
|
||||
set { profileForCallsCountLock.withLock { profileForUnderlyingCallsCount = newValue } }
|
||||
}
|
||||
var profileForCalled: Bool {
|
||||
return profileForCallsCount > 0
|
||||
}
|
||||
private let profileForReceivedUserIDLock = NSLock()
|
||||
private nonisolated(unsafe) var profileForUnderlyingReceivedUserID: String?
|
||||
var profileForReceivedUserID: String? {
|
||||
get { profileForReceivedUserIDLock.withLock { profileForUnderlyingReceivedUserID } }
|
||||
set { profileForReceivedUserIDLock.withLock { profileForUnderlyingReceivedUserID = newValue } }
|
||||
}
|
||||
private let profileForReceivedInvocationsLock = NSLock()
|
||||
private nonisolated(unsafe) var profileForUnderlyingReceivedInvocations: [String] = []
|
||||
var profileForReceivedInvocations: [String] {
|
||||
get { profileForReceivedInvocationsLock.withLock { profileForUnderlyingReceivedInvocations } }
|
||||
set { profileForReceivedInvocationsLock.withLock { profileForUnderlyingReceivedInvocations = newValue } }
|
||||
}
|
||||
|
||||
private let profileForReturnValueLock = NSLock()
|
||||
private nonisolated(unsafe) var profileForUnderlyingReturnValue: Result<ExtendedProfile, ExtendedProfileServiceError>!
|
||||
var profileForReturnValue: Result<ExtendedProfile, ExtendedProfileServiceError>! {
|
||||
get { profileForReturnValueLock.withLock { profileForUnderlyingReturnValue } }
|
||||
set { profileForReturnValueLock.withLock { profileForUnderlyingReturnValue = newValue } }
|
||||
}
|
||||
nonisolated(unsafe) var profileForClosure: ((String) async -> Result<ExtendedProfile, ExtendedProfileServiceError>)?
|
||||
|
||||
@concurrent func profile(for userID: String) async -> Result<ExtendedProfile, ExtendedProfileServiceError> {
|
||||
profileForCallsCountLock.withLock { profileForUnderlyingCallsCount += 1 }
|
||||
profileForReceivedUserID = userID
|
||||
profileForReceivedInvocationsLock.withLock { profileForUnderlyingReceivedInvocations.append(userID) }
|
||||
if let profileForClosure = profileForClosure {
|
||||
return await profileForClosure(userID)
|
||||
} else {
|
||||
return profileForReturnValue
|
||||
}
|
||||
}
|
||||
}
|
||||
nonisolated class HealthChatAPIServiceMock: HealthChatAPIServiceProtocol, @unchecked Sendable {
|
||||
|
||||
//MARK: - members
|
||||
|
||||
private let membersSearchQueryCallsCountLock = NSLock()
|
||||
private nonisolated(unsafe) var membersSearchQueryUnderlyingCallsCount = 0
|
||||
var membersSearchQueryCallsCount: Int {
|
||||
get { membersSearchQueryCallsCountLock.withLock { membersSearchQueryUnderlyingCallsCount } }
|
||||
set { membersSearchQueryCallsCountLock.withLock { membersSearchQueryUnderlyingCallsCount = newValue } }
|
||||
}
|
||||
var membersSearchQueryCalled: Bool {
|
||||
return membersSearchQueryCallsCount > 0
|
||||
}
|
||||
private let membersSearchQueryReceivedSearchQueryLock = NSLock()
|
||||
private nonisolated(unsafe) var membersSearchQueryUnderlyingReceivedSearchQuery: String?
|
||||
var membersSearchQueryReceivedSearchQuery: String? {
|
||||
get { membersSearchQueryReceivedSearchQueryLock.withLock { membersSearchQueryUnderlyingReceivedSearchQuery } }
|
||||
set { membersSearchQueryReceivedSearchQueryLock.withLock { membersSearchQueryUnderlyingReceivedSearchQuery = newValue } }
|
||||
}
|
||||
private let membersSearchQueryReceivedInvocationsLock = NSLock()
|
||||
private nonisolated(unsafe) var membersSearchQueryUnderlyingReceivedInvocations: [String?] = []
|
||||
var membersSearchQueryReceivedInvocations: [String?] {
|
||||
get { membersSearchQueryReceivedInvocationsLock.withLock { membersSearchQueryUnderlyingReceivedInvocations } }
|
||||
set { membersSearchQueryReceivedInvocationsLock.withLock { membersSearchQueryUnderlyingReceivedInvocations = newValue } }
|
||||
}
|
||||
|
||||
private let membersSearchQueryReturnValueLock = NSLock()
|
||||
private nonisolated(unsafe) var membersSearchQueryUnderlyingReturnValue: Result<HealthChatMembersResponse, HealthChatAPIError>!
|
||||
var membersSearchQueryReturnValue: Result<HealthChatMembersResponse, HealthChatAPIError>! {
|
||||
get { membersSearchQueryReturnValueLock.withLock { membersSearchQueryUnderlyingReturnValue } }
|
||||
set { membersSearchQueryReturnValueLock.withLock { membersSearchQueryUnderlyingReturnValue = newValue } }
|
||||
}
|
||||
nonisolated(unsafe) var membersSearchQueryClosure: ((String?) async -> Result<HealthChatMembersResponse, HealthChatAPIError>)?
|
||||
|
||||
@concurrent func members(searchQuery: String?) async -> Result<HealthChatMembersResponse, HealthChatAPIError> {
|
||||
membersSearchQueryCallsCountLock.withLock { membersSearchQueryUnderlyingCallsCount += 1 }
|
||||
membersSearchQueryReceivedSearchQuery = searchQuery
|
||||
membersSearchQueryReceivedInvocationsLock.withLock { membersSearchQueryUnderlyingReceivedInvocations.append(searchQuery) }
|
||||
if let membersSearchQueryClosure = membersSearchQueryClosure {
|
||||
return await membersSearchQueryClosure(searchQuery)
|
||||
} else {
|
||||
return membersSearchQueryReturnValue
|
||||
}
|
||||
}
|
||||
//MARK: - ownProfile
|
||||
|
||||
private let ownProfileCallsCountLock = NSLock()
|
||||
private nonisolated(unsafe) var ownProfileUnderlyingCallsCount = 0
|
||||
var ownProfileCallsCount: Int {
|
||||
get { ownProfileCallsCountLock.withLock { ownProfileUnderlyingCallsCount } }
|
||||
set { ownProfileCallsCountLock.withLock { ownProfileUnderlyingCallsCount = newValue } }
|
||||
}
|
||||
var ownProfileCalled: Bool {
|
||||
return ownProfileCallsCount > 0
|
||||
}
|
||||
|
||||
private let ownProfileReturnValueLock = NSLock()
|
||||
private nonisolated(unsafe) var ownProfileUnderlyingReturnValue: Result<HealthChatMember, HealthChatAPIError>!
|
||||
var ownProfileReturnValue: Result<HealthChatMember, HealthChatAPIError>! {
|
||||
get { ownProfileReturnValueLock.withLock { ownProfileUnderlyingReturnValue } }
|
||||
set { ownProfileReturnValueLock.withLock { ownProfileUnderlyingReturnValue = newValue } }
|
||||
}
|
||||
nonisolated(unsafe) var ownProfileClosure: (() async -> Result<HealthChatMember, HealthChatAPIError>)?
|
||||
|
||||
@concurrent func ownProfile() async -> Result<HealthChatMember, HealthChatAPIError> {
|
||||
ownProfileCallsCountLock.withLock { ownProfileUnderlyingCallsCount += 1 }
|
||||
if let ownProfileClosure = ownProfileClosure {
|
||||
return await ownProfileClosure()
|
||||
} else {
|
||||
return ownProfileReturnValue
|
||||
}
|
||||
}
|
||||
//MARK: - updateOwnProfile
|
||||
|
||||
private let updateOwnProfileCallsCountLock = NSLock()
|
||||
private nonisolated(unsafe) var updateOwnProfileUnderlyingCallsCount = 0
|
||||
var updateOwnProfileCallsCount: Int {
|
||||
get { updateOwnProfileCallsCountLock.withLock { updateOwnProfileUnderlyingCallsCount } }
|
||||
set { updateOwnProfileCallsCountLock.withLock { updateOwnProfileUnderlyingCallsCount = newValue } }
|
||||
}
|
||||
var updateOwnProfileCalled: Bool {
|
||||
return updateOwnProfileCallsCount > 0
|
||||
}
|
||||
private let updateOwnProfileReceivedUpdateLock = NSLock()
|
||||
private nonisolated(unsafe) var updateOwnProfileUnderlyingReceivedUpdate: HealthChatProfileUpdate?
|
||||
var updateOwnProfileReceivedUpdate: HealthChatProfileUpdate? {
|
||||
get { updateOwnProfileReceivedUpdateLock.withLock { updateOwnProfileUnderlyingReceivedUpdate } }
|
||||
set { updateOwnProfileReceivedUpdateLock.withLock { updateOwnProfileUnderlyingReceivedUpdate = newValue } }
|
||||
}
|
||||
private let updateOwnProfileReceivedInvocationsLock = NSLock()
|
||||
private nonisolated(unsafe) var updateOwnProfileUnderlyingReceivedInvocations: [HealthChatProfileUpdate] = []
|
||||
var updateOwnProfileReceivedInvocations: [HealthChatProfileUpdate] {
|
||||
get { updateOwnProfileReceivedInvocationsLock.withLock { updateOwnProfileUnderlyingReceivedInvocations } }
|
||||
set { updateOwnProfileReceivedInvocationsLock.withLock { updateOwnProfileUnderlyingReceivedInvocations = newValue } }
|
||||
}
|
||||
|
||||
private let updateOwnProfileReturnValueLock = NSLock()
|
||||
private nonisolated(unsafe) var updateOwnProfileUnderlyingReturnValue: Result<Void, HealthChatAPIError>!
|
||||
var updateOwnProfileReturnValue: Result<Void, HealthChatAPIError>! {
|
||||
get { updateOwnProfileReturnValueLock.withLock { updateOwnProfileUnderlyingReturnValue } }
|
||||
set { updateOwnProfileReturnValueLock.withLock { updateOwnProfileUnderlyingReturnValue = newValue } }
|
||||
}
|
||||
nonisolated(unsafe) var updateOwnProfileClosure: ((HealthChatProfileUpdate) async -> Result<Void, HealthChatAPIError>)?
|
||||
|
||||
@concurrent func updateOwnProfile(_ update: HealthChatProfileUpdate) async -> Result<Void, HealthChatAPIError> {
|
||||
updateOwnProfileCallsCountLock.withLock { updateOwnProfileUnderlyingCallsCount += 1 }
|
||||
updateOwnProfileReceivedUpdate = update
|
||||
updateOwnProfileReceivedInvocationsLock.withLock { updateOwnProfileUnderlyingReceivedInvocations.append(update) }
|
||||
if let updateOwnProfileClosure = updateOwnProfileClosure {
|
||||
return await updateOwnProfileClosure(update)
|
||||
} else {
|
||||
return updateOwnProfileReturnValue
|
||||
}
|
||||
}
|
||||
//MARK: - profileCompleteness
|
||||
|
||||
private let profileCompletenessCallsCountLock = NSLock()
|
||||
private nonisolated(unsafe) var profileCompletenessUnderlyingCallsCount = 0
|
||||
var profileCompletenessCallsCount: Int {
|
||||
get { profileCompletenessCallsCountLock.withLock { profileCompletenessUnderlyingCallsCount } }
|
||||
set { profileCompletenessCallsCountLock.withLock { profileCompletenessUnderlyingCallsCount = newValue } }
|
||||
}
|
||||
var profileCompletenessCalled: Bool {
|
||||
return profileCompletenessCallsCount > 0
|
||||
}
|
||||
|
||||
private let profileCompletenessReturnValueLock = NSLock()
|
||||
private nonisolated(unsafe) var profileCompletenessUnderlyingReturnValue: Result<HealthChatProfileCompleteness, HealthChatAPIError>!
|
||||
var profileCompletenessReturnValue: Result<HealthChatProfileCompleteness, HealthChatAPIError>! {
|
||||
get { profileCompletenessReturnValueLock.withLock { profileCompletenessUnderlyingReturnValue } }
|
||||
set { profileCompletenessReturnValueLock.withLock { profileCompletenessUnderlyingReturnValue = newValue } }
|
||||
}
|
||||
nonisolated(unsafe) var profileCompletenessClosure: (() async -> Result<HealthChatProfileCompleteness, HealthChatAPIError>)?
|
||||
|
||||
@concurrent func profileCompleteness() async -> Result<HealthChatProfileCompleteness, HealthChatAPIError> {
|
||||
profileCompletenessCallsCountLock.withLock { profileCompletenessUnderlyingCallsCount += 1 }
|
||||
if let profileCompletenessClosure = profileCompletenessClosure {
|
||||
return await profileCompletenessClosure()
|
||||
} else {
|
||||
return profileCompletenessReturnValue
|
||||
}
|
||||
}
|
||||
//MARK: - inviteMember
|
||||
|
||||
private let inviteMemberEmailPersonalNoteCallsCountLock = NSLock()
|
||||
private nonisolated(unsafe) var inviteMemberEmailPersonalNoteUnderlyingCallsCount = 0
|
||||
var inviteMemberEmailPersonalNoteCallsCount: Int {
|
||||
get { inviteMemberEmailPersonalNoteCallsCountLock.withLock { inviteMemberEmailPersonalNoteUnderlyingCallsCount } }
|
||||
set { inviteMemberEmailPersonalNoteCallsCountLock.withLock { inviteMemberEmailPersonalNoteUnderlyingCallsCount = newValue } }
|
||||
}
|
||||
var inviteMemberEmailPersonalNoteCalled: Bool {
|
||||
return inviteMemberEmailPersonalNoteCallsCount > 0
|
||||
}
|
||||
private let inviteMemberEmailPersonalNoteReceivedArgumentsLock = NSLock()
|
||||
private nonisolated(unsafe) var inviteMemberEmailPersonalNoteUnderlyingReceivedArguments: (email: String, personalNote: String)?
|
||||
var inviteMemberEmailPersonalNoteReceivedArguments: (email: String, personalNote: String)? {
|
||||
get { inviteMemberEmailPersonalNoteReceivedArgumentsLock.withLock { inviteMemberEmailPersonalNoteUnderlyingReceivedArguments } }
|
||||
set { inviteMemberEmailPersonalNoteReceivedArgumentsLock.withLock { inviteMemberEmailPersonalNoteUnderlyingReceivedArguments = newValue } }
|
||||
}
|
||||
private let inviteMemberEmailPersonalNoteReceivedInvocationsLock = NSLock()
|
||||
private nonisolated(unsafe) var inviteMemberEmailPersonalNoteUnderlyingReceivedInvocations: [(email: String, personalNote: String)] = []
|
||||
var inviteMemberEmailPersonalNoteReceivedInvocations: [(email: String, personalNote: String)] {
|
||||
get { inviteMemberEmailPersonalNoteReceivedInvocationsLock.withLock { inviteMemberEmailPersonalNoteUnderlyingReceivedInvocations } }
|
||||
set { inviteMemberEmailPersonalNoteReceivedInvocationsLock.withLock { inviteMemberEmailPersonalNoteUnderlyingReceivedInvocations = newValue } }
|
||||
}
|
||||
|
||||
private let inviteMemberEmailPersonalNoteReturnValueLock = NSLock()
|
||||
private nonisolated(unsafe) var inviteMemberEmailPersonalNoteUnderlyingReturnValue: Result<Void, HealthChatAPIError>!
|
||||
var inviteMemberEmailPersonalNoteReturnValue: Result<Void, HealthChatAPIError>! {
|
||||
get { inviteMemberEmailPersonalNoteReturnValueLock.withLock { inviteMemberEmailPersonalNoteUnderlyingReturnValue } }
|
||||
set { inviteMemberEmailPersonalNoteReturnValueLock.withLock { inviteMemberEmailPersonalNoteUnderlyingReturnValue = newValue } }
|
||||
}
|
||||
nonisolated(unsafe) var inviteMemberEmailPersonalNoteClosure: ((String, String) async -> Result<Void, HealthChatAPIError>)?
|
||||
|
||||
@concurrent func inviteMember(email: String, personalNote: String) async -> Result<Void, HealthChatAPIError> {
|
||||
inviteMemberEmailPersonalNoteCallsCountLock.withLock { inviteMemberEmailPersonalNoteUnderlyingCallsCount += 1 }
|
||||
inviteMemberEmailPersonalNoteReceivedArguments = (email: email, personalNote: personalNote)
|
||||
inviteMemberEmailPersonalNoteReceivedInvocationsLock.withLock { inviteMemberEmailPersonalNoteUnderlyingReceivedInvocations.append((email: email, personalNote: personalNote)) }
|
||||
if let inviteMemberEmailPersonalNoteClosure = inviteMemberEmailPersonalNoteClosure {
|
||||
return await inviteMemberEmailPersonalNoteClosure(email, personalNote)
|
||||
} else {
|
||||
return inviteMemberEmailPersonalNoteReturnValue
|
||||
}
|
||||
}
|
||||
}
|
||||
nonisolated class HealthChatOpenIDTokenProviderMock: HealthChatOpenIDTokenProviderProtocol, @unchecked Sendable {
|
||||
|
||||
//MARK: - validToken
|
||||
|
||||
private let validTokenCallsCountLock = NSLock()
|
||||
private nonisolated(unsafe) var validTokenUnderlyingCallsCount = 0
|
||||
var validTokenCallsCount: Int {
|
||||
get { validTokenCallsCountLock.withLock { validTokenUnderlyingCallsCount } }
|
||||
set { validTokenCallsCountLock.withLock { validTokenUnderlyingCallsCount = newValue } }
|
||||
}
|
||||
var validTokenCalled: Bool {
|
||||
return validTokenCallsCount > 0
|
||||
}
|
||||
|
||||
private let validTokenReturnValueLock = NSLock()
|
||||
private nonisolated(unsafe) var validTokenUnderlyingReturnValue: Result<String, HealthChatAPIError>!
|
||||
var validTokenReturnValue: Result<String, HealthChatAPIError>! {
|
||||
get { validTokenReturnValueLock.withLock { validTokenUnderlyingReturnValue } }
|
||||
set { validTokenReturnValueLock.withLock { validTokenUnderlyingReturnValue = newValue } }
|
||||
}
|
||||
nonisolated(unsafe) var validTokenClosure: (() async -> Result<String, HealthChatAPIError>)?
|
||||
|
||||
@concurrent func validToken() async -> Result<String, HealthChatAPIError> {
|
||||
validTokenCallsCountLock.withLock { validTokenUnderlyingCallsCount += 1 }
|
||||
if let validTokenClosure = validTokenClosure {
|
||||
return await validTokenClosure()
|
||||
} else {
|
||||
return validTokenReturnValue
|
||||
}
|
||||
}
|
||||
//MARK: - invalidateToken
|
||||
|
||||
private let invalidateTokenCallsCountLock = NSLock()
|
||||
private nonisolated(unsafe) var invalidateTokenUnderlyingCallsCount = 0
|
||||
var invalidateTokenCallsCount: Int {
|
||||
get { invalidateTokenCallsCountLock.withLock { invalidateTokenUnderlyingCallsCount } }
|
||||
set { invalidateTokenCallsCountLock.withLock { invalidateTokenUnderlyingCallsCount = newValue } }
|
||||
}
|
||||
var invalidateTokenCalled: Bool {
|
||||
return invalidateTokenCallsCount > 0
|
||||
}
|
||||
nonisolated(unsafe) var invalidateTokenClosure: (() -> Void)?
|
||||
|
||||
func invalidateToken() {
|
||||
invalidateTokenCallsCountLock.withLock { invalidateTokenUnderlyingCallsCount += 1 }
|
||||
invalidateTokenClosure?()
|
||||
}
|
||||
}
|
||||
nonisolated class HomeserverCapabilitiesProxyMock: HomeserverCapabilitiesProxyProtocol, @unchecked Sendable {
|
||||
|
||||
//MARK: - refresh
|
||||
|
||||
Reference in New Issue
Block a user