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')