From c6a79d22078cc1614975ffabf339619fda02c73b Mon Sep 17 00:00:00 2001 From: trevor-signal <131492920+trevor-signal@users.noreply.github.com> Date: Fri, 31 Oct 2025 12:25:42 -0400 Subject: [PATCH] Ensure reactions are handled in order --- ts/background.preload.ts | 4 +- ts/messageModifiers/Reactions.preload.ts | 71 ++++++++++++------------ 2 files changed, 36 insertions(+), 39 deletions(-) diff --git a/ts/background.preload.ts b/ts/background.preload.ts index b3da33f69a..fcb05ee94d 100644 --- a/ts/background.preload.ts +++ b/ts/background.preload.ts @@ -2470,7 +2470,7 @@ export async function startApp(): Promise { timestamp, }; - drop(Reactions.onReaction(attributes)); + await Reactions.onReaction(attributes); return; } @@ -2971,7 +2971,7 @@ export async function startApp(): Promise { receivedAtDate: data.receivedAtDate, timestamp, }; - drop(Reactions.onReaction(attributes)); + await Reactions.onReaction(attributes); return; } diff --git a/ts/messageModifiers/Reactions.preload.ts b/ts/messageModifiers/Reactions.preload.ts index 2abef52e81..193441586f 100644 --- a/ts/messageModifiers/Reactions.preload.ts +++ b/ts/messageModifiers/Reactions.preload.ts @@ -228,43 +228,40 @@ export async function onReaction( const logId = `Reactions.onReaction(timestamp=${reaction.timestamp};target=${reaction.targetTimestamp})`; - try { - const matchingMessage = await findMessageForReaction({ - targetTimestamp: reaction.targetTimestamp, - targetAuthorAci: reaction.targetAuthorAci, - reactionSenderConversationId: reaction.fromId, - logId, - }); + const matchingMessage = await findMessageForReaction({ + targetTimestamp: reaction.targetTimestamp, + targetAuthorAci: reaction.targetAuthorAci, + reactionSenderConversationId: reaction.fromId, + logId, + }); - if (!matchingMessage) { - log.info( - `${logId}: No message for reaction`, - 'targeting', - reaction.targetAuthorAci - ); - return; - } - - const matchingMessageConversation = window.ConversationController.get( - matchingMessage.conversationId + if (!matchingMessage) { + log.info( + `${logId}: No message for reaction`, + 'targeting', + reaction.targetAuthorAci ); + return; + } - if (!matchingMessageConversation) { - log.info( - `${logId}: No target conversation for reaction`, - reaction.targetAuthorAci, - reaction.targetTimestamp - ); - remove(reaction); - return undefined; - } + const matchingMessageConversation = window.ConversationController.get( + matchingMessage.conversationId + ); - // awaiting is safe since `onReaction` is never called from inside the queue - await matchingMessageConversation.queueJob( - 'Reactions.onReaction', - async () => { - log.info(`${logId}: handling`); + if (!matchingMessageConversation) { + log.info( + `${logId}: No target conversation for reaction`, + reaction.targetAuthorAci, + reaction.targetTimestamp + ); + remove(reaction); + return undefined; + } + drop( + matchingMessageConversation.queueJob('Reactions.onReaction', async () => { + log.info(`${logId}: handling`); + try { // Message is fetched inside the conversation queue so we have the // most recent data const targetMessage = await findMessageForReaction({ @@ -302,12 +299,12 @@ export async function onReaction( } remove(reaction); + } catch (error) { + remove(reaction); + log.error(`${logId} error:`, Errors.toLogFormat(error)); } - ); - } catch (error) { - remove(reaction); - log.error(`${logId} error:`, Errors.toLogFormat(error)); - } + }) + ); } export async function handleReaction(