1
+ use std:: fs;
2
+ use std:: sync:: Arc ;
3
+ use std:: time:: Duration ;
4
+
1
5
use anyhow:: { anyhow, Context } ;
2
- use async_trait:: async_trait;
3
- use std:: { fs, sync:: Arc , time:: Duration } ;
4
6
use tokio:: sync:: Mutex ;
5
7
6
- use mithril_common:: {
7
- api_version:: APIVersionProvider ,
8
- cardano_block_scanner:: CardanoBlockScanner ,
9
- cardano_transactions_preloader:: CardanoTransactionsPreloader ,
10
- chain_observer:: { CardanoCliRunner , ChainObserver , ChainObserverBuilder , ChainObserverType } ,
11
- chain_reader:: PallasChainReader ,
12
- crypto_helper:: { OpCert , ProtocolPartyId , SerDeShelleyFileFormat } ,
13
- digesters:: {
14
- cache:: { ImmutableFileDigestCacheProvider , JsonImmutableFileDigestCacheProviderBuilder } ,
15
- CardanoImmutableDigester , ImmutableDigester , ImmutableFileObserver ,
16
- ImmutableFileSystemObserver ,
17
- } ,
18
- era:: { EraChecker , EraReader } ,
19
- signable_builder:: {
20
- CardanoImmutableFilesFullSignableBuilder , CardanoStakeDistributionSignableBuilder ,
21
- CardanoTransactionsSignableBuilder , MithrilSignableBuilderService ,
22
- MithrilStakeDistributionSignableBuilder , SignableBuilderService ,
23
- } ,
24
- signed_entity_type_lock:: SignedEntityTypeLock ,
25
- MithrilTickerService , StdResult , TickerService ,
8
+ use mithril_common:: api_version:: APIVersionProvider ;
9
+ use mithril_common:: cardano_block_scanner:: CardanoBlockScanner ;
10
+ use mithril_common:: cardano_transactions_preloader:: CardanoTransactionsPreloader ;
11
+ use mithril_common:: chain_observer:: {
12
+ CardanoCliRunner , ChainObserver , ChainObserverBuilder , ChainObserverType ,
13
+ } ;
14
+ use mithril_common:: chain_reader:: PallasChainReader ;
15
+ use mithril_common:: crypto_helper:: { OpCert , ProtocolPartyId , SerDeShelleyFileFormat } ;
16
+ use mithril_common:: digesters:: cache:: {
17
+ ImmutableFileDigestCacheProvider , JsonImmutableFileDigestCacheProviderBuilder ,
26
18
} ;
27
- use mithril_persistence:: {
28
- database:: { repository:: CardanoTransactionRepository , ApplicationNodeType , SqlMigration } ,
29
- sqlite:: { ConnectionBuilder , SqliteConnection , SqliteConnectionPool } ,
30
- store:: { adapter:: SQLiteAdapter , StakeStore } ,
19
+ use mithril_common:: digesters:: {
20
+ CardanoImmutableDigester , ImmutableFileObserver , ImmutableFileSystemObserver ,
31
21
} ;
22
+ use mithril_common:: era:: { EraChecker , EraReader } ;
23
+ use mithril_common:: signable_builder:: {
24
+ CardanoImmutableFilesFullSignableBuilder , CardanoStakeDistributionSignableBuilder ,
25
+ CardanoTransactionsSignableBuilder , MithrilSignableBuilderService ,
26
+ MithrilStakeDistributionSignableBuilder ,
27
+ } ;
28
+ use mithril_common:: signed_entity_type_lock:: SignedEntityTypeLock ;
29
+ use mithril_common:: { MithrilTickerService , StdResult , TickerService } ;
32
30
33
- use crate :: {
34
- aggregator_client:: AggregatorClient , metrics:: MetricsService , single_signer:: SingleSigner ,
31
+ use mithril_persistence:: database:: repository:: CardanoTransactionRepository ;
32
+ use mithril_persistence:: database:: { ApplicationNodeType , SqlMigration } ;
33
+ use mithril_persistence:: sqlite:: { ConnectionBuilder , SqliteConnection , SqliteConnectionPool } ;
34
+ use mithril_persistence:: store:: adapter:: SQLiteAdapter ;
35
+ use mithril_persistence:: store:: StakeStore ;
36
+
37
+ use crate :: dependency_injection:: SignerDependencyContainer ;
38
+ use crate :: services:: {
35
39
AggregatorHTTPClient , CardanoTransactionsImporter ,
36
- CardanoTransactionsPreloaderActivationSigner , Configuration , MKTreeStoreSqlite ,
37
- MithrilSingleSigner , ProtocolInitializerStore , ProtocolInitializerStorer , SignerUpkeepService ,
40
+ CardanoTransactionsPreloaderActivationSigner , MithrilSingleSigner , SignerUpkeepService ,
38
41
TransactionsImporterByChunk , TransactionsImporterWithPruner , TransactionsImporterWithVacuum ,
39
- UpkeepService , HTTP_REQUEST_TIMEOUT_DURATION , SQLITE_FILE , SQLITE_FILE_CARDANO_TRANSACTION ,
42
+ } ;
43
+ use crate :: store:: { MKTreeStoreSqlite , ProtocolInitializerStore } ;
44
+ use crate :: {
45
+ Configuration , MetricsService , HTTP_REQUEST_TIMEOUT_DURATION , SQLITE_FILE ,
46
+ SQLITE_FILE_CARDANO_TRANSACTION ,
40
47
} ;
41
48
42
- type StakeStoreService = Arc < StakeStore > ;
43
- type CertificateHandlerService = Arc < dyn AggregatorClient > ;
44
- type ChainObserverService = Arc < dyn ChainObserver > ;
45
- type DigesterService = Arc < dyn ImmutableDigester > ;
46
- type SingleSignerService = Arc < dyn SingleSigner > ;
47
- type TimePointProviderService = Arc < dyn TickerService > ;
48
- type ProtocolInitializerStoreService = Arc < dyn ProtocolInitializerStorer > ;
49
-
50
- /// The ServiceBuilder is intended to manage Services instance creation.
49
+ /// The `DependenciesBuilder` is intended to manage Services instance creation.
50
+ ///
51
51
/// The goal of this is to put all this code out of the way of business code.
52
- #[ async_trait]
53
- pub trait ServiceBuilder {
54
- /// Create a SignerService instance.
55
- async fn build ( & self ) -> StdResult < SignerServices > ;
56
- }
57
-
58
- /// Create a SignerService instance for Production environment.
59
- pub struct ProductionServiceBuilder < ' a > {
52
+ pub struct DependenciesBuilder < ' a > {
60
53
config : & ' a Configuration ,
61
- chain_observer_builder : fn ( & Configuration ) -> StdResult < ChainObserverService > ,
54
+ chain_observer_builder : fn ( & Configuration ) -> StdResult < Arc < dyn ChainObserver > > ,
62
55
immutable_file_observer_builder :
63
56
fn ( & Configuration ) -> StdResult < Arc < dyn ImmutableFileObserver > > ,
64
57
}
65
58
66
- impl < ' a > ProductionServiceBuilder < ' a > {
67
- /// Create a new production service builder .
59
+ impl < ' a > DependenciesBuilder < ' a > {
60
+ /// Create a new `DependenciesBuilder` .
68
61
pub fn new ( config : & ' a Configuration ) -> Self {
69
- let chain_observer_builder: fn ( & Configuration ) -> StdResult < ChainObserverService > =
62
+ let chain_observer_builder: fn ( & Configuration ) -> StdResult < Arc < dyn ChainObserver > > =
70
63
|config : & Configuration | {
71
64
let chain_observer_type = ChainObserverType :: Pallas ;
72
65
let cardano_cli_path = & config. cardano_cli_path ;
73
66
let cardano_node_socket_path = & config. cardano_node_socket_path ;
74
67
let cardano_network = & config. get_network ( ) . with_context ( || {
75
- "Production Service Builder can not get Cardano network while building the chain observer"
68
+ "Dependencies Builder can not get Cardano network while building the chain observer"
76
69
} ) ?;
77
70
let cardano_cli_runner = & CardanoCliRunner :: new (
78
71
cardano_cli_path. to_owned ( ) ,
@@ -121,7 +114,7 @@ impl<'a> ProductionServiceBuilder<'a> {
121
114
/// Override default chain observer builder.
122
115
pub fn override_chain_observer_builder (
123
116
& mut self ,
124
- builder : fn ( & Configuration ) -> StdResult < ChainObserverService > ,
117
+ builder : fn ( & Configuration ) -> StdResult < Arc < dyn ChainObserver > > ,
125
118
) -> & mut Self {
126
119
self . chain_observer_builder = builder;
127
120
@@ -182,12 +175,9 @@ impl<'a> ProductionServiceBuilder<'a> {
182
175
183
176
Ok ( connection)
184
177
}
185
- }
186
178
187
- #[ async_trait]
188
- impl < ' a > ServiceBuilder for ProductionServiceBuilder < ' a > {
189
- /// Build a Services for the Production environment.
190
- async fn build ( & self ) -> StdResult < SignerServices > {
179
+ /// Build dependencies for the Production environment.
180
+ pub async fn build ( & self ) -> StdResult < SignerDependencyContainer > {
191
181
if !self . config . data_stores_directory . exists ( ) {
192
182
fs:: create_dir_all ( self . config . data_stores_directory . clone ( ) ) . with_context ( || {
193
183
format ! (
@@ -331,7 +321,7 @@ impl<'a> ServiceBuilder for ProductionServiceBuilder<'a> {
331
321
cardano_transactions_builder,
332
322
cardano_stake_distribution_signable_builder,
333
323
) ) ;
334
- let metrics_service = Arc :: new ( MetricsService :: new ( ) . unwrap ( ) ) ;
324
+ let metrics_service = Arc :: new ( MetricsService :: new ( ) ? ) ;
335
325
let preloader_activation =
336
326
CardanoTransactionsPreloaderActivationSigner :: new ( aggregator_client. clone ( ) ) ;
337
327
let cardano_transactions_preloader = Arc :: new ( CardanoTransactionsPreloader :: new (
@@ -349,7 +339,7 @@ impl<'a> ServiceBuilder for ProductionServiceBuilder<'a> {
349
339
slog_scope:: logger ( ) ,
350
340
) ) ;
351
341
352
- let services = SignerServices {
342
+ let services = SignerDependencyContainer {
353
343
ticker_service,
354
344
certificate_handler : aggregator_client,
355
345
chain_observer,
@@ -371,54 +361,6 @@ impl<'a> ServiceBuilder for ProductionServiceBuilder<'a> {
371
361
}
372
362
}
373
363
374
- /// This structure groups all the services required by the state machine.
375
- pub struct SignerServices {
376
- /// Time point provider service
377
- pub ticker_service : TimePointProviderService ,
378
-
379
- /// Stake store service
380
- pub stake_store : StakeStoreService ,
381
-
382
- /// Certificate handler service
383
- pub certificate_handler : CertificateHandlerService ,
384
-
385
- /// Chain Observer service
386
- pub chain_observer : ChainObserverService ,
387
-
388
- /// Digester service
389
- pub digester : DigesterService ,
390
-
391
- /// SingleSigner service
392
- pub single_signer : SingleSignerService ,
393
-
394
- /// ProtocolInitializer store
395
- pub protocol_initializer_store : ProtocolInitializerStoreService ,
396
-
397
- /// Era checker service
398
- pub era_checker : Arc < EraChecker > ,
399
-
400
- /// Era reader service
401
- pub era_reader : Arc < EraReader > ,
402
-
403
- /// API version provider
404
- pub api_version_provider : Arc < APIVersionProvider > ,
405
-
406
- /// Signable Builder Service
407
- pub signable_builder_service : Arc < dyn SignableBuilderService > ,
408
-
409
- /// Metrics service
410
- pub metrics_service : Arc < MetricsService > ,
411
-
412
- /// Signed entity type lock
413
- pub signed_entity_type_lock : Arc < SignedEntityTypeLock > ,
414
-
415
- /// Cardano transactions preloader
416
- pub cardano_transactions_preloader : Arc < CardanoTransactionsPreloader > ,
417
-
418
- /// Upkeep service
419
- pub upkeep_service : Arc < dyn UpkeepService > ,
420
- }
421
-
422
364
#[ cfg( test) ]
423
365
mod tests {
424
366
use std:: path:: PathBuf ;
@@ -443,16 +385,16 @@ mod tests {
443
385
} ;
444
386
445
387
assert ! ( !stores_dir. exists( ) ) ;
446
- let chain_observer_builder: fn ( & Configuration ) -> StdResult < ChainObserverService > =
388
+ let chain_observer_builder: fn ( & Configuration ) -> StdResult < Arc < dyn ChainObserver > > =
447
389
|_config| Ok ( Arc :: new ( FakeObserver :: new ( Some ( TimePoint :: dummy ( ) ) ) ) ) ;
448
390
let immutable_file_observer_builder: fn (
449
391
& Configuration ,
450
392
)
451
393
-> StdResult < Arc < dyn ImmutableFileObserver > > =
452
394
|_config : & Configuration | Ok ( Arc :: new ( DumbImmutableFileObserver :: default ( ) ) ) ;
453
395
454
- let mut service_builder = ProductionServiceBuilder :: new ( & config) ;
455
- service_builder
396
+ let mut dependencies_builder = DependenciesBuilder :: new ( & config) ;
397
+ dependencies_builder
456
398
. override_chain_observer_builder ( chain_observer_builder)
457
399
. override_immutable_file_observer_builder ( immutable_file_observer_builder)
458
400
. build ( )
0 commit comments