80 lines
2.1 KiB
JavaScript
80 lines
2.1 KiB
JavaScript
import { useUserStore } from "@/stores/user"
|
|
import { useChatStore } from "@/stores/chat"
|
|
|
|
export function useWebSocket() {
|
|
const userStore = useUserStore()
|
|
const chatStore = useChatStore()
|
|
|
|
const connectWebSocket = () => {
|
|
try {
|
|
chatStore.connectionStatus = "connecting"
|
|
|
|
const wsUrl = "ws://localhost:12080/ws"
|
|
console.log("连接WebSocket:", wsUrl)
|
|
|
|
chatStore.socket = new WebSocket(wsUrl)
|
|
|
|
chatStore.socket.onopen = () => {
|
|
console.log("WebSocket连接已建立")
|
|
chatStore.connectionStatus = "connected"
|
|
|
|
// 发送绑定请求
|
|
if (userStore.currentUser) {
|
|
const bindMsg = {
|
|
request_type: "bind",
|
|
sender_user_id: userStore.currentUser.id.toString(),
|
|
}
|
|
chatStore.socket.send(JSON.stringify(bindMsg))
|
|
}
|
|
}
|
|
|
|
chatStore.socket.onmessage = (event) => {
|
|
try {
|
|
const message = JSON.parse(event.data)
|
|
console.log("收到消息:", message)
|
|
|
|
// 检查是否是系统消息
|
|
if (message.clientId) return
|
|
|
|
chatStore.handleIncomingMessage(message, userStore.currentUser.id)
|
|
} catch (e) {
|
|
console.error("解析消息失败:", e)
|
|
}
|
|
}
|
|
|
|
chatStore.socket.onclose = (event) => {
|
|
console.log("WebSocket连接已关闭, 代码:", event.code, "原因:", event.reason)
|
|
chatStore.connectionStatus = "disconnected"
|
|
|
|
// 智能重连策略
|
|
if (event.code !== 1000) {
|
|
setTimeout(() => {
|
|
console.log("尝试重新连接WebSocket...")
|
|
connectWebSocket()
|
|
}, 3000)
|
|
}
|
|
}
|
|
|
|
chatStore.socket.onerror = (error) => {
|
|
console.error("WebSocket错误:", error)
|
|
chatStore.connectionStatus = "disconnected"
|
|
}
|
|
} catch (error) {
|
|
console.error("连接WebSocket失败:", error)
|
|
chatStore.connectionStatus = "disconnected"
|
|
}
|
|
}
|
|
|
|
const disconnectWebSocket = () => {
|
|
if (chatStore.socket) {
|
|
chatStore.socket.close()
|
|
chatStore.socket = null
|
|
}
|
|
}
|
|
|
|
return {
|
|
connectWebSocket,
|
|
disconnectWebSocket,
|
|
}
|
|
}
|