bee_network/service/
event.rs

1// Copyright 2020-2021 IOTA Stiftung
2// SPDX-License-Identifier: Apache-2.0
3
4use super::command::Command;
5
6use crate::{
7    network::origin::Origin,
8    peer::{error::Error as PeerError, info::PeerInfo},
9    swarm::protocols::iota_gossip::{GossipReceiver, GossipSender},
10};
11
12use libp2p::{swarm::NegotiatedSubstream, Multiaddr, PeerId};
13use tokio::sync::mpsc;
14
15pub type EventSender = mpsc::UnboundedSender<Event>;
16pub type EventReceiver = mpsc::UnboundedReceiver<Event>;
17pub type InternalEventReceiver = mpsc::UnboundedReceiver<InternalEvent>;
18pub type InternalEventSender = mpsc::UnboundedSender<InternalEvent>;
19
20pub fn event_channel<T>() -> (mpsc::UnboundedSender<T>, mpsc::UnboundedReceiver<T>) {
21    mpsc::unbounded_channel()
22}
23
24/// Describes the public events produced by the networking layer.
25#[derive(Debug)]
26#[non_exhaustive]
27pub enum Event {
28    /// An address was banned.
29    AddressBanned {
30        /// The peer's address.
31        address: Multiaddr,
32    },
33
34    /// An address was unbanned.
35    AddressUnbanned {
36        /// The peer's address.
37        address: Multiaddr,
38    },
39
40    /// An address was bound.
41    AddressBound {
42        /// The assigned bind address.
43        address: Multiaddr,
44    },
45
46    /// A command failed.
47    CommandFailed {
48        /// The command that failed.
49        command: Command,
50        /// The reason for the failure.
51        reason: PeerError,
52    },
53
54    /// The local peer id was created.
55    LocalIdCreated {
56        /// The created peer id from the Ed25519 keypair.
57        local_id: PeerId,
58    },
59
60    /// A peer was added.
61    PeerAdded {
62        /// The peer's id.
63        peer_id: PeerId,
64        /// The peer's info.
65        info: PeerInfo,
66    },
67
68    /// A peer was banned.
69    PeerBanned {
70        /// The peer's id.
71        peer_id: PeerId,
72    },
73
74    /// A peer was connected.
75    PeerConnected {
76        /// The peer's id.
77        peer_id: PeerId,
78        /// The peer's info.
79        info: PeerInfo,
80        /// The peer's message recv channel.
81        gossip_in: GossipReceiver,
82        /// The peer's message send channel.
83        gossip_out: GossipSender,
84    },
85
86    /// A peer was disconnected.
87    PeerDisconnected {
88        /// The peer's id.
89        peer_id: PeerId,
90    },
91
92    /// A peer was removed.
93    PeerRemoved {
94        /// The peer's id.
95        peer_id: PeerId,
96    },
97
98    /// A peer was unbanned.
99    PeerUnbanned {
100        /// The peer's id.
101        peer_id: PeerId,
102    },
103}
104
105/// Describes the internal events.
106#[derive(Debug)]
107pub enum InternalEvent {
108    /// An address was bound.
109    AddressBound {
110        /// The assigned bind address.
111        address: Multiaddr,
112    },
113
114    /// The gossip protocol has been established with a peer.
115    ProtocolEstablished {
116        /// The peer's id.
117        peer_id: PeerId,
118        /// The peer's address.
119        peer_addr: Multiaddr,
120        /// The associated connection info with that peer.
121        origin: Origin,
122        /// The negotiated substream the protocol is running on.
123        substream: Box<NegotiatedSubstream>,
124    },
125
126    /// The gossip protocol has been dropped with a peer.
127    ProtocolDropped { peer_id: PeerId },
128}
129
130/// Allows the user to receive [`Event`]s published by the network layer.
131pub struct NetworkEventReceiver(EventReceiver);
132
133impl NetworkEventReceiver {
134    pub(crate) fn new(inner: EventReceiver) -> Self {
135        Self(inner)
136    }
137
138    /// Waits for an event from the network.
139    pub async fn recv(&mut self) -> Option<Event> {
140        self.0.recv().await
141    }
142}
143
144impl From<NetworkEventReceiver> for EventReceiver {
145    fn from(rx: NetworkEventReceiver) -> EventReceiver {
146        rx.0
147    }
148}