use crate::server::{ServerEvent, ServerOptions};
use crate::transport::{
PollingResponder, PollingTransportOptions, TransportEvent, TransportImpl, WebsocketTransportOptions,
};
use async_trait::async_trait;
use tokio::sync::{broadcast, mpsc};
pub struct ListenOptions {
pub path: &'static str,
pub handle_preflight_request: Option<Box<dyn Fn() + Send + 'static>>,
pub destroy_upgrade_timeout: Option<u32>,
}
impl Default for ListenOptions {
fn default() -> ListenOptions {
ListenOptions {
path: "/engine.io",
handle_preflight_request: None,
destroy_upgrade_timeout: Some(1000),
}
}
}
#[async_trait]
pub trait Adapter: 'static + Send + Sync + Sized {
type WebSocket: TransportImpl<Self::Response>;
type Polling: TransportImpl<Self::Response> + PollingResponder<Self::Response>;
type Options;
type Response;
fn new(server_options: ServerOptions, options: Self::Options) -> Self;
async fn listen(&self, options: ListenOptions) -> std::io::Result<()>;
async fn subscribe(&self) -> broadcast::Receiver<ServerEvent>;
async fn close(&self);
fn create_websocket_transport(
sid: &str,
options: WebsocketTransportOptions,
event_sender: mpsc::Sender<TransportEvent>,
) -> Self::WebSocket;
fn create_polling_transport(
sid: &str,
options: PollingTransportOptions,
event_sender: mpsc::Sender<TransportEvent>,
) -> Self::Polling;
}