Files
Stalwart/crates/services/src/lib.rs
Maurus Decimus 3ad4aa82cb v0.16.0
2026-04-20 17:50:58 +02:00

67 lines
1.8 KiB
Rust

/*
* SPDX-FileCopyrightText: 2020 Stalwart Labs LLC <hello@stalw.art>
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
*/
#![warn(clippy::large_futures)]
use broadcast::publisher::spawn_broadcast_publisher;
use common::{
BuildServer, Inner,
manager::boot::{BootManager, IpcReceivers},
};
use state_manager::manager::spawn_push_router;
use std::sync::Arc;
use crate::task_manager::{manager::spawn_task_manager, scheduler::spawn_task_scheduler};
pub mod broadcast;
pub mod state_manager;
pub mod task_manager;
pub trait StartServices: Sync + Send {
fn start_services(&mut self) -> impl Future<Output = ()> + Send;
}
pub trait SpawnServices {
fn spawn_services(&mut self, inner: Arc<Inner>);
}
impl StartServices for BootManager {
async fn start_services(&mut self) {
let server = self.inner.build_server();
// Unpack webadmin
self.inner
.data
.applications
.unpack_all(&server, false)
.await;
if !server.registry().is_recovery_mode() {
self.ipc_rxs.spawn_services(self.inner.clone());
}
}
}
impl SpawnServices for IpcReceivers {
fn spawn_services(&mut self, inner: Arc<Inner>) {
if !inner.shared_core.load().storage.registry.is_recovery_mode() {
// Spawn push manager
spawn_push_router(inner.clone(), self.push_rx.take().unwrap());
// Spawn broadcast publisher
if let Some(event_rx) = self.broadcast_rx.take() {
// Spawn broadcast publisher
spawn_broadcast_publisher(inner.clone(), event_rx);
}
// Spawn task manager
spawn_task_manager(inner.clone());
// Spawn task scheduler
spawn_task_scheduler(inner);
}
}
}