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/models/messageFactory.ts

162 lines
5.0 KiB
TypeScript

import { UserUtils } from '../session/utils';
import { SessionUtilConvoInfoVolatile } from '../session/utils/libsession/libsession_utils_convo_info_volatile';
import { READ_MESSAGE_STATE } from './conversationAttributes';
import { MessageModel } from './message';
import { MessageAttributesOptionals, MessageModelType } from './messageType';
function getSharedAttributesForSwarmMessage({
conversationId,
messageHash,
sentAt,
}: {
conversationId: string;
messageHash: string;
sentAt: number;
}) {
const now = Date.now();
return {
sent_at: sentAt,
received_at: now,
conversationId,
messageHash,
};
}
/**
* This function is only called when we get a message from ourself from a swarm polling event.
*
* NOTE: conversationId has to be the conversation in which this message should be added. So
* either syncTarget, groupId or envelope.source or senderIdentity
*/
export function createSwarmMessageSentFromUs(args: {
messageHash: string;
sentAt: number;
conversationId: string;
}): MessageModel {
// for messages we did send, we mark it as read and start the expiration timer
const messageData: MessageAttributesOptionals = {
...getSharedAttributesForSwarmMessage(args),
...getSharedAttributesForOutgoingMessage(),
};
return new MessageModel(messageData);
}
/**
* This function is only called by the Receiver when we get a message
* from someone else than ourself from a swarm polling event
* NOTE: conversationId has to be the conversation in which this message should be added. So
* either syncTarget, groupId or envelope.source or senderIdentity
*/
export function createSwarmMessageSentFromNotUs(args: {
messageHash: string;
sentAt: number;
sender: string;
conversationId: string;
}): MessageModel {
const messageAttributes: MessageAttributesOptionals = {
...getSharedAttributesForSwarmMessage(args),
...getSharedAttributesForIncomingMessage(),
source: args.sender,
};
markAttributesAsReadIfNeeded(messageAttributes);
return new MessageModel(messageAttributes);
}
function getSharedAttributesForPublicMessage({
serverTimestamp,
serverId,
conversationId,
}: {
serverId: number;
serverTimestamp: number;
conversationId: string;
}) {
return {
serverTimestamp: serverTimestamp || undefined,
serverId: serverId || undefined,
sent_at: serverTimestamp,
received_at: serverTimestamp,
isPublic: true,
conversationId,
messageHash: '', // we do not care of a messageHash for an opengroup message. we have serverId for that
// NOTE Community messages do not support disappearing messages
expirationStartTimestamp: undefined,
};
}
function getSharedAttributesForOutgoingMessage() {
return {
source: UserUtils.getOurPubKeyStrFromCache(),
unread: READ_MESSAGE_STATE.read,
sent_to: [],
sent: true,
type: 'outgoing' as MessageModelType,
direction: 'outgoing' as MessageModelType,
};
}
function getSharedAttributesForIncomingMessage() {
return {
unread: READ_MESSAGE_STATE.unread, // default to unread, but markAttributesAsReadIfNeeded will override it if needed
type: 'incoming' as MessageModelType,
direction: 'incoming' as MessageModelType,
};
}
export function markAttributesAsReadIfNeeded(messageAttributes: MessageAttributesOptionals) {
// if the message is trying to be added unread, make sure that it shouldn't be already read from our other devices
if (messageAttributes.unread === READ_MESSAGE_STATE.unread) {
const latestUnreadForThisConvo = SessionUtilConvoInfoVolatile.getVolatileInfoCached(
messageAttributes.conversationId
);
const sentAt = messageAttributes.serverTimestamp || messageAttributes.sent_at;
if (
sentAt &&
latestUnreadForThisConvo?.lastRead &&
sentAt <= latestUnreadForThisConvo.lastRead
) {
// The message was sent before our last read timestamp for that conversation.
// eslint-disable-next-line no-param-reassign
messageAttributes.unread = READ_MESSAGE_STATE.read;
}
}
}
/**
* This function is only called when we get a message from ourself from an opengroup polling event
*/
export function createPublicMessageSentFromUs(args: {
serverId: number;
serverTimestamp: number;
conversationId: string;
}): MessageModel {
const messageData: MessageAttributesOptionals = {
...getSharedAttributesForPublicMessage(args),
...getSharedAttributesForOutgoingMessage(),
};
return new MessageModel(messageData);
}
/**
* This function is only called by the Receiver when we get a message
* from someone else than ourself from an opengroup polling event
*/
export function createPublicMessageSentFromNotUs(args: {
serverId: number;
sender: string;
serverTimestamp: number;
conversationId: string;
}): MessageModel {
const messageAttributes: MessageAttributesOptionals = {
...getSharedAttributesForPublicMessage(args),
...getSharedAttributesForIncomingMessage(),
source: args.sender,
};
markAttributesAsReadIfNeeded(messageAttributes);
return new MessageModel(messageAttributes);
}