Protocolo de sincronização
O chat swarm oferece novas possibilidades para cada dispositivo. Agora, é possível sincronizar o histórico entre dispositivos compartilhando o repositório relacionado.
Muitos cenários estão definidos no documento de design do enxame, mas isso não implica a sincronização de conversas entre dispositivos para o mesmo usuário. Alguns novos cenários devem ser escritos.
Método antigo
A sincronização de dispositivos foi feita através do DHT. Como cada valor NÃO DEVE exceder 64k, conversas não foram enviadas em sincronização de dispositivos, nem perfis de membros, porque é muito pesado. Este é um problema e DEVE ser melhorado.
No antigo método, o daemon está ouvindo em “inbox:DEVICE_ID” para valores DeviceSync que contém a lista de contatos para sincronizar (cf. AccountManager::startSync()
);
Nota: o valor atual de DeviceSync presente no DHT está obsoleto com este rascunho.
Novo método
Como o Jami tem o ConnectionManager, é possível usar o soquete p2p para realizar a sincronização rapidamente com valores grandes (porque o soquete não tem limite de dados)
Este é o cenário usado para sincronizar:
Quando o dispositivo (A) entra em funcionamento, anuncia a sua presença através de um Anúncio de dispositivo como o OldMethod
Outros dispositivos (!A) detectarão esse anúncio e solicitarão a esse dispositivo, por meio do ConnectionManager, que abra um novo canal chamado “sync://DEVICE_ID_A”. (Nota: A receberá anúncios de outros dispositivos, portanto, também solicitará canais de sincronização).
Assim que este canal for aberto, o dispositivo que está a solicitar este canal enviará um valor DeviceSync (cf. parte seguinte) contendo as suas conversas e contatos conhecidos.
A verificará o valor de DeviceSync e:
Remover contatos se detectar contatos removidos
Adicionar contatos se detectar contatos adicionados
Remover conversas se ele detectar conversas removidas
Adicionar conversas se detecta conversas adicionadas
Remover as solicitações da conversa se a solicitação for aceita (agora em conversas) / recusada
Adicionar as solicitações da conversa se detectadas
Nota: se A detectar novas conversas, ele pedirá ao dispositivo que anunciou essa conversa para clonar o repositório por meio de um canal git (como descrito em Swarm chat design)
Sincronização de dispositivos
Este valor é um JSON contendo:
{
"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órias de usuários
Sincronização ao adicionar dispositivo
Alice cria uma conversa
(Opcional) Alice adiciona algumas mensagens
Alice adiciona outro dispositivo
O outro dispositivo deve receber e sincronizar a conversa criada anteriormente
Sincronizar quando ligar um dispositivo
Alice cria uma conversa
(Opcional) Alice adiciona algumas mensagens
Alice conecta outro dispositivo
O outro dispositivo deve receber e sincronizar a conversa criada anteriormente
Sincronização entre vários dispositivos
Alice tem 2 dispositivos
Alice cria uma conversa
O outro dispositivo deve receber e sincronizar a conversa criada em um dos dispositivos
Sincronização para detecção de novas solicitações
Alice recebe um pedido de conversa
Alice adiciona um novo dispositivo
O outro dispositivo deve recuperar as solicitações do dispositivo A
Sincronização de pedidos aceitos
Alice tem 2 dispositivos
Alice aceita a solicitação de uma conversa
O outro dispositivo deve detectar o pedido aceito
Sincronização para pedidos de recusa
Alice tem 2 dispositivos
Alice recusa a solicitação de uma conversa
O outro dispositivo deve detectar o pedido recusado
Implementação atual
gerrit#15584 implementa esta página