use std::sync::Arc;
use futures_util::stream::{SplitSink, SplitStream};
use tokio_tungstenite::{MaybeTlsStream, WebSocketStream, tungstenite::Message};
#[cfg(not(feature = "turmoil"))]
pub(crate) type MessageWriter =
SplitSink<WebSocketStream<MaybeTlsStream<tokio::net::TcpStream>>, Message>;
#[cfg(not(feature = "turmoil"))]
pub type MessageReader = SplitStream<WebSocketStream<MaybeTlsStream<tokio::net::TcpStream>>>;
#[cfg(feature = "turmoil")]
pub(crate) type MessageWriter =
SplitSink<WebSocketStream<MaybeTlsStream<crate::net::TcpStream>>, Message>;
#[cfg(feature = "turmoil")]
pub type MessageReader = SplitStream<WebSocketStream<MaybeTlsStream<crate::net::TcpStream>>>;
pub type MessageHandler = Arc<dyn Fn(Message) + Send + Sync>;
pub type PingHandler = Arc<dyn Fn(Vec<u8>) + Send + Sync>;
#[must_use]
pub fn channel_message_handler() -> (
MessageHandler,
tokio::sync::mpsc::UnboundedReceiver<Message>,
) {
let (tx, rx) = tokio::sync::mpsc::unbounded_channel();
let handler = Arc::new(move |msg: Message| {
if let Err(e) = tx.send(msg) {
log::debug!("Failed to send message to channel: {e}");
}
});
(handler, rx)
}
#[derive(Debug)]
pub(crate) enum WriterCommand {
Update(MessageWriter, tokio::sync::oneshot::Sender<bool>),
Send(Message),
}