Reduce indirection in MessageBackup typealiases

This commit is contained in:
Sasha Weiss 2024-06-27 09:51:34 -07:00 committed by GitHub
parent 0216ed341a
commit f9f9fff005
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
17 changed files with 107 additions and 97 deletions

View File

@ -19,18 +19,14 @@ extension MessageBackup {
public var idLogString: String { "localUser" }
}
public enum ArchiveAccountDataResult {
case success
case failure(ArchiveFrameError<AccountDataId>)
}
public typealias ArchiveAccountDataResult = ArchiveSingleFrameResult<Void, AccountDataId>
public typealias RestoreAccountDataResult = RestoreFrameResult<MessageBackup.AccountDataId>
}
/**
* Archives the ``BackupProto.AccountData`` frame
*/
public protocol MessageBackupAccountDataArchiver: MessageBackupProtoArchiver {
typealias RestoreFrameResult = MessageBackup.RestoreFrameResult<MessageBackup.AccountDataId>
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),

View File

@ -12,6 +12,8 @@ public protocol MessageBackupChatArchiver: MessageBackupProtoArchiver {
typealias ArchiveMultiFrameResult = MessageBackup.ArchiveMultiFrameResult<MessageBackup.ThreadUniqueId>
typealias RestoreFrameResult = MessageBackup.RestoreFrameResult<ChatId>
/// 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<ChatId>
/// 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<MessageBackup.ThreadUniqueId>
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

View File

@ -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<Details>
typealias RestoreChatUpdateMessageResult = MessageBackup.RestoreInteractionResult<Void>
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<Void> {
) -> RestoreChatUpdateMessageResult {
let groupThread: TSGroupThread
switch chatThread {
case .groupV2(let _groupThread):

View File

@ -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<Details>
typealias RestoreChatUpdateMessageResult = MessageBackup.RestoreInteractionResult<Void>
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<Void> {
) -> RestoreChatUpdateMessageResult {
let contactThread: TSContactThread
switch chatThread {
case .contact(let _contactThread):

View File

@ -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<Details>
typealias RestoreChatUpdateMessageResult = MessageBackup.RestoreInteractionResult<Void>
private typealias ArchiveFrameError = MessageBackup.ArchiveFrameError<MessageBackup.InteractionUniqueId>
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<BackupProto.GroupChangeChatUpdate> {
var updates = [BackupProto.GroupChangeChatUpdate.Update]()

View File

@ -7,6 +7,7 @@ import Foundation
import LibSignalClient
public class MessageBackupChatItemArchiverImpl: MessageBackupChatItemArchiver {
private typealias ArchiveFrameError = MessageBackup.ArchiveFrameError<MessageBackup.InteractionUniqueId>
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

View File

@ -45,8 +45,6 @@ extension MessageBackup {
}
internal enum ArchiveInteractionResult<Component> {
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<InteractionUniqueId>])
/// The entire message failed and should be skipped.
/// Other messages are unaffected.
case messageFailure([ArchiveFrameError])
case messageFailure([ArchiveFrameError<InteractionUniqueId>])
/// Catastrophic failure, which should stop _all_ message archiving.
case completeFailure(FatalArchivingError)
}
@ -142,7 +140,7 @@ extension MessageBackup.ArchiveInteractionResult {
/// }
func bubbleUp<ErrorResultType>(
_ resultType: ErrorResultType.Type = ErrorResultType.self,
partialErrors: inout [ArchiveFrameError]
partialErrors: inout [MessageBackup.ArchiveFrameError<MessageBackup.InteractionUniqueId>]
) -> BubbleUp<Component, ErrorResultType> {
switch self {
case .success(let value):

View File

@ -7,12 +7,11 @@ import Foundation
import LibSignalClient
internal class MessageBackupReactionArchiver: MessageBackupProtoArchiver {
private typealias ArchiveFrameError = MessageBackup.ArchiveFrameError<MessageBackup.InteractionUniqueId>
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 {

View File

@ -7,6 +7,7 @@ import Foundation
import LibSignalClient
internal class MessageBackupTSIncomingMessageArchiver: MessageBackupInteractionArchiver {
private typealias ArchiveFrameError = MessageBackup.ArchiveFrameError<MessageBackup.InteractionUniqueId>
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) {

View File

@ -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<MessageBackup.InteractionUniqueId>
private typealias RestoreFrameError = MessageBackup.RestoreFrameError<MessageBackup.ChatItemId>
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<ChatItemType> {
) -> ArchiveInteractionResult<ChatItemType> {
guard let body = message.body else {
// TODO: handle non simple text messages.
return .notYetImplemented
}
var standardMessage = BackupProto.StandardMessage()
var partialErrors = [MessageBackup.ArchiveInteractionResult<ChatItemType>.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<BackupProto.Text> {
) -> ArchiveInteractionResult<BackupProto.Text> {
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<BackupProto.Quote> {
var partialErrors = [MessageBackup.ArchiveInteractionResult<ChatItemType>.ArchiveFrameError]()
) -> ArchiveInteractionResult<BackupProto.Quote> {
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<MessageBackup.RestoredMessageContents>
/// 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<MessageBackup.RestoredMessageContents> {
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<Void> {
let restoreReactionsResult: MessageBackup.RestoreInteractionResult<Void>
) -> RestoreInteractionResult<Void> {
let restoreReactionsResult: RestoreInteractionResult<Void>
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<MessageBackup.ChatItemId>]()
) -> RestoreInteractionResult<MessageBackup.RestoredMessageContents> {
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<MessageBody> {
) -> RestoreInteractionResult<MessageBody> {
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<MessageBody> {
var partialErrors = [MessageBackup.RestoreFrameError<MessageBackup.ChatItemId>]()
) -> RestoreInteractionResult<MessageBody> {
var partialErrors = [RestoreFrameError]()
var bodyMentions = [NSRange: Aci]()
var bodyStyles = [NSRangedValue<MessageBodyRanges.SingleStyle>]()
for bodyRange in bodyRangeProtos {
@ -421,7 +425,7 @@ internal class MessageBackupTSMessageContentsArchiver: MessageBackupProtoArchive
thread: MessageBackup.ChatThread,
context: MessageBackup.ChatRestoringContext,
tx: DBReadTransaction
) -> MessageBackup.RestoreInteractionResult<TSQuotedMessage> {
) -> RestoreInteractionResult<TSQuotedMessage> {
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<MessageBackup.ChatItemId>]()
var partialErrors = [RestoreFrameError]()
let targetMessageTimestamp: NSNumber?
if

View File

@ -7,6 +7,7 @@ import Foundation
import LibSignalClient
internal class MessageBackupTSOutgoingMessageArchiver: MessageBackupInteractionArchiver {
private typealias ArchiveFrameError = MessageBackup.ArchiveFrameError<MessageBackup.InteractionUniqueId>
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<OutgoingMessageDetails> {
var perRecipientErrors = [MessageBackup.ArchiveInteractionResult<Details.DirectionalDetails>.ArchiveFrameError]()
var perRecipientErrors = [ArchiveFrameError]()
var wasAnySendSealedSender = false
var outgoingMessage = BackupProto.ChatItem.OutgoingMessageDetails()

View File

@ -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<AppIdType: MessageBackupLoggableId> {
public typealias ArchiveFrameError = MessageBackup.ArchiveFrameError<AppIdType>
/// Represents the result of archiving a single frame.
public enum ArchiveSingleFrameResult<SuccessType, AppIdType: MessageBackupLoggableId> {
case success(SuccessType)
case failure(ArchiveFrameError<AppIdType>)
}
/// Represents the result of archiving multiple frames of the same type at
/// once.
public enum ArchiveMultiFrameResult<AppIdType: MessageBackupLoggableId> {
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<AppIdType>])
/// 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<ProtoIdType: MessageBackupLoggableId> {
case success
/// We managed to restore some part of the frame, meaning it is represented in our database.

View File

@ -11,6 +11,8 @@ import LibSignalClient
* ``BackupProto.Recipient``.
*/
public class MessageBackupContactRecipientArchiver: MessageBackupRecipientDestinationArchiver {
private typealias ArchivingAddress = MessageBackup.RecipientArchivingContext.Address
private typealias ArchiveFrameError = MessageBackup.ArchiveFrameError<RecipientAppId>
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

View File

@ -6,6 +6,7 @@
import Foundation
public class MessageBackupDistributionListRecipientArchiver: MessageBackupRecipientDestinationArchiver {
private typealias ArchiveFrameError = MessageBackup.ArchiveFrameError<RecipientAppId>
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)

View File

@ -16,6 +16,7 @@ import LibSignalClient
* in the proto.
*/
public class MessageBackupGroupRecipientArchiver: MessageBackupRecipientDestinationArchiver {
private typealias ArchiveFrameError = MessageBackup.ArchiveFrameError<RecipientAppId>
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 {

View File

@ -10,10 +10,8 @@ extension MessageBackup {
public var idLogString: String { "" }
}
public enum ArchiveLocalRecipientResult {
case success(RecipientId)
case failure(ArchiveFrameError<LocalRecipientId>)
}
public typealias ArchiveLocalRecipientResult = ArchiveSingleFrameResult<RecipientId, LocalRecipientId>
public typealias RestoreLocalRecipientResult = RestoreFrameResult<RecipientId>
}
/**
@ -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<RecipientId>
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
}
}
}

View File

@ -15,6 +15,7 @@ public protocol MessageBackupRecipientArchiver: MessageBackupProtoArchiver {
typealias RecipientAppId = MessageBackup.RecipientArchivingContext.Address
typealias ArchiveMultiFrameResult = MessageBackup.ArchiveMultiFrameResult<RecipientAppId>
typealias RestoreFrameResult = MessageBackup.RestoreFrameResult<RecipientId>
/// Archive all recipients.
///
@ -30,8 +31,6 @@ public protocol MessageBackupRecipientArchiver: MessageBackupProtoArchiver {
tx: DBReadTransaction
) -> ArchiveMultiFrameResult
typealias RestoreFrameResult = MessageBackup.RestoreFrameResult<RecipientId>
/// 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<RecipientAppId>
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,