use std::collections::HashMap;
use std::net::SocketAddr;
use std::sync::Arc;
use datacake_rpc::Channel;
use parking_lot::RwLock;
use tracing::trace;
#[derive(Clone, Default)]
pub struct RpcNetwork {
clients: Arc<RwLock<HashMap<SocketAddr, Channel>>>,
}
impl RpcNetwork {
pub fn get_or_connect(&self, addr: SocketAddr) -> Channel {
{
let guard = self.clients.read();
if let Some(channel) = guard.get(&addr) {
return channel.clone();
}
}
trace!(addr = %addr, "Connect client to network.");
self.connect(addr)
}
pub fn connect(&self, addr: SocketAddr) -> Channel {
let channel = Channel::connect(addr);
{
let mut guard = self.clients.write();
guard.insert(addr, channel.clone());
}
channel
}
pub fn disconnect(&self, addr: SocketAddr) {
let mut guard = self.clients.write();
guard.remove(&addr);
}
}