|
|
|
@ -1,72 +1,54 @@ |
|
|
|
const WS_BASE_URL = 'wss://test.tall.wiki/websocket/message/v4.0/ws'; // 测试
|
|
|
|
// const WS_BASE_URL = 'wss://www.tall.wiki/websocket/message/v4.0/ws'; // 生产
|
|
|
|
|
|
|
|
let prevTime = 0; |
|
|
|
import Config from "@/common/js/config.js" |
|
|
|
let prevSendTimeMs = 0; // 上一条消息发送时间
|
|
|
|
let socketMsgQueue = []; // socket消息队列
|
|
|
|
let sendHeartTimer = null; |
|
|
|
let sendHeartTimer = null; |
|
|
|
let heartbeatConst = 15000; // 心跳常量
|
|
|
|
|
|
|
|
const actions = { |
|
|
|
// 初始化socket
|
|
|
|
initSocket({ commit, dispatch, state, rootState }) { |
|
|
|
initSocket({ commit, dispatch, state }) { |
|
|
|
if (state.lockSocket) return; |
|
|
|
const { |
|
|
|
token |
|
|
|
} = rootState.user; |
|
|
|
if (!token) return; |
|
|
|
// const { token } = rootState.user;
|
|
|
|
// if (!token) return;
|
|
|
|
commit('setLockSocket', true); |
|
|
|
commit('setSocket', uni.connectSocket({ |
|
|
|
url: WS_BASE_URL, |
|
|
|
complete: () => {} |
|
|
|
})); |
|
|
|
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); |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
// websocket发送channelId进行认证
|
|
|
|
auth({ dispatch }) { |
|
|
|
const token = uni.$storage.getStorageSync('anyringToken'); |
|
|
|
const data = { type: 'Auth', data: { token } }; |
|
|
|
dispatch('sendSocketMessage', data); |
|
|
|
}, |
|
|
|
|
|
|
|
// 监听ws打开
|
|
|
|
onSocketOpen({ |
|
|
|
dispatch, |
|
|
|
commit, |
|
|
|
state |
|
|
|
}) { |
|
|
|
// eslint-disable-next-line no-unused-vars
|
|
|
|
onSocketOpen({ dispatch, commit, state }) { |
|
|
|
state.socket.onOpen(res => { |
|
|
|
// console.log('ws open: ', res);
|
|
|
|
commit('setConnected', true); |
|
|
|
prevTime = Date.now(); |
|
|
|
// this.auth();
|
|
|
|
dispatch('auth'); |
|
|
|
for (let i = 0; i < socketMsgQueue.length; i++) { |
|
|
|
dispatch('sendSocketMessage', socketMsgQueue[i]); |
|
|
|
} |
|
|
|
socketMsgQueue = []; |
|
|
|
prevSendTimeMs = Date.now(); |
|
|
|
dispatch('auth'); // 认证
|
|
|
|
// for (let i = 0; i < socketMsgQueue.length; i++) {
|
|
|
|
// dispatch('sendSocketMessage', socketMsgQueue[i]);
|
|
|
|
// }
|
|
|
|
// socketMsgQueue = [];
|
|
|
|
}); |
|
|
|
}, |
|
|
|
|
|
|
|
// 监听收到的ws消息
|
|
|
|
onSocketMessage({ |
|
|
|
dispatch, |
|
|
|
state |
|
|
|
}) { |
|
|
|
onSocketMessage({ dispatch, state }) { |
|
|
|
state.socket.onMessage(res => { |
|
|
|
// console.log('收到消息:', res);
|
|
|
|
prevTime = Date.now(); |
|
|
|
if (!res || !res.data || !JSON.parse(res.data)) return; |
|
|
|
const resData = JSON.parse(res.data); |
|
|
|
const { |
|
|
|
messageSet, |
|
|
|
ackId |
|
|
|
} = resData; |
|
|
|
const { messageSet, ackId } = resData; |
|
|
|
// 处理消息体对象
|
|
|
|
messageSet.forEach(item => dispatch('handleMessagesData', item)); |
|
|
|
ackId && dispatch('sendSocketMessage', { |
|
|
|
type: 'Ack', |
|
|
|
data: { |
|
|
|
ackId |
|
|
|
} |
|
|
|
}); |
|
|
|
ackId && dispatch('sendSocketMessage', { type: 'Ack', data: { ackId } }); |
|
|
|
}); |
|
|
|
}, |
|
|
|
|
|
|
|
@ -74,77 +56,39 @@ const actions = { |
|
|
|
* 处理收到的消息内容 |
|
|
|
* @param {object} item 单个消息体对象 |
|
|
|
*/ |
|
|
|
handleMessagesData({ |
|
|
|
dispatch, |
|
|
|
commit |
|
|
|
}, item) { |
|
|
|
handleMessagesData({ dispatch, commit }, item) { |
|
|
|
const data = JSON.parse(item.data); |
|
|
|
switch (data.type) { |
|
|
|
case 'Sync': // 开始某个节点
|
|
|
|
commit('messages/messagesAdd', { |
|
|
|
message: data, |
|
|
|
type: 'syncMessages' |
|
|
|
}, { |
|
|
|
root: true |
|
|
|
}); |
|
|
|
commit('messages/messagesAdd', { message: data, type: 'syncMessages' }, { root: true }); |
|
|
|
break; |
|
|
|
case 'taskStatus': // 任务状态修改相关消息
|
|
|
|
commit('task/setTaskStatus', data.data, { |
|
|
|
root: true |
|
|
|
}); |
|
|
|
commit('task/setTaskStatus', data.data, { root: true }); |
|
|
|
break; |
|
|
|
// case 'Chrome': // !收到开始游戏的消息
|
|
|
|
// console.log('handleMessagesData', data);
|
|
|
|
// // @ts-ignore
|
|
|
|
// util.openGameApp({
|
|
|
|
// type: data.data.type,
|
|
|
|
// projectId: data.data.projectId,
|
|
|
|
// id: data.data.recordId,
|
|
|
|
// token: rootState.user.token,
|
|
|
|
// });
|
|
|
|
// break;
|
|
|
|
// case 'Deliver': // 交付物相关消息
|
|
|
|
// commit('messages/messagesAdd', { type: 'checkMessages', message: data }, { root: true });
|
|
|
|
// break;
|
|
|
|
case 'ChannelStatus': |
|
|
|
dispatch('handleAuthMessage', data); |
|
|
|
break; |
|
|
|
// case 'switchoverProject': // 康复相关消息
|
|
|
|
// dispatch('home/getProjectById', data.data.projectId, { root: true });
|
|
|
|
// break;
|
|
|
|
// case 'startDrill': // 康复开始训练相关消息
|
|
|
|
// console.log('setStartDrillInfo', data.data);
|
|
|
|
// commit('home/setStartDrillMessages', data.data, { root: true });
|
|
|
|
// break;
|
|
|
|
default: |
|
|
|
break; |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
// 发送消息
|
|
|
|
sendSocketMessage({ |
|
|
|
state |
|
|
|
}, data) { |
|
|
|
if (state.connected) { |
|
|
|
const msg = JSON.stringify({ |
|
|
|
toDomain: 'Server', |
|
|
|
data: JSON.stringify(data) |
|
|
|
}); |
|
|
|
state.socket.send({ |
|
|
|
data: msg |
|
|
|
}); |
|
|
|
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); |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
// 监听关闭事件
|
|
|
|
onSocketClose({ |
|
|
|
dispatch, |
|
|
|
commit, |
|
|
|
state |
|
|
|
}) { |
|
|
|
// console.log('onSocketClose');
|
|
|
|
onSocketClose({ dispatch, commit, state }) { |
|
|
|
state.socket.onClose(() => { |
|
|
|
commit('setConnected', false); |
|
|
|
if (sendHeartTimer) clearInterval(sendHeartTimer); |
|
|
|
@ -154,58 +98,29 @@ const actions = { |
|
|
|
}); |
|
|
|
}, |
|
|
|
|
|
|
|
// websocket发送channelId进行认证
|
|
|
|
auth({ |
|
|
|
dispatch, |
|
|
|
rootState |
|
|
|
}) { |
|
|
|
const { |
|
|
|
token |
|
|
|
} = rootState.user; |
|
|
|
if (!token) return; |
|
|
|
const data = { |
|
|
|
type: 'Auth', |
|
|
|
data: { |
|
|
|
token |
|
|
|
} |
|
|
|
}; |
|
|
|
dispatch('sendSocketMessage', data); |
|
|
|
}, |
|
|
|
|
|
|
|
// 心跳检测
|
|
|
|
sendHeart({ |
|
|
|
dispatch, |
|
|
|
state |
|
|
|
}) { |
|
|
|
if (sendHeartTimer) clearInterval(sendHeartTimer); |
|
|
|
sendHeartTimer = setInterval(() => { |
|
|
|
if (Date.now() - prevTime >= 15000) { |
|
|
|
dispatch('sendSocketMessage', { |
|
|
|
type: 'Ping' |
|
|
|
}); |
|
|
|
if (Date.now() - prevTime >= 20000) { |
|
|
|
state.socket.close(); |
|
|
|
} |
|
|
|
} |
|
|
|
}, 5000); |
|
|
|
}, |
|
|
|
|
|
|
|
/** |
|
|
|
* 处理auth认证返回的ChannelStatus消息 |
|
|
|
* @param {object} data 消息内容对象 |
|
|
|
*/ |
|
|
|
handleAuthMessage({ |
|
|
|
commit, |
|
|
|
dispatch |
|
|
|
}, data) { |
|
|
|
handleAuthMessage({ commit, dispatch }, data) { |
|
|
|
if (data.data.authed) { |
|
|
|
dispatch('sendHeart'); |
|
|
|
} else { |
|
|
|
uni.$u.toast('消息系统认证失败, 请退出重新登录'); |
|
|
|
uni.$u.toast(data.data.error.text); |
|
|
|
uni.$storage.removeStorageSync('anyringToken'); |
|
|
|
commit('setSocket', null); |
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
// 心跳检测
|
|
|
|
sendHeart({ dispatch, state }) { |
|
|
|
if (sendHeartTimer) clearInterval(sendHeartTimer); |
|
|
|
sendHeartTimer = setInterval(() => { |
|
|
|
if (Date.now() - prevSendTimeMs >= heartbeatConst) { |
|
|
|
dispatch('sendSocketMessage', { type: 'Ping' }); |
|
|
|
} |
|
|
|
}, 5000); |
|
|
|
}, |
|
|
|
}; |
|
|
|
|
|
|
|
export default actions; |
|
|
|
|