1mod either;
2mod listen_addresses;
3
4pub use listen_addresses::ListenAddresses;
5
6use std::task::{Context, Poll};
7
8use volans_core::{Multiaddr, PeerId};
9
10use crate::{
11 ConnectionDenied, ConnectionHandler, ConnectionId, DialOpts, ListenerId, THandlerAction,
12 THandlerEvent,
13 error::{ConnectionError, DialError, ListenError},
14};
15
16pub trait NetworkBehavior: Send + 'static {
17 type Event: Send + 'static;
18 type ConnectionHandler: ConnectionHandler;
19
20 fn on_connection_handler_event(
21 &mut self,
22 id: ConnectionId,
23 peer_id: PeerId,
24 event: THandlerEvent<Self>,
25 );
26
27 fn poll(
28 &mut self,
29 cx: &mut Context<'_>,
30 ) -> Poll<BehaviorEvent<Self::Event, THandlerAction<Self>>>;
31}
32
33pub trait NetworkIncomingBehavior: NetworkBehavior {
34 fn handle_pending_connection(
36 &mut self,
37 _id: ConnectionId,
38 _local_addr: &Multiaddr,
39 _remote_addr: &Multiaddr,
40 ) -> Result<(), ConnectionDenied> {
41 Ok(())
42 }
43
44 fn handle_established_connection(
46 &mut self,
47 _id: ConnectionId,
48 peer_id: PeerId,
49 _local_addr: &Multiaddr,
50 _remote_addr: &Multiaddr,
51 ) -> Result<Self::ConnectionHandler, ConnectionDenied>;
52
53 fn on_connection_established(
55 &mut self,
56 _id: ConnectionId,
57 _peer_id: PeerId,
58 _local_addr: &Multiaddr,
59 _remote_addr: &Multiaddr,
60 ) {
61 }
62
63 fn on_connection_closed(
64 &mut self,
65 _id: ConnectionId,
66 _peer_id: PeerId,
67 _local_addr: &Multiaddr,
68 _remote_addr: &Multiaddr,
69 _reason: Option<&ConnectionError>,
70 ) {
71 }
72
73 fn on_listen_failure(
75 &mut self,
76 _id: ConnectionId,
77 _peer_id: Option<PeerId>,
78 _local_addr: &Multiaddr,
79 _remote_addr: &Multiaddr,
80 _error: &ListenError,
81 ) {
82 }
83
84 fn on_listener_event(&mut self, _event: ListenerEvent<'_>) {}
86}
87
88pub trait NetworkOutgoingBehavior: NetworkBehavior {
89 fn handle_pending_connection(
90 &mut self,
91 _id: ConnectionId,
92 _maybe_peer: Option<PeerId>,
93 _addr: &Option<Multiaddr>,
94 ) -> Result<Option<Multiaddr>, ConnectionDenied> {
95 Ok(None)
96 }
97
98 fn handle_established_connection(
99 &mut self,
100 id: ConnectionId,
101 peer_id: PeerId,
102 addr: &Multiaddr,
103 ) -> Result<Self::ConnectionHandler, ConnectionDenied>;
104
105 fn on_connection_established(
107 &mut self,
108 _id: ConnectionId,
109 _peer_id: PeerId,
110 _addr: &Multiaddr,
111 ) {
112 }
113
114 fn on_connection_closed(
115 &mut self,
116 _id: ConnectionId,
117 _peer_id: PeerId,
118 _addr: &Multiaddr,
119 _reason: Option<&ConnectionError>,
120 ) {
121 }
122
123 fn on_dial_failure(
125 &mut self,
126 _id: ConnectionId,
127 _peer_id: Option<PeerId>,
128 _addr: Option<&Multiaddr>,
129 _error: &DialError,
130 ) {
131 }
132
133 fn poll_dial(&mut self, _cx: &mut Context<'_>) -> Poll<DialOpts> {
134 Poll::Pending
135 }
136}
137
138#[derive(Debug, Clone, Copy)]
139#[non_exhaustive]
140pub enum ListenerEvent<'a> {
141 NewListener(NewListener),
143 NewListenAddr(NewListenAddr<'a>),
145 ExpiredListenAddr(ExpiredListenAddr<'a>),
147 ListenerError(ListenerError<'a>),
149 ListenerClosed(ListenerClosed<'a>),
151}
152
153#[derive(Debug, Clone, Copy)]
154pub struct NewListener {
155 pub listener_id: ListenerId,
156}
157
158#[derive(Debug, Clone, Copy)]
159pub struct NewListenAddr<'a> {
160 pub listener_id: ListenerId,
161 pub addr: &'a Multiaddr,
162}
163
164#[derive(Debug, Clone, Copy)]
165pub struct ListenerError<'a> {
166 pub listener_id: ListenerId,
167 pub error: &'a (dyn std::error::Error + 'static),
168}
169
170#[derive(Debug, Clone, Copy)]
171pub struct ListenerClosed<'a> {
172 pub listener_id: ListenerId,
173 pub reason: Result<(), &'a std::io::Error>,
174}
175
176#[derive(Debug, Clone, Copy)]
177pub struct ExpiredListenAddr<'a> {
178 pub listener_id: ListenerId,
179 pub addr: &'a Multiaddr,
180}
181
182#[derive(Debug)]
183#[non_exhaustive]
184pub enum BehaviorEvent<TEvent, THandlerAction> {
185 Behavior(TEvent),
187 HandlerAction {
189 peer_id: PeerId,
190 handler: NotifyHandler,
191 action: THandlerAction,
192 },
193 CloseConnection {
195 peer_id: PeerId,
196 connection: CloseConnection,
197 },
198}
199
200impl<TEvent, THandlerAction> BehaviorEvent<TEvent, THandlerAction> {
201 pub fn map_handler_action<O, F>(self, f: F) -> BehaviorEvent<TEvent, O>
202 where
203 F: FnOnce(THandlerAction) -> O,
204 {
205 match self {
206 BehaviorEvent::Behavior(event) => BehaviorEvent::Behavior(event),
207 BehaviorEvent::HandlerAction {
208 peer_id,
209 handler,
210 action,
211 } => BehaviorEvent::HandlerAction {
212 peer_id,
213 handler,
214 action: f(action),
215 },
216 BehaviorEvent::CloseConnection {
217 peer_id,
218 connection,
219 } => BehaviorEvent::CloseConnection {
220 peer_id,
221 connection,
222 },
223 }
224 }
225
226 pub fn map_event<O, F>(self, f: F) -> BehaviorEvent<O, THandlerAction>
227 where
228 F: FnOnce(TEvent) -> O,
229 {
230 match self {
231 BehaviorEvent::Behavior(event) => BehaviorEvent::Behavior(f(event)),
232 BehaviorEvent::HandlerAction {
233 peer_id,
234 handler,
235 action,
236 } => BehaviorEvent::HandlerAction {
237 peer_id,
238 handler,
239 action,
240 },
241 BehaviorEvent::CloseConnection {
242 peer_id,
243 connection,
244 } => BehaviorEvent::CloseConnection {
245 peer_id,
246 connection,
247 },
248 }
249 }
250}
251
252#[derive(Debug, Clone)]
253pub enum NotifyHandler {
254 One(ConnectionId),
255 Any,
256}
257
258#[derive(Debug, Clone, Default)]
259pub enum CloseConnection {
260 One(ConnectionId),
261 #[default]
262 All,
263}