From 467135e0d529772b23dc1f8d1631112d0489ff30 Mon Sep 17 00:00:00 2001 From: bujinyuan Date: Wed, 22 Apr 2026 14:08:07 +0800 Subject: [PATCH] =?UTF-8?q?feat(phase2e-2):=20WS=20=E7=A8=B3=E5=AE=9A?= =?UTF-8?q?=E6=80=A7=E6=94=B9=E8=BF=9B=E2=80=94=E2=80=94=E9=87=8D=E8=BF=9E?= =?UTF-8?q?=E5=90=8E=E8=87=AA=E5=8A=A8=E9=87=8D=E7=BB=91=E5=AE=9A=E6=88=BF?= =?UTF-8?q?=E9=97=B4=20+=20=E5=A4=9A=E7=AB=AF=E7=99=BB=E5=BD=95=E6=8A=96?= =?UTF-8?q?=E5=8A=A8=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 背景 - Task 9 联调发现同账号多 tab 登录会触发后端单设备踢下线机制,WS 每秒被关闭一次, 所有 meeting.* 的 sendWithAck 都因 "连接已断开" 而失败,表现为"开启音视频提示失败" - 同时 WS 断线重连后后端对该连接的 roomCode 绑定丢失,会议广播不再送达本端 改动 - store/meeting.js:_registerListeners 增加 WS 生命周期监听 - _disconnected:从 CONNECTED/CONNECTING 切到 RECONNECTING,UI 可展示"重连中…" - _connected:在 RECONNECTING 状态自动重发 meeting.room.join 重绑定房间,并刷新参与者列表 - services/websocket.js:_recordCloseForFlapping 做 10s 滑窗 flapping 检测 - 窗口内累计 >=3 次非主动断连 → 触发 _flapping 事件(含 count/windowMs) - 15s 冷却避免抖动期间重复告警 - debug.vue:新增 WS 状态指示灯(已连接/重连中/已断)+ flapping 警告横幅 - 订阅 _connected / _disconnected / _flapping 三个 WS 内置事件,onBeforeUnmount 注销 验证(Playwright) - 单次断连:testuser1 创建会议后手动 close WS → 指示灯 reconnecting,1s 后重连 - 日志链 "WS 已断开 → 进入 reconnecting → 连接成功 → 重绑定房间 307-857-909 → 恢复 connected" 全通 - 4 次连续断连:第 3 次触发 flapping,UI 横幅 "⚠ 检测到异常重连(3 次/10s),可能同账号在其他端登录" - 每次断连后房号、主持人状态、localState 均正确恢复为 connected Made-with: Cursor --- frontend/src/pages/meeting/debug.vue | 67 +++++++++++++++++++++++++++- frontend/src/services/websocket.js | 29 +++++++++++- frontend/src/store/meeting.js | 50 ++++++++++++++++++++- 3 files changed, 143 insertions(+), 3 deletions(-) diff --git a/frontend/src/pages/meeting/debug.vue b/frontend/src/pages/meeting/debug.vue index fed8af4..31dc69a 100644 --- a/frontend/src/pages/meeting/debug.vue +++ b/frontend/src/pages/meeting/debug.vue @@ -15,6 +15,11 @@ 会议调试(Task 9) + + + {{ wsStatusLabel }} + ⚠ 检测到异常重连({{ wsFlapCount }} 次/{{ Math.round(wsFlapWindowMs / 1000) }}s),可能同账号在其他端登录 + 状态:{{ localStateLabel }} 房号:{{ currentRoom?.room_code || '-' }} ({{ currentRoom?.title || '-' }}) 是否主持人:{{ isHost ? '是' : '否' }} @@ -83,9 +88,10 @@