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.
160 lines
4.1 KiB
TypeScript
160 lines
4.1 KiB
TypeScript
3 years ago
|
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);
|
||
|
}
|