mod handshake;
mod message;
pub use self::handshake::Handshake;
pub use self::message::{PeerMessage, decode, encode};
use std::fmt;
use rand::RngExt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct PeerId(pub [u8; 20]);
impl PeerId {
pub fn random() -> Self {
let mut rng = rand::rng();
let mut bytes = [0u8; 20];
let prefix = b"-TR1000-";
bytes[..8].copy_from_slice(prefix);
const CHARSET: &[u8] = b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
for byte in bytes.iter_mut().skip(8) {
let idx = rng.random_range(0..CHARSET.len());
*byte = CHARSET[idx];
}
PeerId(bytes)
}
}
impl From<[u8; 20]> for PeerId {
fn from(bytes: [u8; 20]) -> Self {
PeerId(bytes)
}
}
impl fmt::Display for PeerId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
for byte in &self.0 {
write!(f, "{:02x}", byte)?;
}
Ok(())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PeerState {
Handshake,
Init,
Unchoked,
Choked,
Closed,
}