使用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 **