You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					146 lines
				
				3.5 KiB
			
		
		
			
		
	
	
					146 lines
				
				3.5 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								var Stream = require('stream')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = MuteStream
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// var out = new MuteStream(process.stdout)
							 | 
						||
| 
								 | 
							
								// argument auto-pipes
							 | 
						||
| 
								 | 
							
								function 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 value
							 | 
						||
| 
								 | 
							
								function 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')
							 |