diff --git a/src/lib.rs b/src/lib.rs index d348ca7..d653631 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,8 +1,8 @@ -use tauri::Manager; -use tauri_plugin_shell::ShellExt; -use tauri_plugin_shell::process::{CommandEvent, CommandChild}; -use std::time::Duration; use std::sync::Mutex; +use std::time::Duration; +use tauri::Manager; +use tauri_plugin_shell::process::{CommandChild, CommandEvent}; +use tauri_plugin_shell::ShellExt; // 全局状态:存储 Nitro 进程句柄 struct NitroProcess(Mutex>); @@ -38,74 +38,74 @@ pub fn run() { .setup(|app| { // 使用 Tauri 的状态管理存储进程句柄 app.manage(NitroProcess(Mutex::new(None))); - + let app_handle = app.handle().clone(); - + // 异步启动 Nitro sidecar tauri::async_runtime::spawn(async move { // 查找可用端口 let port = find_available_port(3000).await; println!("使用端口: {}", port); - + // 启动 sidecar let sidecar = app_handle .shell() .sidecar("nitro-server") .expect("无法找到 nitro-server sidecar") .env("NITRO_PORT", port.to_string()); - + let (mut rx, child) = sidecar.spawn().expect("启动 sidecar 失败"); - + // 保存进程句柄到全局状态 if let Some(state) = app_handle.try_state::() { *state.0.lock().unwrap() = Some(child); } - + // 监听 stdout,等待服务器就绪信号 let start_time = std::time::Instant::now(); let timeout = Duration::from_secs(5); let mut server_ready = false; - + while let Some(event) = rx.recv().await { if let CommandEvent::Stdout(line) = event { let output = String::from_utf8_lossy(&line); println!("Nitro: {}", output); - + // 检测服务器启动成功的标志 if output.contains("Listening on:") || output.contains("localhost") { server_ready = true; println!("✓ Nitro 服务器启动成功!"); - + // 创建主窗口 let url = format!("http://localhost:{}", port); tauri::WebviewWindowBuilder::new( &app_handle, "main", - tauri::WebviewUrl::External(url.parse().unwrap()) + tauri::WebviewUrl::External(url.parse().unwrap()), ) .title("Nitro Application") .inner_size(1200.0, 800.0) .center() .build() .expect("创建窗口失败"); - + break; } } - + // 超时检查 if start_time.elapsed() > timeout { eprintln!("✗ 启动超时:Nitro 服务器未能在 5 秒内启动"); break; } } - + if !server_ready { eprintln!("✗ Nitro 服务器启动失败"); std::process::exit(1); } }); - + Ok(()) }) .invoke_handler(tauri::generate_handler![greet])