kroki_rs/browser/
manager.rs

1use crate::browser::backend::BrowserBackend;
2#[cfg(feature = "native-browser")]
3use crate::browser::native::NativeBackend;
4use crate::diagrams::DiagramResult;
5use anyhow::{anyhow, Result};
6use std::sync::Arc;
7
8/// Unified manager for browser-based rendering backends.
9/// Abstracts away the specific implementation (Native).
10#[derive(Clone)]
11pub struct BrowserManager {
12    backend: Arc<dyn BrowserBackend>,
13}
14
15impl BrowserManager {
16    /// Launches the preferred browser backend.
17    /// Prefers Native (headless_chrome) if available.
18    pub async fn start(pool_size: usize, context_ttl: usize) -> Result<Self> {
19        #[cfg(feature = "native-browser")]
20        {
21            match NativeBackend::new(pool_size, context_ttl).await {
22                Ok(backend) => {
23                    tracing::info!("Initialized native browser backend (headless_chrome)");
24                    Ok(Self {
25                        backend: Arc::new(backend),
26                    })
27                }
28                Err(e) => Err(anyhow!("Native browser backend failed to start: {}", e)),
29            }
30        }
31
32        #[cfg(not(feature = "native-browser"))]
33        {
34            let _ = (pool_size, context_ttl);
35            Err(anyhow!("Browser-based rendering is disabled in this build. Rebuild with --features native-browser."))
36        }
37    }
38
39    /// Evaluate diagram code inside the preferred browser backend.
40    pub async fn evaluate(
41        &self,
42        diagram_type: &str,
43        source: &str,
44        format: &str,
45    ) -> DiagramResult<Vec<u8>> {
46        self.backend.render(diagram_type, source, format).await
47    }
48
49    /// Fetches health information from the active backend.
50    pub async fn get_pool_health(&self) -> Result<serde_json::Value> {
51        Ok(self.backend.health().await)
52    }
53}