@@ -32,7 +32,6 @@ use std::time::Duration;
32
32
use crate :: rpc_service:: RpcService ;
33
33
use crate :: transport:: { self , Error as TransportError , HttpBackend , HttpTransportClientBuilder } ;
34
34
use crate :: { HttpRequest , HttpResponse } ;
35
- use async_trait:: async_trait;
36
35
use hyper:: body:: Bytes ;
37
36
use hyper:: http:: { Extensions , HeaderMap } ;
38
37
use jsonrpsee_core:: client:: {
@@ -350,150 +349,157 @@ impl HttpClient<HttpBackend> {
350
349
}
351
350
}
352
351
353
- #[ async_trait]
354
352
impl < S > ClientT for HttpClient < S >
355
353
where
356
354
S : RpcServiceT < Error = Error , Response = MethodResponse > + Send + Sync ,
357
355
{
358
- async fn notification < Params > ( & self , method : & str , params : Params ) -> Result < ( ) , Error >
356
+ fn notification < Params > ( & self , method : & str , params : Params ) -> impl Future < Output = Result < ( ) , Error > > + Send
359
357
where
360
358
Params : ToRpcParams + Send ,
361
359
{
362
- let _permit = match self . request_guard . as_ref ( ) {
363
- Some ( permit) => permit. acquire ( ) . await . ok ( ) ,
364
- None => None ,
365
- } ;
366
- let params = params. to_rpc_params ( ) ?. map ( StdCow :: Owned ) ;
367
-
368
- run_future_until_timeout (
369
- self . service . notification ( Notification :: new ( method. into ( ) , params) ) ,
370
- self . request_timeout ,
371
- )
372
- . await
373
- . map_err ( |e| Error :: Transport ( e. into ( ) ) ) ?;
374
- Ok ( ( ) )
360
+ async {
361
+ let _permit = match self . request_guard . as_ref ( ) {
362
+ Some ( permit) => permit. acquire ( ) . await . ok ( ) ,
363
+ None => None ,
364
+ } ;
365
+ let params = params. to_rpc_params ( ) ?. map ( StdCow :: Owned ) ;
366
+
367
+ run_future_until_timeout (
368
+ self . service . notification ( Notification :: new ( method. into ( ) , params) ) ,
369
+ self . request_timeout ,
370
+ )
371
+ . await
372
+ . map_err ( |e| Error :: Transport ( e. into ( ) ) ) ?;
373
+ Ok ( ( ) )
374
+ }
375
375
}
376
376
377
- async fn request < R , Params > ( & self , method : & str , params : Params ) -> Result < R , Error >
377
+ fn request < R , Params > ( & self , method : & str , params : Params ) -> impl Future < Output = Result < R , Error > > + Send
378
378
where
379
379
R : DeserializeOwned ,
380
380
Params : ToRpcParams + Send ,
381
381
{
382
- let _permit = match self . request_guard . as_ref ( ) {
383
- Some ( permit) => permit. acquire ( ) . await . ok ( ) ,
384
- None => None ,
385
- } ;
386
- let id = self . id_manager . next_request_id ( ) ;
387
- let params = params. to_rpc_params ( ) ?;
388
-
389
- let method_response = run_future_until_timeout (
390
- self . service . call ( Request :: borrowed ( method, params. as_deref ( ) , id. clone ( ) ) ) ,
391
- self . request_timeout ,
392
- )
393
- . await ?
394
- . into_method_call ( )
395
- . expect ( "Method call must return a method call reponse; qed" ) ;
396
-
397
- let rp = ResponseSuccess :: try_from ( method_response. into_inner ( ) ) ?;
398
-
399
- let result = serde_json:: from_str ( rp. result . get ( ) ) . map_err ( Error :: ParseError ) ?;
400
- if rp. id == id { Ok ( result) } else { Err ( InvalidRequestId :: NotPendingRequest ( rp. id . to_string ( ) ) . into ( ) ) }
382
+ async {
383
+ let _permit = match self . request_guard . as_ref ( ) {
384
+ Some ( permit) => permit. acquire ( ) . await . ok ( ) ,
385
+ None => None ,
386
+ } ;
387
+ let id = self . id_manager . next_request_id ( ) ;
388
+ let params = params. to_rpc_params ( ) ?;
389
+
390
+ let method_response = run_future_until_timeout (
391
+ self . service . call ( Request :: borrowed ( method, params. as_deref ( ) , id. clone ( ) ) ) ,
392
+ self . request_timeout ,
393
+ )
394
+ . await ?
395
+ . into_method_call ( )
396
+ . expect ( "Method call must return a method call reponse; qed" ) ;
397
+
398
+ let rp = ResponseSuccess :: try_from ( method_response. into_inner ( ) ) ?;
399
+
400
+ let result = serde_json:: from_str ( rp. result . get ( ) ) . map_err ( Error :: ParseError ) ?;
401
+ if rp. id == id { Ok ( result) } else { Err ( InvalidRequestId :: NotPendingRequest ( rp. id . to_string ( ) ) . into ( ) ) }
402
+ }
401
403
}
402
404
403
- async fn batch_request < ' a , R > ( & self , batch : BatchRequestBuilder < ' a > ) -> Result < BatchResponse < ' a , R > , Error >
405
+ fn batch_request < ' a , R > (
406
+ & self ,
407
+ batch : BatchRequestBuilder < ' a > ,
408
+ ) -> impl Future < Output = Result < BatchResponse < ' a , R > , Error > > + Send
404
409
where
405
410
R : DeserializeOwned + fmt:: Debug + ' a ,
406
411
{
407
- let _permit = match self . request_guard . as_ref ( ) {
408
- Some ( permit) => permit. acquire ( ) . await . ok ( ) ,
409
- None => None ,
410
- } ;
411
- let batch = batch. build ( ) ?;
412
- let id = self . id_manager . next_request_id ( ) ;
413
- let id_range = generate_batch_id_range ( id, batch. len ( ) as u64 ) ?;
414
-
415
- let mut batch_request = Batch :: with_capacity ( batch. len ( ) ) ;
416
- for ( ( method, params) , id) in batch. into_iter ( ) . zip ( id_range. clone ( ) ) {
417
- let id = self . id_manager . as_id_kind ( ) . into_id ( id) ;
418
- let req = Request {
419
- jsonrpc : TwoPointZero ,
420
- method : method. into ( ) ,
421
- params : params. map ( StdCow :: Owned ) ,
422
- id,
423
- extensions : Extensions :: new ( ) ,
412
+ async {
413
+ let _permit = match self . request_guard . as_ref ( ) {
414
+ Some ( permit) => permit. acquire ( ) . await . ok ( ) ,
415
+ None => None ,
424
416
} ;
425
- batch_request. push ( req) ;
426
- }
427
-
428
- let rp = run_future_until_timeout ( self . service . batch ( batch_request) , self . request_timeout ) . await ?;
429
- let json_rps = rp. into_batch ( ) . expect ( "Batch must return a batch reponse; qed" ) ;
417
+ let batch = batch. build ( ) ?;
418
+ let id = self . id_manager . next_request_id ( ) ;
419
+ let id_range = generate_batch_id_range ( id, batch. len ( ) as u64 ) ?;
420
+
421
+ let mut batch_request = Batch :: with_capacity ( batch. len ( ) ) ;
422
+ for ( ( method, params) , id) in batch. into_iter ( ) . zip ( id_range. clone ( ) ) {
423
+ let id = self . id_manager . as_id_kind ( ) . into_id ( id) ;
424
+ let req = Request {
425
+ jsonrpc : TwoPointZero ,
426
+ method : method. into ( ) ,
427
+ params : params. map ( StdCow :: Owned ) ,
428
+ id,
429
+ extensions : Extensions :: new ( ) ,
430
+ } ;
431
+ batch_request. push ( req) ;
432
+ }
430
433
431
- let mut batch_response = Vec :: new ( ) ;
432
- let mut success = 0 ;
433
- let mut failed = 0 ;
434
+ let rp = run_future_until_timeout ( self . service . batch ( batch_request) , self . request_timeout ) . await ?;
435
+ let json_rps = rp. into_batch ( ) . expect ( "Batch must return a batch reponse; qed" ) ;
434
436
435
- // Fill the batch response with placeholder values.
436
- for _ in 0 ..json_rps. len ( ) {
437
- batch_response. push ( Err ( ErrorObject :: borrowed ( 0 , "" , None ) ) ) ;
438
- }
437
+ let mut batch_response = Vec :: new ( ) ;
438
+ let mut success = 0 ;
439
+ let mut failed = 0 ;
439
440
440
- for rp in json_rps. into_iter ( ) {
441
- let id = rp. id ( ) . try_parse_inner_as_number ( ) ?;
441
+ // Fill the batch response with placeholder values.
442
+ for _ in 0 ..json_rps. len ( ) {
443
+ batch_response. push ( Err ( ErrorObject :: borrowed ( 0 , "" , None ) ) ) ;
444
+ }
442
445
443
- let res = match ResponseSuccess :: try_from ( rp. into_inner ( ) ) {
444
- Ok ( r) => {
445
- let v = serde_json:: from_str ( r. result . get ( ) ) . map_err ( Error :: ParseError ) ?;
446
- success += 1 ;
447
- Ok ( v)
448
- }
449
- Err ( err) => {
450
- failed += 1 ;
451
- Err ( err)
446
+ for rp in json_rps. into_iter ( ) {
447
+ let id = rp. id ( ) . try_parse_inner_as_number ( ) ?;
448
+
449
+ let res = match ResponseSuccess :: try_from ( rp. into_inner ( ) ) {
450
+ Ok ( r) => {
451
+ let v = serde_json:: from_str ( r. result . get ( ) ) . map_err ( Error :: ParseError ) ?;
452
+ success += 1 ;
453
+ Ok ( v)
454
+ }
455
+ Err ( err) => {
456
+ failed += 1 ;
457
+ Err ( err)
458
+ }
459
+ } ;
460
+
461
+ let maybe_elem = id
462
+ . checked_sub ( id_range. start )
463
+ . and_then ( |p| p. try_into ( ) . ok ( ) )
464
+ . and_then ( |p : usize | batch_response. get_mut ( p) ) ;
465
+
466
+ if let Some ( elem) = maybe_elem {
467
+ * elem = res;
468
+ } else {
469
+ return Err ( InvalidRequestId :: NotPendingRequest ( id. to_string ( ) ) . into ( ) ) ;
452
470
}
453
- } ;
454
-
455
- let maybe_elem = id
456
- . checked_sub ( id_range. start )
457
- . and_then ( |p| p. try_into ( ) . ok ( ) )
458
- . and_then ( |p : usize | batch_response. get_mut ( p) ) ;
459
-
460
- if let Some ( elem) = maybe_elem {
461
- * elem = res;
462
- } else {
463
- return Err ( InvalidRequestId :: NotPendingRequest ( id. to_string ( ) ) . into ( ) ) ;
464
471
}
465
- }
466
472
467
- Ok ( BatchResponse :: new ( success, batch_response, failed) )
473
+ Ok ( BatchResponse :: new ( success, batch_response, failed) )
474
+ }
468
475
}
469
476
}
470
477
471
- #[ async_trait]
472
478
impl < S > SubscriptionClientT for HttpClient < S >
473
479
where
474
480
S : RpcServiceT < Error = Error , Response = MethodResponse > + Send + Sync ,
475
481
{
476
482
/// Send a subscription request to the server. Not implemented for HTTP; will always return
477
483
/// [`Error::HttpNotImplemented`].
478
- async fn subscribe < ' a , N , Params > (
484
+ fn subscribe < ' a , N , Params > (
479
485
& self ,
480
486
_subscribe_method : & ' a str ,
481
487
_params : Params ,
482
488
_unsubscribe_method : & ' a str ,
483
- ) -> Result < Subscription < N > , Error >
489
+ ) -> impl Future < Output = Result < Subscription < N > , Error > >
484
490
where
485
491
Params : ToRpcParams + Send ,
486
492
N : DeserializeOwned ,
487
493
{
488
- Err ( Error :: HttpNotImplemented )
494
+ async { Err ( Error :: HttpNotImplemented ) }
489
495
}
490
496
491
497
/// Subscribe to a specific method. Not implemented for HTTP; will always return [`Error::HttpNotImplemented`].
492
- async fn subscribe_to_method < ' a , N > ( & self , _method : & ' a str ) -> Result < Subscription < N > , Error >
498
+ fn subscribe_to_method < N > ( & self , _method : & str ) -> impl Future < Output = Result < Subscription < N > , Error > >
493
499
where
494
500
N : DeserializeOwned ,
495
501
{
496
- Err ( Error :: HttpNotImplemented )
502
+ async { Err ( Error :: HttpNotImplemented ) }
497
503
}
498
504
}
499
505
0 commit comments