From f9f9fff00554eb3e6979656fae065500dfd3934f Mon Sep 17 00:00:00 2001 From: Sasha Weiss Date: Thu, 27 Jun 2024 09:51:34 -0700 Subject: [PATCH] Reduce indirection in MessageBackup typealiases --- .../MessageBackupAccountDataArchiver.swift | 14 +++---- .../Chat/MessageBackupChatArchiver.swift | 15 ++++---- .../MessageBackupGroupCallArchiver.swift | 9 ++--- .../MessageBackupIndividualCallArchiver.swift | 9 ++--- ...sageBackupGroupUpdateMessageArchiver.swift | 11 +++--- .../MessageBackupChatItemArchiverImpl.swift | 10 +++-- .../MessageBackupInteractionArchiver.swift | 8 ++-- .../MessageBackupReactionArchiver.swift | 7 ++-- ...ssageBackupTSIncomingMessageArchiver.swift | 3 +- ...ssageBackupTSMessageContentsArchiver.swift | 38 ++++++++++--------- ...ssageBackupTSOutgoingMessageArchiver.swift | 5 ++- .../MessageBackupProtoArchiver.swift | 17 ++++++--- ...essageBackupContactRecipientArchiver.swift | 6 +-- ...kupDistributionListRecipientArchiver.swift | 7 ++-- .../MessageBackupGroupRecipientArchiver.swift | 5 ++- .../MessageBackupLocalRecipientArchiver.swift | 34 ++++++++--------- .../MessageBackupRecipientArchiver.swift | 6 +-- 17 files changed, 107 insertions(+), 97 deletions(-) diff --git a/SignalServiceKit/MessageBackup/Archivers/AccountData/MessageBackupAccountDataArchiver.swift b/SignalServiceKit/MessageBackup/Archivers/AccountData/MessageBackupAccountDataArchiver.swift index 84c993a814..d7b9e97804 100644 --- a/SignalServiceKit/MessageBackup/Archivers/AccountData/MessageBackupAccountDataArchiver.swift +++ b/SignalServiceKit/MessageBackup/Archivers/AccountData/MessageBackupAccountDataArchiver.swift @@ -19,18 +19,14 @@ extension MessageBackup { public var idLogString: String { "localUser" } } - public enum ArchiveAccountDataResult { - case success - case failure(ArchiveFrameError) - } + public typealias ArchiveAccountDataResult = ArchiveSingleFrameResult + public typealias RestoreAccountDataResult = RestoreFrameResult } /** * Archives the ``BackupProto.AccountData`` frame */ public protocol MessageBackupAccountDataArchiver: MessageBackupProtoArchiver { - typealias RestoreFrameResult = MessageBackup.RestoreFrameResult - func archiveAccountData( stream: MessageBackupProtoOutputStream, tx: DBReadTransaction @@ -39,7 +35,7 @@ public protocol MessageBackupAccountDataArchiver: MessageBackupProtoArchiver { func restore( _ accountData: BackupProto.AccountData, tx: DBWriteTransaction - ) -> RestoreFrameResult + ) -> MessageBackup.RestoreAccountDataResult } public class MessageBackupAccountDataArchiverImpl: MessageBackupAccountDataArchiver { @@ -129,7 +125,7 @@ public class MessageBackupAccountDataArchiverImpl: MessageBackupAccountDataArchi if let error { return .failure(error) } else { - return .success + return .success(()) } } @@ -223,7 +219,7 @@ public class MessageBackupAccountDataArchiverImpl: MessageBackupAccountDataArchi public func restore( _ accountData: BackupProto.AccountData, tx: DBWriteTransaction - ) -> RestoreFrameResult { + ) -> MessageBackup.RestoreAccountDataResult { guard let profileKey = OWSAES256Key(data: accountData.profileKey) else { return .failure([.restoreFrameError( .invalidProtoData(.invalidLocalProfileKey), diff --git a/SignalServiceKit/MessageBackup/Archivers/Chat/MessageBackupChatArchiver.swift b/SignalServiceKit/MessageBackup/Archivers/Chat/MessageBackupChatArchiver.swift index 9386e9702f..e3ea6cf803 100644 --- a/SignalServiceKit/MessageBackup/Archivers/Chat/MessageBackupChatArchiver.swift +++ b/SignalServiceKit/MessageBackup/Archivers/Chat/MessageBackupChatArchiver.swift @@ -12,6 +12,8 @@ public protocol MessageBackupChatArchiver: MessageBackupProtoArchiver { typealias ArchiveMultiFrameResult = MessageBackup.ArchiveMultiFrameResult + typealias RestoreFrameResult = MessageBackup.RestoreFrameResult + /// Archive all ``TSThread``s (they map to ``BackupProto.Chat``). /// /// - Returns: ``ArchiveMultiFrameResult.success`` if all frames were written without error, or either @@ -26,8 +28,6 @@ public protocol MessageBackupChatArchiver: MessageBackupProtoArchiver { tx: DBReadTransaction ) -> ArchiveMultiFrameResult - typealias RestoreFrameResult = MessageBackup.RestoreFrameResult - /// Restore a single ``BackupProto.Chat`` frame. /// /// - Returns: ``RestoreFrameResult.success`` if all frames were read without error. @@ -41,6 +41,7 @@ public protocol MessageBackupChatArchiver: MessageBackupProtoArchiver { } public class MessageBackupChatArchiverImpl: MessageBackupChatArchiver { + private typealias ArchiveFrameError = MessageBackup.ArchiveFrameError private let dmConfigurationStore: DisappearingMessagesConfigurationStore private let pinnedThreadManager: PinnedThreadManager @@ -64,7 +65,7 @@ public class MessageBackupChatArchiverImpl: MessageBackupChatArchiver { tx: DBReadTransaction ) -> ArchiveMultiFrameResult { var completeFailureError: MessageBackup.FatalArchivingError? - var partialErrors = [ArchiveMultiFrameResult.ArchiveFrameError]() + var partialErrors = [ArchiveFrameError]() func archiveThread(_ thread: TSThread, stop: inout Bool) { let result: ArchiveMultiFrameResult @@ -128,7 +129,7 @@ public class MessageBackupChatArchiverImpl: MessageBackupChatArchiver { stream: MessageBackupProtoOutputStream, context: MessageBackup.ChatArchivingContext, tx: DBReadTransaction - ) -> MessageBackupChatArchiver.ArchiveMultiFrameResult { + ) -> ArchiveMultiFrameResult { let chatId = context.assignChatId(to: MessageBackup.ChatThread.contact(thread).uniqueId) return archiveThread( @@ -146,7 +147,7 @@ public class MessageBackupChatArchiverImpl: MessageBackupChatArchiver { stream: MessageBackupProtoOutputStream, context: MessageBackup.ChatArchivingContext, tx: DBReadTransaction - ) -> MessageBackupChatArchiver.ArchiveMultiFrameResult { + ) -> ArchiveMultiFrameResult { let chatId = context.assignChatId(to: MessageBackup.ChatThread.contact(thread).uniqueId) let contactServiceId: ServiceId? = thread.contactUUID.flatMap { try? ServiceId.parseFrom(serviceIdString: $0) } @@ -184,7 +185,7 @@ public class MessageBackupChatArchiverImpl: MessageBackupChatArchiver { stream: MessageBackupProtoOutputStream, context: MessageBackup.ChatArchivingContext, tx: DBReadTransaction - ) -> MessageBackupChatArchiver.ArchiveMultiFrameResult { + ) -> ArchiveMultiFrameResult { let chatId = context.assignChatId(to: MessageBackup.ChatThread.groupV2(thread).uniqueId) let recipientAddress = MessageBackup.RecipientArchivingContext.Address.group(thread.groupId) @@ -212,7 +213,7 @@ public class MessageBackupChatArchiverImpl: MessageBackupChatArchiver { stream: MessageBackupProtoOutputStream, context: MessageBackup.ChatArchivingContext, tx: DBReadTransaction - ) -> MessageBackupChatArchiver.ArchiveMultiFrameResult { + ) -> ArchiveMultiFrameResult { let threadAssociatedData = threadStore.fetchOrDefaultAssociatedData(for: thread, tx: tx) let thisThreadPinnedOrder: UInt32 diff --git a/SignalServiceKit/MessageBackup/Archivers/ChatItem/ChatUpdateMessages/Calls/MessageBackupGroupCallArchiver.swift b/SignalServiceKit/MessageBackup/Archivers/ChatItem/ChatUpdateMessages/Calls/MessageBackupGroupCallArchiver.swift index 69c52ad039..2c0d449110 100644 --- a/SignalServiceKit/MessageBackup/Archivers/ChatItem/ChatUpdateMessages/Calls/MessageBackupGroupCallArchiver.swift +++ b/SignalServiceKit/MessageBackup/Archivers/ChatItem/ChatUpdateMessages/Calls/MessageBackupGroupCallArchiver.swift @@ -6,10 +6,9 @@ import LibSignalClient final class MessageBackupGroupCallArchiver { - typealias ArchiveChatUpdateMessageResult = MessageBackupChatUpdateMessageArchiver.ArchiveChatUpdateMessageResult - typealias RestoreChatUpdateMessageResult = MessageBackupChatUpdateMessageArchiver.RestoreChatUpdateMessageResult - - private typealias Details = MessageBackup.InteractionArchiveDetails + typealias Details = MessageBackup.InteractionArchiveDetails + typealias ArchiveChatUpdateMessageResult = MessageBackup.ArchiveInteractionResult
+ typealias RestoreChatUpdateMessageResult = MessageBackup.RestoreInteractionResult private let callRecordStore: CallRecordStore private let groupCallRecordManager: GroupCallRecordManager @@ -114,7 +113,7 @@ final class MessageBackupGroupCallArchiver { chatThread: MessageBackup.ChatThread, context: MessageBackup.ChatRestoringContext, tx: DBWriteTransaction - ) -> MessageBackup.RestoreInteractionResult { + ) -> RestoreChatUpdateMessageResult { let groupThread: TSGroupThread switch chatThread { case .groupV2(let _groupThread): diff --git a/SignalServiceKit/MessageBackup/Archivers/ChatItem/ChatUpdateMessages/Calls/MessageBackupIndividualCallArchiver.swift b/SignalServiceKit/MessageBackup/Archivers/ChatItem/ChatUpdateMessages/Calls/MessageBackupIndividualCallArchiver.swift index ff47cec351..1c4ea395c5 100644 --- a/SignalServiceKit/MessageBackup/Archivers/ChatItem/ChatUpdateMessages/Calls/MessageBackupIndividualCallArchiver.swift +++ b/SignalServiceKit/MessageBackup/Archivers/ChatItem/ChatUpdateMessages/Calls/MessageBackupIndividualCallArchiver.swift @@ -4,10 +4,9 @@ // final class MessageBackupIndividualCallArchiver { - typealias ArchiveChatUpdateMessageResult = MessageBackupChatUpdateMessageArchiver.ArchiveChatUpdateMessageResult - typealias RestoreChatUpdateMessageResult = MessageBackupChatUpdateMessageArchiver.RestoreChatUpdateMessageResult - - private typealias Details = MessageBackup.InteractionArchiveDetails + typealias Details = MessageBackup.InteractionArchiveDetails + typealias ArchiveChatUpdateMessageResult = MessageBackup.ArchiveInteractionResult
+ typealias RestoreChatUpdateMessageResult = MessageBackup.RestoreInteractionResult private let callRecordStore: CallRecordStore private let individualCallRecordManager: IndividualCallRecordManager @@ -109,7 +108,7 @@ final class MessageBackupIndividualCallArchiver { chatThread: MessageBackup.ChatThread, context: MessageBackup.ChatRestoringContext, tx: DBWriteTransaction - ) -> MessageBackup.RestoreInteractionResult { + ) -> RestoreChatUpdateMessageResult { let contactThread: TSContactThread switch chatThread { case .contact(let _contactThread): diff --git a/SignalServiceKit/MessageBackup/Archivers/ChatItem/ChatUpdateMessages/GroupUpdates/MessageBackupGroupUpdateMessageArchiver.swift b/SignalServiceKit/MessageBackup/Archivers/ChatItem/ChatUpdateMessages/GroupUpdates/MessageBackupGroupUpdateMessageArchiver.swift index 069368d0bf..d10da5b468 100644 --- a/SignalServiceKit/MessageBackup/Archivers/ChatItem/ChatUpdateMessages/GroupUpdates/MessageBackupGroupUpdateMessageArchiver.swift +++ b/SignalServiceKit/MessageBackup/Archivers/ChatItem/ChatUpdateMessages/GroupUpdates/MessageBackupGroupUpdateMessageArchiver.swift @@ -7,11 +7,12 @@ import Foundation import LibSignalClient final class MessageBackupGroupUpdateMessageArchiver { - typealias ArchiveChatUpdateMessageResult = MessageBackupChatUpdateMessageArchiver.ArchiveChatUpdateMessageResult - typealias RestoreChatUpdateMessageResult = MessageBackupChatUpdateMessageArchiver.RestoreChatUpdateMessageResult + typealias Details = MessageBackup.InteractionArchiveDetails + typealias ArchiveChatUpdateMessageResult = MessageBackup.ArchiveInteractionResult
+ typealias RestoreChatUpdateMessageResult = MessageBackup.RestoreInteractionResult + private typealias ArchiveFrameError = MessageBackup.ArchiveFrameError private typealias PersistableGroupUpdateItem = TSInfoMessage.PersistableGroupUpdateItem - private typealias Details = MessageBackup.InteractionArchiveDetails private let groupUpdateBuilder: GroupUpdateItemBuilder private let groupUpdateHelper: GroupUpdateInfoMessageInserterBackupHelper @@ -65,7 +66,7 @@ final class MessageBackupGroupUpdateMessageArchiver { groupUpdateItems = persistableGroupUpdateItemsWrapper.updateItems } - var partialErrors = [MessageBackupChatItemArchiver.ArchiveMultiFrameResult.ArchiveFrameError]() + var partialErrors = [ArchiveFrameError]() let contentsResult = Self.archiveGroupUpdates( groupUpdates: groupUpdateItems, @@ -106,7 +107,7 @@ final class MessageBackupGroupUpdateMessageArchiver { groupUpdates: [TSInfoMessage.PersistableGroupUpdateItem], interactionId: MessageBackup.InteractionUniqueId, localIdentifiers: LocalIdentifiers, - partialErrors: inout [MessageBackupChatItemArchiver.ArchiveMultiFrameResult.ArchiveFrameError] + partialErrors: inout [ArchiveFrameError] ) -> MessageBackup.ArchiveInteractionResult { var updates = [BackupProto.GroupChangeChatUpdate.Update]() diff --git a/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupChatItemArchiverImpl.swift b/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupChatItemArchiverImpl.swift index 3dbfe9b921..54f65c8be6 100644 --- a/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupChatItemArchiverImpl.swift +++ b/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupChatItemArchiverImpl.swift @@ -7,6 +7,7 @@ import Foundation import LibSignalClient public class MessageBackupChatItemArchiverImpl: MessageBackupChatItemArchiver { + private typealias ArchiveFrameError = MessageBackup.ArchiveFrameError private let callRecordStore: CallRecordStore private let dateProvider: DateProvider @@ -80,7 +81,7 @@ public class MessageBackupChatItemArchiverImpl: MessageBackupChatItemArchiver { tx: DBReadTransaction ) -> ArchiveMultiFrameResult { var completeFailureError: MessageBackup.FatalArchivingError? - var partialFailures = [ArchiveMultiFrameResult.ArchiveFrameError]() + var partialFailures = [ArchiveFrameError]() func archiveInteraction( _ interaction: TSInteraction, @@ -150,7 +151,7 @@ public class MessageBackupChatItemArchiverImpl: MessageBackupChatItemArchiver { context: MessageBackup.ChatArchivingContext, tx: DBReadTransaction ) -> ArchiveMultiFrameResult { - var partialErrors = [ArchiveMultiFrameResult.ArchiveFrameError]() + var partialErrors = [ArchiveFrameError]() guard let chatId = context[interaction.uniqueThreadIdentifier] else { partialErrors.append(.archiveFrameError( @@ -178,7 +179,10 @@ public class MessageBackupChatItemArchiverImpl: MessageBackupChatItemArchiver { case .success(let deets): details = deets - case .isPastRevision, .skippableGroupUpdate, .notYetImplemented: + case + .isPastRevision, + .skippableGroupUpdate, + .notYetImplemented: // Skip! Say it succeeded so we ignore it. return .success diff --git a/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupInteractionArchiver.swift b/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupInteractionArchiver.swift index a211ababb4..9ac7d2ebdb 100644 --- a/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupInteractionArchiver.swift +++ b/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupInteractionArchiver.swift @@ -45,8 +45,6 @@ extension MessageBackup { } internal enum ArchiveInteractionResult { - typealias ArchiveFrameError = MessageBackupChatItemArchiver.ArchiveMultiFrameResult.ArchiveFrameError - case success(Component) // MARK: Skips @@ -65,10 +63,10 @@ extension MessageBackup { /// Some portion of the interaction failed to archive, but we can still archive the rest of it. /// e.g. some recipient details are missing, so we archive without that recipient. - case partialFailure(Component, [ArchiveFrameError]) + case partialFailure(Component, [ArchiveFrameError]) /// The entire message failed and should be skipped. /// Other messages are unaffected. - case messageFailure([ArchiveFrameError]) + case messageFailure([ArchiveFrameError]) /// Catastrophic failure, which should stop _all_ message archiving. case completeFailure(FatalArchivingError) } @@ -142,7 +140,7 @@ extension MessageBackup.ArchiveInteractionResult { /// } func bubbleUp( _ resultType: ErrorResultType.Type = ErrorResultType.self, - partialErrors: inout [ArchiveFrameError] + partialErrors: inout [MessageBackup.ArchiveFrameError] ) -> BubbleUp { switch self { case .success(let value): diff --git a/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupReactionArchiver.swift b/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupReactionArchiver.swift index 5e740b6e40..30b3de6762 100644 --- a/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupReactionArchiver.swift +++ b/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupReactionArchiver.swift @@ -7,12 +7,11 @@ import Foundation import LibSignalClient internal class MessageBackupReactionArchiver: MessageBackupProtoArchiver { + private typealias ArchiveFrameError = MessageBackup.ArchiveFrameError private let reactionStore: ReactionStore - init( - reactionStore: ReactionStore - ) { + init(reactionStore: ReactionStore) { self.reactionStore = reactionStore } @@ -25,7 +24,7 @@ internal class MessageBackupReactionArchiver: MessageBackupProtoArchiver { ) -> MessageBackup.ArchiveInteractionResult<[BackupProto.Reaction]> { let reactions = reactionStore.allReactions(messageId: message.uniqueId, tx: tx) - var errors = [MessageBackupChatItemArchiver.ArchiveMultiFrameResult.ArchiveFrameError]() + var errors = [ArchiveFrameError]() var reactionProtos = [BackupProto.Reaction]() for reaction in reactions { diff --git a/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupTSIncomingMessageArchiver.swift b/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupTSIncomingMessageArchiver.swift index 0c40687f27..bec4d1be7b 100644 --- a/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupTSIncomingMessageArchiver.swift +++ b/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupTSIncomingMessageArchiver.swift @@ -7,6 +7,7 @@ import Foundation import LibSignalClient internal class MessageBackupTSIncomingMessageArchiver: MessageBackupInteractionArchiver { + private typealias ArchiveFrameError = MessageBackup.ArchiveFrameError static let archiverType: MessageBackup.ChatItemArchiverType = .incomingMessage @@ -35,7 +36,7 @@ internal class MessageBackupTSIncomingMessageArchiver: MessageBackupInteractionA ))) } - var partialErrors = [MessageBackupChatItemArchiver.ArchiveMultiFrameResult.ArchiveFrameError]() + var partialErrors = [ArchiveFrameError]() let directionalDetails: Details.DirectionalDetails switch buildIncomingMessageDetails(message).bubbleUp(Details.self, partialErrors: &partialErrors) { diff --git a/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupTSMessageContentsArchiver.swift b/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupTSMessageContentsArchiver.swift index edf441772c..68ce64bc9b 100644 --- a/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupTSMessageContentsArchiver.swift +++ b/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupTSMessageContentsArchiver.swift @@ -59,6 +59,12 @@ internal class MessageBackupTSMessageContentsArchiver: MessageBackupProtoArchive typealias ChatItemType = MessageBackup.InteractionArchiveDetails.ChatItemType + typealias ArchiveInteractionResult = MessageBackup.ArchiveInteractionResult + typealias RestoreInteractionResult = MessageBackup.RestoreInteractionResult + + private typealias ArchiveFrameError = MessageBackup.ArchiveFrameError + private typealias RestoreFrameError = MessageBackup.RestoreFrameError + private let interactionStore: InteractionStore private let reactionArchiver: MessageBackupReactionArchiver @@ -76,14 +82,14 @@ internal class MessageBackupTSMessageContentsArchiver: MessageBackupProtoArchive _ message: TSMessage, context: MessageBackup.RecipientArchivingContext, tx: DBReadTransaction - ) -> MessageBackup.ArchiveInteractionResult { + ) -> ArchiveInteractionResult { guard let body = message.body else { // TODO: handle non simple text messages. return .notYetImplemented } var standardMessage = BackupProto.StandardMessage() - var partialErrors = [MessageBackup.ArchiveInteractionResult.ArchiveFrameError]() + var partialErrors = [ArchiveFrameError]() let text: BackupProto.Text let textResult = archiveText( @@ -140,7 +146,7 @@ internal class MessageBackupTSMessageContentsArchiver: MessageBackupProtoArchive private func archiveText( _ messageBody: MessageBody, interactionUniqueId: MessageBackup.InteractionUniqueId - ) -> MessageBackup.ArchiveInteractionResult { + ) -> ArchiveInteractionResult { var text = BackupProto.Text(body: messageBody.text) for bodyRangeParam in messageBody.ranges.toProtoBodyRanges() { @@ -177,8 +183,8 @@ internal class MessageBackupTSMessageContentsArchiver: MessageBackupProtoArchive _ quotedMessage: TSQuotedMessage, interactionUniqueId: MessageBackup.InteractionUniqueId, context: MessageBackup.RecipientArchivingContext - ) -> MessageBackup.ArchiveInteractionResult { - var partialErrors = [MessageBackup.ArchiveInteractionResult.ArchiveFrameError]() + ) -> ArchiveInteractionResult { + var partialErrors = [ArchiveFrameError]() guard let authorAddress = quotedMessage.authorAddress.asSingleServiceIdBackupAddress() else { // Fail the whole message if we fail archiving a quote. @@ -219,8 +225,6 @@ internal class MessageBackupTSMessageContentsArchiver: MessageBackupProtoArchive // MARK: - Restoring - typealias RestoreResult = MessageBackup.RestoreInteractionResult - /// Parses the proto structure of message contents into /// into ``MessageBackup.RestoredMessageContents``, which map more directly /// to the ``TSMessage`` values in our database. @@ -236,7 +240,7 @@ internal class MessageBackupTSMessageContentsArchiver: MessageBackupProtoArchive chatThread: MessageBackup.ChatThread, context: MessageBackup.ChatRestoringContext, tx: DBWriteTransaction - ) -> RestoreResult { + ) -> RestoreInteractionResult { switch chatItemType { case .standardMessage(let standardMessage): return restoreStandardMessage( @@ -267,8 +271,8 @@ internal class MessageBackupTSMessageContentsArchiver: MessageBackupProtoArchive restoredContents: MessageBackup.RestoredMessageContents, context: MessageBackup.ChatRestoringContext, tx: DBWriteTransaction - ) -> MessageBackup.RestoreInteractionResult { - let restoreReactionsResult: MessageBackup.RestoreInteractionResult + ) -> RestoreInteractionResult { + let restoreReactionsResult: RestoreInteractionResult switch restoredContents { case .text(let text): restoreReactionsResult = reactionArchiver.restoreReactions( @@ -291,8 +295,8 @@ internal class MessageBackupTSMessageContentsArchiver: MessageBackupProtoArchive chatThread: MessageBackup.ChatThread, context: MessageBackup.ChatRestoringContext, tx: DBReadTransaction - ) -> RestoreResult { - var partialErrors = [MessageBackup.RestoreFrameError]() + ) -> RestoreInteractionResult { + var partialErrors = [RestoreFrameError]() let quotedMessage: TSQuotedMessage? if let quoteProto = standardMessage.quote { @@ -342,7 +346,7 @@ internal class MessageBackupTSMessageContentsArchiver: MessageBackupProtoArchive func restoreMessageBody( _ text: BackupProto.Text, chatItemId: MessageBackup.ChatItemId - ) -> MessageBackup.RestoreInteractionResult { + ) -> RestoreInteractionResult { return restoreMessageBody( text: text.body, bodyRangeProtos: text.bodyRanges, @@ -354,8 +358,8 @@ internal class MessageBackupTSMessageContentsArchiver: MessageBackupProtoArchive text: String, bodyRangeProtos: [BackupProto.BodyRange], chatItemId: MessageBackup.ChatItemId - ) -> MessageBackup.RestoreInteractionResult { - var partialErrors = [MessageBackup.RestoreFrameError]() + ) -> RestoreInteractionResult { + var partialErrors = [RestoreFrameError]() var bodyMentions = [NSRange: Aci]() var bodyStyles = [NSRangedValue]() for bodyRange in bodyRangeProtos { @@ -421,7 +425,7 @@ internal class MessageBackupTSMessageContentsArchiver: MessageBackupProtoArchive thread: MessageBackup.ChatThread, context: MessageBackup.ChatRestoringContext, tx: DBReadTransaction - ) -> MessageBackup.RestoreInteractionResult { + ) -> RestoreInteractionResult { let authorAddress: MessageBackup.InteropAddress switch context.recipientContext[quote.authorRecipientId] { case .none: @@ -447,7 +451,7 @@ internal class MessageBackupTSMessageContentsArchiver: MessageBackupProtoArchive authorAddress = contactAddress.asInteropAddress() } - var partialErrors = [MessageBackup.RestoreFrameError]() + var partialErrors = [RestoreFrameError]() let targetMessageTimestamp: NSNumber? if diff --git a/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupTSOutgoingMessageArchiver.swift b/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupTSOutgoingMessageArchiver.swift index 000c3285fd..6351948fdb 100644 --- a/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupTSOutgoingMessageArchiver.swift +++ b/SignalServiceKit/MessageBackup/Archivers/ChatItem/MessageBackupTSOutgoingMessageArchiver.swift @@ -7,6 +7,7 @@ import Foundation import LibSignalClient internal class MessageBackupTSOutgoingMessageArchiver: MessageBackupInteractionArchiver { + private typealias ArchiveFrameError = MessageBackup.ArchiveFrameError static let archiverType: MessageBackup.ChatItemArchiverType = .outgoingMessage @@ -38,7 +39,7 @@ internal class MessageBackupTSOutgoingMessageArchiver: MessageBackupInteractionA ))) } - var partialErrors = [MessageBackupChatItemArchiver.ArchiveMultiFrameResult.ArchiveFrameError]() + var partialErrors = [ArchiveFrameError]() let wasAnySendSealedSender: Bool let directionalDetails: Details.DirectionalDetails @@ -90,7 +91,7 @@ internal class MessageBackupTSOutgoingMessageArchiver: MessageBackupInteractionA _ message: TSOutgoingMessage, recipientContext: MessageBackup.RecipientArchivingContext ) -> MessageBackup.ArchiveInteractionResult { - var perRecipientErrors = [MessageBackup.ArchiveInteractionResult.ArchiveFrameError]() + var perRecipientErrors = [ArchiveFrameError]() var wasAnySendSealedSender = false var outgoingMessage = BackupProto.ChatItem.OutgoingMessageDetails() diff --git a/SignalServiceKit/MessageBackup/Archivers/MessageBackupProtoArchiver.swift b/SignalServiceKit/MessageBackup/Archivers/MessageBackupProtoArchiver.swift index 8eeb55dfac..db64b2fac0 100644 --- a/SignalServiceKit/MessageBackup/Archivers/MessageBackupProtoArchiver.swift +++ b/SignalServiceKit/MessageBackup/Archivers/MessageBackupProtoArchiver.swift @@ -15,20 +15,27 @@ public protocol MessageBackupLoggableId { extension MessageBackup { - /// Note the "multi"; covers the archiving of multiple frames, typically - /// batched by type. - public enum ArchiveMultiFrameResult { - public typealias ArchiveFrameError = MessageBackup.ArchiveFrameError + /// Represents the result of archiving a single frame. + public enum ArchiveSingleFrameResult { + case success(SuccessType) + case failure(ArchiveFrameError) + } + /// Represents the result of archiving multiple frames of the same type at + /// once. + public enum ArchiveMultiFrameResult { case success /// We managed to write some frames, but failed for others. /// Note that some errors _may_ be terminal; the caller should check. - case partialSuccess([ArchiveFrameError]) + case partialSuccess([ArchiveFrameError]) /// Catastrophic failure, e.g. we failed to read from the database at all /// for an entire category of frame. case completeFailure(FatalArchivingError) } + /// Represents the result of restoring a single frame. + /// - Note + /// Frames are always restored individually. public enum RestoreFrameResult { case success /// We managed to restore some part of the frame, meaning it is represented in our database. diff --git a/SignalServiceKit/MessageBackup/Archivers/Recipient/MessageBackupContactRecipientArchiver.swift b/SignalServiceKit/MessageBackup/Archivers/Recipient/MessageBackupContactRecipientArchiver.swift index a4014743f7..90655e8508 100644 --- a/SignalServiceKit/MessageBackup/Archivers/Recipient/MessageBackupContactRecipientArchiver.swift +++ b/SignalServiceKit/MessageBackup/Archivers/Recipient/MessageBackupContactRecipientArchiver.swift @@ -11,6 +11,8 @@ import LibSignalClient * ``BackupProto.Recipient``. */ public class MessageBackupContactRecipientArchiver: MessageBackupRecipientDestinationArchiver { + private typealias ArchivingAddress = MessageBackup.RecipientArchivingContext.Address + private typealias ArchiveFrameError = MessageBackup.ArchiveFrameError private let blockingManager: MessageBackup.Shims.BlockingManager private let profileManager: MessageBackup.Shims.ProfileManager @@ -44,8 +46,6 @@ public class MessageBackupContactRecipientArchiver: MessageBackupRecipientDestin self.usernameLookupManager = usernameLookupManager } - private typealias ArchivingAddress = MessageBackup.RecipientArchivingContext.Address - public func archiveRecipients( stream: MessageBackupProtoOutputStream, context: MessageBackup.RecipientArchivingContext, @@ -54,7 +54,7 @@ public class MessageBackupContactRecipientArchiver: MessageBackupRecipientDestin let whitelistedAddresses = Set(profileManager.allWhitelistedAddresses(tx: tx)) let blockedAddresses = blockingManager.blockedAddresses(tx: tx) - var errors = [ArchiveMultiFrameResult.ArchiveFrameError]() + var errors = [ArchiveFrameError]() recipientDatabaseTable.enumerateAll(tx: tx) { recipient in guard diff --git a/SignalServiceKit/MessageBackup/Archivers/Recipient/MessageBackupDistributionListRecipientArchiver.swift b/SignalServiceKit/MessageBackup/Archivers/Recipient/MessageBackupDistributionListRecipientArchiver.swift index 4457958afd..9b5785342f 100644 --- a/SignalServiceKit/MessageBackup/Archivers/Recipient/MessageBackupDistributionListRecipientArchiver.swift +++ b/SignalServiceKit/MessageBackup/Archivers/Recipient/MessageBackupDistributionListRecipientArchiver.swift @@ -6,6 +6,7 @@ import Foundation public class MessageBackupDistributionListRecipientArchiver: MessageBackupRecipientDestinationArchiver { + private typealias ArchiveFrameError = MessageBackup.ArchiveFrameError private let storyStore: StoryStore private let threadStore: ThreadStore @@ -23,7 +24,7 @@ public class MessageBackupDistributionListRecipientArchiver: MessageBackupRecipi context: MessageBackup.RecipientArchivingContext, tx: DBReadTransaction ) -> ArchiveMultiFrameResult { - var errors = [ArchiveMultiFrameResult.ArchiveFrameError]() + var errors = [ArchiveFrameError]() do { // enumerate deleted threads @@ -61,7 +62,7 @@ public class MessageBackupDistributionListRecipientArchiver: MessageBackupRecipi _ storyThread: TSPrivateStoryThread, stream: MessageBackupProtoOutputStream, context: MessageBackup.RecipientArchivingContext, - errors: inout [ArchiveMultiFrameResult.ArchiveFrameError], + errors: inout [ArchiveFrameError], tx: DBReadTransaction ) { // Skip deleted distribution lists @@ -146,7 +147,7 @@ public class MessageBackupDistributionListRecipientArchiver: MessageBackupRecipi distributionId: Data, stream: MessageBackupProtoOutputStream, context: MessageBackup.RecipientArchivingContext, - errors: inout [ArchiveMultiFrameResult.ArchiveFrameError], + errors: inout [ArchiveFrameError], tx: DBReadTransaction ) { let distributionListAppId: RecipientAppId = .distributionList(distributionId) diff --git a/SignalServiceKit/MessageBackup/Archivers/Recipient/MessageBackupGroupRecipientArchiver.swift b/SignalServiceKit/MessageBackup/Archivers/Recipient/MessageBackupGroupRecipientArchiver.swift index 101399cd92..753370dc75 100644 --- a/SignalServiceKit/MessageBackup/Archivers/Recipient/MessageBackupGroupRecipientArchiver.swift +++ b/SignalServiceKit/MessageBackup/Archivers/Recipient/MessageBackupGroupRecipientArchiver.swift @@ -16,6 +16,7 @@ import LibSignalClient * in the proto. */ public class MessageBackupGroupRecipientArchiver: MessageBackupRecipientDestinationArchiver { + private typealias ArchiveFrameError = MessageBackup.ArchiveFrameError private let disappearingMessageConfigStore: DisappearingMessagesConfigurationStore private let groupsV2: GroupsV2 @@ -44,7 +45,7 @@ public class MessageBackupGroupRecipientArchiver: MessageBackupRecipientDestinat context: MessageBackup.RecipientArchivingContext, tx: DBReadTransaction ) -> ArchiveMultiFrameResult { - var errors = [ArchiveMultiFrameResult.ArchiveFrameError]() + var errors = [ArchiveFrameError]() do { try threadStore.enumerateGroupThreads(tx: tx) { groupThread, _ in @@ -72,7 +73,7 @@ public class MessageBackupGroupRecipientArchiver: MessageBackupRecipientDestinat _ groupThread: TSGroupThread, stream: MessageBackupProtoOutputStream, context: MessageBackup.RecipientArchivingContext, - errors: inout [ArchiveMultiFrameResult.ArchiveFrameError], + errors: inout [ArchiveFrameError], tx: DBReadTransaction ) { guard let groupModel = groupThread.groupModel as? TSGroupModelV2 else { diff --git a/SignalServiceKit/MessageBackup/Archivers/Recipient/MessageBackupLocalRecipientArchiver.swift b/SignalServiceKit/MessageBackup/Archivers/Recipient/MessageBackupLocalRecipientArchiver.swift index bb782e5538..bc651f4b8d 100644 --- a/SignalServiceKit/MessageBackup/Archivers/Recipient/MessageBackupLocalRecipientArchiver.swift +++ b/SignalServiceKit/MessageBackup/Archivers/Recipient/MessageBackupLocalRecipientArchiver.swift @@ -10,10 +10,8 @@ extension MessageBackup { public var idLogString: String { "" } } - public enum ArchiveLocalRecipientResult { - case success(RecipientId) - case failure(ArchiveFrameError) - } + public typealias ArchiveLocalRecipientResult = ArchiveSingleFrameResult + public typealias RestoreLocalRecipientResult = RestoreFrameResult } /** @@ -25,9 +23,9 @@ public protocol MessageBackupLocalRecipientArchiver: MessageBackupProtoArchiver typealias RecipientId = MessageBackup.RecipientId /// Archive the local recipient. - func archiveLocalRecipient(stream: MessageBackupProtoOutputStream) -> MessageBackup.ArchiveLocalRecipientResult - - typealias RestoreFrameResult = MessageBackup.RestoreFrameResult + func archiveLocalRecipient( + stream: MessageBackupProtoOutputStream + ) -> MessageBackup.ArchiveLocalRecipientResult /// Restore a single ``BackupProto.Recipient`` frame for the local recipient. /// @@ -38,7 +36,7 @@ public protocol MessageBackupLocalRecipientArchiver: MessageBackupProtoArchiver _ recipient: BackupProto.Recipient, context: MessageBackup.RecipientRestoringContext, tx: DBWriteTransaction - ) -> RestoreFrameResult + ) -> MessageBackup.RestoreLocalRecipientResult /// Determines whether the given recipient is the local recipient. static func canRestore(_ recipient: BackupProto.Recipient) -> Bool @@ -70,20 +68,11 @@ public class MessageBackupLocalRecipientArchiverImpl: MessageBackupLocalRecipien } } - public static func canRestore(_ recipient: BackupProto.Recipient) -> Bool { - switch recipient.destination { - case .selfRecipient: - return true - case nil, .contact, .group, .distributionList, .releaseNotes: - return false - } - } - public func restore( _ recipient: BackupProto.Recipient, context: MessageBackup.RecipientRestoringContext, tx: DBWriteTransaction - ) -> RestoreFrameResult { + ) -> MessageBackup.RestoreLocalRecipientResult { switch recipient.destination { case .selfRecipient: break @@ -97,4 +86,13 @@ public class MessageBackupLocalRecipientArchiverImpl: MessageBackupLocalRecipien context[recipient.recipientId] = .localAddress return .success } + + public static func canRestore(_ recipient: BackupProto.Recipient) -> Bool { + switch recipient.destination { + case .selfRecipient: + return true + case nil, .contact, .group, .distributionList, .releaseNotes: + return false + } + } } diff --git a/SignalServiceKit/MessageBackup/Archivers/Recipient/MessageBackupRecipientArchiver.swift b/SignalServiceKit/MessageBackup/Archivers/Recipient/MessageBackupRecipientArchiver.swift index 324da321c5..e23756d4b5 100644 --- a/SignalServiceKit/MessageBackup/Archivers/Recipient/MessageBackupRecipientArchiver.swift +++ b/SignalServiceKit/MessageBackup/Archivers/Recipient/MessageBackupRecipientArchiver.swift @@ -15,6 +15,7 @@ public protocol MessageBackupRecipientArchiver: MessageBackupProtoArchiver { typealias RecipientAppId = MessageBackup.RecipientArchivingContext.Address typealias ArchiveMultiFrameResult = MessageBackup.ArchiveMultiFrameResult + typealias RestoreFrameResult = MessageBackup.RestoreFrameResult /// Archive all recipients. /// @@ -30,8 +31,6 @@ public protocol MessageBackupRecipientArchiver: MessageBackupProtoArchiver { tx: DBReadTransaction ) -> ArchiveMultiFrameResult - typealias RestoreFrameResult = MessageBackup.RestoreFrameResult - /// Restore a single ``BackupProto.Recipient`` frame. /// /// - Returns: ``RestoreFrameResult.success`` if all frames were read without error. @@ -45,6 +44,7 @@ public protocol MessageBackupRecipientArchiver: MessageBackupProtoArchiver { } internal class MessageBackupRecipientArchiverImpl: MessageBackupRecipientArchiver { + private typealias ArchiveFrameError = MessageBackup.ArchiveFrameError private let blockingManager: MessageBackup.Shims.BlockingManager private let disappearingMessageConfigStore: DisappearingMessagesConfigurationStore @@ -119,7 +119,7 @@ internal class MessageBackupRecipientArchiverImpl: MessageBackupRecipientArchive context: MessageBackup.RecipientArchivingContext, tx: DBReadTransaction ) -> ArchiveMultiFrameResult { - var partialErrors = [ArchiveMultiFrameResult.ArchiveFrameError]() + var partialErrors = [ArchiveFrameError]() for archiver in destinationArchivers { let archiverResults = archiver.archiveRecipients( stream: stream,