|
|
|
var indexOf; |
|
|
|
if (typeof Array.prototype.indexOf === 'function') { |
|
indexOf = function (haystack, needle) { |
|
return haystack.indexOf(needle); |
|
}; |
|
} else { |
|
indexOf = function (haystack, needle) { |
|
var i = 0, length = haystack.length, idx = -1, found = false; |
|
|
|
while (i < length && !found) { |
|
if (haystack[i] === needle) { |
|
idx = i; |
|
found = true; |
|
} |
|
|
|
i++; |
|
} |
|
|
|
return idx; |
|
}; |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var EventEmitter = function (autoFireAfterEmit = []) { |
|
this.events = {}; |
|
this.autoFireLastArgs = new Map(); |
|
this.autoFireAfterEmit = new Set(autoFireAfterEmit); |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EventEmitter.prototype.on = function (event, listener) { |
|
|
|
if (event === undefined) { |
|
console.trace('EventEmitter: Cannot listen to undefined event'); |
|
return; |
|
} |
|
|
|
if (typeof this.events[event] !== 'object') { |
|
this.events[event] = []; |
|
} |
|
|
|
this.events[event].push(listener); |
|
|
|
if (this.autoFireAfterEmit.has(event) && this.autoFireLastArgs.has(event)) { |
|
listener.apply(this, this.autoFireLastArgs.get(event)); |
|
} |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
EventEmitter.prototype.makeLast = function (event, listener) { |
|
if (typeof this.events[event] !== 'object') { |
|
this.events[event] = []; |
|
} |
|
|
|
const events = this.events[event]; |
|
const idx = events.indexOf(listener); |
|
|
|
if (idx > -1) { |
|
events.splice(idx, 1); |
|
} |
|
|
|
events.push(listener); |
|
|
|
if (this.autoFireAfterEmit.has(event) && this.autoFireLastArgs.has(event)) { |
|
listener.apply(this, this.autoFireLastArgs.get(event)); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
EventEmitter.prototype.makeFirst = function (event, listener) { |
|
if (typeof this.events[event] !== 'object') { |
|
this.events[event] = []; |
|
} |
|
|
|
const events = this.events[event]; |
|
const idx = events.indexOf(listener); |
|
|
|
if (idx > -1) { |
|
events.splice(idx, 1); |
|
} |
|
|
|
events.unshift(listener); |
|
|
|
if (this.autoFireAfterEmit.has(event) && this.autoFireLastArgs.has(event)) { |
|
listener.apply(this, this.autoFireLastArgs.get(event)); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
EventEmitter.prototype.removeListener = function (event, listener) { |
|
var idx; |
|
|
|
if (typeof this.events[event] === 'object') { |
|
idx = indexOf(this.events[event], listener); |
|
|
|
if (idx > -1) { |
|
this.events[event].splice(idx, 1); |
|
} |
|
} |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
EventEmitter.prototype.emit = async function (event) { |
|
let args = [].slice.call(arguments, 1); |
|
if (localStorage.getItem('eventTracing') === 'true') { |
|
console.trace('Event emitted: ' + event, args); |
|
} else { |
|
console.debug('Event emitted: ' + event); |
|
} |
|
|
|
let i, listeners, length; |
|
|
|
if (typeof this.events[event] === 'object') { |
|
listeners = this.events[event].slice(); |
|
length = listeners.length; |
|
|
|
for (i = 0; i < length; i++) { |
|
try { |
|
await listeners[i].apply(this, args); |
|
} |
|
catch (err) { |
|
console.error(err); |
|
console.trace('Error in event listener'); |
|
} |
|
} |
|
} |
|
|
|
if (this.autoFireAfterEmit.has(event)) { |
|
this.autoFireLastArgs.set(event, args); |
|
} |
|
}; |
|
|
|
EventEmitter.prototype.emitAndWait = function (event) { |
|
let args = [].slice.call(arguments, 1); |
|
if (localStorage.getItem('eventTracing') === 'true') { |
|
console.trace('Event emitted: ' + event, args); |
|
} else { |
|
console.debug('Event emitted: ' + event); |
|
} |
|
|
|
let i, listeners, length; |
|
|
|
if (typeof this.events[event] === 'object') { |
|
listeners = this.events[event].slice(); |
|
length = listeners.length; |
|
|
|
for (i = 0; i < length; i++) { |
|
try { |
|
listeners[i].apply(this, args); |
|
} |
|
catch (err) { |
|
console.error(err); |
|
console.trace('Error in event listener'); |
|
} |
|
} |
|
} |
|
|
|
if (this.autoFireAfterEmit.has(event)) { |
|
this.autoFireLastArgs.set(event, args); |
|
} |
|
}; |
|
|
|
EventEmitter.prototype.once = function (event, listener) { |
|
this.on(event, function g() { |
|
this.removeListener(event, g); |
|
listener.apply(this, arguments); |
|
}); |
|
}; |
|
|
|
export { EventEmitter } |
|
|