xref: /xiu/protocol/rtmp/src/rtmp.rs (revision 53a2e033)
1 use super::channels::define::ChannelEventProducer;
2 
3 use super::session::server_session;
4 use std::net::SocketAddr;
5 use tokio::io::Error;
6 use tokio::net::TcpListener;
7 
8 pub struct RtmpServer {
9     address: String,
10     event_producer: ChannelEventProducer,
11 }
12 
13 impl RtmpServer {
14     pub fn new(address: String, event_producer: ChannelEventProducer) -> Self {
15         env_logger::init();
16         Self {
17             address,
18             event_producer,
19         }
20     }
21 
22     pub async fn run(&mut self) -> Result<(), Error> {
23         let socket_addr: &SocketAddr = &self.address.parse().unwrap();
24         let listener = TcpListener::bind(socket_addr).await?;
25 
26         let mut idx = 0;
27 
28         loop {
29             let (tcp_stream, _) = listener.accept().await?;
30             //tcp_stream.set_keepalive(Some(Duration::from_secs(30)))?;
31 
32             let mut session =
33                 server_session::ServerSession::new(tcp_stream, self.event_producer.clone(), idx);
34             tokio::spawn(async move {
35                 if let Err(err) = session.run().await {
36                     print!(
37                         "session type: {}, id {}, session error {}\n",
38                         session.session_type, session.session_id, err
39                     );
40                     log::error!(
41                         "session type: {}, id {}, session error {}\n",
42                         session.session_type,
43                         session.session_id,
44                         err
45                     );
46                 }
47             });
48 
49             idx = idx + 1;
50         }
51     }
52 }
53