use std::{
pin::Pin,
sync::Arc,
time::Duration,
};
use anyhow::Result;
use tokio_tungstenite::tungstenite::protocol::WebSocketConfig;
use crate::{
connection::WsIoServerConnection,
core::{
packet::codecs::WsIoPacketCodec,
types::{
ArcAsyncUnaryResultHandler,
BoxAsyncUnaryResultHandler,
},
},
};
type InitRequestHandler = Box<
dyn for<'a> Fn(
Arc<WsIoServerConnection>,
&'a WsIoPacketCodec,
) -> Pin<Box<dyn Future<Output = Result<Option<Vec<u8>>>> + Send + 'a>>
+ Send
+ Sync
+ 'static,
>;
type InitResponseHandler = Box<
dyn for<'a> Fn(
Arc<WsIoServerConnection>,
Option<&'a [u8]>,
&'a WsIoPacketCodec,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'a>>
+ Send
+ Sync
+ 'static,
>;
pub(crate) struct WsIoServerNamespaceConfig {
pub(crate) broadcast_concurrency_limit: usize,
pub(super) http_request_upgrade_timeout: Duration,
pub(crate) init_request_handler: Option<InitRequestHandler>,
pub(crate) init_request_handler_timeout: Duration,
pub(crate) init_response_handler: Option<InitResponseHandler>,
pub(crate) init_response_handler_timeout: Duration,
pub(crate) init_response_timeout: Duration,
pub(crate) middleware: Option<BoxAsyncUnaryResultHandler<WsIoServerConnection>>,
pub(crate) middleware_execution_timeout: Duration,
pub(crate) on_close_handler_timeout: Duration,
pub(crate) on_connect_handler_timeout: Duration,
pub(crate) on_connect_handler: Option<BoxAsyncUnaryResultHandler<WsIoServerConnection>>,
pub(crate) on_ready_handler: Option<ArcAsyncUnaryResultHandler<WsIoServerConnection>>,
pub(crate) packet_codec: WsIoPacketCodec,
pub(super) path: String,
pub(crate) websocket_config: WebSocketConfig,
}