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

@@ -217,18 +217,19 @@
| 6 | C→S | `meeting.produce.start` | 创建 Producer |
| 7 | C→S | `meeting.consume.start` | 创建 Consumer |
| 8 | C→S | `meeting.producer.close` | 关闭自己的 Producer |
| 9 | S→C | `meeting.member.joined` | 新成员加入广播REST /join 触发|
| 10 | S→C | `meeting.member.left` | 成员离开广播REST /leave /kick 或 WS 资源清理|
| 11 | S→C | `meeting.member.kicked` | 定向通知被踢者 |
| 12 | S→C | `meeting.host.changed` | 主持人变更 |
| 13 | S→C | `meeting.room.ended` | 会议被结束 |
| 14 | S→C | `meeting.member.state.changed` | 成员状态变化广播 |
| 15 | S→C | `meeting.member.producer.new` | 成员开启/关闭媒体流(`closed=true` 表示关闭)|
| 16 | S→C | `meeting.chat` | 会议内聊天REST /chats 触发|
| 9 | C→S | `meeting.consume.resume` | 客户端完成 track 挂载后请求 resume ConsumerTask 9 新增,不广播|
| 10 | S→C | `meeting.member.joined` | 成员加入广播REST /join 触发|
| 11 | S→C | `meeting.member.left` | 成员离开广播REST /leave /kick 或 WS 资源清理)|
| 12 | S→C | `meeting.member.kicked` | 定向通知被踢者 |
| 13 | S→C | `meeting.host.changed` | 主持人变更 |
| 14 | S→C | `meeting.room.ended` | 会议被结束 |
| 15 | S→C | `meeting.member.state.changed` | 成员状态变化广播 |
| 16 | S→C | `meeting.member.producer.new` | 成员开启/关闭媒体流(`closed=true` 表示关闭|
| 17 | S→C | `meeting.chat` | 会议内聊天REST /chats 触发)|
### 协议约定
- **C→S 白名单**:客户端仅可发起上表 C→S 列的 8 个事件,其余 `meeting.*` 事件若由客户端发送被静默丢弃。
- **C→S 白名单**:客户端仅可发起上表 C→S 列的 9 个事件Task 9 扩到 9,其余 `meeting.*` 事件若由客户端发送被静默丢弃。
- **ACK 规则**:每个 C→S 事件服务端必回 `<event>.ack`;成功 `code=0`,业务失败 `code=-1` + 中文 `message`(与 REST 领域错误口径一致)。
- **错误码示例**`会议不存在` / `你当前未在会议中` / `仅主持人可执行此操作` / `会议已结束`
- **资源追踪**:服务端对每用户在每会议的 transport/producer/consumer 用 Redis Set `echo:meeting:resources:{room_id}:{user_id}` 记录WS 断开或 `room.leave` 时自动清理。