如何解决使用RPC为多个客户端创建LSP语言服务器协议
我正在尝试创建自定义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 **
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。