import { RawMessage } from '../types/RawMessage'; import { PubKey } from '../types'; import { ClosedGroupMessage } from '../messages/outgoing/controlMessage/group/ClosedGroupMessage'; import { ClosedGroupNewMessage } from '../messages/outgoing/controlMessage/group/ClosedGroupNewMessage'; import { ClosedGroupEncryptionPairReplyMessage } from '../messages/outgoing/controlMessage/group/ClosedGroupEncryptionPairReplyMessage'; import { ContentMessage } from '../messages/outgoing'; import { ExpirationTimerUpdateMessage } from '../messages/outgoing/controlMessage/ExpirationTimerUpdateMessage'; import { SignalService } from '../../protobuf'; import { SnodeNamespaces } from '../apis/snode_api/namespaces'; function getEncryptionTypeFromMessageType( message: ContentMessage, isGroup = false ): SignalService.Envelope.Type { // ClosedGroupNewMessage is sent using established channels, so using fallback if ( message instanceof ClosedGroupNewMessage || message instanceof ClosedGroupEncryptionPairReplyMessage ) { return SignalService.Envelope.Type.SESSION_MESSAGE; } // 1. any ClosedGroupMessage which is not a ClosedGroupNewMessage must be encoded with ClosedGroup // 2. if TypingMessage or ExpirationTimer and groupId is set => must be encoded with ClosedGroup too if ( message instanceof ClosedGroupMessage || (message instanceof ExpirationTimerUpdateMessage && message.groupId) || isGroup ) { return SignalService.Envelope.Type.CLOSED_GROUP_MESSAGE; } return SignalService.Envelope.Type.SESSION_MESSAGE; } export async function toRawMessage( destinationPubKey: PubKey, message: ContentMessage, namespace: SnodeNamespaces, isGroup = false ): Promise { const ttl = message.ttl(); const plainTextBuffer = message.plainTextBuffer(); const encryption = getEncryptionTypeFromMessageType(message, isGroup); const rawMessage: RawMessage = { identifier: message.identifier, plainTextBuffer, device: destinationPubKey.key, ttl, encryption, namespace, }; return rawMessage; }