use log::error; use tauri::{Emitter, Manager, RunEvent, State}; use yaak_proxy_lib::ProxyCtx; use yaak_rpc::{RpcEventEmitter, RpcRouter}; use yaak_window::window::CreateWindowConfig; #[tauri::command] fn rpc( router: State<'_, RpcRouter>, ctx: State<'_, ProxyCtx>, cmd: String, payload: serde_json::Value, ) -> Result { router.dispatch(&cmd, payload, &ctx).map_err(|e| e.message) } pub fn run() { tauri::Builder::default() .plugin(tauri_plugin_os::init()) .setup(|app| { let data_dir = app.path().app_data_dir().expect("no app data dir"); std::fs::create_dir_all(&data_dir).expect("failed to create app data dir"); let (emitter, event_rx) = RpcEventEmitter::new(); app.manage(ProxyCtx::new(&data_dir.join("proxy.db"), emitter)); app.manage(yaak_proxy_lib::build_router()); // Drain RPC events and forward as Tauri events let app_handle = app.handle().clone(); std::thread::spawn(move || { for event in event_rx { if let Err(e) = app_handle.emit(event.event, event.payload) { error!("Failed to emit RPC event: {e}"); } } }); Ok(()) }) .invoke_handler(tauri::generate_handler![rpc]) .build(tauri::generate_context!()) .expect("error while building yaak proxy tauri application") .run(|app_handle, event| { if let RunEvent::Ready = event { let config = CreateWindowConfig { url: "/", label: "main", title: "Yaak Proxy", inner_size: Some((1000.0, 700.0)), visible: true, hide_titlebar: true, ..Default::default() }; if let Err(e) = yaak_window::window::create_window(app_handle, config) { error!("Failed to create proxy window: {e:?}"); } } }); }