123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- 'use strict';
- var Writable = require('readable-stream').Writable;
- var inherits = require('util').inherits;
- var Promise = require('pinkie-promise');
- function BufferStream() {
- Writable.call(this, { objectMode: true });
- this.buffer = [];
- this.length = 0;
- }
- inherits(BufferStream, Writable);
- BufferStream.prototype._write = function(chunk, enc, next) {
- if (!Buffer.isBuffer(chunk)) {
- chunk = new Buffer(chunk);
- }
- this.buffer.push(chunk);
- this.length += chunk.length;
- next();
- };
- module.exports = function read(stream, options, cb) {
- if (!stream) {
- throw new Error('stream argument is required');
- }
- if (typeof options === 'function') {
- cb = options;
- options = {};
- }
- if (typeof options === 'string' || options === undefined || options === null) {
- options = { encoding: options };
- }
- if (options.encoding === undefined) { options.encoding = 'utf8'; }
- var promise;
- if (!cb) {
- var resolve, reject;
- promise = new Promise(function(_res, _rej) {
- resolve = _res;
- reject = _rej;
- });
- cb = function (err, data) {
- if (err) { return reject(err); }
- resolve(data);
- };
- }
- var sink = new BufferStream();
- sink.on('finish', function () {
- var data = Buffer.concat(this.buffer, this.length);
- if (options.encoding) {
- data = data.toString(options.encoding);
- }
- cb(null, data);
- });
- stream.once('error', cb);
- stream.pipe(sink);
- return promise;
- }
|