use super::transports::{PollingTransport, WebsocketSecureTransport, WebsocketTransport};
use crate::error::Result;
use adler32::adler32;
use bytes::Bytes;
use std::time::{Duration, SystemTime};
use url::Url;
pub trait Transport {
fn emit(&self, data: Bytes, is_binary_att: bool) -> Result<()>;
fn poll(&self, timeout: Duration) -> Result<Bytes>;
fn base_url(&self) -> Result<Url>;
fn set_base_url(&self, base_url: Url) -> Result<()>;
fn address(&self) -> Result<Url> {
let reader = format!("{:#?}", SystemTime::now());
let hash = adler32(reader.as_bytes()).unwrap();
let mut url = self.base_url()?;
url.query_pairs_mut().append_pair("t", &hash.to_string());
Ok(url)
}
}
#[derive(Debug)]
pub enum TransportType {
Polling(PollingTransport),
WebsocketSecure(WebsocketSecureTransport),
Websocket(WebsocketTransport),
}
impl From<PollingTransport> for TransportType {
fn from(transport: PollingTransport) -> Self {
TransportType::Polling(transport)
}
}
impl From<WebsocketSecureTransport> for TransportType {
fn from(transport: WebsocketSecureTransport) -> Self {
TransportType::WebsocketSecure(transport)
}
}
impl From<WebsocketTransport> for TransportType {
fn from(transport: WebsocketTransport) -> Self {
TransportType::Websocket(transport)
}
}
impl TransportType {
pub fn as_transport(&self) -> &dyn Transport {
match self {
TransportType::Polling(transport) => transport,
TransportType::Websocket(transport) => transport,
TransportType::WebsocketSecure(transport) => transport,
}
}
}
impl std::fmt::Debug for dyn Transport {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_fmt(format_args!("Transport(base_url: {:?})", self.base_url(),))
}
}