Reduce indirection in MessageBackup typealiases
This commit is contained in:
parent
0216ed341a
commit
f9f9fff005
@ -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),
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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]()
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user