pub mod bencode;
pub mod dht;
pub mod download;
pub mod engine;
pub mod magnet;
pub mod metadata;
pub mod metainfo;
pub mod peer;
pub mod picker;
pub mod seed;
pub mod storage;
pub mod tracker;
pub use bencode::Value;
pub use download::{download, download_window, Progress, SeedMode, Stats, TorrentOptions};
pub use magnet::Magnet;
pub use metadata::fetch_metainfo;
pub use metainfo::{FileEntry, Metainfo};
pub use picker::{Bitfield, Picker};
pub use storage::Storage;
pub use tracker::{announce, AnnounceParams, AnnounceResponse, Event};
use std::path::{Path, PathBuf};
use purecrypto::rng::{OsRng, RngCore};
use crate::error::{Error, Result};
pub fn file_layout(meta: &Metainfo, base: &Path) -> Vec<(PathBuf, u64)> {
meta.files
.iter()
.map(|f| (base.join(&f.path), f.length))
.collect()
}
pub fn generate_peer_id() -> Result<[u8; 20]> {
let mut id = [0u8; 20];
std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
OsRng.fill_bytes(&mut id);
}))
.map_err(|_| Error::BadResponse("bittorrent: no secure entropy source".into()))?;
let prefix = b"-RS0001-";
id[..prefix.len()].copy_from_slice(prefix);
Ok(id)
}