UNPKG

fcc-core

Version:

Fusion communication center.

150 lines (146 loc) 5.25 kB
import ajaxRequest from '../ajaxRequest' import BaseException from '../../errors/base-exception' import './nats.min' const protocol = window.location.protocol === 'http:' ? 'ws' : 'wss' let servers = [] // nats 集群服务器集合 let nc // nats 连接 let subIds = {} // 已经订阅的事件集合 // 断开连接 function disconnectNats () { if (nc) { unsubscribe() nc.close() nc = null console.log('disconnect nats') } } // 取消所有监听 function unsubscribe () { if (nc) { let events = Object.keys(subIds) if (events.length > 0) { events.forEach(event => { subIds[event].forEach(item => { nc.unsubscribe(item) }) }) subIds = {} } } } // 建立连接 function connectNats () { disconnectNats() // Randomly connect to a server in the cluster group. 随机连接到群集组中的服务器。 try { nc = window.NATS.connect({ servers }) } catch (e) { throw new BaseException(522, 'nats状态服务器连接失败,请联系管理员') } } let io = { // 创建并打开连接 open (xw) { return ajaxRequest([{ // 查询 nats 集群服务器 service: 'U1013403', NATS_TYPE: '1' }], xw).then(result => { if (result.code === '0') { if (result.data.length === 0) { return Promise.reject(new BaseException(522, 'nats集群信息未配置,人员同步失败')) } else { servers = result.data.map(item => `${protocol}://${item.NATS_USER}:${item.NATS_PWD}@${item.NATS_URL}:${item.NATS_PORT}`) connectNats() return Promise.resolve() } } }) }, /******************************************************************* * @name emit 用来给 nats 发送事件消息 * @author 李涛 * @param subject string 必传参数,要广播的事件类型 * @param param Object 必传参数,携带的事件参数 * @return io Object 返回封装好的nats对象,用于链式操作 ******************************************************************/ emit (subject, params) { !nc && connectNats() try { nc.request(subject, JSON.stringify(params), { 'max': 1 }, function (response) { console.log(subject + ':\n' + JSON.stringify(JSON.parse(response), null, 2)) }) } catch (e) { nc.request(subject, params, { 'max': 1 }, function (response) { console.log(subject + ':\n' + JSON.stringify(JSON.parse(response), null, 2)) }) } return io }, /******************************************************************* * @name on 用来监听 nats 给前端发送的事件消息,监听成功后会把监听sid赋值给io.lastSid * @author 李涛 * @param subscribe String 必传参数,想要监听的事件名 * @param callback Function 必传参数,接受到事件后的回调函数,回调函数的参数为事件参数 * @param callbackThis Object 规定回调函数的 this 指向 * @return io Object 返回封装好的nats对象,用于链式操作 ******************************************************************/ on (subscribe, callback, callbackThis) { !nc && connectNats() let sid = nc.subscribe(subscribe, (response) => { try { let res = JSON.parse(response) if (callbackThis) { callback && callback.call(callbackThis, res) } else { callback && callback(res) } } catch (e) { console.error(e, subscribe) } }) if (!subIds[subscribe]) { subIds[subscribe] = [sid] } else { subIds[subscribe].push(sid) } io.lastSid = sid return io }, /******************************************************************* * @name off 取消监听一个事件,可以取消一次监听也可以取消所有该事件的监听 * @author 李涛 * @param event String 必传参数,想要取消监听的事件 * @param sid String 可选参数,想要某事件(由 @param event 决定)的某次监听 * @return io Object 返回封装好的nats对象,用于链式操作 ******************************************************************/ off (event, sid) { !nc && connectNats() if (subIds[event]) { if (sid) { nc.unsubscribe(sid) } else { subIds[event].forEach(item => { nc.unsubscribe(item) }) console.error(`警告:已取消 ${event} 的所有订阅,如需取消某次订阅请同时传入 event 和 sid。`) } } delete subIds[event] return io }, /******************************************************************* * @name clear 取消监听所有事件 * @author 李涛 * @return io Object 返回封装好的nats对象,用于链式操作 ******************************************************************/ clear () { unsubscribe() console.error(`警告:已取消所有事件的所有订阅,如需取消单个事件的订阅请使用 off 方法!`) return io }, // 主动关闭连接 close () { disconnectNats() } } export default io