@blockv/sdk
Version:
Allows web apps to display and interact with vatoms.
112 lines (87 loc) • 3.29 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
//
// EventEmitter class - This class provides simple event functionality for classes, with Promise support.
//
// Usage for once-off event listeners:
//
// myObj.when("closed").then(function(data) {
// alert("Closed! " + data);
// });
//
//
// Usage for permanent event listeners:
//
// myObj.on("closed", function(data) {
// alert("Closed! " + data);
// });
//
//
// Usage when triggering an event from a subclass:
//
// this.emit("closed", "customData");
//
class EventEmitter {
/** Adds an event listener. If callback is null, a Promise will be returned. Note that if using the Promise
* it will only be triggered on the first event emitted. */
when(eventName, callback = null) {
// Make sure event listener object exists
this._eventListeners = this._eventListeners || {}; // Make sure event listener array exists
this._eventListeners[eventName] = this._eventListeners[eventName] || []; // Check if using promise form
if (callback) {
// Just add the callback
this._eventListeners[eventName].push(callback);
} else {
// Return the promise
return new Promise((onSuccess, onFail) => {
// Promise callbacks can only be used once
onSuccess._removeAfterCall = true; // Add success handler to event listener array
this._eventListeners[eventName].push(onSuccess);
});
}
}
/** Synonyms */
on() {
return this.when.apply(this, arguments);
}
addEventListener() {
return this.when.apply(this, arguments);
}
/** Remove event listener */
removeEventListener(eventName, callback) {
// Make sure event listener object exists
this._eventListeners = this._eventListeners || {}; // Make sure event listener array exists
this._eventListeners[eventName] = this._eventListeners[eventName] || []; // Find and remove it
for (var i = 0; i < this._eventListeners[eventName].length; i++) if (this._eventListeners[eventName][i] == callback) this._eventListeners[eventName].splice(i--, 1);
}
off() {
return this.removeEventListener.apply(this, arguments);
}
/** Triggers an event. Each argument after the first one will be passed to event listeners */
emit(eventName, ...args) {
// Setup the once-off promise if one of it's events were triggered
//if (eventName == "success" || eventName == "failed")
// this._setupPromise();
// Get list of callbacks
var callbacks = this._eventListeners && this._eventListeners[eventName] || []; // Call events
for (var callback of callbacks) {
// Call it
callback.apply(this, args);
} // Remove callbacks that can only be called once
for (var i = 0; i < callbacks.length; i++) if (callbacks[i]._removeAfterCall) callbacks.splice(i--, 1);
}
/** Synonyms */
trigger() {
return this.emit.apply(this, arguments);
}
triggerEvent() {
return this.emit.apply(this, arguments);
}
} // Apply as a mixin to a class or object
exports.default = EventEmitter;
EventEmitter.mixin = function (otherClass) {
for (var prop in EventEmitter.prototype) if (EventEmitter.prototype.hasOwnProperty(prop)) otherClass[prop] = EventEmitter.prototype[prop];
};