diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java b/service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java index fbaedd528..bb180a4ca 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java @@ -227,59 +227,65 @@ public class WebSocketConnection implements MessageAvailabilityListener, Displac } private void sendNextMessagePage(final boolean cachedMessagesOnly, final CompletableFuture queueClearedFuture) { - final OutgoingMessageEntityList messages = messagesManager.getMessagesForDevice(account.getUuid(), device.getId(), client.getUserAgent(), cachedMessagesOnly); - final CompletableFuture[] sendFutures = new CompletableFuture[messages.getMessages().size()]; + try { + final OutgoingMessageEntityList messages = messagesManager + .getMessagesForDevice(account.getUuid(), device.getId(), client.getUserAgent(), cachedMessagesOnly); - for (int i = 0; i < messages.getMessages().size(); i++) { - final OutgoingMessageEntity message = messages.getMessages().get(i); - final Envelope.Builder builder = Envelope.newBuilder() - .setType(Envelope.Type.valueOf(message.getType())) - .setTimestamp(message.getTimestamp()) - .setServerTimestamp(message.getServerTimestamp()); + final CompletableFuture[] sendFutures = new CompletableFuture[messages.getMessages().size()]; - if (!Util.isEmpty(message.getSource())) { - builder.setSource(message.getSource()) - .setSourceDevice(message.getSourceDevice()); - if (message.getSourceUuid() != null) { - builder.setSourceUuid(message.getSourceUuid().toString()); + for (int i = 0; i < messages.getMessages().size(); i++) { + final OutgoingMessageEntity message = messages.getMessages().get(i); + final Envelope.Builder builder = Envelope.newBuilder() + .setType(Envelope.Type.valueOf(message.getType())) + .setTimestamp(message.getTimestamp()) + .setServerTimestamp(message.getServerTimestamp()); + + if (!Util.isEmpty(message.getSource())) { + builder.setSource(message.getSource()) + .setSourceDevice(message.getSourceDevice()); + if (message.getSourceUuid() != null) { + builder.setSourceUuid(message.getSourceUuid().toString()); + } } - } - if (message.getMessage() != null) { - builder.setLegacyMessage(ByteString.copyFrom(message.getMessage())); - } + if (message.getMessage() != null) { + builder.setLegacyMessage(ByteString.copyFrom(message.getMessage())); + } - if (message.getContent() != null) { - builder.setContent(ByteString.copyFrom(message.getContent())); - } + if (message.getContent() != null) { + builder.setContent(ByteString.copyFrom(message.getContent())); + } - if (message.getRelay() != null && !message.getRelay().isEmpty()) { - builder.setRelay(message.getRelay()); - } + if (message.getRelay() != null && !message.getRelay().isEmpty()) { + builder.setRelay(message.getRelay()); + } - final Envelope envelope = builder.build(); + final Envelope envelope = builder.build(); - if (envelope.getSerializedSize() > MAX_DESKTOP_MESSAGE_SIZE && isDesktopClient) { - messagesManager.delete(account.getUuid(), device.getId(), message.getGuid()); - discardedMessagesMeter.mark(); + if (envelope.getSerializedSize() > MAX_DESKTOP_MESSAGE_SIZE && isDesktopClient) { + messagesManager.delete(account.getUuid(), device.getId(), message.getGuid()); + discardedMessagesMeter.mark(); - sendFutures[i] = CompletableFuture.completedFuture(null); - } else { - sendFutures[i] = sendMessage(builder.build(), Optional.of(new StoredMessageInfo(message.getGuid()))); - } - } - - CompletableFuture.allOf(sendFutures).whenComplete((v, cause) -> { - if (cause == null) { - if (messages.hasMore()) { - sendNextMessagePage(cachedMessagesOnly, queueClearedFuture); + sendFutures[i] = CompletableFuture.completedFuture(null); } else { - queueClearedFuture.complete(null); + sendFutures[i] = sendMessage(builder.build(), Optional.of(new StoredMessageInfo(message.getGuid()))); } - } else { - queueClearedFuture.completeExceptionally(cause); } - }); + + CompletableFuture.allOf(sendFutures).whenComplete((v, cause) -> { + if (cause == null) { + if (messages.hasMore()) { + sendNextMessagePage(cachedMessagesOnly, queueClearedFuture); + } else { + queueClearedFuture.complete(null); + } + } else { + queueClearedFuture.completeExceptionally(cause); + } + }); + } catch (final Exception e) { + queueClearedFuture.completeExceptionally(e); + } } @Override