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.
61 lines
1.2 KiB
61 lines
1.2 KiB
2 years ago
|
'use strict';
|
||
|
|
||
|
var through = require('through2');
|
||
|
|
||
|
function forward(chunk, enc, cb) {
|
||
|
cb(null, chunk);
|
||
|
}
|
||
|
|
||
|
function toThrough(readable) {
|
||
|
|
||
|
var opts = {
|
||
|
objectMode: readable._readableState.objectMode,
|
||
|
highWaterMark: readable._readableState.highWaterMark,
|
||
|
};
|
||
|
|
||
|
function flush(cb) {
|
||
|
var self = this;
|
||
|
|
||
|
readable.on('readable', onReadable);
|
||
|
readable.on('end', cb);
|
||
|
|
||
|
function onReadable() {
|
||
|
var chunk;
|
||
|
while (chunk = readable.read()) {
|
||
|
self.push(chunk);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var wrapper = through(opts, forward, flush);
|
||
|
|
||
|
var shouldFlow = true;
|
||
|
wrapper.once('pipe', onPipe);
|
||
|
wrapper.on('newListener', onListener);
|
||
|
readable.on('error', wrapper.emit.bind(wrapper, 'error'));
|
||
|
|
||
|
function onListener(event) {
|
||
|
// Once we've seen the data or readable event, check if we need to flow
|
||
|
if (event === 'data' || event === 'readable') {
|
||
|
maybeFlow();
|
||
|
this.removeListener('newListener', onListener);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function onPipe() {
|
||
|
// If the wrapper is piped, disable flow
|
||
|
shouldFlow = false;
|
||
|
}
|
||
|
|
||
|
function maybeFlow() {
|
||
|
// If we need to flow, end the stream which triggers flush
|
||
|
if (shouldFlow) {
|
||
|
wrapper.end();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return wrapper;
|
||
|
}
|
||
|
|
||
|
module.exports = toThrough;
|