Skip to content

Commit 0f8eccf

Browse files
pavelfeldmanaslushnikov
authored andcommitted
fix(ECONRESET): fix it once and for all (#4258)
1 parent e50d0a2 commit 0f8eccf

File tree

4 files changed

+18
-15
lines changed

4 files changed

+18
-15
lines changed

src/server/pipeTransport.ts

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,13 @@
1515
* limitations under the License.
1616
*/
1717

18-
import { helper, RegisteredListener } from './helper';
1918
import { ConnectionTransport, ProtocolRequest, ProtocolResponse } from './transport';
2019
import { makeWaitForNextTask } from '../utils/utils';
2120
import { debugLogger } from '../utils/debugLogger';
2221

2322
export class PipeTransport implements ConnectionTransport {
2423
private _pipeWrite: NodeJS.WritableStream;
2524
private _pendingMessage = '';
26-
private _eventListeners: RegisteredListener[];
2725
private _waitForNextTask = makeWaitForNextTask();
2826
private _closed = false;
2927

@@ -32,17 +30,14 @@ export class PipeTransport implements ConnectionTransport {
3230

3331
constructor(pipeWrite: NodeJS.WritableStream, pipeRead: NodeJS.ReadableStream) {
3432
this._pipeWrite = pipeWrite;
35-
this._eventListeners = [
36-
helper.addEventListener(pipeRead, 'data', buffer => this._dispatch(buffer)),
37-
helper.addEventListener(pipeRead, 'close', () => {
38-
this._closed = true;
39-
helper.removeEventListeners(this._eventListeners);
40-
if (this.onclose)
41-
this.onclose.call(null);
42-
}),
43-
helper.addEventListener(pipeRead, 'error', e => debugLogger.log('error', e)),
44-
helper.addEventListener(pipeWrite, 'error', e => debugLogger.log('error', e)),
45-
];
33+
pipeRead.on('data', buffer => this._dispatch(buffer));
34+
pipeRead.on('close', () => {
35+
this._closed = true;
36+
if (this.onclose)
37+
this.onclose.call(null);
38+
}),
39+
pipeRead.on('error', e => debugLogger.log('error', e)),
40+
pipeWrite.on('error', e => debugLogger.log('error', e)),
4641
this.onmessage = undefined;
4742
this.onclose = undefined;
4843
}

src/server/processLauncher.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ export async function launchProcess(options: LaunchProcessOptions): Promise<Laun
8585
stdio,
8686
}
8787
);
88+
89+
// Prevent Unhandled 'error' event.
90+
spawnedProcess.on('error', () => {});
91+
8892
if (!spawnedProcess.pid) {
8993
let failed: (e: Error) => void;
9094
const failedPromise = new Promise<Error>((f, r) => failed = f);
@@ -197,6 +201,7 @@ export function waitForLine(progress: Progress, process: childProcess.ChildProce
197201
helper.addEventListener(rl, 'line', onLine),
198202
helper.addEventListener(rl, 'close', reject.bind(null, failError)),
199203
helper.addEventListener(process, 'exit', reject.bind(null, failError)),
204+
// It is Ok to remove error handler because we did not create process and there is another listener.
200205
helper.addEventListener(process, 'error', reject.bind(null, failError))
201206
];
202207

src/server/transport.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ export class WebSocketTransport implements ConnectionTransport {
9999
if (this.onclose)
100100
this.onclose.call(null);
101101
});
102-
// Silently ignore all errors - we don't know what to do with them.
102+
// Prevent Error: read ECONNRESET.
103103
this._ws.addEventListener('error', () => {});
104104
}
105105

test/remoteServer.fixture.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ export class RemoteServer {
7474
launchOptions,
7575
...extraOptions,
7676
};
77-
this._child = spawn('node', [path.join(__dirname, 'fixtures', 'closeme.js'), JSON.stringify(options)]);
77+
this._child = spawn('node', [path.join(__dirname, 'fixtures', 'closeme.js'), JSON.stringify(options)], { env: process.env });
7878
this._child.on('error', (...args) => console.log('ERROR', ...args));
7979
this._exitPromise = new Promise(resolve => this._child.on('exit', (exitCode, signal) => {
8080
this._didExit = true;
@@ -94,6 +94,9 @@ export class RemoteServer {
9494
outputString = outputString.substring(match.index + match[0].length);
9595
}
9696
});
97+
this._child.stderr.on('data', data => {
98+
console.log(data.toString());
99+
});
97100

98101
this._wsEndpoint = await this.out('wsEndpoint');
99102
}

0 commit comments

Comments
 (0)