From e62606361d1d9af7161f20cf1c6eba07bb68602d Mon Sep 17 00:00:00 2001 From: Scott Nonnenberg Date: Mon, 28 Mar 2022 17:25:11 -0700 Subject: [PATCH] Sort message-initiated timer updates before the initiating message --- ts/background.ts | 10 +++------- ts/models/conversations.ts | 20 +++++++++++++------- ts/models/messages.ts | 10 ++-------- 3 files changed, 18 insertions(+), 22 deletions(-) diff --git a/ts/background.ts b/ts/background.ts index 876f806801..82171da5be 100644 --- a/ts/background.ts +++ b/ts/background.ts @@ -2618,13 +2618,10 @@ export async function startApp(): Promise { const { expireTimer } = details; const isValidExpireTimer = typeof expireTimer === 'number'; if (isValidExpireTimer) { - const ourId = window.ConversationController.getOurConversationId(); - const receivedAt = Date.now(); - await conversation.updateExpirationTimer( expireTimer, - ourId, - receivedAt, + window.ConversationController.getOurConversationId(), + undefined, { fromSync: true, } @@ -2717,11 +2714,10 @@ export async function startApp(): Promise { return; } - const receivedAt = Date.now(); await conversation.updateExpirationTimer( expireTimer, window.ConversationController.getOurConversationId(), - receivedAt, + undefined, { fromSync: true, } diff --git a/ts/models/conversations.ts b/ts/models/conversations.ts index e18c5b721e..4461c776ba 100644 --- a/ts/models/conversations.ts +++ b/ts/models/conversations.ts @@ -4396,11 +4396,13 @@ export class ConversationModel extends window.Backbone async updateExpirationTimer( providedExpireTimer: number | undefined, providedSource?: unknown, - receivedAt?: number, + initiatingMessage?: MessageModel, options: { fromSync?: unknown; fromGroupUpdate?: unknown } = {} ): Promise { + const isSetByOther = providedSource || initiatingMessage; + if (isGroupV2(this.attributes)) { - if (providedSource || receivedAt) { + if (isSetByOther) { throw new Error( 'updateExpirationTimer: GroupV2 timers are not updated this way' ); @@ -4444,7 +4446,7 @@ export class ConversationModel extends window.Backbone }); // if change wasn't made remotely, send it to the number/group - if (!receivedAt) { + if (!isSetByOther) { try { await conversationJobQueue.add({ type: conversationQueueJobEnum.enum.DirectExpirationTimerUpdate, @@ -4464,7 +4466,11 @@ export class ConversationModel extends window.Backbone // When we add a disappearing messages notification to the conversation, we want it // to be above the message that initiated that change, hence the subtraction. - const timestamp = (receivedAt || Date.now()) - 1; + const receivedAt = + initiatingMessage?.get('received_at') || + window.Signal.Util.incrementMessageCounter(); + const receivedAtMS = initiatingMessage?.get('received_at_ms') || Date.now(); + const sentAt = (initiatingMessage?.get('sent_at') || receivedAtMS) - 1; this.set({ expireTimer }); @@ -4480,9 +4486,9 @@ export class ConversationModel extends window.Backbone readStatus: ReadStatus.Unread, conversationId: this.id, // No type; 'incoming' messages are specially treated by conversation.markRead() - sent_at: timestamp, - received_at: window.Signal.Util.incrementMessageCounter(), - received_at_ms: timestamp, + sent_at: sentAt, + received_at: receivedAt, + received_at_ms: receivedAtMS, flags: Proto.DataMessage.Flags.EXPIRATION_TIMER_UPDATE, expirationTimerUpdate: { expireTimer, diff --git a/ts/models/messages.ts b/ts/models/messages.ts index c3c4eee346..a2bf280563 100644 --- a/ts/models/messages.ts +++ b/ts/models/messages.ts @@ -2480,8 +2480,7 @@ export class MessageModel extends window.Backbone.Model { conversation.updateExpirationTimer( dataMessage.expireTimer, source, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - message.getReceivedAt()!, + message, { fromGroupUpdate: isGroupUpdate(message.attributes), } @@ -2492,12 +2491,7 @@ export class MessageModel extends window.Backbone.Model { // We only turn off timers if it's not a group update !isGroupUpdate(message.attributes) ) { - conversation.updateExpirationTimer( - undefined, - source, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - message.getReceivedAt()! - ); + conversation.updateExpirationTimer(undefined, source, message); } } }