Files
codeg/src-tauri/src/web/event_bridge.rs
2026-03-25 14:26:26 +08:00

53 lines
1.3 KiB
Rust

use serde::Serialize;
use tokio::sync::broadcast;
#[derive(Clone, Debug, Serialize)]
pub struct WebEvent {
pub channel: String,
pub payload: serde_json::Value,
}
pub struct WebEventBroadcaster {
sender: broadcast::Sender<WebEvent>,
}
impl WebEventBroadcaster {
pub fn new() -> Self {
let (sender, _) = broadcast::channel(4096);
Self { sender }
}
pub fn send(&self, channel: &str, payload: &impl Serialize) {
if self.sender.receiver_count() == 0 {
return;
}
if let Ok(value) = serde_json::to_value(payload) {
let _ = self.sender.send(WebEvent {
channel: channel.to_string(),
payload: value,
});
}
}
pub fn subscribe(&self) -> broadcast::Receiver<WebEvent> {
self.sender.subscribe()
}
pub fn has_subscribers(&self) -> bool {
self.sender.receiver_count() > 0
}
}
/// Unified event emission: sends to both Tauri webview and Web clients.
pub fn emit_event(
app: &tauri::AppHandle,
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);
}
}