De-asyncify receipt handling logic
Co-authored-by: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com>
This commit is contained in:
parent
1e571b2604
commit
9677601155
1 changed files with 20 additions and 18 deletions
|
@ -193,17 +193,20 @@ async function processReceiptsForMessage(
|
||||||
messageId
|
messageId
|
||||||
);
|
);
|
||||||
|
|
||||||
const { updatedMessage, validReceipts } = await updateMessageWithReceipts(
|
// Note: it is important to have no `await` in between `resolveAttributes` and
|
||||||
message,
|
// `setAttributes` since it might overwrite other updates otherwise.
|
||||||
receipts
|
const { updatedMessage, validReceipts, droppedReceipts } =
|
||||||
);
|
updateMessageWithReceipts(message, receipts);
|
||||||
|
|
||||||
// Save it to cache & to DB
|
// Save it to cache & to DB, and remove dropped receipts
|
||||||
await window.MessageCache.setAttributes({
|
await Promise.all([
|
||||||
messageId,
|
window.MessageCache.setAttributes({
|
||||||
messageAttributes: updatedMessage,
|
messageId,
|
||||||
skipSaveToDatabase: false,
|
messageAttributes: updatedMessage,
|
||||||
});
|
skipSaveToDatabase: false,
|
||||||
|
}),
|
||||||
|
Promise.all(droppedReceipts.map(remove)),
|
||||||
|
]);
|
||||||
|
|
||||||
// Confirm/remove receipts, and delete sent protos
|
// Confirm/remove receipts, and delete sent protos
|
||||||
for (const receipt of validReceipts) {
|
for (const receipt of validReceipts) {
|
||||||
|
@ -219,23 +222,24 @@ async function processReceiptsForMessage(
|
||||||
conversation?.debouncedUpdateLastMessage?.();
|
conversation?.debouncedUpdateLastMessage?.();
|
||||||
}
|
}
|
||||||
|
|
||||||
async function updateMessageWithReceipts(
|
function updateMessageWithReceipts(
|
||||||
message: MessageAttributesType,
|
message: MessageAttributesType,
|
||||||
receipts: Array<MessageReceiptAttributesType>
|
receipts: Array<MessageReceiptAttributesType>
|
||||||
): Promise<{
|
): {
|
||||||
updatedMessage: MessageAttributesType;
|
updatedMessage: MessageAttributesType;
|
||||||
validReceipts: Array<MessageReceiptAttributesType>;
|
validReceipts: Array<MessageReceiptAttributesType>;
|
||||||
}> {
|
droppedReceipts: Array<MessageReceiptAttributesType>;
|
||||||
|
} {
|
||||||
const logId = `updateMessageWithReceipts(timestamp=${message.timestamp})`;
|
const logId = `updateMessageWithReceipts(timestamp=${message.timestamp})`;
|
||||||
|
|
||||||
const toRemove: Array<MessageReceiptAttributesType> = [];
|
const droppedReceipts: Array<MessageReceiptAttributesType> = [];
|
||||||
const receiptsToProcess = receipts.filter(receipt => {
|
const receiptsToProcess = receipts.filter(receipt => {
|
||||||
if (shouldDropReceipt(receipt, message)) {
|
if (shouldDropReceipt(receipt, message)) {
|
||||||
const { receiptSync } = receipt;
|
const { receiptSync } = receipt;
|
||||||
log.info(
|
log.info(
|
||||||
`${logId}: Dropping a receipt ${receiptSync.type} for sentAt=${receiptSync.messageSentAt}`
|
`${logId}: Dropping a receipt ${receiptSync.type} for sentAt=${receiptSync.messageSentAt}`
|
||||||
);
|
);
|
||||||
toRemove.push(receipt);
|
droppedReceipts.push(receipt);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -247,8 +251,6 @@ async function updateMessageWithReceipts(
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
await Promise.all(toRemove.map(remove));
|
|
||||||
|
|
||||||
log.info(
|
log.info(
|
||||||
`${logId}: batch processing ${receipts.length}` +
|
`${logId}: batch processing ${receipts.length}` +
|
||||||
` receipt${receipts.length === 1 ? '' : 's'}`
|
` receipt${receipts.length === 1 ? '' : 's'}`
|
||||||
|
@ -262,7 +264,7 @@ async function updateMessageWithReceipts(
|
||||||
...updateMessageSendStateWithReceipt(updatedMessage, receipt),
|
...updateMessageSendStateWithReceipt(updatedMessage, receipt),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return { updatedMessage, validReceipts: receiptsToProcess };
|
return { updatedMessage, validReceipts: receiptsToProcess, droppedReceipts };
|
||||||
}
|
}
|
||||||
|
|
||||||
const deleteSentProtoBatcher = createWaitBatcher({
|
const deleteSentProtoBatcher = createWaitBatcher({
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue