cyfs-lib 0.8.3

Rust cyfs-lib package
Documentation
use super::request::*;
use super::session_manager::*;
use crate::base::{BaseTcpListener, BaseTcpListenerHandler};
use cyfs_base::*;

use async_std::net::TcpStream;
use std::net::SocketAddr;
use std::sync::Arc;

#[derive(Clone)]
pub struct WebSocketServer {
    tcp_server: BaseTcpListener,

    session_manager: WebSocketSessionManager,
}

impl WebSocketServer {
    pub fn new(addr: SocketAddr, handler: Box<dyn WebSocketRequestHandler>) -> Self {
        let ret = Self {
            tcp_server: BaseTcpListener::new(addr),
            session_manager: WebSocketSessionManager::new(handler),
        };

        let tcp_handler = Arc::new(Box::new(ret.clone()) as Box<dyn BaseTcpListenerHandler>);
        ret.tcp_server.bind_handler(tcp_handler);

        ret
    }

    pub fn get_addr(&self) -> SocketAddr {
        self.tcp_server.get_addr()
    }

    pub async fn start(&self) -> BuckyResult<()> {
        match self.tcp_server.start().await {
            Ok(_) => {
                info!("ws server start success! addr={}", self.get_addr());
                Ok(())
            }
            Err(e) => {
                info!("ws server start failed! addr={}, {}", self.get_addr(), e);
                Err(e)
            }
        }
    }

    pub async fn stop(&self) {
        self.tcp_server.stop().await
    }
}

#[async_trait::async_trait]
impl BaseTcpListenerHandler for WebSocketServer {
    async fn on_accept(&self, tcp_stream: TcpStream) -> BuckyResult<()> {
        let local_addr = tcp_stream.local_addr().map_err(|e| {
            let msg = format!("get local_addr from tcp stream but failed! {}", e);
            error!("{}", msg);
            BuckyError::new(BuckyErrorCode::NotConnected, msg)
        })?;

        let peer_addr = tcp_stream.peer_addr().map_err(|e| {
            let msg = format!("get peer_addr from tcp stream but failed! {}", e);
            error!("{}", msg);
            BuckyError::new(BuckyErrorCode::NotConnected, msg)
        })?;

        let conn_info = (local_addr, peer_addr);

        self.session_manager
            .run_server_session(conn_info.1.to_string(), conn_info, tcp_stream);
        Ok(())
    }
}