Subtheme of barrio
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

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;