UNPKG

corporate-frontend-mithril

Version:

Corporate frontend MithrilJS modules

132 lines (109 loc) 3.56 kB
const io = require('socket.io-client'); const _ = require('lodash'); const config = require('../../../applications/aem-board/config'); const AbstractDataService = require('../../../lib/abstract-data-service'); const AemBoardHelper = require('../aem-board-helper'); const socket = io(config.apiRootPath); /** * Centralised data, which is shared by all other components */ let _data = { //Component states object ams: {}, updatedBundles: [], currentServerKey: '', currentInstanceKey: '', state :{ isWatchingProdBundles : false, }, watchingProdBundlesRemaining: 0, }; let service = AbstractDataService({data: _data}); /*---------------------- helpers -------------------------*/ let _syncUpdatedBundles = function(updatedBundles) { _.each(_data.ams, (server, name)=> { let matchedBundles = _.filter(updatedBundles, (bundle)=> { return bundle.server === name; }); if(!Object.is(matchedBundles, undefined)) { _.each(matchedBundles, (candidate)=> { let targetPair = _.find(server.bundleGroups, (item)=> { return item[0] === candidate.name; }); let targetBundle = _.find(targetPair[1], (bundle)=> { return bundle.instance === candidate.instance; }); Object.assign(targetBundle, candidate); }); } }); }; Object.assign(service, { handleUpdatedBundles(bundles) { _data.updatedBundles.length = 0; Object.assign(_data.updatedBundles, bundles); _syncUpdatedBundles(bundles); service.broadcastDataChanges('updatedBundles'); m.redraw(); }, fetchAllBundles() { return new Promise((resolve, reject)=> { Promise.all(config.ams.map((env)=> { return service.fetchBundles(env.server, env.instance); })).then((results)=> { let data = AemBoardHelper.groupByServers(results); data = AemBoardHelper.groupByBundles(data); Object.assign(_data.ams, data); resolve(data); }).catch(reject); }); }, /** * Get global configuration from the remote server */ fetchBundles(server, instance) { return new Promise((resolve, reject)=> { m.request({ method: 'GET', url: `${config.apiRootPath}/aem-bundles?server=${server}&instance=${instance}`, }).then((result)=> { let data = { server: server, instance: instance, data: result, }; resolve(data); }).catch((err)=> { console.warn('fetchBundles error', err); reject(err); }); }); }, listResults() { return _data.ams; }, set currentServerKey(value) { _data.currentServerKey = value; }, set currentInstanceKey(value) { _data.currentInstanceKey = value; }, get currentServerKey() { return _data.currentServerKey; }, get currentInstanceKey() { return _data.currentInstanceKey; }, get state() { return _data.state; }, }); /** * register socket events */ socket.on('connect', function(){ console.log('socket connected'); }); socket.emit('join', 'aem-board client'); socket.on('updated_bundles', service.handleUpdatedBundles); module.exports = service;