Skip to main content

flare_core/transport/
factory.rs

1use crate::common::error::{FlareError, Result};
2use crate::transport::connection::Connection;
3#[cfg(feature = "quic")]
4use crate::transport::quic::QUICTransport;
5#[cfg(feature = "tcp")]
6use crate::transport::tcp::TCPTransport;
7#[cfg(feature = "websocket")]
8use crate::transport::websocket::WebSocketTransport;
9#[cfg(any(feature = "websocket", feature = "tcp"))]
10use tokio::net::TcpStream;
11#[cfg(feature = "websocket")]
12use tokio_tungstenite::{MaybeTlsStream, WebSocketStream};
13
14/// An enumeration of supported transport types.
15pub enum TransportType {
16    WebSocket,
17    QUIC,
18    TCP,
19}
20
21#[allow(clippy::large_enum_variant)]
22pub enum StreamWrapper {
23    #[cfg(feature = "websocket")]
24    WebSocket(Box<WebSocketStream<MaybeTlsStream<TcpStream>>>),
25    #[cfg(feature = "quic")]
26    QUIC {
27        send: quinn::SendStream,
28        recv: quinn::RecvStream,
29    },
30    #[cfg(feature = "tcp")]
31    TCP(TcpStream),
32}
33
34/// A factory for creating transport layer connections.
35pub struct TransportFactory;
36
37impl TransportFactory {
38    pub fn create_connection(
39        transport_type: TransportType,
40        stream: StreamWrapper,
41    ) -> Result<Box<dyn Connection>> {
42        match (transport_type, stream) {
43            #[cfg(feature = "websocket")]
44            (TransportType::WebSocket, StreamWrapper::WebSocket(ws_stream)) => {
45                Ok(Box::new(WebSocketTransport::new(*ws_stream)))
46            }
47            #[cfg(feature = "quic")]
48            (TransportType::QUIC, StreamWrapper::QUIC { send, recv }) => {
49                Ok(Box::new(QUICTransport::new(send, recv)))
50            }
51            #[cfg(feature = "tcp")]
52            (TransportType::TCP, StreamWrapper::TCP(tcp_stream)) => {
53                Ok(Box::new(TCPTransport::new(tcp_stream)))
54            }
55            #[allow(unreachable_patterns)]
56            _ => Err(FlareError::protocol_error(
57                "Mismatched transport type and stream",
58            )),
59        }
60    }
61}