Allow to set concurrency in Esplora config and optionally pass it in repl
This commit is contained in:
		
							parent
							
								
									4c59809f8e
								
							
						
					
					
						commit
						c9079a7292
					
				| @ -95,6 +95,9 @@ fn main() { | ||||
|     let config = match matches.value_of("esplora") { | ||||
|         Some(base_url) => AnyBlockchainConfig::Esplora(EsploraBlockchainConfig { | ||||
|             base_url: base_url.to_string(), | ||||
|             concurrency: matches | ||||
|                 .value_of("esplora_concurrency") | ||||
|                 .and_then(|v| v.parse::<u8>().ok()), | ||||
|         }), | ||||
|         None => AnyBlockchainConfig::Electrum(ElectrumBlockchainConfig { | ||||
|             url: matches.value_of("server").unwrap().to_string(), | ||||
|  | ||||
| @ -52,7 +52,7 @@ | ||||
| //!
 | ||||
| //! # #[cfg(feature = "esplora")]
 | ||||
| //! # {
 | ||||
| //! let esplora_blockchain = EsploraBlockchain::new("...");
 | ||||
| //! let esplora_blockchain = EsploraBlockchain::new("...", None);
 | ||||
| //! let wallet_esplora: Wallet<AnyBlockchain, _> = Wallet::new(
 | ||||
| //!     "...",
 | ||||
| //!     None,
 | ||||
|  | ||||
| @ -31,7 +31,7 @@ | ||||
| //!
 | ||||
| //! ```no_run
 | ||||
| //! # use bdk::blockchain::esplora::EsploraBlockchain;
 | ||||
| //! let blockchain = EsploraBlockchain::new("https://blockstream.info/testnet/api");
 | ||||
| //! let blockchain = EsploraBlockchain::new("https://blockstream.info/testnet/api", None);
 | ||||
| //! # Ok::<(), bdk::Error>(())
 | ||||
| //! ```
 | ||||
| 
 | ||||
| @ -59,7 +59,7 @@ use crate::error::Error; | ||||
| use crate::wallet::utils::ChunksIterator; | ||||
| use crate::FeeRate; | ||||
| 
 | ||||
| const CONCURRENT: usize = 4; | ||||
| const DEFAULT_CONCURRENT_REQUESTS: u8 = 4; | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| struct UrlClient { | ||||
| @ -67,6 +67,7 @@ struct UrlClient { | ||||
|     // We use the async client instead of the blocking one because it automatically uses `fetch`
 | ||||
|     // when the target platform is wasm32.
 | ||||
|     client: Client, | ||||
|     concurrency: u8, | ||||
| } | ||||
| 
 | ||||
| /// Structure that implements the logic to sync with Esplora
 | ||||
| @ -84,10 +85,11 @@ impl std::convert::From<UrlClient> for EsploraBlockchain { | ||||
| 
 | ||||
| impl EsploraBlockchain { | ||||
|     /// Create a new instance of the client from a base URL
 | ||||
|     pub fn new(base_url: &str) -> Self { | ||||
|     pub fn new(base_url: &str, concurrency: Option<u8>) -> Self { | ||||
|         EsploraBlockchain(UrlClient { | ||||
|             url: base_url.to_string(), | ||||
|             client: Client::new(), | ||||
|             concurrency: concurrency.unwrap_or(DEFAULT_CONCURRENT_REQUESTS), | ||||
|         }) | ||||
|     } | ||||
| } | ||||
| @ -305,7 +307,7 @@ impl ElectrumLikeSync for UrlClient { | ||||
|     ) -> Result<Vec<Vec<ELSGetHistoryRes>>, Error> { | ||||
|         let future = async { | ||||
|             let mut results = vec![]; | ||||
|             for chunk in ChunksIterator::new(scripts.into_iter(), CONCURRENT) { | ||||
|             for chunk in ChunksIterator::new(scripts.into_iter(), self.concurrency as usize) { | ||||
|                 let mut futs = FuturesOrdered::new(); | ||||
|                 for script in chunk { | ||||
|                     futs.push(self._script_get_history(&script)); | ||||
| @ -325,7 +327,7 @@ impl ElectrumLikeSync for UrlClient { | ||||
|     ) -> Result<Vec<Transaction>, Error> { | ||||
|         let future = async { | ||||
|             let mut results = vec![]; | ||||
|             for chunk in ChunksIterator::new(txids.into_iter(), CONCURRENT) { | ||||
|             for chunk in ChunksIterator::new(txids.into_iter(), self.concurrency as usize) { | ||||
|                 let mut futs = FuturesOrdered::new(); | ||||
|                 for txid in chunk { | ||||
|                     futs.push(self._get_tx_no_opt(&txid)); | ||||
| @ -345,7 +347,7 @@ impl ElectrumLikeSync for UrlClient { | ||||
|     ) -> Result<Vec<BlockHeader>, Error> { | ||||
|         let future = async { | ||||
|             let mut results = vec![]; | ||||
|             for chunk in ChunksIterator::new(heights.into_iter(), CONCURRENT) { | ||||
|             for chunk in ChunksIterator::new(heights.into_iter(), self.concurrency as usize) { | ||||
|                 let mut futs = FuturesOrdered::new(); | ||||
|                 for height in chunk { | ||||
|                     futs.push(self._get_header(height)); | ||||
| @ -404,13 +406,17 @@ impl Into<BlockHeader> for EsploraHeader { | ||||
| #[derive(Debug, serde::Deserialize, serde::Serialize)] | ||||
| pub struct EsploraBlockchainConfig { | ||||
|     pub base_url: String, | ||||
|     pub concurrency: Option<u8>, | ||||
| } | ||||
| 
 | ||||
| impl ConfigurableBlockchain for EsploraBlockchain { | ||||
|     type Config = EsploraBlockchainConfig; | ||||
| 
 | ||||
|     fn from_config(config: &Self::Config) -> Result<Self, Error> { | ||||
|         Ok(EsploraBlockchain::new(config.base_url.as_str())) | ||||
|         Ok(EsploraBlockchain::new( | ||||
|             config.base_url.as_str(), | ||||
|             config.concurrency, | ||||
|         )) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										25
									
								
								src/cli.rs
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								src/cli.rs
									
									
									
									
									
								
							| @ -362,14 +362,23 @@ pub fn add_global_flags<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> { | ||||
|         ); | ||||
| 
 | ||||
|     if cfg!(feature = "esplora") { | ||||
|         app = app.arg( | ||||
|             Arg::with_name("esplora") | ||||
|                 .short("e") | ||||
|                 .long("esplora") | ||||
|                 .value_name("ESPLORA") | ||||
|                 .help("Use the esplora server if given as parameter") | ||||
|                 .takes_value(true), | ||||
|         ); | ||||
|         app = app | ||||
|             .arg( | ||||
|                 Arg::with_name("esplora") | ||||
|                     .short("e") | ||||
|                     .long("esplora") | ||||
|                     .value_name("ESPLORA") | ||||
|                     .help("Use the esplora server if given as parameter") | ||||
|                     .takes_value(true), | ||||
|             ) | ||||
|             .arg( | ||||
|                 Arg::with_name("esplora_concurrency") | ||||
|                     .long("esplora_concurrency") | ||||
|                     .value_name("ESPLORA_CONCURRENCY") | ||||
|                     .help("Concurrency of requests made to the esplora server") | ||||
|                     .default_value("4") | ||||
|                     .takes_value(true), | ||||
|             ) | ||||
|     } | ||||
| 
 | ||||
|     if cfg!(feature = "electrum") { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user