feat(phase2e-2): 落地 HTTPMediaOrchestrator 打通 Go↔Node 媒体链路(Task 7)

- 新增 MediaServerConfig + config.{dev,docker}.yaml 的 media_server 段
  (base_url / internal_token / timeout_ms / close_timeout_ms / close_retry)
- 新建 HTTPMediaOrchestrator(8 方法 + sync.Map 缓存 roomCode→routerID
  + 关闭类指数退避重试 200/500ms + ErrMediaResourceNotFound/ErrMediaServerError
  两类错误)实现 MediaOrchestrator 接口
- wire 绑定由 NoopMediaOrchestrator 切换到 HTTPMediaOrchestrator;
  MeetingService / MeetingSignalService 调用侧零改动
- E2E 脚本 docs/verify/meeting_t7_verify.mjs 证明 16/16 PASS:
  健康检查/错token 401/REST 创房加入/WS room.join/真实 mediasoup
  transport.create(ICE/DTLS 指纹均由 Node 返回非占位)/404 幂等关 producer
  /host 结束会议触发 CloseRouter
- 同步更新 13 份文档:CURRENT_STATUS / implementation.plan / design
  变更记录 / project-context / api 导览 / api websocket / api frontend meeting
  / system-architecture / media-server README / 顶层 README 等
- go build ./... 全绿

Made-with: Cursor
This commit is contained in:
bujinyuan
2026-04-21 17:47:11 +08:00
parent dfd9b6011c
commit 55d6352c6a
19 changed files with 795 additions and 46 deletions

View File

@@ -1090,6 +1090,7 @@ TabBar 「我的」红点逻辑不变Phase 2e-1 已实现 `unreadTotal > 0`
| 2026-04-21 | Agent | 首版落盘16 章节完整撰写16 章节含 4 mermaid 3 DDL1 REST API 清单11 项关键决策记录 |
| 2026-04-21 | Agent | Task 5 落地偏离记录`meeting_rooms.password` 字段改名为 `password_hash`bcrypt 哈希DAO `GetByID/GetByCode` `ErrRecordNotFound` 统一返回 `(nil, nil)`路径微调 `GET /rooms/mine` + `POST /invite-tokens/:token/redeem``kick` 请求体字段统一为 `user_id`而非 `target_user_id`新增 `MediaOrchestrator` 接口Task 5 Noop 占位Task 7 真实实现WS 广播 Task 5 阶段暂用 `PublishToUser` 循环Task 6 已替换为 `BroadcastToMeeting` |
| 2026-04-21 | Agent | Task 6 落地偏离记录:§6.3 11 事件扩展为 **13 事件**实际 16 含广播回包新增 `meeting.chat`REST 聊天广播+ `meeting.member.producer.new`produce.start / producer.close 的统一广播`meeting.member.mute` + `meeting.member.video` 合并为 `meeting.member.state.changed` `hand_raised` 举手字段 + `target_user_id` host 操作字段 + `actor_id``meeting.produce.stop` 重命名为 `meeting.producer.close``meeting.consume.resume` 暂时不落地Consumer 创建时 `paused=true`前端自己调 `/resume` 内部 REST`meeting.room.info` 不落地REST `/rooms/:code` 已覆盖CS 事件引入白名单常量 `MeetingWSClientEvents` 防伪造新增 Redis 资源追踪 `echo:meeting:resources:{room_id}:{user_id}`Set, TTL 1h用于 WS 断开时自动清理 mediasoup 资源新增 `MeetingBroadcaster` 统一广播层供 REST / WS 共用 |
| 2026-04-21 | Agent | Task 7 落地偏离记录:§6.6 `NodeClient` 文件改名为 `HTTPMediaOrchestrator` Task 6 抽的 `MediaOrchestrator` 接口语义一致接口方法数保持 **8 个**设计列 9 个含 `ResumeConsumer`暂不落地Node REST 已就绪 WS CS 事件未暴露推迟到 Task 9 前端 mediasoup-client 集成时补齐新增错误类型 `ErrMediaResourceNotFound`Node 404 关闭类幂等转 nil `ErrMediaServerError`5xx / 超时 / 网络错替代设计中较泛的 `media_timeout` / `media_server_error` 字符串枚举便于 `errors.Is` 精准区分**`roomCode ↔ routerID` `sync.Map` 本地缓存**设计 §6.6 `CloseRouter(ctx, roomCode)` 入参是 `roomCode` Node `routerID` 为资源主键通过缓存反查达成两端契约融合go-service 重启缓存丢失与 Node 重启 Router 释放的状态自然同步单元测试`httptest.NewServer` 模拟本次未落地"真实 Go + Node + E2E Node.js 脚本 16/16 PASS"替代证据链更强新增配置段 `media_server: {base_url, internal_token, timeout_ms, close_timeout_ms, close_retry}`dev docker 两套 yaml 差异化 base_url遗留项`CreateRoom` `JoinRoom` 重复调 `CreateRouter`Task 8 修复`/transports/:id/stats` Node 未实现Task 10 补齐 |
---