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

@@ -114,6 +114,7 @@ const (
MeetingWSEventTransportConnect = "meeting.transport.connect" // C→S→NodeTransport DTLS 握手
MeetingWSEventProduceStart = "meeting.produce.start" // C→S→Node创建 Producer广播 producer.new
MeetingWSEventConsumeStart = "meeting.consume.start" // C→S→Node订阅远端 Producer创建本地 Consumer
MeetingWSEventConsumeResume = "meeting.consume.resume" // C→S→NodeConsumer 订阅后由前端 track 挂载就绪再 resume防止首帧丢失Task 9 引入)
MeetingWSEventProducerClose = "meeting.producer.close" // C→S→Node关闭自己的 Producer推流停止
// ====== 补充事件(非 §6.3 核心 11 事件,但业务必须)======
@@ -130,5 +131,6 @@ var MeetingWSClientEvents = []string{
MeetingWSEventTransportConnect,
MeetingWSEventProduceStart,
MeetingWSEventConsumeStart,
MeetingWSEventConsumeResume,
MeetingWSEventProducerClose,
}