feat: 优化文件传输逻辑,添加断开连接回调和清除发送方数据功能

- 使用更宽松的条件检查连接状态,确保文件列表和文件请求的发送时机
- 添加清除发送方数据的逻辑,当接收方离开房间时重置文件传输状态
- 在文件传输业务中设置断开连接回调,确保在连接断开时清理相关数据
- 更新数据通道和P2P连接状态的处理,增强连接状态的监控和反馈
This commit is contained in:
MatrixSeven
2025-09-15 19:39:57 +08:00
parent 550be8bcc6
commit 15d23de5a7
10 changed files with 397 additions and 110 deletions

View File

@@ -9,11 +9,14 @@ import { ConnectType, DataHandler, IWebConnection, IWebMessage, MessageHandler,
export function useWebSocketConnection(): IWebConnection {
const wsRef = useRef<WebSocket | null>(null);
const currentRoomRef = useRef<{ code: string; role: Role } | null>(null);
// 事件处理器存储
const messageHandlers = useRef<Map<string, MessageHandler>>(new Map());
const dataHandlers = useRef<Map<string, DataHandler>>(new Map());
// 断开连接回调
const onDisconnectCallback = useRef<(() => void) | null>(null);
// 连接状态
const connectionState = useRef<WebConnectState>({
isConnected: false,
@@ -52,9 +55,9 @@ export function useWebSocketConnection(): IWebConnection {
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
const host = window.location.host;
const wsUrl = `${protocol}//${host}/api/ws/${roomCode}?role=${role}`;
console.log('[WebSocket] 连接到:', wsUrl);
const ws = new WebSocket(wsUrl);
wsRef.current = ws;
@@ -97,6 +100,12 @@ export function useWebSocketConnection(): IWebConnection {
error: event.wasClean ? null : 'WebSocket 连接意外断开',
canRetry: !event.wasClean
});
// 调用断开连接回调
if (onDisconnectCallback.current) {
console.log('[WebSocket] 调用断开连接回调');
onDisconnectCallback.current();
}
};
} catch (error) {
@@ -132,7 +141,7 @@ export function useWebSocketConnection(): IWebConnection {
} else if (event.data instanceof ArrayBuffer) {
// 二进制数据
console.log('[WebSocket] 收到二进制数据:', event.data.byteLength, 'bytes');
// 优先发给文件传输处理器
const fileHandler = dataHandlers.current.get('file-transfer');
if (fileHandler) {
@@ -242,8 +251,8 @@ export function useWebSocketConnection(): IWebConnection {
// 检查是否连接到指定房间
const isConnectedToRoom = useCallback((roomCode: string, role: Role) => {
return currentRoomRef.current?.code === roomCode &&
currentRoomRef.current?.role === role &&
connectionState.current.isConnected;
currentRoomRef.current?.role === role &&
connectionState.current.isConnected;
}, []);
// 媒体轨道方法WebSocket 不支持,返回 null
@@ -270,6 +279,11 @@ export function useWebSocketConnection(): IWebConnection {
return false;
}, []);
// 设置断开连接回调
const setOnDisconnectCallback = useCallback((callback: () => void) => {
onDisconnectCallback.current = callback;
}, []);
// 清理连接
useEffect(() => {
return () => {
@@ -294,5 +308,6 @@ export function useWebSocketConnection(): IWebConnection {
onTrack,
getPeerConnection,
createOfferNow,
setOnDisconnectCallback,
};
}