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