async-ws 0.4.0

async websocket implementation
Documentation
use async_web_server::tcp::{TcpIncoming, TcpStream};
use async_ws::connection::{WsConfig, WsConnection};
use futures::future::join;
use futures::prelude::*;
use std::net::Ipv4Addr;
use std::time::Duration;
async fn start_server_ws(
    mut tcp_incoming: TcpIncoming,
    timeout: Option<Duration>,
) -> WsConnection<TcpStream> {
    let tcp_stream = tcp_incoming.next().await.unwrap();
    let mut config = WsConfig::server();
    if let Some(timeout) = timeout {
        config.timeout = timeout;
    }
    WsConnection::with_config(tcp_stream, config)
}

async fn start_client_transport(port: u16) -> TcpStream {
    TcpStream::connect((Ipv4Addr::LOCALHOST, port))
        .await
        .unwrap()
}

pub async fn start_server_ws_and_client_transport(
    server_timeout: Option<Duration>,
) -> (WsConnection<TcpStream>, TcpStream) {
    let tcp_incoming = TcpIncoming::bind((Ipv4Addr::LOCALHOST, 0)).unwrap();
    let port = tcp_incoming.local_addr().unwrap().port();
    join(
        start_server_ws(tcp_incoming, server_timeout),
        start_client_transport(port),
    )
    .await
}