cyfs_lib/ws/
server.rs

1use super::request::*;
2use super::session_manager::*;
3use crate::base::{BaseTcpListener, BaseTcpListenerHandler};
4use cyfs_base::*;
5
6use async_std::net::TcpStream;
7use std::net::SocketAddr;
8use std::sync::Arc;
9
10#[derive(Clone)]
11pub struct WebSocketServer {
12    tcp_server: BaseTcpListener,
13
14    session_manager: WebSocketSessionManager,
15}
16
17impl WebSocketServer {
18    pub fn new(addr: SocketAddr, handler: Box<dyn WebSocketRequestHandler>) -> Self {
19        let ret = Self {
20            tcp_server: BaseTcpListener::new(addr),
21            session_manager: WebSocketSessionManager::new(handler),
22        };
23
24        let tcp_handler = Arc::new(Box::new(ret.clone()) as Box<dyn BaseTcpListenerHandler>);
25        ret.tcp_server.bind_handler(tcp_handler);
26
27        ret
28    }
29
30    pub fn get_addr(&self) -> SocketAddr {
31        self.tcp_server.get_addr()
32    }
33
34    pub async fn start(&self) -> BuckyResult<()> {
35        match self.tcp_server.start().await {
36            Ok(_) => {
37                info!("ws server start success! addr={}", self.get_addr());
38                Ok(())
39            }
40            Err(e) => {
41                info!("ws server start failed! addr={}, {}", self.get_addr(), e);
42                Err(e)
43            }
44        }
45    }
46
47    pub async fn stop(&self) {
48        self.tcp_server.stop().await
49    }
50}
51
52#[async_trait::async_trait]
53impl BaseTcpListenerHandler for WebSocketServer {
54    async fn on_accept(&self, tcp_stream: TcpStream) -> BuckyResult<()> {
55        let local_addr = tcp_stream.local_addr().map_err(|e| {
56            let msg = format!("get local_addr from tcp stream but failed! {}", e);
57            error!("{}", msg);
58            BuckyError::new(BuckyErrorCode::NotConnected, msg)
59        })?;
60
61        let peer_addr = tcp_stream.peer_addr().map_err(|e| {
62            let msg = format!("get peer_addr from tcp stream but failed! {}", e);
63            error!("{}", msg);
64            BuckyError::new(BuckyErrorCode::NotConnected, msg)
65        })?;
66
67        let conn_info = (local_addr, peer_addr);
68
69        self.session_manager
70            .run_server_session(conn_info.1.to_string(), conn_info, tcp_stream);
71        Ok(())
72    }
73}