use std::sync::Arc;
use super::{LiminalConnectionServices, SiteDraftHolder};
use crate::services::lifecycle::{Lifecycle, site};
use site::SiteError;
impl LiminalConnectionServices {
pub fn install_construction(
&self,
lifecycle: Arc<Lifecycle>,
lys: &crate::config::types::LysConfig,
http: Arc<dyn crate::services::lys_http::LysHttp>,
drafts: Arc<dyn SiteDraftHolder>,
) -> Result<(), SiteError> {
let config = lys
.construction
.as_ref()
.ok_or(SiteError::Invalid("[auth.lys.construction]"))?;
let agents = self
.agents
.as_ref()
.ok_or(SiteError::Invalid("[auth.lys.agents]"))?;
let pass = lys
.machine
.as_ref()
.map(crate::link_pass::MachinePass::configured)
.transpose()
.map_err(|_| SiteError::Invalid("construction machine pass"))?;
let effects = Arc::new(site::effects::LysSiteEffects::new(
http,
pass,
Arc::clone(agents),
site::effects::GrantSources {
placement: lys
.app_credential_path
.clone()
.map(|path| (path, lys.network_id.clone())),
..config.grants.clone()
},
config.limits.text_bytes,
));
self.install_sites(
lifecycle,
config.limits,
lys.templates.policy.clone(),
effects,
drafts,
)
}
pub fn install_open_construction(
&self,
lifecycle: Arc<Lifecycle>,
limits: site::SiteLimits,
templates: Option<crate::services::lifecycle::templates::TemplatePolicy>,
) -> Result<(), SiteError> {
let agents = self.agents.as_ref().ok_or(SiteError::Invalid(
"[open.construction] requires top-level [agents]",
))?;
self.install_sites(
lifecycle,
limits,
templates,
Arc::new(site::declared::OpenSiteEffects::new(Arc::clone(agents))),
Arc::new(site::declared::DeclaredActs),
)
}
fn install_sites(
&self,
lifecycle: Arc<Lifecycle>,
limits: site::SiteLimits,
templates: Option<crate::services::lifecycle::templates::TemplatePolicy>,
effects: Arc<dyn site::effects::SiteEffects>,
drafts: Arc<dyn SiteDraftHolder>,
) -> Result<(), SiteError> {
let agents = self.agents.as_ref().ok_or(SiteError::Invalid(
"construction requires an agent registry",
))?;
let mut bounds = *agents.bounds();
bounds.max_event_bytes = limits.request_bytes.get();
let retained = crate::agents::retained::Retained::new(
bounds,
self.cluster.supervisor().clone(),
self.console.device(),
);
lifecycle.configure_sites(limits, self.durable_store(), templates, effects, retained)?;
lifecycle.validate_site_storage()?;
lifecycle.bind_site_console(&self.console)?;
self.site_drafts
.set(drafts)
.map_err(|_| SiteError::Invalid("construction drafts already installed"))?;
self.site_lifecycle
.set(lifecycle)
.map_err(|_| SiteError::Invalid("construction already installed"))?;
Ok(())
}
}