ZRAdmin-vue/src/utils/signalR.js
2022-05-15 09:24:09 +08:00

94 lines
2.7 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.

// 官方文档https://docs.microsoft.com/zh-cn/aspnet/core/signalr/javascript-client?view=aspnetcore-6.0&viewFallbackFrom=aspnetcore-2.2&tabs=visual-studio
import * as signalR from '@microsoft/signalr'
import store from '../store'
import { getToken } from '@/utils/auth'
import { ElNotification } from 'element-plus'
export default {
// signalR对象
SR: {},
// 失败连接重试次数
failNum: 4,
baseUrl: '',
init(url) {
var socketUrl = window.location.origin + url
//console.log(socketUrl)
const connection = new signalR.HubConnectionBuilder()
.withUrl(socketUrl, { accessTokenFactory: () => getToken() })
.withAutomaticReconnect() //自动重新连接
.configureLogging(signalR.LogLevel.Information)
.build();
this.SR = connection
// 断线重连
connection.onclose(async () => {
console.log('断开连接了')
console.assert(connection.state === signalR.HubConnectionState.Disconnected);
// 建议用户重新刷新浏览器
await this.start()
})
connection.onreconnected(() => {
console.log('断线重新连接成功')
})
this.receiveMsg(connection)
// 启动
// this.start();
},
/**
* 调用 this.signalR.start().then(async () => { await this.SR.invoke("method")})
* @returns
*/
async start() {
var that = this
try {
//使用async和await 或 promise的then 和catch 处理来自服务端的异常
await this.SR.start()
//console.assert(this.SR.state === signalR.HubConnectionState.Connected);
console.log('signalR 连接成功了', this.SR.state);
return true
} catch (error) {
that.failNum--;
console.log(`失败重试剩余次数${that.failNum}`, error)
if (that.failNum > 0) {
setTimeout(async () => {
await this.SR.start()
}, 5000)
}
return false
}
},
// 接收消息处理
receiveMsg(connection) {
console.log(connection)
connection.on("onlineNum", (data) => {
store.dispatch("socket/changeOnlineNum", data);
});
// 接收欢迎语
connection.on("welcome", (data) => {
console.log('welcome', data)
ElNotification.info(data)
});
// 接收后台手动推送消息
connection.on("receiveNotice", (title, data) => {
ElNotification({
type: 'info',
title: title,
message: data,
dangerouslyUseHTMLString: true,
duration: 0
})
})
// 接收系统通知/公告
connection.on("moreNotice", (data) => {
if (data.code == 200) {
store.dispatch("socket/getNoticeList", data.data);
}
})
// 接收在线用户
connection.on("onlineUser", (data) => {
store.dispatch("socket/getOnlineUsers", data);
})
}
}