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.
52 lines
894 B
52 lines
894 B
'use strict'; |
|
const {PassThrough: PassThroughStream} = require('stream'); |
|
|
|
module.exports = options => { |
|
options = {...options}; |
|
|
|
const {array} = options; |
|
let {encoding} = options; |
|
const isBuffer = encoding === 'buffer'; |
|
let objectMode = false; |
|
|
|
if (array) { |
|
objectMode = !(encoding || isBuffer); |
|
} else { |
|
encoding = encoding || 'utf8'; |
|
} |
|
|
|
if (isBuffer) { |
|
encoding = null; |
|
} |
|
|
|
const stream = new PassThroughStream({objectMode}); |
|
|
|
if (encoding) { |
|
stream.setEncoding(encoding); |
|
} |
|
|
|
let length = 0; |
|
const chunks = []; |
|
|
|
stream.on('data', chunk => { |
|
chunks.push(chunk); |
|
|
|
if (objectMode) { |
|
length = chunks.length; |
|
} else { |
|
length += chunk.length; |
|
} |
|
}); |
|
|
|
stream.getBufferedValue = () => { |
|
if (array) { |
|
return chunks; |
|
} |
|
|
|
return isBuffer ? Buffer.concat(chunks, length) : chunks.join(''); |
|
}; |
|
|
|
stream.getBufferedLength = () => length; |
|
|
|
return stream; |
|
};
|
|
|