From 97f77b1f6967b479478fc1e32fe0e6e925d215ec Mon Sep 17 00:00:00 2001 From: Stefan Meinecke Date: Tue, 14 Apr 2026 19:50:18 +0200 Subject: [PATCH] Keep unauthenticated WebSocket alive during daemon receive loop The unauthenticated (sealed sender) socket had no keep-alive token registered, causing SignalWebSocket's DelayedDisconnectThread to tear down the connection ~10s after each send. Every subsequent group message then had to re-establish a fresh TLS connection (~6s delay). The authenticated socket avoids this by registering a "receive" keep-alive token for the lifetime of the receive loop. Apply the same pattern to the unauthenticated socket: register the token alongside the authenticated one and remove it in the same finally block. This keeps the unidentified connection alive in daemon mode, matching the behaviour of Signal mobile clients. --- .../java/org/asamk/signal/manager/helper/ReceiveHelper.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/ReceiveHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/ReceiveHelper.java index 31f1c04d..8577d7cf 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/ReceiveHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/ReceiveHelper.java @@ -101,6 +101,9 @@ public class ReceiveHelper { signalWebSocket.connect(); signalWebSocket.registerKeepAliveToken("receive"); + final var unauthenticatedSignalWebSocket = dependencies.getUnauthenticatedSignalWebSocket(); + unauthenticatedSignalWebSocket.registerKeepAliveToken("receive"); + try { receiveMessagesInternal(signalWebSocket, timeout, maxMessages, handler, queuedActions); } finally { @@ -109,6 +112,7 @@ public class ReceiveHelper { queuedActions.clear(); signalWebSocket.removeKeepAliveToken("receive"); signalWebSocket.disconnect(); + unauthenticatedSignalWebSocket.removeKeepAliveToken("receive"); webSocketStateDisposable.dispose(); shouldStop = false; }