From: AsamK Date: Thu, 9 Nov 2023 15:08:39 +0000 (+0100) Subject: Use improved shutdown for jsonRpc command X-Git-Tag: v0.13.0~100 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/b7fedff5110c55625f2391a5aab607a2248bf104 Use improved shutdown for jsonRpc command --- diff --git a/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java b/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java index 0f1343f9..89457bad 100644 --- a/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java +++ b/src/main/java/org/asamk/signal/commands/JsonRpcDispatcherCommand.java @@ -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.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.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 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())); } } diff --git a/src/main/java/org/asamk/signal/util/IOUtils.java b/src/main/java/org/asamk/signal/util/IOUtils.java index 9e0d6c3e..d40b4a6c 100644 --- a/src/main/java/org/asamk/signal/util/IOUtils.java +++ b/src/main/java/org/asamk/signal/util/IOUtils.java @@ -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;