X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/b51c7916293cb3303193c48e281f2a9d55224f85..caa4fa0180a84cca10a1b363d25147d03ccb0387:/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcDispatcherHandler.java diff --git a/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcDispatcherHandler.java b/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcDispatcherHandler.java index aea332fd..c8b4bc15 100644 --- a/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcDispatcherHandler.java +++ b/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcDispatcherHandler.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ContainerNode; import com.fasterxml.jackson.databind.node.IntNode; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -31,7 +32,7 @@ import java.util.function.Supplier; public class SignalJsonRpcDispatcherHandler { - private final static Logger logger = LoggerFactory.getLogger(SignalJsonRpcDispatcherHandler.class); + private static final Logger logger = LoggerFactory.getLogger(SignalJsonRpcDispatcherHandler.class); private final ObjectMapper objectMapper; private final JsonRpcSender jsonRpcSender; @@ -54,8 +55,8 @@ public class SignalJsonRpcDispatcherHandler { this.commandHandler = new SignalJsonRpcCommandHandler(c, this::getCommand); if (!noReceiveOnStart) { - this.subscribeReceive(c.getManagers()); - c.addOnManagerAddedHandler(this::subscribeReceive); + this.subscribeReceive(c.getManagers(), true); + c.addOnManagerAddedHandler(m -> subscribeReceive(m, true)); c.addOnManagerRemovedHandler(this::unsubscribeReceive); } @@ -66,7 +67,7 @@ public class SignalJsonRpcDispatcherHandler { this.commandHandler = new SignalJsonRpcCommandHandler(m, this::getCommand); if (!noReceiveOnStart) { - subscribeReceive(m); + subscribeReceive(m, true); } final var currentThread = Thread.currentThread(); @@ -77,17 +78,23 @@ public class SignalJsonRpcDispatcherHandler { private static final AtomicInteger nextSubscriptionId = new AtomicInteger(0); - private int subscribeReceive(final Manager manager) { - return subscribeReceive(List.of(manager)); + private int subscribeReceive(final Manager manager, boolean internalSubscription) { + return subscribeReceive(List.of(manager), internalSubscription); } - private int subscribeReceive(final List managers) { + private int subscribeReceive(final List managers, boolean internalSubscription) { final var subscriptionId = nextSubscriptionId.getAndIncrement(); final var handlers = managers.stream().map(m -> { final var receiveMessageHandler = new JsonReceiveMessageHandler(m, s -> { - final var params = new ObjectNode(objectMapper.getNodeFactory()); - params.set("subscription", IntNode.valueOf(subscriptionId)); - params.set("result", objectMapper.valueToTree(s)); + ContainerNode params; + if (internalSubscription) { + params = objectMapper.valueToTree(s); + } else { + final var paramsNode = new ObjectNode(objectMapper.getNodeFactory()); + paramsNode.set("subscription", IntNode.valueOf(subscriptionId)); + paramsNode.set("result", objectMapper.valueToTree(s)); + params = paramsNode; + } final var jsonRpcRequest = JsonRpcRequest.forNotification("receive", params, null); try { jsonRpcSender.sendRequest(jsonRpcRequest); @@ -119,7 +126,7 @@ public class SignalJsonRpcDispatcherHandler { private void unsubscribeReceive(final Manager m) { final var subscriptionId = receiveHandlers.entrySet() .stream() - .filter(e -> e.getValue().size() == 1 && e.getValue().get(0).first().equals(m)) + .filter(e -> e.getValue().size() == 1 && e.getValue().getFirst().first().equals(m)) .map(Map.Entry::getKey) .findFirst(); subscriptionId.ifPresent(this::unsubscribeReceive); @@ -162,7 +169,7 @@ public class SignalJsonRpcDispatcherHandler { public void handleCommand( final Void request, final Manager m, final JsonWriter jsonWriter ) throws CommandException { - final var subscriptionId = subscribeReceive(m); + final var subscriptionId = subscribeReceive(m, false); jsonWriter.write(subscriptionId); } @@ -170,7 +177,7 @@ public class SignalJsonRpcDispatcherHandler { public void handleCommand( final Void request, final MultiAccountManager c, final JsonWriter jsonWriter ) throws CommandException { - final var subscriptionId = subscribeReceive(c.getManagers()); + final var subscriptionId = subscribeReceive(c.getManagers(), false); jsonWriter.write(subscriptionId); } } @@ -216,13 +223,11 @@ public class SignalJsonRpcDispatcherHandler { } private Integer getSubscriptionId(final JsonNode request) { - if (request instanceof ArrayNode req) { - return req.get(0).asInt(); - } else if (request instanceof ObjectNode req) { - return req.get("subscription").asInt(); - } else { - return null; - } + return switch (request) { + case ArrayNode req -> req.get(0).asInt(); + case ObjectNode req -> req.get("subscription").asInt(); + case null, default -> null; + }; } } }