AskaEth
b955a27479
fix(channelbridge): M44 入站语音先写 voice 列再广播 ⇒ 首帧就带 voice
安卓 2026-10-26 回执关心的场景:新来一条语音消息时,**第一条**帧里有没有
`voice`。此前没有 —— `persistBatchUsers` 先 `persistToMain`/`persistIsolated`
(内部同步 notify 把帧发出去),之后才 `persistMessageVoice` 写列,帧发出那
一刻列还是空串。网关侧的帧投影(上一 commit)读的就是这一列,因此首帧必然
缺 voice,客户端要等重连或下一次 REST 拉取。
修法(A 路的唯一可行形态,理由见下):
- `persistBatchUsers` 的通知改成 `persistVoiceFirstNotify(ref)`:
**INSERT → 写 voice 列 → notify**。语句数不变,只把 notify 从 INSERT 内部
挪到最后;非语音消息(ref 零值)时该包装与 `notifyPersisted` 逐字等价。
- `persist.go` 抽出 `mainRow` / `isolatedRow`(字段清单只写一次)与
`persistIsolatedWith`(可注入通知的变体),`persistToMain`/
`persistIsolated` 的对外行为逐字不变。
为什么不走 B(给 `history.Message` 加 voice 随 INSERT 写):`persistMessageVoice`
是按 id 的 UPDATE,行还不存在时必然 `ErrMessageNotFound` ⇒ 写列**不可能**真正
挪到 INSERT 之前;可行的最小形态就是上面那次换序,无需动 domain 类型、列清单
与 7 条读语句。B 若要做,属于 design/24 §10.5 的独立切片(那时还应删掉这里的
两段式,避免同一事实两处写)。
整链验收(`inbound_voice_gateway_e2e_test.go`,真桥接器 + 真存储 + 真网关 WS):
- 主人私聊语音:第一帧就是 `message_persisted`,带 `voice`,且与
`GET /sessions/{id}/messages` 同一行**逐字相等**;随后的非语音消息帧整键缺席。
- 群聊语音(被点名 ⇒ 走完整回合):第一帧 `channel_persisted` 带 `voice`,
且与渠道日志读面同一行逐字相等。
- 变异实测(把顺序还原成「先广播、后写列」):两条用例都 FAIL,输出即报障症状
(帧里 content 是转写文本,却没有 voice 键)。
顺带把网关侧两处描述旧时序的注释改成新事实。
2026-10-26 18:54:13 +08:00
..
2026-10-04 12:30:16 +08:00
2026-10-04 12:30:16 +08:00
2026-10-06 21:48:49 +08:00
2026-10-06 21:48:49 +08:00
2026-10-04 14:21:41 +08:00
2026-10-06 21:48:49 +08:00
2026-10-05 14:15:55 +08:00
2026-10-05 14:15:55 +08:00
2026-10-05 13:29:53 +08:00
2026-10-05 10:37:56 +08:00
2026-10-05 10:37:56 +08:00
2026-10-04 13:42:37 +08:00
2026-10-13 19:38:56 +08:00
2026-10-13 19:38:56 +08:00
2026-10-05 14:01:52 +08:00
2026-10-05 14:38:37 +08:00
2026-10-05 14:38:37 +08:00
2026-10-06 09:03:53 +08:00
2026-10-03 22:28:25 +08:00
2026-10-13 19:38:56 +08:00
2026-10-13 19:38:56 +08:00
2026-10-03 22:28:25 +08:00
2026-10-03 22:28:25 +08:00
2026-10-03 22:28:25 +08:00
2026-10-03 22:28:25 +08:00
2026-10-06 09:03:44 +08:00
2026-10-03 22:28:25 +08:00
2026-10-06 09:03:44 +08:00
2026-10-24 21:11:22 +08:00
2026-10-24 21:28:26 +08:00
2026-10-05 13:54:56 +08:00
2026-10-06 09:03:32 +08:00
2026-10-06 08:04:12 +08:00
2026-10-05 10:37:56 +08:00
2026-10-04 14:00:25 +08:00
2026-10-05 16:19:32 +08:00
2026-10-05 15:38:53 +08:00
2026-10-06 08:16:03 +08:00
2026-10-06 21:16:21 +08:00
2026-10-06 21:16:21 +08:00
2026-10-06 08:16:03 +08:00
2026-10-03 22:28:25 +08:00
2026-10-04 12:43:04 +08:00
2026-10-04 12:43:04 +08:00
2026-10-04 12:43:04 +08:00
2026-10-04 12:43:04 +08:00
2026-10-04 18:11:43 +08:00
2026-10-04 13:06:54 +08:00
2026-10-04 18:11:43 +08:00
2026-10-04 22:16:26 +08:00
2026-10-05 14:38:37 +08:00
2026-10-26 13:53:59 +08:00
2026-10-06 14:12:27 +08:00
2026-10-06 14:12:27 +08:00
2026-10-07 09:49:57 +08:00
2026-10-25 00:08:46 +08:00
2026-10-07 11:07:00 +08:00
2026-10-25 00:08:46 +08:00
2026-10-06 08:04:12 +08:00
2026-10-06 08:04:12 +08:00
2026-10-06 22:39:35 +08:00
2026-10-07 11:07:00 +08:00
2026-10-07 11:07:00 +08:00
2026-10-25 00:08:46 +08:00
2026-10-06 08:04:12 +08:00
2026-10-25 00:08:46 +08:00
2026-10-13 22:33:07 +08:00
2026-10-13 22:50:38 +08:00
2026-10-13 21:59:18 +08:00
2026-10-13 21:59:18 +08:00
2026-10-04 10:46:51 +08:00
2026-10-04 13:07:52 +08:00
2026-10-06 14:12:23 +08:00
2026-10-06 14:12:23 +08:00
2026-10-26 13:53:59 +08:00
2026-10-26 13:53:59 +08:00
2026-10-04 14:21:41 +08:00
2026-10-26 13:53:59 +08:00
2026-10-03 22:28:25 +08:00
2026-10-24 20:32:36 +08:00
2026-10-04 12:30:16 +08:00
2026-10-24 20:21:22 +08:00
2026-10-03 22:28:25 +08:00
2026-10-04 19:44:53 +08:00
2026-10-04 19:44:53 +08:00
2026-10-03 22:28:25 +08:00
2026-10-03 22:28:25 +08:00
2026-10-03 22:28:25 +08:00
2026-10-13 19:38:56 +08:00
2026-10-04 18:57:58 +08:00
2026-10-13 19:38:56 +08:00
2026-10-04 21:33:11 +08:00
2026-10-04 21:33:11 +08:00
2026-10-04 21:33:11 +08:00
2026-10-26 13:53:59 +08:00
2026-10-04 13:07:52 +08:00
2026-10-03 22:28:25 +08:00
2026-10-04 12:07:51 +08:00
2026-10-04 13:07:52 +08:00
2026-10-03 22:28:25 +08:00
2026-10-04 14:21:41 +08:00
2026-10-03 22:28:25 +08:00
2026-10-24 20:21:22 +08:00
2026-10-26 13:32:04 +08:00
2026-10-26 13:40:00 +08:00
2026-10-05 10:37:56 +08:00
2026-10-03 22:28:25 +08:00
2026-10-03 22:28:25 +08:00
2026-10-06 07:58:42 +08:00
2026-10-26 18:46:06 +08:00
2026-10-26 18:54:13 +08:00
2026-10-05 11:36:18 +08:00
2026-10-04 17:59:28 +08:00
2026-10-04 19:46:36 +08:00
2026-10-04 14:37:37 +08:00
2026-10-05 09:18:50 +08:00
2026-10-06 09:03:55 +08:00
2026-10-05 22:06:54 +08:00
2026-10-04 19:46:36 +08:00
2026-10-04 17:07:20 +08:00
2026-10-05 11:36:18 +08:00
2026-10-04 14:37:37 +08:00
2026-10-03 22:28:25 +08:00
2026-10-06 08:16:03 +08:00
2026-10-03 22:28:25 +08:00
2026-10-03 22:28:25 +08:00
2026-10-04 17:42:16 +08:00
2026-10-03 22:28:25 +08:00
2026-10-03 22:28:25 +08:00
2026-10-03 22:28:25 +08:00
2026-10-03 22:28:25 +08:00
2026-10-04 21:50:08 +08:00
2026-10-04 21:50:08 +08:00
2026-10-06 15:59:14 +08:00
2026-10-06 09:03:55 +08:00
2026-10-06 09:03:55 +08:00
2026-10-05 10:56:39 +08:00
2026-10-06 14:12:27 +08:00
2026-10-26 18:54:13 +08:00
2026-10-03 22:07:56 +08:00
2026-10-04 14:13:27 +08:00
2026-10-06 14:12:27 +08:00
2026-10-06 14:12:27 +08:00
2026-10-04 14:21:52 +08:00
2026-10-04 14:21:52 +08:00
2026-10-06 14:12:27 +08:00
2026-10-06 14:12:27 +08:00
2026-10-03 22:28:25 +08:00
2026-10-03 22:28:25 +08:00
2026-10-03 22:28:25 +08:00
2026-10-03 22:07:56 +08:00
2026-10-03 22:28:25 +08:00
2026-10-03 22:28:25 +08:00
2026-10-03 22:28:25 +08:00
2026-10-03 22:28:25 +08:00
2026-10-26 13:58:02 +08:00
2026-10-03 22:28:25 +08:00
2026-10-03 22:28:25 +08:00
2026-10-04 13:58:03 +08:00
2026-10-04 13:58:03 +08:00
2026-10-26 13:58:02 +08:00
2026-10-26 13:53:59 +08:00
2026-10-04 13:58:03 +08:00
2026-10-26 13:21:44 +08:00
2026-10-03 22:28:25 +08:00
2026-10-24 20:32:36 +08:00
2026-10-06 21:16:20 +08:00
2026-10-24 19:40:30 +08:00
2026-10-24 19:40:30 +08:00
2026-10-24 19:40:30 +08:00
2026-10-24 19:40:30 +08:00
2026-10-24 19:40:30 +08:00
2026-10-05 14:38:37 +08:00
2026-10-04 16:27:35 +08:00
2026-10-05 09:18:50 +08:00
2026-10-24 21:11:22 +08:00
2026-10-05 22:06:54 +08:00
2026-10-03 22:28:25 +08:00
2026-10-04 17:42:16 +08:00
2026-10-04 21:50:08 +08:00
2026-10-05 11:36:18 +08:00
2026-10-05 09:18:50 +08:00
2026-10-05 09:38:11 +08:00
2026-10-05 09:38:11 +08:00
2026-10-05 09:53:08 +08:00
2026-10-03 22:28:25 +08:00
2026-10-05 12:21:24 +08:00
2026-10-05 10:56:39 +08:00
2026-10-05 12:21:24 +08:00
2026-10-05 09:18:50 +08:00
2026-10-05 09:53:08 +08:00
2026-10-05 10:56:39 +08:00
2026-10-05 12:21:24 +08:00
2026-10-04 17:59:28 +08:00
2026-10-05 09:18:50 +08:00
2026-10-05 09:46:10 +08:00
2026-10-03 22:28:25 +08:00
2026-10-06 07:58:42 +08:00
2026-10-04 17:59:28 +08:00
2026-10-05 09:38:11 +08:00
2026-10-05 09:38:11 +08:00
2026-10-05 11:36:18 +08:00
2026-10-04 17:25:35 +08:00
2026-10-05 11:36:18 +08:00
2026-10-05 09:18:50 +08:00
2026-10-05 09:46:10 +08:00
2026-10-07 10:07:13 +08:00
2026-10-05 10:56:39 +08:00
2026-10-05 10:56:39 +08:00
2026-10-05 10:56:39 +08:00
2026-10-05 09:18:50 +08:00
2026-10-03 22:28:25 +08:00
2026-10-24 22:02:11 +08:00
2026-10-24 22:02:11 +08:00
2026-10-24 22:02:11 +08:00
2026-10-24 22:02:11 +08:00
2026-10-24 22:02:11 +08:00
2026-10-03 22:28:25 +08:00
2026-10-03 22:28:25 +08:00
2026-10-26 13:40:00 +08:00
2026-10-26 13:21:44 +08:00
2026-10-03 22:10:33 +08:00
2026-10-05 10:56:39 +08:00
2026-10-26 13:32:04 +08:00
2026-10-05 09:38:11 +08:00
2026-10-06 21:48:48 +08:00
2026-10-06 09:03:53 +08:00
2026-10-06 09:03:53 +08:00
2026-10-06 09:03:53 +08:00
2026-10-03 22:07:56 +08:00
2026-10-26 18:46:06 +08:00
2026-10-04 17:59:28 +08:00
2026-10-03 22:07:56 +08:00
2026-10-03 22:28:25 +08:00
2026-10-03 22:07:56 +08:00
2026-10-05 09:38:11 +08:00
2026-10-06 09:03:53 +08:00
2026-10-05 10:56:39 +08:00
2026-10-05 10:56:39 +08:00
2026-10-04 17:59:28 +08:00
2026-10-04 11:26:35 +08:00
2026-10-07 09:34:45 +08:00