From 9db9b65ea347ddd58a51ad424957a4e4e2cab962 Mon Sep 17 00:00:00 2001 From: liqi Date: Wed, 3 Dec 2025 15:33:48 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9F=B3=E8=A7=86=E9=A2=91=E9=80=9A=E8=AF=9D?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=AE=8C=E6=88=90=EF=BC=88P2P=EF=BC=89=20?= =?UTF-8?q?=E5=B7=B2=E7=9F=A5=E9=97=AE=E9=A2=98=EF=BC=9A=20=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=97=A0=E6=B3=95=E5=8F=91=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 3 +- src/api/websocket/index.ts | 56 ++- src/components/call/CallWindow.vue | 218 +++++---- src/components/chat/MessageInput.vue | 11 +- src/components/chat/bubble/Image.vue | 4 +- src/components/common/ConfirmModal.vue | 82 ++++ src/components/common/Toast.vue | 102 +++++ src/composables/useWebRTC.ts | 272 +++++++----- src/router/index.ts | 12 + src/stores/toast.ts | 93 ++++ src/views/chat/ChatView.vue | 587 +++++-------------------- src/views/contact/ContactCircle.vue | 381 ++++++++++++++++ src/views/contact/ContactDetail.vue | 383 ++++++++++++++++ src/views/contact/ContactView.vue | 21 +- src/views/login/LoginView.vue | 23 +- 15 files changed, 1544 insertions(+), 704 deletions(-) create mode 100644 src/components/common/ConfirmModal.vue create mode 100644 src/components/common/Toast.vue create mode 100644 src/stores/toast.ts create mode 100644 src/views/contact/ContactCircle.vue create mode 100644 src/views/contact/ContactDetail.vue diff --git a/src/App.vue b/src/App.vue index f88682b..e65c650 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,8 +1,9 @@ diff --git a/src/api/websocket/index.ts b/src/api/websocket/index.ts index 5653f29..23c890a 100644 --- a/src/api/websocket/index.ts +++ b/src/api/websocket/index.ts @@ -48,20 +48,46 @@ class WebSocketManager { this.ws.onmessage = (event) => { try { - const payload: WebSocketMessage = JSON.parse(event.data) + // 处理可能的多行JSON或消息分割 + const data = event.data.toString().trim() - // 接收clientId - if (payload.clientId) { - this.clientId = payload.clientId - console.log('Received clientId:', this.clientId) - } + // 尝试按行分割处理多个JSON对象 + const lines = data.split('\n').filter(line => line.trim()) - // 处理接收消息 - if (payload.request_type === 'receive_message' && payload.data) { - this.handleMessage(payload.data) + for (const line of lines) { + try { + const payload: WebSocketMessage = JSON.parse(line) + + // 接收clientId + if (payload.clientId) { + this.clientId = payload.clientId + console.log('Received clientId:', this.clientId) + } + + // 处理接收消息 + if (payload.request_type === 'receive_message' && payload.data) { + this.handleMessage(payload.data) + } + } catch (lineError) { + // 如果单行解析失败,尝试解析整个数据 + if (lines.length === 1) { + const payload: WebSocketMessage = JSON.parse(data) + + if (payload.clientId) { + this.clientId = payload.clientId + console.log('Received clientId:', this.clientId) + } + + if (payload.request_type === 'receive_message' && payload.data) { + this.handleMessage(payload.data) + } + } else { + console.warn('Failed to parse WebSocket message line:', line, lineError) + } + } } } catch (error) { - console.error('WebSocket message parse error:', error) + console.error('WebSocket message parse error:', error, 'Data:', event.data) } } @@ -140,13 +166,15 @@ class WebSocketManager { * 处理接收到的消息 */ private handleMessage(message: ChatMessage) { - // 信令消息(message_type = 6) + // 信令消息(message_type = 6)- 路由到signalHandlers,不路由到messageHandlers if (message.message_type === 6) { + console.log('[WebSocket] Routing signaling message:', message.call_status, message.call_id) this.signalHandlers.forEach(handler => handler(message)) - } else { - // 普通消息 - this.messageHandlers.forEach(handler => handler(message)) + return // 重要:信令消息不进入普通消息处理流程 } + + // 普通消息 - 路由到messageHandlers + this.messageHandlers.forEach(handler => handler(message)) } /** diff --git a/src/components/call/CallWindow.vue b/src/components/call/CallWindow.vue index 19be607..1858f77 100644 --- a/src/components/call/CallWindow.vue +++ b/src/components/call/CallWindow.vue @@ -1,8 +1,8 @@