// // Copyright 2022-2024 New Vector Ltd. // // SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial // Please see LICENSE files in the repository root for full details. // import Combine import Foundation import MatrixRustSDK enum ClientProxyAction { case receivedSyncUpdate case receivedAuthError(isSoftLogout: Bool) case receivedDecryptionError(UnableToDecryptInfo) var isSyncUpdate: Bool { if case .receivedSyncUpdate = self { return true } else { return false } } } enum ClientProxyLoadingState { case loading case notLoading } enum ClientProxyError: Error { case sdkError(Error) case forbiddenAccess case invalidMedia case invalidServerName case invalidResponse case failedUploadingMedia(ErrorKind) case roomPreviewIsPrivate case failedRetrievingUserIdentity case failedResolvingRoomAlias case roomNotInLocalStore case invalidInvite } enum SlidingSyncConstants { static let maximumVisibleRangeSize = 30 } /// This struct represents the configuration that we are using to register the application through Pusher to Sygnal /// using the Matrix Rust SDK, more info here: /// https://github.com/matrix-org/sygnal struct PusherConfiguration { let identifiers: PusherIdentifiers let kind: PusherKind let appDisplayName: String let deviceDisplayName: String let profileTag: String? let lang: String } enum SessionVerificationState { case unknown case verified case unverified } // The `Decodable` conformance is just for the purpose of migration enum TimelineMediaVisibility: Decodable { case always case privateOnly case never } // sourcery: AutoMockable protocol ClientProxyProtocol: AnyObject, MediaLoaderProtocol { var actionsPublisher: AnyPublisher { get } var loadingStatePublisher: CurrentValuePublisher { get } var verificationStatePublisher: CurrentValuePublisher { get } var userID: String { get } var deviceID: String? { get } var homeserver: String { get } var canDeactivateAccount: Bool { get } var userIDServerName: String? { get } var userDisplayNamePublisher: CurrentValuePublisher { get } var userAvatarURLPublisher: CurrentValuePublisher { get } /// We delay fetching this until after the first sync. Nil until then var ignoredUsersPublisher: CurrentValuePublisher<[String]?, Never> { get } var timelineMediaVisibilityPublisher: CurrentValuePublisher { get } var hideInviteAvatarsPublisher: CurrentValuePublisher { get } var pusherNotificationClientIdentifier: String? { get } var roomSummaryProvider: RoomSummaryProviderProtocol { get } /// Used for listing rooms that shouldn't be affected by the main `roomSummaryProvider` filtering /// But can still be filtered by queries, since this may be shared across multiple views, remember to reset /// The filtering state when you are done with it var alternateRoomSummaryProvider: RoomSummaryProviderProtocol { get } /// Used for listing rooms, can't be filtered nor its state observed var staticRoomSummaryProvider: StaticRoomSummaryProviderProtocol { get } var roomsToAwait: Set { get set } var notificationSettings: NotificationSettingsProxyProtocol { get } var secureBackupController: SecureBackupControllerProtocol { get } var sessionVerificationController: SessionVerificationControllerProxyProtocol? { get } var isReportRoomSupported: Bool { get async } var isLiveKitRTCSupported: Bool { get async } var maxMediaUploadSize: Result { get async } func isOnlyDeviceLeft() async -> Result func startSync() func stopSync() func stopSync(completion: (() -> Void)?) // Hopefully this will become async once we get SE-0371. func accountURL(action: AccountManagementAction) async -> URL? func directRoomForUserID(_ userID: String) -> Result func createDirectRoom(with userID: String, expectedRoomName: String?) async -> Result func createRoom(name: String, topic: String?, isRoomPrivate: Bool, isKnockingOnly: Bool, userIDs: [String], avatarURL: URL?, aliasLocalPart: String?) async -> Result func joinRoom(_ roomID: String, via: [String]) async -> Result func joinRoomAlias(_ roomAlias: String) async -> Result func knockRoom(_ roomID: String, via: [String], message: String?) async -> Result func knockRoomAlias(_ roomAlias: String, message: String?) async -> Result func uploadMedia(_ media: MediaInfo) async -> Result func roomForIdentifier(_ identifier: String) async -> RoomProxyType? func roomPreviewForIdentifier(_ identifier: String, via: [String]) async -> Result func roomSummaryForIdentifier(_ identifier: String) -> RoomSummary? func roomSummaryForAlias(_ alias: String) -> RoomSummary? /// Will only work for rooms that are in our room list/local store func reportRoomForIdentifier(_ identifier: String, reason: String) async -> Result @discardableResult func loadUserDisplayName() async -> Result func setUserDisplayName(_ name: String) async -> Result @discardableResult func loadUserAvatarURL() async -> Result func setUserAvatar(media: MediaInfo) async -> Result func removeUserAvatar() async -> Result func deactivateAccount(password: String?, eraseData: Bool) async -> Result func logout() async func setPusher(with configuration: PusherConfiguration) async throws func searchUsers(searchTerm: String, limit: UInt) async -> Result func profile(for userID: String) async -> Result func roomDirectorySearchProxy() -> RoomDirectorySearchProxyProtocol func resolveRoomAlias(_ alias: String) async -> Result func isAliasAvailable(_ alias: String) async -> Result @discardableResult func clearCaches() async -> Result func fetchMediaPreviewConfiguration() async -> Result // MARK: - Ignored users func ignoreUser(_ userID: String) async -> Result func unignoreUser(_ userID: String) async -> Result // MARK: - Recently visited rooms func trackRecentlyVisitedRoom(_ roomID: String) async -> Result func recentlyVisitedRooms() async -> Result<[String], ClientProxyError> func recentConversationCounterparts() async -> [UserProfileProxy] // MARK: - Crypto func ed25519Base64() async -> String? func curve25519Base64() async -> String? func pinUserIdentity(_ userID: String) async -> Result func withdrawUserIdentityVerification(_ userID: String) async -> Result func resetIdentity() async -> Result func userIdentity(for userID: String) async -> Result // MARK: - Moderation & Safety func setTimelineMediaVisibility(_ value: TimelineMediaVisibility) async -> Result func setHideInviteAvatars(_ value: Bool) async -> Result }