-
-
Notifications
You must be signed in to change notification settings - Fork 436
/
Copy pathweb-socket-provider-impl.ts
56 lines (45 loc) · 1.5 KB
/
web-socket-provider-impl.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import { Emitter } from '@theia/core';
import { injectable } from '@theia/core/shared/inversify';
import * as WebSocket from 'ws';
import { WebSocketProvider } from './web-socket-provider';
@injectable()
export default class WebSocketProviderImpl implements WebSocketProvider {
protected wsClients: WebSocket[];
protected server: WebSocket.Server;
protected readonly onMessage = new Emitter<string>();
public readonly onMessageReceived = this.onMessage.event;
protected readonly onConnectedClients = new Emitter<number>();
public readonly onClientsNumberChanged = this.onConnectedClients.event;
constructor() {
this.wsClients = [];
this.server = new WebSocket.Server({ port: 0 });
const addClient = this.addClient.bind(this);
this.server.on('connection', addClient);
}
private addClient(ws: WebSocket): void {
this.wsClients.push(ws);
this.onConnectedClients.fire(this.wsClients.length);
ws.onclose = () => {
this.wsClients.splice(this.wsClients.indexOf(ws), 1);
this.onConnectedClients.fire(this.wsClients.length);
};
ws.onmessage = (res) => {
this.onMessage.fire(res.data.toString());
};
}
getConnectedClientsNumber(): number {
return this.wsClients.length;
}
getAddress(): WebSocket.AddressInfo {
return this.server.address() as WebSocket.AddressInfo;
}
sendMessage(message: string): void {
this.wsClients.forEach((w) => {
try {
w.send(message);
} catch {
w.close();
}
});
}
}