Protocolo de sincronización

El chat enjambre ofrece nuevas posibilidades para cada dispositivo. Ahora, es posible sincronizar el historial entre dispositivos compartiendo el repositorio relacionado.

Muchos escenarios se definen en el documento de diseño de Swarm, sin embargo, esto no implica sincronizar las conversaciones entre dispositivos para el mismo usuario.

El viejo método

La sincronización de dispositivos se realizó a través del DHT. Debido a que cada valor NO DEVE superar los 64k, las conversaciones no se enviaron en la sincronización de dispositivos, ni en los perfiles de miembros, porque es demasiado pesado. Este es un problema y debe mejorarse.

En el método antiguo, el demonio está escuchando en «inbox:DEVICE_ID» para los valores DeviceSync que contiene la lista de contactos para sincronizar (cf. AccountManager::startSync() );

NOTA: El valor actual de DeviceSync presente en el DHT se ha desactualizado con este borrador.

Nuevo método

Dado que Jami tiene el ConnectionManager, utilizando socket p2p es posible realizar sincronización rápidamente con grandes valores (porque el socket no está limitado en datos)

Ahora, este es el escenario utilizado para sincronizar:

  1. Cuando el dispositivo (A) se pone en marcha, anuncia su presencia a través de un anuncio de dispositivo como el OldMethod

  2. Otros dispositivos (!A) detectarán ese anuncio y pedirán a este dispositivo a través del ConnectionManager que abra un nuevo canal llamado «sync://DEVICE_ID_A». (Nota: A recibirá un anuncio de otros dispositivos, por lo que también solicitará canales de sincronización).

  3. En cuanto se abra este canal, el dispositivo que solicita este canal enviará un valor DeviceSync (ver la siguiente parte) que contiene sus conversaciones y contactos conocidos.

  4. A comprobará el valor de DeviceSync y:

    • Eliminar los contactos si detecta contactos eliminados

    • Añadir contactos si detecta contactos añadidos

    • Eliminar conversaciones si detecta conversaciones eliminadas

    • Añadir conversaciones si detecta conversaciones adicionales

    • Eliminar las solicitudes de conversación si la solicitud es aceptada (ahora en conversaciones) / rechazada

    • Añadir las solicitudes de conversación si se detecta

Nota: Si A detecta nuevas conversaciones, pedirá al dispositivo que anunció esa conversación que clone el repositorio a través de un canal git (como se describe en el diseño de chat de Swarm)

Sincronización de dispositivos

Este valor es un JSON que contiene:

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

Historias de usuarios

Sincronización al agregar el dispositivo

  • Alice crea una conversación

  • (Opcional) Alice añade algunos mensajes

  • Alice agrega otro dispositivo

  • El otro dispositivo debe recibir y sincronizar la conversación creada previamente

Sincronización al conectar un dispositivo

  • Alice crea una conversación

  • (Opcional) Alice añade algunos mensajes

  • Alice conecta otro dispositivo

  • El otro dispositivo debe recibir y sincronizar la conversación creada previamente

Sincronización entre varios dispositivos

  • Alice tiene 2 dispositivos.

  • Alice crea una conversación

  • El otro dispositivo debe recibir y sincronizar la conversación creada en uno de los dispositivos

Sincronización para detectar nuevas solicitudes

  • Alice recibe la solicitud de una conversación

  • Alice añade un nuevo dispositivo

  • El otro dispositivo debe recuperar las solicitudes del dispositivo A

Sincronización de las solicitudes aceptadas

  • Alice tiene 2 dispositivos.

  • Alice acepta la solicitud de una conversación

  • El otro dispositivo debe detectar la solicitud aceptada

Sincronización para las solicitudes de rechazo

  • Alice tiene 2 dispositivos.

  • Alice rechaza la solicitud de una conversación

  • El otro dispositivo debe detectar la solicitud rechazada

Implementación actual

gerrit#15584 implementa esta página