]> nmode's Git Repositories - signal-cli/commitdiff
Use improved shutdown for jsonRpc command
authorAsamK <asamk@gmx.de>
Thu, 9 Nov 2023 15:08:39 +0000 (16:08 +0100)
committerAsamK <asamk@gmx.de>
Thu, 9 Nov 2023 18:23:11 +0000 (19:23 +0100)
src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java
src/main/java/org/asamk/signal/util/IOUtils.java

index 0f1343f922c07ac7e055c5f9c039f09f9cea0e32..89457bad474e0a00a333c8a2a4b104898284eefb 100644 (file)
@@ -5,6 +5,7 @@ import net.sourceforge.argparse4j.inf.Namespace;
 import net.sourceforge.argparse4j.inf.Subparser;
 
 import org.asamk.signal.OutputType;
+import org.asamk.signal.Shutdown;
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.jsonrpc.SignalJsonRpcDispatcherHandler;
 import org.asamk.signal.manager.Manager;
@@ -15,7 +16,10 @@ import org.asamk.signal.util.IOUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.FileDescriptor;
+import java.io.FileInputStream;
 import java.io.InputStreamReader;
+import java.nio.channels.Channels;
 import java.util.List;
 import java.util.function.Supplier;
 
@@ -57,6 +61,7 @@ public class JsonRpcDispatcherCommand implements LocalCommand, MultiLocalCommand
     public void handleCommand(
             final Namespace ns, final Manager m, final OutputWriter outputWriter
     ) throws CommandException {
+        Shutdown.installHandler();
         final var receiveMode = ns.<ReceiveMode>get("receive-mode");
         final var receiveConfig = getReceiveConfig(ns);
         m.setReceiveConfig(receiveConfig);
@@ -67,6 +72,8 @@ public class JsonRpcDispatcherCommand implements LocalCommand, MultiLocalCommand
         final var handler = new SignalJsonRpcDispatcherHandler(jsonOutputWriter,
                 lineSupplier,
                 receiveMode == ReceiveMode.MANUAL);
+        final var thread = Thread.currentThread();
+        Shutdown.registerShutdownListener(thread::interrupt);
         handler.handleConnection(m);
     }
 
@@ -74,6 +81,7 @@ public class JsonRpcDispatcherCommand implements LocalCommand, MultiLocalCommand
     public void handleCommand(
             final Namespace ns, final MultiAccountManager c, final OutputWriter outputWriter
     ) throws CommandException {
+        Shutdown.installHandler();
         final var receiveMode = ns.<ReceiveMode>get("receive-mode");
         final var receiveConfig = getReceiveConfig(ns);
         c.getManagers().forEach(m -> m.setReceiveConfig(receiveConfig));
@@ -85,10 +93,14 @@ public class JsonRpcDispatcherCommand implements LocalCommand, MultiLocalCommand
         final var handler = new SignalJsonRpcDispatcherHandler(jsonOutputWriter,
                 lineSupplier,
                 receiveMode == ReceiveMode.MANUAL);
+        final var thread = Thread.currentThread();
+        Shutdown.registerShutdownListener(thread::interrupt);
         handler.handleConnection(c);
     }
 
     private static Supplier<String> getLineSupplier() {
-        return IOUtils.getLineSupplier(new InputStreamReader(System.in, IOUtils.getConsoleCharset()));
+        // Use FileChannel for stdin, because System.in is uninterruptible
+        final var stdInCh = Channels.newInputStream((new FileInputStream(FileDescriptor.in)).getChannel());
+        return IOUtils.getLineSupplier(new InputStreamReader(stdInCh, IOUtils.getConsoleCharset()));
     }
 }
index 9e0d6c3e9b61bfc947732f16c76b40d53d366790..d40b4a6c734e6bc669edd487af264b406e8367d8 100644 (file)
@@ -15,6 +15,7 @@ import java.net.InetSocketAddress;
 import java.net.SocketAddress;
 import java.net.StandardProtocolFamily;
 import java.net.UnixDomainSocketAddress;
+import java.nio.channels.ClosedChannelException;
 import java.nio.channels.ServerSocketChannel;
 import java.nio.channels.SocketChannel;
 import java.nio.charset.Charset;
@@ -93,6 +94,9 @@ public class IOUtils {
         return () -> {
             try {
                 return bufferedReader.readLine();
+            } catch (ClosedChannelException ignored) {
+                logger.trace("Line supplier has been interrupted.");
+                return null;
             } catch (IOException e) {
                 logger.error("Error occurred while reading line", e);
                 return null;