diff --git a/crates/librqbit/src/dht_utils.rs b/crates/librqbit/src/dht_utils.rs index 69aacba..44e8fda 100644 --- a/crates/librqbit/src/dht_utils.rs +++ b/crates/librqbit/src/dht_utils.rs @@ -26,15 +26,12 @@ pub enum ReadMetainfoResult { pub async fn read_metainfo_from_peer_receiver + Unpin>( peer_id: Id20, info_hash: Id20, - mut addrs: A, + initial_addrs: Vec, + addrs_stream: A, peer_connection_options: Option, ) -> ReadMetainfoResult { let mut seen = HashSet::::new(); - let first_addr = match addrs.next().await { - Some(addr) => addr, - None => return ReadMetainfoResult::ChannelClosed { seen }, - }; - seen.insert(first_addr); + let mut addrs = addrs_stream; let semaphore = tokio::sync::Semaphore::new(128); @@ -57,7 +54,11 @@ pub async fn read_metainfo_from_peer_receiver + Unp }; let mut unordered = FuturesUnordered::new(); - unordered.push(read_info_guarded(first_addr)); + + for a in initial_addrs { + seen.insert(a); + unordered.push(read_info_guarded(a)); + } loop { tokio::select! { @@ -109,7 +110,8 @@ mod tests { let dht = DhtBuilder::new().await.unwrap(); let peer_rx = dht.get_peers(info_hash).unwrap(); let peer_id = generate_peer_id(); - match read_metainfo_from_peer_receiver(peer_id, info_hash, peer_rx, None).await { + match read_metainfo_from_peer_receiver(peer_id, info_hash, Vec::new(), peer_rx, None).await + { ReadMetainfoResult::Found { info, .. } => dbg!(info), ReadMetainfoResult::ChannelClosed { .. } => todo!("should not have happened"), }; diff --git a/crates/librqbit/src/session.rs b/crates/librqbit/src/session.rs index 2f29302..834ade5 100644 --- a/crates/librqbit/src/session.rs +++ b/crates/librqbit/src/session.rs @@ -504,6 +504,7 @@ impl Session { let (info, dht_rx, initial_peers) = match read_metainfo_from_peer_receiver( self.peer_id, info_hash, + opts.initial_peers.clone().unwrap_or_default(), dht_rx, Some(self.merge_peer_opts(opts.peer_opts)), )