volans_swarm/
behavior.rs

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    /// 处理新的入站连接
35    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    /// 处理已建立的连接
45    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    /// 连接处理器事件处理
54    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    /// 监听失败事件处理
74    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    /// 监听器事件处理
85    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    /// 连接处理器事件处理
106    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    /// 失败事件处理
124    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    /// 新的监听器事件
142    NewListener(NewListener),
143    /// 新的监听地址事件
144    NewListenAddr(NewListenAddr<'a>),
145    /// 过期的监听地址事件
146    ExpiredListenAddr(ExpiredListenAddr<'a>),
147    /// 监听器错误事件
148    ListenerError(ListenerError<'a>),
149    /// 监听器关闭事件
150    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    /// 行为生成的事件
186    Behavior(TEvent),
187    /// 处理程序命令
188    HandlerAction {
189        peer_id: PeerId,
190        handler: NotifyHandler,
191        action: THandlerAction,
192    },
193    /// 关闭连接事件
194    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}