docs(phase2e-2): 同步 Task 5/6 落地到总 API 索引 + 总 WS 协议 + 设计文档变更记录

- docs/api/README.md:frontend/meeting.md 状态从"📋 设计阶段"升为" Task 5/6",
  补全 12 REST + 13 WS 事件描述;目录结构表 meeting.md/notify.md 同步标记完成
- docs/api/websocket.md:会议信令章节从设计阶段草稿重写为事件总览表 + SSOT 引用
  (移除与 Task 6 实际实现不一致的旧事件名 meeting.member.mute/video/produce.stop
  /room.info/consume.resume;明确 C→S 白名单与 ACK/资源追踪约定)
- docs/plans/2026-04-21-phase2e-2-design.md:§十六 变更记录追加 Task 5 + Task 6
  两条偏离说明,完整记录事件合并/重命名/白名单/Redis 资源追踪等实施级决策

Made-with: Cursor
This commit is contained in:
bujinyuan
2026-04-21 17:14:14 +08:00
parent 096563d3ea
commit dfd9b6011c
3 changed files with 34 additions and 164 deletions

View File

@@ -17,7 +17,7 @@
| [frontend/websocket.md](frontend/websocket.md) | WebSocket | ✅ Phase 2a | 前端 WebSocket 连接管理、事件协议、心跳、重连 |
| [frontend/im.md](frontend/im.md) | 即时通讯 | ✅ Phase 2b | 7 个 API会话列表/置顶/删除/清空、历史消息、全局搜索、未读数 |
| [frontend/group.md](frontend/group.md) | 群聊管理 | ✅ Phase 2c | 16 个 API建群/管理/成员/角色/禁言/公告/搜索/入群审批 |
| [frontend/meeting.md](frontend/meeting.md) | 会议 | 📋 Phase 2e-2 设计阶段 | 当前为总设计占位版本;最终 API 清单将由 Phase 2e-2 Task 5 产出(共 12 接口,含创建/加入/离开/结束/详情/列表/邀请/踢人/转让主持人/发起聊天/拉聊天历史/邀请链接兑换)。详见设计文档 `docs/plans/2026-04-21-phase2e-2-design.md` §6.2 |
| [frontend/meeting.md](frontend/meeting.md) | 会议 | ✅ Phase 2e-2 Task 5/6 | 12 个 REST 接口(创建/加入/离开/结束/详情/列表/邀请/踢人/转让主持人/发起聊天/拉聊天历史/邀请链接兑换)+ 13 个 WebSocket 信令事件8 C→S + 5 核心 S→C 广播 + 会议内聊天/被踢定向推送Redis 媒体资源追踪 + host 权限校验 |
| [frontend/notify.md](frontend/notify.md) | 通知中心 | ✅ Phase 2e-1 | 5 个 API通知列表游标分页/未读数/标记已读/全部已读/管理员广播 + 2 个 WS 事件notify.new/notify.unread.total |
### 后台管理端 (`admin/`)
@@ -199,8 +199,8 @@ docs/api/
│ ├── websocket.md # WebSocket 事件协议 ✅ Phase 2a
│ ├── im.md # 即时通讯8 个 API ✅ Phase 2b/2c
│ ├── group.md # 群聊管理16 个 API ✅ Phase 2c
│ ├── meeting.md # 会议 📋 后续
│ └── notify.md # 通知 📋 后续
│ ├── meeting.md # 会议12 REST + 13 WS 事件) ✅ Phase 2e-2 (Task 5/6)
│ └── notify.md # 通知5 API + 2 WS 事件) ✅ Phase 2e-1
├── admin/ # 后台管理端 API
│ ├── auth.md # 管理员认证 ✅ Phase 1
│ ├── user.md # 用户管理 ✅ Phase 1

View File

