#![allow(dead_code)]
use axum::extract::ws::{Message, WebSocket, WebSocketUpgrade};
use axum::response::IntoResponse;
use tracing::{debug, info};
pub async fn ws_handler(ws: WebSocketUpgrade) -> impl IntoResponse {
ws.on_upgrade(handle_socket)
}
async fn handle_socket(mut socket: WebSocket) {
info!("WebSocket connection established");
while let Some(msg) = socket.recv().await {
let msg = match msg {
Ok(msg) => msg,
Err(e) => {
debug!("WebSocket error: {}", e);
break;
}
};
match msg {
Message::Text(text) => {
debug!("Received text: {}", text);
if let Err(e) = socket
.send(Message::Text(format!("Echo: {}", text).into()))
.await
{
debug!("Failed to send: {}", e);
break;
}
}
Message::Binary(data) => {
debug!("Received binary: {} bytes", data.len());
}
Message::Ping(data) => {
if let Err(e) = socket.send(Message::Pong(data)).await {
debug!("Failed to send pong: {}", e);
break;
}
}
Message::Pong(_) => {}
Message::Close(_) => {
info!("WebSocket closed by client");
break;
}
}
}
info!("WebSocket connection closed");
}