@@ -32,6 +32,9 @@ export class NodeSocket implements ISocket {
32
32
public readonly debugLabel : string ;
33
33
public readonly socket : Socket ;
34
34
private readonly _errorListener : ( err : any ) => void ;
35
+ private readonly _closeListener : ( hadError : boolean ) => void ;
36
+ private readonly _endListener : ( ) => void ;
37
+ private _canWrite = true ;
35
38
36
39
public traceSocketEvent ( type : SocketDiagnosticsEventType , data ?: VSBuffer | Uint8Array | ArrayBuffer | ArrayBufferView | any ) : void {
37
40
SocketDiagnostics . traceSocketEvent ( this . socket , this . debugLabel , type , data ) ;
@@ -57,10 +60,24 @@ export class NodeSocket implements ISocket {
57
60
}
58
61
} ;
59
62
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 ) ;
60
75
}
61
76
62
77
public dispose ( ) : void {
63
78
this . socket . off ( 'error' , this . _errorListener ) ;
79
+ this . socket . off ( 'close' , this . _closeListener ) ;
80
+ this . socket . off ( 'end' , this . _endListener ) ;
64
81
this . socket . destroy ( ) ;
65
82
}
66
83
@@ -77,7 +94,6 @@ export class NodeSocket implements ISocket {
77
94
78
95
public onClose ( listener : ( e : SocketCloseEvent ) => void ) : IDisposable {
79
96
const adapter = ( hadError : boolean ) => {
80
- this . traceSocketEvent ( SocketDiagnosticsEventType . Close , { hadError } ) ;
81
97
listener ( {
82
98
type : SocketCloseEventType . NodeSocketCloseEvent ,
83
99
hadError : hadError ,
@@ -92,7 +108,6 @@ export class NodeSocket implements ISocket {
92
108
93
109
public onEnd ( listener : ( ) => void ) : IDisposable {
94
110
const adapter = ( ) => {
95
- this . traceSocketEvent ( SocketDiagnosticsEventType . NodeEndReceived ) ;
96
111
listener ( ) ;
97
112
} ;
98
113
this . socket . on ( 'end' , adapter ) ;
@@ -103,7 +118,7 @@ export class NodeSocket implements ISocket {
103
118
104
119
public write ( buffer : VSBuffer ) : void {
105
120
// return early if socket has been destroyed in the meantime
106
- if ( this . socket . destroyed ) {
121
+ if ( this . socket . destroyed || ! this . _canWrite ) {
107
122
return ;
108
123
}
109
124
0 commit comments