112 lines
2.5 KiB
JavaScript
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);
|
|
}; |