69 lines
2.0 KiB
JavaScript
69 lines
2.0 KiB
JavaScript
/**
|
|
* BetterDiscord Async EventEmitter
|
|
* Copyright (c) 2015-present Jiiks/JsSucks - https://github.com/Jiiks / https://github.com/JsSucks
|
|
* All rights reserved.
|
|
* https://betterdiscord.net
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
import EventEmitter from 'events';
|
|
|
|
/**
|
|
* Extends Node.js' EventEmitter to call event listeners asyncronously.
|
|
*/
|
|
export default class AsyncEventEmitter extends EventEmitter {
|
|
|
|
/**
|
|
* Emits an event.
|
|
* @param {String} event The event to emit
|
|
* @param {Any} ...data Data to be passed to event listeners
|
|
* @return {Promise}
|
|
*/
|
|
async emit(event, ...data) {
|
|
let listeners = this._events[event] || [];
|
|
listeners = Array.isArray(listeners) ? listeners : [listeners];
|
|
|
|
// Special treatment of internal newListener and removeListener events
|
|
if(event === 'newListener' || event === 'removeListener') {
|
|
data = [{
|
|
event: data,
|
|
fn: err => {
|
|
if (err) throw err;
|
|
}
|
|
}];
|
|
}
|
|
|
|
for (const listener of listeners) {
|
|
await listener.apply(this, data);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Adds an event listener that will be removed when it is called and therefore only be called once.
|
|
* If a callback is not specified a promise that is resolved once the event is emitted is returned.
|
|
*/
|
|
once(event, callback) {
|
|
if (callback) {
|
|
// If a callback was specified add this event as normal
|
|
return EventEmitter.prototype.once.apply(this, arguments);
|
|
}
|
|
|
|
// Otherwise return a promise that is resolved once this event is emitted
|
|
return new Promise((resolve, reject) => {
|
|
EventEmitter.prototype.once.call(this, event, data => {
|
|
return resolve(data);
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Unbinds an event listener.
|
|
*/
|
|
off(event, callback) {
|
|
this.removeListener(event, callback);
|
|
}
|
|
|
|
}
|