Skip to content

Commit 7d3027e

Browse files
authored
1 parent b891aa2 commit 7d3027e

File tree

1 file changed

+18
-3
lines changed

1 file changed

+18
-3
lines changed

src/vs/base/parts/ipc/node/ipc.net.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ export class NodeSocket implements ISocket {
3232
public readonly debugLabel: string;
3333
public readonly socket: Socket;
3434
private readonly _errorListener: (err: any) => void;
35+
private readonly _closeListener: (hadError: boolean) => void;
36+
private readonly _endListener: () => void;
37+
private _canWrite = true;
3538

3639
public traceSocketEvent(type: SocketDiagnosticsEventType, data?: VSBuffer | Uint8Array | ArrayBuffer | ArrayBufferView | any): void {
3740
SocketDiagnostics.traceSocketEvent(this.socket, this.debugLabel, type, data);
@@ -57,10 +60,24 @@ export class NodeSocket implements ISocket {
5760
}
5861
};
5962
this.socket.on('error', this._errorListener);
63+
64+
this._closeListener = (hadError: boolean) => {
65+
this.traceSocketEvent(SocketDiagnosticsEventType.Close, { hadError });
66+
this._canWrite = false;
67+
};
68+
this.socket.on('close', this._closeListener);
69+
70+
this._endListener = () => {
71+
this.traceSocketEvent(SocketDiagnosticsEventType.NodeEndReceived);
72+
this._canWrite = false;
73+
};
74+
this.socket.on('end', this._endListener);
6075
}
6176

6277
public dispose(): void {
6378
this.socket.off('error', this._errorListener);
79+
this.socket.off('close', this._closeListener);
80+
this.socket.off('end', this._endListener);
6481
this.socket.destroy();
6582
}
6683

@@ -77,7 +94,6 @@ export class NodeSocket implements ISocket {
7794

7895
public onClose(listener: (e: SocketCloseEvent) => void): IDisposable {
7996
const adapter = (hadError: boolean) => {
80-
this.traceSocketEvent(SocketDiagnosticsEventType.Close, { hadError });
8197
listener({
8298
type: SocketCloseEventType.NodeSocketCloseEvent,
8399
hadError: hadError,
@@ -92,7 +108,6 @@ export class NodeSocket implements ISocket {
92108

93109
public onEnd(listener: () => void): IDisposable {
94110
const adapter = () => {
95-
this.traceSocketEvent(SocketDiagnosticsEventType.NodeEndReceived);
96111
listener();
97112
};
98113
this.socket.on('end', adapter);
@@ -103,7 +118,7 @@ export class NodeSocket implements ISocket {
103118

104119
public write(buffer: VSBuffer): void {
105120
// return early if socket has been destroyed in the meantime
106-
if (this.socket.destroyed) {
121+
if (this.socket.destroyed || !this._canWrite) {
107122
return;
108123
}
109124

0 commit comments

Comments
 (0)