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ä:
16 bittiä käytetään ruumiin pituuden tallentamiseen.
16 bittiä kanavan tunnille (pääsypaikka)
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
Jami-tilin omistaa ConnectionManager ja on pääsy ChannelSocket-objekteihin (shared_ptr, joka omistetaan MultiplexedSocketin kanssa).
ConnectionManager omistaa MultiplexedSockets- ja ICE-objekteja
MultiplexedSockets omistaa TLS-liikenteen ja ChannelSocket-objektien
ChannelSocket omistaa tietapuhverit
Roolit
ConnectionManager käytetään yhteyksien hallintaan vertaisille.
MultiplexedSockets käytetään lähettämään tietoja TLSSocketin kautta, lukemaan saapuvia paketteja ja hallinnoimaan kanavia.
ChannelSocketsia käyttävät asiakas vuorovaikutuksessa toisen vertaisen kanssa.
Käyttö
Scenarioita kuvataan vastaavissa yksikkötestiissä (test/unitTest/connectionManager/connectionManager.cpp
)