X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/a8bbdb54d006f157a009ece0cae5bf72fb636ced..5a2e37a6e242b920e5647e3d98c2aecb1932f763:/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java diff --git a/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java b/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java index dd0c7bee..d0e4dfec 100644 --- a/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java +++ b/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java @@ -31,7 +31,8 @@ import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; -import java.util.Set; +import java.util.List; +import java.util.Map; import java.util.concurrent.TimeUnit; public class JsonRpcDispatcherCommand implements LocalCommand { @@ -42,26 +43,28 @@ public class JsonRpcDispatcherCommand implements LocalCommand { private static final int IO_ERROR = -3; private static final int UNTRUSTED_KEY_ERROR = -4; - private final OutputWriter outputWriter; + @Override + public String getName() { + return "jsonRpc"; + } - public static void attachToSubparser(final Subparser subparser) { + @Override + public void attachToSubparser(final Subparser subparser) { subparser.help("Take commands from standard input as line-delimited JSON RPC while receiving messages."); subparser.addArgument("--ignore-attachments") .help("Don’t download attachments of received messages.") .action(Arguments.storeTrue()); } - public JsonRpcDispatcherCommand(final OutputWriter outputWriter) { - this.outputWriter = outputWriter; - } - @Override - public Set getSupportedOutputTypes() { - return Set.of(OutputType.JSON); + public List getSupportedOutputTypes() { + return List.of(OutputType.JSON); } @Override - public void handleCommand(final Namespace ns, final Manager m) throws CommandException { + public void handleCommand( + final Namespace ns, final Manager m, final OutputWriter outputWriter + ) throws CommandException { final boolean ignoreAttachments = ns.getBoolean("ignore-attachments"); final var objectMapper = Util.createJsonObjectMapper(); @@ -72,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, () -> { @@ -103,7 +116,7 @@ public class JsonRpcDispatcherCommand implements LocalCommand { result[0] = s; }; - var command = Commands.getCommand(method, commandOutputWriter); + var command = Commands.getCommand(method); if (!(command instanceof JsonRpcCommand)) { throw new JsonRpcException(new JsonRpcResponse.Error(JsonRpcResponse.Error.METHOD_NOT_FOUND, "Method not implemented", @@ -111,7 +124,7 @@ public class JsonRpcDispatcherCommand implements LocalCommand { } try { - parseParamsAndRunCommand(m, objectMapper, params, (JsonRpcCommand) command); + parseParamsAndRunCommand(m, objectMapper, params, commandOutputWriter, (JsonRpcCommand) command); } catch (JsonMappingException e) { throw new JsonRpcException(new JsonRpcResponse.Error(JsonRpcResponse.Error.INVALID_REQUEST, e.getMessage(), @@ -129,12 +142,16 @@ public class JsonRpcDispatcherCommand implements LocalCommand { null)); } - Object output = result[0] == null ? new Object() : result[0]; + Object output = result[0] == null ? Map.of() : result[0]; return objectMapper.valueToTree(output); } private void parseParamsAndRunCommand( - final Manager m, final ObjectMapper objectMapper, final TreeNode params, final JsonRpcCommand command + final Manager m, + final ObjectMapper objectMapper, + final TreeNode params, + final OutputWriter outputWriter, + final JsonRpcCommand command ) throws CommandException, JsonMappingException { T requestParams = null; final var requestType = command.getRequestType(); @@ -147,7 +164,7 @@ public class JsonRpcDispatcherCommand implements LocalCommand { throw new AssertionError(e); } } - command.handleCommand(requestParams, m); + command.handleCommand(requestParams, m, outputWriter); } private Thread receiveMessages( @@ -161,8 +178,6 @@ public class JsonRpcDispatcherCommand implements LocalCommand { break; } catch (IOException e) { logger.warn("Receiving messages failed, retrying", e); - } catch (InterruptedException e) { - break; } } });