mirror of
https://github.com/rustdesk/rustdesk-server.git
synced 2026-03-10 05:53:13 +08:00
UI
This commit is contained in:
9
ui/src/usecase/mod.rs
Normal file
9
ui/src/usecase/mod.rs
Normal file
@@ -0,0 +1,9 @@
|
||||
pub mod presenter;
|
||||
pub mod service;
|
||||
pub mod view;
|
||||
pub mod watcher;
|
||||
|
||||
pub use presenter::*;
|
||||
pub use service::*;
|
||||
pub use view::*;
|
||||
pub use watcher::*;
|
||||
59
ui/src/usecase/presenter.rs
Normal file
59
ui/src/usecase/presenter.rs
Normal file
@@ -0,0 +1,59 @@
|
||||
use std::time::{Duration, Instant};
|
||||
|
||||
use super::{service, DesktopServiceState, Event};
|
||||
use crate::BUFFER;
|
||||
use async_std::task::sleep;
|
||||
use crossbeam_channel::{Receiver, Sender};
|
||||
|
||||
pub async fn create(sender: Sender<Event>, receiver: Receiver<Event>) {
|
||||
let mut now = Instant::now();
|
||||
let buffer = BUFFER.get().unwrap().to_owned();
|
||||
let send = |event| sender.send(event).unwrap_or_default();
|
||||
if let Some(mut service) = service::create() {
|
||||
let mut service_state = DesktopServiceState::Unknown;
|
||||
let mut file = "hbbs.out".to_owned();
|
||||
send(Event::ViewRenderServiceState(service_state.to_owned()));
|
||||
loop {
|
||||
for _ in 1..buffer {
|
||||
match receiver.recv_timeout(Duration::from_nanos(1)) {
|
||||
Ok(event) => match event {
|
||||
Event::BroswerInit => {
|
||||
send(Event::BrowserUpdate(("file".to_owned(), file.to_owned())));
|
||||
}
|
||||
Event::BrowserAction(action) => match action.as_str() {
|
||||
"restart" => service.restart(),
|
||||
_ => (),
|
||||
},
|
||||
Event::FileChange(path) => {
|
||||
if path == file {
|
||||
send(Event::BrowserUpdate(("file".to_owned(), file.to_owned())));
|
||||
}
|
||||
}
|
||||
Event::ViewAction(action) => match action.as_str() {
|
||||
"start" => service.start(),
|
||||
"stop" => service.stop(),
|
||||
"restart" => service.restart(),
|
||||
"pause" => service.pause(),
|
||||
"exit" => send(Event::ViewRenderAppExit),
|
||||
_ => {
|
||||
file = action;
|
||||
send(Event::BrowserUpdate(("file".to_owned(), file.to_owned())));
|
||||
}
|
||||
},
|
||||
_ => (),
|
||||
},
|
||||
Err(_) => break,
|
||||
}
|
||||
}
|
||||
sleep(Duration::from_micros(999)).await;
|
||||
if now.elapsed().as_millis() > 999 {
|
||||
let state = service.check();
|
||||
if state != service_state {
|
||||
service_state = state.to_owned();
|
||||
send(Event::ViewRenderServiceState(state));
|
||||
}
|
||||
now = Instant::now();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
24
ui/src/usecase/service.rs
Normal file
24
ui/src/usecase/service.rs
Normal file
@@ -0,0 +1,24 @@
|
||||
use crate::adapter;
|
||||
|
||||
pub fn create() -> Option<Box<dyn IDesktopService + Send>> {
|
||||
if cfg!(target_os = "windows") {
|
||||
return Some(Box::new(adapter::WindowsDesktopService::new()));
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq)]
|
||||
pub enum DesktopServiceState {
|
||||
Paused,
|
||||
Started,
|
||||
Stopped,
|
||||
Unknown,
|
||||
}
|
||||
|
||||
pub trait IDesktopService {
|
||||
fn start(&mut self);
|
||||
fn stop(&mut self);
|
||||
fn restart(&mut self);
|
||||
fn pause(&mut self);
|
||||
fn check(&mut self) -> DesktopServiceState;
|
||||
}
|
||||
22
ui/src/usecase/view.rs
Normal file
22
ui/src/usecase/view.rs
Normal file
@@ -0,0 +1,22 @@
|
||||
use super::DesktopServiceState;
|
||||
use crate::adapter::desktop;
|
||||
use crossbeam_channel::{Receiver, Sender};
|
||||
|
||||
pub async fn create(sender: Sender<Event>, receiver: Receiver<Event>) {
|
||||
desktop::run(sender, receiver).await;
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq)]
|
||||
pub enum Event {
|
||||
BrowserAction(String),
|
||||
BroswerInit,
|
||||
BrowserUpdate((String, String)),
|
||||
BrowserRender(String),
|
||||
FileChange(String),
|
||||
ViewAction(String),
|
||||
ViewInit,
|
||||
ViewUpdate(String),
|
||||
ViewRender(String),
|
||||
ViewRenderAppExit,
|
||||
ViewRenderServiceState(DesktopServiceState),
|
||||
}
|
||||
46
ui/src/usecase/watcher.rs
Normal file
46
ui/src/usecase/watcher.rs
Normal file
@@ -0,0 +1,46 @@
|
||||
use std::{path::Path, time::Duration};
|
||||
|
||||
use super::Event;
|
||||
use crate::path;
|
||||
use async_std::task::{sleep, spawn_blocking};
|
||||
use crossbeam_channel::{bounded, Sender};
|
||||
use notify::{Config, RecommendedWatcher, RecursiveMode, Result, Watcher};
|
||||
|
||||
pub async fn create(sender: Sender<Event>) {
|
||||
loop {
|
||||
let watch_sender = sender.clone();
|
||||
match spawn_blocking(|| {
|
||||
watch(
|
||||
format!("{}/logs/", path().to_str().unwrap_or_default()),
|
||||
watch_sender,
|
||||
)
|
||||
})
|
||||
.await
|
||||
{
|
||||
Ok(_) => (),
|
||||
Err(e) => println!("error: {e}"),
|
||||
}
|
||||
sleep(Duration::from_secs(1)).await;
|
||||
}
|
||||
}
|
||||
|
||||
fn watch<P: AsRef<Path>>(path: P, sender: Sender<Event>) -> Result<()> {
|
||||
let (tx, rx) = bounded(10);
|
||||
let mut watcher = RecommendedWatcher::new(tx, Config::default())?;
|
||||
watcher.watch(path.as_ref(), RecursiveMode::Recursive)?;
|
||||
for res in rx {
|
||||
let event = res?;
|
||||
for p in event.paths {
|
||||
let path = p
|
||||
.file_name()
|
||||
.unwrap_or_default()
|
||||
.to_str()
|
||||
.unwrap_or_default()
|
||||
.to_owned();
|
||||
if path.len() > 0 {
|
||||
sender.send(Event::FileChange(path)).unwrap_or_default();
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
Reference in New Issue
Block a user