use dashmap::DashMap;
use tokio_util::sync::CancellationToken;
use tracing::trace;
use crate::common::acton_inner::ActonInner;
use crate::common::{ActonConfig, ActorHandle, ActorRuntime, Broker};
#[derive(Default, Debug, Clone)]
pub struct ActonApp;
impl ActonApp {
pub async fn launch_async() -> ActorRuntime {
trace!("Starting Acton system initialization (async)");
let config = ActonConfig::load();
trace!("Configuration loaded: {:?}", config);
let mut runtime = ActorRuntime(ActonInner {
broker: ActorHandle::default(),
roots: DashMap::default(),
cancellation_token: CancellationToken::new(),
config,
#[cfg(feature = "ipc")]
ipc_type_registry: std::sync::Arc::new(crate::common::ipc::IpcTypeRegistry::new()),
#[cfg(feature = "ipc")]
ipc_actor_registry: std::sync::Arc::new(DashMap::new()),
#[cfg(feature = "ipc")]
ipc_subscription_manager: std::sync::Arc::new(parking_lot::RwLock::new(None)),
});
trace!("Initializing broker...");
let broker = Broker::initialize(runtime.clone()).await;
runtime.0.broker = broker;
trace!("Acton system initialization complete (async)");
runtime
}
#[must_use]
pub fn launch() -> ActorRuntime {
assert!(
tokio::runtime::Handle::try_current().is_err(),
"ActonApp::launch() was called from within a Tokio runtime. \
Use ActonApp::launch_async().await instead when in an async context."
);
trace!("Starting Acton system initialization (sync)");
let rt = tokio::runtime::Runtime::new()
.expect("Failed to create Tokio runtime for Acton initialization");
rt.block_on(Self::launch_async())
}
}