import { ref } from 'vue'; // 在组件 setup 函数中使用 export default function useWebSocket() { // 存储 WebSocket 实例 const ws = ref(null); const wsUrl = 'ws://127.0.0.1:8000/ws/audio'; // 初始化 WebSocket 连接 const initWebSocket = () => { ws.value = uni.connectSocket({ url: wsUrl, success: () => { console.log('web'); // 监听连接打开 ws.value.onOpen((res) => { console.log('WebSocket连接已打开', res); // 监听消息接收 ws.value.onMessage((res) => { let messageData = res.data; // 处理不同类型的数据 if (typeof messageData === 'string') { // 文本数据 try { const parsedData = JSON.parse(messageData); handleMessage(parsedData); } catch (e) { handleMessage(messageData); } } else if (messageData instanceof ArrayBuffer) { // 二进制数据 try { // 注意:组合式 API 中需通过 ref 获取子组件实例 const aaaRef = ref(null); // 需在组件中声明 aaaRef.value?.appendBuffer(messageData); } catch (e) { console.log('二进制数据解析失败:', e); } } }); }); }, fail: () => { console.log('fail'); }, }); }; // 消息处理函数(根据实际业务逻辑修改) const handleMessage = (data) => { // 原组件中的 handleMessage 逻辑迁移到这里 console.log('收到消息:', data); }; // 辅助函数:ArrayBuffer 转字符串(如果后续需要使用) const arrayBufferToStringCompat = (buffer) => { const decoder = new TextDecoder('utf-8'); return decoder.decode(buffer); }; // 关闭连接函数(可选,按需暴露) const closeWebSocket = () => { if (ws.value) { ws.value.close(); console.log('WebSocket连接已关闭'); } }; return { ws, initWebSocket, closeWebSocket, handleMessage }; };