diff --git a/bin/main.php b/bin/main.php index 5283287..9cb8ea5 100644 --- a/bin/main.php +++ b/bin/main.php @@ -1,42 +1,9 @@ emit($body->method, [$body->params]); - $parsingMode = ParsingMode::HEADERS; - $buffer = ''; - } - break; - } -}); - -Loop\run(); +$server = new LanguageServer(STDIN, STDOUT); +$server->run(); diff --git a/src/LanguageServer.php b/src/LanguageServer.php new file mode 100644 index 0000000..09a70e8 --- /dev/null +++ b/src/LanguageServer.php @@ -0,0 +1,62 @@ +input = $input; + $this->output = $output; + } + + public function listen() + { + $buffer = ''; + $parsingMode = ParsingMode::HEADERS; + $headers = []; + $contentLength = 0; + + Loop\addReadStream($this->input, function() use ($buffer, $parsingMode, $headers, $contentLength) { + $buffer .= fgetc($this->output); + switch ($parsingMode) { + case ParsingMode::HEADERS: + if (substr($buffer, -4) === '\r\n\r\n') { + $parsingMode = ParsingMode::BODY; + $contentLength = (int)$headers['Content-Length']; + $buffer = ''; + } else if (substr($buffer, -2) === '\r\n') { + $parts = explode(': ', $buffer); + $headers[$parts[0]] = $parts[1]; + $buffer = ''; + } + break; + case ParsingMode::BODY: + if (strlen($buffer) === $contentLength) { + $body = json_decode($buffer); + $this->emit($body->method, [$body->params]); + $parsingMode = ParsingMode::HEADERS; + $buffer = ''; + } + break; + } + }); + + Loop\run(); + } +}