tf_rust_engineio/
transport.rs1use super::transports::{PollingTransport, WebsocketSecureTransport, WebsocketTransport};
2use crate::error::Result;
3use adler32::adler32;
4use bytes::Bytes;
5use std::time::{Duration, SystemTime};
6use url::Url;
7
8pub trait Transport {
9 fn emit(&self, data: Bytes, is_binary_att: bool) -> Result<()>;
12
13 fn poll(&self, timeout: Duration) -> Result<Bytes>;
17
18 fn base_url(&self) -> Result<Url>;
21
22 fn set_base_url(&self, base_url: Url) -> Result<()>;
24
25 fn address(&self) -> Result<Url> {
27 let reader = format!("{:#?}", SystemTime::now());
28 let hash = adler32(reader.as_bytes()).unwrap();
29 let mut url = self.base_url()?;
30 url.query_pairs_mut().append_pair("t", &hash.to_string());
31 Ok(url)
32 }
33}
34
35#[derive(Debug)]
36pub enum TransportType {
37 Polling(PollingTransport),
38 WebsocketSecure(WebsocketSecureTransport),
39 Websocket(WebsocketTransport),
40}
41
42impl From<PollingTransport> for TransportType {
43 fn from(transport: PollingTransport) -> Self {
44 TransportType::Polling(transport)
45 }
46}
47
48impl From<WebsocketSecureTransport> for TransportType {
49 fn from(transport: WebsocketSecureTransport) -> Self {
50 TransportType::WebsocketSecure(transport)
51 }
52}
53
54impl From<WebsocketTransport> for TransportType {
55 fn from(transport: WebsocketTransport) -> Self {
56 TransportType::Websocket(transport)
57 }
58}
59
60impl TransportType {
61 pub fn as_transport(&self) -> &dyn Transport {
62 match self {
63 TransportType::Polling(transport) => transport,
64 TransportType::Websocket(transport) => transport,
65 TransportType::WebsocketSecure(transport) => transport,
66 }
67 }
68}
69
70impl std::fmt::Debug for dyn Transport {
71 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
72 f.write_fmt(format_args!("Transport(base_url: {:?})", self.base_url(),))
73 }
74}