diff --git a/src/js/websocket/constructor.js b/src/js/websocket/constructor.js index 14c7c94..8cfc4a1 100644 --- a/src/js/websocket/constructor.js +++ b/src/js/websocket/constructor.js @@ -3,7 +3,7 @@ import { proto } from '@/const/msgConst' import { userStore } from '@/stores' import { v4 as uuidv4 } from 'uuid' -export const chatConstructor = (toId, content) => { +export const chatConstructor = (toId, content, tempMsgId) => { const header = Header.create({ magic: proto.magic, version: proto.version, @@ -17,7 +17,7 @@ export const chatConstructor = (toId, content) => { fromClient: userData.clientId, toId: toId, content: content, - tempMsgId: uuidv4() + tempMsgId: tempMsgId }) const chatMsg = Msg.create({ header: header, body: body }) const payload = Msg.encode(chatMsg).finish() diff --git a/src/js/websocket/wsConnect.js b/src/js/websocket/wsConnect.js index 4db3ba7..76e28cd 100644 --- a/src/js/websocket/wsConnect.js +++ b/src/js/websocket/wsConnect.js @@ -78,6 +78,11 @@ class WsConnect { curReSendTimes: 0 // 当前重发的次数 } + /** + * 消息发送时携带的是tempMsgId,服务端回复DELIVERED消息时返回了msgId,此时要回填msgId + */ + msgIdRefillCallback = {} + /** * 绑定事件 */ @@ -86,7 +91,10 @@ class WsConnect { this.heartBeat.start() this.isConnect = true }, - [MsgType.DELIVERED]: () => {}, //需要发送时定义事件处理逻辑 + [MsgType.DELIVERED]: (deliveredMsg) => { + this.msgIdRefillCallback[deliveredMsg.body.tempMsgId](deliveredMsg.body.msgId) + delete this.msgIdRefillCallback[deliveredMsg.body.tempMsgId] + }, [MsgType.CHAT]: () => {}, [MsgType.HEART_BEAT]: () => { if (this.heartBeat.healthPoint > 0) this.heartBeat.healthPoint-- @@ -259,16 +267,17 @@ class WsConnect { * @param {*} callback */ sendMsg(remoteId, msgType, content, callback) { - const data = this.dataConstructor[msgType](remoteId, content) - this.sendAgent(data, callback) + const tempMsgId = uuidv4() + const data = this.dataConstructor[msgType](remoteId, content, tempMsgId) + this.msgIdRefillCallback[tempMsgId] = callback + this.sendAgent(data) } /** * 发送代理,封装了重发机制 */ - sendAgent(data, callback) { + sendAgent(data) { if (this.isConnect) { - this.bindEvent(MsgType.DELIVERED, callback) this.connect.send(data) } else { if (this.reSend.curReSendTimes >= this.reSend.timeoutTimes) { @@ -277,7 +286,7 @@ class WsConnect { // TODO 应该反馈到业务层给提示 } else { setTimeout(() => { - this.sendAgent(data, callback) + this.sendAgent(data) }, this.reSend.interval) this.reSend.curReSendTimes++ } diff --git a/src/views/message/MessageLayout.vue b/src/views/message/MessageLayout.vue index 668cf9f..cfe7427 100644 --- a/src/views/message/MessageLayout.vue +++ b/src/views/message/MessageLayout.vue @@ -286,21 +286,22 @@ const handleSwitchTag = (obj) => { const handleSendMessage = (content) => { // TODO 这里还要考虑失败情况:1)消息发不出去;2)消息发出去了,服务器不发“已发送” - wsConnect.sendMsg(showId.value, choosedSession.value.sessionType, content, (deliveredMsg) => { - + wsConnect.sendMsg(showId.value, choosedSession.value.sessionType, content, (msgId) => { const now = new Date() messageData.updateSession({ sessionId: sessionId.value, - lastMsgId: deliveredMsg.body.msgId, // 最后一条消息(自己发的) + lastMsgId: msgId, // 最后一条消息(自己发的) lastMsgContent: content, lastMsgTime: now, - unreadCount: 0, // 最后一条消息(自己发的),因此未读是0 + readMsgId: msgId, // 最后一条消息是自己发的,因此已读更新到最大(刚发的这条消息的msgId) + readTime: now, + unreadCount: 0, // 最后一条消息是自己发的,因此未读是0 draft: '' //草稿意味着要清空 }) - + messageData.addMsgRecords(sessionId.value, [{ sessionId: sessionId.value, - msgId: deliveredMsg.body.msgId, + msgId: msgId, fromId: userData.user.account, msgType: choosedSession.value.sessionType, content: content,