Skip to content

Commit a334f17

Browse files
committed
refactor: extract struct StatsEventSender
1 parent 2de8181 commit a334f17

File tree

2 files changed

+42
-17
lines changed

2 files changed

+42
-17
lines changed

src/tracker/statistics.rs

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -62,24 +62,31 @@ pub struct StatsTracker {
6262
}
6363

6464
impl StatsTracker {
65-
pub fn new_active_instance() -> Self {
66-
Self::new_instance(true)
67-
}
65+
pub fn new_active_instance() -> (Self, StatsEventSender) {
66+
let mut stats_tracker = Self {
67+
channel_sender: None,
68+
stats: Arc::new(RwLock::new(TrackerStatistics::new())),
69+
};
6870

69-
pub fn new_inactive_instance() -> Self {
70-
Self::new_instance(false)
71+
let stats_event_sender = stats_tracker.run_worker();
72+
73+
(stats_tracker, stats_event_sender)
7174
}
7275

73-
pub fn new_instance(active: bool) -> Self {
74-
let mut stats_tracker = Self {
76+
pub fn new_inactive_instance() -> Self {
77+
Self {
7578
channel_sender: None,
7679
stats: Arc::new(RwLock::new(TrackerStatistics::new())),
77-
};
80+
}
81+
}
7882

79-
if active {
80-
stats_tracker.run_worker();
83+
pub fn new_instance(active: bool) -> Self {
84+
if !active {
85+
return Self::new_inactive_instance();
8186
}
8287

88+
let (stats_tracker, _stats_event_sender) = Self::new_active_instance();
89+
8390
stats_tracker
8491
}
8592

@@ -90,11 +97,11 @@ impl StatsTracker {
9097
}
9198
}
9299

93-
pub fn run_worker(&mut self) {
100+
pub fn run_worker(&mut self) -> StatsEventSender {
94101
let (tx, mut rx) = mpsc::channel::<TrackerStatisticsEvent>(CHANNEL_BUFFER_SIZE);
95102

96103
// set send channel on stats_tracker
97-
self.channel_sender = Some(tx);
104+
self.channel_sender = Some(tx.clone());
98105

99106
let stats = self.stats.clone();
100107

@@ -142,6 +149,8 @@ impl StatsTracker {
142149
drop(stats_lock);
143150
}
144151
});
152+
153+
StatsEventSender { sender: tx }
145154
}
146155
}
147156

@@ -161,6 +170,17 @@ impl TrackerStatisticsEventSender for StatsTracker {
161170
}
162171
}
163172

173+
pub struct StatsEventSender {
174+
sender: Sender<TrackerStatisticsEvent>,
175+
}
176+
177+
#[async_trait]
178+
impl TrackerStatisticsEventSender for StatsEventSender {
179+
async fn send_event(&self, event: TrackerStatisticsEvent) -> Option<Result<(), SendError<TrackerStatisticsEvent>>> {
180+
Some(self.sender.send(event).await)
181+
}
182+
}
183+
164184
#[async_trait]
165185
pub trait TrackerStatisticsRepository: Sync + Send {
166186
async fn get_stats(&self) -> RwLockReadGuard<'_, TrackerStatistics>;

src/udp/handlers.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -271,19 +271,24 @@ mod tests {
271271

272272
fn initialized_public_tracker() -> Arc<TorrentTracker> {
273273
let configuration = Arc::new(TrackerConfigurationBuilder::default().with_mode(TrackerMode::Public).into());
274-
Arc::new(TorrentTracker::new(configuration, Box::new(StatsTracker::new_active_instance())).unwrap())
274+
initialized_tracker(configuration)
275275
}
276276

277277
fn initialized_private_tracker() -> Arc<TorrentTracker> {
278278
let configuration = Arc::new(TrackerConfigurationBuilder::default().with_mode(TrackerMode::Private).into());
279-
Arc::new(TorrentTracker::new(configuration, Box::new(StatsTracker::new_active_instance())).unwrap())
279+
initialized_tracker(configuration)
280280
}
281281

282282
fn initialized_whitelisted_tracker() -> Arc<TorrentTracker> {
283283
let configuration = Arc::new(TrackerConfigurationBuilder::default().with_mode(TrackerMode::Listed).into());
284-
Arc::new(TorrentTracker::new(configuration, Box::new(StatsTracker::new_active_instance())).unwrap())
284+
initialized_tracker(configuration)
285285
}
286286

287+
fn initialized_tracker(configuration: Arc<Configuration>) -> Arc<TorrentTracker> {
288+
let (stats_tracker, _stats_event_sender) = StatsTracker::new_active_instance();
289+
Arc::new(TorrentTracker::new(configuration, Box::new(stats_tracker)).unwrap())
290+
}
291+
287292
fn sample_ipv4_remote_addr() -> SocketAddr {
288293
sample_ipv4_socket_address()
289294
}
@@ -969,8 +974,8 @@ mod tests {
969974
#[tokio::test]
970975
async fn the_peer_ip_should_be_changed_to_the_external_ip_in_the_tracker_configuration() {
971976
let configuration = Arc::new(TrackerConfigurationBuilder::default().with_external_ip("::126.0.0.1").into());
972-
let tracker =
973-
Arc::new(TorrentTracker::new(configuration, Box::new(StatsTracker::new_active_instance())).unwrap());
977+
let (stats_tracker, _stats_event_sender) = StatsTracker::new_active_instance();
978+
let tracker = Arc::new(TorrentTracker::new(configuration, Box::new(stats_tracker)).unwrap());
974979

975980
let loopback_ipv4 = Ipv4Addr::new(127, 0, 0, 1);
976981
let loopback_ipv6 = Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1);

0 commit comments

Comments
 (0)