feat: always control server status

This commit is contained in:
Ahmet Kaan GÜMÜŞ 2024-03-11 03:34:52 +03:00
parent 2755034013
commit adbbd52b3e
2 changed files with 74 additions and 26 deletions

View file

@ -6,6 +6,7 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
async-std = "1.12.0"
dioxus = { version = "0.5.0-alpha.0", features = ["web"] } dioxus = { version = "0.5.0-alpha.0", features = ["web"] }
log = "0.4.21" log = "0.4.21"
reqwest = { version = "0.11.24", features = ["json"] } reqwest = { version = "0.11.24", features = ["json"] }

View file

@ -1,7 +1,15 @@
use std::time::Duration;
use async_std::task;
use dioxus::prelude::*; use dioxus::prelude::*;
use serde::Deserialize; use serde::Deserialize;
const SERVER_ADDRESS: &str = "https://localhost:2323"; const SERVER_ADDRESS: &str = "https://localhost:2323";
static SERVER_STATUS:GlobalSignal<ServerStatus> = Signal::global(move || ServerStatus {status:"Alive".to_string(),});
static SERVER_STATUS_WATCHDOG:GlobalSignal<bool> = Signal::global(move || false);
static SERVER_STATUS_LOOSING:GlobalSignal<bool> = Signal::global(move || false);
static SERVER_STATUS_IS_DEAD:GlobalSignal<bool> = Signal::global(move || false);
#[derive(Debug, Clone, PartialEq, Deserialize)] #[derive(Debug, Clone, PartialEq, Deserialize)]
struct ServerStatus{ struct ServerStatus{
status: String, status: String,
@ -17,8 +25,26 @@ fn main() {
launch(app); launch(app);
} }
async fn server_status_check() ->Result<ServerStatus, reqwest::Error> { async fn server_status_check() ->ServerStatus {
Ok(reqwest::get(SERVER_ADDRESS).await.unwrap().json::<ServerStatus>().await.unwrap()) match reqwest::get(SERVER_ADDRESS).await {
Ok(response) => {
*SERVER_STATUS_WATCHDOG.write() = false;
match response.json::<ServerStatus>().await {
Ok(server_status) => {
*SERVER_STATUS_LOOSING.write() = false;
server_status
}
Err(err_val) => {
*SERVER_STATUS_LOOSING.write() = true;
ServerStatus{status:err_val.to_string(),}
}
}
}
Err(err_val) => {
*SERVER_STATUS_LOOSING.write() = true;
ServerStatus{status:err_val.to_string(),}
}
}
} }
async fn coin_status_check() -> Result<CoinStatus, reqwest::Error> { async fn coin_status_check() -> Result<CoinStatus, reqwest::Error> {
Ok(reqwest::get(format!("{}{}", SERVER_ADDRESS, "/coin")).await.unwrap().json::<CoinStatus>().await.unwrap()) Ok(reqwest::get(format!("{}{}", SERVER_ADDRESS, "/coin")).await.unwrap().json::<CoinStatus>().await.unwrap())
@ -46,34 +72,57 @@ fn page_base() ->Element {
} }
} }
} }
fn server_status_renderer() -> Element { fn server_status_renderer() -> Element {
let server_status = use_resource(move || server_status_check()); let server_check_time = 1_u64;
match &*server_status.value().read() { let _server_status_task:Coroutine<()> = use_coroutine(|_| async move {
Some(Ok(server_status)) => { loop {
rsx! { task::sleep(Duration::from_secs(server_check_time)).await;
h5 { *SERVER_STATUS_WATCHDOG.write() = true;
ShowServerStatus { server_status: server_status.clone() } *SERVER_STATUS.write() = server_status_check().await;
/*match server_status_check().await {
Ok(status) => {
server_status_watchdog.set(false);
server_status.set(status);
}
Err(err_val) => {
server_status.set(ServerStatus {status:err_val.to_string(),});
}
}*/
};
});
let _server_status_watchdog_timer:Coroutine<()> = use_coroutine(|_| async move {
let mut is_loosing_counter = 0_i8;
loop {
task::sleep(Duration::from_secs(2*server_check_time+1)).await;
if !SERVER_STATUS_WATCHDOG() {
*SERVER_STATUS_LOOSING.write() = false;
}
if SERVER_STATUS_WATCHDOG() {
for _i in 0..5 {
task::sleep(Duration::from_secs(1)).await;
if SERVER_STATUS_WATCHDOG() {
is_loosing_counter += 1;
} }
} }
} }
Some(Err(err_val)) => { if is_loosing_counter > 4 {
*SERVER_STATUS_LOOSING.write() = true;
}
is_loosing_counter = 0;
}
});
rsx! { rsx! {
h5 { if SERVER_STATUS_LOOSING() && SERVER_STATUS_WATCHDOG() {
"Server Status: " {*SERVER_STATUS_IS_DEAD.write() = true}
{ err_val.to_string() } ShowServerStatus {server_status:ServerStatus{status:"Dead".to_string(),}}
} }
} else {
} ShowServerStatus {server_status:SERVER_STATUS()}
None => {
rsx! {
h5 {
"Server Status: Dead"
}
}
} }
} }
} }
fn coin_status_renderer() -> Element { fn coin_status_renderer() -> Element {
let is_loading = use_signal(|| false); let is_loading = use_signal(|| false);
@ -89,15 +138,13 @@ fn coin_status_renderer() -> Element {
is_loading.set(false); is_loading.set(false);
coin_result.set(coin_status); coin_result.set(coin_status);
} }
Err(err_val) => { Err(_) => {
is_loading.set(false); is_loading.set(false);
log::info!("{}", err_val);
} }
} }
} }
}); });
}; };
log::info!("{}", is_loading);
rsx! { rsx! {
div { div {
button { button {