🐛 修復 websocket

This commit is contained in:
Minidoracat 2025-06-06 22:43:05 +08:00
parent 466dcffaa9
commit 462ed934a3
3 changed files with 66 additions and 20 deletions

View File

@ -133,14 +133,25 @@ class WebUIManager:
debug_log(f"創建新的活躍會話: {session_id}") debug_log(f"創建新的活躍會話: {session_id}")
debug_log(f"繼承 {len(session.active_tabs)} 個活躍標籤頁") debug_log(f"繼承 {len(session.active_tabs)} 個活躍標籤頁")
# 如果有舊的 WebSocket 連接,立即發送會話更新通知 # 處理會話更新通知
if old_websocket: if old_websocket:
# 有舊連接,立即發送會話更新通知
self._old_websocket_for_update = old_websocket self._old_websocket_for_update = old_websocket
self._new_session_for_update = session self._new_session_for_update = session
debug_log("已保存舊 WebSocket 連接,準備發送會話更新通知") debug_log("已保存舊 WebSocket 連接,準備發送會話更新通知")
# 立即發送會話更新通知
import asyncio
try:
# 在後台任務中發送通知
asyncio.create_task(self._send_immediate_session_update())
except Exception as e:
debug_log(f"創建會話更新任務失敗: {e}")
self._pending_session_update = True
else: else:
# 標記需要發送會話更新通知(當新 WebSocket 連接建立時) # 沒有舊連接,標記需要發送會話更新通知(當新 WebSocket 連接建立時)
self._pending_session_update = True self._pending_session_update = True
debug_log("沒有舊 WebSocket 連接,設置待更新標記")
return session_id return session_id
@ -310,19 +321,27 @@ class WebUIManager:
async def notify_session_update(self, session): async def notify_session_update(self, session):
"""向活躍標籤頁發送會話更新通知""" """向活躍標籤頁發送會話更新通知"""
try: try:
# 向所有活躍的 WebSocket 連接發送會話更新通知 # 檢查是否有活躍的 WebSocket 連接
await self.broadcast_to_active_tabs({ if session.websocket:
"type": "session_updated", # 直接通過當前會話的 WebSocket 發送
"message": "新會話已創建,正在更新頁面內容", await session.websocket.send_json({
"session_info": { "type": "session_updated",
"project_directory": session.project_directory, "message": "新會話已創建,正在更新頁面內容",
"summary": session.summary, "session_info": {
"session_id": session.session_id "project_directory": session.project_directory,
} "summary": session.summary,
}) "session_id": session.session_id
debug_log("會話更新通知已發送到所有活躍標籤頁") }
})
debug_log("會話更新通知已通過 WebSocket 發送")
else:
# 沒有活躍連接,設置待更新標記
self._pending_session_update = True
debug_log("沒有活躍 WebSocket 連接,設置待更新標記")
except Exception as e: except Exception as e:
debug_log(f"發送會話更新通知失敗: {e}") debug_log(f"發送會話更新通知失敗: {e}")
# 設置待更新標記作為備用方案
self._pending_session_update = True
async def _send_immediate_session_update(self): async def _send_immediate_session_update(self):
"""立即發送會話更新通知(使用舊的 WebSocket 連接)""" """立即發送會話更新通知(使用舊的 WebSocket 連接)"""

View File

@ -170,6 +170,7 @@ def setup_routes(manager: 'WebUIManager'):
# 檢查是否有待發送的會話更新 # 檢查是否有待發送的會話更新
if getattr(manager, '_pending_session_update', False): if getattr(manager, '_pending_session_update', False):
debug_log("檢測到待發送的會話更新,準備發送通知")
await websocket.send_json({ await websocket.send_json({
"type": "session_updated", "type": "session_updated",
"message": "新會話已創建,正在更新頁面內容", "message": "新會話已創建,正在更新頁面內容",
@ -180,7 +181,14 @@ def setup_routes(manager: 'WebUIManager'):
} }
}) })
manager._pending_session_update = False manager._pending_session_update = False
debug_log("已發送會話更新通知到前端") debug_log("✅ 已發送會話更新通知到前端")
else:
# 發送當前會話狀態
await websocket.send_json({
"type": "status_update",
"status_info": session.get_status_info()
})
debug_log("已發送當前會話狀態到前端")
except Exception as e: except Exception as e:
debug_log(f"發送連接確認失敗: {e}") debug_log(f"發送連接確認失敗: {e}")

