Initial commit
This commit is contained in:
165
src/api/im/Socket.js
Normal file
165
src/api/im/Socket.js
Normal file
@@ -0,0 +1,165 @@
|
||||
//Socket连接
|
||||
|
||||
const targetUrl = process.env.BASE_TARGET_URL.replace("/", "");
|
||||
|
||||
|
||||
import EventBus from './eventBus.js'
|
||||
let ws = null
|
||||
let heartTimer = null
|
||||
let timer = null
|
||||
let lockReconnect = false
|
||||
let token = null
|
||||
const reconnectCountMax = 200
|
||||
let reconnectCount = 0
|
||||
let isConnect = false
|
||||
let SERVER_IP = targetUrl.replaceAll("\"", "");
|
||||
|
||||
//服务器推送消息
|
||||
function response(event) {
|
||||
if (event.type !== 'message') {
|
||||
onCloseHandler()
|
||||
return
|
||||
}
|
||||
let wsContent
|
||||
try {
|
||||
wsContent = JSON.parse(event.data)
|
||||
} catch {
|
||||
onCloseHandler()
|
||||
return
|
||||
}
|
||||
if (wsContent.type) {
|
||||
if (wsContent.data && wsContent.data.code === -1) {
|
||||
onCloseHandler()
|
||||
} else {
|
||||
switch (wsContent.type) {
|
||||
//心跳回复
|
||||
case 'Heartbeat-Reply': {
|
||||
EventBus.emit('Heartbeat-Reply', wsContent.content)
|
||||
break
|
||||
}
|
||||
//在线用户推送
|
||||
case 'Online-UserIds': {
|
||||
EventBus.emit('Online-UserIds', wsContent.content)
|
||||
break
|
||||
}
|
||||
//接收消息
|
||||
case 'Message-Receive': {
|
||||
EventBus.emit('Message-Receive', wsContent.content)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
onCloseHandler()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//连接Socket
|
||||
function connect(tokenStr) {
|
||||
if (isConnect || ws) return
|
||||
isConnect = true
|
||||
token = tokenStr
|
||||
try {
|
||||
const wsIp = import.meta.env.VITE_SOCKET_URL
|
||||
ws = new WebSocket(`ws://${SERVER_IP}:18666/infra/ws?token=${token}`)
|
||||
|
||||
ws.onopen = () => {
|
||||
console.log('Socket连接成功!')
|
||||
clearTimer()
|
||||
sendHeartPack()
|
||||
}
|
||||
|
||||
ws.onmessage = response
|
||||
ws.onclose = onCloseHandler
|
||||
ws.onerror = onCloseHandler
|
||||
} catch {
|
||||
onCloseHandler()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//发送消息
|
||||
function send(msg) {
|
||||
if (ws && ws.readyState === WebSocket.OPEN) ws.send(msg)
|
||||
}
|
||||
|
||||
|
||||
|
||||
//开启心跳,上报在线状态
|
||||
const sendHeartPack = () => {
|
||||
heartTimer = setInterval(() => {
|
||||
let data = {
|
||||
msgType:"Heartbeat",
|
||||
msgContent:"我在线,时间:"+ new Date().getTime()
|
||||
}
|
||||
let wsdata = {
|
||||
type: "app-message-send",
|
||||
content: JSON.stringify(data)
|
||||
}
|
||||
send(JSON.stringify(wsdata));
|
||||
}, 10000)
|
||||
}
|
||||
|
||||
|
||||
|
||||
const onCloseHandler = () => {
|
||||
clearHeartPackTimer()
|
||||
if (ws) {
|
||||
ws.close()
|
||||
ws = null
|
||||
}
|
||||
isConnect = false
|
||||
if (lockReconnect) return
|
||||
lockReconnect = true
|
||||
if (timer) {
|
||||
clearTimeout(timer)
|
||||
timer = null
|
||||
}
|
||||
if (reconnectCount >= reconnectCountMax) {
|
||||
reconnectCount = 0
|
||||
return
|
||||
}
|
||||
if (token) {
|
||||
timer = setTimeout(() => {
|
||||
connect(token)
|
||||
reconnectCount++
|
||||
lockReconnect = false
|
||||
}, 5000)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//清除心跳定时器
|
||||
const clearHeartPackTimer = () => {
|
||||
console.log('Socket连接关闭中')
|
||||
if (heartTimer) {
|
||||
clearInterval(heartTimer)
|
||||
heartTimer = null
|
||||
}
|
||||
}
|
||||
|
||||
//清除Timer定时器
|
||||
const clearTimer = () => {
|
||||
if (timer) {
|
||||
clearInterval(timer)
|
||||
timer = null
|
||||
}
|
||||
}
|
||||
|
||||
//断开Socket连接
|
||||
const disConnect = () => {
|
||||
clearHeartPackTimer()
|
||||
token = null
|
||||
if (ws) {
|
||||
ws.close()
|
||||
ws = null
|
||||
}
|
||||
isConnect = false
|
||||
}
|
||||
|
||||
export default {
|
||||
connect,
|
||||
disConnect
|
||||
}
|
||||
Reference in New Issue
Block a user