Update timers whenever we mark messages read

This commit is contained in:
Scott Nonnenberg 2021-07-19 13:45:18 -07:00 committed by GitHub
parent cd35a29638
commit 7761d83055
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 70 additions and 150 deletions

View File

@ -2,7 +2,7 @@
// SPDX-License-Identifier: AGPL-3.0-only
/* eslint-env node */
/* global log, Signal, Whisper */
/* global log, Signal */
const fs = require('fs-extra');
const path = require('path');
@ -60,7 +60,7 @@ exports.createConversation = async ({
await sleep(index * 100);
log.info(`Create message ${index + 1}`);
const message = await createRandomMessage({ conversationId });
return Signal.Data.saveMessage(message, { Message: Whisper.Message });
return Signal.Data.saveMessage(message);
})
);
};

View File

@ -10,7 +10,6 @@ const { isFunction, isNumber } = require('lodash');
const Message = require('./types/message');
exports.processNext = async ({
BackboneMessage,
BackboneMessageCollection,
numMessagesPerBatch,
upgradeMessageSchema,
@ -18,12 +17,6 @@ exports.processNext = async ({
saveMessage,
maxVersion = Message.CURRENT_SCHEMA_VERSION,
} = {}) => {
if (!isFunction(BackboneMessage)) {
throw new TypeError(
"'BackboneMessage' (Whisper.Message) constructor is required"
);
}
if (!isFunction(BackboneMessageCollection)) {
throw new TypeError(
"'BackboneMessageCollection' (Whisper.MessageCollection)" +
@ -72,11 +65,7 @@ exports.processNext = async ({
const upgradeDuration = Date.now() - upgradeStartTime;
const saveStartTime = Date.now();
await Promise.all(
upgradedMessages.map(message =>
saveMessage(message, { Message: BackboneMessage })
)
);
await Promise.all(upgradedMessages.map(message => saveMessage(message)));
const saveDuration = Date.now() - saveStartTime;
const totalDuration = Date.now() - startTime;

View File

@ -29,7 +29,7 @@ import { routineProfileRefresh } from './routineProfileRefresh';
import { isMoreRecentThan, isOlderThan } from './util/timestamp';
import { isValidReactionEmoji } from './reactions/isValidReactionEmoji';
import { ConversationModel } from './models/conversations';
import { getMessageById, MessageModel } from './models/messages';
import { getMessageById } from './models/messages';
import { createBatcher } from './util/batcher';
import { updateConversationsWithUuidLookup } from './updateConversationsWithUuidLookup';
import { initializeAllJobQueues } from './jobs/initializeAllJobQueues';
@ -859,7 +859,6 @@ export async function startApp(): Promise<void> {
if (!isMigrationWithIndexComplete) {
const batchWithIndex = await MessageDataMigrator.processNext({
BackboneMessage: window.Whisper.Message,
BackboneMessageCollection: window.Whisper.MessageCollection,
numMessagesPerBatch: NUM_MESSAGES_PER_BATCH,
upgradeMessageSchema,
@ -1770,9 +1769,7 @@ export async function startApp(): Promise<void> {
}
);
await window.Signal.Data.saveMessages(newMessageAttributes, {
Message: MessageModel,
});
await window.Signal.Data.saveMessages(newMessageAttributes);
}
window.log.info('Expiration start timestamp cleanup: complete');
@ -2564,9 +2561,7 @@ export async function startApp(): Promise<void> {
messagesToSave.push(message.attributes);
}
});
await window.Signal.Data.saveMessages(messagesToSave, {
Message: MessageModel,
});
await window.Signal.Data.saveMessages(messagesToSave);
}
function onReconnect() {
// We disable notifications on first connect, but the same applies to reconnect. In

View File

@ -1718,7 +1718,6 @@ export async function createGroupV2({
};
await window.Signal.Data.saveMessages([createdTheGroupMessage], {
forceSave: true,
Message: window.Whisper.Message,
});
const model = new window.Whisper.Message(createdTheGroupMessage);
window.MessageController.register(model.id, model);
@ -2864,7 +2863,6 @@ async function updateGroup(
if (changeMessagesToSave.length > 0) {
await window.Signal.Data.saveMessages(changeMessagesToSave, {
forceSave: true,
Message: window.Whisper.Message,
});
changeMessagesToSave.forEach(changeMessage => {
const model = new window.Whisper.Message(changeMessage);

View File

@ -297,9 +297,7 @@ async function _finishJob(
): Promise<void> {
if (message) {
logger.info(`attachment_downloads/_finishJob for job id: ${id}`);
await saveMessage(message.attributes, {
Message: window.Whisper.Message,
});
await saveMessage(message.attributes);
}
await removeAttachmentDownloadJob(id);

View File

@ -1601,9 +1601,7 @@ export class ConversationModel extends window.Backbone
const registered = window.MessageController.register(m.id, m);
const shouldSave = await registered.queueAttachmentDownloads();
if (shouldSave) {
await window.Signal.Data.saveMessage(registered.attributes, {
Message: window.Whisper.Message,
});
await window.Signal.Data.saveMessage(registered.attributes);
}
})
);
@ -2414,9 +2412,7 @@ export class ConversationModel extends window.Backbone
// this type does not fully implement the interface it is expected to
} as unknown) as typeof window.Whisper.MessageAttributesType;
const id = await window.Signal.Data.saveMessage(message, {
Message: window.Whisper.Message,
});
const id = await window.Signal.Data.saveMessage(message);
const model = window.MessageController.register(
id,
new window.Whisper.Message({
@ -2454,9 +2450,7 @@ export class ConversationModel extends window.Backbone
// this type does not fully implement the interface it is expected to
} as unknown) as typeof window.Whisper.MessageAttributesType;
const id = await window.Signal.Data.saveMessage(message, {
Message: window.Whisper.Message,
});
const id = await window.Signal.Data.saveMessage(message);
const model = window.MessageController.register(
id,
new window.Whisper.Message({
@ -2492,9 +2486,7 @@ export class ConversationModel extends window.Backbone
// this type does not fully implement the interface it is expected to
} as unknown) as typeof window.Whisper.MessageAttributesType;
const id = await window.Signal.Data.saveMessage(message, {
Message: window.Whisper.Message,
});
const id = await window.Signal.Data.saveMessage(message);
const model = window.MessageController.register(
id,
new window.Whisper.Message({
@ -2552,9 +2544,7 @@ export class ConversationModel extends window.Backbone
// TODO: DESKTOP-722
} as unknown) as typeof window.Whisper.MessageAttributesType;
const id = await window.Signal.Data.saveMessage(message, {
Message: window.Whisper.Message,
});
const id = await window.Signal.Data.saveMessage(message);
const model = window.MessageController.register(
id,
new window.Whisper.Message({
@ -2613,9 +2603,7 @@ export class ConversationModel extends window.Backbone
// TODO: DESKTOP-722
} as unknown) as typeof window.Whisper.MessageAttributesType;
const id = await window.Signal.Data.saveMessage(message, {
Message: window.Whisper.Message,
});
const id = await window.Signal.Data.saveMessage(message);
const model = window.MessageController.register(
id,
new window.Whisper.Message({
@ -2666,9 +2654,7 @@ export class ConversationModel extends window.Backbone
// TODO: DESKTOP-722
} as unknown) as typeof window.Whisper.MessageAttributesType;
const id = await window.Signal.Data.saveMessage(message, {
Message: window.Whisper.Message,
});
const id = await window.Signal.Data.saveMessage(message);
const model = window.MessageController.register(
id,
new window.Whisper.Message({
@ -2702,9 +2688,7 @@ export class ConversationModel extends window.Backbone
// TODO: DESKTOP-722
} as unknown) as typeof window.Whisper.MessageAttributesType;
const id = await window.Signal.Data.saveMessage(message, {
Message: window.Whisper.Message,
});
const id = await window.Signal.Data.saveMessage(message);
const model = window.MessageController.register(
id,
new window.Whisper.Message({
@ -3579,7 +3563,6 @@ export class ConversationModel extends window.Backbone
const messageId = message.id;
await window.Signal.Data.saveMessage(message.attributes, {
forceSave: true,
Message: window.Whisper.Message,
});
const draftProperties = dontClearDraft
@ -4082,9 +4065,7 @@ export class ConversationModel extends window.Backbone
if (isDirectConversation(this.attributes)) {
model.set({ destination: this.getSendTarget() });
}
const id = await window.Signal.Data.saveMessage(model.attributes, {
Message: window.Whisper.Message,
});
const id = await window.Signal.Data.saveMessage(model.attributes);
model.set({ id });
@ -4182,9 +4163,7 @@ export class ConversationModel extends window.Backbone
if (isDirectConversation(this.attributes)) {
model.set({ destination: this.id });
}
const id = await window.Signal.Data.saveMessage(model.attributes, {
Message: window.Whisper.Message,
});
const id = await window.Signal.Data.saveMessage(model.attributes);
model.set({ id });
@ -4212,9 +4191,7 @@ export class ConversationModel extends window.Backbone
// TODO: DESKTOP-722
} as unknown) as MessageAttributesType);
const id = await window.Signal.Data.saveMessage(model.attributes, {
Message: window.Whisper.Message,
});
const id = await window.Signal.Data.saveMessage(model.attributes);
model.set({ id });
const message = window.MessageController.register(model.id, model);
@ -4257,9 +4234,7 @@ export class ConversationModel extends window.Backbone
// TODO: DESKTOP-722
} as unknown) as MessageAttributesType);
const id = await window.Signal.Data.saveMessage(model.attributes, {
Message: window.Whisper.Message,
});
const id = await window.Signal.Data.saveMessage(model.attributes);
model.set({ id });
const message = window.MessageController.register(model.id, model);

View File

@ -147,8 +147,6 @@ export function isQuoteAMatch(
}
export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
static updateTimers: () => void;
static getLongMessageAttachment: (
attachment: typeof window.WhatIsThis
) => typeof window.WhatIsThis;
@ -985,9 +983,7 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
this.getConversation()?.debouncedUpdateLastMessage?.();
if (shouldPersist) {
await window.Signal.Data.saveMessage(this.attributes, {
Message: window.Whisper.Message,
});
await window.Signal.Data.saveMessage(this.attributes);
}
await window.Signal.Data.deleteSentProtoByMessageId(this.id);
@ -1167,9 +1163,7 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
}
if (!skipSave && !this.doNotSave) {
await window.Signal.Data.saveMessage(this.attributes, {
Message: window.Whisper.Message,
});
await window.Signal.Data.saveMessage(this.attributes);
}
}
@ -1242,9 +1236,7 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
if (!recipients.length) {
window.log.warn('retrySend: Nobody to send to!');
return window.Signal.Data.saveMessage(this.attributes, {
Message: window.Whisper.Message,
});
return window.Signal.Data.saveMessage(this.attributes);
}
const attachmentsWithData = await Promise.all(
@ -1553,9 +1545,7 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
});
if (!this.doNotSave) {
await window.Signal.Data.saveMessage(this.attributes, {
Message: window.Whisper.Message,
});
await window.Signal.Data.saveMessage(this.attributes);
}
if (updateLeftPane) {
@ -1756,9 +1746,7 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
// We don't save because we're about to save below.
this.saveErrors(errors, { skipSave: true });
} finally {
await window.Signal.Data.saveMessage(this.attributes, {
Message: window.Whisper.Message,
});
await window.Signal.Data.saveMessage(this.attributes);
if (updateLeftPane) {
updateLeftPane();
@ -1815,9 +1803,7 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
return result;
}
await window.Signal.Data.saveMessage(this.attributes, {
Message: window.Whisper.Message,
});
await window.Signal.Data.saveMessage(this.attributes);
return result;
});
};
@ -2360,9 +2346,7 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
originalMessage.attributes
);
originalMessage.set(upgradedMessage);
await window.Signal.Data.saveMessage(upgradedMessage, {
Message: window.Whisper.Message,
});
await window.Signal.Data.saveMessage(upgradedMessage);
}
} catch (error) {
window.log.error(
@ -2496,9 +2480,7 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
unidentifiedDeliveries
),
});
await window.Signal.Data.saveMessage(toUpdate.attributes, {
Message: window.Whisper.Message,
});
await window.Signal.Data.saveMessage(toUpdate.attributes);
confirm();
return;
@ -3186,9 +3168,7 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
window.log.info(
`modifyTargetMessage/${this.idForLogging()}: Changes in second run; saving.`
);
await window.Signal.Data.saveMessage(this.attributes, {
Message: window.Whisper.Message,
});
await window.Signal.Data.saveMessage(this.attributes);
}
}
@ -3294,9 +3274,7 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
);
if (shouldPersist) {
await window.Signal.Data.saveMessage(this.attributes, {
Message: window.Whisper.Message,
});
await window.Signal.Data.saveMessage(this.attributes);
}
return oldReaction;
@ -3390,11 +3368,6 @@ window.Whisper.Message.getLongMessageAttachment = ({
};
};
window.Whisper.Message.updateTimers = () => {
window.Whisper.ExpiringMessagesListener.update();
window.Whisper.TapToViewMessagesListener.update();
};
window.Whisper.MessageCollection = window.Backbone.Collection.extend({
model: window.Whisper.Message,
comparator(left: Readonly<MessageModel>, right: Readonly<MessageModel>) {

View File

@ -1068,25 +1068,27 @@ async function hasUserInitiatedMessages(conversationId: string) {
async function saveMessage(
data: MessageType,
{ forceSave, Message }: { forceSave?: boolean; Message: typeof MessageModel }
options?: { forceSave?: boolean }
) {
const id = await channels.saveMessage(_cleanMessageData(data), {
forceSave,
});
Message.updateTimers();
const id = await channels.saveMessage(_cleanMessageData(data), options);
window.Whisper.ExpiringMessagesListener.update();
window.Whisper.TapToViewMessagesListener.update();
return id;
}
async function saveMessages(
arrayOfMessages: Array<MessageType>,
{ forceSave, Message }: { forceSave?: boolean; Message: typeof MessageModel }
options?: { forceSave?: boolean }
) {
await channels.saveMessages(
arrayOfMessages.map(message => _cleanMessageData(message)),
{ forceSave }
options
);
Message.updateTimers();
window.Whisper.ExpiringMessagesListener.update();
window.Whisper.TapToViewMessagesListener.update();
}
async function removeMessage(

View File

@ -293,6 +293,14 @@ export type DataInterface = {
options?: { limit?: number }
) => Promise<Array<ConversationType>>;
saveMessage: (
data: MessageType,
options?: { forceSave?: boolean }
) => Promise<string>;
saveMessages: (
arrayOfMessages: Array<MessageType>,
options?: { forceSave?: boolean }
) => Promise<void>;
getMessageCount: (conversationId?: string) => Promise<number>;
hasUserInitiatedMessages: (conversationId: string) => Promise<boolean>;
getAllMessageIds: () => Promise<Array<string>>;
@ -487,14 +495,6 @@ export type ServerInterface = DataInterface & {
conversationId: string,
options?: { limit?: number }
) => Promise<Array<SearchResultMessageType>>;
saveMessage: (
data: MessageType,
options: { forceSave?: boolean }
) => Promise<string>;
saveMessages: (
arrayOfMessages: Array<MessageType>,
options: { forceSave?: boolean }
) => Promise<void>;
updateConversation: (data: ConversationType) => Promise<void>;
// For testing only
@ -599,14 +599,6 @@ export type ClientInterface = DataInterface & {
ids: Array<string>,
options: { Message: typeof MessageModel }
) => Promise<void>;
saveMessage: (
data: MessageType,
options: { forceSave?: boolean; Message: typeof MessageModel }
) => Promise<string>;
saveMessages: (
arrayOfMessages: Array<MessageType>,
options: { forceSave?: boolean; Message: typeof MessageModel }
) => Promise<void>;
searchMessages: (
query: string,
options?: { limit?: number }

View File

@ -3496,11 +3496,11 @@ async function hasUserInitiatedMessages(
function saveMessageSync(
data: MessageType,
options: { forceSave?: boolean; alreadyInTransaction?: boolean } = {}
options?: { forceSave?: boolean; alreadyInTransaction?: boolean }
): string {
const db = getInstance();
const { forceSave, alreadyInTransaction } = options;
const { forceSave, alreadyInTransaction } = options || {};
if (!alreadyInTransaction) {
return db.transaction(() => {
@ -3657,16 +3657,17 @@ function saveMessageSync(
async function saveMessage(
data: MessageType,
options: { forceSave?: boolean; alreadyInTransaction?: boolean }
options?: { forceSave?: boolean; alreadyInTransaction?: boolean }
): Promise<string> {
return saveMessageSync(data, options);
}
async function saveMessages(
arrayOfMessages: Array<MessageType>,
{ forceSave }: { forceSave?: boolean } = {}
options?: { forceSave?: boolean }
): Promise<void> {
const db = getInstance();
const { forceSave } = options || {};
db.transaction(() => {
for (const message of arrayOfMessages) {

View File

@ -68,7 +68,6 @@ describe('Conversations', () => {
// Saving to db and updating the convo's last message
await window.Signal.Data.saveMessage(message.attributes, {
forceSave: true,
Message: window.Whisper.Message,
});
message = window.MessageController.register(message.id, message);
await window.Signal.Data.saveConversation(conversation.attributes);

View File

@ -111,7 +111,7 @@ describe('sendLog', () => {
timestamp,
type: 'outgoing',
},
{ forceSave: true, Message: window.Whisper.Message }
{ forceSave: true }
);
const bytes = Buffer.from(getRandomBytes(128));

View File

@ -130,5 +130,8 @@ export async function markConversationRead(
await sendReadReceiptsFor(conversationAttrs, unreadMessagesSyncData);
}
window.Whisper.ExpiringMessagesListener.update();
window.Whisper.TapToViewMessagesListener.update();
return true;
}

View File

@ -11,9 +11,7 @@ const updateMessageBatcher = createBatcher<MessageAttributesType>({
maxSize: 50,
processBatch: async (messageAttrs: Array<MessageAttributesType>) => {
window.log.info('updateMessageBatcher', messageAttrs.length);
await window.Signal.Data.saveMessages(messageAttrs, {
Message: window.Whisper.Message,
});
await window.Signal.Data.saveMessages(messageAttrs);
},
});
@ -23,9 +21,7 @@ export function queueUpdateMessage(messageAttr: MessageAttributesType): void {
if (shouldBatch) {
updateMessageBatcher.add(messageAttr);
} else {
window.Signal.Data.saveMessage(messageAttr, {
Message: window.Whisper.Message,
});
window.Signal.Data.saveMessage(messageAttr);
}
}
@ -41,7 +37,6 @@ export const saveNewMessageBatcher = createWaitBatcher<MessageAttributesType>({
window.log.info('saveNewMessageBatcher', messageAttrs.length);
await window.Signal.Data.saveMessages(messageAttrs, {
forceSave: true,
Message: window.Whisper.Message,
});
},
});

View File

@ -1150,9 +1150,7 @@ Whisper.ConversationView = Whisper.View.extend({
const upgradedMessage = await upgradeMessageSchema(attributes);
message.set(upgradedMessage);
// eslint-disable-next-line no-await-in-loop
await window.Signal.Data.saveMessage(upgradedMessage, {
Message: Whisper.Message,
});
await window.Signal.Data.saveMessage(upgradedMessage);
}
}
@ -2543,9 +2541,7 @@ Whisper.ConversationView = Whisper.View.extend({
// eslint-disable-next-line no-await-in-loop
rawMedia[i] = await upgradeMessageSchema(message);
// eslint-disable-next-line no-await-in-loop
await window.Signal.Data.saveMessage(rawMedia[i], {
Message: Whisper.Message,
});
await window.Signal.Data.saveMessage(rawMedia[i]);
}
}

16
ts/window.d.ts vendored
View File

@ -559,10 +559,7 @@ export type LoggerType = {
export type LogFunctionType = (...args: Array<unknown>) => void;
export type WhisperType = {
events: {
on: (name: string, callback: (param1: any, param2?: any) => void) => void;
trigger: (name: string, param1?: any, param2?: any) => void;
};
events: Backbone.Events;
Database: {
open: () => Promise<IDBDatabase>;
handleDOMException: (
@ -620,8 +617,15 @@ export type WhisperType = {
IdenticonSVGView: WhatIsThis;
ExpiringMessagesListener: WhatIsThis;
TapToViewMessagesListener: WhatIsThis;
ExpiringMessagesListener: {
init: (events: Backbone.Events) => void;
update: () => void;
};
TapToViewMessagesListener: {
nextCheck: null | number;
init: (events: Backbone.Events) => void;
update: () => void;
};
deliveryReceiptQueue: PQueue;
deliveryReceiptBatcher: BatcherType<DeliveryReceiptBatcherItemType>;