srt-tokio 0.3.0

SRT implementation in Rust
Documentation
use anyhow::Result;
use srt_tokio::SrtSocket;
use std::time::Duration;
use tokio::time::sleep;

use futures::prelude::*;

async fn test_latency_exchange(
    connector_send_latency: Duration,
    connector_rec_latency: Duration,
    listener_send_latency: Duration,
    listener_recv_latency: Duration,
) -> Result<()> {
    let connector = SrtSocket::builder()
        .send_latency(connector_send_latency)
        .receive_latency(connector_rec_latency)
        .call("127.0.0.1:4200", None);

    let listener = SrtSocket::builder()
        .send_latency(listener_send_latency)
        .receive_latency(listener_recv_latency)
        .listen_on(":4200");

    let ((l2c1, c2l1), (l2c2, c2l2)) = futures::join!(
        async move {
            let mut c = connector.await.unwrap();
            let c2l = c.settings().send_tsbpd_latency;
            let l2c = c.settings().recv_tsbpd_latency;
            c.close().await.unwrap();
            (l2c, c2l)
        },
        async move {
            let mut c = listener.await.unwrap();
            let l2c = c.settings().send_tsbpd_latency;
            let c2l = c.settings().recv_tsbpd_latency;
            c.close().await.unwrap();
            (l2c, c2l)
        },
    );

    let expected_l2c = Duration::max(connector_rec_latency, listener_send_latency);
    let expected_c2l = Duration::max(connector_send_latency, listener_recv_latency);

    assert_eq!(l2c1, expected_l2c);
    assert_eq!(l2c2, expected_l2c);
    assert_eq!(c2l1, expected_c2l);
    assert_eq!(c2l2, expected_c2l);

    Ok(())
}

#[tokio::test]
async fn latency_exchange() -> Result<()> {
    let from_secs = Duration::from_secs;

    let _ = pretty_env_logger::try_init();

    test_latency_exchange(from_secs(3), from_secs(4), from_secs(5), from_secs(4)).await?;
    sleep(from_secs(2)).await;
    test_latency_exchange(from_secs(4), from_secs(5), from_secs(5), from_secs(3)).await?;

    Ok(())
}