Files
yaoayanui/src-tauri/src/lib.rs
949036910@qq.com 30e019d345 11
2026-05-29 23:16:42 +08:00

207 lines
8.0 KiB
Rust

pub mod api_client;
pub mod api_crypto;
pub mod app_config;
pub mod audio_db;
pub mod audio_store;
pub mod avatar_db;
pub mod avatar_store;
pub mod material_db;
pub mod material_store;
pub mod asr_db;
pub mod asr_store;
pub mod video_db;
pub mod video_store;
pub mod local_config;
pub mod asr;
pub mod auth_session;
pub mod chat;
pub mod commands;
pub mod cover_python;
pub mod device_serial;
pub mod ffmpeg;
pub mod http;
pub mod js_runtime;
pub mod nodejs;
pub mod agent_id;
pub mod oem_context;
pub mod oem_id;
pub mod oss;
pub mod publish_db;
pub mod publish_store;
use tauri::{Manager, WebviewUrl, WebviewWindowBuilder};
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
let _ = env_logger::try_init();
tauri::Builder::default()
.manage(auth_session::AuthSession::default())
.manage(app_config::AppConfig::new())
.manage(avatar_store::AvatarStore::new())
.manage(material_store::MaterialStore::new())
.manage(asr_store::AsrStore::new())
.manage(audio_store::AudioStore::new())
.manage(video_store::VideoStore::new())
.manage(publish_store::PublishStore::new())
.manage(commands::nodejs::NodeTaskRegistry::default())
.setup(|app| {
let handle = app.handle().clone();
let heartbeat_handle = handle.clone();
let oem_id = oem_id::load_oem_id(&handle);
let agent_id = agent_id::load_agent_id(&handle);
let install_ctx = oem_context::OemContext { oem_id, agent_id };
oem_context::init(install_ctx.clone());
app.manage(install_ctx);
tauri::async_runtime::block_on(async move {
let app_config = handle.state::<app_config::AppConfig>();
let avatar_store = handle.state::<avatar_store::AvatarStore>();
let material_store = handle.state::<material_store::MaterialStore>();
let asr_store = handle.state::<asr_store::AsrStore>();
let audio_store = handle.state::<audio_store::AudioStore>();
let video_store = handle.state::<video_store::VideoStore>();
let publish_store = handle.state::<publish_store::PublishStore>();
let dir = handle
.path()
.app_data_dir()
.map_err(|e| format!("无法获取应用数据目录: {e}"))?;
let db_path = dir.join("local_config.db");
app_config.init_local_store(db_path).await?;
avatar_store.init(dir.join("avatars.db")).await?;
material_store.init(dir.join("video_materials.db")).await?;
asr_store.init(dir.join("asr_history.db")).await?;
audio_store.init(dir.join("generated_audios.db")).await?;
video_store.init(dir.join("generated_videos.db")).await?;
publish_store.init(dir.join("publish_accounts.db")).await?;
Ok::<(), String>(())
})
.map_err(|e| -> Box<dyn std::error::Error> { e.into() })?;
api_client::spawn_heartbeat_loop(heartbeat_handle);
let url = if cfg!(debug_assertions) {
WebviewUrl::External(
"http://localhost:1420/"
.parse()
.unwrap()
)
} else {
WebviewUrl::External(
"http://81.71.163.140/images/newyaoyan/index.html"
.parse()
.unwrap()
)
};
WebviewWindowBuilder::new(
app,
"main",
url,
)
.title("MyApp")
.build()?;
Ok(())
})
.plugin(tauri_plugin_single_instance::init(|app, _args, _cwd| {
if let Some(window) = app.get_webview_window("main") {
let _ = window.unminimize();
let _ = window.show();
let _ = window.set_focus();
}
}))
.plugin(tauri_plugin_opener::init())
.plugin(tauri_plugin_dialog::init())
.invoke_handler(tauri::generate_handler![
commands::api::api_request,
commands::software_info::get_software_info,
commands::auth::sync_auth_session,
commands::app_config::get_app_config,
commands::app_config::get_app_config_last_message,
commands::app_config::get_server_app_config,
commands::app_config::get_app_config_detail,
commands::app_config::list_local_app_config,
commands::app_config::set_local_app_config,
commands::app_config::delete_local_app_config,
commands::quickjs::run_quickjs_script,
commands::quickjs::run_quickjs_script_source,
commands::quickjs::list_quickjs_scripts,
commands::nodejs::run_nodejs_script,
commands::nodejs::run_nodejs_script_source,
commands::nodejs::list_nodejs_scripts,
commands::nodejs::stop_nodejs_script,
commands::fs_util::read_local_file_base64,
commands::fs_util::write_local_file_base64,
commands::fs_util::get_media_duration_seconds,
commands::fs_util::copy_local_file,
commands::fs_util::write_local_text_file,
commands::fs_util::temp_voice_reference_path,
commands::fs_util::import_voice_clone_reference,
commands::fs_util::reveal_local_file_in_folder,
commands::avatar::list_avatars,
commands::avatar::insert_avatar,
commands::avatar::update_avatar_name,
commands::avatar::delete_avatar,
commands::avatar::avatar_name_exists,
commands::avatar::import_avatar_video,
commands::material::list_materials,
commands::material::update_material_name,
commands::material::delete_material,
commands::material::import_material_files,
commands::audio::update_generated_audio_name,
commands::sound_asr::list_asr_history,
commands::sound_asr::delete_asr_history,
commands::sound_asr::update_asr_history_name,
commands::sound_asr::transcribe_media_file,
commands::audio::list_generated_audios,
commands::audio::insert_generated_audio,
commands::audio::delete_generated_audio,
commands::video::list_generated_videos,
commands::video::insert_generated_video,
commands::video::import_generated_video,
commands::video::delete_generated_video,
commands::publish::publish_list_accounts,
commands::publish::publish_login,
commands::publish::publish_check_login,
commands::publish::publish_execute,
commands::publish::publish_delete_account,
])
.build(tauri::generate_context!())
.expect("error while building tauri application")
.run(|app_handle, event| {
if let tauri::RunEvent::Ready = event {
if let Some(window) = app_handle.get_webview_window("main") {
let _ = window.maximize();
}
}
});
}
#[cfg(test)]
mod acl_url_tests {
use std::str::FromStr;
use tauri::utils::acl::RemoteUrlPattern;
#[test]
fn production_origin_matches_remote_patterns() {
let url: url::Url = "http://81.71.163.140/images/newyaoyan/index.html"
.parse()
.expect("valid url");
for pattern in [
"http://81.71.163.140/*",
"http://81.71.163.140:8001/*",
"http://81.71.163.140/images/newyaoyan/*",
"http://81.71.163.140/images/newyaoyan/index.html",
] {
let parsed = RemoteUrlPattern::from_str(pattern)
.unwrap_or_else(|e| panic!("failed to parse {pattern}: {e}"));
assert!(
parsed.test(&url),
"pattern {pattern} should match production origin"
);
}
}
}