Pengelola koneksi

Pambuka

Koneksi Manager adalah bagian pertama dari fitur chat kelompok. Kelas ini mengelola koneksi ke rekan-rekan dan menawarkan pengguna soket multiplexed ke perangkat yang ingin mereka sambungkan. Misalnya, jika Alice ingin terhubung ke salah satu perangkat Bob untuk mentransfer 2 file, dia akan meminta ConnectionManager untuk membuka 2 saluran (satu per file) ke Bob. Ini akan memberikan:

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

Di balik itu, ConnectionManager akan pertama-tama terhubung ke perangkat Bob melalui DHT (melalui ICE) dan mengatur TLS Socket. Kemudian, itu akan meminta saluran, dan ketika saluran siap, memberitahu Alice melalui panggilan balik. Untuk file kedua, itu akan menggunakan soket pertama dan hanya akan membuka saluran baru (hanya membutuhkan 2 paket TLS, jadi cepat)

Sisi DHT

Ini sama dengan call, lihat Exchange ICE kandidat, ICE negosiasi, Encrypt soket kontrol tapi hanya di TCP.

Namun, ketika suatu pihak menerima permintaan ICE baru, panggilan balik yang ditetapkan oleh void onICERequest(onICERequestCallback&&& cb); dipicu.

Bernegosiasi saluran baru

Saluran didefinisikan oleh id (unik) dan uri (tidak unik). Misalnya (1, 'git://*')

Ketika siap, ConnectionManager menganggap bahwa saluran 0 ada. Saluran ini disebut saluran CONTROL dan digunakan untuk meminta saluran baru.

Protokol yang digunakan cukup sederhana dan terlihat seperti protokol RTP:

  1. 16 bit digunakan untuk menyimpan panjang tubuh.

  2. 16 bit untuk saluran id (pesantren)

  3. tubuh

Jadi semua paket memiliki 32 bit len header.

Untuk meminta saluran baru, ConnectionManager akan mengirim ChannelRequest objek (msgpack digunakan untuk menyerialisasi struktur) di saluran 0 untuk mengirim id dan nama saluran baru ke peer (dengan isAnswer = false). Peer akan menelepon panggilan balik yang diberikan dengan ̀ void onChannelRequest(ChannelRequestCallBack&&& cb); dan akan menolak atau menerima permintaan. Jika diterima, peer akan menjawab dengan ChannelRequest dengan data yang sama (dan ̀isAnswer = true`) dan kemudian kedua peer callbacks akan dipicu untuk menginformasikan bahwa ChannelSock dapat digunakan.

Menutup saluran

Sebuah EOF dikirimkan untuk saluran jika panjang kontennya 0.

Struktur koneksiManager

Pemilik

  1. Sebuah Akun Jami memiliki ConnectionManager dan memiliki akses ke objek ChannelSocket (shared_ptr milik dengan MultiplexedSocket.

  2. ConnectionManager memiliki MultiplexedSockets dan objek ICE

  3. MultiplexedSockets memiliki transportasi TLS dan objek ChannelSocket

  4. ChannelSocket memiliki buffer data

Peran

  1. ConnectionManager digunakan untuk mengelola koneksi ke rekan-rekan.

  2. MultiplexedSockets digunakan untuk mengirim data melalui TLSSocket, membaca paket masuk dan mengelola saluran.

  3. ChannelSockets digunakan oleh klien untuk berinteraksi dengan rekan lainnya.

Penggunaan

Skenario dijelaskan dalam tes unit yang sesuai (test/unitTest/connectionManager/connectionManager.cpp)