Skip to main content

tf_rust_engineio/
transport.rs

1use 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    /// Sends a packet to the server. This optionally handles sending of a
10    /// socketio binary attachment via the boolean attribute `is_binary_att`.
11    fn emit(&self, data: Bytes, is_binary_att: bool) -> Result<()>;
12
13    /// Performs the server long polling procedure as long as the client is
14    /// connected. This should run separately at all time to ensure proper
15    /// response handling from the server.
16    fn poll(&self, timeout: Duration) -> Result<Bytes>;
17
18    /// Returns start of the url. ex. http://localhost:2998/engine.io/?EIO=4&transport=polling
19    /// Must have EIO and transport already set.
20    fn base_url(&self) -> Result<Url>;
21
22    /// Used to update the base path, like when adding the sid.
23    fn set_base_url(&self, base_url: Url) -> Result<()>;
24
25    /// Full query address
26    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}