| // Copyright Joyent, Inc. and other Node contributors. |
| // |
| // Permission is hereby granted, free of charge, to any person obtaining a |
| // copy of this software and associated documentation files (the |
| // "Software"), to deal in the Software without restriction, including |
| // without limitation the rights to use, copy, modify, merge, publish, |
| // distribute, sublicense, and/or sell copies of the Software, and to permit |
| // persons to whom the Software is furnished to do so, subject to the |
| // following conditions: |
| // |
| // The above copyright notice and this permission notice shall be included |
| // in all copies or substantial portions of the Software. |
| // |
| // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN |
| // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
| // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
| // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE |
| // USE OR OTHER DEALINGS IN THE SOFTWARE. |
| |
| var assert = require('assert'); |
| var inherits = require('util').inherits; |
| var net = require('net'); |
| var TTY = process.binding('tty_wrap').TTY; |
| var isTTY = process.binding('tty_wrap').isTTY; |
| var util = require('util'); |
| |
| exports.isatty = function(fd) { |
| return isTTY(fd); |
| }; |
| |
| |
| // backwards-compat |
| exports.setRawMode = util.deprecate(function(flag) { |
| if (!process.stdin.isTTY) { |
| throw new Error('can\'t set raw mode on non-tty'); |
| } |
| process.stdin.setRawMode(flag); |
| }, 'tty.setRawMode: Use `process.stdin.setRawMode()` instead.'); |
| |
| |
| function ReadStream(fd, options) { |
| if (!(this instanceof ReadStream)) |
| return new ReadStream(fd, options); |
| |
| options = util._extend({ |
| highWaterMark: 0, |
| readable: true, |
| writable: false, |
| handle: new TTY(fd, true) |
| }, options); |
| |
| net.Socket.call(this, options); |
| |
| this.isRaw = false; |
| this.isTTY = true; |
| } |
| inherits(ReadStream, net.Socket); |
| |
| exports.ReadStream = ReadStream; |
| |
| ReadStream.prototype.setRawMode = function(flag) { |
| flag = !!flag; |
| this._handle.setRawMode(flag); |
| this.isRaw = flag; |
| }; |
| |
| |
| |
| function WriteStream(fd) { |
| if (!(this instanceof WriteStream)) return new WriteStream(fd); |
| net.Socket.call(this, { |
| handle: new TTY(fd, false), |
| readable: false, |
| writable: true |
| }); |
| |
| var winSize = this._handle.getWindowSize(); |
| if (winSize) { |
| this.columns = winSize[0]; |
| this.rows = winSize[1]; |
| } |
| } |
| inherits(WriteStream, net.Socket); |
| exports.WriteStream = WriteStream; |
| |
| |
| WriteStream.prototype.isTTY = true; |
| |
| |
| WriteStream.prototype._refreshSize = function() { |
| var oldCols = this.columns; |
| var oldRows = this.rows; |
| var winSize = this._handle.getWindowSize(); |
| if (!winSize) { |
| this.emit('error', errnoException(process._errno, 'getWindowSize')); |
| return; |
| } |
| var newCols = winSize[0]; |
| var newRows = winSize[1]; |
| if (oldCols !== newCols || oldRows !== newRows) { |
| this.columns = newCols; |
| this.rows = newRows; |
| this.emit('resize'); |
| } |
| }; |
| |
| |
| // backwards-compat |
| WriteStream.prototype.cursorTo = function(x, y) { |
| require('readline').cursorTo(this, x, y); |
| }; |
| WriteStream.prototype.moveCursor = function(dx, dy) { |
| require('readline').moveCursor(this, dx, dy); |
| }; |
| WriteStream.prototype.clearLine = function(dir) { |
| require('readline').clearLine(this, dir); |
| }; |
| WriteStream.prototype.clearScreenDown = function() { |
| require('readline').clearScreenDown(this); |
| }; |
| WriteStream.prototype.getWindowSize = function() { |
| return [this.columns, this.rows]; |
| }; |
| |
| |
| // TODO share with net_uv and others |
| function errnoException(errorno, syscall) { |
| var e = new Error(syscall + ' ' + errorno); |
| e.errno = e.code = errorno; |
| e.syscall = syscall; |
| return e; |
| } |