eoka-server 0.4.0

Shared browser runtime and sidecar process for eoka browser automation
Documentation
use std::collections::HashMap;
use std::sync::Arc;

use eoka::{Browser, Page};

use crate::protocol::ServerError;

#[derive(Default)]
pub struct AppState {
    pub agent: crate::agent::AgentSession,
    pub operations: crate::operations::OperationManager,
    browser: Option<Arc<Browser>>,
    pages: HashMap<String, Page>,
    shutdown: bool,
}

impl AppState {
    pub fn new() -> Self {
        Self::default()
    }

    pub fn set_browser(&mut self, browser: Browser) {
        self.browser = Some(Arc::new(browser));
    }

    pub fn take_browser(&mut self) -> Option<Arc<Browser>> {
        self.browser.take()
    }

    pub fn is_launched(&self) -> bool {
        self.browser.is_some()
    }

    pub fn browser(&self) -> Result<&Arc<Browser>, ServerError> {
        self.browser
            .as_ref()
            .ok_or_else(|| ServerError::internal("browser not launched; call browser.launch first"))
    }

    pub fn insert_page(&mut self, id: String, page: Page) {
        self.pages.insert(id, page);
    }

    pub fn remove_page(&mut self, id: &str) -> Option<Page> {
        self.pages.remove(id)
    }

    pub fn page(&self, id: &str) -> Result<&Page, ServerError> {
        self.pages
            .get(id)
            .ok_or_else(|| ServerError::invalid_page(id))
    }

    pub fn pages(&self) -> impl Iterator<Item = &Page> {
        self.pages.values()
    }

    pub fn clear_pages(&mut self) {
        self.pages.clear();
    }

    pub fn mark_shutdown(&mut self) {
        self.shutdown = true;
    }

    pub fn should_shutdown(&self) -> bool {
        self.shutdown
    }
}