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:
@@ -158,10 +158,13 @@ func (ctl *MeetingController) CreateRoom(c *gin.Context) {
|
||||
ctl.handleError(c, err, "创建会议失败")
|
||||
return
|
||||
}
|
||||
// Task 9:CreateRoom 响应携带 router_id + rtpCapabilities,供前端 Device.load 使用
|
||||
_, rtpCaps, _ := ctl.meetingService.ResolveRouterInfo(room.RoomCode)
|
||||
resp := dto.CreateMeetingRoomResponse{
|
||||
Room: *roomToDTO(room, 1),
|
||||
Room: *roomToDTO(room, 1),
|
||||
RouterID: routerID,
|
||||
RtpCapabilities: rtpCaps,
|
||||
}
|
||||
_ = routerID // 当前 Noop 返回占位 RouterID,Task 7 后可拼入响应供前端订阅使用
|
||||
utils.ResponseCreated(c, resp)
|
||||
}
|
||||
|
||||
@@ -214,10 +217,13 @@ func (ctl *MeetingController) JoinRoom(c *gin.Context) {
|
||||
ctl.handleError(c, err, "加入会议失败")
|
||||
return
|
||||
}
|
||||
// Task 9:JoinRoom 响应携带 rtpCapabilities,供前端 mediasoup-client Device.load 直接使用
|
||||
_, rtpCaps, _ := ctl.meetingService.ResolveRouterInfo(code)
|
||||
resp := dto.JoinMeetingRoomResponse{
|
||||
Room: *roomToDTO(room, 0),
|
||||
Participant: *participantToDTO(participant),
|
||||
RouterID: routerID,
|
||||
Room: *roomToDTO(room, 0),
|
||||
Participant: *participantToDTO(participant),
|
||||
RouterID: routerID,
|
||||
RtpCapabilities: rtpCaps,
|
||||
}
|
||||
utils.ResponseOK(c, resp)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user