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.
60 lines
1.2 KiB
60 lines
1.2 KiB
'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;
|
|
|