群视频通话
This commit is contained in:
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user