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

160 lines
4.1 KiB
TypeScript

import { UserUtils } from '../session/utils';
import { MessageModel } from './message';
import { MessageAttributesOptionals, MessageModelType } from './messageType';
export type MessageCreationData = {
timestamp: number;
receivedAt: number;
source: string;
isPublic: boolean;
serverId: number | null;
serverTimestamp: number | null;
groupId: string | null;
expirationStartTimestamp?: number;
destination: string;
messageHash: string;
};
function initIncomingMessage(data: MessageCreationData): MessageModel {
const {
timestamp,
isPublic,
receivedAt,
source,
serverId,
serverTimestamp,
messageHash,
groupId,
} = data;
const messageData: MessageAttributesOptionals = {
source,
serverId: serverId || undefined,
sent_at: timestamp,
serverTimestamp: serverTimestamp || undefined,
received_at: receivedAt || Date.now(),
conversationId: groupId ?? source,
type: 'incoming',
direction: 'incoming',
unread: 1,
isPublic,
messageHash: messageHash || undefined,
};
return new MessageModel(messageData);
}
/**
* This function can be called for either a sync message or a message synced through an opengroup poll.
* This does not save it to the db, just in memory
*/
function createMessageSentFromOurself({
timestamp,
serverTimestamp,
serverId,
isPublic,
receivedAt,
expirationStartTimestamp,
destination,
groupId,
messageHash,
}: {
timestamp: number;
receivedAt: number;
isPublic: boolean;
serverId: number | null;
serverTimestamp: number | null;
groupId: string | null;
expirationStartTimestamp: number | null;
destination: string;
messageHash: string;
}): MessageModel {
// Omit<
// MessageAttributesOptionals,
// 'conversationId' | 'source' | 'type' | 'direction' | 'received_at'
// >
const now = Date.now();
const messageData: MessageAttributesOptionals = {
source: UserUtils.getOurPubKeyStrFromCache(),
type: 'outgoing' as MessageModelType,
serverTimestamp: serverTimestamp || undefined,
serverId: serverId || undefined,
sent_at: timestamp,
received_at: isPublic ? receivedAt : now,
isPublic,
conversationId: groupId ?? destination,
messageHash,
unread: 0,
sent_to: [],
sent: true,
expirationStartTimestamp: Math.min(expirationStartTimestamp || data.timestamp || now, now),
};
return new MessageModel(messageData);
}
/**
* This function is only called when we get a message from ourself from an opengroup polling event
*/
export function createPublicMessageSentFromUs({
serverTimestamp,
serverId,
conversationId,
}: {
serverId: number;
serverTimestamp: number;
conversationId: string;
}): MessageModel {
const messageData: MessageAttributesOptionals = {
source: UserUtils.getOurPubKeyStrFromCache(),
type: 'outgoing' as MessageModelType,
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
unread: 0,
sent_to: [],
sent: true,
expirationStartTimestamp: undefined,
};
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({
serverTimestamp,
serverId,
conversationId,
sender,
}: {
serverId: number;
sender: string;
serverTimestamp: number;
conversationId: string;
}): MessageModel {
const messageData: MessageAttributesOptionals = {
source: sender,
conversationId,
type: 'incoming' as MessageModelType,
serverTimestamp: serverTimestamp,
sent_at: serverTimestamp,
received_at: serverTimestamp,
serverId,
isPublic: true,
messageHash: '', // we do not care of a messageHash for an opengroup message. we have serverId for that
unread: 1,
expirationStartTimestamp: undefined,
};
return new MessageModel(messageData);
}