Files
nl-im-pc/src/composables/useWebSocket.js
2025-07-02 16:54:52 +08:00

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,
}
}