fcc-core
Version:
Fusion communication center.
150 lines (146 loc) • 5.25 kB
JavaScript
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