Signal-iOS/SignalServiceKit/Messages/SendableMessage.swift
2026-01-28 18:03:05 -06:00

87 lines
3.0 KiB
Swift

//
// Copyright 2026 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
import LibSignalClient
protocol SendableMessage {
var threadUniqueId: String { get }
var sqliteRowId: Int64? { get }
var uniqueId: String { get }
var timestamp: UInt64 { get }
/// If true, this message corresponds to a story and should use story=true
/// authentication and story account existence semantics.
var isStorySend: Bool { get }
/// If true, this message should set the "online" flag to indicate that it
/// should only be delivered if the recipient is currently online (e.g.,
/// typing indicator messages).
var isOnline: Bool { get }
/// If true, this message should set the "urgent" flag (e.g., text messages
/// are urgent and receipts are not).
var isUrgent: Bool { get }
/// Indicates desired behavior if decryption fails.
var contentHint: SealedSenderContentHint { get }
/// Indicates how the message should be encrypted.
var encryptionStyle: EncryptionStyle { get }
// TODO: Remove the thread parameter?
/// Builds the serialized Content protobuf for this message.
func buildPlaintextData(inThread thread: TSThread, tx: DBWriteTransaction) throws -> Data
// TODO: Merge this into the return value when sending a message.
var wasSentToAnyRecipient: Bool { get }
func sendingRecipientAddresses() -> [SignalServiceAddress]
func sentRecipientAddresses() -> [SignalServiceAddress]
func insertedMessageHasRenderableContent(rowId: Int64, tx: DBReadTransaction) -> Bool
func anyUpdateOutgoingMessage(transaction: DBWriteTransaction, block: (TSOutgoingMessage) -> Void)
func updateWithSkippedRecipients(_ skippedRecipients: some Sequence<SignalServiceAddress>, tx: DBWriteTransaction)
func updateWithFailedRecipients(_ recipientErrors: some Sequence<(serviceId: ServiceId, error: Error)>, tx: DBWriteTransaction)
func updateWithSentRecipients(_ serviceIds: some Sequence<ServiceId>, wasSentByUD: Bool, tx: DBWriteTransaction)
// TODO: Add SyncTranscriptableMessage protocol for these properties.
/// Indicates that this message needs a sync transcript.
///
/// If true, `buildSyncTranscriptMessage` will be invoked.
func shouldSyncTranscript() -> Bool
/// Builds a sync transcript for this message.
///
/// Only invoked if `shouldSyncTranscript` returns true.
func buildSyncTranscriptMessage(localThread: TSContactThread, tx: DBWriteTransaction) throws -> OutgoingSyncMessage
func thread(tx: DBReadTransaction) -> TSThread?
var shouldBeSaved: Bool { get }
/// True if this message should be stored in the Message Send Log.
var shouldRecordSendLog: Bool { get }
var relatedUniqueIds: Set<String> { get }
func envelopeGroupIdWithTransaction(_ transaction: DBReadTransaction) -> Data?
func update(withHasSyncedTranscript: Bool, transaction: DBWriteTransaction)
}
extension TSOutgoingMessage: SendableMessage {
var threadUniqueId: String { self.uniqueThreadId }
}