50 lines
1.2 KiB
JavaScript
50 lines
1.2 KiB
JavaScript
import { AbstractMessageReader } from "vscode-jsonrpc/lib/messageReader";
|
|
|
|
const DEBUG = window.location.hash === "#debug";
|
|
|
|
class RijuMessageReader extends AbstractMessageReader {
|
|
constructor(socket) {
|
|
super();
|
|
this.state = "initial";
|
|
this.callback = null;
|
|
this.messageQueue = [];
|
|
this.socket = socket;
|
|
this.socket.addEventListener("message", (event) => {
|
|
this.readMessage(event.data);
|
|
});
|
|
}
|
|
|
|
listen(callback) {
|
|
if (this.state === "initial") {
|
|
this.state = "listening";
|
|
this.callback = callback;
|
|
while (this.messageQueue.length > 0) {
|
|
this.readMessage(this.messageQueue.pop());
|
|
}
|
|
}
|
|
}
|
|
|
|
readMessage(rawMessage) {
|
|
if (this.state === "initial") {
|
|
this.messageQueue.splice(0, 0, rawMessage);
|
|
} else if (this.state === "listening") {
|
|
let message;
|
|
try {
|
|
message = JSON.parse(rawMessage);
|
|
} catch (err) {
|
|
return;
|
|
}
|
|
switch (message && message.event) {
|
|
case "lspOutput":
|
|
if (DEBUG) {
|
|
console.log("RECEIVE LSP:", message.output);
|
|
}
|
|
this.callback(message.output);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
export default RijuMessageReader;
|