1use serde::{Deserialize, Serialize};
4use std::net::SocketAddr;
5use thiserror::Error;
6
7#[derive(Debug, Error)]
9pub enum PeerError {
10 #[error("Connection failed")]
12 ConnectionFailed,
13
14 #[error("Peer not found")]
16 PeerNotFound,
17
18 #[error("Invalid peer address")]
20 InvalidAddress,
21
22 #[error("Handshake failed")]
24 HandshakeFailed,
25}
26
27#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
29pub struct PeerId(Vec<u8>);
30
31impl PeerId {
32 pub fn new() -> Self {
34 use std::time::{SystemTime, UNIX_EPOCH};
35 let timestamp = SystemTime::now()
36 .duration_since(UNIX_EPOCH)
37 .unwrap()
38 .as_nanos() as u64;
39
40 Self(timestamp.to_be_bytes().to_vec())
42 }
43
44 pub fn from_bytes(bytes: Vec<u8>) -> Self {
46 Self(bytes)
47 }
48
49 pub fn as_bytes(&self) -> &[u8] {
51 &self.0
52 }
53}
54
55#[derive(Debug, Clone, PartialEq, Eq)]
57pub enum PeerStatus {
58 Connecting,
60
61 Connected,
63
64 Disconnected,
66
67 Banned,
69}
70
71#[derive(Debug, Clone)]
73pub struct Peer {
74 pub id: PeerId,
76
77 pub address: SocketAddr,
79
80 pub status: PeerStatus,
82
83 pub version: u32,
85}
86
87pub trait PeerManager {
89 fn add_peer(&mut self, address: SocketAddr) -> Result<PeerId, PeerError>;
91
92 fn remove_peer(&mut self, peer_id: &PeerId) -> Result<(), PeerError>;
94
95 fn get_peer(&self, peer_id: &PeerId) -> Result<Peer, PeerError>;
97
98 fn get_peers(&self) -> Vec<Peer>;
100
101 fn ban_peer(&mut self, peer_id: &PeerId) -> Result<(), PeerError>;
103
104 fn is_banned(&self, peer_id: &PeerId) -> bool;
106}