WuKongIM Docs

Message Flags

查阅 WKProto 固定 Header 与 Setting 位,并理解持久化、红点、命令、回执、加密和流边界。

编辑此页报告文档问题

消息行为由两组不同位控制:固定 Header 的低位布尔标志,以及消息 Setting 位。集成者应使用 SDK 暴露的类型,不手写魔法数字;本页用于跨语言核对 Wire 含义。

目标与完成标准

看到任一标志时,你应能说明它是否影响持久化、路由、展示或编码,并避免把协议意图误解为业务完成证明。

权威来源

固定 Header 位与 pkg/protocol/codec/common.go 对齐;Setting 值与 pkg/protocol/frame/setting.go 对齐。测试冻结位序、名称和值。

固定 Header 位

WKProto 消息固定 Header 位
Bit名称范围集成说明
0NoPersistWire 标志普通非命令分支只返回兼容成功且不投递;只有命令式分支进入瞬时在线投递。两者都没有持久序号或离线恢复。
1RedDotWire 标志携带红点展示意图;它不是消息已读回执,也不单独证明服务端未读数发生变化。
2SyncOnceWire 标志把命令式消息路由到独立 CMD Channel;可恢复命令还需要绑定与 CMD 同步流程。
3DUPWire 标志协议重发标记;业务幂等仍以稳定 client_msg_no 和结果关联为准。

Setting 位值

WKProto 消息 Setting 位值
名称范围集成说明
128SettingReceiptEnabledWire 标志开启协议回执意图;不能把它等同于 Channel 提交、设备业务执行或最终用户已读。
32SettingSignalWire 标志标记兼容 signal 模式;只在所选 SDK 和协议版本明确支持时使用。
16SettingNoEncryptWire 标志跳过已协商的会话 Payload 加密;它不替代 TLS,敏感消息不应启用。
8SettingTopicWire 标志表示数据包携带 Topic 字段;Topic 生命周期仍由兼容客户端与业务约定。
2SettingStreamWire 标志表示兼容流消息字段;流式 AI 的持久投影与实时增量仍是不同路径。

NoPersist 必须结合命令语义

普通 NoPersist 不会实时投递

普通非命令 NoPersist(没有 SyncOnce,也不是命令 Channel)只在预路由检查后返回兼容成功,不解析 authority、不追加日志、也不在线投递。只有命令式 NoPersist 才进入瞬时在线投递;两者都不能离线恢复。

因此:

  • 可靠聊天、通知、审计和可重放业务事件使用普通持久消息;
  • 在线瞬时命令需要命令语义,并接受目标离线时不可恢复;
  • 可恢复命令使用持久 SyncOnce 与独立 CMD bind/sync/ack;
  • 不要用 NoPersist 成功响应作为“设备已收到”的证据。

RedDot 与回执

RedDot 携带客户端展示意图,会随消息进入存储、投递和兼容回调,但它不等于:

  • 服务端已经修改某个 Conversation 的 read_seq
  • 最终用户看过消息;
  • 接收端发出了业务回执。

SettingReceiptEnabled 也只是协议回执意图。SENDACK 是 Channel 提交结果,RECVACK 是 Session 传输反馈,最终用户已读与设备执行结果需要独立业务合同。

加密相关位

  • SettingNoEncrypt 会让兼容 WKProto 适配器跳过已协商的 Session Payload 加密;它不关闭或提供 TLS;
  • 敏感消息不要启用该位;
  • SettingSignal 是专用 signal 模式,只在精确 SDK 与协议版本明确支持时使用;
  • 不要根据一个位自行发明端到端加密保证,密钥分发、身份验证和轮换仍需完整设计。

Topic 与 Stream

SettingTopic 表示数据包包含 Topic 字段。SettingStream 表示兼容流字段;它不自动承诺实时 token 推送、持久事件投影或重连恢复全部同时存在。当前 AI 流教程使用 durable base + message-event projection,并明确区分实时增量路径。

组合检查

需求选择
普通可恢复聊天消息NoPersist=falseSyncOnce=false
在线瞬时命令NoPersist=trueSyncOnce=true,接受无历史
可恢复命令NoPersist=falseSyncOnce=true,另做 CMD 绑定与同步
业务已读独立持久回执,不依赖 RedDot / RECVACK
流式 AI先阅读 AI 与 IoT,不要只设置 Stream 位

失败诊断

  • NoPersist 返回成功但对端没收到:确认是否缺少命令式 SyncOnce;普通分支按设计不投递。
  • 消息无法离线恢复:检查是否使用 NoPersist 或未建立 CMD 恢复流程。
  • 红点与未读数不一致:分开检查 Message Flag 与 Conversation Badge floor。
  • 设置位后某 SDK 解码失败:核对精确 SDK/协议版本,不盲目保留未知位。

安全边界

未知位应 fail closed 或由兼容 SDK 安全忽略,不能默认启用。原始 setting 与 Header 可以进入受控诊断,但不能连同完整敏感 Payload 写入普通日志。

下一步

消息收发中应用这些位,错误结果按 Reason Code分类。

本页内容