Skip to content

Commit 2ec3bd7

Browse files
Add support for websockets - treat language server as WS server
1 parent 0a034da commit 2ec3bd7

File tree

4 files changed

+399
-356
lines changed

4 files changed

+399
-356
lines changed

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
"@types/node": "^18.19.15",
5050
"@types/semver": "^7.5.6",
5151
"@types/which": "^3.0.3",
52+
"@types/ws": "^8.18.1",
5253
"@typescript-eslint/eslint-plugin": "^6.21.0",
5354
"@typescript-eslint/parser": "^6.21.0",
5455
"commander": "^12.0.0",
@@ -74,7 +75,9 @@
7475
"vscode-languageserver-protocol": "^3.17.5",
7576
"vscode-languageserver-textdocument": "1.0.11",
7677
"vscode-uri": "^3.0.8",
78+
"vscode-ws-jsonrpc": "^3.4.0",
7779
"which": "^4.0.0",
78-
"why-is-node-running": "^2.2.2"
80+
"why-is-node-running": "^2.2.2",
81+
"ws": "^8.18.1"
7982
}
8083
}

src/cli.ts

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,19 @@
55
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
66
*/
77

8-
import { readFileSync } from 'node:fs';
8+
// import { readFileSync } from 'node:fs';
99
import { Command } from 'commander';
10-
import lsp from 'vscode-languageserver';
10+
import lsp from 'vscode-languageserver/node.js';
11+
import { WebSocketMessageReader, WebSocketMessageWriter, toSocket } from 'vscode-ws-jsonrpc';
1112
import { createLspConnection } from './lsp-connection.js';
13+
import * as ws from 'ws';
1214

1315
const DEFAULT_LOG_LEVEL = lsp.MessageType.Info;
14-
const { version } = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), { encoding: 'utf8' }));
16+
// const { version } = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), { encoding: 'utf8' }));
1517

1618
const program = new Command('typescript-language-server')
17-
.version(version)
18-
.requiredOption('--stdio', 'use stdio')
19+
// .version(version)
20+
// .requiredOption('--stdio', 'use stdio')
1921
.option('--log-level <logLevel>', 'A number indicating the log level (4 = log, 3 = info, 2 = warn, 1 = error). Defaults to `2`.')
2022
.parse(process.argv);
2123

@@ -30,6 +32,21 @@ if (options.logLevel) {
3032
}
3133
}
3234

33-
createLspConnection({
34-
showMessageLevel: logLevel as lsp.MessageType,
35-
}).listen();
35+
const port = 9090;
36+
const wss = new ws.WebSocketServer({ port });
37+
38+
let connection: lsp.Connection | undefined = undefined;
39+
40+
wss.on('connection', (socket) => {
41+
if (connection) {
42+
connection.dispose();
43+
}
44+
const sock = toSocket(socket);
45+
const reader = new WebSocketMessageReader(sock);
46+
const writer = new WebSocketMessageWriter(sock);
47+
connection = lsp.createConnection(lsp.ProposedFeatures.all, reader, writer);
48+
49+
createLspConnection({
50+
showMessageLevel: logLevel as lsp.MessageType,
51+
}, connection).listen();
52+
});

src/lsp-connection.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ export interface LspConnectionOptions {
1414
showMessageLevel: lsp.MessageType;
1515
}
1616

17-
export function createLspConnection(options: LspConnectionOptions): lsp.Connection {
18-
const connection = lsp.createConnection(lsp.ProposedFeatures.all);
17+
export function createLspConnection(options: LspConnectionOptions, connection: lsp.Connection): lsp.Connection {
1918
const lspClient = new LspClientImpl(connection);
2019
const logger = new LspClientLogger(lspClient, options.showMessageLevel);
2120
const server: LspServer = new LspServer({

0 commit comments

Comments
 (0)