@@ -26,8 +26,12 @@ pub async fn start(state: ServerState) {
2626 let client = client. clone ( ) ;
2727 let state = state. clone ( ) ;
2828 tokio:: spawn ( async move {
29- let result =
30- update_instance_latency ( state. clone ( ) , instance. clone ( ) , & client) . await ;
29+ let result = update_instance_latency ( & instance, & client) . await ;
30+ if let Ok ( elapsed) = result {
31+ update_instance_state ( state. clone ( ) , & instance, elapsed) . await ;
32+ } else {
33+ update_instance_state ( state. clone ( ) , & instance, -1 ) . await ;
34+ }
3135 if let Err ( e) = result {
3236 pingfall ( state. clone ( ) , instance. clone ( ) , e) . await ;
3337 }
@@ -49,7 +53,7 @@ pub enum LatencyError {
4953}
5054
5155pub async fn update_instance_latency (
52- state : ServerState , instance : InstanceData , client : & reqwest:: Client ,
56+ instance : & InstanceData , client : & reqwest:: Client ,
5357) -> Result < i32 , LatencyError > {
5458 let req = client
5559 . request ( Method :: OPTIONS , instance. remote . replace ( "ws" , "http" ) )
@@ -68,13 +72,18 @@ pub async fn update_instance_latency(
6872 return Err ( LatencyError :: NonSuccessStatus ( resp. status ( ) . as_u16 ( ) ) ) ;
6973 } ;
7074
75+ Ok ( elapsed)
76+ }
77+
78+ pub async fn update_instance_state ( state : ServerState , instance : & InstanceData , elapsed : i32 ) {
7179 for proxy_instance in state. instances . write ( ) . await . iter_mut ( ) {
7280 if instance. remote != proxy_instance. remote {
7381 continue ;
7482 }
7583
7684 proxy_instance. latency = elapsed;
7785 let window = state. ui . clone ( ) ;
86+ let instance = instance. clone ( ) ;
7887
7988 let _ = slint:: invoke_from_event_loop ( move || {
8089 let window = window. upgrade ( ) . unwrap ( ) ;
@@ -104,21 +113,23 @@ pub async fn update_instance_latency(
104113
105114 break ;
106115 }
107-
108- Ok ( elapsed)
109116}
110117
111118async fn pingfall ( state : ServerState , instance : InstanceData , err : LatencyError ) {
119+ warn ! (
120+ "Pingfall triggered for instance {} due to error: {err:?}" ,
121+ instance. local
122+ ) ;
112123 let scopes = state. scopes . read ( ) . await ;
113124
114125 let scope = scopes
115126 . iter ( )
116127 . find ( |scope| scope. host == instance. scope_host . as_str ( ) ) ;
117-
128+ debug ! ( "Pingfall settings: {:?}" , scope ) ;
118129 if let Some ( scope) = scope
119130 && scope. features . contains ( FeatureFlags :: PingFall )
120131 {
121- let settings = scope. settings . get ( & FeatureFlags :: PingFall ) ;
132+ let settings = scope. settings . get ( "pingfall" ) ;
122133 if let Some ( settings) = settings {
123134 let pingfall_settings: super :: model:: PingFallSettings =
124135 serde_json:: from_value ( settings. to_owned ( ) ) . unwrap_or_default ( ) ;
@@ -128,19 +139,11 @@ async fn pingfall(state: ServerState, instance: InstanceData, err: LatencyError)
128139 if pingfall_settings. fail_status . contains ( & code)
129140 || pingfall_settings. fail_status . is_empty ( )
130141 {
131- warn ! (
132- "PingFall triggered for instance {} due to status code {}" ,
133- instance. local, code
134- ) ;
135142 on_instance_del ( & state, & instance. local ) . await ;
136143 }
137144 }
138145 LatencyError :: Rewqest ( _) => {
139146 if pingfall_settings. drop_unknown {
140- warn ! (
141- "PingFall triggered for instance {} due to request error" ,
142- instance. local
143- ) ;
144147 on_instance_del ( & state, & instance. local ) . await ;
145148 }
146149 }
0 commit comments