Skip to content

Commit b260626

Browse files
authored
Merge pull request #80 from artrixdotdev/feat/add-peer-id
feat: Add peer ID parsing and serialization
2 parents 70cef91 + d5e1ec5 commit b260626

File tree

9 files changed

+564
-55
lines changed

9 files changed

+564
-55
lines changed

crates/libtortillas/src/engine/mod.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ use tokio::{
1717
use tracing::{debug, error, info, instrument, trace, warn};
1818

1919
use crate::{
20-
hashes::Hash,
2120
parser::MetaInfo,
2221
peers::{
2322
Peer, PeerId, PeerKey,
@@ -93,7 +92,7 @@ impl TorrentEngine {
9392
#[allow(dead_code)]
9493
async fn new(metainfo: MetaInfo) -> Self {
9594
let info_hash = metainfo.info_hash().unwrap();
96-
let peer_id = Arc::new(Hash::from_bytes(rand::random::<[u8; 20]>()));
95+
let peer_id = PeerId::new();
9796
let to_engine_tx_rx = broadcast::channel(100);
9897

9998
info!(
@@ -212,7 +211,7 @@ impl TorrentEngine {
212211
.handle_peer(
213212
self.to_engine_tx_rx.0.clone(),
214213
self.metainfo.info_hash().unwrap(),
215-
Arc::clone(&self.id),
214+
self.id,
216215
stream,
217216
listener,
218217
Some(bitfield),
@@ -371,7 +370,7 @@ impl TorrentEngine {
371370
let info_hash = me.metainfo.info_hash().unwrap();
372371
for (index, tracker) in me.metainfo.announce_list().iter().enumerate() {
373372
match tracker
374-
.stream_peers(info_hash, Some(primary_addr), Some(*me.id))
373+
.stream_peers(info_hash, Some(primary_addr), me.id)
375374
.await
376375
{
377376
Ok(rx) => {

crates/libtortillas/src/peers/mod.rs

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use std::{
99

1010
use bitvec::vec::BitVec;
1111
use librqbit_utp::UtpSocketUdp;
12+
pub use peer::id::PeerId;
1213
use peer::{info::PeerInfo, state::PeerState, supports::PeerSupports};
1314
use peer_comms::{
1415
commands::{PeerCommand, PeerResponse},
@@ -24,7 +25,7 @@ use tokio::{
2425
};
2526
use tracing::{debug, error, info, trace, warn};
2627

27-
use crate::hashes::{Hash, InfoHash};
28+
use crate::hashes::InfoHash;
2829

2930
mod peer;
3031
pub mod peer_comms;
@@ -33,7 +34,6 @@ pub mod peer_comms;
3334
/// previous renditions of libtortillas. The idea of having a type for the "key"
3435
/// of a peer is still completely relevant though.
3536
pub type PeerKey = SocketAddr;
36-
pub type PeerId = Arc<Hash<20>>;
3737

3838
pub const MAGIC_STRING: &[u8] = b"BitTorrent protocol";
3939

@@ -49,7 +49,7 @@ pub struct Peer {
4949
/// indicates what extensions the peer supports.
5050
pub reserved: [u8; 8],
5151
pub peer_supports: PeerSupports,
52-
pub id: Option<Hash<20>>,
52+
pub id: Option<PeerId>,
5353
pub info: PeerInfo,
5454
}
5555

@@ -174,7 +174,7 @@ impl Peer {
174174
}
175175
};
176176

177-
self.id = Some(*peer_id);
177+
self.id = Some(peer_id);
178178
self.reserved = reserved;
179179
self.determine_supported().await;
180180
debug!(%peer_addr, "Completed handshake with outgoing peer");
@@ -343,15 +343,14 @@ mod tests {
343343
use std::str::FromStr;
344344

345345
use bitvec::{bitvec, order::Lsb0};
346-
use rand::RngCore;
347346
use tokio::{
348347
io::{AsyncReadExt, AsyncWriteExt},
349348
net::TcpListener,
350349
};
351350
use tracing_test::traced_test;
352351

353352
use super::{peer_comms::stream::validate_handshake, *};
354-
use crate::{parser::MagnetUri, peers::peer_comms::messages::Handshake};
353+
use crate::{hashes::Hash, parser::MagnetUri, peers::peer_comms::messages::Handshake};
355354

356355
#[tokio::test]
357356
#[traced_test]
@@ -379,15 +378,13 @@ mod tests {
379378
let data = MagnetUri::parse(magnet_uri).unwrap();
380379

381380
// Stuff for generating our_id (yes, literally our ID as a peer in the network)
382-
let mut our_id = [0u8; 20];
383-
rand::rng().fill_bytes(&mut our_id);
384-
let our_id = Hash::from_bytes(our_id);
381+
let our_id = PeerId::new();
385382

386383
peer
387384
.handle_peer(
388385
to_engine_tx,
389386
data.info_hash().unwrap(),
390-
Arc::new(our_id),
387+
our_id,
391388
None,
392389
None,
393390
None,
@@ -420,12 +417,12 @@ mod tests {
420417

421418
// Start peer
422419
let peer = Peer::from_socket_addr(SocketAddr::from_str(peer_addr).unwrap());
423-
let peer_id = Hash::new(rand::random::<[u8; 20]>());
420+
let peer_id = PeerId::new();
424421
let (to_engine_tx, mut to_engine_rx) = broadcast::channel(100);
425422

426423
tokio::spawn(async move {
427424
peer
428-
.handle_peer(to_engine_tx, info_hash, Arc::new(peer_id), None, None, None)
425+
.handle_peer(to_engine_tx, info_hash, peer_id, None, None, None)
429426
.await;
430427
});
431428

@@ -458,10 +455,11 @@ mod tests {
458455
trace!("Received valid handshake");
459456

460457
// Send a handshake back
461-
let our_id = Hash::new(rand::random::<[u8; 20]>());
458+
let our_id = PeerId::new();
459+
462460
// peer_stream.send_handshake() does not work?
463461
peer_stream
464-
.write_all(&Handshake::new(Arc::new(info_hash), Arc::new(our_id)).to_bytes())
462+
.write_all(&Handshake::new(Arc::new(info_hash), our_id).to_bytes())
465463
.await
466464
.unwrap();
467465

0 commit comments

Comments
 (0)