聊天进行到私聊进度备份

This commit is contained in:
heiye111
2026-05-19 21:35:25 +08:00
commit 205b492be9
37 changed files with 16686 additions and 0 deletions

102
src/network/signalr.js Normal file
View 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 }