mirror of
https://github.com/MatrixSeven/file-transfer-go.git
synced 2026-05-13 14:47:31 +08:00
feat: 优化文件传输逻辑,添加断开连接回调和清除发送方数据功能
- 使用更宽松的条件检查连接状态,确保文件列表和文件请求的发送时机 - 添加清除发送方数据的逻辑,当接收方离开房间时重置文件传输状态 - 在文件传输业务中设置断开连接回调,确保在连接断开时清理相关数据 - 更新数据通道和P2P连接状态的处理,增强连接状态的监控和反馈
This commit is contained in:
@@ -12,6 +12,8 @@ export function useWebRTCDataChannelManager(
|
||||
stateManager: IWebConnectStateManager
|
||||
): WebRTCDataChannelManager & IRegisterEventHandler {
|
||||
const dcRef = useRef<RTCDataChannel | null>(null);
|
||||
const stateManagerRef = useRef(stateManager);
|
||||
stateManagerRef.current = stateManager;
|
||||
|
||||
// 多通道消息处理器
|
||||
const messageHandlers = useRef<Map<string, MessageHandler>>(new Map());
|
||||
@@ -41,16 +43,17 @@ export function useWebRTCDataChannelManager(
|
||||
});
|
||||
dcRef.current = dataChannel;
|
||||
|
||||
dataChannel.onopen = () => {
|
||||
dataChannel.onopen = (event) => {
|
||||
console.log('[DataChannelManager] 数据通道已打开 (发送方)');
|
||||
// 确保所有连接状态都正确更新
|
||||
stateManager.updateState({
|
||||
stateManagerRef.current.updateState({
|
||||
isDataChannelConnected: true,
|
||||
isConnected: true,
|
||||
isPeerConnected: true,
|
||||
error: null,
|
||||
isConnecting: false,
|
||||
canRetry: false
|
||||
canRetry: false,
|
||||
state: 'open'
|
||||
});
|
||||
|
||||
// 如果是重新连接,触发数据同步
|
||||
@@ -113,7 +116,7 @@ export function useWebRTCDataChannelManager(
|
||||
|
||||
console.error(`[DataChannelManager] 数据通道详细错误 - 状态: ${dataChannel.readyState}, 消息: ${errorMessage}, 建议重试: ${shouldRetry}`);
|
||||
|
||||
stateManager.updateState({
|
||||
stateManagerRef.current.updateState({
|
||||
error: errorMessage,
|
||||
isConnecting: false,
|
||||
isPeerConnected: false, // 数据通道出错时,P2P连接肯定不可用
|
||||
@@ -126,17 +129,18 @@ export function useWebRTCDataChannelManager(
|
||||
const dataChannel = event.channel;
|
||||
dcRef.current = dataChannel;
|
||||
|
||||
dataChannel.onopen = () => {
|
||||
dataChannel.onopen = (event) => {
|
||||
console.log('[DataChannelManager] 数据通道已打开 (接收方)');
|
||||
// 确保所有连接状态都正确更新
|
||||
stateManager.updateState({
|
||||
stateManagerRef.current.updateState({
|
||||
isWebSocketConnected: true,
|
||||
isDataChannelConnected: true,
|
||||
isConnected: true,
|
||||
isPeerConnected: true,
|
||||
error: null,
|
||||
isConnecting: false,
|
||||
canRetry: false
|
||||
canRetry: false,
|
||||
state: 'open'
|
||||
});
|
||||
|
||||
// 如果是重新连接,触发数据同步
|
||||
@@ -198,7 +202,7 @@ export function useWebRTCDataChannelManager(
|
||||
|
||||
console.error(`[DataChannelManager] 数据通道详细错误 (接收方) - 状态: ${dataChannel.readyState}, 消息: ${errorMessage}, 建议重试: ${shouldRetry}`);
|
||||
|
||||
stateManager.updateState({
|
||||
stateManagerRef.current.updateState({
|
||||
error: errorMessage,
|
||||
isConnecting: false,
|
||||
isPeerConnected: false, // 数据通道出错时,P2P连接肯定不可用
|
||||
@@ -313,12 +317,59 @@ export function useWebRTCDataChannelManager(
|
||||
|
||||
// 获取数据通道状态
|
||||
const getChannelState = useCallback(() => {
|
||||
return stateManager.getState();
|
||||
return stateManagerRef.current.getState();
|
||||
}, []);
|
||||
|
||||
// 实时更新数据通道状态
|
||||
useEffect(() => {
|
||||
stateManager.updateState({ state: dcRef.current?.readyState || 'closed' });
|
||||
}, [dcRef.current?.readyState]);
|
||||
const updateChannelState = () => {
|
||||
const readyState = dcRef.current?.readyState || 'closed';
|
||||
console.log('[DataChannelManager] 数据通道状态更新:', readyState);
|
||||
|
||||
// 更新状态存储中的数据通道状态
|
||||
stateManagerRef.current.updateState({
|
||||
state: readyState,
|
||||
isDataChannelConnected: readyState === 'open'
|
||||
});
|
||||
};
|
||||
|
||||
// 立即更新一次
|
||||
updateChannelState();
|
||||
|
||||
// 如果数据通道存在,设置状态变化监听
|
||||
if (dcRef.current) {
|
||||
const dc = dcRef.current;
|
||||
const originalOnOpen = dc.onopen;
|
||||
const originalOnClose = dc.onclose;
|
||||
const originalOnError = dc.onerror;
|
||||
|
||||
dc.onopen = (event) => {
|
||||
console.log('[DataChannelManager] 数据通道打开事件触发');
|
||||
updateChannelState();
|
||||
if (originalOnOpen) originalOnOpen.call(dc, event);
|
||||
};
|
||||
|
||||
dc.onclose = (event) => {
|
||||
console.log('[DataChannelManager] 数据通道关闭事件触发');
|
||||
updateChannelState();
|
||||
if (originalOnClose) originalOnClose.call(dc, event);
|
||||
};
|
||||
|
||||
dc.onerror = (error) => {
|
||||
console.log('[DataChannelManager] 数据通道错误事件触发');
|
||||
updateChannelState();
|
||||
if (originalOnError) originalOnError.call(dc, error);
|
||||
};
|
||||
}
|
||||
|
||||
// 清理函数
|
||||
return () => {
|
||||
if (dcRef.current) {
|
||||
// 恢复原始事件处理器
|
||||
// 注意:在实际应用中,可能需要更复杂的事件处理器管理
|
||||
}
|
||||
};
|
||||
}, []);
|
||||
|
||||
return {
|
||||
createDataChannel,
|
||||
|
||||
Reference in New Issue
Block a user