群视频通话

This commit is contained in:
2025-12-06 23:02:49 +08:00
parent 926c2a5621
commit 655a2bdd59
11 changed files with 1756 additions and 1326 deletions

View File

@@ -1,9 +1,4 @@
import type { ChatMessage } from '@/types/api'
import type { MessageType, CallStatus } from '@/types/message'
/**
* WebSocket连接管理
*/
export interface WebSocketMessage {
request_type?: string
@@ -36,12 +31,12 @@ class WebSocketManager {
this.userId = userId
const wsUrl = `ws://localhost:12080/ws?user_id=${userId}`
try {
this.ws = new WebSocket(wsUrl)
this.ws.onopen = () => {
console.log('WebSocket connected')
console.log('WebSocket connected')
this.reconnectAttempts = 0
resolve()
}
@@ -50,44 +45,27 @@ class WebSocketManager {
try {
// 处理可能的多行JSON或消息分割
const data = event.data.toString().trim()
// 尝试按行分割处理多个JSON对象
const lines = data.split('\n').filter(line => line.trim())
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 (e) {
// Ignore single line parse error
}
}
} catch (error) {
console.error('WebSocket message parse error:', error, 'Data:', event.data)
console.error('WebSocket message parse error:', error)
}
}
@@ -129,14 +107,14 @@ class WebSocketManager {
}
/**
* 添加消息处理器
* 添加普通消息处理器
*/
onMessage(handler: MessageHandler) {
this.messageHandlers.push(handler)
}
/**
* 移除消息处理器
* 移除普通消息处理器
*/
offMessage(handler: MessageHandler) {
const index = this.messageHandlers.indexOf(handler)
@@ -146,7 +124,7 @@ class WebSocketManager {
}
/**
* 添加信令处理器
* 添加信令处理器 (WebRTC用)
*/
onSignal(handler: SignalHandler) {
this.signalHandlers.push(handler)
@@ -163,16 +141,15 @@ class WebSocketManager {
}
/**
* 处理接收到的消息
* 内部处理接收到的消息
*/
private handleMessage(message: ChatMessage) {
// 信令消息message_type = 6- 路由到signalHandlers不路由到messageHandlers
// 信令消息message_type = 6- 路由到signalHandlers
if (message.message_type === 6) {
console.log('[WebSocket] Routing signaling message:', message.call_status, message.call_id)
this.signalHandlers.forEach(handler => handler(message))
return // 重要:信令消息不进入普通消息处理流程
return
}
// 普通消息 - 路由到messageHandlers
this.messageHandlers.forEach(handler => handler(message))
}
@@ -182,7 +159,6 @@ class WebSocketManager {
*/
private attemptReconnect() {
if (this.reconnectAttempts >= this.maxReconnectAttempts) {
console.error('Max reconnect attempts reached')
return
}
@@ -191,8 +167,6 @@ class WebSocketManager {
}
this.reconnectAttempts++
console.log(`Attempting to reconnect (${this.reconnectAttempts}/${this.maxReconnectAttempts})...`)
setTimeout(() => {
if (this.userId) {
this.connect(this.userId).catch(console.error)
@@ -201,6 +175,4 @@ class WebSocketManager {
}
}
// 单例
export const wsManager = new WebSocketManager()