49 lines
924 B
JavaScript
49 lines
924 B
JavaScript
module.exports = function (stream, done) {
|
|
if (!stream) {
|
|
// no arguments, meaning stream = this
|
|
stream = this
|
|
} else if (typeof stream === 'function') {
|
|
// stream = this, callback passed
|
|
done = stream
|
|
stream = this
|
|
}
|
|
|
|
// if stream is already ended,
|
|
// return an array
|
|
if (!stream.readable) {
|
|
process.nextTick(function () {
|
|
done(null, [])
|
|
})
|
|
return defer
|
|
}
|
|
|
|
var arr = []
|
|
|
|
stream.on('data', onData)
|
|
stream.once('end', onEnd)
|
|
stream.once('error', onEnd)
|
|
stream.once('close', cleanup)
|
|
|
|
return defer
|
|
|
|
function defer(fn) {
|
|
done = fn
|
|
}
|
|
|
|
function onData(doc) {
|
|
arr.push(doc)
|
|
}
|
|
|
|
function onEnd(err) {
|
|
done(err, arr)
|
|
cleanup()
|
|
}
|
|
|
|
function cleanup() {
|
|
arr = null
|
|
stream.removeListener('data', onData)
|
|
stream.removeListener('end', onEnd)
|
|
stream.removeListener('error', onEnd)
|
|
stream.removeListener('close', cleanup)
|
|
}
|
|
} |