Add support for BTv2 magnet links

This commit is contained in:
Joshua Abraham 2023-12-24 16:53:02 -06:00
parent 1157866152
commit 0836b651a7
21 changed files with 236 additions and 157 deletions

View file

@ -6,7 +6,7 @@ use std::{
use bencode::{ByteBuf, ByteString};
use clone_to_owned::CloneToOwned;
use librqbit_core::id20::Id20;
use librqbit_core::hash_id::Id20;
use serde::{
de::{IgnoredAny, Unexpected},
Deserialize, Deserializer, Serialize,
@ -229,7 +229,7 @@ impl<'de> Deserialize<'de> for CompactNodeInfo {
let ip = Ipv4Addr::new(chunk[20], chunk[21], chunk[22], chunk[23]);
let port = ((chunk[24] as u16) << 8) + chunk[25] as u16;
buf.push(Node {
id: Id20(node_id),
id: Id20::new(node_id),
addr: SocketAddrV4::new(ip, port),
})
}

View file

@ -27,7 +27,7 @@ use futures::{stream::FuturesUnordered, Stream, StreamExt, TryFutureExt};
use leaky_bucket::RateLimiter;
use librqbit_core::{
id20::Id20,
hash_id::Id20,
peer_id::generate_peer_id,
spawn_utils::{spawn, spawn_with_cancel},
};

View file

@ -10,7 +10,7 @@ use std::time::Duration;
pub use crate::dht::DhtStats;
pub use crate::dht::{DhtConfig, DhtState, RequestPeersStream};
pub use librqbit_core::id20::Id20;
pub use librqbit_core::hash_id::Id20;
pub use persistence::{PersistentDht, PersistentDhtConfig};
pub type Dht = Arc<DhtState>;

View file

@ -7,7 +7,7 @@ use std::{
use bencode::ByteString;
use chrono::{DateTime, Utc};
use librqbit_core::id20::Id20;
use librqbit_core::hash_id::Id20;
use parking_lot::RwLock;
use rand::RngCore;
use serde::{

View file

@ -1,6 +1,6 @@
use std::{net::SocketAddr, time::Instant};
use librqbit_core::id20::Id20;
use librqbit_core::hash_id::Id20;
use rand::RngCore;
use serde::{ser::SerializeStruct, Deserialize, Serialize, Serializer};
use tracing::{debug, trace};
@ -132,7 +132,7 @@ impl<'a> Iterator for BucketTreeIterator<'a> {
pub fn generate_random_id(start: &Id20, bits: u8) -> Id20 {
let mut data = [0u8; 20];
rand::thread_rng().fill_bytes(&mut data);
let mut data = Id20(data);
let mut data = Id20::new(data);
let remaining_bits = 160 - bits;
for bit in 0..remaining_bits {
data.set_bit(bit, start.get_bit(bit));
@ -199,8 +199,8 @@ impl BucketTree {
BucketTree {
data: vec![BucketTreeNode {
bits: 160,
start: Id20([0u8; 20]),
end_inclusive: Id20([0xff; 20]),
start: Id20::new([0u8; 20]),
end_inclusive: Id20::new([0xff; 20]),
data: BucketTreeNodeData::Leaf(Default::default()),
}],
size: 0,
@ -583,7 +583,7 @@ mod tests {
str::FromStr,
};
use librqbit_core::id20::Id20;
use librqbit_core::hash_id::Id20;
use rand::Rng;
use crate::routing_table::compute_split_start_end;
@ -592,8 +592,8 @@ mod tests {
#[test]
fn compute_split_start_end_root() {
let start = Id20([0u8; 20]);
let end = Id20([0xff; 20]);
let start = Id20::new([0u8; 20]);
let end = Id20::new([0xff; 20]);
assert_eq!(
compute_split_start_end(start, end, 160),
(
@ -612,7 +612,7 @@ mod tests {
#[test]
fn compute_split_start_end_second_split() {
let start = Id20::from_str("8000000000000000000000000000000000000000").unwrap();
let end = Id20([0xff; 20]);
let end = Id20::new([0xff; 20]);
assert_eq!(
compute_split_start_end(start, end, 159),
(
@ -631,7 +631,7 @@ mod tests {
#[test]
fn compute_split_start_end_3() {
let start = Id20::from_str("8000000000000000000000000000000000000000").unwrap();
let end = Id20([0xff; 20]);
let end = Id20::new([0xff; 20]);
assert_eq!(
compute_split_start_end(start, end, 159),
(
@ -650,7 +650,7 @@ mod tests {
fn random_id_20() -> Id20 {
let mut id20 = [0u8; 20];
rand::thread_rng().fill(&mut id20);
Id20(id20)
Id20::new(id20)
}
fn generate_socket_addr() -> SocketAddr {

View file

@ -1,4 +1,4 @@
use librqbit_core::id20::Id20;
use librqbit_core::hash_id::Id20;
use serde::Serializer;
pub fn serialize_id20<S>(id: &Id20, ser: S) -> Result<S::Ok, S::Error>