@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
55 lines (45 loc) • 1.67 kB
JavaScript
define(function (require) {
var angular = require('angular');
var _ = require('lodash');
var WorkQueue = require('ui/routes/WorkQueue');
var errors = require('ui/errors');
function wrapRouteWithPrep(route) {
if (!route.resolve && route.redirectTo) return;
var userWork = new WorkQueue();
// the point at which we will consider the queue "full"
userWork.limit = _.keys(route.resolve).length;
var resolve = {
__prep__: function (Private, Promise, $route, $injector, Notifier) {
var setup = Private(require('ui/routes/setup'));
return setup.routeSetupWork()
.then(function () {
// wait for the queue to fill up, then do all the work
var defer = Promise.defer();
userWork.resolveWhenFull(defer);
return defer.promise.then(function () {
return Promise.all(userWork.doWork());
});
})
.catch(function (err) {
// discard any remaining user work
userWork.empty();
return setup.handleKnownError(err);
});
}
};
// send each user resolve to the userWork queue, which will prevent it from running before the
// prep is complete
_.forOwn(route.resolve || {}, function (expr, name) {
resolve[name] = function ($injector, Promise) {
var defer = Promise.defer();
userWork.push(defer);
return defer.promise.then(function () {
return $injector[angular.isString(expr) ? 'get' : 'invoke'](expr);
});
};
});
// we're copied everything over so now overwrite
route.resolve = resolve;
}
return wrapRouteWithPrep;
});