View File

@ -968,11 +968,20 @@ class FeedbackApp {
this.updateConnectionStatus('connected', '已連接'); this.updateConnectionStatus('connected', '已連接');
console.log('WebSocket 連接已建立'); console.log('WebSocket 連接已建立');
// 重置重連計數器
this.reconnectAttempts = 0;
// 開始 WebSocket 心跳 // 開始 WebSocket 心跳
this.startWebSocketHeartbeat(); this.startWebSocketHeartbeat();
// 連接成功後,請求會話狀態 // 連接成功後,請求會話狀態
this.requestSessionStatus(); this.requestSessionStatus();
// 如果之前處於處理狀態但連接斷開,重置為等待狀態
if (this.feedbackState === 'processing') {
console.log('🔄 WebSocket 重連後重置處理狀態');
this.setFeedbackState('waiting_for_feedback');
}
}; };
this.websocket.onmessage = (event) => { this.websocket.onmessage = (event) => {
@ -1004,12 +1013,17 @@ class FeedbackApp {
this.updateConnectionStatus('disconnected', '已斷開'); this.updateConnectionStatus('disconnected', '已斷開');
// 只有在非正常關閉時才重連 // 只有在非正常關閉時才重連
if (event.code !== 1000) { if (event.code !== 1000 && this.reconnectAttempts < this.maxReconnectAttempts) {
console.log('3秒後嘗試重連...'); this.reconnectAttempts++;
const delay = Math.min(3000 * this.reconnectAttempts, 15000); // 最大延遲15秒
console.log(`${delay/1000}秒後嘗試重連... (第${this.reconnectAttempts}次)`);
setTimeout(() => { setTimeout(() => {
console.log('🔄 開始重連 WebSocket...'); console.log(`🔄 開始重連 WebSocket... (第${this.reconnectAttempts}次)`);
this.setupWebSocket(); this.setupWebSocket();
}, 3000); }, delay);
} else if (this.reconnectAttempts >= this.maxReconnectAttempts) {
console.log('❌ 達到最大重連次數,停止重連');
this.showMessage('WebSocket 連接失敗,請刷新頁面重試', 'error');
} }
} }
}; };
@ -1089,7 +1103,7 @@ class FeedbackApp {
this.handleStatusUpdate(data.status_info); this.handleStatusUpdate(data.status_info);
break; break;
case 'session_updated': case 'session_updated':
console.log('會話更新:', data.session_info); console.log('🔄 收到會話更新消息:', data.session_info);
this.handleSessionUpdated(data); this.handleSessionUpdated(data);
break; break;
default: default:
@ -1158,8 +1172,13 @@ class FeedbackApp {
// 使用局部更新替代整頁刷新 // 使用局部更新替代整頁刷新
await this.updatePageContentPartially(); await this.updatePageContentPartially();
// 確保 UI 狀態正確更新
this.updateUIState();
console.log('✅ 頁面內容局部更新完成');
} catch (error) { } catch (error) {
console.error('局部更新頁面內容失敗:', error); console.error('局部更新頁面內容失敗:', error);
// 備用方案:顯示提示讓用戶手動刷新 // 備用方案:顯示提示讓用戶手動刷新
this.showMessage('更新內容失敗,請手動刷新頁面以查看新的 AI 工作摘要', 'warning'); this.showMessage('更新內容失敗,請手動刷新頁面以查看新的 AI 工作摘要', 'warning');
} }