From 0de1f9e0834f6ece6aa07d36700d8cce409d7f2e Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Fri, 26 Dec 2025 14:11:52 -0400 Subject: [PATCH] Adding paralel request --- src/api/client.rs | 1 + src/ui/app.rs | 42 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/api/client.rs b/src/api/client.rs index 69c26c3..acb68ae 100644 --- a/src/api/client.rs +++ b/src/api/client.rs @@ -6,6 +6,7 @@ use crate::{ data::{self, heartbeat::HeartbeatResponse, status_page::model::StatusPageResponse}, }; +#[derive(Debug, Clone)] pub struct UptimeKumaClient { client: Client, } diff --git a/src/ui/app.rs b/src/ui/app.rs index 6ae882a..45bc2b1 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -1,11 +1,13 @@ use crate::api::{UptimeKumaClient, UptimeKumaEndpoints}; use crate::core; +use crate::data::{heartbeat::HeartbeatResponse, status_page::model::StatusPageResponse}; use crate::i18n::{t, t_with_args}; use crate::ui::components::render_footer; use crate::ui::{ components::{render_header, render_monitor_list}, dashboard::model::DashboardViewState, }; +use anyhow::Result; use crossterm::{ event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEventKind}, execute, @@ -20,14 +22,21 @@ use ratatui::{ widgets::{Block, Borders, Padding, Paragraph}, }; -use std::collections::HashMap; use std::{ io, + thread, + sync::mpsc, + collections::HashMap, time::{Duration, Instant}, }; const INITIAL_INTERVAL: u32 = 300; +enum FetchResult { + Heartbeat(Result), + StatusPage(Result), +} + pub struct App { state: DashboardViewState, terminal: Terminal>, @@ -201,8 +210,35 @@ impl App { } fn fetch_and_update_data(&mut self) -> anyhow::Result<()> { - let heartbeat_data = self.client.fetch_heartbeat(&self.endpoints)?; - let status_page_data = self.client.fetch_status_page(&self.endpoints)?; + let (tx, rx) = mpsc::channel(); + + let heartbeat_client = self.client.clone(); + let heartbeat_endpoints = self.endpoints.clone(); + let tx_clone = tx.clone(); + thread::spawn(move || { + let result = heartbeat_client.fetch_heartbeat(&heartbeat_endpoints); + tx.send(FetchResult::Heartbeat(result)).unwrap(); + }); + + let status_page_client = self.client.clone(); + let status_page_endpoints = self.endpoints.clone(); + + thread::spawn(move || { + let result = status_page_client.fetch_status_page(&status_page_endpoints); + tx_clone.send(FetchResult::StatusPage(result)).unwrap(); + }); + + let mut heartbeat_result = None; + let mut status_page_result = None; + + for _ in 0..2 { + match rx.recv()? { + FetchResult::Heartbeat(result) => heartbeat_result = Some(result?), + FetchResult::StatusPage(result) => status_page_result = Some(result?), + } + } + let heartbeat_data = heartbeat_result.unwrap(); + let status_page_data = status_page_result.unwrap(); let unified_data = core::unify_data(&status_page_data, &heartbeat_data); self.state = DashboardViewState::from_unified_data(unified_data); Ok(())