mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-06-12 09:31:20 +00:00
feat(swarm): make stream uprade errors more ergonomic
The currently provided `ConnectionHandlerUpgrErr` is very hard to use. Not only does it have a long name, it also features 3 levels of nesting which results in a lot of boilerplate. Last but not least, it exposes `multistream-select` as a dependency to all protocols. We fix all of the above by renaming the type to `StreamUpgradeError` and flattening out its interface. Unrecoverable errors during protocol selection are hidden within the `Io` variant. Related: #3759. Pull-Request: #3882.
This commit is contained in:
@ -28,13 +28,12 @@ use crate::{RequestId, EMPTY_QUEUE_SHRINK_THRESHOLD};
|
||||
|
||||
use futures::{channel::oneshot, future::BoxFuture, prelude::*, stream::FuturesUnordered};
|
||||
use instant::Instant;
|
||||
use libp2p_core::upgrade::{NegotiationError, UpgradeError};
|
||||
use libp2p_swarm::handler::{
|
||||
ConnectionEvent, DialUpgradeError, FullyNegotiatedInbound, FullyNegotiatedOutbound,
|
||||
ListenUpgradeError,
|
||||
};
|
||||
use libp2p_swarm::{
|
||||
handler::{ConnectionHandler, ConnectionHandlerEvent, ConnectionHandlerUpgrErr, KeepAlive},
|
||||
handler::{ConnectionHandler, ConnectionHandlerEvent, KeepAlive, StreamUpgradeError},
|
||||
SubstreamProtocol,
|
||||
};
|
||||
use smallvec::SmallVec;
|
||||
@ -67,7 +66,7 @@ where
|
||||
/// The current connection keep-alive.
|
||||
keep_alive: KeepAlive,
|
||||
/// A pending fatal error that results in the connection being closed.
|
||||
pending_error: Option<ConnectionHandlerUpgrErr<io::Error>>,
|
||||
pending_error: Option<StreamUpgradeError<io::Error>>,
|
||||
/// Queue of events to emit in `poll()`.
|
||||
pending_events: VecDeque<Event<TCodec>>,
|
||||
/// Outbound upgrades waiting to be emitted as an `OutboundSubstreamRequest`.
|
||||
@ -140,10 +139,10 @@ where
|
||||
>,
|
||||
) {
|
||||
match error {
|
||||
ConnectionHandlerUpgrErr::Timeout => {
|
||||
StreamUpgradeError::Timeout => {
|
||||
self.pending_events.push_back(Event::OutboundTimeout(info));
|
||||
}
|
||||
ConnectionHandlerUpgrErr::Upgrade(UpgradeError::Select(NegotiationError::Failed)) => {
|
||||
StreamUpgradeError::NegotiationFailed => {
|
||||
// The remote merely doesn't support the protocol(s) we requested.
|
||||
// This is no reason to close the connection, which may
|
||||
// successfully communicate with other protocols already.
|
||||
@ -166,9 +165,7 @@ where
|
||||
<Self as ConnectionHandler>::InboundProtocol,
|
||||
>,
|
||||
) {
|
||||
self.pending_error = Some(ConnectionHandlerUpgrErr::Upgrade(UpgradeError::Apply(
|
||||
error,
|
||||
)));
|
||||
self.pending_error = Some(StreamUpgradeError::Apply(error));
|
||||
}
|
||||
}
|
||||
|
||||
@ -244,7 +241,7 @@ where
|
||||
{
|
||||
type InEvent = RequestProtocol<TCodec>;
|
||||
type OutEvent = Event<TCodec>;
|
||||
type Error = ConnectionHandlerUpgrErr<io::Error>;
|
||||
type Error = StreamUpgradeError<io::Error>;
|
||||
type InboundProtocol = ResponseProtocol<TCodec>;
|
||||
type OutboundProtocol = RequestProtocol<TCodec>;
|
||||
type OutboundOpenInfo = RequestId;
|
||||
|
Reference in New Issue
Block a user