Fix send sync message bugs

This commit is contained in:
Evan Hahn 2021-07-28 13:53:18 -05:00 committed by GitHub
parent 4b92e12f83
commit 8449f343a6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 59 additions and 59 deletions

View file

@ -3212,7 +3212,7 @@ export async function startApp(): Promise<void> {
return { return {
...result, ...result,
[conversationId]: { [conversationId]: {
status: SendStatus.Pending, status: SendStatus.Sent,
updatedAt: timestamp, updatedAt: timestamp,
}, },
}; };

View file

@ -13,7 +13,11 @@ import { isOutgoing } from '../state/selectors/message';
import { isDirectConversation } from '../util/whatTypeOfConversation'; import { isDirectConversation } from '../util/whatTypeOfConversation';
import { getOwn } from '../util/getOwn'; import { getOwn } from '../util/getOwn';
import { missingCaseError } from '../util/missingCaseError'; import { missingCaseError } from '../util/missingCaseError';
import { SendActionType, sendStateReducer } from '../messages/MessageSendState'; import {
SendActionType,
SendStatus,
sendStateReducer,
} from '../messages/MessageSendState';
import dataInterface from '../sql/Client'; import dataInterface from '../sql/Client';
const { deleteSentProtoRecipient } = dataInterface; const { deleteSentProtoRecipient } = dataInterface;
@ -107,7 +111,7 @@ export class MessageReceipts extends Collection<MessageReceiptModel> {
ids.includes(receipt.get('sourceConversationId')) ids.includes(receipt.get('sourceConversationId'))
); );
if (receipts.length) { if (receipts.length) {
window.log.info('Found early read receipts for message'); window.log.info('Found early receipts for message');
this.remove(receipts); this.remove(receipts);
} }
return receipts; return receipts;
@ -142,57 +146,48 @@ export class MessageReceipts extends Collection<MessageReceiptModel> {
const oldSendState = getOwn( const oldSendState = getOwn(
oldSendStateByConversationId, oldSendStateByConversationId,
sourceConversationId sourceConversationId
); ) ?? { status: SendStatus.Sent, updatedAt: undefined };
if (oldSendState) {
let sendActionType: SendActionType;
switch (type) {
case MessageReceiptType.Delivery:
sendActionType = SendActionType.GotDeliveryReceipt;
break;
case MessageReceiptType.Read:
sendActionType = SendActionType.GotReadReceipt;
break;
case MessageReceiptType.View:
sendActionType = SendActionType.GotViewedReceipt;
break;
default:
throw missingCaseError(type);
}
const newSendState = sendStateReducer(oldSendState, { let sendActionType: SendActionType;
type: sendActionType, switch (type) {
updatedAt: messageSentAt, case MessageReceiptType.Delivery:
sendActionType = SendActionType.GotDeliveryReceipt;
break;
case MessageReceiptType.Read:
sendActionType = SendActionType.GotReadReceipt;
break;
case MessageReceiptType.View:
sendActionType = SendActionType.GotViewedReceipt;
break;
default:
throw missingCaseError(type);
}
const newSendState = sendStateReducer(oldSendState, {
type: sendActionType,
updatedAt: messageSentAt,
});
// The send state may not change. For example, this can happen if we get a read
// receipt before a delivery receipt.
if (!isEqual(oldSendState, newSendState)) {
message.set('sendStateByConversationId', {
...oldSendStateByConversationId,
[sourceConversationId]: newSendState,
}); });
// The send state may not change. For example, this can happen if we get a read window.Signal.Util.queueUpdateMessage(message.attributes);
// receipt before a delivery receipt.
if (!isEqual(oldSendState, newSendState)) {
message.set('sendStateByConversationId', {
...oldSendStateByConversationId,
[sourceConversationId]: newSendState,
});
window.Signal.Util.queueUpdateMessage(message.attributes); // notify frontend listeners
const conversation = window.ConversationController.get(
// notify frontend listeners message.get('conversationId')
const conversation = window.ConversationController.get(
message.get('conversationId')
);
const updateLeftPane = conversation
? conversation.debouncedUpdateLastMessage
: undefined;
if (updateLeftPane) {
updateLeftPane();
}
}
} else {
window.log.warn(
`Got a receipt from someone (${sourceConversationId}), but the message (sent at ${message.get(
'sent_at'
)}) wasn't sent to them. It was sent to ${
Object.keys(oldSendStateByConversationId).length
} recipients`
); );
const updateLeftPane = conversation
? conversation.debouncedUpdateLastMessage
: undefined;
if (updateLeftPane) {
updateLeftPane();
}
} }
if ( if (

View file

@ -2579,20 +2579,25 @@ export class MessageModel extends window.Backbone.Model<MessageAttributesType> {
return; return;
} }
const updatedAt: number = isNormalNumber(data.timestamp)
? data.timestamp
: Date.now();
const previousSendState = getOwn( const previousSendState = getOwn(
sendStateByConversationId, sendStateByConversationId,
destinationConversationId destinationConversationId
); );
if (previousSendState) { sendStateByConversationId[
sendStateByConversationId[ destinationConversationId
destinationConversationId ] = previousSendState
] = sendStateReducer(previousSendState, { ? sendStateReducer(previousSendState, {
type: SendActionType.Sent, type: SendActionType.Sent,
updatedAt: isNormalNumber(data.timestamp) updatedAt,
? data.timestamp })
: Date.now(), : {
}); status: SendStatus.Sent,
} updatedAt,
};
if (unidentified) { if (unidentified) {
unidentifiedDeliveriesSet.add(identifier); unidentifiedDeliveriesSet.add(identifier);