Yhteyspäällikkö

Esitelmä

Yhteyspäällikkö on ryhmächat-ominaisuuksien ensimmäinen osa. Tämä luokka hallittää yhteyksiä vertaisille ja tarjoaa käyttäjälle multipleksituja soketteja laitteisiin, joita hän haluaa yhdistää. Esimerkiksi, jos Alice haluaa olla yhteydessä yhteen Bobin laitteeseen siirtääkseen 2 tiedostoa, hän pyytää ConnectionManageria avaamaan 2 kanavaa (yhdestä tiedostossa) Bobille. Tämä antaa:

    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
        }
    });

Sen takana ConnectionManager yhdistää ensin Bobin laitteeseen DHT:n kautta (ICE:n kautta) ja asettaa TLS-paketin. Sitten se pyytää kanavaa, ja kun kanava on valmis, ilmoita Alice’lle takaisinsoituksen kautta. Toiselle tiedostolle se käyttää ensimmäistä soketta ja avaa vain uuden kanavan (tarvitaan vain 2 TLS-paketin, joten se on nopea)

DHT-puoli

Se on sama kuin call, katso Exchange ICE-ehdokas, ICE-neuvottelu, Encrypt the control socket mutta vain TCP.

Kun osapuoli kuitenkin saa uuden ICE-pyynnön, käynnistetään null onICERequest(onICERequestCallback&&& cb);.

Neuvottelu uudesta kanavasta

Kanallia määritellään tunnuksella (uniikki) ja urilla (ei ainutlaatuinen).

Kun ConnectionManager on valmis, se katsoo kanavan olevan olemassa.

Käytetty pöytäkirja on melko yksinkertainen ja näyttää RTP:ltä:

  1. 16 bittiä käytetään ruumiin pituuden tallentamiseen.

  2. 16 bittiä kanavan tunnille (pääsypaikka)

  3. ruumis

Kaikilla paketteilla on 32 bitinen len-header.

ConnectionManager lähettää uuden kanavan ChannelRequest-objektin (msgpack käytetään structin seriaalittamiseen) kanavassa 0 lähettääkseen uuden kanavan nimen ja tunnuksen vertaiselle (joilla isAnswer = false). Vertaisella kutsutaan takaisin, kun on annettu ̀ void onChannelRequest(ChannelRequestCallBack&&& cb); ja kieltäytyy tai hyväksyy pyynnön. Jos se hyväksytään, vertaisella vastaa ChannelRequest-pyynnön kanssa samat tiedot (ja ̀isAnswer = true`) ja sitten molemmat vertaisella kutsutaan takaisin ilmoittamaan, että ChannelSock on käytettävissä.

Kanalin sulkeminen

Kanalissa lähetetään EOF jos sisältö on 0 pitkän.

Yhteydenhoito

Omistusoikeus

  1. Jami-tilin omistaa ConnectionManager ja on pääsy ChannelSocket-objekteihin (shared_ptr, joka omistetaan MultiplexedSocketin kanssa).

  2. ConnectionManager omistaa MultiplexedSockets- ja ICE-objekteja

  3. MultiplexedSockets omistaa TLS-liikenteen ja ChannelSocket-objektien

  4. ChannelSocket omistaa tietapuhverit

Roolit

  1. ConnectionManager käytetään yhteyksien hallintaan vertaisille.

  2. MultiplexedSockets käytetään lähettämään tietoja TLSSocketin kautta, lukemaan saapuvia paketteja ja hallinnoimaan kanavia.

  3. ChannelSocketsia käyttävät asiakas vuorovaikutuksessa toisen vertaisen kanssa.

Käyttö

Scenarioita kuvataan vastaavissa yksikkötestiissä (test/unitTest/connectionManager/connectionManager.cpp)