发送状态同步

当我们向对话发送消息时,传递状态必须明确,并且最终用户可以理解。因此,Jami必须提供“确认消息是否已传递给对话的其他成员”的可能性,并在设备之间同步该状态(已发送和显示)。

工作原理(后端)

消息的状态通过变量messagesStatus (map<string, map<string, string>)存储在对话层中,结构如下:

{uri, {
         {"fetch", "commitId"},
         {"fetched_ts", "timestamp"},
         {"read", "commitId"},
         {"read_ts", "timestamp"}
      }
}

“fetch”状态是成员提取的最后一条消息的commitId。“fetched_ts”是成员提取的最后一条消息的时间戳。“read”状态是成员读取的最后一条消息的commitId。“read_ts”是成员读取的最后一条消息的时间戳。

当成员提取消息时,“fetch”状态将用消息的commitId更新,而“fetched_ts”则用消息的时间戳更新。成员读取消息时,“read”状态用消息的commitId更新,“read_ts”用消息的时间戳更新。此信息在设备之间同步,如果时间戳较新,则其他设备将更新其内部结构。

此信息存储在conversation_data/xxxxxxxx/status中。

客户端API

客户端应在加载对话时从当前SwarmMessage结构中获取状态,并通过“AccountMessageStatusChanged”更新状态。在“AccountMessageStatusChanged”中,客户端将具有commitId、对等uri和新状态。因此,这将对应于message.status[uri]

SwarmMessage的状态结构为:

{
    {uri, status},
    {uri2, status2}
}

其中uri是对等uri,status是此对等的消息的状态(来自MessageStates枚举)。

发送新消息时,状态映射可以为空(因为没有提取任何人)。默认情况下,如果消息没有获取/读取信息,则必须将该消息视为正在发送。消息的全局状态是除我们之外的所有成员的最大状态。例如,如果Alice发送了一条消息,并且我们有:

status = {alice: displayed, bob: sending, carl: sent}

全局状态为“已发送”。

客户须知

  • 如果客户端想要显示某个成员最后阅读的是哪条消息,那么在响应‘AccountMessageStatusChanged’信号时,它们必须检查索引。因为这个信号可能会表示之前的某条消息后来被重新显示或标记为已读。

  • 消息的状态可用于创建谁接收/显示特定消息的详细视图。然而,不会存储这些事件的时间戳,因为这将表示太多的数据。