From fb2ebddaa326b283eed22d6175992ba8ecf2fee1 Mon Sep 17 00:00:00 2001 From: Scott Nonnenberg Date: Tue, 23 Jan 2018 12:27:34 -0800 Subject: [PATCH] Remove expired message if it expired during database fetch (#1983) * Log SyncMessage destination, even if it's a group * Remove disappearing message even if deleted during fetch This change fixes a potential race condition with disappearing message removal from the UI. If the UI is in the middle of making a database request for messages to display, then we need to wait for that to complete before removing the newly-deleted expired message. --- js/views/conversation_view.js | 20 ++++++++++++++++++-- libtextsecure/message_receiver.js | 6 +++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index f36be03024..d19ceb6360 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -645,8 +645,24 @@ } }, onExpiredCollection: function(message) { - console.log('removing message', message.get('sent_at'), 'from collection'); - this.model.messageCollection.remove(message.id); + var removeMessage = function() { + console.log( + 'removing message', + message.get('sent_at'), + 'from collection' + ); + this.model.messageCollection.remove(message.id); + }.bind(this); + + // If a fetch is in progress, then we need to wait until that's complete to + // do this removal. Otherwise we could remove from messageCollection, then + // the async database fetch could include the removed message. + + if (this.inProgressFetch) { + this.inProgressFetch.then(removeMessage); + } else { + removeMessage(); + } }, addMessage: function(message) { diff --git a/libtextsecure/message_receiver.js b/libtextsecure/message_receiver.js index 11434168a4..befba50d2c 100644 --- a/libtextsecure/message_receiver.js +++ b/libtextsecure/message_receiver.js @@ -595,8 +595,12 @@ MessageReceiver.prototype.extend({ } if (syncMessage.sent) { var sentMessage = syncMessage.sent; + var to = sentMessage.message.group + ? 'group(' + sentMessage.message.group.id.toBinary() + ')' + : sentMessage.destination; + console.log('sent message to', - sentMessage.destination, + to, sentMessage.timestamp.toNumber(), 'from', this.getEnvelopeId(envelope)