h5
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

127 lines
3.7 KiB

3 years ago
import Config from "@/common/js/config.js"
let prevSendTimeMs = 0; // 上一条消息发送时间
let socketMsgQueue = []; // socket消息队列
3 years ago
let sendHeartTimer = null;
let heartbeatConst = 15000; // 心跳常量
const actions = {
// 初始化socket
3 years ago
initSocket({ commit, dispatch, state }) {
if (state.lockSocket) return;
3 years ago
// const { token } = rootState.user;
// if (!token) return;
commit('setLockSocket', true);
3 years ago
commit('setSocket', uni.connectSocket({ url: Config.msgUrl, complete: () => {} }));
// dispatch('auth');
dispatch('onSocketOpen');
dispatch('onSocketMessage');
dispatch('onSocketClose');
state.socket.onError(errMsg => console.error(errMsg));
commit('setLockSocket', false);
3 years ago
},
// websocket发送channelId进行认证
auth({ dispatch }) {
const token = uni.$storage.getStorageSync('anyringToken');
const data = { type: 'Auth', data: { token } };
dispatch('sendSocketMessage', data);
},
// 监听ws打开
3 years ago
onSocketOpen({ dispatch, commit, state }) {
state.socket.onOpen(res => {
commit('setConnected', true);
3 years ago
prevSendTimeMs = Date.now();
dispatch('auth'); // 认证
// for (let i = 0; i < socketMsgQueue.length; i++) {
// dispatch('sendSocketMessage', socketMsgQueue[i]);
// }
// socketMsgQueue = [];
});
},
// 监听收到的ws消息
3 years ago
onSocketMessage({ dispatch, state }) {
state.socket.onMessage(res => {
if (!res || !res.data || !JSON.parse(res.data)) return;
const resData = JSON.parse(res.data);
3 years ago
const { messageSet, ackId } = resData;
// 处理消息体对象
messageSet.forEach(item => dispatch('handleMessagesData', item));
3 years ago
ackId && dispatch('sendSocketMessage', { type: 'Ack', data: { ackId } });
});
},
/**
* 处理收到的消息内容
* @param {object} item 单个消息体对象
*/
3 years ago
handleMessagesData({ dispatch, commit }, item) {
const data = JSON.parse(item.data);
switch (data.type) {
case 'Sync': // 开始某个节点
3 years ago
commit('messages/messagesAdd', { message: data, type: 'syncMessages' }, { root: true });
break;
case 'taskStatus': // 任务状态修改相关消息
3 years ago
commit('task/setTaskStatus', data.data, { root: true });
break;
// case 'Deliver': // 交付物相关消息
// commit('messages/messagesAdd', { type: 'checkMessages', message: data }, { root: true });
// break;
case 'ChannelStatus':
dispatch('handleAuthMessage', data);
break;
default:
break;
}
},
// 发送消息
3 years ago
sendSocketMessage({ state }, data) {
if (state.connected) {
prevSendTimeMs = Date.now();
const msg = JSON.stringify({ toDomain: 'Server', data: JSON.stringify(data) });
state.socket.send({ data: msg });
} else {
socketMsgQueue.push(data);
}
},
// 监听关闭事件
3 years ago
onSocketClose({ dispatch, commit, state }) {
state.socket.onClose(() => {
commit('setConnected', false);
if (sendHeartTimer) clearInterval(sendHeartTimer);
setTimeout(() => {
dispatch('initSocket');
}, 300);
});
},
/**
* 处理auth认证返回的ChannelStatus消息
* @param {object} data 消息内容对象
*/
3 years ago
handleAuthMessage({ commit, dispatch }, data) {
if (data.data.authed) {
dispatch('sendHeart');
} else {
3 years ago
uni.$u.toast(data.data.error.text);
uni.$storage.removeStorageSync('anyringToken');
commit('setSocket', null);
}
3 years ago
},
// 心跳检测
sendHeart({ dispatch, state }) {
if (sendHeartTimer) clearInterval(sendHeartTimer);
sendHeartTimer = setInterval(() => {
if (Date.now() - prevSendTimeMs >= heartbeatConst) {
dispatch('sendSocketMessage', { type: 'Ping' });
}
}, 5000);
},
};
export default actions;