@@ -9,28 +9,43 @@ use aquatic_udp_protocol::ConnectionId;
9
9
use crate :: connection_cookie:: { gen_remote_fingerprint, make} ;
10
10
use crate :: statistics;
11
11
12
- /// # Panics
12
+ /// The `ConnectService` is responsible for handling the `connect` requests.
13
13
///
14
- /// IT will panic if there was an error making the connection cookie.
15
- pub async fn handle_connect (
16
- remote_addr : SocketAddr ,
17
- opt_udp_stats_event_sender : & Arc < Option < Box < dyn statistics:: event:: sender:: Sender > > > ,
18
- cookie_issue_time : f64 ,
19
- ) -> ConnectionId {
20
- let connection_id = make ( gen_remote_fingerprint ( & remote_addr) , cookie_issue_time) . expect ( "it should be a normal value" ) ;
21
-
22
- if let Some ( udp_stats_event_sender) = opt_udp_stats_event_sender. as_deref ( ) {
23
- match remote_addr {
24
- SocketAddr :: V4 ( _) => {
25
- udp_stats_event_sender. send_event ( statistics:: event:: Event :: Udp4Connect ) . await ;
26
- }
27
- SocketAddr :: V6 ( _) => {
28
- udp_stats_event_sender. send_event ( statistics:: event:: Event :: Udp6Connect ) . await ;
29
- }
14
+ /// It is responsible for generating the connection cookie and sending the
15
+ /// appropriate statistics events.
16
+ pub struct ConnectService {
17
+ pub opt_udp_core_stats_event_sender : Arc < Option < Box < dyn statistics:: event:: sender:: Sender > > > ,
18
+ }
19
+
20
+ impl ConnectService {
21
+ #[ must_use]
22
+ pub fn new ( opt_udp_core_stats_event_sender : Arc < Option < Box < dyn statistics:: event:: sender:: Sender > > > ) -> Self {
23
+ Self {
24
+ opt_udp_core_stats_event_sender,
30
25
}
31
26
}
32
27
33
- connection_id
28
+ /// Handles a `connect` request.
29
+ ///
30
+ /// # Panics
31
+ ///
32
+ /// It will panic if there was an error making the connection cookie.
33
+ pub async fn handle_connect ( & self , remote_addr : SocketAddr , cookie_issue_time : f64 ) -> ConnectionId {
34
+ let connection_id = make ( gen_remote_fingerprint ( & remote_addr) , cookie_issue_time) . expect ( "it should be a normal value" ) ;
35
+
36
+ if let Some ( udp_stats_event_sender) = self . opt_udp_core_stats_event_sender . as_deref ( ) {
37
+ match remote_addr {
38
+ SocketAddr :: V4 ( _) => {
39
+ udp_stats_event_sender. send_event ( statistics:: event:: Event :: Udp4Connect ) . await ;
40
+ }
41
+ SocketAddr :: V6 ( _) => {
42
+ udp_stats_event_sender. send_event ( statistics:: event:: Event :: Udp6Connect ) . await ;
43
+ }
44
+ }
45
+ }
46
+
47
+ connection_id
48
+ }
34
49
}
35
50
36
51
#[ cfg( test) ]
@@ -44,10 +59,10 @@ mod tests {
44
59
use mockall:: predicate:: eq;
45
60
46
61
use crate :: connection_cookie:: make;
47
- use crate :: services:: connect:: handle_connect ;
62
+ use crate :: services:: connect:: ConnectService ;
48
63
use crate :: services:: tests:: {
49
64
sample_ipv4_remote_addr, sample_ipv4_remote_addr_fingerprint, sample_ipv4_socket_address, sample_ipv6_remote_addr,
50
- sample_ipv6_remote_addr_fingerprint, sample_issue_time, MockUdpStatsEventSender ,
65
+ sample_ipv6_remote_addr_fingerprint, sample_issue_time, MockUdpCoreStatsEventSender ,
51
66
} ;
52
67
use crate :: statistics;
53
68
@@ -56,7 +71,11 @@ mod tests {
56
71
let ( udp_core_stats_event_sender, _udp_core_stats_repository) = statistics:: setup:: factory ( false ) ;
57
72
let udp_core_stats_event_sender = Arc :: new ( udp_core_stats_event_sender) ;
58
73
59
- let response = handle_connect ( sample_ipv4_remote_addr ( ) , & udp_core_stats_event_sender, sample_issue_time ( ) ) . await ;
74
+ let connect_service = Arc :: new ( ConnectService :: new ( udp_core_stats_event_sender) ) ;
75
+
76
+ let response = connect_service
77
+ . handle_connect ( sample_ipv4_remote_addr ( ) , sample_issue_time ( ) )
78
+ . await ;
60
79
61
80
assert_eq ! (
62
81
response,
@@ -69,7 +88,11 @@ mod tests {
69
88
let ( udp_core_stats_event_sender, _udp_core_stats_repository) = statistics:: setup:: factory ( false ) ;
70
89
let udp_core_stats_event_sender = Arc :: new ( udp_core_stats_event_sender) ;
71
90
72
- let response = handle_connect ( sample_ipv4_remote_addr ( ) , & udp_core_stats_event_sender, sample_issue_time ( ) ) . await ;
91
+ let connect_service = Arc :: new ( ConnectService :: new ( udp_core_stats_event_sender) ) ;
92
+
93
+ let response = connect_service
94
+ . handle_connect ( sample_ipv4_remote_addr ( ) , sample_issue_time ( ) )
95
+ . await ;
73
96
74
97
assert_eq ! (
75
98
response,
@@ -82,7 +105,11 @@ mod tests {
82
105
let ( udp_core_stats_event_sender, _udp_core_stats_repository) = statistics:: setup:: factory ( false ) ;
83
106
let udp_core_stats_event_sender = Arc :: new ( udp_core_stats_event_sender) ;
84
107
85
- let response = handle_connect ( sample_ipv6_remote_addr ( ) , & udp_core_stats_event_sender, sample_issue_time ( ) ) . await ;
108
+ let connect_service = Arc :: new ( ConnectService :: new ( udp_core_stats_event_sender) ) ;
109
+
110
+ let response = connect_service
111
+ . handle_connect ( sample_ipv6_remote_addr ( ) , sample_issue_time ( ) )
112
+ . await ;
86
113
87
114
assert_eq ! (
88
115
response,
@@ -92,32 +119,40 @@ mod tests {
92
119
93
120
#[ tokio:: test]
94
121
async fn it_should_send_the_upd4_connect_event_when_a_client_tries_to_connect_using_a_ip4_socket_address ( ) {
95
- let mut udp_stats_event_sender_mock = MockUdpStatsEventSender :: new ( ) ;
122
+ let mut udp_stats_event_sender_mock = MockUdpCoreStatsEventSender :: new ( ) ;
96
123
udp_stats_event_sender_mock
97
124
. expect_send_event ( )
98
125
. with ( eq ( statistics:: event:: Event :: Udp4Connect ) )
99
126
. times ( 1 )
100
127
. returning ( |_| Box :: pin ( future:: ready ( Some ( Ok ( ( ) ) ) ) ) ) ;
101
- let udp_stats_event_sender : Arc < Option < Box < dyn statistics:: event:: sender:: Sender > > > =
128
+ let opt_udp_stats_event_sender : Arc < Option < Box < dyn statistics:: event:: sender:: Sender > > > =
102
129
Arc :: new ( Some ( Box :: new ( udp_stats_event_sender_mock) ) ) ;
103
130
104
131
let client_socket_address = sample_ipv4_socket_address ( ) ;
105
132
106
- handle_connect ( client_socket_address, & udp_stats_event_sender, sample_issue_time ( ) ) . await ;
133
+ let connect_service = Arc :: new ( ConnectService :: new ( opt_udp_stats_event_sender) ) ;
134
+
135
+ connect_service
136
+ . handle_connect ( client_socket_address, sample_issue_time ( ) )
137
+ . await ;
107
138
}
108
139
109
140
#[ tokio:: test]
110
141
async fn it_should_send_the_upd6_connect_event_when_a_client_tries_to_connect_using_a_ip6_socket_address ( ) {
111
- let mut udp_stats_event_sender_mock = MockUdpStatsEventSender :: new ( ) ;
142
+ let mut udp_stats_event_sender_mock = MockUdpCoreStatsEventSender :: new ( ) ;
112
143
udp_stats_event_sender_mock
113
144
. expect_send_event ( )
114
145
. with ( eq ( statistics:: event:: Event :: Udp6Connect ) )
115
146
. times ( 1 )
116
147
. returning ( |_| Box :: pin ( future:: ready ( Some ( Ok ( ( ) ) ) ) ) ) ;
117
- let udp_stats_event_sender : Arc < Option < Box < dyn statistics:: event:: sender:: Sender > > > =
148
+ let opt_udp_stats_event_sender : Arc < Option < Box < dyn statistics:: event:: sender:: Sender > > > =
118
149
Arc :: new ( Some ( Box :: new ( udp_stats_event_sender_mock) ) ) ;
119
150
120
- handle_connect ( sample_ipv6_remote_addr ( ) , & udp_stats_event_sender, sample_issue_time ( ) ) . await ;
151
+ let connect_service = Arc :: new ( ConnectService :: new ( opt_udp_stats_event_sender) ) ;
152
+
153
+ connect_service
154
+ . handle_connect ( sample_ipv6_remote_addr ( ) , sample_issue_time ( ) )
155
+ . await ;
121
156
}
122
157
}
123
158
}
0 commit comments