@@ -43,26 +43,18 @@ async fn get_rpc_for_network(
43
43
network : & DriaNetwork ,
44
44
version : & SemanticVersion ,
45
45
) -> Result < Multiaddr > {
46
- #[ derive( serde:: Deserialize , Debug ) ]
47
- struct DriaNodesApiResponse {
48
- pub rpc : Multiaddr ,
49
- }
50
-
51
- // url to be used is determined by the network type
52
- let base_url = match network {
53
- DriaNetwork :: Mainnet => "https://dkn.dria.co/available-nodes" ,
54
- DriaNetwork :: Testnet => "https://dkn.dria.co/available-nodes" ,
55
- } ;
56
- let url = format ! ( "{}/{}" , base_url, version. as_major_minor( ) ) ;
57
-
58
- // make the request
59
- let response = reqwest:: get ( url) . await ?;
60
- let response_body = response
61
- . json :: < DriaNodesApiResponse > ( )
46
+ let response = reqwest:: get ( network. discovery_url ( version) ) . await ?;
47
+ let rpcs_and_peer_counts = response
48
+ . json :: < Vec < ( Multiaddr , usize ) > > ( )
62
49
. await
63
50
. wrap_err ( "could not parse API response" ) ?;
64
51
65
- Ok ( response_body. rpc )
52
+ // returns the RPC address with the least peer count (for load balancing)
53
+ rpcs_and_peer_counts
54
+ . into_iter ( )
55
+ . min_by_key ( |( _, peer_count) | * peer_count)
56
+ . ok_or_eyre ( "no RPCs were returned by discovery API" )
57
+ . map ( |( addr, _) | addr)
66
58
}
67
59
68
60
#[ cfg( test) ]
@@ -77,4 +69,16 @@ mod tests {
77
69
. await ;
78
70
assert ! ( node. is_ok( ) ) ;
79
71
}
72
+
73
+ #[ test]
74
+ fn test_deserialize ( ) {
75
+ let input = r#"[
76
+ ["/ip4/12.34.56.78/tcp/4001/p2p/16Uiu2HAmG7qrpSh8kenjuYqyrwxgEVdzqRV4wM1hHAZRq4j25VBC", 1],
77
+ ["/ip4/78.56.34.12/tcp/4001/p2p/16Uiu2HAmG7qrpSh8kenjuYqyrwxgEVdzqRV4wM1hHAZRq4j25VBC", 4]
78
+ ]"# ;
79
+ let result: Vec < ( Multiaddr , usize ) > = serde_json:: from_str ( input) . unwrap ( ) ;
80
+ assert_eq ! ( result. len( ) , 2 ) ;
81
+ assert_eq ! ( result[ 0 ] . 1 , 1 ) ;
82
+ assert_eq ! ( result[ 1 ] . 1 , 4 ) ;
83
+ }
80
84
}
0 commit comments