@@ -1782,41 +1782,13 @@ impl LoginConfigHandler {
17821782 shared_password : Option < String > ,
17831783 conn_token : Option < String > ,
17841784 ) {
1785- let mut id = id;
1786- if id. contains ( "@" ) {
1787- let mut v = id. split ( "@" ) ;
1788- let raw_id: & str = v. next ( ) . unwrap_or_default ( ) ;
1789- let mut server_key = v. next ( ) . unwrap_or_default ( ) . split ( '?' ) ;
1790- let server = server_key. next ( ) . unwrap_or_default ( ) ;
1791- let args = server_key. next ( ) . unwrap_or_default ( ) ;
1792- let key = if server == PUBLIC_SERVER {
1793- config:: RS_PUB_KEY . to_owned ( )
1794- } else {
1795- let mut args_map: HashMap < String , & str > = HashMap :: new ( ) ;
1796- for arg in args. split ( '&' ) {
1797- if let Some ( kv) = arg. find ( '=' ) {
1798- let k = arg[ 0 ..kv] . to_lowercase ( ) ;
1799- let v = & arg[ kv + 1 ..] ;
1800- args_map. insert ( k, v) ;
1801- }
1802- }
1803- let key = args_map. remove ( "key" ) . unwrap_or_default ( ) ;
1804- key. to_owned ( )
1805- } ;
1806-
1807- // here we can check <id>/r@server
1808- let real_id = crate :: ui_interface:: handle_relay_id ( raw_id) . to_string ( ) ;
1809- if real_id != raw_id {
1810- force_relay = true ;
1811- }
1812- self . other_server = Some ( ( real_id. clone ( ) , server. to_owned ( ) , key) ) ;
1813- id = format ! ( "{real_id}@{server}" ) ;
1814- } else {
1815- let real_id = crate :: ui_interface:: handle_relay_id ( & id) ;
1816- if real_id != id {
1817- force_relay = true ;
1818- id = real_id. to_owned ( ) ;
1819- }
1785+ let format_id = format_id ( id. as_str ( ) ) ;
1786+ let id = format_id. id ;
1787+ if format_id. force_relay {
1788+ force_relay = true ;
1789+ } ;
1790+ if format_id. server . is_some ( ) {
1791+ self . other_server = format_id. server ;
18201792 }
18211793
18221794 self . id = id;
@@ -1976,24 +1948,13 @@ impl LoginConfigHandler {
19761948 ///
19771949 /// # Arguments
19781950 ///
1979- /// * `value` - The scroll style to be saved.
1951+ /// * `value` - The view style to be saved.
19801952 pub fn save_scroll_style ( & mut self , value : String ) {
19811953 let mut config = self . load_config ( ) ;
19821954 config. scroll_style = value;
19831955 self . save_config ( config) ;
19841956 }
19851957
1986- /// Save edge scroll edge thickness to the current config.
1987- ///
1988- /// # Arguments
1989- ///
1990- /// * `value` - The edge thickness to be saved.
1991- pub fn save_edge_scroll_edge_thickness ( & mut self , value : i32 ) {
1992- let mut config = self . load_config ( ) ;
1993- config. edge_scroll_edge_thickness = value;
1994- self . save_config ( config) ;
1995- }
1996-
19971958 /// Set a ui config of flutter for handler's [`PeerConfig`].
19981959 ///
19991960 /// # Arguments
@@ -3924,14 +3885,65 @@ async fn hc_connection_(
39243885 Ok ( ( ) )
39253886}
39263887
3888+ #[ derive( Debug , Clone ) ]
3889+ pub struct FormatId {
3890+ pub id : String ,
3891+ pub server : Option < ( String , String , String ) > ,
3892+ pub force_relay : bool ,
3893+ }
3894+
3895+ fn format_id ( id : & str ) -> FormatId {
3896+ if id. contains ( "@" ) {
3897+ let mut force_relay = false ;
3898+ let mut v = id. split ( "@" ) ;
3899+ let raw_id: & str = v. next ( ) . unwrap_or_default ( ) ;
3900+ let mut server_key = v. next ( ) . unwrap_or_default ( ) . split ( '?' ) ;
3901+ let server = server_key. next ( ) . unwrap_or_default ( ) ;
3902+ let args = server_key. next ( ) . unwrap_or_default ( ) ;
3903+ let key = if server == PUBLIC_SERVER {
3904+ config:: RS_PUB_KEY . to_owned ( )
3905+ } else {
3906+ let mut args_map: HashMap < String , & str > = HashMap :: new ( ) ;
3907+ for arg in args. split ( '&' ) {
3908+ if let Some ( kv) = arg. find ( '=' ) {
3909+ let k = arg[ 0 ..kv] . to_lowercase ( ) ;
3910+ let v = & arg[ kv + 1 ..] ;
3911+ args_map. insert ( k, v) ;
3912+ }
3913+ }
3914+ let key = args_map. remove ( "key" ) . unwrap_or_default ( ) ;
3915+ key. to_owned ( )
3916+ } ;
3917+
3918+ // here we can check <id>/r@server
3919+ let real_id = crate :: ui_interface:: handle_relay_id ( raw_id) . to_string ( ) ;
3920+ if real_id != raw_id {
3921+ force_relay = true ;
3922+ }
3923+ FormatId {
3924+ id : format ! ( "{real_id}@{server}" ) ,
3925+ server : Some ( ( real_id. to_string ( ) , server. to_string ( ) , key. to_string ( ) ) ) ,
3926+ force_relay,
3927+ }
3928+ } else {
3929+ let real_id = crate :: ui_interface:: handle_relay_id ( & id) ;
3930+ FormatId {
3931+ id : real_id. to_string ( ) ,
3932+ server : None ,
3933+ force_relay : real_id != id,
3934+ }
3935+ }
3936+ }
39273937pub mod peer_online {
3938+ use std:: collections:: HashMap ;
3939+
39283940 use hbb_common:: {
39293941 anyhow:: bail,
39303942 config:: { Config , CONNECT_TIMEOUT , READ_TIMEOUT } ,
39313943 log,
39323944 rendezvous_proto:: * ,
39333945 sleep,
3934- socket_client:: connect_tcp,
3946+ socket_client:: { check_port , connect_tcp} ,
39353947 ResultType , Stream ,
39363948 } ;
39373949
@@ -3944,35 +3956,93 @@ pub mod peer_online {
39443956 f ( onlines, offlines)
39453957 } else {
39463958 let query_timeout = std:: time:: Duration :: from_millis ( 3_000 ) ;
3947- match query_online_states_ ( & ids, query_timeout) . await {
3948- Ok ( ( onlines, offlines) ) => {
3949- f ( onlines, offlines) ;
3950- }
3951- Err ( e) => {
3952- log:: debug!( "query onlines, {}" , & e) ;
3959+ let ( rendezvous_server, _servers, _contained) =
3960+ crate :: get_rendezvous_server ( READ_TIMEOUT ) . await ;
3961+
3962+ let group = ids
3963+ . iter ( )
3964+ . map ( |id| ( id, super :: format_id ( id) ) )
3965+ . map ( |( raw_id, format) | {
3966+ if let Some ( ( pure_id, server, _key) ) = format. server {
3967+ ( raw_id, pure_id, server)
3968+ } else {
3969+ ( raw_id, format. id , rendezvous_server. clone ( ) )
3970+ }
3971+ } )
3972+ . map ( |( raw_id, id, server) | {
3973+ if server == crate :: client:: PUBLIC_SERVER {
3974+ (
3975+ raw_id,
3976+ id,
3977+ hbb_common:: config:: RENDEZVOUS_SERVERS [ 0 ] . to_string ( ) ,
3978+ )
3979+ } else {
3980+ (
3981+ raw_id,
3982+ id,
3983+ check_port ( server, hbb_common:: config:: RENDEZVOUS_PORT ) ,
3984+ )
3985+ }
3986+ } )
3987+ . fold ( HashMap :: new ( ) , |mut map, ( raw_id, id, server) | {
3988+ map. entry ( server)
3989+ . or_insert ( HashMap :: new ( ) )
3990+ . insert ( id, raw_id) ;
3991+ map
3992+ } ) ;
3993+
3994+ let query_group = group. iter ( ) . map ( |( server, map) | {
3995+ let ids: Vec < String > = map. keys ( ) . map ( |t| t. to_string ( ) ) . collect ( ) ;
3996+ ( map, query_online_states_ ( ids, query_timeout, server) )
3997+ } ) ;
3998+
3999+ let mut onlines = Vec :: new ( ) ;
4000+ let mut offlines = Vec :: new ( ) ;
4001+
4002+ for ( map, query) in query_group. into_iter ( ) {
4003+ match query. await {
4004+ Ok ( ( on, off) ) => {
4005+ for id in on. iter ( ) {
4006+ if let Some ( raw_id) = map. get ( id) {
4007+ onlines. push ( raw_id. to_string ( ) ) ;
4008+ }
4009+ }
4010+ for id in off. iter ( ) {
4011+ if let Some ( raw_id) = map. get ( id) {
4012+ offlines. push ( raw_id. to_string ( ) ) ;
4013+ }
4014+ }
4015+ }
4016+ Err ( e) => {
4017+ log:: debug!( "query onlines, {}" , & e) ;
4018+ }
39534019 }
39544020 }
4021+ f ( onlines, offlines) ;
39554022 }
39564023 }
39574024
3958- async fn create_online_stream ( ) -> ResultType < Stream > {
3959- let ( rendezvous_server, _servers, _contained) =
3960- crate :: get_rendezvous_server ( READ_TIMEOUT ) . await ;
3961- let tmp: Vec < & str > = rendezvous_server. split ( ":" ) . collect ( ) ;
3962- if tmp. len ( ) != 2 {
3963- bail ! ( "Invalid server address: {}" , rendezvous_server) ;
3964- }
3965- let port: u16 = tmp[ 1 ] . parse ( ) ?;
3966- if port == 0 {
3967- bail ! ( "Invalid server address: {}" , rendezvous_server) ;
4025+ async fn create_online_stream ( rendezvous_server : & str ) -> ResultType < Stream > {
4026+ let tmp = rendezvous_server. rfind ( ':' ) . map ( |pos| {
4027+ let url = & rendezvous_server[ ..pos] ;
4028+ let port: u16 = rendezvous_server[ pos + 1 ..] . parse ( ) . unwrap_or ( 0 ) ;
4029+ ( url, port)
4030+ } ) ;
4031+ match tmp {
4032+ Some ( ( url, port) ) if port > 0 => {
4033+ let online_server = format ! ( "{}:{}" , url, port - 1 ) ;
4034+ connect_tcp ( online_server, CONNECT_TIMEOUT ) . await
4035+ }
4036+ _ => {
4037+ bail ! ( "Invalid server address: {}" , rendezvous_server) ;
4038+ }
39684039 }
3969- let online_server = format ! ( "{}:{}" , tmp[ 0 ] , port - 1 ) ;
3970- connect_tcp ( online_server, CONNECT_TIMEOUT ) . await
39714040 }
39724041
39734042 async fn query_online_states_ (
3974- ids : & Vec < String > ,
4043+ ids : Vec < String > ,
39754044 timeout : std:: time:: Duration ,
4045+ rendezvous_server : & str ,
39764046 ) -> ResultType < ( Vec < String > , Vec < String > ) > {
39774047 let mut msg_out = RendezvousMessage :: new ( ) ;
39784048 msg_out. set_online_request ( OnlineRequest {
@@ -3981,7 +4051,7 @@ pub mod peer_online {
39814051 ..Default :: default ( )
39824052 } ) ;
39834053
3984- let mut socket = match create_online_stream ( ) . await {
4054+ let mut socket = match create_online_stream ( rendezvous_server ) . await {
39854055 Ok ( s) => s,
39864056 Err ( e) => {
39874057 log:: debug!( "Failed to create peers online stream, {e}" ) ;
0 commit comments