package gateway // wsMessageEdited / wsMessageDeleted 是 D3 历史写入的下行事件类型: // 消息内容被编辑,或消息被删除。二者复用 wsEvent 信封与 // `message_persisted` 相同的扇出 —— 并且与它以及其他所有内容帧 // 一样,在 design/11 §7.1 帧门下只发 owner/admin。hub 没有按会话的 // 订阅,因此帧携带 SessionID,由客户端按其活跃会话过滤,与它对 // message_persisted 的处理完全一致。 const ( wsMessageEdited = "message_edited" wsMessageDeleted = "message_deleted" ) // broadcastMessageEdited 把一次内容编辑作为 `message_edited` 帧扇出到 // owner/admin 连接,其 data 是更新后的消息 DTO。该帧只用于渲染同步: // 编辑后内容的唯一事实来源仍是 history store,因此错过该帧的客户端 // 会在下次读取时重新收敛。调用方会抹除 Thinking,以匹配 // message_persisted/回放契约。 func (h *hub) broadcastMessageEdited(msg historyMessage) { h.broadcast(wsEvent{Type: wsMessageEdited, SessionID: msg.SessionID, Data: msg}) } // broadcastMessageDeleted 把一次删除作为 `message_deleted` 帧扇出到 // owner/admin 连接,携带被删除的 id(外加所属 sessionId,供客户端 // 按会话过滤),使该账号的每个浏览器无需刷新即可移除该行。 // 当存储无法报告 sessionID 时它可能为空;客户端此时回退到全局 // 唯一的 id。 func (h *hub) broadcastMessageDeleted(sessionID, id string) { h.broadcast(wsEvent{Type: wsMessageDeleted, SessionID: sessionID, Data: map[string]any{"id": id}}) }