pub struct MetadataDownloader { /* private fields */ }Expand description
State machine for downloading torrent metadata via BEP 9 (magnet links).
Metadata is split into 16 KiB pieces. Once all pieces are received,
they are assembled and verified against the info_hash.
Supports full-redundancy parallel fetch: every peer that advertises
ut_metadata is sent requests for ALL missing pieces. The first
complete set (SHA1-verified) wins.
Implementations§
Source§impl MetadataDownloader
impl MetadataDownloader
Sourcepub fn set_total_size(&mut self, size: u64)
pub fn set_total_size(&mut self, size: u64)
Set the total metadata size and calculate the number of pieces.
Sourcepub fn piece_received(&mut self, piece: u32, data: Bytes) -> bool
pub fn piece_received(&mut self, piece: u32, data: Bytes) -> bool
Store a received piece. Returns true if all pieces have been received.
Sourcepub fn assemble_and_verify(&self) -> Result<Vec<u8>>
pub fn assemble_and_verify(&self) -> Result<Vec<u8>>
Concatenate all pieces in order and verify the SHA1 hash matches info_hash.
Returns the assembled metadata bytes on success.
§Errors
Returns an error if the reassembled metadata’s SHA-1 does not match the info-hash.
Sourcepub fn missing_pieces(&self) -> Vec<u32>
pub fn missing_pieces(&self) -> Vec<u32>
Return sorted list of piece indices we don’t have yet.
Returns an empty vec if num_pieces is not yet known.
Sourcepub fn mark_rejected(&mut self, peer: SocketAddr)
pub fn mark_rejected(&mut self, peer: SocketAddr)
Mark a peer as having rejected metadata requests.
The peer is added to the rejected set and removed from the active requested set. No further requests will be sent to this peer.
Sourcepub fn is_rejected(&self, peer: &SocketAddr) -> bool
pub fn is_rejected(&self, peer: &SocketAddr) -> bool
Check whether a peer has been rejected.
Sourcepub fn request_all_from_peer(&mut self, peer: SocketAddr) -> Vec<u32>
pub fn request_all_from_peer(&mut self, peer: SocketAddr) -> Vec<u32>
Request all missing pieces from a peer (full redundancy).
Returns the list of piece indices to request from this peer.
Skips pieces we already have and rejects requests to blacklisted peers.
Records the peer in requested_peers and updates piece_request_times.
Sourcepub fn timed_out_pieces(&self) -> Vec<u32>
pub fn timed_out_pieces(&self) -> Vec<u32>
Return piece indices whose last request time exceeds their per-piece
backoff timeout. Backoff is exponential: min(60s, 5s * 2^retry_count).
Sourcepub fn reset_request_time(&mut self, piece: u32)
pub fn reset_request_time(&mut self, piece: u32)
Reset the request time for a piece and increment its retry count.
Sourcepub fn has_active_peers(&self) -> bool
pub fn has_active_peers(&self) -> bool
Whether any non-rejected peers have outstanding requests.