支持无GUI的Server运行模式

This commit is contained in:
xintaofei
2026-03-29 18:36:30 +08:00
parent 7b73d7e1c2
commit 080a16f26c
49 changed files with 2169 additions and 1047 deletions

View File

@@ -1,3 +1,5 @@
use std::sync::Arc;
use serde::Serialize;
use tokio::sync::broadcast;
@@ -34,15 +36,33 @@ impl WebEventBroadcaster {
}
}
/// Unified event emission: sends to both Tauri webview and Web clients.
/// Abstraction over event emission targets.
/// In Tauri mode, events go to both webview and WebSocket clients.
/// In standalone server mode, events only go to WebSocket clients.
#[derive(Clone)]
pub enum EventEmitter {
#[cfg(feature = "tauri-runtime")]
Tauri(tauri::AppHandle),
WebOnly(Arc<WebEventBroadcaster>),
}
/// Unified event emission: sends to both Tauri webview and Web clients (if applicable).
pub fn emit_event(
app: &tauri::AppHandle,
emitter: &EventEmitter,
event: &str,
payload: impl Serialize + Clone,
) {
use tauri::{Emitter, Manager};
let _ = app.emit(event, payload.clone());
if let Some(web) = app.try_state::<WebEventBroadcaster>() {
web.send(event, &payload);
match emitter {
#[cfg(feature = "tauri-runtime")]
EventEmitter::Tauri(app) => {
use tauri::{Emitter, Manager};
let _ = app.emit(event, payload.clone());
if let Some(web) = app.try_state::<Arc<WebEventBroadcaster>>() {
web.send(event, &payload);
}
}
EventEmitter::WebOnly(broadcaster) => {
broadcaster.send(event, &payload);
}
}
}