UNPKG

@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

116 lines (95 loc) 3.4 kB
module.exports = function (kbnServer, server, config) { if (!config.get('optimize.enabled')) return; var _ = require('lodash'); var { resolve } = require('path'); var fromRoot = require('../utils/fromRoot'); var CachedOptimizer = require('./CachedOptimizer'); var WatchingOptimizer = require('./WatchingOptimizer'); var bundleDir = resolve(config.get('optimize.bundleDir')); var status = kbnServer.status.create('optimize'); server.exposeStaticDir('/bundles/{path*}', bundleDir); function logStats(tag, stats) { if (config.get('logging.json')) { server.log(['optimize', tag], _.pick(stats.toJson(), 'errors', 'warnings')); } else { server.log(['optimize', tag], `\n${ stats.toString({ colors: true }) }`); } } function describeEntries(entries) { let ids = _.pluck(entries, 'id').join('", "'); return `application${ entries.length === 1 ? '' : 's'} "${ids}"`; } function onMessage(handle, filter) { filter = filter || _.constant(true); process.on('message', function (msg) { var optimizeMsg = msg && msg.optimizeMsg; if (!optimizeMsg || !filter(optimizeMsg)) return; handle(optimizeMsg); }); } var role = config.get('optimize._workerRole'); if (role === 'receive') { // query for initial status process.send(['WORKER_BROADCAST', { optimizeMsg: '?' }]); onMessage(function (wrkrStatus) { status[wrkrStatus.state](wrkrStatus.message); }); } if (role === 'send') { let send = function () { process.send(['WORKER_BROADCAST', { optimizeMsg: status }]); }; status.on('change', send); onMessage(send, _.partial(_.eq, '?')); send(); } let watching = config.get('optimize.watch'); let Optimizer = watching ? WatchingOptimizer : CachedOptimizer; let optmzr = kbnServer.optimizer = new Optimizer({ sourceMaps: config.get('optimize.sourceMaps'), bundleDir: bundleDir, entries: _.map(kbnServer.uiExports.allApps(), function (app) { return { id: app.id, deps: app.getRelatedPlugins(), modules: app.getModules() }; }), plugins: kbnServer.plugins }); server.on('close', _.bindKey(optmzr.disable || _.noop, optmzr)); kbnServer.mixin(require('./browserTests')) .then(function () { if (role === 'receive') return; optmzr.on('bundle invalid', function () { status.yellow('Source file change detected, reoptimizing source files'); }); optmzr.on('done', function (entries, stats) { logStats('debug', stats); status.green(`Optimization of ${describeEntries(entries)} complete`); }); optmzr.on('error', function (entries, stats, err) { if (stats) logStats('fatal', stats); status.red('Optimization failure! ' + err.message); }); return optmzr.init() .then(function () { let entries = optmzr.bundles.getMissingEntries(); if (!entries.length) { if (watching) { status.red('No optimizable applications found'); } else { status.green('Reusing previously cached application source files'); } return; } if (watching) { status.yellow(`Optimizing and watching all application source files`); } else { status.yellow(`Optimizing and caching ${describeEntries(entries)}`); } optmzr.run(); return null; }); }); };