feat(phase2e-2): 前端 mediasoup-client 集成 + Pinia meeting Store(Task 9)

- frontend/src/api/meeting.js:12 个 REST 接口封装,统一 unwrap envelope.data
- frontend/src/services/websocket.js:新增 sendWithAck(Promise 化 + 超时 + 序列号)
- frontend/src/utils/mediasoup-client.js:MediaEngine 包装 Device/Transport/Producer/Consumer
- frontend/src/store/meeting.js:Pinia 会议状态机,桥接 14 个 WS 事件 + cleanupStaleMeetings
- frontend/src/constants/meeting.js:状态枚举 + 事件名集中管理
- frontend/src/pages/meeting/debug.vue:临时调试页(H5 原生 video/audio DOM 绕过 uni 组件限制)
- backend:meeting.consume.resume WS 事件 + create/join 响应透传 router_id + rtp_capabilities
- 文档:frontend/meeting.md、websocket.md、CURRENT_STATUS、plan 全部同步 Task 9 落地

Made-with: Cursor
This commit is contained in:
bujinyuan
2026-04-22 11:22:49 +08:00
parent e7f6a32dfe
commit f97fec24a8
22 changed files with 2314 additions and 60 deletions

View File

@@ -1,5 +1,7 @@
package dto
import "encoding/json"
// ====== 会议模块基础 DTOPhase 2e-2======
// MeetingRoomDTO 会议房间传输对象
@@ -66,8 +68,11 @@ type CreateMeetingRoomRequest struct {
}
// CreateMeetingRoomResponse 创建会议响应
// Task 9 起返回 router_id + rtp_capabilities便于前端创建会议后立即 Device.load
type CreateMeetingRoomResponse struct {
Room MeetingRoomDTO `json:"room"`
Room MeetingRoomDTO `json:"room"`
RouterID string `json:"router_id,omitempty"`
RtpCapabilities json.RawMessage `json:"rtp_capabilities,omitempty"`
}
// JoinMeetingRoomRequest 加入会议请求
@@ -78,9 +83,10 @@ type JoinMeetingRoomRequest struct {
// JoinMeetingRoomResponse 加入会议响应
type JoinMeetingRoomResponse struct {
Room MeetingRoomDTO `json:"room"`
Participant MeetingParticipantDTO `json:"participant"`
RouterID string `json:"router_id,omitempty"` // mediasoup Router IDTask 7 接入 Node 后填充)
Room MeetingRoomDTO `json:"room"`
Participant MeetingParticipantDTO `json:"participant"`
RouterID string `json:"router_id,omitempty"` // mediasoup Router IDTask 7 接入 Node 后填充)
RtpCapabilities json.RawMessage `json:"rtp_capabilities,omitempty"` // Router RTP 能力Task 9前端 mediasoup-client Device.load 直接使用
}
// LeaveMeetingRoomResponse 离开会议响应