From f56b14438bff3927f11ba4abff5321ce7b84f17e Mon Sep 17 00:00:00 2001 From: Felix Becker Date: Wed, 30 Nov 2016 21:10:05 +0100 Subject: [PATCH] Shutdown when the socket is closed (#191) --- bin/php-language-server.php | 10 ++++++---- src/LanguageServer.php | 4 ++++ src/ProtocolReader.php | 2 ++ src/ProtocolStreamReader.php | 10 ++++++++++ 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/bin/php-language-server.php b/bin/php-language-server.php index 7cb3178..62bdeb4 100644 --- a/bin/php-language-server.php +++ b/bin/php-language-server.php @@ -68,10 +68,12 @@ if (!empty($options['tcp'])) { exit(1); } else if ($pid === 0) { // Child process - $ls = new LanguageServer( - new ProtocolStreamReader($socket), - new ProtocolStreamWriter($socket) - ); + $reader = new ProtocolStreamReader($socket); + $writer = new ProtocolStreamWriter($socket); + $reader->on('close', function () { + fwrite(STDOUT, "Connection closed\n"); + }); + $ls = new LanguageServer($reader, $writer); Loop\run(); // Just for safety exit(0); diff --git a/src/LanguageServer.php b/src/LanguageServer.php index 43f0544..d2ae742 100644 --- a/src/LanguageServer.php +++ b/src/LanguageServer.php @@ -65,6 +65,10 @@ class LanguageServer extends AdvancedJsonRpc\Dispatcher { parent::__construct($this, '/'); $this->protocolReader = $reader; + $this->protocolReader->on('close', function () { + $this->shutdown(); + $this->exit(); + }); $this->protocolReader->on('message', function (Message $msg) { coroutine(function () use ($msg) { // Ignore responses, this is the handler for requests and notifications diff --git a/src/ProtocolReader.php b/src/ProtocolReader.php index 7515bab..c199fba 100644 --- a/src/ProtocolReader.php +++ b/src/ProtocolReader.php @@ -8,6 +8,8 @@ use Sabre\Event\EmitterInterface; /** * Must emit a "message" event with a Protocol\Message object as parameter * when a message comes in + * + * Must emit a "close" event when the stream closes */ interface ProtocolReader extends EmitterInterface { diff --git a/src/ProtocolStreamReader.php b/src/ProtocolStreamReader.php index af4f3ed..4071dcd 100644 --- a/src/ProtocolStreamReader.php +++ b/src/ProtocolStreamReader.php @@ -25,7 +25,17 @@ class ProtocolStreamReader extends Emitter implements ProtocolReader { $this->input = $input; + $this->on('close', function () { + Loop\removeReadStream($this->input); + }); + Loop\addReadStream($this->input, function () { + if (feof($this->input)) { + // If stream_select reported a status change for this stream, + // but the stream is EOF, it means it was closed. + $this->emit('close'); + return; + } while (($c = fgetc($this->input)) !== false && $c !== '') { $this->buffer .= $c; switch ($this->parsingMode) {