emithor
Version:
Simple Event Machine for JS
206 lines (161 loc) • 6.34 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.getChannels = exports.unsubscribe = exports.publish = exports.fire = exports.subscribe = exports.register = exports.getEvents = exports.trigger = exports.remove = exports.on = void 0;
require("core-js/modules/es6.string.iterator");
require("core-js/modules/es6.array.from");
require("core-js/modules/es6.regexp.to-string");
require("core-js/modules/es6.function.name");
require("core-js/modules/web.dom.iterable");
require("core-js/modules/es6.array.find");
require("core-js/modules/es7.symbol.async-iterator");
require("core-js/modules/es6.symbol");
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
// Private-like symbols for members
var addEvent = Symbol();
var deleteEvent = Symbol();
var getEvent = Symbol();
var addCallback = Symbol();
var deleteCallback = Symbol();
var events = Symbol();
/**
* Class representation of pub-sub
*
* @class
*/
var Emithor = function Emithor() {
var _this = this;
_classCallCheck(this, Emithor);
_defineProperty(this, "on", function (eventName, callback) {
var ctx = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
var once = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
if (typeof eventName !== 'string' || eventName === '' || typeof callback !== 'function') return;
var newCallback = {
fn: callback,
once: once,
ctx: ctx // Add new event if that event don't exist already
};
var event = _this[getEvent](eventName) || null;
if (!event) {
_this[addEvent](eventName, newCallback, ctx, once);
return;
} // Register callback to event if that callback
// is not yet registered on that event
var isCallbackRegistered = !!(event && event.cbs.find(function (cb) {
return cb.fn === callback;
}));
if (!isCallbackRegistered) {
_this[addCallback](eventName, newCallback);
}
});
_defineProperty(this, "trigger", function (eventName, contextOverride) {
for (var _len = arguments.length, payload = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
payload[_key - 2] = arguments[_key];
}
var event = _this[getEvent](eventName);
if (!event) return;
event.cbs.forEach(function (cb) {
try {
var _cb$fn;
(_cb$fn = cb.fn).call.apply(_cb$fn, [contextOverride || cb.ctx].concat(payload));
} catch (error) {
throw new Error(error);
}
if (cb.once) {
_this[deleteCallback](eventName, cb.fn);
}
});
});
_defineProperty(this, "remove", function (eventName) {
var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
var event = _this[getEvent](eventName) || null;
if (!event) return;
if (callback) {
_this[deleteCallback](eventName, callback);
} else {
_this[deleteEvent](eventName);
}
});
_defineProperty(this, "getEvents", function () {
return _toConsumableArray(_this[events]);
});
_defineProperty(this, addEvent, function (eventName, newCallback) {
var newEvent = {
name: eventName,
cbs: [newCallback]
};
_this[events] = [].concat(_toConsumableArray(_this[events]), [newEvent]);
});
_defineProperty(this, deleteEvent, function (eventName) {
_this[events] = _toConsumableArray(_this[events]).filter(function (event) {
return event.name !== eventName;
});
});
_defineProperty(this, addCallback, function (eventName, callback) {
_this[events] = _toConsumableArray(_this[events]).map(function (e) {
if (e.name === eventName) {
e.cbs = [].concat(_toConsumableArray(e.cbs), [callback]);
}
return e;
});
});
_defineProperty(this, deleteCallback, function (eventName, callback) {
_this[events] = _toConsumableArray(_this[events]).map(function (event) {
if (event.name === eventName) {
event.cbs = _toConsumableArray(event.cbs).filter(function (cb) {
return cb.fn !== callback;
});
}
return event;
});
if (!_this[getEvent](eventName).cbs.length) {
_this[deleteEvent](eventName);
}
});
_defineProperty(this, getEvent, function (eventName) {
return _this[events].find(function (event) {
return event.name === eventName;
});
});
this[events] = [];
}
/**
* Registers callback to specifeid event.
*
* @function
* @public
* @param {string} eventName - Can't be empty string
* @param {function} callback
* @param {object} ctx - Context which is to be provided to callback
* @param {boolean} once - Controls if callback is going to be invoked only once
*/
; // Private Emithor instace used to expose api
var emithor = new Emithor();
var on = emithor.on,
remove = emithor.remove,
trigger = emithor.trigger,
getEvents = emithor.getEvents,
register = emithor.on,
subscribe = emithor.on,
fire = emithor.trigger,
publish = emithor.trigger,
unsubscribe = emithor.remove,
getChannels = emithor.getEvents; // Exposing constructor
exports.getChannels = getChannels;
exports.unsubscribe = unsubscribe;
exports.publish = publish;
exports.fire = fire;
exports.subscribe = subscribe;
exports.register = register;
exports.getEvents = getEvents;
exports.trigger = trigger;
exports.remove = remove;
exports.on = on;
var _default = Emithor;
exports.default = _default;