mirror of
https://github.com/AsamK/signal-cli
synced 2025-08-29 02:20:39 +00:00
Only handle jsonRpc requests, after receive thread has caught up with old messages
This commit is contained in:
parent
ac18006abb
commit
5a2e37a6e2
2 changed files with 29 additions and 5 deletions
|
@ -141,6 +141,7 @@ public class Manager implements Closeable {
|
|||
private final IncomingMessageHandler incomingMessageHandler;
|
||||
|
||||
private final Context context;
|
||||
private boolean hasCaughtUpWithOldMessages = false;
|
||||
|
||||
Manager(
|
||||
SignalAccount account,
|
||||
|
@ -865,7 +866,7 @@ public class Manager implements Closeable {
|
|||
final var signalWebSocket = dependencies.getSignalWebSocket();
|
||||
signalWebSocket.connect();
|
||||
|
||||
var hasCaughtUpWithOldMessages = false;
|
||||
hasCaughtUpWithOldMessages = false;
|
||||
|
||||
while (!Thread.interrupted()) {
|
||||
SignalServiceEnvelope envelope;
|
||||
|
@ -885,11 +886,14 @@ public class Manager implements Closeable {
|
|||
envelope = result.get();
|
||||
} else {
|
||||
// Received indicator that server queue is empty
|
||||
hasCaughtUpWithOldMessages = true;
|
||||
|
||||
handleQueuedActions(queuedActions);
|
||||
queuedActions.clear();
|
||||
|
||||
hasCaughtUpWithOldMessages = true;
|
||||
synchronized (this) {
|
||||
this.notifyAll();
|
||||
}
|
||||
|
||||
// Continue to wait another timeout for new messages
|
||||
continue;
|
||||
}
|
||||
|
@ -936,17 +940,27 @@ public class Manager implements Closeable {
|
|||
handleQueuedActions(queuedActions);
|
||||
}
|
||||
|
||||
public boolean hasCaughtUpWithOldMessages() {
|
||||
return hasCaughtUpWithOldMessages;
|
||||
}
|
||||
|
||||
private void handleQueuedActions(final Collection<HandleAction> queuedActions) {
|
||||
var interrupted = false;
|
||||
for (var action : queuedActions) {
|
||||
try {
|
||||
action.execute(context);
|
||||
} catch (Throwable e) {
|
||||
if (e instanceof AssertionError && e.getCause() instanceof InterruptedException) {
|
||||
Thread.currentThread().interrupt();
|
||||
if ((e instanceof AssertionError || e instanceof RuntimeException)
|
||||
&& e.getCause() instanceof InterruptedException) {
|
||||
interrupted = true;
|
||||
continue;
|
||||
}
|
||||
logger.warn("Message action failed.", e);
|
||||
}
|
||||
}
|
||||
if (interrupted) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isContactBlocked(final RecipientIdentifier.Single recipient) {
|
||||
|
|
|
@ -75,6 +75,16 @@ public class JsonRpcDispatcherCommand implements LocalCommand {
|
|||
objectMapper.valueToTree(s),
|
||||
null)), m, ignoreAttachments);
|
||||
|
||||
// Maybe this should be handled inside the Manager
|
||||
while (!m.hasCaughtUpWithOldMessages()) {
|
||||
try {
|
||||
synchronized (m) {
|
||||
m.wait();
|
||||
}
|
||||
} catch (InterruptedException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
|
||||
|
||||
final var jsonRpcReader = new JsonRpcReader(jsonRpcSender, () -> {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue