riju/frontend/services/RijuMessageReader.js

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;