@@ -30,7 +30,7 @@ use std::time::Duration;
30
30
use crate :: transport:: HttpTransportClient ;
31
31
use crate :: types:: { ErrorResponse , Id , NotificationSer , ParamsSer , RequestSer , Response } ;
32
32
use async_trait:: async_trait;
33
- use jsonrpsee_core:: client:: { CertificateStore , ClientT , RequestIdManager , Subscription , SubscriptionClientT } ;
33
+ use jsonrpsee_core:: client:: { CertificateStore , ClientT , IdKind , RequestIdManager , Subscription , SubscriptionClientT } ;
34
34
use jsonrpsee_core:: { Error , TEN_MB_SIZE_BYTES } ;
35
35
use rustc_hash:: FxHashMap ;
36
36
use serde:: de:: DeserializeOwned ;
@@ -42,6 +42,7 @@ pub struct HttpClientBuilder {
42
42
request_timeout : Duration ,
43
43
max_concurrent_requests : usize ,
44
44
certificate_store : CertificateStore ,
45
+ id_kind : IdKind ,
45
46
}
46
47
47
48
impl HttpClientBuilder {
@@ -69,13 +70,19 @@ impl HttpClientBuilder {
69
70
self
70
71
}
71
72
73
+ /// Configure the data type of the request object ID (default is number).
74
+ pub fn id_format ( mut self , id_kind : IdKind ) -> Self {
75
+ self . id_kind = id_kind;
76
+ self
77
+ }
78
+
72
79
/// Build the HTTP client with target to connect to.
73
80
pub fn build ( self , target : impl AsRef < str > ) -> Result < HttpClient , Error > {
74
81
let transport = HttpTransportClient :: new ( target, self . max_request_body_size , self . certificate_store )
75
82
. map_err ( |e| Error :: Transport ( e. into ( ) ) ) ?;
76
83
Ok ( HttpClient {
77
84
transport,
78
- id_manager : Arc :: new ( RequestIdManager :: new ( self . max_concurrent_requests ) ) ,
85
+ id_manager : Arc :: new ( RequestIdManager :: new ( self . max_concurrent_requests , self . id_kind ) ) ,
79
86
request_timeout : self . request_timeout ,
80
87
} )
81
88
}
@@ -88,6 +95,7 @@ impl Default for HttpClientBuilder {
88
95
request_timeout : Duration :: from_secs ( 60 ) ,
89
96
max_concurrent_requests : 256 ,
90
97
certificate_store : CertificateStore :: Native ,
98
+ id_kind : IdKind :: Number ,
91
99
}
92
100
}
93
101
}
@@ -120,8 +128,9 @@ impl ClientT for HttpClient {
120
128
where
121
129
R : DeserializeOwned ,
122
130
{
123
- let id = self . id_manager . next_request_id ( ) ?;
124
- let request = RequestSer :: new ( Id :: Number ( * id. inner ( ) ) , method, params) ;
131
+ let guard = self . id_manager . next_request_id ( ) ?;
132
+ let id = guard. inner ( ) ;
133
+ let request = RequestSer :: new ( & id, method, params) ;
125
134
126
135
let fut = self . transport . send_and_read_body ( serde_json:: to_string ( & request) . map_err ( Error :: ParseError ) ?) ;
127
136
let body = match tokio:: time:: timeout ( self . request_timeout , fut) . await {
@@ -142,9 +151,7 @@ impl ClientT for HttpClient {
142
151
}
143
152
} ;
144
153
145
- let response_id = response. id . as_number ( ) . copied ( ) . ok_or ( Error :: InvalidRequestId ) ?;
146
-
147
- if response_id == * id. inner ( ) {
154
+ if response. id == id {
148
155
Ok ( response. result )
149
156
} else {
150
157
Err ( Error :: InvalidRequestId )
@@ -155,16 +162,18 @@ impl ClientT for HttpClient {
155
162
where
156
163
R : DeserializeOwned + Default + Clone ,
157
164
{
165
+ let guard = self . id_manager . next_request_ids ( batch. len ( ) ) ?;
166
+ let ids: Vec < Id > = guard. inner ( ) ;
167
+
158
168
let mut batch_request = Vec :: with_capacity ( batch. len ( ) ) ;
159
169
// NOTE(niklasad1): `ID` is not necessarily monotonically increasing.
160
170
let mut ordered_requests = Vec :: with_capacity ( batch. len ( ) ) ;
161
171
let mut request_set = FxHashMap :: with_capacity_and_hasher ( batch. len ( ) , Default :: default ( ) ) ;
162
172
163
- let ids = self . id_manager . next_request_ids ( batch. len ( ) ) ?;
164
173
for ( pos, ( method, params) ) in batch. into_iter ( ) . enumerate ( ) {
165
- batch_request. push ( RequestSer :: new ( Id :: Number ( ids. inner ( ) [ pos] ) , method, params) ) ;
166
- ordered_requests. push ( ids. inner ( ) [ pos] ) ;
167
- request_set. insert ( ids. inner ( ) [ pos] , pos) ;
174
+ batch_request. push ( RequestSer :: new ( & ids[ pos] , method, params) ) ;
175
+ ordered_requests. push ( & ids[ pos] ) ;
176
+ request_set. insert ( & ids[ pos] , pos) ;
168
177
}
169
178
170
179
let fut = self . transport . send_and_read_body ( serde_json:: to_string ( & batch_request) . map_err ( Error :: ParseError ) ?) ;
@@ -184,8 +193,7 @@ impl ClientT for HttpClient {
184
193
// NOTE: `R::default` is placeholder and will be replaced in loop below.
185
194
let mut responses = vec ! [ R :: default ( ) ; ordered_requests. len( ) ] ;
186
195
for rp in rps {
187
- let response_id = rp. id . as_number ( ) . copied ( ) . ok_or ( Error :: InvalidRequestId ) ?;
188
- let pos = match request_set. get ( & response_id) {
196
+ let pos = match request_set. get ( & rp. id ) {
189
197
Some ( pos) => * pos,
190
198
None => return Err ( Error :: InvalidRequestId ) ,
191
199
} ;
0 commit comments