pub mod socket;
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn start_websocket() {
use crate::socket::{WebSocketMessage, WebsocketServer};
let ws_server = WebsocketServer::new("0.0.0.0".to_string(), "5000".to_string(), None, None);
let ws_server_clone = ws_server.clone();
let mut ws_message_receiver = ws_server.start().await;
tokio::spawn(async move {
while let Some((client_id, message)) = ws_message_receiver.recv().await {
match message {
WebSocketMessage::Text(text) => {
tracing::info!("Received text message from {}: {}", client_id, text);
let response = WebSocketMessage::Text(format!("Echo: {}", text));
if let Err(e) = ws_server_clone
.send_to_client(client_id.clone(), response)
.await
{
tracing::error!("Failed to respond to client {}: {}", client_id, e);
}
}
WebSocketMessage::Binary(data) => {
tracing::info!(
"Received binary message from {}: {} bytes",
client_id,
data.len()
);
let response = WebSocketMessage::Binary(data);
if let Err(e) = ws_server_clone
.send_to_client(client_id.clone(), response)
.await
{
tracing::error!("Failed to respond to client {}: {}", client_id, e);
}
}
WebSocketMessage::Ping(_data) => {
tracing::info!("Ping received from client {}", client_id);
}
WebSocketMessage::Close(_) => {
tracing::info!("Client {} requested to close connection", client_id);
}
_ => {
tracing::info!(
"Received other message type from {}: {:?}",
client_id,
message
);
}
}
}
});
}
}