diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 6a665a5e0f..05fe97beb7 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -714,6 +714,7 @@ 505CC1692F22C2EC00D311CD /* OutgoingPaymentActivationRequestFinishedMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505CC1682F22C2EC00D311CD /* OutgoingPaymentActivationRequestFinishedMessage.swift */; }; 505F76332BC45C0700B1B51C /* BuildFlags+Generated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505F76322BC45C0700B1B51C /* BuildFlags+Generated.swift */; }; 5060EBBA2C7D211A00DF77AD /* OutgoingCallLinkUpdateMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5060EBB92C7D211A00DF77AD /* OutgoingCallLinkUpdateMessage.swift */; }; + 506395812F2403BE00B2F772 /* TransientOutgoingMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 506395802F2403BE00B2F772 /* TransientOutgoingMessage.swift */; }; 5063B41E2C5432A30041CA51 /* ResolvableValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5063B41D2C5432A30041CA51 /* ResolvableValue.swift */; }; 506695E129C296D500B6D8D0 /* RecipientMergerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 506695E029C296D500B6D8D0 /* RecipientMergerTest.swift */; }; 506695E329C29BCE00B6D8D0 /* RecipientMerger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 506695E229C29BCE00B6D8D0 /* RecipientMerger.swift */; }; @@ -4870,6 +4871,7 @@ 505CC1682F22C2EC00D311CD /* OutgoingPaymentActivationRequestFinishedMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutgoingPaymentActivationRequestFinishedMessage.swift; sourceTree = ""; }; 505F76322BC45C0700B1B51C /* BuildFlags+Generated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BuildFlags+Generated.swift"; sourceTree = ""; }; 5060EBB92C7D211A00DF77AD /* OutgoingCallLinkUpdateMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutgoingCallLinkUpdateMessage.swift; sourceTree = ""; }; + 506395802F2403BE00B2F772 /* TransientOutgoingMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransientOutgoingMessage.swift; sourceTree = ""; }; 5063B41D2C5432A30041CA51 /* ResolvableValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResolvableValue.swift; sourceTree = ""; }; 506695E029C296D500B6D8D0 /* RecipientMergerTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecipientMergerTest.swift; sourceTree = ""; }; 506695E229C29BCE00B6D8D0 /* RecipientMerger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecipientMerger.swift; sourceTree = ""; }; @@ -14393,6 +14395,7 @@ 50B0E9472AC73C3B005D46AB /* RecipientStateMerger.swift */, 504F98B22EB0270A00DF465B /* SendMessageFailure.swift */, 50A5AA9A2A7449D000CF2ECC /* ServerReceiptEnvelope.swift */, + 506395802F2403BE00B2F772 /* TransientOutgoingMessage.swift */, F9C5C947289453B100548EEE /* TypingIndicatorMessage.swift */, 504F397B29D23B1700E849A6 /* ValidatedIncomingEnvelope.swift */, ); @@ -19469,6 +19472,7 @@ 7203F5352D53B83500639949 /* TimeInterval+SSK.swift in Sources */, C14EC1A22BA891D200A4D064 /* TransformingInputStream.swift in Sources */, C1CF83D42B9A207800CDC9C4 /* TransformingOutputStream.swift in Sources */, + 506395812F2403BE00B2F772 /* TransientOutgoingMessage.swift in Sources */, 661170C42ABA4D9900A1B16D /* TSAccountManager.swift in Sources */, 661170C82ABA4F3A00A1B16D /* TSAccountManagerImpl.swift in Sources */, 664657472ACB66630099DE1C /* TSAccountManagerObjcBridge.swift in Sources */, diff --git a/Signal/ConversationView/ConversationViewController+MessageActionsDelegate.swift b/Signal/ConversationView/ConversationViewController+MessageActionsDelegate.swift index 240ade578f..2fba33b238 100644 --- a/Signal/ConversationView/ConversationViewController+MessageActionsDelegate.swift +++ b/Signal/ConversationView/ConversationViewController+MessageActionsDelegate.swift @@ -289,7 +289,7 @@ extension ConversationViewController: MessageActionsDelegate { } } - func sendPinMessageChange(pinMessage: TSOutgoingMessage) async throws { + func sendPinMessageChange(pinMessage: TransientOutgoingMessage) async throws { let db = DependenciesBridge.shared.db let messageSenderJobQueue = SSKEnvironment.shared.messageSenderJobQueueRef let pinnedMessageManager = DependenciesBridge.shared.pinnedMessageManager @@ -341,7 +341,7 @@ extension ConversationViewController: MessageActionsDelegate { func queuePinMessageChangeWithModal( message: TSMessage, - pinMessage: TSOutgoingMessage, + pinMessage: TransientOutgoingMessage, modalDelegate: UIViewController, completion: (() -> Void)?, ) async { diff --git a/SignalServiceKit/Calls/Group/OutgoingGroupCallUpdateMessage.swift b/SignalServiceKit/Calls/Group/OutgoingGroupCallUpdateMessage.swift index 1f3f816c0a..ff8a0c9d46 100644 --- a/SignalServiceKit/Calls/Group/OutgoingGroupCallUpdateMessage.swift +++ b/SignalServiceKit/Calls/Group/OutgoingGroupCallUpdateMessage.swift @@ -8,7 +8,7 @@ /// /// Not to be confused with an ``OWSGroupCallMessage``. @objc(OWSOutgoingGroupCallMessage) -public final class OutgoingGroupCallUpdateMessage: TSOutgoingMessage { +public final class OutgoingGroupCallUpdateMessage: TransientOutgoingMessage { override public class var supportsSecureCoding: Bool { true } public required init?(coder: NSCoder) { @@ -56,8 +56,6 @@ public final class OutgoingGroupCallUpdateMessage: TSOutgoingMessage { ) } - override public var shouldBeSaved: Bool { false } - override var contentHint: SealedSenderContentHint { .default } override public func dataMessageBuilder( diff --git a/SignalServiceKit/Calls/OutgoingCallMessage.swift b/SignalServiceKit/Calls/OutgoingCallMessage.swift index 6063b35dd6..fc949a159e 100644 --- a/SignalServiceKit/Calls/OutgoingCallMessage.swift +++ b/SignalServiceKit/Calls/OutgoingCallMessage.swift @@ -10,7 +10,7 @@ public import LibSignalClient /// payload out-of-band. /// /// Not to be confused with a ``TSCall``. -public final class OutgoingCallMessage: TSOutgoingMessage { +public final class OutgoingCallMessage: TransientOutgoingMessage { public enum MessageType: Hashable { case offerMessage(SSKProtoCallMessageOffer) case answerMessage(SSKProtoCallMessageAnswer) @@ -110,8 +110,6 @@ public final class OutgoingCallMessage: TSOutgoingMessage { } } - override public var shouldBeSaved: Bool { false } - override public var isUrgent: Bool { switch self.messageType { case .offerMessage: diff --git a/SignalServiceKit/Jobs/JobRecords/MessageSenderJobRecord.swift b/SignalServiceKit/Jobs/JobRecords/MessageSenderJobRecord.swift index 9b85f49f32..56306c2f0e 100644 --- a/SignalServiceKit/Jobs/JobRecords/MessageSenderJobRecord.swift +++ b/SignalServiceKit/Jobs/JobRecords/MessageSenderJobRecord.swift @@ -21,7 +21,7 @@ public final class MessageSenderJobRecord: JobRecord, FactoryInitializableFromRe /// A message we send but which is never inserted into the Interactions table; /// its only used for sending. - private let transientMessage: TSOutgoingMessage? + private let transientMessage: TransientOutgoingMessage? // exposed for tests let removeMessageAfterSending: Bool @@ -33,7 +33,7 @@ public final class MessageSenderJobRecord: JobRecord, FactoryInitializableFromRe messageForSending: OutgoingEditMessage, useMediaQueue: Bool, ) - case transient(TSOutgoingMessage) + case transient(TransientOutgoingMessage) /// Generally considered invalid, but failed at processing time not deserialization time. case none } @@ -145,7 +145,7 @@ public final class MessageSenderJobRecord: JobRecord, FactoryInitializableFromRe } convenience init( - transientMessage: TSOutgoingMessage, + transientMessage: TransientOutgoingMessage, isHighPriority: Bool, ) { owsPrecondition( @@ -183,9 +183,9 @@ public final class MessageSenderJobRecord: JobRecord, FactoryInitializableFromRe transientMessage = try container.decodeIfPresent( Data.self, forKey: .transientMessage, - ).flatMap { invisibleMessageData -> TSOutgoingMessage? in + ).flatMap { invisibleMessageData -> TransientOutgoingMessage? in do { - return try LegacySDSSerializer().deserializeLegacySDSData(invisibleMessageData, ofClass: TSOutgoingMessage.self) + return try LegacySDSSerializer().deserializeLegacySDSData(invisibleMessageData, ofClass: TransientOutgoingMessage.self) } catch { owsFailDebug("couldn't decode transient message: \(error)") return nil diff --git a/SignalServiceKit/Messages/DeviceSyncing/OutgoingSyncMessage.swift b/SignalServiceKit/Messages/DeviceSyncing/OutgoingSyncMessage.swift index f252ca448c..02bac70638 100644 --- a/SignalServiceKit/Messages/DeviceSyncing/OutgoingSyncMessage.swift +++ b/SignalServiceKit/Messages/DeviceSyncing/OutgoingSyncMessage.swift @@ -11,7 +11,7 @@ import Foundation * notifying your devices of sent messages, and "read" receipts. */ @objc(OWSOutgoingSyncMessage) -public class OutgoingSyncMessage: TSOutgoingMessage { +public class OutgoingSyncMessage: TransientOutgoingMessage { override public class var supportsSecureCoding: Bool { true } @@ -42,8 +42,6 @@ public class OutgoingSyncMessage: TSOutgoingMessage { ) } - override public var shouldBeSaved: Bool { false } - override public func shouldSyncTranscript() -> Bool { false } // This method should not be overridden because we want to add random padding to *every* sync message diff --git a/SignalServiceKit/Messages/Edit/OutgoingEditMessage.swift b/SignalServiceKit/Messages/Edit/OutgoingEditMessage.swift index e49f69f00c..6c683a63d7 100644 --- a/SignalServiceKit/Messages/Edit/OutgoingEditMessage.swift +++ b/SignalServiceKit/Messages/Edit/OutgoingEditMessage.swift @@ -7,7 +7,7 @@ import Foundation // This needs to reflect the edit as represented (and sourced) from the db. @objc -public final class OutgoingEditMessage: TSOutgoingMessage { +public final class OutgoingEditMessage: TransientOutgoingMessage { override public class var supportsSecureCoding: Bool { true } public required init?(coder: NSCoder) { @@ -51,9 +51,6 @@ public final class OutgoingEditMessage: TSOutgoingMessage { // MARK: - Overrides - @objc - override public var shouldBeSaved: Bool { false } - @objc override public var debugDescription: String { "editMessage" } diff --git a/SignalServiceKit/Messages/Interactions/DisappearingMessagesConfigurationMessage.swift b/SignalServiceKit/Messages/Interactions/DisappearingMessagesConfigurationMessage.swift index 6fedfb585c..16bf91ac6c 100644 --- a/SignalServiceKit/Messages/Interactions/DisappearingMessagesConfigurationMessage.swift +++ b/SignalServiceKit/Messages/Interactions/DisappearingMessagesConfigurationMessage.swift @@ -6,12 +6,10 @@ import Foundation @objc(OWSDisappearingMessagesConfigurationMessage) -final class DisappearingMessagesConfigurationMessage: TSOutgoingMessage { +final class DisappearingMessagesConfigurationMessage: TransientOutgoingMessage { private let configuration: OWSDisappearingMessagesConfiguration - override var shouldBeSaved: Bool { false } - override var isUrgent: Bool { false } init( diff --git a/SignalServiceKit/Messages/Interactions/OutgoingDeleteMessage.swift b/SignalServiceKit/Messages/Interactions/OutgoingDeleteMessage.swift index d7ddcf28eb..c53fd46ef9 100644 --- a/SignalServiceKit/Messages/Interactions/OutgoingDeleteMessage.swift +++ b/SignalServiceKit/Messages/Interactions/OutgoingDeleteMessage.swift @@ -7,7 +7,7 @@ import Foundation public import LibSignalClient @objc(TSOutgoingDeleteMessage) -public final class OutgoingDeleteMessage: TSOutgoingMessage { +public final class OutgoingDeleteMessage: TransientOutgoingMessage { let messageTimestamp: UInt64 let messageUniqueId: String? let isDeletingStoryMessage: Bool @@ -90,8 +90,6 @@ public final class OutgoingDeleteMessage: TSOutgoingMessage { ) } - override public var shouldBeSaved: Bool { false } - override public var isStorySend: Bool { return self.isDeletingStoryMessage } diff --git a/SignalServiceKit/Messages/Interactions/OutgoingEndSessionMessage.swift b/SignalServiceKit/Messages/Interactions/OutgoingEndSessionMessage.swift index 4ab45d782e..6d019b3187 100644 --- a/SignalServiceKit/Messages/Interactions/OutgoingEndSessionMessage.swift +++ b/SignalServiceKit/Messages/Interactions/OutgoingEndSessionMessage.swift @@ -6,7 +6,7 @@ import Foundation @objc(OWSEndSessionMessage) -final class OutgoingEndSessionMessage: TSOutgoingMessage { +final class OutgoingEndSessionMessage: TransientOutgoingMessage { override class var supportsSecureCoding: Bool { true } required init?(coder: NSCoder) { @@ -24,8 +24,6 @@ final class OutgoingEndSessionMessage: TSOutgoingMessage { ) } - override var shouldBeSaved: Bool { false } - override func dataMessageBuilder(with thread: TSThread, transaction: DBReadTransaction) -> SSKProtoDataMessageBuilder? { guard let builder = super.dataMessageBuilder(with: thread, transaction: transaction) else { return nil diff --git a/SignalServiceKit/Messages/Interactions/OutgoingStaticMessage.swift b/SignalServiceKit/Messages/Interactions/OutgoingStaticMessage.swift index 44f3c2aa81..21be7bdeb7 100644 --- a/SignalServiceKit/Messages/Interactions/OutgoingStaticMessage.swift +++ b/SignalServiceKit/Messages/Interactions/OutgoingStaticMessage.swift @@ -8,7 +8,7 @@ import Foundation // A generic, serializable message that can be used to // send fixed plaintextData payloads. @objc(OWSStaticOutgoingMessage) -final class OutgoingStaticMessage: TSOutgoingMessage { +final class OutgoingStaticMessage: TransientOutgoingMessage { let plaintextData: Data @@ -59,8 +59,6 @@ final class OutgoingStaticMessage: TSOutgoingMessage { return true } - override var shouldBeSaved: Bool { false } - override func shouldSyncTranscript() -> Bool { false } override func buildPlainTextData(_ thread: TSThread, transaction: DBWriteTransaction) -> Data? { diff --git a/SignalServiceKit/Messages/Interactions/PinnedMessages/OutgoingPinMessage.swift b/SignalServiceKit/Messages/Interactions/PinnedMessages/OutgoingPinMessage.swift index 6c79f202af..fe3b36de34 100644 --- a/SignalServiceKit/Messages/Interactions/PinnedMessages/OutgoingPinMessage.swift +++ b/SignalServiceKit/Messages/Interactions/PinnedMessages/OutgoingPinMessage.swift @@ -6,7 +6,7 @@ import Foundation public import LibSignalClient -public class OutgoingPinMessage: TSOutgoingMessage { +public class OutgoingPinMessage: TransientOutgoingMessage { override public class var supportsSecureCoding: Bool { true } public required init?(coder: NSCoder) { @@ -93,8 +93,6 @@ public class OutgoingPinMessage: TSOutgoingMessage { ) } - override public var shouldBeSaved: Bool { false } - override var contentHint: SealedSenderContentHint { .implicit } override public func dataMessageBuilder( diff --git a/SignalServiceKit/Messages/Interactions/PinnedMessages/OutgoingUnpinMessage.swift b/SignalServiceKit/Messages/Interactions/PinnedMessages/OutgoingUnpinMessage.swift index 273f0297f3..6949888f3f 100644 --- a/SignalServiceKit/Messages/Interactions/PinnedMessages/OutgoingUnpinMessage.swift +++ b/SignalServiceKit/Messages/Interactions/PinnedMessages/OutgoingUnpinMessage.swift @@ -6,7 +6,7 @@ import Foundation public import LibSignalClient -public class OutgoingUnpinMessage: TSOutgoingMessage { +public class OutgoingUnpinMessage: TransientOutgoingMessage { override public class var supportsSecureCoding: Bool { true } public required init?(coder: NSCoder) { @@ -73,8 +73,6 @@ public class OutgoingUnpinMessage: TSOutgoingMessage { ) } - override public var shouldBeSaved: Bool { false } - override var contentHint: SealedSenderContentHint { .implicit } override public func dataMessageBuilder( diff --git a/SignalServiceKit/Messages/Interactions/Polls/OutgoingPollTerminate.swift b/SignalServiceKit/Messages/Interactions/Polls/OutgoingPollTerminate.swift index 796a8f1d48..55b89124ea 100644 --- a/SignalServiceKit/Messages/Interactions/Polls/OutgoingPollTerminate.swift +++ b/SignalServiceKit/Messages/Interactions/Polls/OutgoingPollTerminate.swift @@ -5,7 +5,7 @@ import Foundation -class OutgoingPollTerminateMessage: TSOutgoingMessage { +class OutgoingPollTerminateMessage: TransientOutgoingMessage { override class var supportsSecureCoding: Bool { true } required init?(coder: NSCoder) { @@ -58,8 +58,6 @@ class OutgoingPollTerminateMessage: TSOutgoingMessage { ) } - override var shouldBeSaved: Bool { false } - override var contentHint: SealedSenderContentHint { .implicit } override func dataMessageBuilder( diff --git a/SignalServiceKit/Messages/Interactions/Polls/OutgoingPollVote.swift b/SignalServiceKit/Messages/Interactions/Polls/OutgoingPollVote.swift index 66b178dc78..6373180769 100644 --- a/SignalServiceKit/Messages/Interactions/Polls/OutgoingPollVote.swift +++ b/SignalServiceKit/Messages/Interactions/Polls/OutgoingPollVote.swift @@ -6,7 +6,7 @@ import Foundation public import LibSignalClient -public class OutgoingPollVoteMessage: TSOutgoingMessage { +public class OutgoingPollVoteMessage: TransientOutgoingMessage { override public class var supportsSecureCoding: Bool { true } public required init?(coder: NSCoder) { @@ -87,8 +87,6 @@ public class OutgoingPollVoteMessage: TSOutgoingMessage { ) } - override public var shouldBeSaved: Bool { false } - override var contentHint: SealedSenderContentHint { .implicit } override public func dataMessageBuilder( diff --git a/SignalServiceKit/Messages/OWSOutgoingResendResponse.swift b/SignalServiceKit/Messages/OWSOutgoingResendResponse.swift index f44ec358e5..64a9fc0e39 100644 --- a/SignalServiceKit/Messages/OWSOutgoingResendResponse.swift +++ b/SignalServiceKit/Messages/OWSOutgoingResendResponse.swift @@ -7,7 +7,7 @@ import Foundation import LibSignalClient @objc(OWSOutgoingResendResponse) -final class OWSOutgoingResendResponse: TSOutgoingMessage { +final class OWSOutgoingResendResponse: TransientOutgoingMessage { override class var supportsSecureCoding: Bool { true } required init?(coder: NSCoder) { @@ -144,8 +144,6 @@ final class OWSOutgoingResendResponse: TSOutgoingMessage { override func shouldSyncTranscript() -> Bool { false } - override var shouldBeSaved: Bool { false } - override var contentHint: SealedSenderContentHint { self.derivedContentHint } override func envelopeGroupIdWithTransaction(_ transaction: DBReadTransaction) -> Data? { self.originalGroupId } diff --git a/SignalServiceKit/Messages/OutgoingGroupUpdateMessage.swift b/SignalServiceKit/Messages/OutgoingGroupUpdateMessage.swift index d982a9f415..2a14b41339 100644 --- a/SignalServiceKit/Messages/OutgoingGroupUpdateMessage.swift +++ b/SignalServiceKit/Messages/OutgoingGroupUpdateMessage.swift @@ -7,7 +7,7 @@ import Foundation import LibSignalClient /// An outgoing group v2 update. -final class OutgoingGroupUpdateMessage: TSOutgoingMessage { +final class OutgoingGroupUpdateMessage: TransientOutgoingMessage { override class var supportsSecureCoding: Bool { true } required init?(coder: NSCoder) { @@ -67,6 +67,4 @@ final class OutgoingGroupUpdateMessage: TSOutgoingMessage { } override var isUrgent: Bool { self.isUpdateUrgent } - - override var shouldBeSaved: Bool { false } } diff --git a/SignalServiceKit/Messages/OutgoingMessagePreparer/PreparedOutgoingMessage.swift b/SignalServiceKit/Messages/OutgoingMessagePreparer/PreparedOutgoingMessage.swift index bbcfa13ad7..cc3e6147c6 100644 --- a/SignalServiceKit/Messages/OutgoingMessagePreparer/PreparedOutgoingMessage.swift +++ b/SignalServiceKit/Messages/OutgoingMessagePreparer/PreparedOutgoingMessage.swift @@ -53,7 +53,7 @@ public class PreparedOutgoingMessage { /// (2) don't have any attachments associated with them /// Instantly prepares because...these messages don't need any preparing. public static func preprepared( - transientMessageWithoutAttachments: TSOutgoingMessage, + transientMessageWithoutAttachments: TransientOutgoingMessage, ) -> PreparedOutgoingMessage { UnpreparedOutgoingMessage.assertIsAllowedTransientMessage(transientMessageWithoutAttachments) return _preprepared(transientMessage: transientMessageWithoutAttachments) @@ -64,7 +64,7 @@ public class PreparedOutgoingMessage { /// (2) don't have any attachments that need to be uploaded /// Instantly prepares because...these messages don't need any preparing. private static func _preprepared( - transientMessage: TSOutgoingMessage, + transientMessage: TransientOutgoingMessage, ) -> PreparedOutgoingMessage { let messageType = MessageType.transient(transientMessage) return PreparedOutgoingMessage(messageType: messageType) @@ -127,7 +127,7 @@ public class PreparedOutgoingMessage { /// Catch-all for messages not persisted to the Interactions table. The /// MessageSender will not upload any attachments contained within these /// messages; callers are responsible for uploading them. - case transient(TSOutgoingMessage) + case transient(TransientOutgoingMessage) public struct Persisted { public let rowId: Int64 diff --git a/SignalServiceKit/Messages/OutgoingMessagePreparer/UnpreparedOutgoingMessage.swift b/SignalServiceKit/Messages/OutgoingMessagePreparer/UnpreparedOutgoingMessage.swift index 1240338971..768bf1c309 100644 --- a/SignalServiceKit/Messages/OutgoingMessagePreparer/UnpreparedOutgoingMessage.swift +++ b/SignalServiceKit/Messages/OutgoingMessagePreparer/UnpreparedOutgoingMessage.swift @@ -27,7 +27,8 @@ public class UnpreparedOutgoingMessage { let oversizeTextDataSource = (body?.oversizeText).map { AttachmentDataSource.pendingAttachment($0) } - if !message.shouldBeSaved { + // TODO: Split these methods once TSOutgoingMessage is no longer the superclass. + if let message = message as? TransientOutgoingMessage { owsAssertDebug( unsavedBodyMediaAttachments.isEmpty && oversizeTextDataSource == nil @@ -39,6 +40,7 @@ public class UnpreparedOutgoingMessage { Self.assertIsAllowedTransientMessage(message) return .init(messageType: .transient(message)) } else { + owsPrecondition(message.shouldBeSaved) return .init(messageType: .persistable(.init( message: message, unsavedBodyMediaAttachments: unsavedBodyMediaAttachments, @@ -121,7 +123,7 @@ public class UnpreparedOutgoingMessage { /// Catch-all for messages not persisted to the Interactions table. The /// MessageSender will not upload any attachments contained within these /// messages; callers are responsible for uploading them. - case transient(TSOutgoingMessage) + case transient(TransientOutgoingMessage) struct Persistable { let message: TSOutgoingMessage @@ -160,14 +162,7 @@ public class UnpreparedOutgoingMessage { let preparedMessageType: PreparedOutgoingMessage.MessageType switch messageType { case .persistable(let message): - if message.message.shouldBeSaved { - preparedMessageType = try preparePersistableMessage(message, tx: tx) - } else { - owsFailDebug("Unknown unsaved message type!") - // As a last resort, still send the message. But don't bother with - // attachments, those are dropped if we don't know how to handle them. - preparedMessageType = prepareTransientMessage(message.message) - } + preparedMessageType = try preparePersistableMessage(message, tx: tx) case .editMessage(let message): preparedMessageType = try prepareEditMessage(message, tx: tx) case .story(let story): @@ -405,7 +400,7 @@ public class UnpreparedOutgoingMessage { } private func prepareTransientMessage( - _ message: TSOutgoingMessage, + _ message: TransientOutgoingMessage, ) -> PreparedOutgoingMessage.MessageType { return .transient(message) } diff --git a/SignalServiceKit/Messages/OutgoingNullMessage.swift b/SignalServiceKit/Messages/OutgoingNullMessage.swift index 86935c8c1d..45a89698ab 100644 --- a/SignalServiceKit/Messages/OutgoingNullMessage.swift +++ b/SignalServiceKit/Messages/OutgoingNullMessage.swift @@ -6,7 +6,7 @@ import Foundation @objc(OWSOutgoingNullMessage) -final class OutgoingNullMessage: TSOutgoingMessage { +final class OutgoingNullMessage: TransientOutgoingMessage { let verificationStateSyncMessage: OutgoingVerificationStateSyncMessage? @@ -82,7 +82,5 @@ final class OutgoingNullMessage: TSOutgoingMessage { override func shouldSyncTranscript() -> Bool { false } - override var shouldBeSaved: Bool { false } - override var contentHint: SealedSenderContentHint { .implicit } } diff --git a/SignalServiceKit/Messages/OutgoingResendRequest.swift b/SignalServiceKit/Messages/OutgoingResendRequest.swift index 71ab50ae4e..7c7cd0ed85 100644 --- a/SignalServiceKit/Messages/OutgoingResendRequest.swift +++ b/SignalServiceKit/Messages/OutgoingResendRequest.swift @@ -6,7 +6,7 @@ import LibSignalClient @objc(OWSOutgoingResendRequest) -final class OutgoingResendRequest: TSOutgoingMessage { +final class OutgoingResendRequest: TransientOutgoingMessage { let decryptionErrorData: Data private let failedEnvelopeGroupId: Data? @@ -86,8 +86,6 @@ final class OutgoingResendRequest: TSOutgoingMessage { override func shouldSyncTranscript() -> Bool { false } - override var shouldBeSaved: Bool { false } - override var contentHint: SealedSenderContentHint { .default } override func envelopeGroupIdWithTransaction(_ transaction: DBReadTransaction) -> Data? { diff --git a/SignalServiceKit/Messages/OutgoingSenderKeyDistributionMessage.swift b/SignalServiceKit/Messages/OutgoingSenderKeyDistributionMessage.swift index a07a29eb4d..9e262fb744 100644 --- a/SignalServiceKit/Messages/OutgoingSenderKeyDistributionMessage.swift +++ b/SignalServiceKit/Messages/OutgoingSenderKeyDistributionMessage.swift @@ -6,7 +6,7 @@ import Foundation import LibSignalClient -final class OutgoingSenderKeyDistributionMessage: TSOutgoingMessage { +final class OutgoingSenderKeyDistributionMessage: TransientOutgoingMessage { /// True if this message is being sent as a precondition to sending an /// online-only message. Typing indicators are only delivered to online @@ -70,8 +70,6 @@ final class OutgoingSenderKeyDistributionMessage: TSOutgoingMessage { return true } - override var shouldBeSaved: Bool { false } - override var shouldRecordSendLog: Bool { false } override var isUrgent: Bool { false } diff --git a/SignalServiceKit/Messages/Payments/OutgoingPaymentActivationRequestFinishedMessage.swift b/SignalServiceKit/Messages/Payments/OutgoingPaymentActivationRequestFinishedMessage.swift index 237894cb5b..bbd532e2ef 100644 --- a/SignalServiceKit/Messages/Payments/OutgoingPaymentActivationRequestFinishedMessage.swift +++ b/SignalServiceKit/Messages/Payments/OutgoingPaymentActivationRequestFinishedMessage.swift @@ -8,7 +8,7 @@ import Foundation /// Outgoing message we send to the contact who requested we activate payments. /// NOT rendered in chat; a separate TSInfoMessage is created for that purpose. @objc(OWSPaymentActivationRequestFinishedMessage) -final class OutgoingPaymentActivationRequestFinishedMessage: TSOutgoingMessage { +final class OutgoingPaymentActivationRequestFinishedMessage: TransientOutgoingMessage { override class var supportsSecureCoding: Bool { true } @@ -41,6 +41,4 @@ final class OutgoingPaymentActivationRequestFinishedMessage: TSOutgoingMessage { } override var contentHint: SealedSenderContentHint { .implicit } - - override var shouldBeSaved: Bool { false } } diff --git a/SignalServiceKit/Messages/Payments/OutgoingPaymentActivationRequestMessage.swift b/SignalServiceKit/Messages/Payments/OutgoingPaymentActivationRequestMessage.swift index c855ce7c30..d17024513f 100644 --- a/SignalServiceKit/Messages/Payments/OutgoingPaymentActivationRequestMessage.swift +++ b/SignalServiceKit/Messages/Payments/OutgoingPaymentActivationRequestMessage.swift @@ -8,7 +8,7 @@ import Foundation /// Outgoing message we send to the contact we want to activate payments. /// NOT rendered in chat; a separate TSInfoMessage is created for that purpose. @objc(OWSPaymentActivationRequestMessage) -public final class OutgoingPaymentActivationRequestMessage: TSOutgoingMessage { +public final class OutgoingPaymentActivationRequestMessage: TransientOutgoingMessage { override public class var supportsSecureCoding: Bool { true } @@ -41,6 +41,4 @@ public final class OutgoingPaymentActivationRequestMessage: TSOutgoingMessage { } override public var contentHint: SealedSenderContentHint { .implicit } - - override public var shouldBeSaved: Bool { false } } diff --git a/SignalServiceKit/Messages/ProfileKeyMessage.swift b/SignalServiceKit/Messages/ProfileKeyMessage.swift index 8b7770c0d0..10b368e61b 100644 --- a/SignalServiceKit/Messages/ProfileKeyMessage.swift +++ b/SignalServiceKit/Messages/ProfileKeyMessage.swift @@ -7,7 +7,7 @@ import Foundation public import LibSignalClient @objc(OWSProfileKeyMessage) -public final class ProfileKeyMessage: TSOutgoingMessage { +public final class ProfileKeyMessage: TransientOutgoingMessage { let profileKey: ProfileKey? @@ -54,8 +54,6 @@ public final class ProfileKeyMessage: TSOutgoingMessage { return true } - override public var shouldBeSaved: Bool { false } - override public func shouldSyncTranscript() -> Bool { return false } diff --git a/SignalServiceKit/Messages/Reactions/OutgoingReactionMessage.swift b/SignalServiceKit/Messages/Reactions/OutgoingReactionMessage.swift index e906dad74b..5228ca8e20 100644 --- a/SignalServiceKit/Messages/Reactions/OutgoingReactionMessage.swift +++ b/SignalServiceKit/Messages/Reactions/OutgoingReactionMessage.swift @@ -7,7 +7,7 @@ import Foundation import LibSignalClient @objc(OWSOutgoingReactionMessage) -final class OutgoingReactionMessage: TSOutgoingMessage { +final class OutgoingReactionMessage: TransientOutgoingMessage { let messageUniqueId: String let emoji: String @@ -104,8 +104,6 @@ final class OutgoingReactionMessage: TSOutgoingMessage { return true } - override var shouldBeSaved: Bool { false } - override func dataMessageBuilder(with thread: TSThread, transaction tx: DBReadTransaction) -> SSKProtoDataMessageBuilder? { guard let reactionProto = self.buildDataMessageReactionProto(tx: tx) else { return nil diff --git a/SignalServiceKit/Messages/Reactions/ReactionManager.swift b/SignalServiceKit/Messages/Reactions/ReactionManager.swift index 9726da8f5d..e285a1acab 100644 --- a/SignalServiceKit/Messages/Reactions/ReactionManager.swift +++ b/SignalServiceKit/Messages/Reactions/ReactionManager.swift @@ -34,7 +34,7 @@ public class ReactionManager: NSObject { isHighPriority: Bool = false, tx: DBWriteTransaction, ) -> Promise { - let outgoingMessage: TSOutgoingMessage + let outgoingMessage: OutgoingReactionMessage do { outgoingMessage = try _localUserReacted(to: messageUniqueId, emoji: emoji, isRemoving: isRemoving, tx: tx) } catch { diff --git a/SignalServiceKit/Messages/ReceiptMessage.swift b/SignalServiceKit/Messages/ReceiptMessage.swift index d0dfcc8d90..c2d21c85ac 100644 --- a/SignalServiceKit/Messages/ReceiptMessage.swift +++ b/SignalServiceKit/Messages/ReceiptMessage.swift @@ -5,7 +5,7 @@ import Foundation -final class ReceiptMessage: TSOutgoingMessage { +final class ReceiptMessage: TransientOutgoingMessage { private let messageUniqueIds: Set private let messageTimestamps: Set private let receiptType: SSKProtoReceiptMessageType @@ -84,8 +84,6 @@ final class ReceiptMessage: TSOutgoingMessage { return builder.buildInfallibly() } - override var shouldBeSaved: Bool { false } - override var debugDescription: String { return "[\(type(of: self))] with message timestamps: \(self.messageTimestamps.count)" } diff --git a/SignalServiceKit/Messages/Stories/OutgoingStoryMessage.swift b/SignalServiceKit/Messages/Stories/OutgoingStoryMessage.swift index 161e5b446d..b3e98a8a0a 100644 --- a/SignalServiceKit/Messages/Stories/OutgoingStoryMessage.swift +++ b/SignalServiceKit/Messages/Stories/OutgoingStoryMessage.swift @@ -6,7 +6,7 @@ import Foundation import LibSignalClient -public class OutgoingStoryMessage: TSOutgoingMessage { +public class OutgoingStoryMessage: TransientOutgoingMessage { override public class var supportsSecureCoding: Bool { true } public required init?(coder: NSCoder) { @@ -141,8 +141,6 @@ public class OutgoingStoryMessage: TSOutgoingMessage { ) } - @objc - override public var shouldBeSaved: Bool { false } override var contentHint: SealedSenderContentHint { .implicit } override public func contentBuilder( diff --git a/SignalServiceKit/Messages/TransientOutgoingMessage.swift b/SignalServiceKit/Messages/TransientOutgoingMessage.swift new file mode 100644 index 0000000000..33693c4c27 --- /dev/null +++ b/SignalServiceKit/Messages/TransientOutgoingMessage.swift @@ -0,0 +1,13 @@ +// +// Copyright 2026 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only +// + +import Foundation + +@objc(TransientOutgoingMessage) +public class TransientOutgoingMessage: TSOutgoingMessage { + override public class var supportsSecureCoding: Bool { true } + + override public var shouldBeSaved: Bool { false } +} diff --git a/SignalServiceKit/Messages/TypingIndicatorMessage.swift b/SignalServiceKit/Messages/TypingIndicatorMessage.swift index b7ec670b68..19d2e60c85 100644 --- a/SignalServiceKit/Messages/TypingIndicatorMessage.swift +++ b/SignalServiceKit/Messages/TypingIndicatorMessage.swift @@ -10,7 +10,7 @@ public enum TypingIndicatorAction { case stopped } -public final class TypingIndicatorMessage: TSOutgoingMessage { +public final class TypingIndicatorMessage: TransientOutgoingMessage { override public class var supportsSecureCoding: Bool { true } public required init?(coder: NSCoder) { @@ -103,11 +103,6 @@ public final class TypingIndicatorMessage: TSOutgoingMessage { // MARK: TSYapDatabaseObject overrides - @objc - override public var shouldBeSaved: Bool { - return false - } - @objc override public var debugDescription: String { return "typingIndicatorMessage"