engine_io_server 0.1.0

A web framework-agnostic Engine.io protocol implementation for Socket.IO
Documentation
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>>,
    // destroyUpgrade and destroyUpgradeTimeout from the JS engine.io implementation.
    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;
}