【m】开始尝试接入后端
This commit is contained in:
@@ -12,6 +12,8 @@ class WebSocketManager {
|
||||
this.reconnectAttempts = 0;
|
||||
this.maxReconnectAttempts = 5;
|
||||
this.reconnectDelay = 1000;
|
||||
this.connectionId = null;
|
||||
this.heartbeatInterval = null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -34,12 +36,23 @@ class WebSocketManager {
|
||||
console.log('WebSocket connected');
|
||||
this.isConnected = true;
|
||||
this.reconnectAttempts = 0;
|
||||
|
||||
// 生成连接ID
|
||||
this.connectionId = this.generateConnectionId();
|
||||
|
||||
// 发送连接消息
|
||||
this.sendConnectMessage();
|
||||
|
||||
// 启动心跳
|
||||
this.startHeartbeat();
|
||||
|
||||
this.emit('connect');
|
||||
};
|
||||
|
||||
this.socket.onclose = () => {
|
||||
console.log('WebSocket disconnected');
|
||||
this.isConnected = false;
|
||||
this.stopHeartbeat();
|
||||
this.emit('disconnect');
|
||||
this.attemptReconnect();
|
||||
};
|
||||
@@ -76,13 +89,28 @@ class WebSocketManager {
|
||||
|
||||
/**
|
||||
* 发送消息
|
||||
* @param {string} event - 事件名称
|
||||
* @param {string} type - 消息类型
|
||||
* @param {Object} data - 消息数据
|
||||
*/
|
||||
send(event, data) {
|
||||
send(type, data) {
|
||||
if (this.isConnected && this.socket) {
|
||||
try {
|
||||
const message = JSON.stringify({ event, data });
|
||||
let message;
|
||||
|
||||
// 根据消息类型构建不同的消息格式
|
||||
if (type === 'connect' || type === 'disconnect') {
|
||||
message = JSON.stringify({ type, connectionId: this.connectionId });
|
||||
} else if (type === 'offer' || type === 'answer' || type === 'candidate') {
|
||||
message = JSON.stringify({ type, data });
|
||||
} else if (type === 'broadcast') {
|
||||
message = JSON.stringify({ type, message: data.message, targetConnectionId: data.targetConnectionId });
|
||||
} else if (type === 'ping' || type === 'pong') {
|
||||
message = JSON.stringify({ type });
|
||||
} else {
|
||||
// 兼容旧格式,用于自定义事件
|
||||
message = JSON.stringify({ event: type, data });
|
||||
}
|
||||
|
||||
this.socket.send(message);
|
||||
} catch (error) {
|
||||
console.error('Error sending WebSocket message:', error);
|
||||
@@ -97,36 +125,60 @@ class WebSocketManager {
|
||||
* @param {Object} message - 消息对象
|
||||
*/
|
||||
handleMessage(message) {
|
||||
switch (message.type) {
|
||||
case 'user-joined':
|
||||
this.emit('user-joined', message.data);
|
||||
break;
|
||||
case 'user-left':
|
||||
this.emit('user-left', message.data);
|
||||
break;
|
||||
case 'media-state-changed':
|
||||
this.emit('media-state-changed', message.data);
|
||||
break;
|
||||
case 'message-received':
|
||||
this.emit('message-received', message.data);
|
||||
break;
|
||||
case 'network-quality':
|
||||
this.emit('network-quality', message.data);
|
||||
break;
|
||||
case 'call-ended':
|
||||
this.emit('call-ended', message.data);
|
||||
break;
|
||||
case 'ping':
|
||||
// 处理心跳请求,回复pong
|
||||
this.send('pong', {});
|
||||
break;
|
||||
case 'pong':
|
||||
// 处理心跳响应
|
||||
this.emit('pong');
|
||||
break;
|
||||
default:
|
||||
this.emit('message', message);
|
||||
break;
|
||||
if (message.type) {
|
||||
switch (message.type) {
|
||||
case 'user-joined':
|
||||
this.emit('user-joined', message.data);
|
||||
break;
|
||||
case 'user-left':
|
||||
this.emit('user-left', message.data);
|
||||
break;
|
||||
case 'media-state-changed':
|
||||
this.emit('media-state-changed', message.data);
|
||||
break;
|
||||
case 'message-received':
|
||||
this.emit('message-received', message.data);
|
||||
break;
|
||||
case 'network-quality':
|
||||
this.emit('network-quality', message.data);
|
||||
break;
|
||||
case 'call-ended':
|
||||
this.emit('call-ended', message.data);
|
||||
break;
|
||||
case 'call-request':
|
||||
this.emit('call-request', message.data);
|
||||
break;
|
||||
case 'ping':
|
||||
// 处理心跳请求,回复pong
|
||||
this.send('pong');
|
||||
break;
|
||||
case 'pong':
|
||||
// 处理心跳响应
|
||||
this.emit('pong');
|
||||
break;
|
||||
case 'offer':
|
||||
this.emit('offer', message.data);
|
||||
break;
|
||||
case 'answer':
|
||||
this.emit('answer', message.data);
|
||||
break;
|
||||
case 'candidate':
|
||||
this.emit('candidate', message.data);
|
||||
break;
|
||||
default:
|
||||
// 处理旧格式消息
|
||||
if (message.event) {
|
||||
this.emit(message.event, message.data);
|
||||
} else {
|
||||
this.emit('message', message);
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else if (message.event) {
|
||||
// 处理旧格式消息
|
||||
this.emit(message.event, message.data);
|
||||
} else {
|
||||
this.emit('message', message);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -150,6 +202,57 @@ class WebSocketManager {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成连接ID
|
||||
* @returns {string} 连接ID
|
||||
*/
|
||||
generateConnectionId() {
|
||||
return 'conn_' + Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送连接消息
|
||||
*/
|
||||
sendConnectMessage() {
|
||||
this.send('connect');
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送断开连接消息
|
||||
*/
|
||||
sendDisconnectMessage() {
|
||||
this.send('disconnect');
|
||||
}
|
||||
|
||||
/**
|
||||
* 启动心跳
|
||||
*/
|
||||
startHeartbeat() {
|
||||
this.heartbeatInterval = setInterval(() => {
|
||||
if (this.isConnected) {
|
||||
this.send('ping');
|
||||
}
|
||||
}, 30000); // 每30秒发送一次心跳
|
||||
}
|
||||
|
||||
/**
|
||||
* 停止心跳
|
||||
*/
|
||||
stopHeartbeat() {
|
||||
if (this.heartbeatInterval) {
|
||||
clearInterval(this.heartbeatInterval);
|
||||
this.heartbeatInterval = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取连接ID
|
||||
* @returns {string} 连接ID
|
||||
*/
|
||||
getConnectionId() {
|
||||
return this.connectionId;
|
||||
}
|
||||
|
||||
/**
|
||||
* 订阅事件
|
||||
* @param {string} event - 事件名称
|
||||
|
||||
Reference in New Issue
Block a user