pub mod commands;
pub mod config;
pub mod lifecycle;
pub mod session;
pub mod storage;
pub use config::{Mode, ObserverConfig};
use serde_json::json;
use tauri::plugin::{Builder, TauriPlugin};
use tauri::{AppHandle, Emitter, EventTarget, Manager, Runtime};
type SessionState = std::sync::Mutex<session::Session>;
pub fn emit_segment_start_if_active<R: Runtime>(app: &AppHandle<R>, label: &str) -> bool {
let Some(state) = app.try_state::<SessionState>() else {
return false;
};
let active = state.lock().map(|s| s.active).unwrap_or(false);
if active {
let _ = app.emit_to(
EventTarget::labeled(label),
"segment",
json!({ "action": "start" }),
);
}
active
}
pub fn init<R: Runtime>() -> TauriPlugin<R> {
init_with(ObserverConfig::default())
}
pub fn init_with<R: Runtime>(config: ObserverConfig) -> TauriPlugin<R> {
Builder::<R>::new("observer")
.invoke_handler(tauri::generate_handler![
commands::start_session,
commands::stop_session,
commands::is_recording_active,
commands::begin_segment,
commands::append_events,
commands::bind_session,
commands::session_id,
commands::notify_segment_start,
])
.setup(move |app, _api| {
app.manage(std::sync::Mutex::new(session::Session::new(config.clone())));
Ok(())
})
.on_window_ready(|window| {
let app = window.app_handle().clone();
let label = window.label().to_string();
window.on_window_event(move |event| {
lifecycle::handle_window_event(&app, &label, event);
});
})
.build()
}