#[cfg(feature = "websocket")]
use std::sync::Arc;
#[cfg(feature = "websocket")]
use crate::websocket::connection::ConnectionManager;
#[cfg(feature = "websocket")]
use crate::websocket::message::WebSocketMessage;
#[cfg(feature = "websocket")]
use crate::websocket::WebSocketConnection;
#[cfg(feature = "websocket")]
impl ConnectionManager {
pub async fn broadcast(&self, message: &Arc<WebSocketMessage>) {
let mut failed_connections: Vec<String> = Vec::new();
let conns: Vec<WebSocketConnection> = {
match self.connections.read() {
Ok(map) => map.values().cloned().collect(),
Err(_) => {
log::warn!("websocket connections lock poisoned; broadcast aborted");
return;
}
}
};
for conn in conns {
if conn.send(message.as_ref().clone()).await.is_err() {
failed_connections.push(conn.id().to_string());
}
}
for conn_id in failed_connections {
self.remove_connection(&conn_id).await;
}
}
}