Files
open-anylink-web/src/js/websocket/constructor.js
2025-05-17 12:21:50 +08:00

216 lines
5.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { Msg, Header, MsgType, Body } from '@/proto/msg'
import { proto } from '@/const/msgConst'
import { useUserStore } from '@/stores'
import { v4 as uuidv4 } from 'uuid'
export const chatConstructor = ({ sessionId, remoteId, content, contentType, sequence }) => {
const header = Header.create({
magic: proto.magic,
version: proto.version,
msgType: MsgType.CHAT,
isExtension: false
})
const userData = useUserStore()
const body = Body.create({
fromId: userData.user.account,
fromClient: userData.clientId,
toId: remoteId,
sessionId: sessionId,
content: content,
contentType: contentType,
seq: sequence
})
const chatMsg = Msg.create({ header: header, body: body })
const payload = Msg.encode(chatMsg).finish()
const data = encodePayload(payload)
return data
}
export const groupChatConstructor = ({ sessionId, remoteId, content, contentType, sequence }) => {
const header = Header.create({
magic: proto.magic,
version: proto.version,
msgType: MsgType.GROUP_CHAT,
isExtension: false
})
const userData = useUserStore()
const body = Body.create({
fromId: userData.user.account,
fromClient: userData.clientId,
sessionId: sessionId,
groupId: remoteId,
content: content,
contentType: contentType,
seq: sequence
})
const msg = Msg.create({ header: header, body: body })
const payload = Msg.encode(msg).finish()
const data = encodePayload(payload)
return data
}
export const heartBeatConstructor = () => {
const header = Header.create({
magic: proto.magic,
version: proto.version,
msgType: MsgType.HEART_BEAT,
isExtension: false
})
const heartBeat = Msg.create({ header: header })
const payload = Msg.encode(heartBeat).finish()
const data = encodePayload(payload)
return data
}
export const helloConstructor = () => {
const header = Header.create({
magic: proto.magic,
version: proto.version,
msgType: MsgType.HELLO,
isExtension: false
})
const hello = Msg.create({ header: header })
const payload = Msg.encode(hello).finish()
const data = encodePayload(payload)
return data
}
export const chatReadConstructor = ({ sessionId, remoteId, content }) => {
const header = Header.create({
magic: proto.magic,
version: proto.version,
msgType: MsgType.CHAT_READ,
isExtension: false
})
const userData = useUserStore()
const body = Body.create({
fromId: userData.user.account,
fromClient: userData.clientId,
toId: remoteId,
sessionId: sessionId,
content: content,
seq: uuidv4()
})
const chatMsg = Msg.create({ header: header, body: body })
const payload = Msg.encode(chatMsg).finish()
const data = encodePayload(payload)
return data
}
export const groupChatReadConstructor = ({ sessionId, remoteId, content }) => {
const header = Header.create({
magic: proto.magic,
version: proto.version,
msgType: MsgType.GROUP_CHAT_READ,
isExtension: false
})
const userData = useUserStore()
const body = Body.create({
fromId: userData.user.account,
fromClient: userData.clientId,
toId: remoteId,
sessionId: sessionId,
content: content,
seq: uuidv4()
})
const chatMsg = Msg.create({ header: header, body: body })
const payload = Msg.encode(chatMsg).finish()
const data = encodePayload(payload)
return data
}
export const statusReqConstructor = (accounts) => {
const header = Header.create({
magic: proto.magic,
version: proto.version,
msgType: MsgType.STATUS_REQ,
isExtension: false
})
const userData = useUserStore()
const body = Body.create({
fromId: userData.user.account,
fromClient: userData.clientId,
content: accounts
})
const msg = Msg.create({ header: header, body: body })
const payload = Msg.encode(msg).finish()
const data = encodePayload(payload)
return data
}
export const statusSyncConstructor = (status) => {
const header = Header.create({
magic: proto.magic,
version: proto.version,
msgType: MsgType.STATUS_SYNC,
isExtension: false
})
const userData = useUserStore()
const body = Body.create({
fromId: userData.user.account,
fromClient: userData.clientId,
content: `${status}` //content定义是String类型这里需要转一下
})
const msg = Msg.create({ header: header, body: body })
const payload = Msg.encode(msg).finish()
const data = encodePayload(payload)
return data
}
export const atConstructor = ({ sessionId, remoteId, content, sequence }) => {
const header = Header.create({
magic: proto.magic,
version: proto.version,
msgType: MsgType.AT,
isExtension: false
})
const userData = useUserStore()
const body = Body.create({
fromId: userData.user.account,
fromClient: userData.clientId,
sessionId: sessionId,
groupId: remoteId,
content: content,
seq: sequence
})
const chatMsg = Msg.create({ header: header, body: body })
const payload = Msg.encode(chatMsg).finish()
const data = encodePayload(payload)
return data
}
/**
* 发送前对长度编码,配合服务端解决半包黏包问题
* @param {*} payload
* @returns
*/
const encodePayload = (payload) => {
let num = payload.length
let lenEncode = []
while (num > 0) {
let byte = num & 0x7f
num >>= 7
if (num > 0) {
byte |= 0x80
}
lenEncode.push(byte)
}
return Uint8Array.of(...lenEncode, ...payload)
}