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
The current DeviceSync value present on the DHT is deprecated with this draft.
Nuevo método
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).
Ahora, este es el escenario utilizado para sincronizar:
When the device (A) goes online, it announces its presence via a DeviceAnnouncement like the OldMethod.
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).
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.
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
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ó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