Update the SDK. (#2776)

Handle async FFI changes.

Fix flakey unit test.
This commit is contained in:
Doug
2024-05-03 12:00:05 +01:00
committed by GitHub
parent 38416dbb5c
commit 11557e4879
15 changed files with 288 additions and 365 deletions
@@ -114,15 +114,11 @@ class AuthenticationServiceProxy: AuthenticationServiceProxyProtocol {
initialDeviceName: initialDeviceName,
deviceId: deviceID)
let refreshToken = try? await Task.dispatch(on: .global()) {
try client.session().refreshToken
}
let refreshToken = try? await client.session().refreshToken
if refreshToken != nil {
MXLog.warning("Refresh token found for a non oidc session, can't restore session, logging out")
_ = await Task.dispatch(on: .global()) {
try? client.logout()
}
_ = try? await client.logout()
return .failure(.sessionTokenRefreshNotSupported)
}
@@ -315,49 +315,41 @@ class ClientProxy: ClientProxyProtocol {
}
func createDirectRoom(with userID: String, expectedRoomName: String?) async -> Result<String, ClientProxyError> {
let result: Result<String, ClientProxyError> = await Task.dispatch(on: clientQueue) {
do {
let parameters = CreateRoomParameters(name: nil,
topic: nil,
isEncrypted: true,
isDirect: true,
visibility: .private,
preset: .trustedPrivateChat,
invite: [userID],
avatar: nil,
powerLevelContentOverride: Self.roomCreationPowerLevelOverrides)
let result = try self.client.createRoom(request: parameters)
return .success(result)
} catch {
MXLog.error("Failed creating direct room for userID: \(userID) with error: \(error)")
return .failure(.sdkError(error))
}
do {
let parameters = CreateRoomParameters(name: nil,
topic: nil,
isEncrypted: true,
isDirect: true,
visibility: .private,
preset: .trustedPrivateChat,
invite: [userID],
avatar: nil,
powerLevelContentOverride: Self.roomCreationPowerLevelOverrides)
let result = try await client.createRoom(request: parameters)
return await waitForRoomSummary(with: .success(result), name: expectedRoomName)
} catch {
MXLog.error("Failed creating direct room for userID: \(userID) with error: \(error)")
return .failure(.sdkError(error))
}
return await waitForRoomSummary(with: result, name: expectedRoomName)
}
func createRoom(name: String, topic: String?, isRoomPrivate: Bool, userIDs: [String], avatarURL: URL?) async -> Result<String, ClientProxyError> {
let result: Result<String, ClientProxyError> = await Task.dispatch(on: clientQueue) {
do {
let parameters = CreateRoomParameters(name: name,
topic: topic,
isEncrypted: isRoomPrivate,
isDirect: false,
visibility: isRoomPrivate ? .private : .public,
preset: isRoomPrivate ? .privateChat : .publicChat,
invite: userIDs,
avatar: avatarURL?.absoluteString,
powerLevelContentOverride: Self.roomCreationPowerLevelOverrides)
let roomID = try self.client.createRoom(request: parameters)
return .success(roomID)
} catch {
MXLog.error("Failed creating room with error: \(error)")
return .failure(.sdkError(error))
}
do {
let parameters = CreateRoomParameters(name: name,
topic: topic,
isEncrypted: isRoomPrivate,
isDirect: false,
visibility: isRoomPrivate ? .private : .public,
preset: isRoomPrivate ? .privateChat : .publicChat,
invite: userIDs,
avatar: avatarURL?.absoluteString,
powerLevelContentOverride: Self.roomCreationPowerLevelOverrides)
let roomID = try await client.createRoom(request: parameters)
return await waitForRoomSummary(with: .success(roomID), name: name)
} catch {
MXLog.error("Failed creating room with error: \(error)")
return .failure(.sdkError(error))
}
return await waitForRoomSummary(with: result, name: name)
}
func joinRoom(_ roomID: String) async -> Result<Void, ClientProxyError> {
@@ -462,103 +454,89 @@ class ClientProxy: ClientProxyProtocol {
}
func loadUserDisplayName() async -> Result<Void, ClientProxyError> {
await Task.dispatch(on: clientQueue) {
do {
let displayName = try self.client.displayName()
self.userDisplayNameSubject.send(displayName)
return .success(())
} catch {
MXLog.error("Failed loading user display name with error: \(error)")
return .failure(.sdkError(error))
}
do {
let displayName = try await client.displayName()
userDisplayNameSubject.send(displayName)
return .success(())
} catch {
MXLog.error("Failed loading user display name with error: \(error)")
return .failure(.sdkError(error))
}
}
func setUserDisplayName(_ name: String) async -> Result<Void, ClientProxyError> {
await Task.dispatch(on: clientQueue) {
do {
try self.client.setDisplayName(name: name)
Task {
await self.loadUserDisplayName()
}
return .success(())
} catch {
MXLog.error("Failed setting user display name with error: \(error)")
return .failure(.sdkError(error))
do {
try await client.setDisplayName(name: name)
Task {
await self.loadUserDisplayName()
}
return .success(())
} catch {
MXLog.error("Failed setting user display name with error: \(error)")
return .failure(.sdkError(error))
}
}
func loadUserAvatarURL() async -> Result<Void, ClientProxyError> {
await Task.dispatch(on: clientQueue) {
do {
let urlString = try self.client.avatarUrl()
self.loadCachedAvatarURLTask?.cancel()
self.userAvatarURLSubject.send(urlString.flatMap(URL.init))
return .success(())
} catch {
MXLog.error("Failed loading user avatar URL with error: \(error)")
return .failure(.sdkError(error))
}
do {
let urlString = try await client.avatarUrl()
loadCachedAvatarURLTask?.cancel()
userAvatarURLSubject.send(urlString.flatMap(URL.init))
return .success(())
} catch {
MXLog.error("Failed loading user avatar URL with error: \(error)")
return .failure(.sdkError(error))
}
}
func setUserAvatar(media: MediaInfo) async -> Result<Void, ClientProxyError> {
await Task.dispatch(on: .global()) {
guard case let .image(imageURL, _, _) = media, let mimeType = media.mimeType else {
MXLog.error("Failed uploading, invalid media: \(media)")
return .failure(.invalidMedia)
}
guard case let .image(imageURL, _, _) = media, let mimeType = media.mimeType else {
MXLog.error("Failed uploading, invalid media: \(media)")
return .failure(.invalidMedia)
}
do {
let data = try Data(contentsOf: imageURL)
try self.client.uploadAvatar(mimeType: mimeType, data: data)
Task {
await self.loadUserAvatarURL()
}
return .success(())
} catch {
MXLog.error("Failed setting user avatar with error: \(error)")
return .failure(.sdkError(error))
do {
let data = try Data(contentsOf: imageURL)
try await client.uploadAvatar(mimeType: mimeType, data: data)
Task {
await self.loadUserAvatarURL()
}
return .success(())
} catch {
MXLog.error("Failed setting user avatar with error: \(error)")
return .failure(.sdkError(error))
}
}
func removeUserAvatar() async -> Result<Void, ClientProxyError> {
await Task.dispatch(on: .global()) {
do {
try self.client.removeAvatar()
Task {
await self.loadUserAvatarURL()
}
return .success(())
} catch {
MXLog.error("Failed removing user avatar with error: \(error)")
return .failure(.sdkError(error))
do {
try await client.removeAvatar()
Task {
await self.loadUserAvatarURL()
}
return .success(())
} catch {
MXLog.error("Failed removing user avatar with error: \(error)")
return .failure(.sdkError(error))
}
}
func sessionVerificationControllerProxy() async -> Result<SessionVerificationControllerProxyProtocol, ClientProxyError> {
await Task.dispatch(on: clientQueue) {
do {
let sessionVerificationController = try self.client.getSessionVerificationController()
return .success(SessionVerificationControllerProxy(sessionVerificationController: sessionVerificationController))
} catch {
MXLog.error("Failed retrieving session verification controller proxy with error: \(error)")
return .failure(.sdkError(error))
}
do {
let sessionVerificationController = try await client.getSessionVerificationController()
return .success(SessionVerificationControllerProxy(sessionVerificationController: sessionVerificationController))
} catch {
MXLog.error("Failed retrieving session verification controller proxy with error: \(error)")
return .failure(.sdkError(error))
}
}
func logout() async -> URL? {
await Task.dispatch(on: clientQueue) {
do {
return try self.client.logout().flatMap(URL.init(string:))
} catch {
MXLog.error("Failed logging out with error: \(error)")
return nil
}
do {
return try await client.logout().flatMap(URL.init(string:))
} catch {
MXLog.error("Failed logging out with error: \(error)")
return nil
}
}
@@ -572,24 +550,20 @@ class ClientProxy: ClientProxyProtocol {
}
func searchUsers(searchTerm: String, limit: UInt) async -> Result<SearchUsersResultsProxy, ClientProxyError> {
await Task.dispatch(on: clientQueue) {
do {
return try .success(.init(sdkResults: self.client.searchUsers(searchTerm: searchTerm, limit: UInt64(limit))))
} catch {
MXLog.error("Failed searching users with error: \(error)")
return .failure(.sdkError(error))
}
do {
return try await .success(.init(sdkResults: client.searchUsers(searchTerm: searchTerm, limit: UInt64(limit))))
} catch {
MXLog.error("Failed searching users with error: \(error)")
return .failure(.sdkError(error))
}
}
func profile(for userID: String) async -> Result<UserProfileProxy, ClientProxyError> {
await Task.dispatch(on: clientQueue) {
do {
return try .success(.init(sdkUserProfile: self.client.getProfile(userId: userID)))
} catch {
MXLog.error("Failed retrieving profile for userID: \(userID) with error: \(error)")
return .failure(.sdkError(error))
}
do {
return try await .success(.init(sdkUserProfile: client.getProfile(userId: userID)))
} catch {
MXLog.error("Failed retrieving profile for userID: \(userID) with error: \(error)")
return .failure(.sdkError(error))
}
}
@@ -815,7 +789,7 @@ class ClientProxy: ClientProxyProtocol {
private func roomTupleForIdentifier(_ identifier: String) async -> (RoomListItem?, Room?) {
do {
let roomListItem = try roomListService?.room(roomId: identifier)
let roomListItem = try await roomListService?.room(roomId: identifier)
if roomListItem?.isTimelineInitialized() == false {
try await roomListItem?.initTimeline(eventTypeFilter: eventFilters, internalIdPrefix: nil)
}
+61 -83
View File
@@ -27,8 +27,6 @@ class RoomProxy: RoomProxyProtocol {
private let room: RoomProtocol
let timeline: TimelineProxyProtocol
private let userInitiatedDispatchQueue = DispatchQueue(label: "io.element.elementx.roomproxy.user_initiated", qos: .userInitiated)
// periphery:ignore - required for instance retention in the rust codebase
private var roomInfoObservationToken: TaskHandle?
// periphery:ignore - required for instance retention in the rust codebase
@@ -58,7 +56,7 @@ class RoomProxy: RoomProxyProtocol {
}
var name: String? {
roomListItem.name()
roomListItem.displayName()
}
var topic: String? {
@@ -182,26 +180,22 @@ class RoomProxy: RoomProxyProtocol {
}
func redact(_ eventID: String) async -> Result<Void, RoomProxyError> {
await Task.dispatch(on: userInitiatedDispatchQueue) {
do {
try self.room.redact(eventId: eventID, reason: nil)
return .success(())
} catch {
MXLog.error("Failed redacting eventID: \(eventID) with error: \(error)")
return .failure(.sdkError(error))
}
do {
try await room.redact(eventId: eventID, reason: nil)
return .success(())
} catch {
MXLog.error("Failed redacting eventID: \(eventID) with error: \(error)")
return .failure(.sdkError(error))
}
}
func reportContent(_ eventID: String, reason: String?) async -> Result<Void, RoomProxyError> {
await Task.dispatch(on: userInitiatedDispatchQueue) {
do {
try self.room.reportContent(eventId: eventID, score: nil, reason: reason)
return .success(())
} catch {
MXLog.error("Failed reporting eventID: \(eventID) with error: \(error)")
return .failure(.sdkError(error))
}
do {
try await room.reportContent(eventId: eventID, score: nil, reason: reason)
return .success(())
} catch {
MXLog.error("Failed reporting eventID: \(eventID) with error: \(error)")
return .failure(.sdkError(error))
}
}
@@ -243,99 +237,83 @@ class RoomProxy: RoomProxyProtocol {
}
func leaveRoom() async -> Result<Void, RoomProxyError> {
await Task.dispatch(on: .global()) {
do {
try self.room.leave()
return .success(())
} catch {
MXLog.error("Failed leaving room with error: \(error)")
return .failure(.sdkError(error))
}
do {
try await room.leave()
return .success(())
} catch {
MXLog.error("Failed leaving room with error: \(error)")
return .failure(.sdkError(error))
}
}
func rejectInvitation() async -> Result<Void, RoomProxyError> {
await Task.dispatch(on: .global()) {
do {
return try .success(self.room.leave())
} catch {
MXLog.error("Failed rejecting invitiation with error: \(error)")
return .failure(.sdkError(error))
}
do {
return try await .success(room.leave())
} catch {
MXLog.error("Failed rejecting invitiation with error: \(error)")
return .failure(.sdkError(error))
}
}
func acceptInvitation() async -> Result<Void, RoomProxyError> {
await Task.dispatch(on: .global()) {
do {
try self.room.join()
return .success(())
} catch {
MXLog.error("Failed accepting invitation with error: \(error)")
return .failure(.sdkError(error))
}
do {
try await room.join()
return .success(())
} catch {
MXLog.error("Failed accepting invitation with error: \(error)")
return .failure(.sdkError(error))
}
}
func invite(userID: String) async -> Result<Void, RoomProxyError> {
await Task.dispatch(on: .global()) {
do {
MXLog.info("Inviting user \(userID)")
return try .success(self.room.inviteUserById(userId: userID))
} catch {
MXLog.error("Failed inviting user \(userID) with error: \(error)")
return .failure(.sdkError(error))
}
do {
MXLog.info("Inviting user \(userID)")
return try await .success(room.inviteUserById(userId: userID))
} catch {
MXLog.error("Failed inviting user \(userID) with error: \(error)")
return .failure(.sdkError(error))
}
}
func setName(_ name: String) async -> Result<Void, RoomProxyError> {
await Task.dispatch(on: .global()) {
do {
return try .success(self.room.setName(name: name))
} catch {
MXLog.error("Failed setting name with error: \(error)")
return .failure(.sdkError(error))
}
do {
return try await .success(room.setName(name: name))
} catch {
MXLog.error("Failed setting name with error: \(error)")
return .failure(.sdkError(error))
}
}
func setTopic(_ topic: String) async -> Result<Void, RoomProxyError> {
await Task.dispatch(on: .global()) {
do {
return try .success(self.room.setTopic(topic: topic))
} catch {
MXLog.error("Failed setting topic with error: \(error)")
return .failure(.sdkError(error))
}
do {
return try await .success(room.setTopic(topic: topic))
} catch {
MXLog.error("Failed setting topic with error: \(error)")
return .failure(.sdkError(error))
}
}
func removeAvatar() async -> Result<Void, RoomProxyError> {
await Task.dispatch(on: .global()) {
do {
return try .success(self.room.removeAvatar())
} catch {
MXLog.error("Failed removing avatar with error: \(error)")
return .failure(.sdkError(error))
}
do {
return try await .success(room.removeAvatar())
} catch {
MXLog.error("Failed removing avatar with error: \(error)")
return .failure(.sdkError(error))
}
}
func uploadAvatar(media: MediaInfo) async -> Result<Void, RoomProxyError> {
await Task.dispatch(on: .global()) {
guard case let .image(imageURL, _, _) = media, let mimeType = media.mimeType else {
MXLog.error("Failed uploading avatar, invalid media: \(media)")
return .failure(.invalidMedia)
}
guard case let .image(imageURL, _, _) = media, let mimeType = media.mimeType else {
MXLog.error("Failed uploading avatar, invalid media: \(media)")
return .failure(.invalidMedia)
}
do {
let data = try Data(contentsOf: imageURL)
return try .success(self.room.uploadAvatar(mimeType: mimeType, data: data, mediaInfo: nil))
} catch {
MXLog.error("Failed uploading avatar with error: \(error)")
return .failure(.sdkError(error))
}
do {
let data = try Data(contentsOf: imageURL)
return try await .success(room.uploadAvatar(mimeType: mimeType, data: data, mediaInfo: nil))
} catch {
MXLog.error("Failed uploading avatar with error: \(error)")
return .failure(.sdkError(error))
}
}
@@ -193,7 +193,7 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
return updatedItems
}
private func fetchRoomInfo(roomListItem: RoomListItemProtocol) -> RoomInfo? {
private func fetchRoomInfo(roomID: String) -> RoomInfo? {
class FetchResult {
var roomInfo: RoomInfo?
}
@@ -203,6 +203,7 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
Task {
do {
let roomListItem = try await roomListService.room(roomId: roomID)
result.roomInfo = try await roomListItem.roomInfo()
} catch {
MXLog.error("Failed fetching room info with error: \(error)")
@@ -214,12 +215,7 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
}
private func buildRoomSummaryForIdentifier(_ identifier: String, invalidated: Bool) -> RoomSummary {
guard let roomListItem = try? roomListService.room(roomId: identifier) else {
MXLog.error("\(name): Failed finding room with id: \(identifier)")
return .empty
}
guard let roomInfo = fetchRoomInfo(roomListItem: roomListItem) else {
guard let roomInfo = fetchRoomInfo(roomID: identifier) else {
return .empty
}
@@ -242,7 +238,7 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
let details = RoomSummaryDetails(id: roomInfo.id,
isInvite: roomInfo.membership == .invited,
inviter: inviterProxy,
name: roomInfo.name ?? roomInfo.id,
name: roomInfo.rawName ?? roomInfo.id,
isDirect: roomInfo.isDirect,
avatarURL: roomInfo.avatarUrl.flatMap(URL.init(string:)),
lastMessage: attributedLastMessage,
@@ -21,9 +21,7 @@ import MatrixRustSDK
final class TimelineProxy: TimelineProxyProtocol {
private let timeline: Timeline
private let lowPriorityDispatchQueue = DispatchQueue(label: "io.element.elementx.roomproxy.low_priority", qos: .utility)
private let messageSendingDispatchQueue = DispatchQueue(label: "io.element.elementx.roomproxy.message_sending", qos: .userInitiated)
private let userInitiatedDispatchQueue = DispatchQueue(label: "io.element.elementx.roomproxy.user_initiated", qos: .userInitiated)
private var backPaginationStatusObservationToken: TaskHandle?
private var roomTimelineObservationToken: TaskHandle?
@@ -104,40 +102,36 @@ final class TimelineProxy: TimelineProxyProtocol {
html: html,
intentionalMentions: intentionalMentions.toRustMentions())
return await Task.dispatch(on: messageSendingDispatchQueue) {
do {
let originalEvent = try self.timeline.getEventTimelineItemByEventId(eventId: eventID)
try self.timeline.edit(newContent: messageContent, editItem: originalEvent)
do {
let originalEvent = try await timeline.getEventTimelineItemByEventId(eventId: eventID)
try await timeline.edit(newContent: messageContent, editItem: originalEvent)
MXLog.info("Finished editing message with original event ID: \(eventID)")
MXLog.info("Finished editing message with original event ID: \(eventID)")
return .success(())
} catch {
MXLog.error("Failed editing message with original event ID: \(eventID) with error: \(error)")
return .failure(.failedEditingMessage)
}
return .success(())
} catch {
MXLog.error("Failed editing message with original event ID: \(eventID) with error: \(error)")
return .failure(.failedEditingMessage)
}
}
func fetchDetails(for eventID: String) {
Task {
await Task.dispatch(on: .global()) {
do {
MXLog.info("Fetching event details for \(eventID)")
try self.timeline.fetchDetailsForEvent(eventId: eventID)
MXLog.info("Finished fetching event details for eventID: \(eventID)")
} catch {
MXLog.error("Failed fetching event details for eventID: \(eventID) with error: \(error)")
}
do {
MXLog.info("Fetching event details for \(eventID)")
try await self.timeline.fetchDetailsForEvent(eventId: eventID)
MXLog.info("Finished fetching event details for eventID: \(eventID)")
} catch {
MXLog.error("Failed fetching event details for eventID: \(eventID) with error: \(error)")
}
}
}
func messageEventContent(for eventID: String) -> RoomMessageEventContentWithoutRelation? {
func messageEventContent(for eventID: String) async -> RoomMessageEventContentWithoutRelation? {
MXLog.info("Fetching event content for \(eventID)")
do {
let result = try timeline.getTimelineEventContentByEventId(eventId: eventID)
let result = try await timeline.getTimelineEventContentByEventId(eventId: eventID)
MXLog.info("Finished fetching event content for eventID: \(eventID)")
return result
} catch {
@@ -366,30 +360,28 @@ final class TimelineProxy: TimelineProxyProtocol {
html: html,
intentionalMentions: intentionalMentions.toRustMentions())
return await Task.dispatch(on: messageSendingDispatchQueue) {
do {
if let eventID {
let replyItem = try self.timeline.getEventTimelineItemByEventId(eventId: eventID)
try self.timeline.sendReply(msg: messageContent, replyItem: replyItem)
MXLog.info("Finished sending reply to eventID: \(eventID)")
} else {
self.timeline.send(msg: messageContent)
MXLog.info("Finished sending message")
}
} catch {
if let eventID {
MXLog.error("Failed sending reply to eventID: \(eventID)")
} else {
MXLog.error("Failed sending message")
}
return .failure(.failedSendingMessage)
do {
if let eventID {
let replyItem = try await timeline.getEventTimelineItemByEventId(eventId: eventID)
try await timeline.sendReply(msg: messageContent, replyItem: replyItem)
MXLog.info("Finished sending reply to eventID: \(eventID)")
} else {
timeline.send(msg: messageContent)
MXLog.info("Finished sending message")
}
self.actionsSubject.send(.sentMessage)
return .success(())
} catch {
if let eventID {
MXLog.error("Failed sending reply to eventID: \(eventID)")
} else {
MXLog.error("Failed sending message")
}
return .failure(.failedSendingMessage)
}
actionsSubject.send(.sentMessage)
return .success(())
}
func sendMessageEventContent(_ messageContent: RoomMessageEventContentWithoutRelation) async -> Result<Void, TimelineProxyError> {
@@ -409,30 +401,26 @@ final class TimelineProxy: TimelineProxyProtocol {
func sendReadReceipt(for eventID: String, type: ReceiptType) async -> Result<Void, TimelineProxyError> {
MXLog.verbose("Sending read receipt for eventID: \(eventID)")
return await Task.dispatch(on: lowPriorityDispatchQueue) {
do {
try self.timeline.sendReadReceipt(receiptType: type, eventId: eventID)
MXLog.info("Finished sending read receipt for eventID: \(eventID)")
return .success(())
} catch {
MXLog.error("Failed sending read receipt for eventID: \(eventID) with error: \(error)")
return .failure(.failedSendingReadReceipt)
}
do {
try await timeline.sendReadReceipt(receiptType: type, eventId: eventID)
MXLog.info("Finished sending read receipt for eventID: \(eventID)")
return .success(())
} catch {
MXLog.error("Failed sending read receipt for eventID: \(eventID) with error: \(error)")
return .failure(.failedSendingReadReceipt)
}
}
func toggleReaction(_ reaction: String, to eventID: String) async -> Result<Void, TimelineProxyError> {
MXLog.info("Toggling reaction for eventID: \(eventID)")
return await Task.dispatch(on: userInitiatedDispatchQueue) {
do {
try self.timeline.toggleReaction(eventId: eventID, key: reaction)
MXLog.info("Finished toggling reaction for eventID: \(eventID)")
return .success(())
} catch {
MXLog.error("Failed toggling reaction for eventID: \(eventID)")
return .failure(.failedSendingReaction)
}
do {
try await timeline.toggleReaction(eventId: eventID, key: reaction)
MXLog.info("Finished toggling reaction for eventID: \(eventID)")
return .success(())
} catch {
MXLog.error("Failed toggling reaction for eventID: \(eventID)")
return .failure(.failedSendingReaction)
}
}
@@ -464,9 +452,7 @@ final class TimelineProxy: TimelineProxyProtocol {
MXLog.info("Editing poll with eventID: \(eventID)")
do {
let originalEvent = try await Task.dispatch(on: .global()) {
try self.timeline.getEventTimelineItemByEventId(eventId: eventID)
}
let originalEvent = try await timeline.getEventTimelineItemByEventId(eventId: eventID)
try await timeline.editPoll(question: question, answers: answers, maxSelections: 1, pollKind: .init(pollKind: pollKind), editItem: originalEvent)
@@ -57,7 +57,7 @@ protocol TimelineProxyProtocol {
func fetchDetails(for eventID: String)
func messageEventContent(for eventID: String) -> RoomMessageEventContentWithoutRelation?
func messageEventContent(for eventID: String) async -> RoomMessageEventContentWithoutRelation?
func retryDecryption(for sessionID: String) async
@@ -68,7 +68,7 @@ class UserSessionStore: UserSessionStoreProtocol {
func userSession(for client: Client, passphrase: String?) async -> Result<UserSessionProtocol, UserSessionStoreError> {
do {
let session = try client.session()
let session = try await client.session()
let userID = try client.userId()
let clientProxy = await setupProxyForClient(client)
@@ -133,9 +133,7 @@ class UserSessionStore: UserSessionStoreProtocol {
do {
let client = try await completeBuilder.build()
try await Task.dispatch(on: .global()) {
try client.restoreSession(session: credentials.restorationToken.session)
}
try await client.restoreSession(session: credentials.restorationToken.session)
return await .success(setupProxyForClient(client))
} catch {