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 {
...result,
[conversationId]: {
status: SendStatus.Pending,
status: SendStatus.Sent,
updatedAt: timestamp,
},
};

View file

@ -13,7 +13,11 @@ import { isOutgoing } from '../state/selectors/message';
import { isDirectConversation } from '../util/whatTypeOfConversation';
import { getOwn } from '../util/getOwn';
import { missingCaseError } from '../util/missingCaseError';
import { SendActionType, sendStateReducer } from '../messages/MessageSendState';
import {
SendActionType,
SendStatus,
sendStateReducer,
} from '../messages/MessageSendState';
import dataInterface from '../sql/Client';
const { deleteSentProtoRecipient } = dataInterface;
@ -107,7 +111,7 @@ export class MessageReceipts extends Collection<MessageReceiptModel> {
ids.includes(receipt.get('sourceConversationId'))
);
if (receipts.length) {
window.log.info('Found early read receipts for message');
window.log.info('Found early receipts for message');
this.remove(receipts);
}
return receipts;
@ -142,57 +146,48 @@ export class MessageReceipts extends Collection<MessageReceiptModel> {
const oldSendState = getOwn(
oldSendStateByConversationId,
sourceConversationId
);
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);
}
) ?? { status: SendStatus.Sent, updatedAt: undefined };
const newSendState = sendStateReducer(oldSendState, {
type: sendActionType,
updatedAt: messageSentAt,
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, {
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
// receipt before a delivery receipt.
if (!isEqual(oldSendState, newSendState)) {
message.set('sendStateByConversationId', {
...oldSendStateByConversationId,
[sourceConversationId]: newSendState,
});
window.Signal.Util.queueUpdateMessage(message.attributes);
window.Signal.Util.queueUpdateMessage(message.attributes);
// notify frontend listeners
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`
// notify frontend listeners
const conversation = window.ConversationController.get(
message.get('conversationId')
);
const updateLeftPane = conversation
? conversation.debouncedUpdateLastMessage
: undefined;
if (updateLeftPane) {
updateLeftPane();
}
}
if (

View file

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