use super::command::Command;
use crate::{
network::origin::Origin,
peer::{error::Error as PeerError, info::PeerInfo},
swarm::protocols::iota_gossip::{GossipReceiver, GossipSender},
};
use libp2p::{swarm::NegotiatedSubstream, Multiaddr, PeerId};
use tokio::sync::mpsc;
pub type EventSender = mpsc::UnboundedSender<Event>;
pub type EventReceiver = mpsc::UnboundedReceiver<Event>;
pub type InternalEventReceiver = mpsc::UnboundedReceiver<InternalEvent>;
pub type InternalEventSender = mpsc::UnboundedSender<InternalEvent>;
pub fn event_channel<T>() -> (mpsc::UnboundedSender<T>, mpsc::UnboundedReceiver<T>) {
mpsc::unbounded_channel()
}
#[derive(Debug)]
#[non_exhaustive]
pub enum Event {
AddressBanned {
address: Multiaddr,
},
AddressUnbanned {
address: Multiaddr,
},
AddressBound {
address: Multiaddr,
},
CommandFailed {
command: Command,
reason: PeerError,
},
LocalIdCreated {
local_id: PeerId,
},
PeerAdded {
peer_id: PeerId,
info: PeerInfo,
},
PeerBanned {
peer_id: PeerId,
},
PeerConnected {
peer_id: PeerId,
info: PeerInfo,
gossip_in: GossipReceiver,
gossip_out: GossipSender,
},
PeerDisconnected {
peer_id: PeerId,
},
PeerRemoved {
peer_id: PeerId,
},
PeerUnbanned {
peer_id: PeerId,
},
}
#[derive(Debug)]
pub enum InternalEvent {
AddressBound {
address: Multiaddr,
},
ProtocolEstablished {
peer_id: PeerId,
peer_addr: Multiaddr,
origin: Origin,
substream: Box<NegotiatedSubstream>,
},
ProtocolDropped { peer_id: PeerId },
}
pub struct NetworkEventReceiver(EventReceiver);
impl NetworkEventReceiver {
pub(crate) fn new(inner: EventReceiver) -> Self {
Self(inner)
}
pub async fn recv(&mut self) -> Option<Event> {
self.0.recv().await
}
}
impl From<NetworkEventReceiver> for EventReceiver {
fn from(rx: NetworkEventReceiver) -> EventReceiver {
rx.0
}
}