dt-stream
Version:
Δt stream adapter - async & dynamic templating engine
57 lines (47 loc) • 1.33 kB
JavaScript
var EventEmitter = require('events').EventEmitter;
var util = require('util');
module.exports = OrderedEmitter;
function OrderedEmitter (opts) {
EventEmitter.call(this);
if (!opts) opts = {};
this._eventQueue = {};
this._next = {};
this.options = opts;
}
OrderedEmitter.prototype = new EventEmitter;
OrderedEmitter.prototype.reset = function (evName) {
if (evName === undefined) {
this._next = {};
}
else {
this._next[evName] = 0;
}
};
OrderedEmitter.prototype.emit = function (evName, obj) {
var emit = function (args) {
EventEmitter.prototype.emit.apply(this, args);
}.bind(this, arguments);
var queue = this._eventQueue;
var next = this._next;
var name = this.options.span ? '*' : evName;
var q = queue[name];
var n = next[name];
if (typeof obj === 'object' && obj !== null
&& typeof obj.order === 'number') {
if (!n) next[name] = n = 0;
if (obj.order === n) {
n = ++next[name];
emit();
while (q && q[n]) {
q[n]();
delete q[n];
n = ++next[name];
}
}
else {
if (!q) queue[name] = q = {};
q[obj.order] = emit;
}
}
else emit()
};