'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; Eif ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { Eif (protoProps) defineProperties(Constructor.prototype, protoProps); Iif (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _async = require('async');
var _async2 = _interopRequireDefault(_async);
var _utils = require('../utils');
var _utils2 = _interopRequireDefault(_utils);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* Class to manage events.
*
* The developers can use this to manipulate data during the
* execution or to extend functionalities adding new behaviours
* to existing logic. The listeners must be stored in
* <moduleName>/listeners.
*/
var EventsManager = function () {
/**
* Create a new instance.
*
* @param api API reference object.
*/
/**
* API reference object.
*
* @type {null}
*/
function EventsManager(api) {
_classCallCheck(this, EventsManager);
this.api = null;
this.events = new Map();
this.api = api;
}
// -------------------------------------------------------------------------------------------------------- [Commands]
/**
* Fire an event.
*
* @param eventName Event to fire.
* @param params Params to pass to the listeners.
* @param callback Callback function.
*/
/**
* Map with all registered events and listeners.
*
* @type {Map}
*/
_createClass(EventsManager, [{
key: 'fire',
value: function fire(eventName, params) {
var callback = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];
var self = this;
// variable to store listener response data
var responseData = params;
// check if exists listeners for this event
if (self.events.has(eventName)) {
// execute the listeners async in series
_async2.default.each(self.events.get(eventName), function (listener, callback) {
return listener(self.api, responseData, callback);
}, function () {
// execute the callback function
if (typeof callback === 'function') {
return callback(responseData);
}
});
return;
}
// execute the callback function
if (typeof callback === 'function') {
return callback(responseData);
}
}
/**
* Register a new listener for an event.
*
* @param eventName Event
* @param eventFunction
*/
}, {
key: 'listener',
value: function listener(eventName, eventFunction) {
var self = this;
// if there is no listener for this event, create a new entry
// with an empty array
if (!self.events.has(eventName)) {
self.events.set(eventName, []);
}
// get the array with all registered listeners for this event
var listeners = self.events.get(eventName);
// register the new listener
listeners.push(eventFunction);
}
// --------------------------------------------------------------------------------------------------- [Other Methods]
/**
* Iterate over all active modules and
*
* @param next
*/
}, {
key: 'loadListeners',
value: function loadListeners(next) {
var self = this;
// iterate all active modules
self.api.modules.modulesPaths.forEach(function (modulePath) {
// build path for the module listeners folder
var listenersFolderPath = modulePath + '/listeners';
// check if the listeners
Eif (!_utils2.default.directoryExists(listenersFolderPath)) {
return;
}
// get all listeners files
_utils2.default.recursiveDirectoryGlob(listenersFolderPath, 'js').forEach(function (listenerPath) {
// require listener file
var listener = require(listenerPath);
// if is a collection iterate it
if (listener instanceof Array) {
listener.forEach(function (l) {
return self.listener(l.event, l.run);
});
} else {
self.listener(listener.event, listener.run);
}
});
});
// end listeners loading
next();
}
}]);
return EventsManager;
}();
/**
* Satellite to load the event manager.
*/
var _class = function () {
function _class() {
_classCallCheck(this, _class);
this.loadPriority = 20;
}
/**
* Satellite load priority.
*
* @type {number}
*/
_createClass(_class, [{
key: 'load',
/**
* Satellite loading function.
*
* @param api API reference object.
* @param next Callback function.
*/
value: function load(api, next) {
// make events api available in all platform
api.events = new EventsManager(api);
// load listeners
api.events.loadListeners(next);
}
}]);
return _class;
}();
exports.default = _class;
//# sourceMappingURL=events.js.map
|