1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
// Copyright 2023 litep2p developers
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
use crate::{
transport::manager::address::{AddressRecord, AddressStore},
types::ConnectionId,
};
use multiaddr::Multiaddr;
use std::collections::{HashMap, HashSet};
/// Supported protocols.
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum SupportedTransport {
/// TCP.
Tcp,
/// QUIC.
#[cfg(feature = "quic")]
Quic,
/// WebRTC
#[cfg(feature = "webrtc")]
WebRtc,
/// WebSocket
#[cfg(feature = "websocket")]
WebSocket,
}
/// Peer state.
#[derive(Debug)]
pub enum PeerState {
/// `Litep2p` is connected to peer.
Connected {
/// Address record.
record: AddressRecord,
/// Dial address, if it exists.
///
/// While the local node was dialing a remote peer, the remote peer might've dialed
/// the local node and connection was established successfully. This dial address
/// is stored for processing later when the dial attempt concluded as either
/// successful/failed.
dial_record: Option<AddressRecord>,
},
/// Connection to peer is opening over one or more addresses.
Opening {
/// Address records used for dialing.
records: HashMap<Multiaddr, AddressRecord>,
/// Connection ID.
connection_id: ConnectionId,
/// Active transports.
transports: HashSet<SupportedTransport>,
},
/// Peer is being dialed.
Dialing {
/// Address record.
record: AddressRecord,
},
/// `Litep2p` is not connected to peer.
Disconnected {
/// Dial address, if it exists.
///
/// While the local node was dialing a remote peer, the remote peer might've dialed
/// the local node and connection was established successfully. The connection might've
/// been closed before the dial concluded which means that
/// [`crate::transport::manager::TransportManager`] must be prepared to handle the dial
/// failure even after the connection has been closed.
dial_record: Option<AddressRecord>,
},
}
/// Peer context.
#[derive(Debug)]
pub struct PeerContext {
/// Peer state.
pub state: PeerState,
/// Secondary connection, if it's open.
pub secondary_connection: Option<AddressRecord>,
/// Known addresses of peer.
pub addresses: AddressStore,
}