use std::thread;
use razer_ws::util::Token;
use crate::event::event_type::Event;
use crate::listener::CONNECTIONS;
pub fn send(client: &razer_ws::Sender, event: Event, data: &str) -> Result<(), ()> {
if crate::connections::closed(client) {
return Err(());
}
if client
.send(format!(
"{{\"name\":\"{}\", \"data\":\"{}\"}}",
event,
data.replace("\"", "\\\"")
))
.is_ok()
{
return Ok(());
} else {
return Err(());
}
}
pub fn send_to(
client: &razer_ws::Sender,
token: Token,
event: Event,
data: &str,
) -> Result<(), ()> {
let mut new_client = client.clone();
let connections = CONNECTIONS.lock().unwrap();
let connection = connections.clone();
drop(connections);
if connection.contains_key(&token.0) {
new_client.change_token(token, *connection.get(&token.0).unwrap());
if crate::connections::closed(&new_client) {
return Err(());
}
send(&new_client, event, data)
} else {
Err(())
}
}
pub fn broadcast(client: &razer_ws::Sender, event: Event, data: &str) {
let connections = CONNECTIONS.lock().unwrap();
let connection = connections.clone();
let mut threads = Vec::new();
drop(connections);
for (i, _) in connection.into_iter() {
let message = data.to_string();
let client = client.clone();
threads.push(thread::spawn(move || {
let _ = send_to(&client, Token::from(i.clone()), event.clone(), &message);
}));
}
for i in threads {
i.join().unwrap()
}
}