@spalger/kibana
Version:
Kibana is an open source (Apache Licensed), browser based analytics and search dashboard for Elasticsearch. Kibana is a snap to setup and start using. Kibana strives to be easy to get started with, while also being flexible and powerful, just like Elastic
106 lines (89 loc) • 2.93 kB
JavaScript
define(function (require) {
var _ = require('lodash');
return function EventsProvider(Private, Promise, Notifier) {
var SimpleEmitter = require('ui/utils/SimpleEmitter');
var notify = new Notifier({ location: 'EventEmitter' });
_.class(Events).inherits(SimpleEmitter);
function Events() {
Events.Super.call(this);
this._listeners = {};
this._emitChain = Promise.resolve();
}
/**
* Listens for events
* @param {string} name - The name of the event
* @param {function} handler - The function to call when the event is triggered
* @returns {undefined}
*/
Events.prototype.on = function (name, handler) {
if (!_.isArray(this._listeners[name])) {
this._listeners[name] = [];
}
var listener = {
handler: handler
};
this._listeners[name].push(listener);
(function rebuildDefer() {
listener.defer = Promise.defer();
listener.resolved = listener.defer.promise.then(function (args) {
rebuildDefer();
// we ignore the completion of handlers, just watch for unhandled errors
Promise.resolve(handler.apply(handler, args)).catch(notify.fatal);
});
}());
return this;
};
/**
* Removes an event listener
* @param {string} [name] - The name of the event
* @param {function} [handler] - The handler to remove
* @return {undefined}
*/
Events.prototype.off = function (name, handler) {
if (!name && !handler) {
return this._listeners = {};
}
// exit early if there is not an event that matches
if (!this._listeners[name]) return;
// If no hander remove all the events
if (!handler) {
delete this._listeners[name];
} else {
this._listeners[name] = _.filter(this._listeners[name], function (listener) {
return handler !== listener.handler;
});
}
return this;
};
/**
* Emits the event to all listeners
*
* @param {string} name - The name of the event.
* @param {any} [value] - The value that will be passed to all event handlers.
* @returns {Promise}
*/
Events.prototype.emit = function (name) {
var self = this;
var args = _.rest(arguments);
if (!self._listeners[name]) {
return self._emitChain;
}
return Promise.map(self._listeners[name], function (listener) {
return self._emitChain = self._emitChain.then(function () {
listener.defer.resolve(args);
return listener.resolved;
});
});
};
/**
* Get a list of the handler functions for a specific event
*
* @param {string} name
* @return {array[function]}
*/
Events.prototype.listeners = function (name) {
return _.pluck(this._listeners[name], 'handler');
};
return Events;
};
});