Protocol de sincronizació

El swarm chat ofereix noves possibilitats per a cada dispositiu. Ara, és possible sincronizar l’història entre dispositius compartint el repositori relacionat.

Molts escenaris estan definits en el document de disseny de Swarm, però això no implica la sincronizació de converses entre dispositius per al mateix usuari.

Antic mètode

La sincronizació de dispositius es va fer a través del DHT. Perquè cada valor NO ha de superar 64k, les converses no s’han enviat en sincronizació de dispositius, ni perfiles de membres, perquè és massa pesant.

En l’antic mètode, el daemon està escoltant en «inbox:DEVICE_ID» per als valors DeviceSync que conté la llista de contactes per sincronizar (cf. AccountManager::startSync() );

Nota

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

Nou mètode

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

Ara, aquest és el escenari utilitzat per sincronizar:

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

  2. Altres dispositius (!A) detectaran aquest anunci i demanarà a aquest dispositiu a través del ConnectionManager que obri un nou canal anomenat «sync://DEVICE_ID_A». (Nota: A obté anuncis d’altres dispositius, així que demanarà també els canals de sincronizació).

  3. Tan aviat com es obrir aquest canal, el dispositiu que sol·licita aquest canal enviarà un valor DeviceSync (cf. següent part) que conté les seves converses i contactes conegudes.

  4. A comprovarà el valor DeviceSync i:

    • Eliminar contactes si detecta contactes eliminats

    • Agrega contactes si detecta contactes afegits

    • Eliminar converses si detecta converses eliminades

    • Agrega converses si detecta converses afegides

    • Eliminar les peticions de la conversa si la petició és acceptada (ara en converses) / rebutjada

    • A més, afegir les peticions de la conversa si es detecta

Nota

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

Sincronizació d’aparell

Aquest valor és un JSON que conté:

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

Històries d’usuari

Sincronizació quan s’afegeix dispositiu

  • Alice crea una conversa

  • (Optional) Alice afegir alguns missatges

  • Alice agrega un altre dispositiu

  • L’altre dispositiu ha de rebre i sincronizar la conversa creada prèviament

Sincronizació quan connecta un dispositiu

  • Alice crea una conversa

  • (Optional) Alice afegir alguns missatges

  • Alice connecta un altre dispositiu

  • L’altre dispositiu ha de rebre i sincronizar la conversa creada prèviament

Sincronizació entre múltiples dispositius

  • Alice té 2 dispositius.

  • Alice crea una conversa

  • L’altre dispositiu ha de rebre i sincronizar la conversa creada en un dels dispositius

Sincronizació per detectar noves peticions

  • Alice rebeu la petició d’una conversa

  • Alice afegir un nou dispositiu

  • L’altre dispositiu ha de recuperar les peticions del dispositiu A

Sincronizació per a les peticions acceptades

  • Alice té 2 dispositius.

  • Alice accepta la petició d’una conversa

  • L’altre dispositiu ha de detectar la petició acceptada

Sincronizació per a les peticions de declinació

  • Alice té 2 dispositius.

  • Alice rechaza la petició d’una conversa

  • L’altre dispositiu ha de detectar la petició rebutjada

Implementació actual

gerrit#15584 implementa aquesta pàgina