use snarkvm::prelude::{Address, Network};
use std::{collections::HashMap, net::SocketAddr};
#[derive(Debug)]
pub struct Resolver<N: Network> {
to_listener: HashMap<SocketAddr, SocketAddr>,
address_peers: HashMap<Address<N>, SocketAddr>,
}
impl<N: Network> Default for Resolver<N> {
fn default() -> Self {
Self::new()
}
}
impl<N: Network> Resolver<N> {
pub fn new() -> Self {
Self { to_listener: Default::default(), address_peers: Default::default() }
}
}
impl<N: Network> Resolver<N> {
pub fn get_listener(&self, connected_addr: SocketAddr) -> Option<SocketAddr> {
self.to_listener.get(&connected_addr).copied()
}
pub fn get_peer_ip_for_address(&self, aleo_addr: Address<N>) -> Option<SocketAddr> {
self.address_peers.get(&aleo_addr).copied()
}
pub fn insert_peer(
&mut self,
listener_addr: SocketAddr,
connected_addr: SocketAddr,
aleo_addr: Option<Address<N>>,
) {
self.to_listener.insert(connected_addr, listener_addr);
if let Some(addr) = aleo_addr {
self.address_peers.insert(addr, listener_addr);
}
}
pub fn remove_peer(&mut self, connected_addr: SocketAddr, aleo_addr: Option<Address<N>>) {
self.to_listener.remove(&connected_addr);
if let Some(addr) = aleo_addr {
self.address_peers.remove(&addr);
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use snarkvm::{prelude::Rng, utilities::TestRng};
type CurrentNetwork = snarkvm::prelude::MainnetV0;
#[test]
fn test_resolver() {
let mut resolver = Resolver::<CurrentNetwork>::new();
let listener_ip = SocketAddr::from(([127, 0, 0, 1], 1234));
let peer_addr = SocketAddr::from(([127, 0, 0, 1], 4321));
let mut rng = TestRng::default();
let address = Address::<CurrentNetwork>::new(rng.r#gen());
assert!(resolver.get_listener(peer_addr).is_none());
assert!(resolver.get_peer_ip_for_address(address).is_none());
resolver.insert_peer(listener_ip, peer_addr, Some(address));
assert_eq!(resolver.get_listener(peer_addr).unwrap(), listener_ip);
assert_eq!(resolver.get_peer_ip_for_address(address).unwrap(), listener_ip);
resolver.remove_peer(peer_addr, Some(address));
assert!(resolver.get_listener(peer_addr).is_none());
assert!(resolver.get_peer_ip_for_address(address).is_none());
}
}