diff options
Diffstat (limited to 'node_modules/stream-to-array/index.js')
-rw-r--r-- | node_modules/stream-to-array/index.js | 85 |
1 files changed, 48 insertions, 37 deletions
diff --git a/node_modules/stream-to-array/index.js b/node_modules/stream-to-array/index.js index 76fcd1fc6..2d6aaa0fb 100644 --- a/node_modules/stream-to-array/index.js +++ b/node_modules/stream-to-array/index.js @@ -1,3 +1,6 @@ + +var Promise = require('any-promise') + module.exports = function (stream, done) { if (!stream) { // no arguments, meaning stream = this @@ -8,42 +11,50 @@ module.exports = function (stream, done) { 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) + var deferred + if (!stream.readable) deferred = Promise.resolve([]) + else deferred = new Promise(function (resolve, reject) { + // stream is already ended + if (!stream.readable) return resolve([]) + + var arr = [] + + stream.on('data', onData) + stream.on('end', onEnd) + stream.on('error', onEnd) + stream.on('close', onClose) + + function onData(doc) { + arr.push(doc) + } + + function onEnd(err) { + if (err) reject(err) + else resolve(arr) + cleanup() + } + + function onClose() { + resolve(arr) + cleanup() + } + + function cleanup() { + arr = null + stream.removeListener('data', onData) + stream.removeListener('end', onEnd) + stream.removeListener('error', onEnd) + stream.removeListener('close', onClose) + } + }) + + if (typeof done === 'function') { + deferred.then(function (arr) { + process.nextTick(function() { + done(null, arr) + }) + }, done) } - 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) - } -}
\ No newline at end of file + return deferred +} |