Protocolul de sincronizare
Chat-ul swarm oferă noi posibilități pentru fiecare dispozitiv. Acum, este posibil să se sincronizeze istoricul între dispozitive prin împărțirea repository-ului aferent.
Multe scenarii sunt definite în documentul de proiectare
Vechiul mod
Din moment ce fiecare valoare nu trebuie să depășească 64k, conversațiile nu au fost trimise în sincronizarea dispozitivului, nici în profilurile membrilor, deoarece este prea grea.
În vechea metodă, daemonul ascultă pe „inbox:DEVICE_ID” pentru valorile DeviceSync care conțin lista de contacte pentru sincronizare (cf. AccountManager::startSync()
);
Notă
The current DeviceSync value present on the DHT is deprecated with this draft.
Noua metodă
Since Jami has the ConnectionManager, using p2p socket is possible to perform sync quickly with big values (cause the socket is not limited in data).
Acum, acesta este scenariul folosit pentru a sincroniza:
When the device (A) goes online, it announces its presence via a DeviceAnnouncement like the OldMethod.
Alte dispozitive (!A) vor detecta anunțul și vor cere acestui dispozitiv prin ConnectionManager să deschidă un nou canal numit „sync://DEVICE_ID_A”. (Nota: A va primi anunțuri de la alte dispozitive, astfel încât va cere și canalele de sincronizare).
De îndată ce acest canal este deschis, dispozitivul care solicită acest canal trimite o valoare DeviceSync (cf. următoarea parte) care conține conversațiile și contactele sale cunoscute.
A va verifica valoarea DeviceSync și:
Scoateţi contacte dacă detectează contacte scoase
Adăugați contacte dacă detectează contacte adăugate
Scoate conversaţiile dacă detectează conversaţiile eliminate
Adăugați conversații dacă detectează conversații adăugate
Retrageți cererile conversației dacă cererea este acceptată (în prezent în conversații) / refuzată
Adăugați cererile conversației dacă sunt detectate
Notă
If A detects new conversations, it will asks the device which announced that conversation to clone the repository through a git channel (so like described in Swarm chat design).
Simcronizare de dispozitiv
Această valoare este o JSON care conține:
{
"contacts": [/* Contacts (TODO) */],
"conversation": [
{ "id":"convID", "created":"<TIMESTAMP>", "removed":"<OPTIONAL_TIMESTAMP>" },
{ "id":"convID2", "created":"<TIMESTAMP2>", "removed":"<OPTIONAL_TIMESTAMP2>" }
/* ... */
],
"conversationsRequests": [
{ "id":"convID", "received":"<TIMESTAMP>", "declined":"<OPTIONAL_TIMESTAMP>",
"members":[], "metadatas":[] },
{ "id":"convID2", "received":"<TIMESTAMP2>", "declined":"<OPTIONAL_TIMESTAMP2>",
"members":[], "metadatas":[] }
/* ... */
],
}
Povestea utilizatorului
Simcronizați în cazul adăugării dispozitivului
Alice creează o conversaţie
(Optional) Alice adaugă câteva mesaje
Alice adaugă un alt dispozitiv
Celălalt dispozitiv trebuie să primească și să sincronizeze conversația creată anterior
Simcronizați atunci când conectați un dispozitiv
Alice creează o conversaţie
(Optional) Alice adaugă câteva mesaje
Alice conectează un alt dispozitiv
Celălalt dispozitiv trebuie să primească și să sincronizeze conversația creată anterior
Sincronizare între mai multe dispozitive
Alice a avut 2 dispozitive.
Alice creează o conversaţie
Celălalt dispozitiv trebuie să primească și să sincronizeze conversația creată pe unul dintre dispozitive
Sincronizare pentru detectarea de noi solicitări
Alice primeşte cererea de conversaţie
Alice adaugă un nou dispozitiv
Celălalt dispozitiv trebuie să recupereze cererile de la dispozitivul A
Sincronizare pentru cererile acceptate
Alice are 2 dispozitive.
Alice acceptă cererea unei conversaţii
Celălalt dispozitiv trebuie să detecteze cererea acceptată
Sincronizare pentru cererile de declin
Alice are 2 dispozitive.
Alice refuză cererea de conversaţie
Celălalt dispozitiv trebuie să detecteze cererea refuzată
Implementarea actuală
gerrit#15584 implementează această pagină