UNPKG

dt-stream

Version:

Δt stream adapter - async & dynamic templating engine

57 lines (47 loc) 1.33 kB
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() };