diff --git a/src/unixTerminal.ts b/src/unixTerminal.ts index b745d762d..9f8207ef1 100644 --- a/src/unixTerminal.ts +++ b/src/unixTerminal.ts @@ -5,7 +5,6 @@ */ import * as net from 'net'; import * as path from 'path'; -import * as tty from 'tty'; import { Terminal, DEFAULT_COLS, DEFAULT_ROWS } from './terminal'; import { IProcessEnv, IPtyForkOptions, IPtyOpenOptions } from './interfaces'; import { ArgvOrCommandLine } from './types'; @@ -114,7 +113,7 @@ export class UnixTerminal extends Terminal { // fork const term = pty.fork(file, args, parsedEnv, cwd, this._cols, this._rows, uid, gid, (encoding === 'utf8'), helperPath, onexit); - this._socket = new tty.ReadStream(term.fd); + this._socket = new PipeSocket(term.fd); if (encoding !== null) { this._socket.setEncoding(encoding); } @@ -204,13 +203,13 @@ export class UnixTerminal extends Terminal { // open const term: IUnixOpenProcess = pty.open(cols, rows); - self._master = new tty.ReadStream(term.master); + self._master = new PipeSocket(term.master); if (encoding !== null) { self._master.setEncoding(encoding); } self._master.resume(); - self._slave = new tty.ReadStream(term.slave); + self._slave = new PipeSocket(term.slave); if (encoding !== null) { self._slave.setEncoding(encoding); } @@ -305,3 +304,18 @@ export class UnixTerminal extends Terminal { delete env['LINES']; } } + +/** + * Wraps net.Socket to force the handle type "PIPE" by temporarily overwriting + * tty_wrap.guessHandleType. + * See: https://github.com/chjj/pty.js/issues/103 + */ +class PipeSocket extends net.Socket { + constructor(fd: number) { + const pipeWrap = (process).binding('pipe_wrap'); // tslint:disable-line + // @types/node has fd as string? https://github.com/DefinitelyTyped/DefinitelyTyped/pull/18275 + const handle = new pipeWrap.Pipe(pipeWrap.constants.SOCKET); + handle.open(fd); + super({ handle }); + } +}