| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 | var Stream = require('stream')module.exports = MuteStream// var out = new MuteStream(process.stdout)// argument auto-pipesfunction MuteStream (opts) {  Stream.apply(this)  opts = opts || {}  this.writable = this.readable = true  this.muted = false  this.on('pipe', this._onpipe)  this.replace = opts.replace  // For readline-type situations  // This much at the start of a line being redrawn after a ctrl char  // is seen (such as backspace) won't be redrawn as the replacement  this._prompt = opts.prompt || null  this._hadControl = false}MuteStream.prototype = Object.create(Stream.prototype)Object.defineProperty(MuteStream.prototype, 'constructor', {  value: MuteStream,  enumerable: false})MuteStream.prototype.mute = function () {  this.muted = true}MuteStream.prototype.unmute = function () {  this.muted = false}Object.defineProperty(MuteStream.prototype, '_onpipe', {  value: onPipe,  enumerable: false,  writable: true,  configurable: true})function onPipe (src) {  this._src = src}Object.defineProperty(MuteStream.prototype, 'isTTY', {  get: getIsTTY,  set: setIsTTY,  enumerable: true,  configurable: true})function getIsTTY () {  return( (this._dest) ? this._dest.isTTY        : (this._src) ? this._src.isTTY        : false        )}// basically just get replace the getter/setter with a regular valuefunction setIsTTY (isTTY) {  Object.defineProperty(this, 'isTTY', {    value: isTTY,    enumerable: true,    writable: true,    configurable: true  })}Object.defineProperty(MuteStream.prototype, 'rows', {  get: function () {    return( this._dest ? this._dest.rows          : this._src ? this._src.rows          : undefined )  }, enumerable: true, configurable: true })Object.defineProperty(MuteStream.prototype, 'columns', {  get: function () {    return( this._dest ? this._dest.columns          : this._src ? this._src.columns          : undefined )  }, enumerable: true, configurable: true })MuteStream.prototype.pipe = function (dest, options) {  this._dest = dest  return Stream.prototype.pipe.call(this, dest, options)}MuteStream.prototype.pause = function () {  if (this._src) return this._src.pause()}MuteStream.prototype.resume = function () {  if (this._src) return this._src.resume()}MuteStream.prototype.write = function (c) {  if (this.muted) {    if (!this.replace) return true    if (c.match(/^\u001b/)) {      if(c.indexOf(this._prompt) === 0) {        c = c.substr(this._prompt.length);        c = c.replace(/./g, this.replace);        c = this._prompt + c;      }      this._hadControl = true      return this.emit('data', c)    } else {      if (this._prompt && this._hadControl &&          c.indexOf(this._prompt) === 0) {        this._hadControl = false        this.emit('data', this._prompt)        c = c.substr(this._prompt.length)      }      c = c.toString().replace(/./g, this.replace)    }  }  this.emit('data', c)}MuteStream.prototype.end = function (c) {  if (this.muted) {    if (c && this.replace) {      c = c.toString().replace(/./g, this.replace)    } else {      c = null    }  }  if (c) this.emit('data', c)  this.emit('end')}function proxy (fn) { return function () {  var d = this._dest  var s = this._src  if (d && d[fn]) d[fn].apply(d, arguments)  if (s && s[fn]) s[fn].apply(s, arguments)}}MuteStream.prototype.destroy = proxy('destroy')MuteStream.prototype.destroySoon = proxy('destroySoon')MuteStream.prototype.close = proxy('close')
 |