El administrador de conexión

Introducción

El administrador de conexión es la primera pieza de las funciones de chat de grupo. Esta clase administra las conexiones a pares y ofrece al usuario sockets multiplexados a los dispositivos que desean conectar. Por ejemplo, si Alice quiere conectarse a uno de los dispositivos de Bob para transferir 2 archivos, le pedirá al administrador de conexión que abra 2 canales (uno por archivo) a Bob. Esto le dará:

    aliceAccount->connectionManager().connectDevice(bobDeviceId, "file://file1",
        [](std::shared_ptr<ChannelSocket> socket) {
        if (socket) {
            // transfer first file
        }
    });

    aliceAccount->connectionManager().connectDevice(bobDeviceId, "file://file2",
        [](std::shared_ptr<ChannelSocket> socket) {
        if (socket) {
            // transfer second file
        }
    });

Tras eso, el ConnectionManager conectará primero al dispositivo de Bob a través del DHT (a través de ICE) y configurará un Socket TLS. Luego, pedirá un canal, y cuando el canal esté listo, informe a Alice a través de una llamada de regreso. Para el segundo archivo, utilizará el primer socket y abrirá un nuevo canal (sólo necesita 2 paquetes TLS, por lo que es rápido)

El lado DHT

Es lo mismo que Llamadas, ver Exchange ICE candidatos, ICE negociación, Encripta el control de toma de control pero sólo en TCP.

Sin embargo, cuando una parte recibe una nueva solicitud de ICE, se activa la llamada de regreso establecida por nulo onICERequest(onICERequestCallback&&& cb);.

Negociar un nuevo canal

Un canal se define por un id (univo) y un uri (no único). Por ejemplo (1, “git://*”)

Cuando está listo, el ConnectionManager considera que el canal 0 existe.

El protocolo utilizado es bastante simple y se parece al protocolo RTP:

  1. Se utilizan 16 bits para almacenar la longitud del cuerpo.

  2. 16 bits para el canal de identificación (destino)

  3. cuerpo

Así que todos los paquetes tienen un encabezado de 32 bits.

Para solicitar un nuevo canal, el ConnectionManager enviará un objeto ChannelRequest (msgpack se utiliza para serializar el estruct) en el canal 0 para enviar el id y el nombre del nuevo canal al igual (con isAnswer = false).

Cerrar un canal

Se transmite una EOF para un canal si la longitud del contenido es 0.

Estructura de la conexiónGestión

Propiedad

  1. Una cuenta Jami posee el ConnectionManager y tiene acceso a los objetos ChannelSocket (shared_ptr propiedad del MultiplexedSocket.

  2. El ConnectionManager posee objetos MultiplexedSockets y ICE

  3. MultiplexedSockets es dueño del transporte TLS y los objetos ChannelSocket

  4. ChannelSocket es dueño de los buffers de datos

Roles

  1. ConnectionManager se utiliza para administrar conexiones con pares.

  2. MultiplexedSockets se utilizan para enviar datos a través del TLSSocket, leer los paquetes entrantes y administrar canales.

  3. ChannelSockets son utilizados por el cliente para interactuar con el otro compañero.

Uso

Los escenarios se describen en las pruebas unitarias correspondientes (test/unitTest/connectionManager/connectionManager.cpp)