Notify registered message delivery listeners when messages are delivered

This commit is contained in:
Jon Chambers
2026-01-09 12:47:21 -05:00
committed by Jon Chambers
parent dad2bd5c29
commit c25c8807a6
3 changed files with 73 additions and 0 deletions

View File

@@ -208,6 +208,7 @@ import org.whispersystems.textsecuregcm.s3.S3MonitoringSupplier;
import org.whispersystems.textsecuregcm.securestorage.SecureStorageClient;
import org.whispersystems.textsecuregcm.securevaluerecovery.SecureValueRecoveryClient;
import org.whispersystems.textsecuregcm.spam.ChallengeConstraintChecker;
import org.whispersystems.textsecuregcm.spam.MessageDeliveryListener;
import org.whispersystems.textsecuregcm.spam.RegistrationFraudChecker;
import org.whispersystems.textsecuregcm.spam.RegistrationRecoveryChecker;
import org.whispersystems.textsecuregcm.spam.SpamChecker;
@@ -1038,6 +1039,7 @@ public class WhisperServerService extends Application<WhisperServerConfiguration
});
spamFilter.map(SpamFilter::getReportedMessageListener).ifPresent(reportMessageManager::addListener);
spamFilter.map(SpamFilter::getMessageDeliveryListener).ifPresent(messageSender::addMessageDeliveryListener);
final HttpClient shortCodeRetrieverHttpClient = HttpClient.newBuilder().version(HttpClient.Version.HTTP_2)
.connectTimeout(Duration.ofSeconds(10)).build();

View File

@@ -13,8 +13,10 @@ import io.micrometer.core.instrument.DistributionSummary;
import io.micrometer.core.instrument.Metrics;
import io.micrometer.core.instrument.Tag;
import io.micrometer.core.instrument.Tags;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
@@ -31,6 +33,7 @@ import org.whispersystems.textsecuregcm.identity.IdentityType;
import org.whispersystems.textsecuregcm.identity.ServiceIdentifier;
import org.whispersystems.textsecuregcm.metrics.MetricsUtil;
import org.whispersystems.textsecuregcm.metrics.UserAgentTagUtil;
import org.whispersystems.textsecuregcm.spam.MessageDeliveryListener;
import org.whispersystems.textsecuregcm.storage.Account;
import org.whispersystems.textsecuregcm.storage.Device;
import org.whispersystems.textsecuregcm.storage.MessagesManager;
@@ -52,6 +55,8 @@ public class MessageSender {
private final MessagesManager messagesManager;
private final PushNotificationManager pushNotificationManager;
private final List<MessageDeliveryListener> messageDeliveryListeners = new ArrayList<>();
// Note that these names deliberately reference `MessageController` for metric continuity
private static final String REJECT_OVERSIZE_MESSAGE_COUNTER_NAME = name(MessageSender.class, "rejectOversizeMessage");
private static final String OVERSIZE_MESSAGE_WARNING_COUNTER_NAME = name(MessageSender.class, "oversizeMessageWarning");
@@ -80,6 +85,10 @@ public class MessageSender {
this.pushNotificationManager = pushNotificationManager;
}
public void addMessageDeliveryListener(final MessageDeliveryListener messageDeliveryListener) {
messageDeliveryListeners.add(messageDeliveryListener);
}
/**
* Sends messages to devices associated with the given destination account. If a destination device has a valid push
* notification token and does not have an active connection to a Signal server, then this method will also send a
@@ -136,6 +145,16 @@ public class MessageSender {
.and(platformTag);
Metrics.counter(SEND_COUNTER_NAME, tags).increment();
messageDeliveryListeners.forEach(messageDeliveryListener ->
messageDeliveryListener.handleMessageDelivered(destination,
deviceId,
message.getEphemeral(),
message.getUrgent(),
message.getStory(),
!message.hasSourceServiceId(),
false,
syncMessageSenderDeviceId.isPresent()));
});
}
@@ -223,6 +242,16 @@ public class MessageSender {
.and(platformTag);
Metrics.counter(SEND_COUNTER_NAME, tags).increment();
messageDeliveryListeners.forEach(messageDeliveryListener ->
messageDeliveryListener.handleMessageDelivered(account,
deviceId,
isEphemeral,
isUrgent,
isStory,
true,
true,
false));
})))
.thenRun(Util.NOOP);
}