2022-07-09 16:03:26 -04:00

112 lines
2.5 KiB
JavaScript

'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);
};