m, net.Socket); ReadStream.prototype.setRawMode = function(flag) { flag = !!flag; const err = this._handle.setRawMode(flag); if (err) { this.emit('error', errors.errnoException(err, 'setRawMode')); return this; } this.isRaw = flag; return this; }; function WriteStream(fd) { if (!(this instanceof WriteStream)) return new WriteStream(fd); if (fd >> 0 !== fd || fd < 0) throw new ERR_INVALID_FD(fd); const ctx = {}; const tty = new TTY(fd, ctx); if (ctx.code !== undefined) { throw new ERR_TTY_INIT_FAILED(ctx); } net.Socket.call(this, { readableHighWaterMark: 0, handle: tty, manualStart: true }); // Prevents interleaved or dropped stdout/stderr output for terminals. // As noted in the following reference, local TTYs tend to be quite fast and // this behavior has become expected due historical functionality on OS X, // even though it was originally intended to change in v1.0.2 (Libuv 1.2.1). // Ref: https://github.com/nodejs/node/pull/1771#issuecomment-119351671 this._handle.setBlocking(true); const winSize = new Array(2); const err = this._handle.getWindowSize(winSize); if (!err) { this.columns = winSize[0]; this.rows = winSize[1]; } } ObjectSetPrototypeOf(WriteStream.prototype, net.Socket.prototype); ObjectSetPrototypeOf(WriteStream, net.Socket); WriteStream.prototype.isTTY = true; WriteStream.prototype.getColorDepth = getColorDepth; WriteStream.prototype.hasColors = hasColors; WriteStream.prototype._refreshSize = function() { const oldCols = this.columns; const oldRows = this.rows; const winSize = new Array(2); const err = this._handle.getWindowSize(winSize); if (err) { this.emit('error', errors.errnoException(err, 'getWindowSize')); return; } const { 0: newCols, 1: newRows } = winSize; if (oldCols !== newCols || oldRows !== newRows) { this.columns = newCols; this.rows = newRows; this.emit('resize'); } }; // Backwards-compat WriteStream.prototype.cursorTo = function(x, y, callback) { if (readline === undefined) readline = require('readline'); return readline.cursorTo(this, x, y, callback); }; WriteStream.prototype.moveCursor = function(dx, dy, callback) { if (readline === undefined) readline = require('readline'); return readline.moveCursor(this, dx, dy, callback); }; WriteStream.prototype.clearLine = function(dir, callback) { if (readline === undefined) readline = require('readline'); return readline.clearLine(this, dir, callback); }; WriteStream.prototype.clearScreenDown = function(callback) { if (readline === undefined) readline = require('readline'); return readline.clearScreenDown(this, callback); }; WriteStream.prototype.getWindowSize = function() { return [this.columns, this.rows]; }; module.exports = { isatty, ReadStream, WriteStream };