14
14
use std:: collections:: HashMap ;
15
15
use std:: str:: FromStr ;
16
16
17
- use arti_client:: { TorClient , TorClientConfig } ;
18
-
19
- use arti_hyper:: ArtiHttpConnector ;
20
-
21
17
use bitcoin:: consensus:: { deserialize, serialize} ;
22
18
use bitcoin:: hashes:: hex:: FromHex ;
23
19
use bitcoin:: hashes:: { sha256, Hash } ;
@@ -26,26 +22,39 @@ use bitcoin::{
26
22
} ;
27
23
use bitcoin_internals:: hex:: display:: DisplayHex ;
28
24
29
- use hyper:: { Body , Response , Uri } ;
30
25
#[ allow( unused_imports) ]
31
26
use log:: { debug, error, info, trace} ;
32
27
33
- use reqwest:: { Client , StatusCode } ;
34
- use tls_api:: { TlsConnector as TlsConnectorTrait , TlsConnectorBuilder } ;
28
+ #[ cfg( feature = "async" ) ]
29
+ use reqwest:: Client ;
30
+
31
+ #[ cfg( feature = "async-arti-hyper" ) ]
32
+ use {
33
+ arti_client:: { TorClient , TorClientConfig } ,
34
+ arti_hyper:: ArtiHttpConnector ,
35
+ hyper:: service:: Service ,
36
+ hyper:: { Body , Request , Response , Uri } ,
37
+ tls_api:: { TlsConnector as TlsConnectorTrait , TlsConnectorBuilder } ,
38
+ tor_rtcompat:: PreferredRuntime ,
39
+ } ;
40
+
41
+ #[ cfg( feature = "async-arti-hyper" ) ]
35
42
#[ cfg( not( target_vendor = "apple" ) ) ]
36
43
use tls_api_native_tls:: TlsConnector ;
44
+ #[ cfg( feature = "async-arti-hyper" ) ]
37
45
#[ cfg( target_vendor = "apple" ) ]
38
46
use tls_api_openssl:: TlsConnector ;
39
- use tor_rtcompat:: PreferredRuntime ;
40
47
41
48
use crate :: { BlockStatus , BlockSummary , Builder , Error , MerkleProof , OutputStatus , Tx , TxStatus } ;
42
49
50
+ #[ cfg( feature = "async" ) ]
43
51
#[ derive( Debug , Clone ) ]
44
52
pub struct AsyncClient {
45
53
url : String ,
46
54
client : Client ,
47
55
}
48
56
57
+ #[ cfg( feature = "async" ) ]
49
58
impl AsyncClient {
50
59
/// build an async client from a builder
51
60
pub fn from_builder ( builder : Builder ) -> Result < Self , Error > {
@@ -77,7 +86,7 @@ impl AsyncClient {
77
86
. send ( )
78
87
. await ?;
79
88
80
- if let StatusCode :: NOT_FOUND = resp. status ( ) {
89
+ if let reqwest :: StatusCode :: NOT_FOUND = resp. status ( ) {
81
90
return Ok ( None ) ;
82
91
}
83
92
@@ -112,7 +121,7 @@ impl AsyncClient {
112
121
. send ( )
113
122
. await ?;
114
123
115
- if let StatusCode :: NOT_FOUND = resp. status ( ) {
124
+ if let reqwest :: StatusCode :: NOT_FOUND = resp. status ( ) {
116
125
return Ok ( None ) ;
117
126
}
118
127
@@ -198,7 +207,7 @@ impl AsyncClient {
198
207
. send ( )
199
208
. await ?;
200
209
201
- if let StatusCode :: NOT_FOUND = resp. status ( ) {
210
+ if let reqwest :: StatusCode :: NOT_FOUND = resp. status ( ) {
202
211
return Ok ( None ) ;
203
212
}
204
213
@@ -220,7 +229,7 @@ impl AsyncClient {
220
229
. send ( )
221
230
. await ?;
222
231
223
- if let StatusCode :: NOT_FOUND = resp. status ( ) {
232
+ if let reqwest :: StatusCode :: NOT_FOUND = resp. status ( ) {
224
233
return Ok ( None ) ;
225
234
}
226
235
@@ -242,7 +251,7 @@ impl AsyncClient {
242
251
. send ( )
243
252
. await ?;
244
253
245
- if let StatusCode :: NOT_FOUND = resp. status ( ) {
254
+ if let reqwest :: StatusCode :: NOT_FOUND = resp. status ( ) {
246
255
return Ok ( None ) ;
247
256
}
248
257
@@ -269,7 +278,7 @@ impl AsyncClient {
269
278
. send ( )
270
279
. await ?;
271
280
272
- if let StatusCode :: NOT_FOUND = resp. status ( ) {
281
+ if let reqwest :: StatusCode :: NOT_FOUND = resp. status ( ) {
273
282
return Ok ( None ) ;
274
283
}
275
284
@@ -346,7 +355,7 @@ impl AsyncClient {
346
355
. send ( )
347
356
. await ?;
348
357
349
- if let StatusCode :: NOT_FOUND = resp. status ( ) {
358
+ if let reqwest :: StatusCode :: NOT_FOUND = resp. status ( ) {
350
359
return Err ( Error :: HeaderHeightNotFound ( block_height) ) ;
351
360
}
352
361
@@ -441,12 +450,14 @@ impl AsyncClient {
441
450
}
442
451
}
443
452
453
+ #[ cfg( feature = "async-arti-hyper" ) ]
444
454
#[ derive( Debug , Clone ) ]
445
455
pub struct AsyncAnonymizedClient {
446
456
url : String ,
447
457
client : hyper:: Client < ArtiHttpConnector < PreferredRuntime , TlsConnector > > ,
448
458
}
449
459
460
+ #[ cfg( feature = "async-arti-hyper" ) ]
450
461
impl AsyncAnonymizedClient {
451
462
/// build an async [`TorClient`] with default Tor configuration
452
463
async fn create_tor_client ( ) -> Result < TorClient < PreferredRuntime > , arti_client:: Error > {
@@ -485,7 +496,7 @@ impl AsyncAnonymizedClient {
485
496
486
497
let resp = self . client . get ( uri) . await ?;
487
498
488
- if let StatusCode :: NOT_FOUND = resp. status ( ) {
499
+ if let hyper :: StatusCode :: NOT_FOUND = resp. status ( ) {
489
500
return Ok ( None ) ;
490
501
}
491
502
@@ -521,7 +532,7 @@ impl AsyncAnonymizedClient {
521
532
522
533
let resp = self . client . get ( uri) . await ?;
523
534
524
- if let StatusCode :: NOT_FOUND = resp. status ( ) {
535
+ if let hyper :: StatusCode :: NOT_FOUND = resp. status ( ) {
525
536
return Ok ( None ) ;
526
537
}
527
538
@@ -604,7 +615,7 @@ impl AsyncAnonymizedClient {
604
615
let uri = Uri :: from_str ( & path) . map_err ( |_| Error :: InvalidUri ) ?;
605
616
let resp = self . client . get ( uri) . await ?;
606
617
607
- if let StatusCode :: NOT_FOUND = resp. status ( ) {
618
+ if let hyper :: StatusCode :: NOT_FOUND = resp. status ( ) {
608
619
return Ok ( None ) ;
609
620
}
610
621
@@ -627,7 +638,7 @@ impl AsyncAnonymizedClient {
627
638
628
639
let resp = self . client . get ( uri) . await ?;
629
640
630
- if let StatusCode :: NOT_FOUND = resp. status ( ) {
641
+ if let hyper :: StatusCode :: NOT_FOUND = resp. status ( ) {
631
642
return Ok ( None ) ;
632
643
}
633
644
@@ -652,7 +663,7 @@ impl AsyncAnonymizedClient {
652
663
653
664
let resp = self . client . get ( uri) . await ?;
654
665
655
- if let StatusCode :: NOT_FOUND = resp. status ( ) {
666
+ if let hyper :: StatusCode :: NOT_FOUND = resp. status ( ) {
656
667
return Ok ( None ) ;
657
668
}
658
669
@@ -678,7 +689,7 @@ impl AsyncAnonymizedClient {
678
689
let uri = Uri :: from_str ( path) . map_err ( |_| Error :: InvalidUri ) ?;
679
690
let resp = self . client . get ( uri) . await ?;
680
691
681
- if let StatusCode :: NOT_FOUND = resp. status ( ) {
692
+ if let hyper :: StatusCode :: NOT_FOUND = resp. status ( ) {
682
693
return Ok ( None ) ;
683
694
}
684
695
@@ -698,23 +709,26 @@ impl AsyncAnonymizedClient {
698
709
}
699
710
700
711
// /// Broadcast a [`Transaction`] to Esplora
701
- // pub async fn broadcast(&self, transaction: &Transaction) -> Result<(), Error> {
702
- // let resp = self
703
- // .client
704
- // .post(&format!("{}/tx", self.url))
705
- // .body(serialize(transaction).to_lower_hex_string())
706
- // .send()
707
- // .await?;
708
-
709
- // if resp.status().is_server_error() || resp.status().is_client_error() {
710
- // Err(Error::HttpResponse {
711
- // status: resp.status().as_u16(),
712
- // message: resp.text().await?,
713
- // })
714
- // } else {
715
- // Ok(())
716
- // }
717
- // }
712
+ pub async fn broadcast ( & mut self , transaction : & Transaction ) -> Result < ( ) , Error > {
713
+ let path = & format ! ( "{}/tx" , self . url) ;
714
+ let uri = Uri :: from_str ( path) . map_err ( |_| Error :: InvalidUri ) ?;
715
+
716
+ let body = Body :: from ( serialize ( transaction) . to_lower_hex_string ( ) ) ;
717
+ let req = Request :: post ( uri)
718
+ . body ( body)
719
+ . map_err ( |_| Error :: InvalidBody ) ?;
720
+
721
+ let resp = self . client . call ( req) . await ?;
722
+
723
+ if resp. status ( ) . is_server_error ( ) || resp. status ( ) . is_client_error ( ) {
724
+ Err ( Error :: HttpResponse {
725
+ status : resp. status ( ) . as_u16 ( ) ,
726
+ message : Self :: text ( resp) . await ?,
727
+ } )
728
+ } else {
729
+ Ok ( ( ) )
730
+ }
731
+ }
718
732
719
733
/// Get the current height of the blockchain tip
720
734
pub async fn get_height ( & self ) -> Result < u32 , Error > {
@@ -761,7 +775,7 @@ impl AsyncAnonymizedClient {
761
775
let uri = Uri :: from_str ( path) . map_err ( |_| Error :: InvalidUri ) ?;
762
776
let resp = self . client . get ( uri) . await ?;
763
777
764
- if let StatusCode :: NOT_FOUND = resp. status ( ) {
778
+ if let hyper :: StatusCode :: NOT_FOUND = resp. status ( ) {
765
779
return Err ( Error :: HeaderHeightNotFound ( block_height) ) ;
766
780
}
767
781
0 commit comments