import { defineStore } from "pinia"; import { computed, ref } from "vue"; import { friendSocketManager } from '@/utils/friend-socket.js' import { getToken, getUserId } from "../utils/user-info"; export const useFriendSocketStore = defineStore('friendSocket', () => { // ==================== 状态定义 ==================== const connectionStatus = ref('disconnected') //connecting | connected | disconnected | error const messages = ref([]) const messageString = ref('') const config = ref({ token: '', UserId: '' }) const taskCallId = ref('') const command = ref(null) const groupId = ref(null) // 收到消息 const MessageReceived = ref(false) // 日志数组和最大值 const logs = ref([]) const maxLogCount = ref(20) // ==================== 计算属性 ==================== const isConnected = computed(() => connectionStatus.value === 'connected') const isConnecting = computed(() => connectionStatus.value === 'connecting') const isDisconnected = computed(() => connectionStatus.value === 'disconnected') const isError = computed(() => connectionStatus.value === 'error') const lastMessage = computed(() => messages.value[messages.value.length - 1]) // 日志方法 function addLog(type, connect) { const now = new Date() const time = `${now.getHours().toString().padStart(2,'0')}:${now.getMinutes().toString().padStart(2,'0')}:${now.getSeconds().toString().padStart(2,'0')}` logs.value.push({ type, connect, time }) if (logs.value.length > maxLogCount.value) { logs.value = logs.value.slice(-maxLogCount.value) } console.log(`[${type.toUpperCase()}] ${connect}`); } function clearLogs() { logs.value = [] } // ==================== 连接相关方法 ==================== function connect(options = {}) { messages.value = [] messageString.value = '' config.value = { ...config.value, ...options } addLog('info', `准备连接FriendsWebSocket。Token:${config.value.token || '未设置'}。UserId: ${config.value.UserId || '未设置'}` ) if (!config.value.token || !config.value.UserId) { addLog('error', 'Token和UserId都不能为空') return } connectionStatus.value = 'connecting' friendSocketManager.connect({ token: config.value.token, UserId: config.value.UserId, onMessage: handleMessage, onError: handleError, onOpen: handleOpen, onClose: handleClose, onReconnect: handleReconnecting }) setConnectionTimeout() } function disconnect() { friendSocketManager.close() connectionStatus.value = 'disconnected' addLog('warn', '已主动断开连接') } async function send(message) { if (!isConnected.value) { addLog('error', '发送失败: 连接未建立') throw new Error('连接未建立') } try { await friendSocketManager.send(message) addLog('send', typeof message === 'string' ? message : JSON.stringify(message)) return true } catch (error) { addLog('error', `发送失败: ${error.message || error}`) throw error } } // =====================连接成功发送验证标识,指令为7=============== async function sendAuthData() { const userId = getUserId() const authData = { "version": "1.1", "body": { "command": 7, "sender": userId, "avatar": "", "sessionId": "", "message": "", "callBackMessage": false, } } try { await friendSocketManager.send(authData) addLog('send', typeof authData === 'string' ? authData : JSON.stringify(authData)) return true } catch (error) { addLog('error', `发送验证失败: ${error.message || error}`) throw error } } // ==================== 事件回调 ==================== function handleOpen() { connectionStatus.value = 'connected' addLog('success', '连接成功!') sendAuthData() } function handleClose() { if (connectionStatus.value !== 'disconnected') { // disconnect() connectionStatus.value = 'disconnected' addLog('warn', '连接已断开') } } function handleError(error) { addLog('error', `Socket错误: ${JSON.stringify(error)}`) connectionStatus.value = 'error' } function handleReconnecting(attempts) { connectionStatus.value = 'connecting' addLog('warn', `重连中... (${attempts}/5)`) } function setConnectionTimeout() { const timer = setTimeout(() => { if (connectionStatus.value === 'connecting') { connectionStatus.value = 'error' addLog('error', '连接超时(10s)') } }, 10000) // 返回 timer 以便必要时清除,但目前用不到 return timer } function handleMessage(messageData) { addLog('receive', `收到: ${JSON.stringify(messageData)}`) const msgBody = messageData.body || messageData; // command 和 groupId和响应式变量重名冲突,直接解构时重命名 const { callBackMessage, groupName, command: msgCommand, groupId: msgGroupId } = msgBody || {} switch (msgCommand) { case 3: command.value = msgCommand groupId.value = msgGroupId break case 7: command.value = msgCommand break case 1: console.log("有好友消息"); MessageReceived.value = true break case 9: console.log("群消息发送成功/有新群消息"); MessageReceived.value = true break default: addLog('info', `未知事件类型`) } } // ==================== 状态查询 ==================== function getStatusText() { const statusMap = { connecting: '连接中', connected: '已连接', disconnected: '未连接', error: '连接错误' } return statusMap[connectionStatus.value] || '未知状态' } function getReadyState() { return friendSocketManager.getReadyState() } // ==================== 导出 ==================== return { // 状态 connectionStatus, //属性变量 messageString, logs, config, command, groupId, MessageReceived, // 计算属性 isConnected, isConnecting, isDisconnected, isError, lastMessage, // 方法 connect, disconnect, send, addLog, clearLogs, getStatusText } })