-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Closed
Description
Currently, FromSwarm::ConnectionClosed contains a handler field which makes handling the event klunky in many ways:
- It cannot implement
Clone - It adds a type-parameter
- We cannot unify
SwarmEventandFromSwarmdespite them containing the same data
The usecase for returning the handler is to allow the behaviour to extract data from a closed connection which would other get lost as connections can close at any point. Nothing is currently using this functionality but it makes sense in general so we want to keep it.
We can solve this by adding a poll_close function as described by @mxinden below: #3046 (comment)
modified swarm/src/handler.rs
@@ -158,6 +158,15 @@ pub trait ConnectionHandler: Send + 'static {
>,
>;
+ /// Gracefully close the [`ConnectionHandler`].
+ ///
+ /// Implementations may transfer one or more events to their [`NetworkBehaviour`] implementation
+ /// by emitting [`Poll::Ready`] with [`Self::ToBehaviour`]. Implementations should eventually
+ /// return [`Poll::Ready(None)`] to signal successful closing.
+ fn poll_close(&mut self, cx: &mut Context<'_>) -> Poll<Option<Self::ToBehaviour>> {
+ Poll::Ready(None)
+ }
+
/// Adds a closure that turns the input event into something else.
fn map_in_event<TNewIn, TMap>(self, map: TMap) -> MapInEvent<Self, TNewIn, TMap>
whereUpon closing a connection, poll_close would be called until it returns Ready(None) and all returned events would be delivered to the behaviour.