Szállítási állapot összehangolása

Amikor üzenetet küldünk egy beszélgetésbe, a kézbesítés állapotának egyértelműnek és a végfelhasználó számára érthetőnek kell lennie. Tehát a Jaminak lehetőséget kell adnia annak megtudására, hogy az üzenetet elküldték-e a beszélgetés többi tagjának, és összehangolnia kell ezt az állapotot (elküldve és megjelenítve) az eszközök között.

Hogyan működik (háttérprogram)

Az üzenetek állapotát a beszélgetési réteg tárolja a messagesStatus (map<string>, map<string, string>) (üzenetÁllapot (térkép<karakterlánc>, térkép<karakterlánc, karakterlánc>)) változón keresztül, a következő szerkezettel:

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

A fetch (lekérdezés) állapot a tag által utoljára letöltött üzenet commitId-je (elkövetési azonosító). A fetched_ts (lekért_időbélyeg) a tag által utoljára letöltött üzenet időbélyege. A read (olvasott) állapot a tag által utoljára olvasott üzenet véglegesítési azonosítója. A read_ts (olvasott_időbélyeg) a tag által utoljára elolvasott üzenet időbélyege.

Amikor egy tag letölt egy üzenetet, a fetch (lekérdezés) állapot frissül az üzenet commitId-jével (elkövetési azonosító), a fetched_ts (lekért_időbélyeg) pedig az üzenet időbélyegével. Amikor egy tag elolvas egy üzenetet, az read (olvasott) állapota az üzenet commitId-jével, a read_ts (olvasott_időbélyeg) pedig az üzenet időbélyegével frissül. Ezeket az adatokat a rendszer összehangolja az eszközök között, és más eszközök frissítik belső szerkezetüket, ha az időbélyeg újabb.

Ezeket az adatokat a conversation_data/xxxxxxxxx/status tárolja.

Ügyfél-API (Application Programming Interface – alkalmazásprogramozási felület)

Az ügyfélnek a jelenlegi SwarmMessage (RajcsoportÜzenet) struktúrából kell megkapnia az állapotot a beszélgetés betöltésekor, és frissítenie kell az állapotot az AccountMessageStatusChanged (FióküzenetÁllapotaMegváltozott) segítségével. Az AccountMessageStatusChanged (FióküzenetÁllapotaMegváltozott) mezőben az ügyfél rendelkezik a commitId-vel, a peer uri-val és az új állapottal. Tehát ez a message.status[uri]-nak (üzenet.állapot[uri]) felel meg.

A SwarmMessage (RajcsoportÜzenet) állapotstruktúrája a következő:

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

Ahol az uri a társ-URI-cím, az „állapot” pedig az ehhez a társhoz tartozó üzenet állapota (a „MessageStates” (ÜzenetÁllapotok) enumerálásból).

Új üzenet küldésekor a status (állapot) térkép üres lehet (mert senki sem érkezett le). Alapértelmezés szerint, ha egy üzenethez nincs adat lekérése/olvasása, az üzenetet küldésnek KELL tekinteni. Az üzenet globális állapota az összes tag státuszának maximuma, kivéve saját magunkat. Például, ha Alice üzenetet küld, és mi:

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

A globális állapot sent (elküldve).

Megjegyzések az ügyfél számára

  • Ha az ügyfél meg akarja mutatni, hogy egy tag melyik üzenete az utolsó olvasott üzenet, akkor ellenőriznie kell az indexet, amikor válaszol az AccountMessageStatusChanged (FióküzenetÁllapotMegváltozott) üzenetre. Mert ez a jel azt adhatja ki, hogy később egy korábbi üzenet jelenik meg.

  • Az üzenet állapota felhasználható részletes nézet létrehozására arról, hogy ki kapott/megjelenített egy adott üzenetet. Az események időbélyegei azonban nem kerülnek tárolásra, mert az túl sok adatot jelentene.