import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ContainerNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.node.ValueNode;
import org.asamk.signal.util.Util;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Supplier;
-import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
public class JsonRpcReader {
this.objectMapper = Util.createJsonObjectMapper();
}
- public void readRequests(
- final RequestHandler requestHandler, final Consumer<JsonRpcResponse> responseHandler
- ) {
+ public void readMessages(final RequestHandler requestHandler, final Consumer<JsonRpcResponse> responseHandler) {
while (!Thread.interrupted()) {
JsonRpcMessage message = readMessage();
if (message == null) break;
if (message instanceof final JsonRpcRequest jsonRpcRequest) {
- logger.debug("Received json rpc request, method: " + jsonRpcRequest.method);
+ logger.debug("Received json rpc request, method: " + jsonRpcRequest.getMethod());
final var response = handleRequest(requestHandler, jsonRpcRequest);
if (response != null) {
jsonRpcSender.sendResponse(response);
}
return handleRequest(requestHandler, request);
- }).filter(Objects::nonNull).collect(Collectors.toList());
+ }).filter(Objects::nonNull).toList();
jsonRpcSender.sendBatchResponses(responseList);
}
String input = lineSupplier.get();
if (input == null) {
- // Reached end of input stream
+ logger.trace("Reached end of JSON-RPC input stream.");
break;
}
+ logger.trace("Incoming JSON-RPC message: {}", input);
JsonRpcMessage message = parseJsonRpcMessage(input);
if (message == null) continue;
null), null));
return null;
}
- return new JsonRpcBatchMessage(StreamSupport.stream(jsonNode.spliterator(), false)
- .collect(Collectors.toList()));
+ return new JsonRpcBatchMessage(StreamSupport.stream(jsonNode.spliterator(), false).toList());
} else if (jsonNode.isObject()) {
if (jsonNode.has("result") || jsonNode.has("error")) {
return parseJsonRpcResponse(jsonNode);
}
private JsonRpcRequest parseJsonRpcRequest(final JsonNode input) throws JsonRpcException {
+ if (input instanceof ObjectNode i && input.has("params") && input.get("params").isNull()) {
+ // Workaround for clients that send a null params field instead of omitting it
+ i.remove("params");
+ }
JsonRpcRequest request;
try {
request = objectMapper.treeToValue(input, JsonRpcRequest.class);