1+ use std:: collections:: HashMap ;
2+ use std:: net:: SocketAddr ;
13use std:: sync:: Arc ;
24
35use bittorrent_http_tracker_core:: container:: HttpTrackerCoreContainer ;
@@ -9,12 +11,22 @@ use bittorrent_udp_tracker_core::services::banning::BanService;
911use bittorrent_udp_tracker_core:: { self , MAX_CONNECTION_ID_ERRORS_PER_IP } ;
1012use tokio:: sync:: RwLock ;
1113use torrust_rest_tracker_api_core:: container:: TrackerHttpApiCoreContainer ;
12- use torrust_tracker_configuration:: { Configuration , HttpApi , HttpTracker , UdpTracker } ;
14+ use torrust_tracker_configuration:: { Configuration , HttpApi } ;
1315use torrust_udp_tracker_server:: container:: UdpTrackerServerContainer ;
1416use tracing:: instrument;
1517
18+ #[ derive( thiserror:: Error , Debug , Clone ) ]
19+ pub enum Error {
20+ #[ error( "There is not a HTTP tracker server instance bound to the socket address: {bind_address}" ) ]
21+ MissingHttpTrackerCoreContainer { bind_address : SocketAddr } ,
22+
23+ #[ error( "There is not a UDP tracker server instance bound to the socket address: {bind_address}" ) ]
24+ MissingUdpTrackerCoreContainer { bind_address : SocketAddr } ,
25+ }
26+
1627pub struct AppContainer {
1728 pub tracker_core_container : Arc < TrackerCoreContainer > ,
29+ pub http_api_config : Arc < Option < HttpApi > > ,
1830
1931 // UDP Tracker Core Services
2032 pub udp_core_stats_event_sender : Arc < Option < Box < dyn bittorrent_udp_tracker_core:: event:: sender:: Sender > > > ,
@@ -33,13 +45,22 @@ pub struct AppContainer {
3345 // UDP Tracker Server Services
3446 pub udp_server_stats_event_sender : Arc < Option < Box < dyn torrust_udp_tracker_server:: event:: sender:: Sender > > > ,
3547 pub udp_server_stats_repository : Arc < torrust_udp_tracker_server:: statistics:: repository:: Repository > ,
48+
49+ // UDP Tracker Server Container
50+ pub udp_tracker_server_container : Arc < UdpTrackerServerContainer > ,
51+
52+ // Tracker Instance Containers
53+ pub http_tracker_containers : Arc < HashMap < SocketAddr , Arc < HttpTrackerCoreContainer > > > ,
54+ pub udp_tracker_containers : Arc < HashMap < SocketAddr , Arc < UdpTrackerCoreContainer > > > ,
3655}
3756
3857impl AppContainer {
3958 #[ instrument( skip( ) ) ]
4059 pub fn initialize ( configuration : & Configuration ) -> AppContainer {
4160 let core_config = Arc :: new ( configuration. core . clone ( ) ) ;
4261
62+ let http_api_config = Arc :: new ( configuration. http_api . clone ( ) ) ;
63+
4364 let tracker_core_container = Arc :: new ( TrackerCoreContainer :: initialize ( & core_config) ) ;
4465
4566 // HTTP Tracker Core Services
@@ -86,8 +107,59 @@ impl AppContainer {
86107 let udp_server_stats_event_sender = Arc :: new ( udp_server_stats_event_sender) ;
87108 let udp_server_stats_repository = Arc :: new ( udp_server_stats_repository) ;
88109
110+ // UDP Tracker Server Container
111+ let udp_tracker_server_container = Arc :: new ( UdpTrackerServerContainer {
112+ udp_server_stats_event_sender : udp_server_stats_event_sender. clone ( ) ,
113+ udp_server_stats_repository : udp_server_stats_repository. clone ( ) ,
114+ } ) ;
115+
116+ // Tracker Instance Containers
117+
118+ let mut http_tracker_containers = HashMap :: new ( ) ;
119+
120+ if let Some ( http_trackers) = & configuration. http_trackers {
121+ for http_tracker_config in http_trackers {
122+ http_tracker_containers. insert (
123+ http_tracker_config. bind_address ,
124+ Arc :: new ( HttpTrackerCoreContainer {
125+ tracker_core_container : tracker_core_container. clone ( ) ,
126+ http_tracker_config : Arc :: new ( http_tracker_config. clone ( ) ) ,
127+ http_stats_event_sender : http_stats_event_sender. clone ( ) ,
128+ http_stats_repository : http_stats_repository. clone ( ) ,
129+ announce_service : http_announce_service. clone ( ) ,
130+ scrape_service : http_scrape_service. clone ( ) ,
131+ } ) ,
132+ ) ;
133+ }
134+ }
135+
136+ let http_tracker_containers = Arc :: new ( http_tracker_containers) ;
137+
138+ let mut udp_tracker_containers = HashMap :: new ( ) ;
139+
140+ if let Some ( udp_trackers) = & configuration. udp_trackers {
141+ for udp_tracker_config in udp_trackers {
142+ udp_tracker_containers. insert (
143+ udp_tracker_config. bind_address ,
144+ Arc :: new ( UdpTrackerCoreContainer {
145+ tracker_core_container : tracker_core_container. clone ( ) ,
146+ udp_tracker_config : Arc :: new ( udp_tracker_config. clone ( ) ) ,
147+ udp_core_stats_event_sender : udp_core_stats_event_sender. clone ( ) ,
148+ udp_core_stats_repository : udp_core_stats_repository. clone ( ) ,
149+ ban_service : udp_ban_service. clone ( ) ,
150+ connect_service : udp_connect_service. clone ( ) ,
151+ announce_service : udp_announce_service. clone ( ) ,
152+ scrape_service : udp_scrape_service. clone ( ) ,
153+ } ) ,
154+ ) ;
155+ }
156+ }
157+
158+ let udp_tracker_containers = Arc :: new ( udp_tracker_containers) ;
159+
89160 AppContainer {
90161 tracker_core_container,
162+ http_api_config,
91163
92164 // UDP Tracker Core Services
93165 udp_core_stats_event_sender,
@@ -106,37 +178,45 @@ impl AppContainer {
106178 // UDP Tracker Server Services
107179 udp_server_stats_event_sender,
108180 udp_server_stats_repository,
181+
182+ // UDP Tracker Server Container
183+ udp_tracker_server_container,
184+
185+ // Tracker Instance Containers
186+ http_tracker_containers,
187+ udp_tracker_containers,
109188 }
110189 }
111190
112191 #[ must_use]
113- pub fn http_tracker_container ( & self , http_tracker_config : & Arc < HttpTracker > ) -> HttpTrackerCoreContainer {
114- HttpTrackerCoreContainer {
115- tracker_core_container : self . tracker_core_container . clone ( ) ,
116- http_tracker_config : http_tracker_config. clone ( ) ,
117- http_stats_event_sender : self . http_stats_event_sender . clone ( ) ,
118- http_stats_repository : self . http_stats_repository . clone ( ) ,
119- announce_service : self . http_announce_service . clone ( ) ,
120- scrape_service : self . http_scrape_service . clone ( ) ,
192+ pub fn udp_tracker_server_container ( & self ) -> Arc < UdpTrackerServerContainer > {
193+ self . udp_tracker_server_container . clone ( )
194+ }
195+
196+ /// # Errors
197+ ///
198+ /// Return an error if there is no HTTP tracker server instance bound to the
199+ /// socket address.
200+ pub fn http_tracker_container ( & self , bind_address : SocketAddr ) -> Result < Arc < HttpTrackerCoreContainer > , Error > {
201+ match self . http_tracker_containers . get ( & bind_address) {
202+ Some ( http_tracker_container) => Ok ( http_tracker_container. clone ( ) ) ,
203+ None => Err ( Error :: MissingHttpTrackerCoreContainer { bind_address } ) ,
121204 }
122205 }
123206
124- #[ must_use]
125- pub fn udp_tracker_container ( & self , udp_tracker_config : & Arc < UdpTracker > ) -> UdpTrackerCoreContainer {
126- UdpTrackerCoreContainer {
127- tracker_core_container : self . tracker_core_container . clone ( ) ,
128- udp_tracker_config : udp_tracker_config. clone ( ) ,
129- udp_core_stats_event_sender : self . udp_core_stats_event_sender . clone ( ) ,
130- udp_core_stats_repository : self . udp_core_stats_repository . clone ( ) ,
131- ban_service : self . udp_ban_service . clone ( ) ,
132- connect_service : self . udp_connect_service . clone ( ) ,
133- announce_service : self . udp_announce_service . clone ( ) ,
134- scrape_service : self . udp_scrape_service . clone ( ) ,
207+ /// # Errors
208+ ///
209+ /// Return an error if there is no UDP tracker server instance bound to the
210+ /// socket address.
211+ pub fn udp_tracker_container ( & self , bind_address : SocketAddr ) -> Result < Arc < UdpTrackerCoreContainer > , Error > {
212+ match self . udp_tracker_containers . get ( & bind_address) {
213+ Some ( udp_tracker_container) => Ok ( udp_tracker_container. clone ( ) ) ,
214+ None => Err ( Error :: MissingUdpTrackerCoreContainer { bind_address } ) ,
135215 }
136216 }
137217
138218 #[ must_use]
139- pub fn tracker_http_api_container ( & self , http_api_config : & Arc < HttpApi > ) -> TrackerHttpApiCoreContainer {
219+ pub fn tracker_http_api_container ( & self , http_api_config : & Arc < HttpApi > ) -> Arc < TrackerHttpApiCoreContainer > {
140220 TrackerHttpApiCoreContainer {
141221 tracker_core_container : self . tracker_core_container . clone ( ) ,
142222 http_api_config : http_api_config. clone ( ) ,
@@ -145,13 +225,6 @@ impl AppContainer {
145225 udp_core_stats_repository : self . udp_core_stats_repository . clone ( ) ,
146226 udp_server_stats_repository : self . udp_server_stats_repository . clone ( ) ,
147227 }
148- }
149-
150- #[ must_use]
151- pub fn udp_tracker_server_container ( & self ) -> UdpTrackerServerContainer {
152- UdpTrackerServerContainer {
153- udp_server_stats_event_sender : self . udp_server_stats_event_sender . clone ( ) ,
154- udp_server_stats_repository : self . udp_server_stats_repository . clone ( ) ,
155- }
228+ . into ( )
156229 }
157230}
0 commit comments