docs(comments): proactive 判据键在 data 内、不在帧壳顶层(安卓核对指出)

4 处注释写「帧顶」而代码放在 data[proactive](+ 测试文件 6 处同源表述)。
安卓端两层都读所以不受影响,但注释与代码相反会误导下一个按注释写的人。
零行为改动(仅注释)。
This commit is contained in:
AskaEth committed 2026-10-06 21:16:20 +08:00
1 parent f1fbc249fd
commit b36798265a
3 files changed
+10 -10

No files matched your search

@@ -15,13 +15,13 @@ import (
// 路由过去只发普通 `message_persisted` —— 浏览器通知挂在 `proactive_message` 上,于是
// **实际最可能发生的路径恰恰不弹**。主人裁定「她说话该不该提醒我,与走哪条路由无关」。
//
// 判据是**结构化**的:主动推送在落库之后追加一条**帧顶带 `proactive:true`** 的
// 判据是**结构化**的:主动推送在落库之后追加一条**帧的 `data` 里带 `proactive:true`** 的
// `message_persisted`(gateway.BroadcastProactivePersisted)。普通消息(Web 回合 / IM
// 回复 / IM 镜像)走的仍是 BroadcastPersisted,那条路**永不**放该键 —— 因此普通消息
// 不可能被误判成主动消息。下面分别钉住两端:IM 路由真的发得出这条带判据的帧,而普通
// 广播路径永远发不出它。
// dataFlag 报告帧顶是否带 proactive 判据(以及它的值)。
// dataFlag 报告帧的 `data` 里是否带 proactive 判据(以及它的值)。
func dataFlag(t *testing.T, ev wsEvent) (any, bool) {
t.Helper()
data, ok := ev.Data.(map[string]any)
@@ -49,7 +49,7 @@ func frameMessageID(t *testing.T, ev wsEvent) string {
// TestChannelBridge_SendProactive_EmitsProactiveFlaggedFrame 是切片 P0b 的端到端证据:
// IM 路由的主动消息**既**照旧广播普通镜像帧(P0 起的行为,任何客户端都能渲染),**又**
// 追加一条帧顶带 `proactive:true`、并携带落库行权威 id 的帧 —— 前端据此走与
// 追加一条帧的 `data` 里带 `proactive:true`、并携带落库行权威 id 的帧 —— 前端据此走与
// `proactive_message` 同一套提醒逻辑(非前台补一发通知,两帧同 id ⇒ 去重后一个气泡、
// 一次提醒)。它同时守住 P0 的红线:主会话里仍**恰好一条**(绝无双份)。
func TestChannelBridge_SendProactive_EmitsProactiveFlaggedFrame(t *testing.T) {
@@ -94,7 +94,7 @@ func TestChannelBridge_SendProactive_EmitsProactiveFlaggedFrame(t *testing.T) {
t.Fatalf("普通镜像帧带上了 proactive=%v,want 该键缺席(判据只属于主动那条)", v)
}
// 第二帧:主动帧 —— 帧顶带判据,且消息 id 就是落库行的权威 id。
// 第二帧:主动帧 —— 帧的 `data` 里带判据,且消息 id 就是落库行的权威 id。
second := readFakeFrame(t, owner)
if second.Type != "message_persisted" {
t.Fatalf("frame 2 type = %q, want message_persisted(帧类型不变,只多一个结构化键)", second.Type)
@@ -114,7 +114,7 @@ func TestChannelBridge_SendProactive_EmitsProactiveFlaggedFrame(t *testing.T) {
}
// TestServer_BroadcastPersisted_NeverCarriesProactiveFlag 是「不误伤」那一条的后端对照:
// 普通广播路径(Web 回合 / IM 回复 / IM 镜像全走它)**永远**不在帧顶放 proactive 判据,
// 普通广播路径(Web 回合 / IM 回复 / IM 镜像全走它)**永远**不在帧的 `data` 里放 proactive 判据,
// 因此客户端不可能把普通消息误判成主动消息去弹通知。同一行改走主动那条入口时,判据才
// 出现 —— 两条入口的差别只有这一个键。
func TestServer_BroadcastPersisted_NeverCarriesProactiveFlag(t *testing.T) {
@@ -132,7 +132,7 @@ func TestServer_BroadcastPersisted_NeverCarriesProactiveFlag(t *testing.T) {
t.Fatalf("frame type = %q, want message_persisted", plain.Type)
}
if v, has := dataFlag(t, plain); has {
t.Fatalf("普通消息的帧顶带上了 proactive=%v,want 该键缺席(否则会被误判成主动消息)", v)
t.Fatalf("普通消息的帧的 `data` 里带上了 proactive=%v,want 该键缺席(否则会被误判成主动消息)", v)
}
env.srv.BroadcastProactivePersisted(row)