问题描述
我正在尝试创建自定义LSP。 我的目标是为monaco编辑器(在Web上)和vscode扩展创建一个语言服务器。
当前,我使用Node / IPC将vscode-extension与服务器连接。 和ws-jsonrpc将摩纳哥编辑器与服务器连接。
引用本文Extending a client with the language server protocol :
有多种使用JSON-RPC的方法,但是您会在这两种方法中看到 大多数实现:
- 通过标准输入/输出(即命令行界面)进行通信
- 通过TCP / IP(即类似于HTTP的网络消息)执行通信
我应该能够使用JSON-RPC进行通信(进程之间的内部通信(在我的情况下是vscode-extesion)和外部通信(在我的情况下是monaco编辑器)
这是我目前启动服务器的方式:
对于IPC通信:
const languageServer = new LanguageServer(createConnection(ProposedFeatures.all));
languageServer.start();
对于WebSocket RPC:
import * as express from "express";
import * as ws from "ws";
import * as rpc from "vscode-ws-jsonrpc";
import * as url from "url";
import * as http from "http";
import * as net from "net";
const app = express();
const server = app.listen(3000);
const wss = new ws.Server({
noServer: true,perMessageDeflate: false
});
function launch(socket : rpc.IWebSocket ){
const reader = new rpc.WebSocketMessageReader(socket);
const writer = new rpc.WebSocketMessageWriter(socket);
const languageServer = new LanguageServer(createConnection(reader,writer));
languageServer.start();
}
server.on('upgrade',(request: http.IncomingMessage,socket: net.socket,head: Buffer) => {
const pathname = request.url ? url.parse(request.url).pathname : undefined;
console.log("server on upgrade ",pathname);
if (pathname === '/sampleServer') {
wss.handleUpgrade(request,socket,head,(webSocket: any) => {
const socket: rpc.IWebSocket = {
send: (content: any) => webSocket.send(content,(error: any) => {
if (error) {
throw error;
}
}),onMessage: (cb: any) => webSocket.on('message',cb),onError: (cb: any) => webSocket.on('error',onClose: (cb: any) => webSocket.on('close',dispose: () => webSocket.close()
};
// launch the server when the web socket is opened
if (webSocket.readyState === webSocket.OPEN) {
launch(socket);
} else {
webSocket.on('open',() => {
launch(socket);
});
}
});
}
})
解决方法
您正在使用的服务器不应与同时使用它的多个客户端一起运行。它甚至说:“该协议当前假定一台服务器提供一种工具。”。另外,也许阅读有关您的主题的这篇文章。 ** https://code.visualstudio.com/api/language-extensions/language-server-extension-guide **