mesquitte-core 0.1.0

MQTT v3.1.1/v5.0 library.
Documentation
use std::{net::SocketAddr, sync::Arc};

use tokio::net::TcpListener;

#[cfg(feature = "mqtts")]
use crate::server::config::TlsConfig;
use crate::server::{process_client, state::GlobalState};

use super::Error;

pub struct TcpServer {
    inner: TcpListener,
    global: Arc<GlobalState>,
}

impl TcpServer {
    pub async fn bind(addr: SocketAddr, global: Arc<GlobalState>) -> Result<Self, Error> {
        let listener = TcpListener::bind(addr).await?;
        Ok(Self {
            inner: listener,
            global,
        })
    }

    #[cfg(feature = "mqtt")]
    pub async fn accept(&self) -> Result<(), Error> {
        while let Ok((stream, _addr)) = self.inner.accept().await {
            let global = self.global.clone();
            tokio::spawn(async move {
                process_client(stream, global).await;
            });
        }
        Ok(())
    }

    #[cfg(feature = "mqtts")]
    pub async fn accept_tls(&self, tls: &TlsConfig) -> Result<(), Error> {
        use crate::server::rustls::rustls_acceptor;

        let acceptor = rustls_acceptor(tls)?;
        while let Ok((stream, _addr)) = self.inner.accept().await {
            match acceptor.accept(stream).await {
                Ok(stream) => {
                    let global = self.global.clone();
                    tokio::spawn(async move { process_client(stream, global).await });
                }
                Err(err) => {
                    log::warn!("accept tls stream failed: {err}");
                    continue;
                }
            }
        }
        Ok(())
    }
}