1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | import { MessageConnection, Logger } from 'vscode-jsonrpc';
|
7 | import { createWebSocketConnection } from './socket/connection.js';
|
8 | import { IWebSocket } from './socket/socket.js';
|
9 | import { ConsoleLogger } from './logger.js';
|
10 |
|
11 | export function listen(options: {
|
12 | webSocket: WebSocket;
|
13 | logger?: Logger;
|
14 | onConnection: (connection: MessageConnection) => void;
|
15 | }) {
|
16 | const { webSocket, onConnection } = options;
|
17 | const logger = options.logger || new ConsoleLogger();
|
18 | webSocket.onopen = () => {
|
19 | const socket = toSocket(webSocket);
|
20 | const connection = createWebSocketConnection(socket, logger);
|
21 | onConnection(connection);
|
22 | };
|
23 | }
|
24 |
|
25 | export function toSocket(webSocket: WebSocket): IWebSocket {
|
26 | return {
|
27 | send: content => webSocket.send(content),
|
28 | onMessage: cb => {
|
29 | webSocket.onmessage = event => cb(event.data);
|
30 | },
|
31 | onError: cb => {
|
32 | webSocket.onerror = event => {
|
33 | if ('message' in event) {
|
34 | cb((event as any).message);
|
35 | }
|
36 | };
|
37 | },
|
38 | onClose: cb => {
|
39 | webSocket.onclose = event => cb(event.code, event.reason);
|
40 | },
|
41 | dispose: () => webSocket.close()
|
42 | };
|
43 | }
|