From 04c3f693988a64e9a9ecb7c75b387a1fc8299072 Mon Sep 17 00:00:00 2001 From: William Grant Date: Mon, 16 Oct 2023 14:23:46 +1100 Subject: [PATCH] refactor: export functions from an object for stubbing for disappearing messages index file --- ts/data/data.ts | 4 +- ts/mains/main_renderer.tsx | 4 +- ts/models/conversation.ts | 15 ++-- ts/models/message.ts | 27 +++--- ts/receiver/contentMessage.ts | 15 ++-- ts/receiver/dataMessage.ts | 8 +- ts/receiver/queuedJob.ts | 15 ++-- .../apis/open_group_api/sogsv3/sogsApiV3.ts | 4 +- ts/session/disappearing_messages/index.ts | 36 +++++--- ts/session/group/closed-group.ts | 17 ++-- ts/session/sending/MessageSender.ts | 9 +- ts/session/sending/MessageSentHandler.ts | 4 +- ts/session/utils/calling/CallManager.ts | 25 +++--- .../DisappearingMessage_test.ts | 82 ++++++++++--------- 14 files changed, 145 insertions(+), 120 deletions(-) diff --git a/ts/data/data.ts b/ts/data/data.ts index c74678c70..b2b789e28 100644 --- a/ts/data/data.ts +++ b/ts/data/data.ts @@ -10,7 +10,7 @@ import { StorageItem } from '../node/storage_item'; import { HexKeyPair } from '../receiver/keypairs'; import { Quote } from '../receiver/types'; import { getSodiumRenderer } from '../session/crypto'; -import { updateExpiringMessagesCheck } from '../session/disappearing_messages'; +import { DisappearingMessages } from '../session/disappearing_messages'; import { PubKey } from '../session/types'; import { fromArrayBufferToBase64, fromBase64ToArrayBuffer } from '../session/utils/String'; import { @@ -244,7 +244,7 @@ async function updateLastHash(data: UpdateLastHashType): Promise { async function saveMessage(data: MessageAttributes): Promise { const cleanedData = cleanData(data); const id = await channels.saveMessage(cleanedData); - updateExpiringMessagesCheck(); + DisappearingMessages.updateExpiringMessagesCheck(); return id; } diff --git a/ts/mains/main_renderer.tsx b/ts/mains/main_renderer.tsx index 4a7c5096c..e89bdd822 100644 --- a/ts/mains/main_renderer.tsx +++ b/ts/mains/main_renderer.tsx @@ -16,7 +16,7 @@ import { deleteAllLogs } from '../node/logs'; import { queueAllCached } from '../receiver/receiver'; import { loadKnownBlindedKeys } from '../session/apis/open_group_api/sogsv3/knownBlindedkeys'; import { getConversationController } from '../session/conversations'; -import { initExpiringMessageListener } from '../session/disappearing_messages'; +import { DisappearingMessages } from '../session/disappearing_messages'; import { AttachmentDownloads, ToastUtils } from '../session/utils'; import { getOurPubKeyStrFromCache } from '../session/utils/User'; import { runners } from '../session/utils/job_runners/JobRunner'; @@ -293,7 +293,7 @@ async function start() { ReactDOM.render(, document.getElementById('root')); switchBodyToRtlIfNeeded(); } - initExpiringMessageListener(); + DisappearingMessages.initExpiringMessageListener(); if (Registration.isDone() && !isSignInByLinking()) { await connect(); diff --git a/ts/models/conversation.ts b/ts/models/conversation.ts index dbb2934a8..70f6cdc74 100644 --- a/ts/models/conversation.ts +++ b/ts/models/conversation.ts @@ -117,10 +117,7 @@ import { getSubscriberCountOutsideRedux, } from '../state/selectors/sogsRoomInfo'; // decide it it makes sense to move this to a redux slice? -import { - changeToDisappearingMessageType, - setExpirationStartTimestamp, -} from '../session/disappearing_messages'; +import { DisappearingMessages } from '../session/disappearing_messages'; import { DisappearingMessageConversationModeType } from '../session/disappearing_messages/types'; import { markAttributesAsReadIfNeeded } from './messageFactory'; @@ -753,7 +750,7 @@ export class ConversationModel extends Backbone.Model { preview, attachments, sent_at: networkTimestamp, - expirationType: changeToDisappearingMessageType( + expirationType: DisappearingMessages.changeToDisappearingMessageType( this, this.getExpireTimer(), this.getExpirationMode() @@ -886,7 +883,11 @@ export class ConversationModel extends Backbone.Model { }); let message: MessageModel | undefined = existingMessage || undefined; - const expirationType = changeToDisappearingMessageType(this, expireTimer, expirationMode); + const expirationType = DisappearingMessages.changeToDisappearingMessageType( + this, + expireTimer, + expirationMode + ); const commonAttributes = { flags: SignalService.DataMessage.Flags.EXPIRATION_TIMER_UPDATE, @@ -940,7 +941,7 @@ export class ConversationModel extends Backbone.Model { expirationMode === 'deleteAfterSend' ) { message.set({ - expirationStartTimestamp: setExpirationStartTimestamp( + expirationStartTimestamp: DisappearingMessages.setExpirationStartTimestamp( expirationMode, message.get('sent_at'), 'updateExpireTimer() remote change', diff --git a/ts/models/message.ts b/ts/models/message.ts index 2d1c400af..e0cc2e85f 100644 --- a/ts/models/message.ts +++ b/ts/models/message.ts @@ -45,12 +45,7 @@ import { isUsAnySogsFromCache } from '../session/apis/open_group_api/sogsv3/know import { GetNetworkTime } from '../session/apis/snode_api/getNetworkTime'; import { SnodeNamespaces } from '../session/apis/snode_api/namespaces'; import { DURATION } from '../session/constants'; -import { - changeToDisappearingConversationMode, - checkForExpireUpdateInContentMessage, - setExpirationStartTimestamp, - updateMessageExpiryOnSwarm, -} from '../session/disappearing_messages'; +import { DisappearingMessages } from '../session/disappearing_messages'; import { TimerOptions } from '../session/disappearing_messages/timerOptions'; import { OpenGroupVisibleMessage } from '../session/messages/outgoing/visibleMessage/OpenGroupVisibleMessage'; import { @@ -267,7 +262,7 @@ export class MessageModel extends Backbone.Model { return ''; } - const expirationMode = changeToDisappearingConversationMode( + const expirationMode = DisappearingMessages.changeToDisappearingConversationMode( convo, expireTimerUpdate?.expirationType, expireTimer @@ -334,7 +329,7 @@ export class MessageModel extends Backbone.Model { } const { expireTimer, fromSync, source } = timerUpdate; - const expirationMode = changeToDisappearingConversationMode( + const expirationMode = DisappearingMessages.changeToDisappearingConversationMode( convo, timerUpdate?.expirationType || 'unknown', expireTimer || 0 @@ -1022,7 +1017,11 @@ export class MessageModel extends Backbone.Model { throw new Error('Cannot trigger syncMessage with unknown convo.'); } - const expireUpdate = await checkForExpireUpdateInContentMessage(content, conversation, true); + const expireUpdate = await DisappearingMessages.checkForExpireUpdateInContentMessage( + content, + conversation, + true + ); const syncMessage = buildSyncMessage( this.id, @@ -1108,7 +1107,7 @@ export class MessageModel extends Backbone.Model { const expireTimer = this.getExpireTimer(); if (canBeDeleteAfterRead && expirationType && expireTimer > 0) { - const expirationMode = changeToDisappearingConversationMode( + const expirationMode = DisappearingMessages.changeToDisappearingConversationMode( convo, expirationType, expireTimer @@ -1117,11 +1116,15 @@ export class MessageModel extends Backbone.Model { if (expirationMode === 'legacy' || expirationMode === 'deleteAfterRead') { if (this.isIncoming() && !this.isExpiring()) { // NOTE We want to trigger disappearing now and then the TTL can update itself while it is running. Otherwise the UI is blocked until the request is completed. - void updateMessageExpiryOnSwarm(this, 'markMessageReadNoCommit()', true); + void DisappearingMessages.updateMessageExpiryOnSwarm( + this, + 'markMessageReadNoCommit()', + true + ); } this.set({ - expirationStartTimestamp: setExpirationStartTimestamp( + expirationStartTimestamp: DisappearingMessages.setExpirationStartTimestamp( expirationMode, readAt, 'markMessageReadNoCommit', diff --git a/ts/receiver/contentMessage.ts b/ts/receiver/contentMessage.ts index 0507867d6..29f51e354 100644 --- a/ts/receiver/contentMessage.ts +++ b/ts/receiver/contentMessage.ts @@ -22,12 +22,7 @@ import { findCachedBlindedMatchOrLookupOnAllServers } from '../session/apis/open import { getConversationController } from '../session/conversations'; import { concatUInt8Array, getSodiumRenderer } from '../session/crypto'; import { removeMessagePadding } from '../session/crypto/BufferPadding'; -import { - changeToDisappearingMessageType, - checkForExpireUpdateInContentMessage, - checkHasOutdatedDisappearingMessageClient, - setExpirationStartTimestamp, -} from '../session/disappearing_messages'; +import { DisappearingMessages } from '../session/disappearing_messages'; import { ProfileManager } from '../session/profile_manager/ProfileManager'; import { GroupUtils, UserUtils } from '../session/utils'; import { perfEnd, perfStart } from '../session/utils/Performance'; @@ -475,7 +470,7 @@ export async function innerHandleSwarmContentMessage( content.dataMessage.profileKey = null; } - const expireUpdate = await checkForExpireUpdateInContentMessage( + const expireUpdate = await DisappearingMessages.checkForExpireUpdateInContentMessage( content, conversationModelForUIUpdate ); @@ -487,7 +482,7 @@ export async function innerHandleSwarmContentMessage( // TODO legacy messages support will be removed in a future release if (expireUpdate?.isDisappearingMessagesV2Released) { - await checkHasOutdatedDisappearingMessageClient( + await DisappearingMessages.checkHasOutdatedDisappearingMessageClient( conversationModelForUIUpdate, senderConversationModel, expireUpdate @@ -866,13 +861,13 @@ export async function handleDataExtractionNotification( if (convo && expirationMode && expireTimer > 0) { expirationType = expirationMode !== 'off' - ? changeToDisappearingMessageType(convo, expireTimer, expirationMode) + ? DisappearingMessages.changeToDisappearingMessageType(convo, expireTimer, expirationMode) : undefined; // NOTE Triggers disappearing for an incoming DataExtractionNotification message // TODO legacy messages support will be removed in a future release if (expirationMode === 'legacy' || expirationMode === 'deleteAfterSend') { - expirationStartTimestamp = setExpirationStartTimestamp( + expirationStartTimestamp = DisappearingMessages.setExpirationStartTimestamp( expirationMode, undefined, 'handleDataExtractionNotification' diff --git a/ts/receiver/dataMessage.ts b/ts/receiver/dataMessage.ts index 9fc870509..d5970afc7 100644 --- a/ts/receiver/dataMessage.ts +++ b/ts/receiver/dataMessage.ts @@ -19,7 +19,7 @@ import { createSwarmMessageSentFromNotUs, createSwarmMessageSentFromUs, } from '../models/messageFactory'; -import { getMessageReadyToDisappear } from '../session/disappearing_messages'; +import { DisappearingMessages } from '../session/disappearing_messages'; import { DisappearingMessageUpdate } from '../session/disappearing_messages/types'; import { ProfileManager } from '../session/profile_manager/ProfileManager'; import { isUsFromCache } from '../session/utils/User'; @@ -257,7 +257,11 @@ export async function handleSwarmDataMessage( }); if (!isEmpty(expireUpdate)) { - msgModel = getMessageReadyToDisappear(convoToAddMessageTo, msgModel, expireUpdate); + msgModel = DisappearingMessages.getMessageReadyToDisappear( + convoToAddMessageTo, + msgModel, + expireUpdate + ); } await handleSwarmMessage( diff --git a/ts/receiver/queuedJob.ts b/ts/receiver/queuedJob.ts index 4d06b9434..3520f42c2 100644 --- a/ts/receiver/queuedJob.ts +++ b/ts/receiver/queuedJob.ts @@ -10,10 +10,7 @@ import { Quote } from './types'; import { ConversationTypeEnum } from '../models/conversationAttributes'; import { MessageDirection } from '../models/messageType'; import { SignalService } from '../protobuf'; -import { - changeToDisappearingConversationMode, - setExpirationStartTimestamp, -} from '../session/disappearing_messages'; +import { DisappearingMessages } from '../session/disappearing_messages'; import { ProfileManager } from '../session/profile_manager/ProfileManager'; import { PubKey } from '../session/types'; import { UserUtils } from '../session/utils'; @@ -347,7 +344,7 @@ async function markConvoAsReadIfOutgoingMessage( expireTimer > 0 && Boolean(message.getExpirationStartTimestamp()) === false ) { - const expirationMode = changeToDisappearingConversationMode( + const expirationMode = DisappearingMessages.changeToDisappearingConversationMode( conversation, expirationType, expireTimer @@ -355,7 +352,7 @@ async function markConvoAsReadIfOutgoingMessage( if (expirationMode !== 'off') { message.set({ - expirationStartTimestamp: setExpirationStartTimestamp( + expirationStartTimestamp: DisappearingMessages.setExpirationStartTimestamp( expirationMode, message.get('sent_at'), 'markConvoAsReadIfOutgoingMessage', @@ -397,7 +394,7 @@ export async function handleMessageJob( messageModel.getExpireTimer() > 0 && Boolean(messageModel.getExpirationStartTimestamp()) === false ) { - const expirationMode = changeToDisappearingConversationMode( + const expirationMode = DisappearingMessages.changeToDisappearingConversationMode( conversation, messageModel.getExpirationType(), messageModel.getExpireTimer() @@ -410,7 +407,7 @@ export async function handleMessageJob( expirationMode === 'deleteAfterSend' ) { messageModel.set({ - expirationStartTimestamp: setExpirationStartTimestamp( + expirationStartTimestamp: DisappearingMessages.setExpirationStartTimestamp( expirationMode, messageModel.get('sent_at'), 'handleMessageJob', @@ -437,7 +434,7 @@ export async function handleMessageJob( } const expireTimerUpdate = expirationTimerUpdate?.expireTimer || 0; - const expirationModeUpdate = changeToDisappearingConversationMode( + const expirationModeUpdate = DisappearingMessages.changeToDisappearingConversationMode( conversation, expirationTimerUpdate?.expirationType, expireTimerUpdate diff --git a/ts/session/apis/open_group_api/sogsv3/sogsApiV3.ts b/ts/session/apis/open_group_api/sogsv3/sogsApiV3.ts index 392cd849e..d38cc0411 100644 --- a/ts/session/apis/open_group_api/sogsv3/sogsApiV3.ts +++ b/ts/session/apis/open_group_api/sogsv3/sogsApiV3.ts @@ -38,7 +38,7 @@ import { EnvelopePlus } from '../../../../receiver/types'; import { assertUnreachable } from '../../../../types/sqlSharedTypes'; import { getSodiumRenderer } from '../../../crypto'; import { removeMessagePadding } from '../../../crypto/BufferPadding'; -import { destroyMessagesAndUpdateRedux } from '../../../disappearing_messages'; +import { DisappearingMessages } from '../../../disappearing_messages'; import { UserUtils } from '../../../utils'; import { sogsRollingDeletions } from './sogsRollingDeletions'; import { processMessagesUsingCache } from './sogsV3MutationCache'; @@ -182,7 +182,7 @@ const handleSogsV3DeletedMessages = async ( }); if (messageIds && messageIds.length) { - await destroyMessagesAndUpdateRedux( + await DisappearingMessages.destroyMessagesAndUpdateRedux( messageIds.map(messageId => ({ conversationKey: convoId, messageId, diff --git a/ts/session/disappearing_messages/index.ts b/ts/session/disappearing_messages/index.ts index 8520730f7..97cc2a2bc 100644 --- a/ts/session/disappearing_messages/index.ts +++ b/ts/session/disappearing_messages/index.ts @@ -23,7 +23,7 @@ import { DisappearingMessageUpdate, } from './types'; -export async function destroyMessagesAndUpdateRedux( +async function destroyMessagesAndUpdateRedux( messages: Array<{ conversationKey: string; messageId: string; @@ -131,7 +131,7 @@ const throttledCheckExpiringMessages = throttle(checkExpiringMessages, 1000); let isInit = false; -export const initExpiringMessageListener = () => { +const initExpiringMessageListener = () => { if (isInit) { throw new Error('expiring messages listener is already init'); } @@ -143,11 +143,11 @@ export const initExpiringMessageListener = () => { isInit = true; }; -export const updateExpiringMessagesCheck = () => { +const updateExpiringMessagesCheck = () => { void throttledCheckExpiringMessages(); }; -export function setExpirationStartTimestamp( +function setExpirationStartTimestamp( mode: DisappearingMessageConversationModeType, timestamp?: number, // these are for debugging purposes @@ -224,7 +224,7 @@ export function setExpirationStartTimestamp( * @param expirationMode DisappearingMessageConversationModeType * @returns Disappearing mode we should use */ -export function changeToDisappearingMessageType( +function changeToDisappearingMessageType( convo: ConversationModel, expireTimer: number, expirationMode?: DisappearingMessageConversationModeType @@ -256,7 +256,7 @@ export function changeToDisappearingMessageType( * @param expireTimer in seconds, 0 means no expiration * @returns */ -export function changeToDisappearingConversationMode( +function changeToDisappearingConversationMode( convo: ConversationModel, expirationType?: DisappearingMessageType, expireTimer?: number @@ -273,7 +273,7 @@ export function changeToDisappearingConversationMode( } // TODO legacy messages support will be removed in a future release -export async function checkForExpireUpdateInContentMessage( +async function checkForExpireUpdateInContentMessage( content: SignalService.Content, convoToUpdate: ConversationModel, isOutgoing?: boolean @@ -415,7 +415,7 @@ export async function checkForExpireUpdateInContentMessage( /** * Checks if an outgoing message is meant to disappear and if so trigger the timer */ -export function checkForExpiringOutgoingMessage(message: MessageModel, location?: string) { +function checkForExpiringOutgoingMessage(message: MessageModel, location?: string) { const convo = message.getConversation(); const expireTimer = message.getExpireTimer(); const expirationType = message.getExpirationType(); @@ -441,7 +441,7 @@ export function checkForExpiringOutgoingMessage(message: MessageModel, location? } // TODO legacy messages support will be removed in a future release -export function getMessageReadyToDisappear( +function getMessageReadyToDisappear( conversationModel: ConversationModel, messageModel: MessageModel, expireUpdate?: DisappearingMessageUpdate @@ -495,7 +495,7 @@ export function getMessageReadyToDisappear( return messageModel; } -export async function checkHasOutdatedDisappearingMessageClient( +async function checkHasOutdatedDisappearingMessageClient( convoToUpdate: ConversationModel, sender: ConversationModel, expireUpdate: DisappearingMessageUpdate @@ -533,7 +533,7 @@ export async function checkHasOutdatedDisappearingMessageClient( } } -export async function updateMessageExpiryOnSwarm( +async function updateMessageExpiryOnSwarm( message: MessageModel, callLocation?: string, // this is for debugging purposes shouldCommit?: boolean @@ -588,3 +588,17 @@ export async function updateMessageExpiryOnSwarm( return message; } + +export const DisappearingMessages = { + destroyMessagesAndUpdateRedux, + initExpiringMessageListener, + updateExpiringMessagesCheck, + setExpirationStartTimestamp, + changeToDisappearingMessageType, + changeToDisappearingConversationMode, + checkForExpireUpdateInContentMessage, + checkForExpiringOutgoingMessage, + getMessageReadyToDisappear, + checkHasOutdatedDisappearingMessageClient, + updateMessageExpiryOnSwarm, +}; diff --git a/ts/session/group/closed-group.ts b/ts/session/group/closed-group.ts index e984ed33d..a13a82486 100644 --- a/ts/session/group/closed-group.ts +++ b/ts/session/group/closed-group.ts @@ -17,10 +17,7 @@ import { SnodeNamespaces } from '../apis/snode_api/namespaces'; import { getConversationController } from '../conversations'; import { generateCurve25519KeyPairWithoutPrefix } from '../crypto'; import { encryptUsingSessionProtocol } from '../crypto/MessageEncrypter'; -import { - changeToDisappearingMessageType, - setExpirationStartTimestamp, -} from '../disappearing_messages'; +import { DisappearingMessages } from '../disappearing_messages'; import { DisappearAfterSendOnly } from '../disappearing_messages/types'; import { ClosedGroupAddedMembersMessage } from '../messages/outgoing/controlMessage/group/ClosedGroupAddedMembersMessage'; import { ClosedGroupEncryptionPairMessage } from '../messages/outgoing/controlMessage/group/ClosedGroupEncryptionPairMessage'; @@ -72,7 +69,7 @@ export async function initiateClosedGroupUpdate( isGroupV3 ? ConversationTypeEnum.GROUPV3 : ConversationTypeEnum.GROUP ); - const expirationType = changeToDisappearingMessageType( + const expirationType = DisappearingMessages.changeToDisappearingMessageType( convo, convo.getExpireTimer(), convo.getExpirationMode() @@ -181,13 +178,13 @@ export async function addUpdateMessage( if (convo && expirationMode && expireTimer > 0) { expirationType = expirationMode !== 'off' - ? changeToDisappearingMessageType(convo, expireTimer, expirationMode) + ? DisappearingMessages.changeToDisappearingMessageType(convo, expireTimer, expirationMode) : undefined; // NOTE Triggers disappearing for an incoming groupUpdate message // TODO legacy messages support will be removed in a future release if (expirationMode === 'legacy' || expirationMode === 'deleteAfterSend') { - expirationStartTimestamp = setExpirationStartTimestamp( + expirationStartTimestamp = DisappearingMessages.setExpirationStartTimestamp( expirationMode, sentAt, 'addUpdateMessage' @@ -339,7 +336,11 @@ async function sendAddedMembers( members, keypair: encryptionKeyPair, identifier: messageId || uuidv4(), - expirationType: changeToDisappearingMessageType(convo, existingExpireTimer, expirationMode), + expirationType: DisappearingMessages.changeToDisappearingMessageType( + convo, + existingExpireTimer, + expirationMode + ), expireTimer: existingExpireTimer, }); diff --git a/ts/session/sending/MessageSender.ts b/ts/session/sending/MessageSender.ts index 577d8b5c0..034983641 100644 --- a/ts/session/sending/MessageSender.ts +++ b/ts/session/sending/MessageSender.ts @@ -26,10 +26,7 @@ import { SnodeAPIStore } from '../apis/snode_api/storeMessage'; import { getConversationController } from '../conversations'; import { MessageEncrypter } from '../crypto'; import { addMessagePadding } from '../crypto/BufferPadding'; -import { - changeToDisappearingConversationMode, - updateMessageExpiryOnSwarm, -} from '../disappearing_messages'; +import { DisappearingMessages } from '../disappearing_messages'; import { ContentMessage } from '../messages/outgoing'; import { ConfigurationMessage } from '../messages/outgoing/controlMessage/ConfigurationMessage'; import { SharedConfigMessage } from '../messages/outgoing/controlMessage/SharedConfigMessage'; @@ -172,7 +169,7 @@ async function send( // a message has started to disappear foundMessage.getExpirationStartTimestamp() ) { - const expirationMode = changeToDisappearingConversationMode( + const expirationMode = DisappearingMessages.changeToDisappearingConversationMode( convo, expirationType, expireTimer @@ -185,7 +182,7 @@ async function send( canBeDeleteAfterRead && (expirationMode === 'legacy' || expirationMode === 'deleteAfterRead') ) { - await updateMessageExpiryOnSwarm(foundMessage, 'send()'); + await DisappearingMessages.updateMessageExpiryOnSwarm(foundMessage, 'send()'); } } diff --git a/ts/session/sending/MessageSentHandler.ts b/ts/session/sending/MessageSentHandler.ts index a70a654ff..830482d06 100644 --- a/ts/session/sending/MessageSentHandler.ts +++ b/ts/session/sending/MessageSentHandler.ts @@ -2,7 +2,7 @@ import _ from 'lodash'; import { Data } from '../../data/data'; import { SignalService } from '../../protobuf'; import { PnServer } from '../apis/push_notification_api'; -import { checkForExpiringOutgoingMessage } from '../disappearing_messages'; +import { DisappearingMessages } from '../disappearing_messages'; import { OpenGroupVisibleMessage } from '../messages/outgoing/visibleMessage/OpenGroupVisibleMessage'; import { RawMessage } from '../types'; import { UserUtils } from '../utils'; @@ -127,7 +127,7 @@ async function handleMessageSentSuccess( sent_at: effectiveTimestamp, }); - checkForExpiringOutgoingMessage(fetchedMessage, 'handleMessageSentSuccess'); + DisappearingMessages.checkForExpiringOutgoingMessage(fetchedMessage, 'handleMessageSentSuccess'); await fetchedMessage.commit(); fetchedMessage.getConversation()?.updateLastMessage(); diff --git a/ts/session/utils/calling/CallManager.ts b/ts/session/utils/calling/CallManager.ts index e169fcbee..49fba9473 100644 --- a/ts/session/utils/calling/CallManager.ts +++ b/ts/session/utils/calling/CallManager.ts @@ -30,10 +30,7 @@ import { PnServer } from '../../apis/push_notification_api'; import { GetNetworkTime } from '../../apis/snode_api/getNetworkTime'; import { SnodeNamespaces } from '../../apis/snode_api/namespaces'; import { DURATION } from '../../constants'; -import { - changeToDisappearingMessageType, - setExpirationStartTimestamp, -} from '../../disappearing_messages'; +import { DisappearingMessages } from '../../disappearing_messages'; import { MessageSender } from '../../sending'; import { getIsRinging } from '../RingingManager'; import { getBlackSilenceMediaStream } from './Silence'; @@ -521,10 +518,14 @@ export async function USER_callRecipient(recipient: string) { if (calledConvo && expirationMode && expireTimer > 0) { // TODO legacy messages support will be removed in a future release - expirationType = changeToDisappearingMessageType(calledConvo, expireTimer, expirationMode); + expirationType = DisappearingMessages.changeToDisappearingMessageType( + calledConvo, + expireTimer, + expirationMode + ); if (expirationMode === 'legacy' || expirationMode === 'deleteAfterSend') { - expirationStartTimestamp = setExpirationStartTimestamp( + expirationStartTimestamp = DisappearingMessages.setExpirationStartTimestamp( expirationMode, now, 'USER_callRecipient' @@ -906,10 +907,14 @@ export async function USER_acceptIncomingCallRequest(fromSender: string) { if (callerConvo && expirationMode && expireTimer > 0) { // TODO legacy messages support will be removed in a future release - expirationType = changeToDisappearingMessageType(callerConvo, expireTimer, expirationMode); + expirationType = DisappearingMessages.changeToDisappearingMessageType( + callerConvo, + expireTimer, + expirationMode + ); if (expirationMode === 'legacy' || expirationMode === 'deleteAfterSend') { - expirationStartTimestamp = setExpirationStartTimestamp( + expirationStartTimestamp = DisappearingMessages.setExpirationStartTimestamp( expirationMode, networkTimestamp, 'USER_acceptIncomingCallRequest' @@ -1263,14 +1268,14 @@ async function addMissedCallMessage(callerPubkey: string, sentAt: number) { if (incomingCallConversation && expirationMode && expireTimer > 0) { // TODO legacy messages support will be removed in a future release - expirationType = changeToDisappearingMessageType( + expirationType = DisappearingMessages.changeToDisappearingMessageType( incomingCallConversation, expireTimer, expirationMode ); if (expirationMode === 'legacy' || expirationMode === 'deleteAfterSend') { - expirationStartTimestamp = setExpirationStartTimestamp( + expirationStartTimestamp = DisappearingMessages.setExpirationStartTimestamp( expirationMode, sentAt, 'addMissedCallMessage' diff --git a/ts/test/session/unit/disappearing_messages/DisappearingMessage_test.ts b/ts/test/session/unit/disappearing_messages/DisappearingMessage_test.ts index 5bc1b6984..907892616 100644 --- a/ts/test/session/unit/disappearing_messages/DisappearingMessage_test.ts +++ b/ts/test/session/unit/disappearing_messages/DisappearingMessage_test.ts @@ -4,13 +4,7 @@ import Sinon from 'sinon'; import { ConversationModel } from '../../../../models/conversation'; import { ConversationTypeEnum } from '../../../../models/conversationAttributes'; import { GetNetworkTime } from '../../../../session/apis/snode_api/getNetworkTime'; -import { - changeToDisappearingConversationMode, - changeToDisappearingMessageType, - checkForExpireUpdateInContentMessage, - checkForExpiringOutgoingMessage, - setExpirationStartTimestamp, -} from '../../../../session/disappearing_messages'; +import { DisappearingMessages } from '../../../../session/disappearing_messages'; import { DisappearingMessageConversationModeType, DisappearingMessageType, @@ -54,7 +48,7 @@ describe('DisappearingMessage', () => { describe('setExpirationStartTimestamp', () => { it('returns a valid unix timestamp for deleteAfterRead', async () => { const mode: DisappearingMessageConversationModeType = 'deleteAfterRead'; - const expirationStartTimestamp = setExpirationStartTimestamp(mode); + const expirationStartTimestamp = DisappearingMessages.setExpirationStartTimestamp(mode); expect(expirationStartTimestamp, 'it should return a number').to.be.is.a('number'); expect(isValidUnixTimestamp(expirationStartTimestamp!), 'it should be a valid unix timestamp') @@ -62,7 +56,7 @@ describe('DisappearingMessage', () => { }); it('returns a valid unix timestamp for deleteAfterSend', async () => { const mode: DisappearingMessageConversationModeType = 'deleteAfterSend'; - const expirationStartTimestamp = setExpirationStartTimestamp(mode); + const expirationStartTimestamp = DisappearingMessages.setExpirationStartTimestamp(mode); expect(expirationStartTimestamp, 'it should return a number').to.be.is.a('number'); expect(isValidUnixTimestamp(expirationStartTimestamp!), 'it should be a valid unix timestamp') @@ -70,14 +64,17 @@ describe('DisappearingMessage', () => { }); it('returns undefined when disappearing messages is off', async () => { const mode: DisappearingMessageConversationModeType = 'off'; - const expirationStartTimestamp = setExpirationStartTimestamp(mode); + const expirationStartTimestamp = DisappearingMessages.setExpirationStartTimestamp(mode); expect(expirationStartTimestamp, 'it should return undefined').to.be.undefined; }); it('if we give it a timestamp it returns the older timestamp for deleteAfterRead', async () => { const mode: DisappearingMessageConversationModeType = 'deleteAfterRead'; const timestamp = new Date().valueOf(); - const expirationStartTimestamp = setExpirationStartTimestamp(mode, timestamp); + const expirationStartTimestamp = DisappearingMessages.setExpirationStartTimestamp( + mode, + timestamp + ); expect(expirationStartTimestamp, 'it should return a number').to.be.is.a('number'); expect(isValidUnixTimestamp(expirationStartTimestamp!), 'it should be a valid unix timestamp') @@ -90,7 +87,10 @@ describe('DisappearingMessage', () => { it('if we give it a timestamp it returns the older timestamp for deleteAfterSend', async () => { const mode: DisappearingMessageConversationModeType = 'deleteAfterSend'; const timestamp = new Date().valueOf(); - const expirationStartTimestamp = setExpirationStartTimestamp(mode, timestamp); + const expirationStartTimestamp = DisappearingMessages.setExpirationStartTimestamp( + mode, + timestamp + ); expect(expirationStartTimestamp, 'it should return a number').to.be.is.a('number'); expect(isValidUnixTimestamp(expirationStartTimestamp!), 'it should be a valid unix timestamp') @@ -103,7 +103,10 @@ describe('DisappearingMessage', () => { it('if we give it an invalid timestamp it returns undefined', async () => { const mode: DisappearingMessageConversationModeType = 'deleteAfterSend'; const timestamp = -1; - const expirationStartTimestamp = setExpirationStartTimestamp(mode, timestamp); + const expirationStartTimestamp = DisappearingMessages.setExpirationStartTimestamp( + mode, + timestamp + ); expect(expirationStartTimestamp, 'it should return undefined').to.be.undefined; }); @@ -116,7 +119,7 @@ describe('DisappearingMessage', () => { } as any); const expireTimer = 0; // seconds const expirationMode = 'off'; - const messageExpirationType = changeToDisappearingMessageType( + const messageExpirationType = DisappearingMessages.changeToDisappearingMessageType( conversation, expireTimer, expirationMode @@ -130,7 +133,7 @@ describe('DisappearingMessage', () => { } as any); const expireTimer = 60; // seconds const expirationMode = 'deleteAfterRead'; - const messageExpirationType = changeToDisappearingMessageType( + const messageExpirationType = DisappearingMessages.changeToDisappearingMessageType( conversation, expireTimer, expirationMode @@ -144,7 +147,7 @@ describe('DisappearingMessage', () => { } as any); const expireTimer = 60; // seconds const expirationMode = 'deleteAfterSend'; - const messageExpirationType = changeToDisappearingMessageType( + const messageExpirationType = DisappearingMessages.changeToDisappearingMessageType( conversation, expireTimer, expirationMode @@ -159,7 +162,7 @@ describe('DisappearingMessage', () => { } as any); const expireTimer = 60; // seconds const expirationMode = 'deleteAfterRead'; // not correct - const messageExpirationType = changeToDisappearingMessageType( + const messageExpirationType = DisappearingMessages.changeToDisappearingMessageType( ourConversation, expireTimer, expirationMode @@ -176,7 +179,7 @@ describe('DisappearingMessage', () => { } as any); const expireTimer = 60; // seconds const expirationMode = 'deleteAfterRead'; // not correct - const messageExpirationType = changeToDisappearingMessageType( + const messageExpirationType = DisappearingMessages.changeToDisappearingMessageType( ourConversation, expireTimer, expirationMode @@ -191,7 +194,7 @@ describe('DisappearingMessage', () => { } as any); const expireTimer = 0; // seconds const expirationMode = 'legacy'; - const messageExpirationType = changeToDisappearingMessageType( + const messageExpirationType = DisappearingMessages.changeToDisappearingMessageType( conversation, expireTimer, expirationMode @@ -204,7 +207,10 @@ describe('DisappearingMessage', () => { ...conversationArgs, } as any); const expireTimer = 0; // seconds - const messageExpirationType = changeToDisappearingMessageType(conversation, expireTimer); + const messageExpirationType = DisappearingMessages.changeToDisappearingMessageType( + conversation, + expireTimer + ); expect(messageExpirationType, 'returns unknown').to.be.eq('unknown'); }); @@ -218,7 +224,7 @@ describe('DisappearingMessage', () => { } as any); const expirationType = 'deleteAfterRead'; // not correct const expireTimer = 60; // seconds - const conversationMode = changeToDisappearingConversationMode( + const conversationMode = DisappearingMessages.changeToDisappearingConversationMode( ourConversation, expirationType, expireTimer @@ -235,7 +241,7 @@ describe('DisappearingMessage', () => { } as any); const expirationType = 'deleteAfterRead'; // not correct const expireTimer = 60; // seconds - const conversationMode = changeToDisappearingConversationMode( + const conversationMode = DisappearingMessages.changeToDisappearingConversationMode( ourConversation, expirationType, expireTimer @@ -249,7 +255,7 @@ describe('DisappearingMessage', () => { } as any); const expirationType = 'deleteAfterRead'; const expireTimer = 60; // seconds - const conversationMode = changeToDisappearingConversationMode( + const conversationMode = DisappearingMessages.changeToDisappearingConversationMode( ourConversation, expirationType, expireTimer @@ -263,7 +269,7 @@ describe('DisappearingMessage', () => { } as any); const expirationType = 'deleteAfterSend'; const expireTimer = 60; // seconds - const conversationMode = changeToDisappearingConversationMode( + const conversationMode = DisappearingMessages.changeToDisappearingConversationMode( ourConversation, expirationType, expireTimer @@ -275,7 +281,7 @@ describe('DisappearingMessage', () => { const conversation = new ConversationModel({ ...conversationArgs } as any); const expirationType: DisappearingMessageType = 'unknown'; const expireTimer = 0; // seconds - const conversationMode = changeToDisappearingConversationMode( + const conversationMode = DisappearingMessages.changeToDisappearingConversationMode( conversation, expirationType, expireTimer @@ -286,7 +292,7 @@ describe('DisappearingMessage', () => { it('if the type is undefined and expireTimer = 0 then the conversation mode is off', async () => { const conversation = new ConversationModel({ ...conversationArgs } as any); const expireTimer = 0; // seconds - const conversationMode = changeToDisappearingConversationMode( + const conversationMode = DisappearingMessages.changeToDisappearingConversationMode( conversation, undefined, expireTimer @@ -296,7 +302,9 @@ describe('DisappearingMessage', () => { }); it('if the type and expireTimer are undefined then the conversation mode is off', async () => { const conversation = new ConversationModel({ ...conversationArgs } as any); - const conversationMode = changeToDisappearingConversationMode(conversation); + const conversationMode = DisappearingMessages.changeToDisappearingConversationMode( + conversation + ); expect(conversationMode, 'returns off').to.be.eq('off'); }); @@ -305,7 +313,7 @@ describe('DisappearingMessage', () => { const conversation = new ConversationModel({ ...conversationArgs } as any); const expirationType: DisappearingMessageType = 'unknown'; const expireTimer = 60; // seconds - const conversationMode = changeToDisappearingConversationMode( + const conversationMode = DisappearingMessages.changeToDisappearingConversationMode( conversation, expirationType, expireTimer @@ -316,7 +324,7 @@ describe('DisappearingMessage', () => { it('if the type is undefined and expireTimer > 0 then the conversation mode is legacy', async () => { const conversation = new ConversationModel({ ...conversationArgs } as any); const expireTimer = 60; // seconds - const conversationMode = changeToDisappearingConversationMode( + const conversationMode = DisappearingMessages.changeToDisappearingConversationMode( conversation, undefined, expireTimer @@ -335,7 +343,7 @@ describe('DisappearingMessage', () => { // TODO legacy messages support will be removed in a future release Sinon.stub(ReleasedFeatures, 'checkIsDisappearMessageV2FeatureReleased').resolves(true); - const expireUpdate = await checkForExpireUpdateInContentMessage( + const expireUpdate = await DisappearingMessages.checkForExpireUpdateInContentMessage( visibleMessage.contentProto(), convoToUpdate, true @@ -366,7 +374,7 @@ describe('DisappearingMessage', () => { // TODO legacy messages support will be removed in a future release Sinon.stub(ReleasedFeatures, 'checkIsDisappearMessageV2FeatureReleased').resolves(true); - const expireUpdate = await checkForExpireUpdateInContentMessage( + const expireUpdate = await DisappearingMessages.checkForExpireUpdateInContentMessage( disappearingMessage.contentProto(), convoToUpdate, true @@ -406,7 +414,7 @@ describe('DisappearingMessage', () => { // TODO legacy messages support will be removed in a future release Sinon.stub(ReleasedFeatures, 'checkIsDisappearMessageV2FeatureReleased').resolves(true); - const expireUpdate = await checkForExpireUpdateInContentMessage( + const expireUpdate = await DisappearingMessages.checkForExpireUpdateInContentMessage( expirationTimerUpdateMessage.contentProto(), convoToUpdate, true @@ -447,7 +455,7 @@ describe('DisappearingMessage', () => { // TODO legacy messages support will be removed in a future release Sinon.stub(ReleasedFeatures, 'checkIsDisappearMessageV2FeatureReleased').resolves(true); - const expireUpdate = await checkForExpireUpdateInContentMessage( + const expireUpdate = await DisappearingMessages.checkForExpireUpdateInContentMessage( expirationTimerUpdateMessage.contentProto(), convoToUpdate, true @@ -485,7 +493,7 @@ describe('DisappearingMessage', () => { }); Sinon.stub(message, 'getConversation').returns(conversation); - checkForExpiringOutgoingMessage(message, 'unit tests'); + DisappearingMessages.checkForExpiringOutgoingMessage(message, 'unit tests'); expect(message.getExpirationStartTimestamp(), 'it should be defined').to.not.be.undefined; expect( @@ -508,7 +516,7 @@ describe('DisappearingMessage', () => { }); Sinon.stub(message, 'getConversation').returns(conversation); - checkForExpiringOutgoingMessage(message, 'unit tests'); + DisappearingMessages.checkForExpiringOutgoingMessage(message, 'unit tests'); expect(message.getExpirationStartTimestamp(), 'it should be undefined').to.be.undefined; }); @@ -524,7 +532,7 @@ describe('DisappearingMessage', () => { }); Sinon.stub(message, 'getConversation').returns(conversation); - checkForExpiringOutgoingMessage(message, 'unit tests'); + DisappearingMessages.checkForExpiringOutgoingMessage(message, 'unit tests'); expect(message.getExpirationStartTimestamp(), 'it should be undefined').to.be.undefined; }); @@ -543,7 +551,7 @@ describe('DisappearingMessage', () => { }); Sinon.stub(message, 'getConversation').returns(conversation); - checkForExpiringOutgoingMessage(message, 'unit tests'); + DisappearingMessages.checkForExpiringOutgoingMessage(message, 'unit tests'); expect(message.getExpirationStartTimestamp(), 'it should be defined').to.not.be.undefined; expect(