Synchronisation de l’état de livraison
Lorsque nous envoyons un message à une conversation, l’état de livraison doit être explicite et compréhensible pour l’utilisateur final. Jami doit donc offrir la possibilité de savoir si le message a été transmis aux autres membres d’une conversation et de synchroniser cet état (envoyé et affiché) sur tous les appareils.
Comment ça marche (backend)
Le statut des messages est stocké dans la couche de conversation via la variable messagesStatus (map<string, map<string, string>)
avec la structure suivante :
{uri, {
{"fetch", "commitId"},
{"fetched_ts", "timestamp"},
{"read", "commitId"},
{"read_ts", "timestamp"}
}
}
Le statut fetch
est le commitId du dernier message récupéré par le membre. Le fetched_ts
est l’horodatage du dernier message récupéré par le membre. Le statut read
est le commitId du dernier message lu par le membre. Le read_ts
est l’horodatage du dernier message lu par le membre.
Lorsqu’un membre récupère un message, le statut fetch
est mis à jour avec le commitId du message et le fetched_ts
est mis à jour avec l’horodatage du message. Lorsqu’un membre lit un message, le statut read
est mis à jour avec le commitId du message et le read_ts
est mis à jour avec l’horodatage du message. Ces informations sont synchronisées entre les appareils et les autres appareils mettront à jour leur structure interne si l’horodatage est plus récent.
Cette information est stockée dans conversation_data/xxxxxxxxx/status
.
L’API du client
Le client doit obtenir le statut de la structure SwarmMessage courante lors du chargement de la conversation et mettre à jour le statut via AccountMessageStatusChanged
. Dans AccountMessageStatusChanged
le client aura le commitId, l’uri du pair et le nouveau statut. Cela correspondra donc à message.status[uri]
.
La structure du statut des SwarmMessage est :
{
{uri, status},
{uri2, status2}
}
Où uri
est l’uri du pair et status
est le statut du message pour ce pair (à partir de l’enum MessageStates
).
Lors de l’envoi d’un nouveau message, la carte status
peut être vide (parce que personne ne l’a récupéré). Par défaut, s’il n’y a pas d’information de lecture/réception pour un message, le message DOIT être considéré comme envoyé. L’état global d’un message est le maximum de l’état de tous les membres à l’exception de nous-mêmes. Par exemple, si Alice envoie un message et que nous avons :
status = {alice: displayed, bob: sending, carl: sent}
Le statut global est sent
.
Notes pour les clients
Si le client veut montrer quel est le dernier message lu pour un membre, il doit vérifier l’index lorsqu’il répond à
AccountMessageStatusChanged
. En effet, ce signal peut indiquer qu’un message précédent sera affiché plus tard.Le statut d’un message peut être utilisé pour créer une vue détaillée de qui a reçu/affiché un message spécifique. Toutefois, les horodatages de ces événements ne sont pas stockés, car cela représenterait trop de données.