Protokol za sinhronizacijo

Svoj časovni časovni pregled je omogočil, da se vse naprave sinhronizirajo, tako da se lahko izmenjujejo zapisi.

V oblikovalnem dokumentu Swarm so opredeljeni številni scenariji, vendar to ne pomeni sinhronizacije pogovorov med napravami za iste uporabnike.

Stara metoda

Sinkronizacija naprav je bila opravljena prek DHT. Ker vsaka vrednost NE sme preseči 64k, se pogovori niso pošiljali v sinhronizaciji naprav, niti v profilih članov, ker je preveč težka. To je problem in mora biti izboljšana.

V stari metodi je demon prisluhnil „inbox:DEVICE_ID“ za vrednosti DeviceSync, ki vsebuje seznam stikov za sinhronizacijo (glej AccountManager::startSync() );

Opomba

The current DeviceSync value present on the DHT is deprecated with this draft.

Nova metoda

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).

To je scenarij, ki ga uporabljamo za sinhronizacijo:

  1. When the device (A) goes online, it announces its presence via a DeviceAnnouncement like the OldMethod.

  2. Druge naprave (!A) bodo odkrile ta obvestilo in bodo to napravo prek ConnectionManager prosile, naj odpre nov kanal z imenom „sync://DEVICE_ID_A“. (Opomba: A bo dobil obvestilo iz drugih naprav, zato bo prosil tudi za sinhronizacijske kanale).

  3. Takoj ko se ta kanal odpre, bo naprava, ki to kanal prosi, poslala vrednost DeviceSync (glej naslednji del), ki vsebuje znane pogovore in kontakte.

  4. A bo preveril vrednost DeviceSync in:

    • Odstranite stike, če odkrije odstranjene stike.

    • Dodatki kontaktov, če odkrije dodane kontakte

    • Odstranite pogovore, če odkrije odstranjene pogovore

    • Dodaj pogovor, če odkrije dodane pogovore

    • Odstranite zahteve pogovorov, če je zahtevek sprejet (daj v pogovorih) / zavrnjen

    • Če je to opaženo, dodajte zahteve za pogovor

Opomba

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).

Sinkronizacija naprav

Ta vrednost je JSON, ki vsebuje:

{
    "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:[] } /* ... */
    ],
}

Zgodbe uporabnikov

Sinkronizacija pri dodajanju naprave

  • Alice ustvarja pogovor

  • Alice je dodala sporočila.

  • Alice doda še eno napravo.

  • Druga naprava mora prejeti in sinhronizirati prej ustvarjeno pogovor

Sinkronizacija pri povezovanju naprave

  • Alice ustvarja pogovor

  • Alice je dodala sporočila.

  • Alice povezuje drugo napravo.

  • Druga naprava mora prejeti in sinhronizirati prej ustvarjeno pogovor

Sinkroniranje med več napravami

  • Alice ima dve napravi.

  • Alice ustvarja pogovor

  • Druga naprava mora sprejemati in sinhronizirati pogovor, ustvarjen na enem od naprav.

Sinkroniranje za odkrivanje novih zahtev

  • Alice prejme zahtevo za pogovor

  • Alice doda novo napravo

  • Druga naprava mora odvzeti zahteve iz naprave A

Sinkroniranje za sprejete zahteve

  • Alice ima 2 naprave.

  • Alice sprejema zahtevo za pogovor

  • Druga naprava mora detekcirati sprejeto zahtevo

Sinkroniranje zahtev za zavrnitev

  • Alice ima 2 naprave.

  • Alice zavrne zahtevo za pogovor

  • Druga naprava mora detekcirati zavrnjeno zahtevo

Trenutna izvedba

gerrit#15584 izvaja to stran