use libp2p::{identity::Keypair, swarm::NetworkInfo, Multiaddr, PeerId, TransportError};
use std::io;
use tracing::info;
use crate::{Satellite, TatamiError};
use super::message::Message;
impl Satellite {
pub fn local_peer_id(&self) -> PeerId {
*self.swarm.0.local_peer_id()
}
pub fn keypair(&self) -> Keypair {
self.config.keypair.clone()
}
pub fn get_closest_peers(&mut self, peer_id: PeerId) {
info!("Searching for the closest peers to {:?}", peer_id);
self.swarm
.0
.behaviour_mut()
.kademlia
.get_closest_peers(peer_id);
}
pub fn dial_peer(&mut self, peer_id: PeerId) -> Result<(), libp2p::swarm::DialError> {
self.swarm.0.dial(peer_id)
}
pub fn dial_address(&mut self, address: Multiaddr) -> Result<(), libp2p::swarm::DialError> {
self.swarm.0.dial(address)
}
pub fn listeners(&self) -> Vec<Multiaddr> {
self.swarm
.0
.listeners()
.map(std::clone::Clone::clone)
.collect()
}
pub fn listen_on(&mut self, addr: Multiaddr) -> Result<(), TransportError<io::Error>> {
self.swarm.0.listen_on(addr)?;
Ok(())
}
pub fn ban_peer_id(&mut self, peer_id: PeerId) {
self.swarm.0.ban_peer_id(peer_id);
self.swarm
.0
.behaviour_mut()
.gossipsub
.blacklist_peer(&peer_id);
}
pub fn unban_peer_id(&mut self, peer_id: PeerId) {
self.swarm.0.unban_peer_id(peer_id);
self.swarm
.0
.behaviour_mut()
.gossipsub
.remove_blacklisted_peer(&peer_id);
}
pub fn connected_peers(&self) -> Vec<PeerId> {
self.swarm.0.connected_peers().copied().collect()
}
pub fn disconnect_peer_id(&mut self, peer_id: PeerId) -> Result<(), TatamiError> {
self.swarm
.0
.disconnect_peer_id(peer_id)
.or(Err(TatamiError::Generic))
}
pub fn is_connected(&mut self, peer_id: &PeerId) -> bool {
self.swarm.0.is_connected(peer_id)
}
pub fn network_info(&self) -> NetworkInfo {
self.swarm.0.network_info()
}
pub fn add_address(&mut self, peer_id: &PeerId, multiaddr: Multiaddr) {
self.swarm
.0
.behaviour_mut()
.kademlia
.add_address(peer_id, multiaddr);
}
pub fn publish_message(&mut self, message: Message) -> Result<(), TatamiError> {
let step = self.swarm.0.behaviour_mut().gossipsub.publish(
Self::topic(),
serde_json::to_vec(&message).or(Err(TatamiError::Generic))?,
);
step.or(Err(TatamiError::Generic))?;
Ok(())
}
pub fn publish(&mut self, payload: Vec<u8>) -> Result<(), TatamiError> {
let message = Message::create(payload, self.keypair())?;
self.publish_message(message)
}
}