rings-core 0.2.3

Chord DHT implementation with ICE
Documentation
use crate::err::Result;
use crate::prelude::RTCSdpType;
use crate::swarm::Swarm;
use crate::transports::manager::TransportManager;
use crate::types::ice_transport::IceTrickleScheme;

#[cfg(feature = "wasm")]
pub mod wasm;

#[cfg(all(not(feature = "wasm")))]
pub mod default;

pub async fn manually_establish_connection(swarm1: &Swarm, swarm2: &Swarm) -> Result<()> {
    assert!(swarm1.get_transport(swarm2.did()).is_none());
    assert!(swarm2.get_transport(swarm1.did()).is_none());

    let sm1 = swarm1.session_manager();
    let sm2 = swarm2.session_manager();

    let transport1 = swarm1.new_transport().await.unwrap();
    let handshake_info1 = transport1
        .get_handshake_info(sm1, RTCSdpType::Offer)
        .await?;

    let transport2 = swarm2.new_transport().await.unwrap();
    let addr1 = transport2.register_remote_info(handshake_info1).await?;

    assert_eq!(addr1, swarm1.did());

    let handshake_info2 = transport2
        .get_handshake_info(sm2, RTCSdpType::Answer)
        .await?;

    let addr2 = transport1.register_remote_info(handshake_info2).await?;

    assert_eq!(addr2, swarm2.did());

    #[cfg(all(not(feature = "wasm")))]
    {
        let promise_1 = transport1.connect_success_promise().await?;
        let promise_2 = transport2.connect_success_promise().await?;
        promise_1.await?;
        promise_2.await?;
    }

    swarm2
        .register(swarm1.did(), transport2.clone())
        .await
        .unwrap();

    swarm1
        .register(swarm2.did(), transport1.clone())
        .await
        .unwrap();

    assert!(swarm1.get_transport(swarm2.did()).is_some());
    assert!(swarm2.get_transport(swarm1.did()).is_some());

    Ok(())
}