交货状态同步

当我们向对话发送消息时,传递状态必须明确,并且最终用户可以理解。因此,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枚举)。

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

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

全局状态为“已发送”。

客户须知

  • 如果客户端希望显示哪个消息是成员的最后一条读取消息,则它们必须在响应AccountMessageStatusChanged时检查索引。因为该信号可以发出先前的消息稍后显示。

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