From e9e718bfcbc4cfe6d20b5001b1e6508b68665d47 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 24 Jun 2021 15:20:47 +1000 Subject: [PATCH] remove getInstance on MessageController=> getMessageController --- preload.js | 2 +- ts/models/conversation.ts | 4 ++-- ts/models/message.ts | 4 ++-- ts/receiver/closedGroups.ts | 4 ++-- ts/receiver/errors.ts | 4 ++-- ts/receiver/queuedJob.ts | 6 +++--- ts/session/group/index.ts | 10 ++++----- ts/session/messages/MessageController.ts | 27 ++++++++++++------------ ts/session/messages/index.ts | 4 ++-- ts/session/sending/MessageSentHandler.ts | 6 +++--- ts/session/utils/AttachmentsDownload.ts | 4 ++-- ts/window.d.ts | 1 - 12 files changed, 38 insertions(+), 38 deletions(-) diff --git a/preload.js b/preload.js index 271ebeab2..addb2108d 100644 --- a/preload.js +++ b/preload.js @@ -343,7 +343,7 @@ window.models = require('./ts/models'); window.Signal = window.Signal || {}; window.Signal.Data = require('./ts/data/data'); -window.getMessageController = () => window.libsession.Messages.MessageController.getInstance(); +window.getMessageController = () => window.libsession.Messages.getMessageController(); // Pulling these in separately since they access filesystem, electron window.Signal.Backup = require('./js/modules/backup'); diff --git a/ts/models/conversation.ts b/ts/models/conversation.ts index 975f35280..54a4e9b3b 100644 --- a/ts/models/conversation.ts +++ b/ts/models/conversation.ts @@ -6,7 +6,7 @@ import { ClosedGroupVisibleMessage } from '../session/messages/outgoing/visibleM import { PubKey } from '../session/types'; import { UserUtils } from '../session/utils'; import { BlockedNumberController } from '../util'; -import { MessageController } from '../session/messages'; +import { getMessageController } from '../session/messages'; import { leaveClosedGroup } from '../session/group'; import { SignalService } from '../protobuf'; import { MessageModel } from './message'; @@ -873,7 +873,7 @@ export class ConversationModel extends Backbone.Model { if (setToExpire) { await model.setToExpire(); } - MessageController.getInstance().register(messageId, model); + getMessageController().register(messageId, model); window.inboxStore?.dispatch( conversationActions.messageAdded({ conversationKey: this.id, diff --git a/ts/models/message.ts b/ts/models/message.ts index 1227947af..cda7a16c0 100644 --- a/ts/models/message.ts +++ b/ts/models/message.ts @@ -5,7 +5,6 @@ import _ from 'lodash'; import { SignalService } from '../../ts/protobuf'; import { getMessageQueue, Utils } from '../../ts/session'; import { getConversationController } from '../../ts/session/conversations'; -import { MessageController } from '../../ts/session/messages'; import { DataMessage } from '../../ts/session/messages/outgoing'; import { ClosedGroupVisibleMessage } from '../session/messages/outgoing/visibleMessage/ClosedGroupVisibleMessage'; import { PubKey } from '../../ts/session/types'; @@ -34,6 +33,7 @@ import { import { acceptOpenGroupInvitation } from '../interactions/messageInteractions'; import { OpenGroupVisibleMessage } from '../session/messages/outgoing/visibleMessage/OpenGroupVisibleMessage'; import { getV2OpenGroupRoom } from '../data/opengroups'; +import { getMessageController } from '../session/messages'; export class MessageModel extends Backbone.Model { public propsForTimerNotification: any; @@ -262,7 +262,7 @@ export class MessageModel extends Backbone.Model { } public async cleanup() { - MessageController.getInstance().unregister(this.id); + getMessageController().unregister(this.id); await window.Signal.Migrations.deleteExternalMessageFiles(this.attributes); } diff --git a/ts/receiver/closedGroups.ts b/ts/receiver/closedGroups.ts index 9bb5a1d49..fe6ad80e8 100644 --- a/ts/receiver/closedGroups.ts +++ b/ts/receiver/closedGroups.ts @@ -29,7 +29,7 @@ import { UserUtils } from '../session/utils'; import { ConversationModel, ConversationTypeEnum } from '../models/conversation'; import _ from 'lodash'; import { forceSyncConfigurationNowIfNeeded } from '../session/utils/syncUtils'; -import { MessageController } from '../session/messages'; +import { getMessageController } from '../session/messages'; import { ClosedGroupEncryptionPairReplyMessage } from '../session/messages/outgoing/controlMessage/group/ClosedGroupEncryptionPairReplyMessage'; import { queueAllCachedFromSource } from './receiver'; import { actions as conversationActions } from '../state/ducks/conversations'; @@ -871,7 +871,7 @@ export async function createClosedGroup(groupName: string, members: Array 1) { @@ -444,7 +444,7 @@ export async function handleMessageJob( messageModel: message, }) ); - MessageController.getInstance().register(message.id, message); + getMessageController().register(message.id, message); // Note that this can save the message again, if jobs were queued. We need to // call it after we have an id for this message, because the jobs refer back diff --git a/ts/session/group/index.ts b/ts/session/group/index.ts index ab541d25d..81ff453a1 100644 --- a/ts/session/group/index.ts +++ b/ts/session/group/index.ts @@ -19,7 +19,7 @@ import { ClosedGroupMemberLeftMessage } from '../messages/outgoing/controlMessag import { ConversationModel, ConversationTypeEnum } from '../../models/conversation'; import { MessageModel } from '../../models/message'; import { MessageModelType } from '../../models/messageType'; -import { MessageController } from '../messages'; +import { getMessageController } from '../messages'; import { distributingClosedGroupEncryptionKeyPairs, markGroupAsLeftOrKicked, @@ -118,21 +118,21 @@ export async function initiateGroupUpdate( if (diff.newName?.length) { const nameOnlyDiff: GroupDiff = { newName: diff.newName }; const dbMessageName = await addUpdateMessage(convo, nameOnlyDiff, 'outgoing', Date.now()); - MessageController.getInstance().register(dbMessageName.id, dbMessageName); + getMessageController().register(dbMessageName.id, dbMessageName); await sendNewName(convo, diff.newName, dbMessageName.id); } if (diff.joiningMembers?.length) { const joiningOnlyDiff: GroupDiff = { joiningMembers: diff.joiningMembers }; const dbMessageAdded = await addUpdateMessage(convo, joiningOnlyDiff, 'outgoing', Date.now()); - MessageController.getInstance().register(dbMessageAdded.id, dbMessageAdded); + getMessageController().register(dbMessageAdded.id, dbMessageAdded); await sendAddedMembers(convo, diff.joiningMembers, dbMessageAdded.id, updateObj); } if (diff.leavingMembers?.length) { const leavingOnlyDiff: GroupDiff = { leavingMembers: diff.leavingMembers }; const dbMessageLeaving = await addUpdateMessage(convo, leavingOnlyDiff, 'outgoing', Date.now()); - MessageController.getInstance().register(dbMessageLeaving.id, dbMessageLeaving); + getMessageController().register(dbMessageLeaving.id, dbMessageLeaving); const stillMembers = members; await sendRemovedMembers(convo, diff.leavingMembers, stillMembers, dbMessageLeaving.id); } @@ -321,7 +321,7 @@ export async function leaveClosedGroup(groupId: string) { received_at: now, expireTimer: 0, }); - MessageController.getInstance().register(dbMessage.id, dbMessage); + getMessageController().register(dbMessage.id, dbMessage); // Send the update to the group const ourLeavingMessage = new ClosedGroupMemberLeftMessage({ timestamp: Date.now(), diff --git a/ts/session/messages/MessageController.ts b/ts/session/messages/MessageController.ts index aab5cc478..aaa7d37a1 100644 --- a/ts/session/messages/MessageController.ts +++ b/ts/session/messages/MessageController.ts @@ -1,34 +1,35 @@ // You can see MessageController for in memory registered messages. // Ee register messages to it everytime we send one, so that when an event happens we can find which message it was based on this id. -import { getMessagesByConversation } from '../../../ts/data/data'; -import { ConversationModel } from '../../models/conversation'; -import { MessageCollection, MessageModel } from '../../models/message'; +import { MessageModel } from '../../models/message'; type MessageControllerEntry = { message: MessageModel; timestamp: number; }; +let messageControllerInstance: MessageController | null; + +export const getMessageController = () => { + if (messageControllerInstance) { + return messageControllerInstance; + } + messageControllerInstance = new MessageController(); + return messageControllerInstance; +}; // It's not only data from the db which is stored on the MessageController entries, we could fetch this again. What we cannot fetch from the db and which is stored here is all listeners a particular messages is linked to for instance. We will be able to get rid of this once we don't use backbone models at all export class MessageController { - private static instance: MessageController | null; private readonly messageLookup: Map; - private constructor() { + /** + * Not to be used directly. Instead call getMessageController() + */ + constructor() { this.messageLookup = new Map(); // cleanup every hour the cache setInterval(this.cleanup, 3600 * 1000); } - public static getInstance() { - if (MessageController.instance) { - return MessageController.instance; - } - MessageController.instance = new MessageController(); - return MessageController.instance; - } - public register(id: string, message: MessageModel) { if (!(message instanceof MessageModel)) { throw new Error('Only MessageModels can be registered to the MessageController.'); diff --git a/ts/session/messages/index.ts b/ts/session/messages/index.ts index 94312c76b..0496ff9f9 100644 --- a/ts/session/messages/index.ts +++ b/ts/session/messages/index.ts @@ -1,4 +1,4 @@ import * as Outgoing from './outgoing'; -import { MessageController } from './MessageController'; +import { getMessageController } from './MessageController'; -export { Outgoing, MessageController }; +export { Outgoing, getMessageController }; diff --git a/ts/session/sending/MessageSentHandler.ts b/ts/session/sending/MessageSentHandler.ts index d0d424365..fb499ca78 100644 --- a/ts/session/sending/MessageSentHandler.ts +++ b/ts/session/sending/MessageSentHandler.ts @@ -2,7 +2,7 @@ import _ from 'lodash'; import { getMessageById } from '../../data/data'; import { SignalService } from '../../protobuf'; import { PnServer } from '../../pushnotification'; -import { MessageController } from '../messages'; +import { getMessageController } from '../messages'; import { OpenGroupVisibleMessage } from '../messages/outgoing/visibleMessage/OpenGroupVisibleMessage'; import { EncryptionType, RawMessage } from '../types'; import { UserUtils } from '../utils'; @@ -176,7 +176,7 @@ export class MessageSentHandler { private static async fetchHandleMessageSentData(m: RawMessage | OpenGroupVisibleMessage) { // if a message was sent and this message was sent after the last app restart, // this message is still in memory in the MessageController - const msg = MessageController.getInstance().get(m.identifier); + const msg = getMessageController().get(m.identifier); if (!msg || !msg.message) { // otherwise, look for it in the database @@ -187,7 +187,7 @@ export class MessageSentHandler { if (!dbMessage) { return null; } - MessageController.getInstance().register(m.identifier, dbMessage); + getMessageController().register(m.identifier, dbMessage); return dbMessage; } diff --git a/ts/session/utils/AttachmentsDownload.ts b/ts/session/utils/AttachmentsDownload.ts index 2d5c9d62a..525aa2205 100644 --- a/ts/session/utils/AttachmentsDownload.ts +++ b/ts/session/utils/AttachmentsDownload.ts @@ -12,7 +12,7 @@ import { } from '../../../ts/data/data'; import { MessageModel } from '../../models/message'; import { downloadAttachment, downloadAttachmentOpenGroupV2 } from '../../receiver/attachments'; -import { MessageController } from '../messages'; +import { getMessageController } from '../messages'; const MAX_ATTACHMENT_JOB_PARALLELISM = 3; @@ -155,7 +155,7 @@ async function _runJob(job: any) { return; } - message = MessageController.getInstance().register(found.id, found); + message = getMessageController().register(found.id, found); const pending = true; await setAttachmentDownloadJobPending(id, pending); diff --git a/ts/window.d.ts b/ts/window.d.ts index b27e0b18f..d8a86a540 100644 --- a/ts/window.d.ts +++ b/ts/window.d.ts @@ -9,7 +9,6 @@ import { LibTextsecure } from '../libtextsecure'; import { ConfirmationDialogParams } from '../background'; import { Store } from 'redux'; -import { MessageController } from './session/messages/MessageController'; import { DefaultTheme } from 'styled-components'; import { ConversationCollection, ConversationModel } from './models/conversation';