From f7dab3ca560f027f7370d5114f9e7adbf40c0974 Mon Sep 17 00:00:00 2001
From: GyDi <segydi@foxmail.com>
Date: Fri, 28 Oct 2022 01:02:47 +0800
Subject: [PATCH] fix: init config error

---
 src-tauri/src/core/mod.rs      | 24 +++++++++++-----------
 src-tauri/src/data/mod.rs      | 18 ++++++++---------
 src-tauri/src/main.rs          | 18 +++++++----------
 src-tauri/src/utils/init.rs    | 37 ++++++++++++++++++----------------
 src-tauri/src/utils/resolve.rs |  3 +--
 src-tauri/src/utils/server.rs  |  6 ++++--
 6 files changed, 53 insertions(+), 53 deletions(-)

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<Core> = 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<Mutex<Service>>,
@@ -40,8 +31,17 @@ pub struct Core {
 }
 
 impl Core {
-  pub fn global() -> Core {
-    CORE.clone()
+  pub fn global() -> &'static Core {
+    static CORE: OnceCell<Core> = 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<Data> = 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<Mutex<Clash>>,
@@ -26,7 +20,13 @@ pub struct Data {
 }
 
 impl Data {
-  pub fn global() -> Data {
-    DATA.clone()
+  pub fn global() -> &'static Data {
+    static DATA: OnceCell<Data> = 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<u16>) -> 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 {
-- 
GitLab