use axum::extract::State;
use axum::extract::ws::{Message, WebSocket, WebSocketUpgrade};
use axum::response::IntoResponse;
use super::server::AppState;
pub async fn handler(ws: WebSocketUpgrade, State(state): State<AppState>) -> impl IntoResponse {
ws.on_upgrade(move |socket| handle_socket(socket, state))
}
async fn handle_socket(mut socket: WebSocket, state: AppState) {
let mut rx = state.ws_tx.subscribe();
loop {
tokio::select! {
msg_result = rx.recv() => {
match msg_result {
Ok(msg) => {
if socket.send(Message::Text(msg.into())).await.is_err() {
break;
}
}
Err(_) => {
break;
}
}
}
incoming = socket.recv() => {
match incoming {
Some(Ok(_)) => {
}
_ => break,
}
}
}
}
}