141 lines
3.8 KiB
Vue
141 lines
3.8 KiB
Vue
![]() |
// @ts-nocheck
|
|||
|
import { randomString } from './uitls'
|
|||
|
import { useUserStore } from '@/store/user'
|
|||
|
|
|||
|
const baseUrl = import.meta.env.VITE_SERVER_BASEURL
|
|||
|
|
|||
|
class socket {
|
|||
|
constructor() {
|
|||
|
this.socketUrl = baseUrl
|
|||
|
this.socketStart = false
|
|||
|
this.socketType = ''
|
|||
|
this.monitorSocketError()
|
|||
|
this.monitorSocketClose()
|
|||
|
this.socketReceive()
|
|||
|
}
|
|||
|
init(socket_type, callback?) {
|
|||
|
const userStore = useUserStore()
|
|||
|
const _this = this
|
|||
|
if (baseUrl) {
|
|||
|
if (this.socketStart) {
|
|||
|
console.log('webSocket已经启动了')
|
|||
|
} else {
|
|||
|
_this.socketType = socket_type
|
|||
|
let url =
|
|||
|
this.socketUrl.replace('https://', 'wss://').replace('http://', 'ws://') +
|
|||
|
'/' +
|
|||
|
socket_type +
|
|||
|
'/' +
|
|||
|
userStore.userInfo.userid +
|
|||
|
'_app'
|
|||
|
if (socket_type == 'eoaNewChatSocket') {
|
|||
|
let randomMessageId = randomString(6)
|
|||
|
url =
|
|||
|
this.socketUrl.replace('https://', 'wss://').replace('http://', 'ws://') +
|
|||
|
'/eoaNewChatSocket/' +
|
|||
|
userStore.userInfo.userid +
|
|||
|
'/' +
|
|||
|
randomMessageId
|
|||
|
}
|
|||
|
console.log('启动this.socketUrl连接地址:', url)
|
|||
|
// update-begin-author:taoyan date:20220422 for:v2.4.6 的 websocket 服务端,存在性能和安全问题。 #3278
|
|||
|
|
|||
|
let token = userStore.userInfo.token
|
|||
|
uni.connectSocket({
|
|||
|
url: url,
|
|||
|
method: 'GET',
|
|||
|
protocols: [token],
|
|||
|
})
|
|||
|
// update-end-author:taoyan date:20220422 for: v2.4.6 的 websocket 服务端,存在性能和安全问题。 #3278
|
|||
|
uni.onSocketOpen((res) => {
|
|||
|
this.socketStart = true
|
|||
|
callback && callback()
|
|||
|
console.log('WebSocket连接已打开!')
|
|||
|
})
|
|||
|
/* setTimeout(() => {
|
|||
|
_this.getHeartbeat();
|
|||
|
}, 5000); */
|
|||
|
}
|
|||
|
} else {
|
|||
|
console.log('config/baseUrl socketUrl为空')
|
|||
|
}
|
|||
|
}
|
|||
|
// Socket给服务器发送消息
|
|||
|
send(data, callback) {
|
|||
|
const userStore = useUserStore()
|
|||
|
const _this = this
|
|||
|
if (userStore.userInfo.userid) {
|
|||
|
data.userUid = userStore.userInfo.userid
|
|||
|
}
|
|||
|
console.log(data)
|
|||
|
uni.sendSocketMessage({
|
|||
|
data: JSON.stringify(data),
|
|||
|
success: () => {
|
|||
|
callback && callback(true)
|
|||
|
},
|
|||
|
fail: () => {
|
|||
|
callback && callback(false)
|
|||
|
},
|
|||
|
})
|
|||
|
}
|
|||
|
// Socket接收服务器发送过来的消息
|
|||
|
socketReceive() {
|
|||
|
const _this = this
|
|||
|
uni.onSocketMessage(function (res) {
|
|||
|
console.log('APP:--》收到服务器内容:')
|
|||
|
let data = JSON.parse(res.data)
|
|||
|
// console.log('收到服务器内容:', data);
|
|||
|
_this.acceptMessage && _this.acceptMessage(data)
|
|||
|
})
|
|||
|
}
|
|||
|
// 关闭Socket
|
|||
|
closeSocket() {
|
|||
|
const _this = this
|
|||
|
uni.closeSocket()
|
|||
|
_this.socketStart = false
|
|||
|
}
|
|||
|
// 监听Socket关闭
|
|||
|
monitorSocketClose() {
|
|||
|
const _this = this
|
|||
|
uni.onSocketClose(function (res) {
|
|||
|
console.log('WebSocket 已关闭!')
|
|||
|
_this.socketStart = false
|
|||
|
setTimeout(function () {
|
|||
|
_this.init(_this.socketType)
|
|||
|
}, 3000)
|
|||
|
})
|
|||
|
}
|
|||
|
// 监听Socket错误
|
|||
|
monitorSocketError() {
|
|||
|
const _this = this
|
|||
|
uni.onSocketError(function (res) {
|
|||
|
_this.socketStart = false
|
|||
|
console.log('WebSocket连接打开失败,请检查!')
|
|||
|
})
|
|||
|
}
|
|||
|
// 心跳
|
|||
|
getHeartbeat() {
|
|||
|
const userStore = useUserStore()
|
|||
|
const _this = this
|
|||
|
this.send(
|
|||
|
{
|
|||
|
type: '心跳',
|
|||
|
userUid: userStore.userInfo.userid,
|
|||
|
},
|
|||
|
(val) => {
|
|||
|
setTimeout(() => {
|
|||
|
if (val) {
|
|||
|
// _this.getHeartbeat();
|
|||
|
} else {
|
|||
|
if (!_this.socketStart) {
|
|||
|
// _this.init();
|
|||
|
}
|
|||
|
}
|
|||
|
}, 10000)
|
|||
|
},
|
|||
|
)
|
|||
|
}
|
|||
|
}
|
|||
|
const mySocket = new socket()
|
|||
|
export default mySocket
|