Migrate updater LAN and devkit features from old repo

This commit is contained in:
lenn
2026-04-27 16:37:40 +08:00
parent b33c952eb6
commit 26533f6916
29 changed files with 5207 additions and 55 deletions

View File

@@ -1,27 +1,147 @@
mod commands;
pub mod serial_core;
mod lan_game;
pub mod log;
pub mod serial_core;
#[cfg(feature = "devkit")]
pub mod devkit;
use commands::serial::SerialConnectionState;
#[cfg(feature = "devkit")]
use tauri::Manager;
#[cfg(feature = "devkit")]
fn start_server_exe(exe_path: &std::path::Path) {
let mut command = std::process::Command::new(exe_path);
command.arg("--port").arg("50051");
#[cfg(target_os = "windows")]
{
use std::os::windows::process::CommandExt;
command.creation_flags(0x08000000);
}
match command.spawn() {
Ok(_) => ::log::info!("DevKit Python server started: {}", exe_path.display()),
Err(error) => ::log::warn!("Failed to start DevKit Python server: {error}"),
}
}
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
tauri::Builder::default()
let builder = tauri::Builder::default()
.plugin(tauri_plugin_process::init())
.manage(SerialConnectionState::default())
.plugin(tauri_plugin_opener::init())
.invoke_handler(tauri::generate_handler![
commands::file_explorer::file_explorer_list,
commands::serial::serial_enum,
commands::serial::serial_connect,
commands::serial::serial_disconnect,
commands::serial::serial_export_csv,
commands::serial::serial_has_record_data,
commands::serial::serial_export_csv_to_path,
commands::serial::serial_import_csv,
commands::serial::serial_import_csv_from_path,
commands::window::win_minimize,
commands::window::win_toggle_maximize,
commands::window::win_close
])
.plugin(tauri_plugin_opener::init());
#[cfg(not(any(target_os = "android", target_os = "ios")))]
let builder = builder.plugin(tauri_plugin_updater::Builder::new().build());
#[cfg(any(target_os = "android", target_os = "ios"))]
let builder = builder;
#[cfg(feature = "devkit")]
let builder = {
let devkit_state = devkit::DevKitState::default();
let devkit_state_clone = devkit_state.clone();
builder.manage(devkit_state).setup(move |app| {
tauri::async_runtime::spawn(async {
if let Err(error) = lan_game::serve().await {
::log::error!("LAN game server failed: {error:?}");
}
});
let resource_dir = app
.path()
.resource_dir()
.unwrap_or_else(|_| std::path::PathBuf::from("./resources"));
tauri::async_runtime::spawn(async move {
#[cfg(target_os = "windows")]
let exe_name = "je-skin-devkit-server.exe";
#[cfg(not(target_os = "windows"))]
let exe_name = "je-skin-devkit-server";
let bundled_exe = resource_dir.join(exe_name);
let fallback_exe = std::env::current_exe()
.ok()
.and_then(|path| path.parent().map(|parent| parent.join(exe_name)));
let server_exe = if bundled_exe.exists() {
Some(bundled_exe)
} else {
fallback_exe.filter(|path| path.exists())
};
if let Some(exe_path) = server_exe {
start_server_exe(&exe_path);
tokio::time::sleep(std::time::Duration::from_millis(1200)).await;
} else {
::log::info!("DevKit Python server not found, skipping auto-start");
}
if let Err(error) = devkit_state_clone.start(50051).await {
::log::warn!("DevKit auto-start failed: {error}");
} else {
::log::info!("DevKit auto-started on 127.0.0.1:50051");
}
});
Ok(())
})
};
#[cfg(not(feature = "devkit"))]
let builder = builder.setup(|_app| {
tauri::async_runtime::spawn(async {
if let Err(error) = lan_game::serve().await {
::log::error!("LAN game server failed: {error:?}");
}
});
Ok(())
});
#[cfg(feature = "devkit")]
let builder = builder.invoke_handler(tauri::generate_handler![
commands::file_explorer::file_explorer_list,
commands::serial::serial_enum,
commands::serial::serial_connect,
commands::serial::serial_disconnect,
commands::serial::serial_export_csv,
commands::serial::serial_has_record_data,
commands::serial::serial_export_csv_to_path,
commands::serial::serial_import_csv,
commands::serial::serial_import_csv_from_path,
commands::window::win_minimize,
commands::window::win_toggle_maximize,
commands::window::win_close,
commands::devkit::devkit_status,
commands::devkit::devkit_start,
commands::devkit::devkit_stop,
commands::devkit::devkit_get_config,
commands::devkit::devkit_set_config,
commands::devkit::devkit_process_export
]);
#[cfg(not(feature = "devkit"))]
let builder = builder.invoke_handler(tauri::generate_handler![
commands::file_explorer::file_explorer_list,
commands::serial::serial_enum,
commands::serial::serial_connect,
commands::serial::serial_disconnect,
commands::serial::serial_export_csv,
commands::serial::serial_has_record_data,
commands::serial::serial_export_csv_to_path,
commands::serial::serial_import_csv,
commands::serial::serial_import_csv_from_path,
commands::window::win_minimize,
commands::window::win_toggle_maximize,
commands::window::win_close
]);
builder
.run(tauri::generate_context!())
.expect("error while running tauri application");
}