sheave_server/net/
rtmp.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
use std::{
    io::{
        Error as IOError,
        Result as IOResult
    },
    net::{
        SocketAddr,
        TcpListener as StdListener
    },
    task::{
        Context,
        Poll
    }
};
use futures::ready;
use tokio::net::{
    TcpListener as TokioListener,
    ToSocketAddrs
};
use sheave_core::net::rtmp::*;

#[derive(Debug)]
pub struct RtmpListener {
    tokio_listener: TokioListener
}

impl RtmpListener {
    fn new(tokio_listener: TokioListener) -> Self {
        Self { tokio_listener }
    }

    pub async fn bind<A: ToSocketAddrs>(addr: A) -> IOResult<Self> {
        TokioListener::bind(addr).await.map(Self::new)
    }

    pub async fn accept(&self) -> IOResult<(RtmpStream, SocketAddr)> {
        let (tokio_stream, addr) = self.tokio_listener.accept().await?;
        Ok((RtmpStream::from(tokio_stream), addr))
    }

    pub fn poll_accept(&self, cx: &mut Context<'_>) -> Poll<IOResult<(RtmpStream, SocketAddr)>> {
        let (tokio_stream, addr) = ready!(self.tokio_listener.poll_accept(cx))?;
        Poll::Ready(Ok((RtmpStream::from(tokio_stream), addr)))
    }

    pub fn from_std(std_listener: StdListener) -> IOResult<Self> {
        TokioListener::from_std(std_listener).map(Self::new)
    }

    pub fn into_std(self) -> IOResult<StdListener> {
        self.tokio_listener.into_std()
    }

    pub fn local_addr(&self) -> IOResult<SocketAddr> {
        self.tokio_listener.local_addr()
    }

    pub fn ttl(&self) -> IOResult<u32> {
        self.tokio_listener.ttl()
    }

    pub fn set_ttl(&self, ttl: u32) -> IOResult<()> {
        self.tokio_listener.set_ttl(ttl)
    }
}

impl TryFrom<StdListener> for RtmpListener {
    type Error = IOError;

    fn try_from(std_listener: StdListener) -> IOResult<Self> {
        Self::from_std(std_listener)
    }
}

#[cfg(unix)]
mod sys {
    use std::os::unix::prelude::*;
    use super::RtmpListener;

    impl AsRawFd for RtmpListener {
        fn as_raw_fd(&self) -> RawFd {
            self.tokio_listener.as_raw_fd()
        }
    }

    impl AsFd for RtmpListener {
        fn as_fd(&self) -> BorrowedFd<'_> {
            self.tokio_listener.as_fd()
        }
    }
}

#[cfg(any(all(doc, docsrs), windows))]
#[cdg_attr(docsrs, doc(cfg(windows)))]
mod sys {
    use tokio::os::windows::io::{
        AsRawSocket,
        AsSocket,
        BorrowedSocket,
        Rawsocket
    };
    use super::RtmpListener;

    impl AsRawSocket for RtmpListener {
        fn as_raw_socket(&self) -> RawSocket {
            self.tokio_listener.as_raw_socket()
        }
    }

    impl AsSocket for RtmpListener {
        fn as_socket(&self) -> BorrowedFd<'_> {
            self.tokio_listener.as_socket()
        }
    }
}

#[cfg(all(tokio_unstable, target_os = "wasi"))]
#[cfg_attr(docsrs, doc(cfg(tokio_unstable)))]
mod sys {
    use std::os::wasi::prelude::*;
    use super::RtmpListener;

    impl AsRawFd for RtmpListener {
        fn as_raw_fd(&self) -> RawFd {
            self.tokio_listener.as_raw_fd()
        }
    }

    impl AsFd for RtmpListener {
        fn as_fd(&self) -> BorrowedFd<'_> {
            self.tokio_listener.as_fd()
        }
    }
}