mithril_aggregator/dependency_injection/builder/enablers/
misc.rs

1//! Miscellaneous enablers
2//!
3//! This naming is not ideal, we should either:
4//! - group these enablers into more logical categories
5//! - redefine the actual categories so those miscellaneous enablers fit into them
6
7use std::sync::Arc;
8use std::time::Duration;
9
10use mithril_signed_entity_lock::SignedEntityTypeLock;
11
12use crate::database::repository::CertificateRepository;
13use crate::dependency_injection::{DependenciesBuilder, Result};
14use crate::get_dependency;
15use crate::services::{
16    AggregatorClient, AggregatorHTTPClient, MessageService, MithrilMessageService,
17    SequentialSignatureProcessor, SignatureConsumer, SignatureConsumerNoop, SignatureProcessor,
18};
19impl DependenciesBuilder {
20    async fn build_signed_entity_type_lock(&mut self) -> Result<Arc<SignedEntityTypeLock>> {
21        let signed_entity_lock = Arc::new(SignedEntityTypeLock::default());
22        Ok(signed_entity_lock)
23    }
24
25    /// Get the [SignedEntityTypeLock] instance
26    pub async fn get_signed_entity_type_lock(&mut self) -> Result<Arc<SignedEntityTypeLock>> {
27        get_dependency!(self.signed_entity_type_lock)
28    }
29
30    /// Builds HTTP message service
31    pub async fn build_message_service(&mut self) -> Result<Arc<dyn MessageService>> {
32        let certificate_repository = Arc::new(CertificateRepository::new(
33            self.get_sqlite_connection().await?,
34        ));
35        let signed_entity_storer = self.get_signed_entity_storer().await?;
36        let immutable_file_digest_mapper = self.get_immutable_file_digest_mapper().await?;
37        let epoch_service = self.get_epoch_service().await?;
38        let service = MithrilMessageService::new(
39            certificate_repository,
40            signed_entity_storer,
41            immutable_file_digest_mapper,
42            epoch_service,
43        );
44
45        Ok(Arc::new(service))
46    }
47
48    /// [MessageService] service
49    pub async fn get_message_service(&mut self) -> Result<Arc<dyn MessageService>> {
50        get_dependency!(self.message_service)
51    }
52
53    /// Builds an [AggregatorClient]
54    pub async fn build_leader_aggregator_client(&mut self) -> Result<Arc<dyn AggregatorClient>> {
55        let leader_aggregator_endpoint = self
56            .configuration
57            .leader_aggregator_endpoint()
58            .unwrap_or_default();
59        let aggregator_client = AggregatorHTTPClient::new(
60            leader_aggregator_endpoint,
61            None,
62            self.get_api_version_provider().await?,
63            Some(Duration::from_secs(30)),
64            self.root_logger(),
65        );
66
67        Ok(Arc::new(aggregator_client))
68    }
69
70    /// Returns a leader [AggregatorClient]
71    pub async fn get_leader_aggregator_client(&mut self) -> Result<Arc<dyn AggregatorClient>> {
72        get_dependency!(self.leader_aggregator_client)
73    }
74
75    /// Builds a [SignatureConsumer]
76    pub async fn build_signature_consumer(&mut self) -> Result<Arc<dyn SignatureConsumer>> {
77        let signature_consumer = SignatureConsumerNoop;
78
79        Ok(Arc::new(signature_consumer))
80    }
81
82    /// Builds a [SignatureProcessor]
83    pub async fn create_signature_processor(&mut self) -> Result<Arc<dyn SignatureProcessor>> {
84        let (_stop_tx, stop_rx) = self.get_stop_signal_channel().await?;
85        let signature_processor = SequentialSignatureProcessor::new(
86            self.build_signature_consumer().await?,
87            self.get_certifier_service().await?,
88            stop_rx,
89            self.root_logger(),
90            self.get_metrics_service().await?,
91        );
92
93        Ok(Arc::new(signature_processor))
94    }
95}