use std::sync::Arc;
use crate::state::AppState;
#[cfg(feature = "kwt")]
use crate::kwt_replay::AetherRuntime;
#[cfg(feature = "kwt")]
use crate::wt_aether::WtAetherConfig;
#[derive(Debug, Clone)]
pub struct EmbedConfig {
pub webtransport: bool,
#[cfg(feature = "kwt")]
pub wt_aether: Option<WtAetherConfig>,
}
impl Default for EmbedConfig {
fn default() -> Self {
Self {
webtransport: false,
#[cfg(feature = "kwt")]
wt_aether: None,
}
}
}
impl EmbedConfig {
#[must_use]
pub fn from_env() -> Self {
let webtransport = crate::webtransport::enabled_from_env();
#[cfg(feature = "kwt")]
let wt_aether = if webtransport || crate::surfaces::env_enabled("NAUTALID_WEBTRANSPORT_AETHER")
{
Some(WtAetherConfig::from_env())
} else {
None
};
Self {
webtransport,
#[cfg(feature = "kwt")]
wt_aether,
}
}
}
#[derive(Debug, Default)]
pub struct EmbedBuilder {
config: EmbedConfig,
}
impl EmbedBuilder {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn from_env() -> Self {
Self {
config: EmbedConfig::from_env(),
}
}
#[must_use]
pub fn webtransport(mut self, enabled: bool) -> Self {
self.config.webtransport = enabled;
self
}
#[cfg(feature = "kwt")]
#[must_use]
pub fn wt_aether(mut self, config: WtAetherConfig) -> Self {
self.config.wt_aether = Some(config);
self
}
#[must_use]
pub fn build(self) -> EmbedConfig {
self.config
}
}
pub fn install_subsystems(state: &AppState, config: &EmbedConfig) {
crate::webtransport::set_enabled(config.webtransport);
#[cfg(feature = "kwt")]
if let Some(runtime) = &state.aether_runtime {
if let Some(wt) = &config.wt_aether {
#[cfg(feature = "filter")]
crate::wt_aether::install_with_filter(
Arc::clone(runtime),
wt.clone(),
Some(state.filter.clone()),
);
#[cfg(not(feature = "filter"))]
crate::wt_aether::install(Arc::clone(runtime), wt.clone());
} else if config.webtransport {
#[cfg(feature = "filter")]
crate::wt_aether::install_with_filter(
Arc::clone(runtime),
WtAetherConfig::from_env(),
Some(state.filter.clone()),
);
#[cfg(not(feature = "filter"))]
crate::wt_aether::install(
Arc::clone(runtime),
WtAetherConfig::from_env(),
);
}
runtime.ensure_wire_pool();
}
let _ = state;
}
pub fn install_subsystems_from_env(state: &AppState) {
install_subsystems(state, &EmbedConfig::from_env());
}
#[cfg(feature = "kwt")]
pub fn state_with_runtime(
runtime: Arc<AetherRuntime>,
kwt: crate::kwt_access::KwtAccessConfig,
) -> AppState {
AppState::new(
#[cfg(feature = "image-trust")]
None,
Some(kwt),
Some(runtime),
#[cfg(feature = "filter")]
crate::filter::FilterStore::default(),
)
}