'use strict'; var Readable = require('readable-stream').Readable; var inherits = require('inherits'); inherits(Noms, Readable); function Noms (options) { Readable.call(this,options); this.inProgress = false; this.lastPush = void 0; this.started = false; this.errored = false; } Noms.prototype.push = function(chunk, encoding) { this.lastPush = Readable.prototype.push.call(this, chunk, encoding); return this.lastPush; }; Noms.prototype.nom = function (callback) { callback(null, null); }; Noms.prototype._read = function (size) { if (this.inProgress || this.errored) { return; } if (this.started === false) { this.inProgress = true; this.callStart(size); return; } this.inProgress = true; this.callRead(size); }; Noms.prototype._before = function (next) { next(); }; Noms.prototype.callRead = function (size) { var useSize = this.nom.length > 1; // so if nothing is pushed, we'll go agian this.lastPush = true; var self = this; function cb(err, chunk) { if (err) { self.errored = true; self.inProgress = false; self.emit('error', err); return; } if (chunk !== undefined) { self.push(chunk); } if (self.lastPush) { return self.callRead(size); } else { self.inProgress = false; } } if (useSize) { this.nom(size, cb); } else { this.nom(cb); } }; Noms.prototype.callStart = function (size) { var self = this; function cb(err, chunk) { self.started = true; if (err) { self.errored = true; self.inProgress = false; self.emit('error', err); return; } if (chunk !== undefined) { self.push(chunk); } self.callRead(size); } this._before(cb); }; function ctor(read, before) { inherits(YourStream, Noms); function YourStream (opts) { Noms.call(this, opts); } YourStream.prototype.nom = read; if (typeof before === 'function') { YourStream.prototype._before = before; } return YourStream; } module.exports = exports = function(options, read, before) { if (typeof options === 'function') { before = read; read = options; options = {}; } return new (ctor(read, before))(options); }; exports.ctor = ctor; exports.obj = function(options, read, before) { var out = {}; if (typeof options === 'function') { before = read; read = options; options = undefined; } options = options || {}; Object.keys(options).forEach(function (key) { out[key] = options[key]; }); out.objectMode = true; return new (ctor(read, before))(out); };