聊天进行到私聊进度备份
This commit is contained in:
102
src/network/signalr.js
Normal file
102
src/network/signalr.js
Normal file
@@ -0,0 +1,102 @@
|
||||
import * as signalR from '@microsoft/signalr'
|
||||
import * as msgpack from '@microsoft/signalr-protocol-msgpack'
|
||||
import mitt from 'mitt'
|
||||
import router from '@/router'
|
||||
|
||||
export const emitter = mitt()
|
||||
let connection = null
|
||||
|
||||
// 注册消息处理函数
|
||||
function registerHandlers(conn) {
|
||||
conn.on('ReceiveMessage', (group, user, message) => {
|
||||
emitter.emit('ReceiveMessage', { group, user, message })
|
||||
})
|
||||
|
||||
conn.on('OnlineCount', (count) => {
|
||||
emitter.emit('OnlineCount', count)
|
||||
})
|
||||
|
||||
conn.on('GroupCount', (groupName, count) => {
|
||||
emitter.emit('GroupCount', { groupName, count })
|
||||
})
|
||||
|
||||
conn.on('RegisterResult', (success, message) => {
|
||||
emitter.emit('RegisterResult', { success, message })
|
||||
})
|
||||
|
||||
conn.on('LoginResult', async (success, accessToken, refreshToken) => {
|
||||
emitter.emit('LoginResult', { success, accessToken, refreshToken })
|
||||
})
|
||||
|
||||
conn.on('SendPrivateMessage', (success, message, userid, messageId) => {
|
||||
emitter.emit('SendPrivateMessage', { success, message, userid, messageId })
|
||||
})
|
||||
conn.on('SendReadReceipt', (messageId) => {
|
||||
emitter.emit('SendReadReceipt', messageId)
|
||||
})
|
||||
}
|
||||
|
||||
// 初始连接(不带 token)
|
||||
async function createConnection() {
|
||||
connection = new signalR.HubConnectionBuilder()
|
||||
.withUrl('http://192.168.1.254:5162/Chat')
|
||||
.withHubProtocol(new msgpack.MessagePackHubProtocol())
|
||||
.withAutomaticReconnect()
|
||||
.build()
|
||||
|
||||
registerHandlers(connection)
|
||||
await connection.start()
|
||||
emitter.emit('Connected') // 通知页面连接成功
|
||||
return connection
|
||||
}
|
||||
|
||||
// 刷新 AccessToken
|
||||
async function RefreshAccessToken() {
|
||||
const oldRefreshToken = localStorage.getItem('refreshToken')
|
||||
if (!oldRefreshToken) return
|
||||
|
||||
connection.send('RefreshAccessToken', oldRefreshToken)
|
||||
|
||||
connection.off('ReceiveNewAccessToken')
|
||||
connection.on('ReceiveNewAccessToken', async (newAccessToken, newRefreshToken) => {
|
||||
localStorage.setItem('accessToken', newAccessToken)
|
||||
localStorage.setItem('refreshToken', newRefreshToken)
|
||||
await reconnectWithToken()
|
||||
})
|
||||
|
||||
connection.off('RefreshFailed')
|
||||
connection.on('RefreshFailed', (message) => {
|
||||
console.error('刷新失败:', message)
|
||||
localStorage.removeItem('accessToken')
|
||||
localStorage.removeItem('refreshToken')
|
||||
router.push('/')
|
||||
})
|
||||
}
|
||||
|
||||
// 使用新的 token 重建连接
|
||||
async function reconnectWithToken() {
|
||||
const accessToken = localStorage.getItem('accessToken')
|
||||
if (!accessToken) return
|
||||
|
||||
if (connection) {
|
||||
await connection.stop()
|
||||
}
|
||||
|
||||
connection = new signalR.HubConnectionBuilder()
|
||||
.withUrl(`http://192.168.1.254:5162/Chat?access_token=${accessToken}`)
|
||||
.withHubProtocol(new msgpack.MessagePackHubProtocol())
|
||||
.withAutomaticReconnect()
|
||||
.build()
|
||||
|
||||
registerHandlers(connection)
|
||||
await connection.start()
|
||||
emitter.emit('Connected') // 通知页面连接成功
|
||||
}
|
||||
|
||||
// 页面加载时自动执行
|
||||
;(async () => {
|
||||
await createConnection()
|
||||
await RefreshAccessToken() // 尝试刷新 token 并重连
|
||||
})()
|
||||
|
||||
export { connection, reconnectWithToken }
|
||||
Reference in New Issue
Block a user