AskaEth
5717735da9
feat(gateway): M44 实时帧与握手回放挂上 voice(纯增量)
修实根:`message_persisted` / `channel_persisted` 与握手 `history` 回放
此前只在 `toHistoryMessage` 之后直接扇出,于是消息 DTO 的语音面在这三条
面上恒缺席,客户端只能等下一次 REST 拉取才知道那是一条语音。
- `history_voice.go`:把语音补齐抽成存储无关的唯一收口点 `attachVoiceTo`
(Server 与 hub 共用),并加 `voiceColumnsOf` 把任意历史视图窄化成读面,
未实现该视图时为真 nil 接口(字段缺席,不 panic、不 500)。
- `broadcast.go`:新增 `persistedWire` —— thinking 抹除 + 可选 voice,
`broadcastPersisted` 改用它;两类帧因此天然同口径。
- `ws_history.go`:握手回放同样补一次批量读列(最多 50 个 id 一条 SQL)。
成本实测:一帧 = 1 次 `IN (?)` 批量读列(1 个 id);回放一页 = 1 次
(去重后的全部 id);存储未提供该视图时 0 次。`history.Message` 没有
voice 列字段(`messageColumns` 也不含),故无法「零查询直接填」——补它
要改 internal/runtime/history 与 INSERT 写路径,超出本切片范围。
纯增量:voice 是可选键,非语音消息整键缺席(不是 null、不是 {});
帧壳、帧类型、REST DTO 形状一律未动。
测试(广播_voice_test.go):帧序列化输出上断言 ①②③④,并逐字比对
「帧/回放里的 voice」与「REST 读面同一行」;摘掉任一挂载即打红。
2026-10-26 18:46:06 +08:00
..
2026-10-04 19:55:18 +08:00
2026-09-06 04:26:02 +08:00
2026-10-24 20:32:36 +08:00
2026-10-26 13:58:19 +08:00
2026-10-26 13:40:00 +08:00
2026-10-04 10:54:07 +08:00
2026-10-26 13:09:30 +08:00
2026-09-08 21:36:03 +08:00
2026-10-05 13:11:04 +08:00
2026-10-03 15:22:03 +08:00
2026-10-04 12:49:40 +08:00
2026-09-06 04:17:20 +08:00
2026-10-26 14:08:57 +08:00
2026-10-26 18:46:06 +08:00
2026-10-06 18:46:27 +08:00
2026-10-04 12:07:51 +08:00
2026-10-24 19:42:58 +08:00
2026-09-05 23:09:26 +08:00