diff --git a/src/win/conpty.cc b/src/win/conpty.cc index 1dd4cd9f0..a35bc0f30 100644 --- a/src/win/conpty.cc +++ b/src/win/conpty.cc @@ -559,7 +559,9 @@ static Napi::Value PtyKill(const Napi::CallbackInfo& info) { pfnClosePseudoConsole(handle->hpc); } } - TerminateProcess(handle->hShell, 1); + if (useConptyDll) { + TerminateProcess(handle->hShell, 1); + } } return env.Undefined(); diff --git a/src/windowsConoutConnection.ts b/src/windowsConoutConnection.ts index 56243bb0a..fa2d62de1 100644 --- a/src/windowsConoutConnection.ts +++ b/src/windowsConoutConnection.ts @@ -37,9 +37,12 @@ export class ConoutConnection implements IDisposable { public get onReady(): IEvent { return this._onReady.event; } constructor( - private _conoutPipeName: string + private _conoutPipeName: string, + private _useConptyDll: boolean ) { - const workerData: IWorkerData = { conoutPipeName: _conoutPipeName }; + const workerData: IWorkerData = { + conoutPipeName: _conoutPipeName + }; const scriptPath = __dirname.replace('node_modules.asar', 'node_modules.asar.unpacked'); this._worker = new Worker(join(scriptPath, 'worker/conoutSocketWorker.js'), { workerData }); this._worker.on('message', (message: ConoutWorkerMessage) => { @@ -54,6 +57,10 @@ export class ConoutConnection implements IDisposable { } dispose(): void { + if (!this._useConptyDll && this._isDisposed) { + return; + } + this._isDisposed = true; // Drain all data from the socket before closing this._drainDataAndClose(); } diff --git a/src/windowsPtyAgent.ts b/src/windowsPtyAgent.ts index 78d08b9fa..ba5dbdbc9 100644 --- a/src/windowsPtyAgent.ts +++ b/src/windowsPtyAgent.ts @@ -118,7 +118,7 @@ export class WindowsPtyAgent { this._outSocket = new Socket(); this._outSocket.setEncoding('utf8'); // The conout socket must be ready out on another thread to avoid deadlocks - this._conoutSocketWorker = new ConoutConnection(term.conout); + this._conoutSocketWorker = new ConoutConnection(term.conout, this._useConptyDll); this._conoutSocketWorker.onReady(() => { this._conoutSocketWorker.connectSocket(this._outSocket); }); diff --git a/src/worker/conoutSocketWorker.ts b/src/worker/conoutSocketWorker.ts index 296f91a92..79a4148dd 100644 --- a/src/worker/conoutSocketWorker.ts +++ b/src/worker/conoutSocketWorker.ts @@ -4,22 +4,19 @@ import { parentPort, workerData } from 'worker_threads'; import { Socket, createServer } from 'net'; -import * as fs from 'fs'; import { ConoutWorkerMessage, IWorkerData, getWorkerPipeName } from '../shared/conout'; -const conoutPipeName = (workerData as IWorkerData).conoutPipeName; -const outSocketFD = fs.openSync(conoutPipeName, 'r'); -const conoutSocket = new Socket({ - fd: outSocketFD, - readable: true -}); +const { conoutPipeName } = (workerData as IWorkerData); + +const conoutSocket = new Socket(); conoutSocket.setEncoding('utf8'); -const server = createServer(workerSocket => { - conoutSocket.pipe(workerSocket); +conoutSocket.connect(conoutPipeName, () => { + const server = createServer(workerSocket => { + conoutSocket.pipe(workerSocket); + }); + server.listen(getWorkerPipeName(conoutPipeName)); + if (!parentPort) { + throw new Error('worker_threads parentPort is null'); + } + parentPort.postMessage(ConoutWorkerMessage.READY); }); -server.listen(getWorkerPipeName(conoutPipeName)); - -if (!parentPort) { - throw new Error('worker_threads parentPort is null'); -} -parentPort.postMessage(ConoutWorkerMessage.READY);