feat(meeting): Task 15 UI 打磨 + 主持人四件套 + 媒体层稳定性回归修复
- Task 15 UI:6 项原创特色(说话者流光 / 柔性网格 / 自视频浮窗 / 静音氛围色 / 入会滑入 / NetworkBadge 3 条波浪)+ 说话者双源探测(RTP audioLevel + WebAudio RMS)+ 主持人四件套(静音/开麦/转让/踢出) - 新增 SelfVideoFloat 浮窗组件 + 4 份 design-system 页面文档(home / preview / room / invite) - 媒体回归补丁(手工联调触发): * 后端 signal_service 在 OnRoomJoin 追加 pushExistingRoomState → 向新加入者补发历史 producers + 历史成员 audio/video 状态 * 新增 Redis Hash memberStateKey 持久化成员 audio/video enabled,OnMemberStateChanged 落盘、cleanupUserResources 清理 * 前端 _broadcastSelfState 在本地音视频开关末尾同步 state.changed;_afterJoined 先 getRoom 再 room.join 修复后入者成员状态时序;_onMemberStateChanged 占位兜底 * _cleanupRemoteProducer 改为按 producerId 精准清理(修复 "关音频误关视频") * _onRoomEnded + createAndEnter/joinAndEnter 强化 reset(修复重入会看不到自己画面) * mediasoup-client ensureSend/RecvTransport 引入 in-flight Promise 锁防并发重复建连 - 文档同步:CURRENT_STATUS.md / Task 15 plan / phase2e-2 implementation plan Made-with: Cursor
This commit is contained in:
@@ -13,7 +13,21 @@
|
||||
import { BASE_URL } from '@/utils/request'
|
||||
import { getToken } from '@/utils/storage'
|
||||
|
||||
const WS_BASE = BASE_URL.replace(/^http/, 'ws')
|
||||
// WebSocket 基础地址推导:
|
||||
// - 若 BASE_URL 非空(生产 CDN 直连场景),将其协议从 http(s) 替换成 ws(s)
|
||||
// - 若 BASE_URL 为空(开发 vite proxy / 生产同源 Nginx),用当前页面 origin 推导同源 ws(s)
|
||||
// 这样 WebSocket 天然随页面协议走:HTTPS 页面用 wss,HTTP 页面用 ws,避免混合内容被浏览器阻断
|
||||
const resolveWsBase = () => {
|
||||
if (BASE_URL) return BASE_URL.replace(/^http/, 'ws')
|
||||
// #ifdef H5
|
||||
if (typeof window !== 'undefined' && window.location) {
|
||||
const wsProto = window.location.protocol === 'https:' ? 'wss:' : 'ws:'
|
||||
return `${wsProto}//${window.location.host}`
|
||||
}
|
||||
// #endif
|
||||
return ''
|
||||
}
|
||||
const WS_BASE = resolveWsBase()
|
||||
const HEARTBEAT_INTERVAL = 30000
|
||||
const RECONNECT_BASE_DELAY = 1000
|
||||
const RECONNECT_MAX_DELAY = 30000
|
||||
|
||||
Reference in New Issue
Block a user