@@ -7,26 +7,27 @@ use std::str::FromStr;
7
7
8
8
use std:: sync:: Arc ;
9
9
10
- use crate :: alerts:: aws_sns:: AWSSNS ;
11
- use crate :: alerts:: Alerts ;
12
- use crate :: data_storage:: aws_s3:: AWSS3 ;
13
- use crate :: data_storage:: DataStorage ;
14
- use arc_swap:: { ArcSwap , Guard } ;
15
- use aws_config:: meta:: region:: RegionProviderChain ;
16
- use aws_config:: { Region , SdkConfig } ;
17
- use aws_credential_types:: Credentials ;
18
- use da_client_interface:: DaClient ;
10
+ use aws_config:: SdkConfig ;
19
11
use dotenvy:: dotenv;
20
- use ethereum_da_client:: EthereumDaClient ;
12
+ use starknet:: providers:: jsonrpc:: HttpTransport ;
13
+ use starknet:: providers:: { JsonRpcClient , Url } ;
14
+
15
+ use da_client_interface:: DaClient ;
21
16
use ethereum_settlement_client:: EthereumSettlementClient ;
22
17
use prover_client_interface:: ProverClient ;
23
18
use settlement_client_interface:: SettlementClient ;
24
19
use sharp_service:: SharpProverService ;
25
- use starknet:: providers:: jsonrpc:: HttpTransport ;
26
- use starknet:: providers:: { JsonRpcClient , Url } ;
27
20
use starknet_settlement_client:: StarknetSettlementClient ;
28
- use tokio:: sync:: OnceCell ;
29
21
use utils:: env_utils:: get_env_var_or_panic;
22
+
23
+ use crate :: alerts:: aws_sns:: AWSSNS ;
24
+ use crate :: alerts:: Alerts ;
25
+ use crate :: data_storage:: aws_s3:: AWSS3 ;
26
+ use crate :: data_storage:: DataStorage ;
27
+ use aws_config:: meta:: region:: RegionProviderChain ;
28
+ use aws_config:: Region ;
29
+ use aws_credential_types:: Credentials ;
30
+ use ethereum_da_client:: EthereumDaClient ;
30
31
use utils:: settings:: env:: EnvSettingsProvider ;
31
32
use utils:: settings:: Settings ;
32
33
@@ -61,55 +62,58 @@ pub struct Config {
61
62
///
62
63
/// We are using Arc<SdkConfig> because the config size is large and keeping it
63
64
/// a pointer is a better way to pass it through.
65
+ #[ derive( Clone ) ]
64
66
pub enum ProviderConfig {
65
- AWS ( Arc < SdkConfig > ) ,
67
+ AWS ( Box < SdkConfig > ) ,
68
+ }
69
+
70
+ impl ProviderConfig {
71
+ pub fn get_aws_client_or_panic ( & self ) -> & SdkConfig {
72
+ match self {
73
+ ProviderConfig :: AWS ( config) => config. as_ref ( ) ,
74
+ }
75
+ }
66
76
}
67
77
68
78
/// To build a `SdkConfig` for AWS provider.
69
79
pub async fn get_aws_config ( settings_provider : & impl Settings ) -> SdkConfig {
70
- let region = settings_provider
71
- . get_settings ( "AWS_REGION" )
72
- . expect ( "Not able to get AWS_REGION from provided settings provider." ) ;
80
+ let region = settings_provider. get_settings_or_panic ( "AWS_REGION" ) ;
73
81
let region_provider = RegionProviderChain :: first_try ( Region :: new ( region) ) . or_default_provider ( ) ;
74
82
let credentials = Credentials :: from_keys (
75
- settings_provider
76
- . get_settings ( "AWS_ACCESS_KEY_ID" )
77
- . expect ( "Not able to get AWS_ACCESS_KEY_ID from provided settings provider." ) ,
78
- settings_provider
79
- . get_settings ( "AWS_SECRET_ACCESS_KEY" )
80
- . expect ( "Not able to get AWS_SECRET_ACCESS_KEY from provided settings provider." ) ,
83
+ settings_provider. get_settings_or_panic ( "AWS_ACCESS_KEY_ID" ) ,
84
+ settings_provider. get_settings_or_panic ( "AWS_SECRET_ACCESS_KEY" ) ,
81
85
None ,
82
86
) ;
83
87
aws_config:: from_env ( ) . credentials_provider ( credentials) . region ( region_provider) . load ( ) . await
84
88
}
85
89
86
90
/// Initializes the app config
87
- pub async fn init_config ( ) -> Config {
91
+ pub async fn init_config ( ) -> Arc < Config > {
88
92
dotenv ( ) . ok ( ) ;
89
93
94
+ let settings_provider = EnvSettingsProvider { } ;
95
+ let provider_config = Arc :: new ( ProviderConfig :: AWS ( Box :: new ( get_aws_config ( & settings_provider) . await ) ) ) ;
96
+
90
97
// init starknet client
91
98
let provider = JsonRpcClient :: new ( HttpTransport :: new (
92
- Url :: parse ( get_env_var_or_panic ( "MADARA_RPC_URL" ) . as_str ( ) ) . expect ( "Failed to parse URL" ) ,
99
+ Url :: parse ( settings_provider . get_settings_or_panic ( "MADARA_RPC_URL" ) . as_str ( ) ) . expect ( "Failed to parse URL" ) ,
93
100
) ) ;
94
101
95
- let settings_provider = EnvSettingsProvider { } ;
96
- let aws_config = Arc :: new ( get_aws_config ( & settings_provider) . await ) ;
97
-
98
102
// init database
99
103
let database = build_database_client ( & settings_provider) . await ;
100
104
let da_client = build_da_client ( & settings_provider) . await ;
101
105
let settlement_client = build_settlement_client ( & settings_provider) . await ;
102
106
let prover_client = build_prover_service ( & settings_provider) ;
103
- let storage_client = build_storage_client ( & settings_provider, ProviderConfig :: AWS ( Arc :: clone ( & aws_config ) ) ) . await ;
104
- let alerts_client = build_alert_client ( & settings_provider, ProviderConfig :: AWS ( Arc :: clone ( & aws_config ) ) ) . await ;
107
+ let storage_client = build_storage_client ( & settings_provider, provider_config . clone ( ) ) . await ;
108
+ let alerts_client = build_alert_client ( & settings_provider, provider_config . clone ( ) ) . await ;
105
109
106
110
// init the queue
107
111
// TODO: we use omniqueue for now which doesn't support loading AWS config
108
112
// from `SdkConfig`. We can later move to using `aws_sdk_sqs`. This would require
109
113
// us stop using the generic omniqueue abstractions for message ack/nack
110
114
let queue = build_queue_client ( ) ;
111
115
112
- Config :: new (
116
+ Arc :: new ( Config :: new (
113
117
Arc :: new ( provider) ,
114
118
da_client,
115
119
prover_client,
@@ -118,7 +122,7 @@ pub async fn init_config() -> Config {
118
122
queue,
119
123
storage_client,
120
124
alerts_client,
121
- )
125
+ ) )
122
126
}
123
127
124
128
impl Config {
@@ -178,33 +182,6 @@ impl Config {
178
182
}
179
183
}
180
184
181
- /// The app config. It can be accessed from anywhere inside the service.
182
- /// It's initialized only once.
183
- /// We are using `ArcSwap` as it allow us to replace the new `Config` with
184
- /// a new one which is required when running test cases. This approach was
185
- /// inspired from here - https://github.com/matklad/once_cell/issues/127
186
- pub static CONFIG : OnceCell < ArcSwap < Config > > = OnceCell :: const_new ( ) ;
187
-
188
- /// Returns the app config. Initializes if not already done.
189
- pub async fn config ( ) -> Guard < Arc < Config > > {
190
- let cfg = CONFIG . get_or_init ( || async { ArcSwap :: from_pointee ( init_config ( ) . await ) } ) . await ;
191
- cfg. load ( )
192
- }
193
-
194
- /// OnceCell only allows us to initialize the config once and that's how it should be on production.
195
- /// However, when running tests, we often want to reinitialize because we want to clear the DB and
196
- /// set it up again for reuse in new tests. By calling `config_force_init` we replace the already
197
- /// stored config inside `ArcSwap` with the new configuration and pool settings.
198
- #[ cfg( test) ]
199
- pub async fn config_force_init ( config : Config ) {
200
- match CONFIG . get ( ) {
201
- Some ( arc) => arc. store ( Arc :: new ( config) ) ,
202
- None => {
203
- CONFIG . get_or_init ( || async { ArcSwap :: from_pointee ( config) } ) . await ;
204
- }
205
- }
206
- }
207
-
208
185
/// Builds the DA client based on the environment variable DA_LAYER
209
186
pub async fn build_da_client ( settings_provider : & impl Settings ) -> Box < dyn DaClient + Send + Sync > {
210
187
match get_env_var_or_panic ( "DA_LAYER" ) . as_str ( ) {
@@ -246,7 +223,7 @@ pub async fn build_settlement_client(settings_provider: &impl Settings) -> Box<d
246
223
247
224
pub async fn build_storage_client (
248
225
settings_provider : & impl Settings ,
249
- provider_config : ProviderConfig ,
226
+ provider_config : Arc < ProviderConfig > ,
250
227
) -> Box < dyn DataStorage + Send + Sync > {
251
228
match get_env_var_or_panic ( "DATA_STORAGE" ) . as_str ( ) {
252
229
"s3" => Box :: new ( AWSS3 :: new_with_settings ( settings_provider, provider_config) . await ) ,
@@ -256,7 +233,7 @@ pub async fn build_storage_client(
256
233
257
234
pub async fn build_alert_client (
258
235
settings_provider : & impl Settings ,
259
- provider_config : ProviderConfig ,
236
+ provider_config : Arc < ProviderConfig > ,
260
237
) -> Box < dyn Alerts + Send + Sync > {
261
238
match get_env_var_or_panic ( "ALERTS" ) . as_str ( ) {
262
239
"sns" => Box :: new ( AWSSNS :: new_with_settings ( settings_provider, provider_config) . await ) ,
0 commit comments