#listener #networking #tcp-listener #abstraction-layer #service #tcp-connection #client-connection

reception

A Rust library for creating TCP listeners that spawns clients providing model abstraction layer

3 releases

0.1.2 Aug 6, 2023
0.1.1 Aug 6, 2023
0.1.0 Jul 31, 2023

#697 in Asynchronous

MIT license

75KB
1.5K SLoC

reception

ci-master Crates.io docs.rs Crates.io

This crate provides a way of binding a TCP listener that will accept incoming WebSocket connections. Additionally it provides an abstraction layer (see Client) for serializing and deserializing well-defined models.

Examples

#[derive(Debug)]
struct Model {
    payload: Vec<u8>,
}

impl Into<Vec<u8>> for Model {
    fn into(self) -> Vec<u8> {
        self.payload
    }
}

impl TryFrom<Vec<u8>> for Model {
    type Error = anyhow::Error;

    fn try_from(payload: Vec<u8>) -> Result<Self, Self::Error> {
        Ok(Self { payload })
    }
}

fn handle_client(
    client: Client<Connection<WebSocketStream<TcpStream>>, Model, Model>,
    cancellation_token: CancellationToken,
) -> Result<(), Client<Connection<WebSocketStream<TcpStream>>, Model, Model>> {
    tokio::spawn(async move {
        let (tx, mut rx) = unbounded_channel();
        let mut handle = client
            .spawn_with_callback(cancellation_token, move |msg| {
                tx.send(msg).unwrap();
                Ok(())
            })
            .await;

        while let Some(msg) = rx.recv().await {
            handle.send(msg).await.unwrap();
        }
    });
    Ok(())
}

#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<(), anyhow::Error> {
    let cancellation_token = CancellationToken::new();

    let listener =
        reception::Listener::<Model, Model>::bind(Default::default(), cancellation_token.clone())
            .await?;

    let handle = listener
        .spawn_with_callback(cancellation_token.clone(), move |client| {
            handle_client(client, cancellation_token.clone())
        })
        .await;

    handle.await??;

    Ok(())
}

License

See LICENSE.txt file.

Dependencies

~5–14MB
~156K SLoC