UNPKG

kevoree-group-centralizedws

Version:

WebSocket group based on a centralized architecture that only sends partial model to connected clients

64 lines (55 loc) 2.57 kB
const kevoree = require('kevoree-library'); const RegisteredMessage = require('../protocol/RegisteredMessage'); const shortid = require('../util/shortid'); const reducer = require('../util/reducer'); const HeartBeatManager = require('../util/heartbeat-manager'); const findMasterNode = require('../util/find-master-node'); /* * Called when a client asked for registration */ module.exports = function register(logger, client2name, client, pMsg, instance) { if (client2name[client.id]) { logger.warn('node "' + client2name[client.id] + '" is already registered (id=' + client.id + ')'); } else { client.id = shortid(10); client2name[client.id] = pMsg.getNodeName(); logger.info('node "' + pMsg.getNodeName() + '" registered (id=' + client.id + ')'); const factory = new kevoree.factory.DefaultKevoreeFactory(); const loader = factory.createJSONLoader(); const cloner = factory.createModelCloner(); let model = null; try { model = loader.loadModelFromString(pMsg.getModel()).get(0); } catch (e) { logger.warn('erroneous model received from "' + pMsg.getNodeName() + '" registration'); logger.warn(e.stack); } if (model) { const group = instance.getModelEntity(); const masterNode = findMasterNode(group); if (masterNode) { const masterName = masterNode.name; logger.debug('reducing register model for master "' + masterName + '" and client "' + pMsg.getNodeName() + '"...'); const registerModel = reducer(model, masterName, pMsg.getNodeName()); const compare = factory.createModelCompare(); const kCore = instance.getKevoreeCore(); const currentModel = cloner.clone(kCore.getCurrentModel()); compare.merge(registerModel, currentModel).applyOn(registerModel); // fs.writeFileSync('/tmp/master-register-'+pMsg.getNodeName()+'.json', JSON.stringify(JSON.parse(factory.createJSONSerializer().serialize(registerModel)), null, 2), 'utf8'); instance.isRegister = true; logger.debug('isRegister lock = true'); const freeLock = () => { logger.debug('isRegister lock = false'); instance.isRegister = false; }; kCore.deploy(registerModel).then(freeLock, freeLock); } else { throw new Error('Unable to find a master node'); } } // send registered ack back to client client.send(new RegisteredMessage().toRaw()); const hbManager = new HeartBeatManager(client, process.env.KEV_CWSG_HB || 15000); hbManager.start(); } };