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}