use rumqttd::{Broker, Config}; use std::sync::Arc; use super::subscriber::MqttSubscriber; use crate::{bridge::ClientManager, storage::StorageRepositoryImpl}; pub struct MqttBroker { broker: &'static mut Broker, clients: Arc, storage: Arc, } impl MqttBroker { pub async fn new(cfg: Config, storage: Arc) -> Self { let clients = Arc::new(ClientManager::new()); let broker: &'static mut Broker = Box::leak(Box::new(Broker::new(cfg))); Self { broker, clients, storage, } } pub fn clients(&self) -> Arc { self.clients.clone() } pub async fn run(self) -> anyhow::Result<()> { let mut subscriber = MqttSubscriber::new(&self.broker, self.clients, self.storage.inner()); println!("starting mqtt broker on specified port"); tokio::spawn(async move { if let Err(e) = self.broker.start() { eprintln!("broker exited with error: {}", e); } }); subscriber.run().await } }