Send delivery receipts asynchronously

This commit is contained in:
Chris Eager
2022-03-11 13:46:59 -08:00
committed by Chris Eager
parent b608ece57e
commit 7c9ae3561d
2 changed files with 23 additions and 12 deletions

View File

@@ -1,11 +1,13 @@
/*
* Copyright 2013-2021 Signal Messenger, LLC
* Copyright 2013-2022 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.whispersystems.textsecuregcm.push;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.whispersystems.textsecuregcm.auth.AuthenticatedAccount;
@@ -17,20 +19,23 @@ import org.whispersystems.textsecuregcm.storage.Device;
public class ReceiptSender {
private final MessageSender messageSender;
private final MessageSender messageSender;
private final AccountsManager accountManager;
private final ExecutorService executor;
private static final Logger logger = LoggerFactory.getLogger(ReceiptSender.class);
public ReceiptSender(final AccountsManager accountManager, final MessageSender messageSender) {
public ReceiptSender(final AccountsManager accountManager, final MessageSender messageSender,
final ExecutorService executor) {
this.accountManager = accountManager;
this.messageSender = messageSender;
this.executor = executor;
}
public void sendReceipt(AuthenticatedAccount source, UUID destinationUuid, long messageId) throws NoSuchUserException {
public CompletableFuture<Void> sendReceipt(AuthenticatedAccount source, UUID destinationUuid, long messageId) throws NoSuchUserException {
final Account sourceAccount = source.getAccount();
if (sourceAccount.getUuid().equals(destinationUuid)) {
return;
return CompletableFuture.completedFuture(null);
}
final Account destinationAccount = accountManager.getByAccountIdentifier(destinationUuid)
@@ -45,12 +50,16 @@ public class ReceiptSender {
.setTimestamp(messageId)
.setType(Envelope.Type.SERVER_DELIVERY_RECEIPT);
for (final Device destinationDevice : destinationAccount.getDevices()) {
try {
messageSender.sendMessage(destinationAccount, destinationDevice, message.build(), false);
} catch (final NotPushRegisteredException e) {
logger.info("User no longer push registered for delivery receipt: " + e.getMessage());
return CompletableFuture.runAsync(() -> {
for (final Device destinationDevice : destinationAccount.getDevices()) {
try {
messageSender.sendMessage(destinationAccount, destinationDevice, message.build(), false);
} catch (final NotPushRegisteredException e) {
logger.info("User no longer push registered for delivery receipt: " + e.getMessage());
} catch (final Exception e) {
logger.warn("Could not send delivery receipt", e);
}
}
}
}, executor);
}
}