node/deps/npm/node_modules/stream-iterate/index.js
Rebecca Turner 468ab4519e deps: upgrade npm to 6.1.0
PR-URL: https://github.com/nodejs/node/pull/20190
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Tiancheng "Timothy" Gu <timothygu99@gmail.com>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: Michaël Zasso <targos@protonmail.com>
2018-05-24 23:24:45 -07:00

71 lines
1.3 KiB
JavaScript

var Readable = require('readable-stream').Readable
var shift = require('stream-shift')
var stream2 = function (stream) {
if (stream._readableState) return stream
return new Readable({objectMode: true, highWaterMark: 16}).wrap(stream)
}
module.exports = function (stream) {
stream = stream2(stream)
var ended = false
var data = null
var err = null
var destroyed = false
var fn = null
var consume = function (e) {
if (e) {
destroyed = true
if (stream.destroy) stream.destroy(e)
return
}
data = null
err = null
}
var onresult = function () {
if (!fn) return
var tmp = fn
fn = undefined
tmp(err, data, consume)
}
var update = function () {
if (!fn) return
data = shift(stream)
if (data === null && !ended) return
onresult()
}
var onend = function () {
ended = true
onresult()
}
stream.on('readable', update)
stream.on('error', function (e) {
err = e
onresult()
})
stream.on('close', function () {
if (stream._readableState.ended) return
onend()
})
stream.on('end', onend)
return function (callback) {
if (destroyed) return
if (err) return callback(err, null, consume)
if (data) return callback(null, data, consume)
if (ended) return callback(null, null, consume)
fn = callback
update()
}
}