@@ -203,167 +203,35 @@
---
## 会议信令事件
### meeting.room.join
**方向:** 客户端 → 服务端
**说明:** 加入会议房间
**data 参数:** `{ "room_code": "123-456-789" }`
**ACK 响应 data** 房间信息、参与者列表、RTP Capabilities
---
### meeting.room.leave
**方向:** 客户端 → 服务端
**说明:** 离开会议房间
**data 参数:** `{ "room_code": "123-456-789" }`
---
### meeting.room.info
**方向:** 服务端 → 客户端
**说明:** 房间信息同步(成员变更、设置变更时推送)
---
### meeting.member.join
**方向:** 服务端 → 客户端(广播)
**说明:** 有新成员加入会议
**data 内容:**
```json
{
"room_code": "123-456-789",
"user_id": 3,
"nickname": "王五",
"avatar": "https://...",
"role": 0
}
```
---
### meeting.member.leave
**方向:** 服务端 → 客户端(广播)
**说明:** 有成员离开会议
**data 内容:** `{ "room_code": "...", "user_id": 3 }`
---
### meeting.member.mute
**方向:** 双向
**说明:** 静音/解除静音
**data 内容:** `{ "room_code": "...", "user_id": 1, "muted": true }`
---
### meeting.member.video
**方向:** 双向
**说明:** 开关摄像头
**data 内容:** `{ "room_code": "...", "user_id": 1, "video_enabled": false }`
---
## mediasoup 信令事件
### meeting.transport.create
**方向:** 客户端 → 服务端
**说明:** 请求创建 WebRTC Transport发送端或接收端
**data 参数:** `{ "room_code": "...", "direction": "send" }``"recv"`
**ACK 响应 data** Transport 参数id, iceParameters, iceCandidates, dtlsParameters
---
### meeting.transport.connect
**方向:** 客户端 → 服务端
**说明:** 完成 Transport DTLS 握手
**data 参数:** `{ "transport_id": "...", "dtls_parameters": { ... } }`
---
### meeting.produce.start
**方向:** 客户端 → 服务端
**说明:** 开始推流(音频或视频)
**data 参数:**
```json
{
"transport_id": "...",
"kind": "video",
"rtp_parameters": { ... }
}
```
**ACK 响应 data** `{ "producer_id": "..." }`
---
### meeting.produce.stop
**方向:** 客户端 → 服务端
**说明:** 停止推流
**data 参数:** `{ "producer_id": "..." }`
---
### meeting.consume.start
**方向:** 服务端 → 客户端
**说明:** 通知客户端可以开始接收某个参与者的流
**data 内容:**
```json
{
"consumer_id": "...",
"producer_id": "...",
"kind": "video",
"rtp_parameters": { ... },
"user_id": 3,
"nickname": "王五"
}
```
---
### meeting.consume.resume
**方向:** 客户端 → 服务端
**说明:** 恢复被暂停的 Consumer
**data 参数:** `{ "consumer_id": "..." }`
## 会议信令事件Phase 2e-2 Task 6 已落地)
> **SSOT**:会议相关的全部 WS 事件详细契约(请求/ACK/广播载荷、权限、错误处理、资源追踪)见 [`docs/api/frontend/meeting.md`](./frontend/meeting.md) §WebSocket 信令协议。本节仅列事件总览。
| # | 方向 | 事件 | 用途 |
|---|------|------|------|
| 1 | C→S | `meeting.room.join` | 声明加入会议 WS 频道(需已在 REST 层完成 `/join`|
| 2 | C→S | `meeting.room.leave` | 离开 WS 频道并清理媒体资源(不改 participant 表)|
| 3 | C→S | `meeting.member.state.changed` | 更新自己的 audio/video/hand_raisedhost 可指定 `target_user_id` 强制静音他人 |
| 4 | C→S | `meeting.transport.create` | 创建 mediasoup WebRtcTransport`direction: send/recv`|
| 5 | C→S | `meeting.transport.connect` | 提交 DTLS Parameters |
| 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 触发)|
### 协议约定
- **C→S 白名单**:客户端仅可发起上表 C→S 列的 8 个事件,其余 `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` 时自动清理。
---