use crate::error::Result;
use async_trait::async_trait;
use std::io;
#[cfg(not(target_arch = "wasm32"))]
#[async_trait]
#[allow(async_fn_in_trait)]
pub trait Transport: Send + Sync {
async fn read(&mut self, buf: &mut [u8]) -> io::Result<usize>;
async fn write(&mut self, buf: &[u8]) -> io::Result<()>;
async fn write_all(&mut self, buf: &[u8]) -> io::Result<()>;
async fn flush(&mut self) -> io::Result<()>;
fn is_connected(&self) -> bool;
async fn close(&mut self) -> io::Result<()>;
}
#[cfg(target_arch = "wasm32")]
#[async_trait(?Send)]
#[allow(async_fn_in_trait)]
pub trait Transport {
async fn read(&mut self, buf: &mut [u8]) -> io::Result<usize>;
async fn write(&mut self, buf: &[u8]) -> io::Result<()>;
async fn write_all(&mut self, buf: &[u8]) -> io::Result<()>;
async fn flush(&mut self) -> io::Result<()>;
fn is_connected(&self) -> bool;
async fn close(&mut self) -> io::Result<()>;
}
pub struct TransportConfig {
pub host: String,
pub port: u16,
#[cfg(target_arch = "wasm32")]
pub websocket_url: Option<String>,
#[cfg(target_arch = "wasm32")]
pub auth_token: Option<String>,
}
pub async fn create_transport(config: TransportConfig) -> Result<Box<dyn Transport>> {
#[cfg(not(target_arch = "wasm32"))]
{
tcp::create_tcp_transport(&config.host, config.port).await
}
#[cfg(target_arch = "wasm32")]
{
websocket::create_websocket_transport(config).await
}
}
#[cfg(not(target_arch = "wasm32"))]
pub mod tcp;
#[cfg(target_arch = "wasm32")]
pub mod websocket;