dht_crawler/
types.rs

1use serde::{Deserialize, Serialize};
2
3/// 网络模式配置
4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
5pub enum NetMode {
6    /// 仅使用 IPv4
7    Ipv4Only,
8    /// 仅使用 IPv6
9    Ipv6Only,
10    /// 双栈(同时支持 IPv4 和 IPv6)
11    DualStack,
12}
13
14impl Default for NetMode {
15    fn default() -> Self {
16        Self::DualStack
17    }
18}
19
20/// 完整的种子信息(包含元数据)
21#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct TorrentInfo {
23    pub info_hash: String,
24    pub magnet_link: String,
25    pub name: String,
26    pub total_size: u64,
27    pub files: Vec<FileInfo>,
28    pub piece_length: u64,
29    pub peers: Vec<String>,
30    pub timestamp: u64,
31}
32
33/// 文件信息
34#[derive(Debug, Clone, Serialize, Deserialize)]
35pub struct FileInfo {
36    pub path: String,
37    pub size: u64,
38}
39
40impl TorrentInfo {
41    pub fn format_size(&self) -> String {
42        format_bytes(self.total_size)
43    }
44}
45
46impl FileInfo {
47    pub fn format_size(&self) -> String {
48        format_bytes(self.size)
49    }
50}
51
52fn format_bytes(bytes: u64) -> String {
53    const UNITS: &[&str] = &["B", "KB", "MB", "GB", "TB"];
54    let mut size = bytes as f64;
55    let mut unit_index = 0;
56
57    while size >= 1024.0 && unit_index < UNITS.len() - 1 {
58        size /= 1024.0;
59        unit_index += 1;
60    }
61
62    format!("{:.2} {}", size, UNITS[unit_index])
63}
64
65/// DHT 服务器配置
66#[derive(Debug, Clone)]
67pub struct DHTOptions {
68    /// DHT 端口
69    pub port: u16,
70
71    /// 是否自动获取元数据
72    pub auto_metadata: bool,
73
74    /// 元数据获取超时(秒)
75    pub metadata_timeout: u64,
76
77    /// 元数据获取队列大小(背压限制)
78    pub max_metadata_queue_size: usize,
79
80    /// 并发元数据获取工作线程数
81    pub max_metadata_worker_count: usize,
82
83    /// 网络模式配置(仅IPv4、仅IPv6、或双栈)
84    pub netmode: NetMode,
85
86    /// 节点队列容量(默认 100000)
87    pub node_queue_capacity: usize,
88}
89
90impl Default for DHTOptions {
91    fn default() -> Self {
92        Self {
93            port: 6881,  // BitTorrent DHT 默认端口
94            auto_metadata: true,
95            // 缩短超时,快速失败,不等待慢节点
96            metadata_timeout: 3,
97            // 加大队列,防止流量高峰丢包
98            max_metadata_queue_size: 100000,
99            // 提高并发,模拟 Node.js 的高并发 IO
100            max_metadata_worker_count: 1000,
101            // 默认双栈
102            netmode: NetMode::Ipv4Only,
103            // 节点队列容量:100000 个节点(扩容以适应 DHT 网络裂变速度)
104            node_queue_capacity: 100000,
105        }
106    }
107}