Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions lib/src/main/java/org/asamk/signal/manager/Manager.java
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,10 @@ boolean trustIdentityVerified(

void addClosedListener(Runnable listener);

void addUnidentifiedKeepAlive(String token);

void removeUnidentifiedKeepAlive(String token);

InputStream retrieveAttachment(final String id) throws IOException;

InputStream retrieveContactAvatar(final RecipientIdentifier.Single recipient) throws IOException, UnregisteredRecipientException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1709,6 +1709,16 @@ public void addClosedListener(final Runnable listener) {
}
}

@Override
public void addUnidentifiedKeepAlive(final String token) {
dependencies.getUnauthenticatedSignalWebSocket().registerKeepAliveToken(token);
}

@Override
public void removeUnidentifiedKeepAlive(final String token) {
dependencies.getUnauthenticatedSignalWebSocket().removeKeepAliveToken(token);
}

@Override
public void addCallEventListener(final CallEventListener listener) {
context.getCallManager().addCallEventListener(listener);
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -915,6 +915,14 @@ public void addClosedListener(final Runnable listener) {
}
}

@Override
public void addUnidentifiedKeepAlive(final String token) {
}

@Override
public void removeUnidentifiedKeepAlive(final String token) {
}

@Override
public void addCallEventListener(final CallEventListener listener) {
// Not supported over DBus
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ public DbusSignalImpl(

public void initObjects() {
exportObjects();
m.addUnidentifiedKeepAlive("dbus");
if (!noReceiveOnStart) {
subscribeReceive();
}
Expand All @@ -116,6 +117,7 @@ private void exportObjects() {

@Override
public void close() {
m.removeUnidentifiedKeepAlive("dbus");
if (dbusMessageHandler != null) {
m.removeReceiveHandler(dbusMessageHandler);
dbusMessageHandler = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Supplier;
import java.util.stream.Collectors;
Expand All @@ -43,8 +44,11 @@ public class SignalJsonRpcDispatcherHandler {
private final JsonRpcReader jsonRpcReader;
private final boolean noReceiveOnStart;

private final Map<Integer, ArrayList<Pair<Manager, Manager.ReceiveMessageHandler>>> receiveHandlers = new HashMap<>();
private final Map<Integer, ArrayList<Pair<Manager, Manager.CallEventListener>>> callEventHandlers = new HashMap<>();
private final Map<Integer, List<Pair<Manager, Manager.ReceiveMessageHandler>>> receiveHandlers = new HashMap<>();
private final Map<Integer, List<Pair<Manager, Manager.CallEventListener>>> callEventHandlers = new HashMap<>();
private final String connectionKeepAliveToken = "jsonrpc-" + UUID.randomUUID();
private final List<Manager> keepAliveManagers = new ArrayList<>();
private boolean connectionActive = true;
private SignalJsonRpcCommandHandler commandHandler;

public SignalJsonRpcDispatcherHandler(
Expand All @@ -71,6 +75,10 @@ public void handleConnection(final MultiAccountManager c) {
c.addOnManagerAddedHandler(m -> callEventHandlers.forEach((subscriptionId, handlers) -> handlers.add(
createCallEventHandler(m, subscriptionId))));

c.getManagers().forEach(this::registerKeepAlive);
c.addOnManagerAddedHandler(this::registerKeepAlive);
c.addOnManagerRemovedHandler(this::unregisterKeepAlive);

handleConnection();
}

Expand All @@ -84,6 +92,8 @@ public void handleConnection(final Manager m) {
final var currentThread = Thread.currentThread();
m.addClosedListener(currentThread::interrupt);

registerKeepAlive(m);

handleConnection();
}

Expand Down Expand Up @@ -204,14 +214,29 @@ private void unsubscribeReceive(final Manager m) {
subscriptionId.ifPresent(this::unsubscribeReceive);
}

private void registerKeepAlive(final Manager m) {
if (!connectionActive) return;
m.addUnidentifiedKeepAlive(connectionKeepAliveToken);
keepAliveManagers.add(m);
}

private void unregisterKeepAlive(final Manager m) {
if (!connectionActive) return;
m.removeUnidentifiedKeepAlive(connectionKeepAliveToken);
keepAliveManagers.remove(m);
}

private void handleConnection() {
try {
jsonRpcReader.readMessages((method, params) -> commandHandler.handleRequest(objectMapper, method, params),
response -> logger.debug("Received unexpected response for id {}", response.getId()));
} finally {
connectionActive = false;
receiveHandlers.forEach((_subscriptionId, handlers) -> handlers.forEach(this::unsubscribeReceiveHandler));
receiveHandlers.clear();
unsubscribeAllCallEvents();
keepAliveManagers.forEach(m -> m.removeUnidentifiedKeepAlive(connectionKeepAliveToken));
keepAliveManagers.clear();
}
}

Expand Down
8 changes: 8 additions & 0 deletions src/test/java/org/asamk/signal/http/SseInitialFlushTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -447,6 +447,14 @@ public void addAddressChangedListener(Runnable listener) {
public void addClosedListener(Runnable listener) {
}

@Override
public void addUnidentifiedKeepAlive(String token) {
}

@Override
public void removeUnidentifiedKeepAlive(String token) {
}

@Override
public InputStream retrieveAttachment(String id) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -495,6 +495,14 @@ public void addAddressChangedListener(Runnable l) {
public void addClosedListener(Runnable l) {
}

@Override
public void addUnidentifiedKeepAlive(String token) {
}

@Override
public void removeUnidentifiedKeepAlive(String token) {
}

@Override
public InputStream retrieveAttachment(String id) {
return null;
Expand Down Expand Up @@ -740,8 +748,8 @@ void multiAccountSubscribeCallEventsSubscribesAllManagers() {

assertEquals(1, manager1.addCount.get(), "manager1 should have one listener");
assertEquals(1, manager2.addCount.get(), "manager2 should have one listener");
// Also registers an onManagerAdded handler for receive and one for call events
assertEquals(2, multi.addedHandlers.size(), "should register onManagerAdded handlers");
// Registers onManagerAdded handlers for receive, call events, and keep-alive
assertEquals(3, multi.addedHandlers.size(), "should register onManagerAdded handlers");
}

@Test
Expand Down
Loading