From 26140e0ed0e8c3b699e7c900190ee0f30f9d6d49 Mon Sep 17 00:00:00 2001 From: Mikunj Date: Wed, 11 Mar 2020 11:10:19 +1100 Subject: [PATCH 1/2] Send delivery receipts asynchronously --- js/background.js | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/js/background.js b/js/background.js index 7485c5831..2d7494b1e 100644 --- a/js/background.js +++ b/js/background.js @@ -2132,35 +2132,35 @@ const message = new Whisper.Message(messageData); - // If we don't return early here, we can get into infinite error loops. So, no - // delivery receipts for sealed sender errors. - + // Send a delivery receipt + // If we don't return early here, we can get into infinite error loops. So, no delivery receipts for sealed sender errors. // Note(LOKI): don't send receipt for FR as we don't have a session yet - if (isError || !data.unidentifiedDeliveryReceived || data.friendRequest) { - return message; - } - - try { + const isGroup = data && data.message && data.message.group; + const shouldSendReceipt = + !isError && + data.unidentifiedDeliveryReceived && + !data.isFriendRequest && + !isGroup; + + // Send the receipt async and hope that it succeeds + if (shouldSendReceipt) { const { wrap, sendOptions } = ConversationController.prepareForSend( data.source ); - const isGroup = data && data.message && data.message.group; - if (!isGroup) { - await wrap( - textsecure.messaging.sendDeliveryReceipt( - data.source, - data.timestamp, - sendOptions - ) + wrap( + textsecure.messaging.sendDeliveryReceipt( + data.source, + data.timestamp, + sendOptions + ) + ).catch(error => { + window.log.error( + `Failed to send delivery receipt to ${data.source} for message ${ + data.timestamp + }:`, + error && error.stack ? error.stack : error ); - } - } catch (error) { - window.log.error( - `Failed to send delivery receipt to ${data.source} for message ${ - data.timestamp - }:`, - error && error.stack ? error.stack : error - ); + }); } return message; From 8c91aa04f1366aaec4a1029ce5c92df2c348ad38 Mon Sep 17 00:00:00 2001 From: Mikunj Date: Wed, 11 Mar 2020 13:18:35 +1100 Subject: [PATCH 2/2] Speed up message creation. We were fetching all of our devices everytime a new message was received. This was only used for when the message was a public chat message, so i moved it into the relevant if statement. In the future if we increase the device link limit, we'll need to fetch all our devices on application launch or something. --- js/background.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/js/background.js b/js/background.js index 2d7494b1e..105e8e71f 100644 --- a/js/background.js +++ b/js/background.js @@ -1964,21 +1964,23 @@ return handleProfileUpdate({ data, confirm, messageDescriptor }); } - const primaryDeviceKey = window.storage.get('primaryDevicePubKey'); - const allOurDevices = await libloki.storage.getAllDevicePubKeysForPrimaryPubKey( - primaryDeviceKey - ); const descriptorId = await textsecure.MessageReceiver.arrayBufferToString( messageDescriptor.id ); let message; if ( messageDescriptor.type === 'group' && - descriptorId.match(/^publicChat:/) && - allOurDevices.includes(data.source) + descriptorId.match(/^publicChat:/) ) { - // Public chat messages from ourselves should be outgoing - message = await createSentMessage(data); + // Note: This only works currently because we have a 1 device limit + // When we change that, the check below needs to change too + const ourNumber = textsecure.storage.user.getNumber(); + const primaryDevice = window.storage.get('primaryDevicePubKey'); + const { source } = data; + if (source && (source === ourNumber || source === primaryDevice)) { + // Public chat messages from ourselves should be outgoing + message = await createSentMessage(data); + } } else { message = await createMessage(data); }