You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-desktop/ts/session/utils/Messages.ts

58 lines
2.0 KiB
TypeScript

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<RawMessage> {
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;
}