Spaces:
Running
Running
File size: 2,841 Bytes
d4b85c0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
const Stream = require('stream')
class MuteStream extends Stream {
#isTTY = null
constructor (opts = {}) {
super(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
}
#destSrc (key, def) {
if (this._dest) {
return this._dest[key]
}
if (this._src) {
return this._src[key]
}
return def
}
#proxy (method, ...args) {
if (typeof this._dest?.[method] === 'function') {
this._dest[method](...args)
}
if (typeof this._src?.[method] === 'function') {
this._src[method](...args)
}
}
get isTTY () {
if (this.#isTTY !== null) {
return this.#isTTY
}
return this.#destSrc('isTTY', false)
}
// basically just get replace the getter/setter with a regular value
set isTTY (val) {
this.#isTTY = val
}
get rows () {
return this.#destSrc('rows')
}
get columns () {
return this.#destSrc('columns')
}
mute () {
this.muted = true
}
unmute () {
this.muted = false
}
_onpipe (src) {
this._src = src
}
pipe (dest, options) {
this._dest = dest
return super.pipe(dest, options)
}
pause () {
if (this._src) {
return this._src.pause()
}
}
resume () {
if (this._src) {
return this._src.resume()
}
}
write (c) {
if (this.muted) {
if (!this.replace) {
return true
}
// eslint-disable-next-line no-control-regex
if (c.match(/^\u001b/)) {
if (c.indexOf(this._prompt) === 0) {
c = c.slice(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.slice(this._prompt.length)
}
c = c.toString().replace(/./g, this.replace)
}
}
this.emit('data', c)
}
end (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')
}
destroy (...args) {
return this.#proxy('destroy', ...args)
}
destroySoon (...args) {
return this.#proxy('destroySoon', ...args)
}
close (...args) {
return this.#proxy('close', ...args)
}
}
module.exports = MuteStream
|