bigint-crypto-utils/node_modules/collect-all/lib/collect-all.js

91 lines
3.0 KiB
JavaScript

'use strict'
var Transform = require('stream').Transform
var util = require('util')
var connect = require('stream-connect')
var through = require('stream-via')
/**
* Returns a stream which fires a callback and becomes readable once all input is received.
*
* By default the callback is invoked with a Buffer instance containing all concatenated input. If you set the option `{ objectMode: true }` the callback is invoked with an array containing all objects received.
*
* @module collect-all
*/
module.exports = collectAll
function CollectTransform (options) {
options = options || {}
if (!(this instanceof CollectTransform)) return new CollectTransform(options)
Transform.call(this, options)
this.options = options
this.buf = options.objectMode || options.writableObjectMode ? [] : new Buffer(0)
/* node 0.10 polyfil */
if (!options.objectMode) {
if (options.readableObjectMode) this._readableState.objectMode = true
if (options.writableObjectMode) this._writableState.objectMode = true
}
}
util.inherits(CollectTransform, Transform)
CollectTransform.prototype._transform = function (chunk, enc, done) {
if (chunk) {
if (this.options.objectMode) {
this.buf.push(chunk)
} else {
this.buf = Buffer.concat([ this.buf, chunk ])
}
}
done()
}
CollectTransform.prototype._flush = function () {
this.push(this.buf)
this.push(null)
}
/**
* @param [callback] {function} - Called once with the collected input data (by default a `Buffer` instance, or array in `objectMode`.). The value returned by this callback function will be passed downstream.
* @param [options] {object} - [Stream options](https://nodejs.org/dist/latest-v5.x/docs/api/stream.html#stream_new_stream_readable_options) object, passed to the constructor for the stream returned by `collect-all`. If the callback function supplied returns a non-string/buffer value, set `options.objectMode` to `true`.
* @return {external:Duplex}
* @alias module:collect-all
* @example
* An example command-line client script - string input received at stdin is stamped with `received` then written to stdout.
* ```js
* var collectAll = require('collect-all')
* process.stdin
* .pipe(collectAll(function (input) {
* input = 'received: ' + input
* return input
* }))
* .pipe(process.stdout)
* ```
*
* An object-mode example:
* ```js
* var collectAll = require('collect-all')
*
* function onAllCollected (collected) {
* console.log('Objects collected: ' + collected.length)
* }
*
* var stream = collectAll(onAllCollected, { objectMode: true })
* stream.write({})
* stream.write({})
* stream.end({}) // outputs 'Objects collected: 3'
* ```
*/
function collectAll (callback, options) {
var collectTransform = new CollectTransform(options)
if (callback && typeof callback === 'function') {
return connect(collectTransform, through(callback, options))
} else {
return collectTransform
}
}
/**
* @external Duplex
* @see https://nodejs.org/api/stream.html#stream_class_stream_duplex
*/