diff --git a/src-tauri/src/core/mod.rs b/src-tauri/src/core/mod.rs index 631070d..e0133b4 100644 --- a/src-tauri/src/core/mod.rs +++ b/src-tauri/src/core/mod.rs @@ -6,7 +6,7 @@ use crate::config::enhance_config; use crate::data::*; use crate::log_if_err; use anyhow::{bail, Result}; -use once_cell::sync::Lazy; +use once_cell::sync::OnceCell; use parking_lot::Mutex; use serde_yaml::{Mapping, Value}; use std::sync::Arc; @@ -20,15 +20,6 @@ pub mod tray; pub use self::service::*; -static CORE: Lazy = Lazy::new(|| Core { - service: Arc::new(Mutex::new(Service::new())), - sysopt: Arc::new(Mutex::new(Sysopt::new())), - timer: Arc::new(Mutex::new(Timer::new())), - hotkey: Arc::new(Mutex::new(Hotkey::new())), - runtime: Arc::new(Mutex::new(RuntimeResult::default())), - handle: Arc::new(Mutex::new(Handle::default())), -}); - #[derive(Clone)] pub struct Core { pub service: Arc>, @@ -40,8 +31,17 @@ pub struct Core { } impl Core { - pub fn global() -> Core { - CORE.clone() + pub fn global() -> &'static Core { + static CORE: OnceCell = OnceCell::new(); + + CORE.get_or_init(|| Core { + service: Arc::new(Mutex::new(Service::new())), + sysopt: Arc::new(Mutex::new(Sysopt::new())), + timer: Arc::new(Mutex::new(Timer::new())), + hotkey: Arc::new(Mutex::new(Hotkey::new())), + runtime: Arc::new(Mutex::new(RuntimeResult::default())), + handle: Arc::new(Mutex::new(Handle::default())), + }) } /// initialize the core state diff --git a/src-tauri/src/data/mod.rs b/src-tauri/src/data/mod.rs index b5f79cb..3ba6781 100644 --- a/src-tauri/src/data/mod.rs +++ b/src-tauri/src/data/mod.rs @@ -8,16 +8,10 @@ pub use self::prfitem::*; pub use self::profiles::*; pub use self::verge::*; -use once_cell::sync::Lazy; +use once_cell::sync::OnceCell; use parking_lot::Mutex; use std::sync::Arc; -static DATA: Lazy = Lazy::new(|| Data { - clash: Arc::new(Mutex::new(Clash::new())), - verge: Arc::new(Mutex::new(Verge::new())), - profiles: Arc::new(Mutex::new(Profiles::new())), -}); - #[derive(Debug, Clone)] pub struct Data { pub clash: Arc>, @@ -26,7 +20,13 @@ pub struct Data { } impl Data { - pub fn global() -> Data { - DATA.clone() + pub fn global() -> &'static Data { + static DATA: OnceCell = OnceCell::new(); + + DATA.get_or_init(|| Data { + clash: Arc::new(Mutex::new(Clash::new())), + verge: Arc::new(Mutex::new(Verge::new())), + profiles: Arc::new(Mutex::new(Profiles::new())), + }) } } diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 334fb9c..26cad7c 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -10,20 +10,14 @@ mod data; mod feat; mod utils; -use crate::{ - data::Verge, - utils::{resolve, server}, -}; +use crate::utils::{init, resolve, server}; use tauri::{api, Manager, SystemTray}; fn main() -> std::io::Result<()> { - { - let verge = Verge::new(); - - if server::check_singleton(verge.app_singleton_port).is_err() { - println!("app exists"); - return Ok(()); - } + // 单例检测 + if server::check_singleton().is_err() { + println!("app exists"); + return Ok(()); } #[cfg(target_os = "windows")] @@ -32,6 +26,8 @@ fn main() -> std::io::Result<()> { dirs::init_portable_flag(); } + crate::log_if_err!(init::init_config()); + #[allow(unused_mut)] let mut builder = tauri::Builder::default() .setup(|app| Ok(resolve::resolve_setup(app))) diff --git a/src-tauri/src/utils/init.rs b/src-tauri/src/utils/init.rs index 7c449ee..6752cac 100644 --- a/src-tauri/src/utils/init.rs +++ b/src-tauri/src/utils/init.rs @@ -8,11 +8,15 @@ use log4rs::config::{Appender, Config, Logger, Root}; use log4rs::encode::pattern::PatternEncoder; use std::fs; use std::io::Write; -use std::path::PathBuf; use tauri::PackageInfo; /// initialize this instance's log file -fn init_log(log_dir: &PathBuf) -> Result<()> { +fn init_log() -> Result<()> { + let log_dir = dirs::app_logs_dir(); + if !log_dir.exists() { + let _ = fs::create_dir_all(&log_dir); + } + let local_time = Local::now().format("%Y-%m-%d-%H%M%S").to_string(); let log_file = format!("{}.log", local_time); let log_file = log_dir.join(log_file); @@ -42,7 +46,19 @@ fn init_log(log_dir: &PathBuf) -> Result<()> { } /// Initialize all the files from resources -fn init_config(app_dir: &PathBuf) -> Result<()> { +pub fn init_config() -> Result<()> { + let _ = init_log(); + + let app_dir = dirs::app_home_dir(); + let profiles_dir = dirs::app_profiles_dir(); + + if !app_dir.exists() { + let _ = fs::create_dir_all(&app_dir); + } + if !profiles_dir.exists() { + let _ = fs::create_dir_all(&profiles_dir); + } + // target path let clash_path = app_dir.join("config.yaml"); let verge_path = app_dir.join("verge.yaml"); @@ -61,27 +77,14 @@ fn init_config(app_dir: &PathBuf) -> Result<()> { } /// initialize app -pub fn init_app(package_info: &PackageInfo) { +pub fn init_resources(package_info: &PackageInfo) { // create app dir let app_dir = dirs::app_home_dir(); - let log_dir = dirs::app_logs_dir(); - let profiles_dir = dirs::app_profiles_dir(); - let res_dir = dirs::app_resources_dir(package_info); if !app_dir.exists() { let _ = fs::create_dir_all(&app_dir); } - if !log_dir.exists() { - let _ = fs::create_dir_all(&log_dir); - } - if !profiles_dir.exists() { - let _ = fs::create_dir_all(&profiles_dir); - } - - crate::log_if_err!(init_log(&log_dir)); - - crate::log_if_err!(init_config(&app_dir)); // copy the resource file let mmdb_path = app_dir.join("Country.mmdb"); diff --git a/src-tauri/src/utils/resolve.rs b/src-tauri/src/utils/resolve.rs index 382567b..2665a37 100644 --- a/src-tauri/src/utils/resolve.rs +++ b/src-tauri/src/utils/resolve.rs @@ -3,8 +3,7 @@ use tauri::{App, AppHandle, Manager}; /// handle something when start app pub fn resolve_setup(app: &App) { - // init app config - init::init_app(app.package_info()); + init::init_resources(app.package_info()); let silent_start = { let global = Data::global(); diff --git a/src-tauri/src/utils/server.rs b/src-tauri/src/utils/server.rs index 4d72e4a..26caaf0 100644 --- a/src-tauri/src/utils/server.rs +++ b/src-tauri/src/utils/server.rs @@ -1,6 +1,7 @@ extern crate warp; use super::resolve; +use crate::data::Verge; use port_scanner::local_port_available; use tauri::AppHandle; use warp::Filter; @@ -11,8 +12,9 @@ const SERVER_PORT: u16 = 33331; const SERVER_PORT: u16 = 11233; /// check whether there is already exists -pub fn check_singleton(port: Option) -> Result<(), ()> { - let port = port.unwrap_or(SERVER_PORT); +pub fn check_singleton() -> Result<(), ()> { + let verge = Verge::new(); + let port = verge.app_singleton_port.unwrap_or(SERVER_PORT); if !local_port_available(port) { tauri::async_runtime::block_on(async {