flare_core/transport/
factory.rs1use 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
14pub 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
34pub 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}