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}
}

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.