@@ -7,6 +7,7 @@ use binrw::BinRead;
77use tokio:: sync:: Mutex ;
88
99use crate :: server_address:: { RawServerAddress , ServerAddress } ;
10+ use crate :: tinyudp;
1011
1112/// Get server addresses from a single master server
1213///
@@ -15,28 +16,33 @@ use crate::server_address::{RawServerAddress, ServerAddress};
1516/// ```
1617/// use std::time::Duration;
1718///
18- /// let master = "master.quakeworld.nu:27000";
19- /// let timeout = Some(Duration::from_secs(2));
20- /// match masterstat::server_addresses(&master, timeout) {
21- /// Ok(addresses) => { println!("found {} server addresses", addresses.len()) },
22- /// Err(e) => { eprintln!("error: {}", e); }
19+ /// async fn test() {
20+ /// let master = "master.quakeworld.nu:27000";
21+ /// let timeout = Duration::from_secs(2);
22+ /// match masterstat::server_addresses(&master, timeout).await {
23+ /// Ok(result) => { println!("found {} server addresses", result.len()) },
24+ /// Err(e) => { eprintln!("error: {}", e); }
25+ /// }
2326/// }
2427/// ```
25- pub fn server_addresses (
28+ pub async fn server_addresses (
2629 master_address : & str ,
27- timeout : Option < Duration > ,
30+ timeout : Duration ,
2831) -> Result < Vec < ServerAddress > > {
29- const MESSAGE : [ u8 ; 3 ] = [ 99 , 10 , 0 ] ;
30- let options = tinyudp:: ReadOptions {
31- timeout,
32- buffer_size : 16 * 1024 , // 16 kb
33- } ;
34- let response = tinyudp:: send_and_read ( master_address, & MESSAGE , & options) ?;
35- let server_addresses = parse_servers_response ( & response) ?;
36- Ok ( sorted_and_unique ( & server_addresses) )
32+ const STATUS_MSG : [ u8 ; 3 ] = [ 99 , 10 , 0 ] ;
33+ let response = tinyudp:: send_and_receive (
34+ master_address,
35+ & STATUS_MSG ,
36+ tinyudp:: Options {
37+ timeout,
38+ buffer_size : 64 * 1024 , // 64 kb
39+ } ,
40+ )
41+ . await ?;
42+ parse_servers_response ( & response)
3743}
3844
39- /// Get server addresses from many master servers (async, in parallel )
45+ /// Get server addresses from many master servers (concurrently )
4046///
4147/// # Example
4248///
@@ -45,21 +51,22 @@ pub fn server_addresses(
4551///
4652/// async fn test() {
4753/// let masters = ["master.quakeworld.nu:27000", "master.quakeservers.net:27000"];
48- /// let timeout = Some(Duration::from_secs(2));
49- /// let server_addresses = masterstat::server_addresses_from_many(&masters, timeout).await;
54+ /// let timeout = Duration::from_secs(2);
55+ /// let result = masterstat::server_addresses_from_many(&masters, timeout).await;
56+ /// println!("found {} server addresses", result.len());
5057/// }
5158/// ```
5259pub async fn server_addresses_from_many (
5360 master_addresses : & [ impl AsRef < str > ] ,
54- timeout : Option < Duration > ,
61+ timeout : Duration ,
5562) -> Vec < ServerAddress > {
5663 let mut task_handles = vec ! [ ] ;
5764 let result_mux = Arc :: < Mutex < Vec < ServerAddress > > > :: default ( ) ;
5865
5966 for master_address in master_addresses. iter ( ) . map ( |a| a. as_ref ( ) . to_string ( ) ) {
6067 let result_mux = result_mux. clone ( ) ;
6168 let task = tokio:: spawn ( async move {
62- if let Ok ( servers) = server_addresses ( & master_address, timeout) {
69+ if let Ok ( servers) = server_addresses ( & master_address, timeout) . await {
6370 let mut result = result_mux. lock ( ) . await ;
6471 result. extend ( servers) ;
6572 }
@@ -99,12 +106,33 @@ fn sorted_and_unique(server_addresses: &[ServerAddress]) -> Vec<ServerAddress> {
99106
100107#[ cfg( test) ]
101108mod tests {
102- use pretty_assertions:: assert_eq;
103-
104109 use super :: * ;
110+ // use pretty_assertions::assert_eq;
111+
112+ #[ tokio:: test]
113+ async fn test_server_addresses ( ) -> Result < ( ) > {
114+ let master = "master.quakeservers.net:27000" ;
115+ let timeout = Duration :: from_secs ( 1 ) ;
116+ let result = server_addresses ( master, timeout) . await ?;
117+ assert ! ( !result. is_empty( ) ) ;
118+ Ok ( ( ) )
119+ }
105120
106- #[ test]
107- fn test_parse_servers_response ( ) -> Result < ( ) > {
121+ #[ tokio:: test]
122+ async fn test_server_addresses_from_many ( ) -> Result < ( ) > {
123+ let masters = [
124+ "master.quakeservers.net:27000" ,
125+ "master.quakeworld.nu:27000" ,
126+ "qwmaster.fodquake.net:27000" ,
127+ ] ;
128+ let timeout = Duration :: from_secs ( 1 ) ;
129+ let result = server_addresses_from_many ( & masters, timeout) . await ;
130+ assert ! ( result. len( ) > 500 ) ;
131+ Ok ( ( ) )
132+ }
133+
134+ #[ tokio:: test]
135+ async fn test_parse_servers_response ( ) -> Result < ( ) > {
108136 // invalid response header
109137 {
110138 let response = [ 0xff , 0xff ] ;
0 commit comments