1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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;
}