forked from DonJayamanne/pythonVSCode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsocketServer.ts
More file actions
67 lines (60 loc) · 2.2 KB
/
socketServer.ts
File metadata and controls
67 lines (60 loc) · 2.2 KB
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
57
58
59
60
61
62
63
64
65
66
67
import { EventEmitter } from 'events';
import { injectable } from 'inversify';
import * as net from 'net';
import { ISocketServer } from '../../types';
import { createDeferred, Deferred } from '../../utils/async';
import { noop } from '../../utils/misc';
@injectable()
export class SocketServer extends EventEmitter implements ISocketServer {
private socketServer: net.Server | undefined;
private clientSocket: Deferred<net.Socket>;
public get client(): Promise<net.Socket> {
return this.clientSocket.promise;
}
constructor() {
super();
this.clientSocket = createDeferred<net.Socket>();
}
public dispose() {
this.Stop();
}
public Stop() {
if (!this.socketServer) { return; }
try {
this.socketServer.close();
// tslint:disable-next-line:no-empty
} catch (ex) { }
this.socketServer = undefined;
}
public Start(options: { port?: number; host?: string } = {}): Promise<number> {
const def = createDeferred<number>();
this.socketServer = net.createServer(this.connectionListener.bind(this));
const port = typeof options.port === 'number' ? options.port! : 0;
const host = typeof options.host === 'string' ? options.host! : 'localhost';
this.socketServer!.on('error', ex => {
// tslint:disable-next-line: no-console
console.error('Error in Socket Server', ex);
const msg = `Failed to start the socket server. (Error: ${ex.message})`;
def.reject(msg);
});
this.socketServer!.listen({ port, host }, () => {
def.resolve(this.socketServer!.address().port);
});
return def.promise;
}
private connectionListener(client: net.Socket) {
if (!this.clientSocket.completed) {
this.clientSocket.resolve(client);
}
client.on('close', () => {
this.emit('close', client);
});
client.on('data', (data: Buffer) => {
this.emit('data', client, data);
});
client.on('error', () => noop);
client.on('timeout', () => {
// let msg = "Debugger client timedout, " + d;
});
}
}