Skip to content

Commit 765bd6f

Browse files
committedJan 17, 2025
Merge torrust#1188: Overhaul core Tracker: extract IoC Container
20018ab fix: [torrust#1187] doc link error (Jose Celano) 3d0f4f8 refactor: [torrust#1187] use AppContainer in test environments (Jose Celano) c45a12b refactor: [torrust#1187] rename fn tracker_factory to initialize_tracker (Jose Celano) aa9f1c3 refactor: [torrust#1187] move fn initialize_tracker_dependencies (Jose Celano) a4d8da0 refactor: [torrust#1187] inline fn initialize_tracker (Jose Celano) 36db088 refactor: [torrust#1187] inline fn initialize_globals_and_tracker (Jose Celano) 4aea9db refactor: [torrust#1187] extract fn initialize_app_container (Jose Celano) 747b58d refactor: [torrust#1187] extract one function and rename another one (Jose Celano) 8bea521 refactor: [torrust#1187] extract IoC Container (Jose Celano) Pull request description: Overhaul core Tracker: extract IoC Container ACKs for top commit: josecelano: ACK 20018ab Tree-SHA512: 5bb7d6fc2f3e577547b1532b3267f3f1d7eddd938b883a6a3fb31a3a3bd0e3b8001325e3c6d45261da46c34fd2c4312b627abc0054efd7097e1721375b325b5f
2 parents 5b46cea + 20018ab commit 765bd6f

File tree

24 files changed

+205
-187
lines changed

24 files changed

+205
-187
lines changed
 

‎src/app.rs

+21-30
Original file line numberDiff line numberDiff line change
@@ -21,34 +21,23 @@
2121
//! - UDP trackers: the user can enable multiple UDP tracker on several ports.
2222
//! - HTTP trackers: the user can enable multiple HTTP tracker on several ports.
2323
//! - Tracker REST API: the tracker API can be enabled/disabled.
24-
use std::sync::Arc;
25-
26-
use tokio::sync::RwLock;
2724
use tokio::task::JoinHandle;
2825
use torrust_tracker_configuration::Configuration;
2926
use tracing::instrument;
3027

3128
use crate::bootstrap::jobs::{health_check_api, http_tracker, torrent_cleanup, tracker_apis, udp_tracker};
32-
use crate::core::statistics::event::sender::Sender;
33-
use crate::core::statistics::repository::Repository;
29+
use crate::container::AppContainer;
30+
use crate::servers;
3431
use crate::servers::registar::Registar;
35-
use crate::servers::udp::server::banning::BanService;
36-
use crate::{core, servers};
3732

3833
/// # Panics
3934
///
4035
/// Will panic if:
4136
///
4237
/// - Can't retrieve tracker keys from database.
4338
/// - Can't load whitelist from database.
44-
#[instrument(skip(config, tracker, ban_service, stats_event_sender, stats_repository))]
45-
pub async fn start(
46-
config: &Configuration,
47-
tracker: Arc<core::Tracker>,
48-
ban_service: Arc<RwLock<BanService>>,
49-
stats_event_sender: Arc<Option<Box<dyn Sender>>>,
50-
stats_repository: Arc<Repository>,
51-
) -> Vec<JoinHandle<()>> {
39+
#[instrument(skip(config, app_container))]
40+
pub async fn start(config: &Configuration, app_container: &AppContainer) -> Vec<JoinHandle<()>> {
5241
if config.http_api.is_none()
5342
&& (config.udp_trackers.is_none() || config.udp_trackers.as_ref().map_or(true, std::vec::Vec::is_empty))
5443
&& (config.http_trackers.is_none() || config.http_trackers.as_ref().map_or(true, std::vec::Vec::is_empty))
@@ -61,16 +50,18 @@ pub async fn start(
6150
let registar = Registar::default();
6251

6352
// Load peer keys
64-
if tracker.is_private() {
65-
tracker
53+
if app_container.tracker.is_private() {
54+
app_container
55+
.tracker
6656
.load_keys_from_database()
6757
.await
6858
.expect("Could not retrieve keys from database.");
6959
}
7060

7161
// Load whitelisted torrents
72-
if tracker.is_listed() {
73-
tracker
62+
if app_container.tracker.is_listed() {
63+
app_container
64+
.tracker
7465
.whitelist_manager
7566
.load_whitelist_from_database()
7667
.await
@@ -80,7 +71,7 @@ pub async fn start(
8071
// Start the UDP blocks
8172
if let Some(udp_trackers) = &config.udp_trackers {
8273
for udp_tracker_config in udp_trackers {
83-
if tracker.is_private() {
74+
if app_container.tracker.is_private() {
8475
tracing::warn!(
8576
"Could not start UDP tracker on: {} while in private mode. UDP is not safe for private trackers!",
8677
udp_tracker_config.bind_address
@@ -89,9 +80,9 @@ pub async fn start(
8980
jobs.push(
9081
udp_tracker::start_job(
9182
udp_tracker_config,
92-
tracker.clone(),
93-
stats_event_sender.clone(),
94-
ban_service.clone(),
83+
app_container.tracker.clone(),
84+
app_container.stats_event_sender.clone(),
85+
app_container.ban_service.clone(),
9586
registar.give_form(),
9687
)
9788
.await,
@@ -107,8 +98,8 @@ pub async fn start(
10798
for http_tracker_config in http_trackers {
10899
if let Some(job) = http_tracker::start_job(
109100
http_tracker_config,
110-
tracker.clone(),
111-
stats_event_sender.clone(),
101+
app_container.tracker.clone(),
102+
app_container.stats_event_sender.clone(),
112103
registar.give_form(),
113104
servers::http::Version::V1,
114105
)
@@ -125,10 +116,10 @@ pub async fn start(
125116
if let Some(http_api_config) = &config.http_api {
126117
if let Some(job) = tracker_apis::start_job(
127118
http_api_config,
128-
tracker.clone(),
129-
ban_service.clone(),
130-
stats_event_sender.clone(),
131-
stats_repository.clone(),
119+
app_container.tracker.clone(),
120+
app_container.ban_service.clone(),
121+
app_container.stats_event_sender.clone(),
122+
app_container.stats_repository.clone(),
132123
registar.give_form(),
133124
servers::apis::Version::V1,
134125
)
@@ -142,7 +133,7 @@ pub async fn start(
142133

143134
// Start runners to remove torrents without peers, every interval
144135
if config.core.inactive_peer_cleanup_interval > 0 {
145-
jobs.push(torrent_cleanup::start_job(&config.core, &tracker));
136+
jobs.push(torrent_cleanup::start_job(&config.core, &app_container.tracker));
146137
}
147138

148139
// Start Health Check API

‎src/app_test.rs

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//! This file contains only functions used for testing.
2+
use std::sync::Arc;
3+
4+
use torrust_tracker_configuration::Configuration;
5+
6+
use crate::core::databases::Database;
7+
use crate::core::services::{initialize_database, initialize_whitelist};
8+
use crate::core::whitelist::WhiteListManager;
9+
10+
/// Initialize the tracker dependencies.
11+
#[allow(clippy::type_complexity)]
12+
#[must_use]
13+
pub fn initialize_tracker_dependencies(config: &Configuration) -> (Arc<Box<dyn Database>>, Arc<WhiteListManager>) {
14+
let database = initialize_database(config);
15+
let whitelist_manager = initialize_whitelist(database.clone());
16+
17+
(database, whitelist_manager)
18+
}

‎src/bootstrap/app.rs

+30-52
Original file line numberDiff line numberDiff line change
@@ -21,32 +21,21 @@ use tracing::instrument;
2121

2222
use super::config::initialize_configuration;
2323
use crate::bootstrap;
24-
use crate::core::databases::Database;
25-
use crate::core::services::{initialize_database, initialize_whitelist, statistics, tracker_factory};
26-
use crate::core::statistics::event::sender::Sender;
27-
use crate::core::statistics::repository::Repository;
28-
use crate::core::whitelist::WhiteListManager;
29-
use crate::core::Tracker;
24+
use crate::container::AppContainer;
25+
use crate::core::services::{initialize_database, initialize_tracker, initialize_whitelist, statistics};
3026
use crate::servers::udp::server::banning::BanService;
3127
use crate::servers::udp::server::launcher::MAX_CONNECTION_ID_ERRORS_PER_IP;
3228
use crate::shared::crypto::ephemeral_instance_keys;
3329
use crate::shared::crypto::keys::{self, Keeper as _};
3430

35-
/// It loads the configuration from the environment and builds the main domain [`Tracker`] struct.
31+
/// It loads the configuration from the environment and builds app container.
3632
///
3733
/// # Panics
3834
///
3935
/// Setup can file if the configuration is invalid.
4036
#[must_use]
41-
#[allow(clippy::type_complexity)]
4237
#[instrument(skip())]
43-
pub fn setup() -> (
44-
Configuration,
45-
Arc<Tracker>,
46-
Arc<RwLock<BanService>>,
47-
Arc<Option<Box<dyn Sender>>>,
48-
Arc<Repository>,
49-
) {
38+
pub fn setup() -> (Configuration, AppContainer) {
5039
#[cfg(not(test))]
5140
check_seed();
5241

@@ -56,19 +45,13 @@ pub fn setup() -> (
5645
panic!("Configuration error: {e}");
5746
}
5847

59-
// Initialize services
60-
61-
let (stats_event_sender, stats_repository) = statistics::setup::factory(configuration.core.tracker_usage_statistics);
62-
let stats_event_sender = Arc::new(stats_event_sender);
63-
let stats_repository = Arc::new(stats_repository);
64-
65-
let udp_ban_service = Arc::new(RwLock::new(BanService::new(MAX_CONNECTION_ID_ERRORS_PER_IP)));
66-
67-
let tracker = initialize_with_configuration(&configuration);
48+
initialize_global_services(&configuration);
6849

6950
tracing::info!("Configuration:\n{}", configuration.clone().mask_secrets().to_json());
7051

71-
(configuration, tracker, udp_ban_service, stats_event_sender, stats_repository)
52+
let app_container = initialize_app_container(&configuration);
53+
54+
(configuration, app_container)
7255
}
7356

7457
/// checks if the seed is the instance seed in production.
@@ -83,15 +66,31 @@ pub fn check_seed() {
8366
assert_eq!(seed, instance, "maybe using zeroed seed in production!?");
8467
}
8568

86-
/// It initializes the application with the given configuration.
87-
///
88-
/// The configuration may be obtained from the environment (via config file or env vars).
89-
#[must_use]
69+
/// It initializes the global services.
9070
#[instrument(skip())]
91-
pub fn initialize_with_configuration(configuration: &Configuration) -> Arc<Tracker> {
71+
pub fn initialize_global_services(configuration: &Configuration) {
9272
initialize_static();
9373
initialize_logging(configuration);
94-
Arc::new(initialize_tracker(configuration))
74+
}
75+
76+
/// It initializes the IoC Container.
77+
#[instrument(skip())]
78+
pub fn initialize_app_container(configuration: &Configuration) -> AppContainer {
79+
let (stats_event_sender, stats_repository) = statistics::setup::factory(configuration.core.tracker_usage_statistics);
80+
let stats_event_sender = Arc::new(stats_event_sender);
81+
let stats_repository = Arc::new(stats_repository);
82+
let ban_service = Arc::new(RwLock::new(BanService::new(MAX_CONNECTION_ID_ERRORS_PER_IP)));
83+
let database = initialize_database(configuration);
84+
let whitelist_manager = initialize_whitelist(database.clone());
85+
let tracker = Arc::new(initialize_tracker(configuration, &database, &whitelist_manager));
86+
87+
AppContainer {
88+
tracker,
89+
ban_service,
90+
stats_event_sender,
91+
stats_repository,
92+
whitelist_manager,
93+
}
9594
}
9695

9796
/// It initializes the application static values.
@@ -115,27 +114,6 @@ pub fn initialize_static() {
115114
lazy_static::initialize(&ephemeral_instance_keys::ZEROED_TEST_CIPHER_BLOWFISH);
116115
}
117116

118-
/// It builds the domain tracker
119-
///
120-
/// The tracker is the domain layer service. It's the entrypoint to make requests to the domain layer.
121-
/// It's used by other higher-level components like the UDP and HTTP trackers or the tracker API.
122-
#[must_use]
123-
#[instrument(skip(config))]
124-
pub fn initialize_tracker(config: &Configuration) -> Tracker {
125-
let (database, whitelist_manager) = initialize_tracker_dependencies(config);
126-
127-
tracker_factory(config, &database, &whitelist_manager)
128-
}
129-
130-
#[allow(clippy::type_complexity)]
131-
#[must_use]
132-
pub fn initialize_tracker_dependencies(config: &Configuration) -> (Arc<Box<dyn Database>>, Arc<WhiteListManager>) {
133-
let database = initialize_database(config);
134-
let whitelist_manager = initialize_whitelist(database.clone());
135-
136-
(database, whitelist_manager)
137-
}
138-
139117
/// It initializes the log threshold, format and channel.
140118
///
141119
/// See [the logging setup](crate::bootstrap::logging::setup) for more info about logging.

‎src/bootstrap/jobs/http_tracker.rs

+10-3
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,9 @@ mod tests {
8686

8787
use torrust_tracker_test_helpers::configuration::ephemeral_public;
8888

89-
use crate::bootstrap::app::initialize_with_configuration;
89+
use crate::bootstrap::app::initialize_global_services;
9090
use crate::bootstrap::jobs::http_tracker::start_job;
91-
use crate::core::services::statistics;
91+
use crate::core::services::{initialize_database, initialize_tracker, initialize_whitelist, statistics};
9292
use crate::servers::http::Version;
9393
use crate::servers::registar::Registar;
9494

@@ -97,9 +97,16 @@ mod tests {
9797
let cfg = Arc::new(ephemeral_public());
9898
let http_tracker = cfg.http_trackers.clone().expect("missing HTTP tracker configuration");
9999
let config = &http_tracker[0];
100+
100101
let (stats_event_sender, _stats_repository) = statistics::setup::factory(cfg.core.tracker_usage_statistics);
101102
let stats_event_sender = Arc::new(stats_event_sender);
102-
let tracker = initialize_with_configuration(&cfg);
103+
104+
initialize_global_services(&cfg);
105+
106+
let database = initialize_database(&cfg);
107+
let whitelist_manager = initialize_whitelist(database.clone());
108+
let tracker = Arc::new(initialize_tracker(&cfg, &database, &whitelist_manager));
109+
103110
let version = Version::V1;
104111

105112
start_job(config, tracker, stats_event_sender, Registar::default().give_form(), version)

‎src/bootstrap/jobs/tracker_apis.rs

+7-3
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,9 @@ mod tests {
140140
use tokio::sync::RwLock;
141141
use torrust_tracker_test_helpers::configuration::ephemeral_public;
142142

143-
use crate::bootstrap::app::initialize_with_configuration;
143+
use crate::bootstrap::app::initialize_global_services;
144144
use crate::bootstrap::jobs::tracker_apis::start_job;
145-
use crate::core::services::statistics;
145+
use crate::core::services::{initialize_database, initialize_tracker, initialize_whitelist, statistics};
146146
use crate::servers::apis::Version;
147147
use crate::servers::registar::Registar;
148148
use crate::servers::udp::server::banning::BanService;
@@ -158,7 +158,11 @@ mod tests {
158158
let stats_event_sender = Arc::new(stats_event_sender);
159159
let stats_repository = Arc::new(stats_repository);
160160

161-
let tracker = initialize_with_configuration(&cfg);
161+
initialize_global_services(&cfg);
162+
163+
let database = initialize_database(&cfg);
164+
let whitelist_manager = initialize_whitelist(database.clone());
165+
let tracker = Arc::new(initialize_tracker(&cfg, &database, &whitelist_manager));
162166

163167
let version = Version::V1;
164168

‎src/console/profiling.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,9 @@ pub async fn run() {
179179
return;
180180
};
181181

182-
let (config, tracker, ban_service, stats_event_sender, stats_repository) = bootstrap::app::setup();
182+
let (config, app_container) = bootstrap::app::setup();
183183

184-
let jobs = app::start(&config, tracker, ban_service, stats_event_sender, stats_repository).await;
184+
let jobs = app::start(&config, &app_container).await;
185185

186186
// Run the tracker for a fixed duration
187187
let run_duration = sleep(Duration::from_secs(duration_secs));

‎src/container.rs

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
use std::sync::Arc;
2+
3+
use tokio::sync::RwLock;
4+
5+
use crate::core::statistics::event::sender::Sender;
6+
use crate::core::statistics::repository::Repository;
7+
use crate::core::whitelist::WhiteListManager;
8+
use crate::core::Tracker;
9+
use crate::servers::udp::server::banning::BanService;
10+
11+
pub struct AppContainer {
12+
pub tracker: Arc<Tracker>,
13+
pub ban_service: Arc<RwLock<BanService>>,
14+
pub stats_event_sender: Arc<Option<Box<dyn Sender>>>,
15+
pub stats_repository: Arc<Repository>,
16+
pub whitelist_manager: Arc<WhiteListManager>,
17+
}

‎src/core/mod.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -1080,28 +1080,28 @@ mod tests {
10801080
use torrust_tracker_primitives::DurationSinceUnixEpoch;
10811081
use torrust_tracker_test_helpers::configuration;
10821082

1083-
use crate::bootstrap::app::initialize_tracker_dependencies;
1083+
use crate::app_test::initialize_tracker_dependencies;
10841084
use crate::core::peer::Peer;
1085-
use crate::core::services::tracker_factory;
1085+
use crate::core::services::initialize_tracker;
10861086
use crate::core::whitelist::WhiteListManager;
10871087
use crate::core::{TorrentsMetrics, Tracker};
10881088

10891089
fn public_tracker() -> Tracker {
10901090
let config = configuration::ephemeral_public();
10911091
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
1092-
tracker_factory(&config, &database, &whitelist_manager)
1092+
initialize_tracker(&config, &database, &whitelist_manager)
10931093
}
10941094

10951095
fn private_tracker() -> Tracker {
10961096
let config = configuration::ephemeral_private();
10971097
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
1098-
tracker_factory(&config, &database, &whitelist_manager)
1098+
initialize_tracker(&config, &database, &whitelist_manager)
10991099
}
11001100

11011101
fn whitelisted_tracker() -> (Tracker, Arc<WhiteListManager>) {
11021102
let config = configuration::ephemeral_listed();
11031103
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
1104-
let tracker = tracker_factory(&config, &database, &whitelist_manager);
1104+
let tracker = initialize_tracker(&config, &database, &whitelist_manager);
11051105

11061106
(tracker, whitelist_manager)
11071107
}
@@ -1110,7 +1110,7 @@ mod tests {
11101110
let mut config = configuration::ephemeral_listed();
11111111
config.core.tracker_policy.persistent_torrent_completed_stat = true;
11121112
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
1113-
tracker_factory(&config, &database, &whitelist_manager)
1113+
initialize_tracker(&config, &database, &whitelist_manager)
11141114
}
11151115

11161116
fn sample_info_hash() -> InfoHash {

‎src/core/services/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use crate::core::Tracker;
2424
///
2525
/// Will panic if tracker cannot be instantiated.
2626
#[must_use]
27-
pub fn tracker_factory(
27+
pub fn initialize_tracker(
2828
config: &Configuration,
2929
database: &Arc<Box<dyn Database>>,
3030
whitelist_manager: &Arc<WhiteListManager>,

‎src/core/services/statistics/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,10 @@ mod tests {
117117
use torrust_tracker_primitives::torrent_metrics::TorrentsMetrics;
118118
use torrust_tracker_test_helpers::configuration;
119119

120-
use crate::bootstrap::app::initialize_tracker_dependencies;
120+
use crate::app_test::initialize_tracker_dependencies;
121121
use crate::core;
122+
use crate::core::services::initialize_tracker;
122123
use crate::core::services::statistics::{self, get_metrics, TrackerMetrics};
123-
use crate::core::services::tracker_factory;
124124
use crate::servers::udp::server::banning::BanService;
125125
use crate::servers::udp::server::launcher::MAX_CONNECTION_ID_ERRORS_PER_IP;
126126

@@ -136,7 +136,7 @@ mod tests {
136136
let (_stats_event_sender, stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
137137
let stats_repository = Arc::new(stats_repository);
138138

139-
let tracker = Arc::new(tracker_factory(&config, &database, &whitelist_manager));
139+
let tracker = Arc::new(initialize_tracker(&config, &database, &whitelist_manager));
140140

141141
let ban_service = Arc::new(RwLock::new(BanService::new(MAX_CONNECTION_ID_ERRORS_PER_IP)));
142142

‎src/core/services/torrent.rs

+11-11
Original file line numberDiff line numberDiff line change
@@ -129,10 +129,10 @@ mod tests {
129129
use torrust_tracker_configuration::Configuration;
130130
use torrust_tracker_test_helpers::configuration;
131131

132-
use crate::bootstrap::app::initialize_tracker_dependencies;
132+
use crate::app_test::initialize_tracker_dependencies;
133+
use crate::core::services::initialize_tracker;
133134
use crate::core::services::torrent::tests::sample_peer;
134135
use crate::core::services::torrent::{get_torrent_info, Info};
135-
use crate::core::services::tracker_factory;
136136

137137
pub fn tracker_configuration() -> Configuration {
138138
configuration::ephemeral()
@@ -143,7 +143,7 @@ mod tests {
143143
let config = tracker_configuration();
144144

145145
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
146-
let tracker = tracker_factory(&config, &database, &whitelist_manager);
146+
let tracker = initialize_tracker(&config, &database, &whitelist_manager);
147147

148148
let tracker = Arc::new(tracker);
149149

@@ -161,7 +161,7 @@ mod tests {
161161
let config = tracker_configuration();
162162

163163
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
164-
let tracker = Arc::new(tracker_factory(&config, &database, &whitelist_manager));
164+
let tracker = Arc::new(initialize_tracker(&config, &database, &whitelist_manager));
165165

166166
let hash = "9e0217d0fa71c87332cd8bf9dbeabcb2c2cf3c4d".to_owned();
167167
let info_hash = InfoHash::from_str(&hash).unwrap();
@@ -191,10 +191,10 @@ mod tests {
191191
use torrust_tracker_configuration::Configuration;
192192
use torrust_tracker_test_helpers::configuration;
193193

194-
use crate::bootstrap::app::initialize_tracker_dependencies;
194+
use crate::app_test::initialize_tracker_dependencies;
195+
use crate::core::services::initialize_tracker;
195196
use crate::core::services::torrent::tests::sample_peer;
196197
use crate::core::services::torrent::{get_torrents_page, BasicInfo, Pagination};
197-
use crate::core::services::tracker_factory;
198198

199199
pub fn tracker_configuration() -> Configuration {
200200
configuration::ephemeral()
@@ -205,7 +205,7 @@ mod tests {
205205
let config = tracker_configuration();
206206

207207
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
208-
let tracker = Arc::new(tracker_factory(&config, &database, &whitelist_manager));
208+
let tracker = Arc::new(initialize_tracker(&config, &database, &whitelist_manager));
209209

210210
let torrents = get_torrents_page(tracker.clone(), Some(&Pagination::default())).await;
211211

@@ -217,7 +217,7 @@ mod tests {
217217
let config = tracker_configuration();
218218

219219
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
220-
let tracker = Arc::new(tracker_factory(&config, &database, &whitelist_manager));
220+
let tracker = Arc::new(initialize_tracker(&config, &database, &whitelist_manager));
221221

222222
let hash = "9e0217d0fa71c87332cd8bf9dbeabcb2c2cf3c4d".to_owned();
223223
let info_hash = InfoHash::from_str(&hash).unwrap();
@@ -242,7 +242,7 @@ mod tests {
242242
let config = tracker_configuration();
243243

244244
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
245-
let tracker = Arc::new(tracker_factory(&config, &database, &whitelist_manager));
245+
let tracker = Arc::new(initialize_tracker(&config, &database, &whitelist_manager));
246246

247247
let hash1 = "9e0217d0fa71c87332cd8bf9dbeabcb2c2cf3c4d".to_owned();
248248
let info_hash1 = InfoHash::from_str(&hash1).unwrap();
@@ -265,7 +265,7 @@ mod tests {
265265
let config = tracker_configuration();
266266

267267
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
268-
let tracker = Arc::new(tracker_factory(&config, &database, &whitelist_manager));
268+
let tracker = Arc::new(initialize_tracker(&config, &database, &whitelist_manager));
269269

270270
let hash1 = "9e0217d0fa71c87332cd8bf9dbeabcb2c2cf3c4d".to_owned();
271271
let info_hash1 = InfoHash::from_str(&hash1).unwrap();
@@ -297,7 +297,7 @@ mod tests {
297297
let config = tracker_configuration();
298298

299299
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
300-
let tracker = Arc::new(tracker_factory(&config, &database, &whitelist_manager));
300+
let tracker = Arc::new(initialize_tracker(&config, &database, &whitelist_manager));
301301

302302
let hash1 = "9e0217d0fa71c87332cd8bf9dbeabcb2c2cf3c4d".to_owned();
303303
let info_hash1 = InfoHash::from_str(&hash1).unwrap();

‎src/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -491,8 +491,10 @@
491491
use torrust_tracker_clock::clock;
492492

493493
pub mod app;
494+
pub mod app_test;
494495
pub mod bootstrap;
495496
pub mod console;
497+
pub mod container;
496498
pub mod core;
497499
pub mod servers;
498500
pub mod shared;

‎src/main.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ use torrust_tracker_lib::{app, bootstrap};
22

33
#[tokio::main]
44
async fn main() {
5-
let (config, tracker, udp_ban_service, stats_event_sender, stats_repository) = bootstrap::app::setup();
5+
let (config, app_container) = bootstrap::app::setup();
66

7-
let jobs = app::start(&config, tracker, udp_ban_service, stats_event_sender, stats_repository).await;
7+
let jobs = app::start(&config, &app_container).await;
88

99
// handle the signals
1010
tokio::select! {

‎src/servers/apis/server.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -333,9 +333,9 @@ mod tests {
333333
use tokio::sync::RwLock;
334334
use torrust_tracker_test_helpers::configuration::ephemeral_public;
335335

336-
use crate::bootstrap::app::initialize_with_configuration;
336+
use crate::bootstrap::app::initialize_global_services;
337337
use crate::bootstrap::jobs::make_rust_tls;
338-
use crate::core::services::statistics;
338+
use crate::core::services::{initialize_database, initialize_tracker, initialize_whitelist, statistics};
339339
use crate::servers::apis::server::{ApiServer, Launcher};
340340
use crate::servers::registar::Registar;
341341
use crate::servers::udp::server::banning::BanService;
@@ -350,7 +350,12 @@ mod tests {
350350
let (stats_event_sender, stats_repository) = statistics::setup::factory(cfg.core.tracker_usage_statistics);
351351
let stats_event_sender = Arc::new(stats_event_sender);
352352
let stats_repository = Arc::new(stats_repository);
353-
let tracker = initialize_with_configuration(&cfg);
353+
354+
initialize_global_services(&cfg);
355+
356+
let database = initialize_database(&cfg);
357+
let whitelist_manager = initialize_whitelist(database.clone());
358+
let tracker = Arc::new(initialize_tracker(&cfg, &database, &whitelist_manager));
354359

355360
let bind_to = config.bind_address;
356361

‎src/servers/http/server.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -242,9 +242,9 @@ mod tests {
242242

243243
use torrust_tracker_test_helpers::configuration::ephemeral_public;
244244

245-
use crate::bootstrap::app::initialize_with_configuration;
245+
use crate::bootstrap::app::initialize_global_services;
246246
use crate::bootstrap::jobs::make_rust_tls;
247-
use crate::core::services::statistics;
247+
use crate::core::services::{initialize_database, initialize_tracker, initialize_whitelist, statistics};
248248
use crate::servers::http::server::{HttpServer, Launcher};
249249
use crate::servers::registar::Registar;
250250

@@ -254,7 +254,12 @@ mod tests {
254254

255255
let (stats_event_sender, _stats_repository) = statistics::setup::factory(cfg.core.tracker_usage_statistics);
256256
let stats_event_sender = Arc::new(stats_event_sender);
257-
let tracker = initialize_with_configuration(&cfg);
257+
258+
initialize_global_services(&cfg);
259+
260+
let database = initialize_database(&cfg);
261+
let whitelist_manager = initialize_whitelist(database.clone());
262+
let tracker = Arc::new(initialize_tracker(&cfg, &database, &whitelist_manager));
258263

259264
let http_trackers = cfg.http_trackers.clone().expect("missing HTTP trackers configuration");
260265
let config = &http_trackers[0];

‎src/servers/http/v1/handlers/announce.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -205,8 +205,8 @@ mod tests {
205205
use bittorrent_primitives::info_hash::InfoHash;
206206
use torrust_tracker_test_helpers::configuration;
207207

208-
use crate::bootstrap::app::initialize_tracker_dependencies;
209-
use crate::core::services::{statistics, tracker_factory};
208+
use crate::app_test::initialize_tracker_dependencies;
209+
use crate::core::services::{initialize_tracker, statistics};
210210
use crate::core::statistics::event::sender::Sender;
211211
use crate::core::Tracker;
212212

@@ -216,7 +216,7 @@ mod tests {
216216
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
217217
let (stats_event_sender, _stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
218218

219-
(tracker_factory(&config, &database, &whitelist_manager), stats_event_sender)
219+
(initialize_tracker(&config, &database, &whitelist_manager), stats_event_sender)
220220
}
221221

222222
fn whitelisted_tracker() -> (Tracker, Option<Box<dyn Sender>>) {
@@ -225,7 +225,7 @@ mod tests {
225225
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
226226
let (stats_event_sender, _stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
227227

228-
(tracker_factory(&config, &database, &whitelist_manager), stats_event_sender)
228+
(initialize_tracker(&config, &database, &whitelist_manager), stats_event_sender)
229229
}
230230

231231
fn tracker_on_reverse_proxy() -> (Tracker, Option<Box<dyn Sender>>) {
@@ -234,7 +234,7 @@ mod tests {
234234
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
235235
let (stats_event_sender, _stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
236236

237-
(tracker_factory(&config, &database, &whitelist_manager), stats_event_sender)
237+
(initialize_tracker(&config, &database, &whitelist_manager), stats_event_sender)
238238
}
239239

240240
fn tracker_not_on_reverse_proxy() -> (Tracker, Option<Box<dyn Sender>>) {
@@ -243,7 +243,7 @@ mod tests {
243243
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
244244
let (stats_event_sender, _stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
245245

246-
(tracker_factory(&config, &database, &whitelist_manager), stats_event_sender)
246+
(initialize_tracker(&config, &database, &whitelist_manager), stats_event_sender)
247247
}
248248

249249
fn sample_announce_request() -> Announce {

‎src/servers/http/v1/handlers/scrape.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,8 @@ mod tests {
126126
use bittorrent_primitives::info_hash::InfoHash;
127127
use torrust_tracker_test_helpers::configuration;
128128

129-
use crate::bootstrap::app::initialize_tracker_dependencies;
130-
use crate::core::services::{statistics, tracker_factory};
129+
use crate::app_test::initialize_tracker_dependencies;
130+
use crate::core::services::{initialize_tracker, statistics};
131131
use crate::core::Tracker;
132132

133133
fn private_tracker() -> (Tracker, Option<Box<dyn crate::core::statistics::event::sender::Sender>>) {
@@ -136,7 +136,7 @@ mod tests {
136136
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
137137
let (stats_event_sender, _stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
138138

139-
(tracker_factory(&config, &database, &whitelist_manager), stats_event_sender)
139+
(initialize_tracker(&config, &database, &whitelist_manager), stats_event_sender)
140140
}
141141

142142
fn whitelisted_tracker() -> (Tracker, Option<Box<dyn crate::core::statistics::event::sender::Sender>>) {
@@ -145,7 +145,7 @@ mod tests {
145145
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
146146
let (stats_event_sender, _stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
147147

148-
(tracker_factory(&config, &database, &whitelist_manager), stats_event_sender)
148+
(initialize_tracker(&config, &database, &whitelist_manager), stats_event_sender)
149149
}
150150

151151
fn tracker_on_reverse_proxy() -> (Tracker, Option<Box<dyn crate::core::statistics::event::sender::Sender>>) {
@@ -154,7 +154,7 @@ mod tests {
154154
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
155155
let (stats_event_sender, _stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
156156

157-
(tracker_factory(&config, &database, &whitelist_manager), stats_event_sender)
157+
(initialize_tracker(&config, &database, &whitelist_manager), stats_event_sender)
158158
}
159159

160160
fn tracker_not_on_reverse_proxy() -> (Tracker, Option<Box<dyn crate::core::statistics::event::sender::Sender>>) {
@@ -163,7 +163,7 @@ mod tests {
163163
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
164164
let (stats_event_sender, _stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
165165

166-
(tracker_factory(&config, &database, &whitelist_manager), stats_event_sender)
166+
(initialize_tracker(&config, &database, &whitelist_manager), stats_event_sender)
167167
}
168168

169169
fn sample_scrape_request() -> Scrape {

‎src/servers/http/v1/services/announce.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ mod tests {
6565
use torrust_tracker_primitives::{peer, DurationSinceUnixEpoch};
6666
use torrust_tracker_test_helpers::configuration;
6767

68-
use crate::bootstrap::app::initialize_tracker_dependencies;
69-
use crate::core::services::{statistics, tracker_factory};
68+
use crate::app_test::initialize_tracker_dependencies;
69+
use crate::core::services::{initialize_tracker, statistics};
7070
use crate::core::statistics::event::sender::Sender;
7171
use crate::core::Tracker;
7272

@@ -77,7 +77,7 @@ mod tests {
7777
let (stats_event_sender, _stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
7878
let stats_event_sender = Arc::new(stats_event_sender);
7979

80-
let tracker = tracker_factory(&config, &database, &whitelist_manager);
80+
let tracker = initialize_tracker(&config, &database, &whitelist_manager);
8181

8282
(tracker, stats_event_sender)
8383
}
@@ -123,7 +123,7 @@ mod tests {
123123
use torrust_tracker_test_helpers::configuration;
124124

125125
use super::{sample_peer_using_ipv4, sample_peer_using_ipv6};
126-
use crate::bootstrap::app::initialize_tracker_dependencies;
126+
use crate::app_test::initialize_tracker_dependencies;
127127
use crate::core::{statistics, PeersWanted, Tracker};
128128
use crate::servers::http::v1::services::announce::invoke;
129129
use crate::servers::http::v1::services::announce::tests::{public_tracker, sample_info_hash, sample_peer};

‎src/servers/http/v1/services/scrape.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -80,16 +80,16 @@ mod tests {
8080
use torrust_tracker_primitives::{peer, DurationSinceUnixEpoch};
8181
use torrust_tracker_test_helpers::configuration;
8282

83-
use crate::bootstrap::app::initialize_tracker_dependencies;
84-
use crate::core::services::tracker_factory;
83+
use crate::app_test::initialize_tracker_dependencies;
84+
use crate::core::services::initialize_tracker;
8585
use crate::core::Tracker;
8686

8787
fn public_tracker() -> Tracker {
8888
let config = configuration::ephemeral_public();
8989

9090
let (database, whitelist_manager) = initialize_tracker_dependencies(&config);
9191

92-
tracker_factory(&config, &database, &whitelist_manager)
92+
initialize_tracker(&config, &database, &whitelist_manager)
9393
}
9494

9595
fn sample_info_hashes() -> Vec<InfoHash> {

‎src/servers/udp/handlers.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -470,8 +470,8 @@ mod tests {
470470
use torrust_tracker_test_helpers::configuration;
471471

472472
use super::gen_remote_fingerprint;
473-
use crate::bootstrap::app::initialize_tracker_dependencies;
474-
use crate::core::services::{statistics, tracker_factory};
473+
use crate::app_test::initialize_tracker_dependencies;
474+
use crate::core::services::{initialize_tracker, statistics};
475475
use crate::core::statistics::event::sender::Sender;
476476
use crate::core::Tracker;
477477
use crate::CurrentClock;
@@ -496,7 +496,7 @@ mod tests {
496496
let (database, whitelist_manager) = initialize_tracker_dependencies(config);
497497
let (stats_event_sender, _stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
498498

499-
(tracker_factory(config, &database, &whitelist_manager), stats_event_sender)
499+
(initialize_tracker(config, &database, &whitelist_manager), stats_event_sender)
500500
}
501501

502502
fn sample_ipv4_remote_addr() -> SocketAddr {
@@ -1318,7 +1318,7 @@ mod tests {
13181318
use aquatic_udp_protocol::{InfoHash as AquaticInfoHash, PeerId as AquaticPeerId};
13191319
use mockall::predicate::eq;
13201320

1321-
use crate::bootstrap::app::initialize_tracker_dependencies;
1321+
use crate::app_test::initialize_tracker_dependencies;
13221322
use crate::core::{self, statistics};
13231323
use crate::servers::udp::connection_cookie::make;
13241324
use crate::servers::udp::handlers::handle_announce;

‎src/servers/udp/server/mod.rs

+14-4
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ mod tests {
6363

6464
use super::spawner::Spawner;
6565
use super::Server;
66-
use crate::bootstrap::app::initialize_with_configuration;
67-
use crate::core::services::statistics;
66+
use crate::bootstrap::app::initialize_global_services;
67+
use crate::core::services::{initialize_database, initialize_tracker, initialize_whitelist, statistics};
6868
use crate::servers::registar::Registar;
6969
use crate::servers::udp::server::banning::BanService;
7070
use crate::servers::udp::server::launcher::MAX_CONNECTION_ID_ERRORS_PER_IP;
@@ -76,7 +76,12 @@ mod tests {
7676
let (stats_event_sender, _stats_repository) = statistics::setup::factory(cfg.core.tracker_usage_statistics);
7777
let stats_event_sender = Arc::new(stats_event_sender);
7878
let ban_service = Arc::new(RwLock::new(BanService::new(MAX_CONNECTION_ID_ERRORS_PER_IP)));
79-
let tracker = initialize_with_configuration(&cfg);
79+
80+
initialize_global_services(&cfg);
81+
82+
let database = initialize_database(&cfg);
83+
let whitelist_manager = initialize_whitelist(database.clone());
84+
let tracker = Arc::new(initialize_tracker(&cfg, &database, &whitelist_manager));
8085

8186
let udp_trackers = cfg.udp_trackers.clone().expect("missing UDP trackers configuration");
8287
let config = &udp_trackers[0];
@@ -110,7 +115,12 @@ mod tests {
110115
let (stats_event_sender, _stats_repository) = statistics::setup::factory(cfg.core.tracker_usage_statistics);
111116
let stats_event_sender = Arc::new(stats_event_sender);
112117
let ban_service = Arc::new(RwLock::new(BanService::new(MAX_CONNECTION_ID_ERRORS_PER_IP)));
113-
let tracker = initialize_with_configuration(&cfg);
118+
119+
initialize_global_services(&cfg);
120+
121+
let database = initialize_database(&cfg);
122+
let whitelist_manager = initialize_whitelist(database.clone());
123+
let tracker = Arc::new(initialize_tracker(&cfg, &database, &whitelist_manager));
114124

115125
let config = &cfg.udp_trackers.as_ref().unwrap().first().unwrap();
116126
let bind_to = config.bind_address;

‎tests/servers/api/environment.rs

+8-16
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,15 @@ use futures::executor::block_on;
66
use tokio::sync::RwLock;
77
use torrust_tracker_api_client::connection_info::{ConnectionInfo, Origin};
88
use torrust_tracker_configuration::{Configuration, HttpApi};
9-
use torrust_tracker_lib::bootstrap::app::initialize_with_configuration;
9+
use torrust_tracker_lib::bootstrap::app::{initialize_app_container, initialize_global_services};
1010
use torrust_tracker_lib::bootstrap::jobs::make_rust_tls;
11-
use torrust_tracker_lib::core::services::statistics;
1211
use torrust_tracker_lib::core::statistics::event::sender::Sender;
1312
use torrust_tracker_lib::core::statistics::repository::Repository;
1413
use torrust_tracker_lib::core::whitelist::WhiteListManager;
1514
use torrust_tracker_lib::core::Tracker;
1615
use torrust_tracker_lib::servers::apis::server::{ApiServer, Launcher, Running, Stopped};
1716
use torrust_tracker_lib::servers::registar::Registar;
1817
use torrust_tracker_lib::servers::udp::server::banning::BanService;
19-
use torrust_tracker_lib::servers::udp::server::launcher::MAX_CONNECTION_ID_ERRORS_PER_IP;
2018
use torrust_tracker_primitives::peer;
2119

2220
pub struct Environment<S>
@@ -45,15 +43,9 @@ where
4543

4644
impl Environment<Stopped> {
4745
pub fn new(configuration: &Arc<Configuration>) -> Self {
48-
let (stats_event_sender, stats_repository) = statistics::setup::factory(configuration.core.tracker_usage_statistics);
49-
let stats_event_sender = Arc::new(stats_event_sender);
50-
let stats_repository = Arc::new(stats_repository);
51-
let ban_service = Arc::new(RwLock::new(BanService::new(MAX_CONNECTION_ID_ERRORS_PER_IP)));
46+
initialize_global_services(configuration);
5247

53-
let tracker = initialize_with_configuration(configuration);
54-
55-
// todo: instantiate outside of `initialize_with_configuration`
56-
let whitelist_manager = tracker.whitelist_manager.clone();
48+
let app_container = initialize_app_container(configuration);
5749

5850
let config = Arc::new(configuration.http_api.clone().expect("missing API configuration"));
5951

@@ -65,11 +57,11 @@ impl Environment<Stopped> {
6557

6658
Self {
6759
config,
68-
tracker,
69-
stats_event_sender,
70-
stats_repository,
71-
whitelist_manager,
72-
ban_service,
60+
tracker: app_container.tracker.clone(),
61+
stats_event_sender: app_container.stats_event_sender.clone(),
62+
stats_repository: app_container.stats_repository.clone(),
63+
whitelist_manager: app_container.whitelist_manager.clone(),
64+
ban_service: app_container.ban_service.clone(),
7365
registar: Registar::default(),
7466
server,
7567
}

‎tests/servers/http/environment.rs

+7-13
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@ use std::sync::Arc;
33
use bittorrent_primitives::info_hash::InfoHash;
44
use futures::executor::block_on;
55
use torrust_tracker_configuration::{Configuration, HttpTracker};
6-
use torrust_tracker_lib::bootstrap::app::initialize_with_configuration;
6+
use torrust_tracker_lib::bootstrap::app::{initialize_app_container, initialize_global_services};
77
use torrust_tracker_lib::bootstrap::jobs::make_rust_tls;
8-
use torrust_tracker_lib::core::services::statistics;
98
use torrust_tracker_lib::core::statistics::event::sender::Sender;
109
use torrust_tracker_lib::core::statistics::repository::Repository;
1110
use torrust_tracker_lib::core::whitelist::WhiteListManager;
@@ -34,14 +33,9 @@ impl<S> Environment<S> {
3433
impl Environment<Stopped> {
3534
#[allow(dead_code)]
3635
pub fn new(configuration: &Arc<Configuration>) -> Self {
37-
let (stats_event_sender, stats_repository) = statistics::setup::factory(configuration.core.tracker_usage_statistics);
38-
let stats_event_sender = Arc::new(stats_event_sender);
39-
let stats_repository = Arc::new(stats_repository);
36+
initialize_global_services(configuration);
4037

41-
let tracker = initialize_with_configuration(configuration);
42-
43-
// todo: instantiate outside of `initialize_with_configuration`
44-
let whitelist_manager = tracker.whitelist_manager.clone();
38+
let app_container = initialize_app_container(configuration);
4539

4640
let http_tracker = configuration
4741
.http_trackers
@@ -58,10 +52,10 @@ impl Environment<Stopped> {
5852

5953
Self {
6054
config,
61-
tracker,
62-
stats_event_sender,
63-
stats_repository,
64-
whitelist_manager,
55+
tracker: app_container.tracker.clone(),
56+
stats_event_sender: app_container.stats_event_sender.clone(),
57+
stats_repository: app_container.stats_repository.clone(),
58+
whitelist_manager: app_container.whitelist_manager.clone(),
6559
registar: Registar::default(),
6660
server,
6761
}

‎tests/servers/udp/environment.rs

+7-12
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,12 @@ use std::sync::Arc;
44
use bittorrent_primitives::info_hash::InfoHash;
55
use tokio::sync::RwLock;
66
use torrust_tracker_configuration::{Configuration, UdpTracker, DEFAULT_TIMEOUT};
7-
use torrust_tracker_lib::bootstrap::app::initialize_with_configuration;
8-
use torrust_tracker_lib::core::services::statistics;
7+
use torrust_tracker_lib::bootstrap::app::{initialize_app_container, initialize_global_services};
98
use torrust_tracker_lib::core::statistics::event::sender::Sender;
109
use torrust_tracker_lib::core::statistics::repository::Repository;
1110
use torrust_tracker_lib::core::Tracker;
1211
use torrust_tracker_lib::servers::registar::Registar;
1312
use torrust_tracker_lib::servers::udp::server::banning::BanService;
14-
use torrust_tracker_lib::servers::udp::server::launcher::MAX_CONNECTION_ID_ERRORS_PER_IP;
1513
use torrust_tracker_lib::servers::udp::server::spawner::Spawner;
1614
use torrust_tracker_lib::servers::udp::server::states::{Running, Stopped};
1715
use torrust_tracker_lib::servers::udp::server::Server;
@@ -44,12 +42,9 @@ where
4442
impl Environment<Stopped> {
4543
#[allow(dead_code)]
4644
pub fn new(configuration: &Arc<Configuration>) -> Self {
47-
let (stats_event_sender, stats_repository) = statistics::setup::factory(configuration.core.tracker_usage_statistics);
48-
let stats_event_sender = Arc::new(stats_event_sender);
49-
let stats_repository = Arc::new(stats_repository);
50-
let ban_service = Arc::new(RwLock::new(BanService::new(MAX_CONNECTION_ID_ERRORS_PER_IP)));
45+
initialize_global_services(configuration);
5146

52-
let tracker = initialize_with_configuration(configuration);
47+
let app_container = initialize_app_container(configuration);
5348

5449
let udp_tracker = configuration.udp_trackers.clone().expect("missing UDP tracker configuration");
5550

@@ -61,10 +56,10 @@ impl Environment<Stopped> {
6156

6257
Self {
6358
config,
64-
tracker,
65-
stats_event_sender,
66-
stats_repository,
67-
ban_service,
59+
tracker: app_container.tracker.clone(),
60+
stats_event_sender: app_container.stats_event_sender.clone(),
61+
stats_repository: app_container.stats_repository.clone(),
62+
ban_service: app_container.ban_service.clone(),
6863
registar: Registar::default(),
6964
server,
7065
}

0 commit comments

Comments
 (0)
Please sign in to comment.