feat: compatible with macos(wip)
This commit is contained in:
parent
26ef4c9961
commit
2b84bbf3a8
@ -17,7 +17,7 @@ use tauri::{api::process::kill_children, AppHandle, State};
|
||||
#[tauri::command]
|
||||
pub fn restart_sidecar(app_handle: AppHandle, clash_info: State<'_, ClashInfoState>) {
|
||||
kill_children();
|
||||
let payload = run_clash_bin(&app_handle);
|
||||
let payload = run_clash_bin(&app_handle, |_| {});
|
||||
|
||||
if let Ok(mut arc) = clash_info.0.lock() {
|
||||
*arc = payload;
|
||||
|
@ -16,7 +16,7 @@ use tauri::{
|
||||
};
|
||||
|
||||
/// Run the clash bin
|
||||
pub fn run_clash_bin(app_handle: &AppHandle) -> ClashInfoPayload {
|
||||
pub fn run_clash_bin(app_handle: &AppHandle, cb: fn(info: ClashInfoPayload)) -> ClashInfoPayload {
|
||||
let app_dir = app_home_dir();
|
||||
let app_dir = app_dir.as_os_str().to_str().unwrap();
|
||||
|
||||
@ -38,12 +38,13 @@ pub fn run_clash_bin(app_handle: &AppHandle) -> ClashInfoPayload {
|
||||
Ok((mut rx, _)) => {
|
||||
log::info!("Successfully execute clash sidecar");
|
||||
payload.controller = Some(read_clash_controller());
|
||||
cb(payload.clone()); // callback when run sidecar successfully
|
||||
|
||||
tauri::async_runtime::spawn(async move {
|
||||
while let Some(event) = rx.recv().await {
|
||||
match event {
|
||||
CommandEvent::Stdout(line) => log::info!("{}", line),
|
||||
CommandEvent::Stderr(err) => log::error!("{}", err),
|
||||
CommandEvent::Stdout(line) => log::info!("[stdout]: {}", line),
|
||||
CommandEvent::Stderr(err) => log::error!("[stderr]: {}", err),
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
@ -86,9 +87,7 @@ pub async fn put_clash_profile(payload: &ClashInfoPayload) -> Result<(), String>
|
||||
{
|
||||
let file_name = match profile.file {
|
||||
Some(file_name) => file_name.clone(),
|
||||
None => {
|
||||
return Err(format!("profile item should have `file` field"));
|
||||
}
|
||||
None => return Err(format!("profile item should have `file` field")),
|
||||
};
|
||||
|
||||
let file_path = app_home_dir().join("profiles").join(file_name);
|
||||
|
@ -11,15 +11,14 @@ pub fn resolve_setup(app: &App) {
|
||||
init::init_app(app.package_info());
|
||||
|
||||
// run clash sidecar
|
||||
let info = clash::run_clash_bin(&app.handle());
|
||||
|
||||
let info = clash::run_clash_bin(&app.handle(), |info_| {
|
||||
// update the profile
|
||||
let info_ = info.clone();
|
||||
tauri::async_runtime::spawn(async move {
|
||||
if let Err(err) = clash::put_clash_profile(&info_).await {
|
||||
log::error!("failed to put config for `{}`", err);
|
||||
};
|
||||
});
|
||||
});
|
||||
|
||||
// resolve the verge config - enable system proxy
|
||||
let mut original: Option<sysopt::SysProxyConfig> = None;
|
||||
|
@ -1,6 +1,7 @@
|
||||
extern crate warp;
|
||||
|
||||
use port_scanner::local_port_available;
|
||||
use std::sync::{Arc, Mutex};
|
||||
use tauri::{AppHandle, Manager};
|
||||
use warp::Filter;
|
||||
|
||||
@ -22,15 +23,16 @@ pub fn check_singleton() -> Result<(), ()> {
|
||||
/// The embed server only be used to implement singleton process
|
||||
/// maybe it can be used as pac server later
|
||||
pub fn embed_server(app: &AppHandle) {
|
||||
let window = app.get_window("main").unwrap();
|
||||
let window = Arc::new(Mutex::new(app.get_window("main").unwrap()));
|
||||
|
||||
tauri::async_runtime::spawn(async move {
|
||||
let commands = warp::path!("commands" / "visible").map(move || {
|
||||
window.show().unwrap();
|
||||
window.set_focus().unwrap();
|
||||
let win = window.lock().unwrap();
|
||||
win.show().unwrap();
|
||||
win.set_focus().unwrap();
|
||||
return format!("ok");
|
||||
});
|
||||
|
||||
tauri::async_runtime::spawn(async move {
|
||||
warp::serve(commands)
|
||||
.bind(([127, 0, 0, 1], SERVER_PORT))
|
||||
.await;
|
||||
|
Loading…
Reference in New Issue
Block a user