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.