@@ -4,7 +4,6 @@ use crate::{
4
4
error:: { Error , RateLimit , Result , TransportError } ,
5
5
helpers, BatchTransport , RequestId , Transport ,
6
6
} ;
7
- use async_recursion:: async_recursion;
8
7
use chrono:: { DateTime , Utc } ;
9
8
use core:: time:: Duration ;
10
9
#[ cfg( not( feature = "wasm" ) ) ]
@@ -166,57 +165,58 @@ fn extract_retry_after_value(headers: &HeaderMap) -> DelayAfter {
166
165
DelayAfter :: Date ( header. to_string ( ) )
167
166
}
168
167
169
- #[ async_recursion]
170
- async fn execute_rpc_with_retries < T : DeserializeOwned + std:: marker:: Send > (
171
- client : & Client ,
168
+ fn execute_rpc_with_retries < ' a , T : DeserializeOwned + std:: marker:: Send > (
169
+ client : & ' a Client ,
172
170
url : Url ,
173
- request : & Request ,
171
+ request : & ' a Request ,
174
172
id : RequestId ,
175
173
retries : Retries ,
176
- ) -> Result < T > {
177
- match execute_rpc ( client, url. clone ( ) , request, id) . await {
178
- Ok ( output) => Ok ( output) ,
179
- Err ( Error :: Transport ( error) ) => match error {
180
- TransportError :: Code ( code) => {
181
- if retries. max_retries <= 0
182
- || retries. sleep_for <= Duration :: from_secs ( 0 )
183
- || ( code != 429 && code < 500 )
184
- {
185
- return Err ( Error :: Transport ( error) ) ;
186
- }
174
+ ) -> BoxFuture < ' a , Result < T > > {
175
+ Box :: pin ( async move {
176
+ match execute_rpc ( client, url. clone ( ) , request, id) . await {
177
+ Ok ( output) => Ok ( output) ,
178
+ Err ( Error :: Transport ( error) ) => match error {
179
+ TransportError :: Code ( code) => {
180
+ if retries. max_retries <= 0
181
+ || retries. sleep_for <= Duration :: from_secs ( 0 )
182
+ || ( code != 429 && code < 500 )
183
+ {
184
+ return Err ( Error :: Transport ( error) ) ;
185
+ }
187
186
188
- Delay :: new ( retries. sleep_for ) . await ;
189
- execute_rpc_with_retries ( client, url, request, id, retries. step ( ) ) . await
190
- }
191
- TransportError :: Message ( message) => Err ( Error :: Transport ( TransportError :: Message ( message) ) ) ,
192
- TransportError :: RateLimit ( limit) => {
193
- if !retries. use_retry_after_header && retries. max_retries <= 0 {
194
- return Err ( Error :: Transport ( TransportError :: Code ( 429 ) ) ) ;
187
+ Delay :: new ( retries. sleep_for ) . await ;
188
+ execute_rpc_with_retries ( client, url, request, id, retries. step ( ) ) . await
195
189
}
190
+ TransportError :: Message ( message) => Err ( Error :: Transport ( TransportError :: Message ( message) ) ) ,
191
+ TransportError :: RateLimit ( limit) => {
192
+ if !retries. use_retry_after_header && retries. max_retries <= 0 {
193
+ return Err ( Error :: Transport ( TransportError :: Code ( 429 ) ) ) ;
194
+ }
196
195
197
- match limit {
198
- RateLimit :: Date ( date) => {
199
- let Ok ( until) = DateTime :: parse_from_rfc2822 ( & date) else {
200
- return Err ( Error :: Transport ( TransportError :: Code ( 429 ) ) ) ;
201
- } ;
196
+ match limit {
197
+ RateLimit :: Date ( date) => {
198
+ let Ok ( until) = DateTime :: parse_from_rfc2822 ( & date) else {
199
+ return Err ( Error :: Transport ( TransportError :: Code ( 429 ) ) ) ;
200
+ } ;
202
201
203
- let from_now = until. with_timezone ( & Utc :: now ( ) . timezone ( ) ) - Utc :: now ( ) ;
204
- let secs = from_now. num_seconds ( ) + 1 ; // +1 for rounding
205
- if secs > 0 {
206
- Delay :: new ( Duration :: from_secs ( secs as u64 ) ) . await ;
207
- }
202
+ let from_now = until. with_timezone ( & Utc :: now ( ) . timezone ( ) ) - Utc :: now ( ) ;
203
+ let secs = from_now. num_seconds ( ) + 1 ; // +1 for rounding
204
+ if secs > 0 {
205
+ Delay :: new ( Duration :: from_secs ( secs as u64 ) ) . await ;
206
+ }
208
207
209
- execute_rpc_with_retries ( client, url, request, id, retries. step ( ) ) . await
210
- }
211
- RateLimit :: Seconds ( seconds) => {
212
- Delay :: new ( Duration :: from_secs ( seconds) ) . await ;
213
- execute_rpc_with_retries ( client, url, request, id, retries. step ( ) ) . await
208
+ execute_rpc_with_retries ( client, url, request, id, retries. step ( ) ) . await
209
+ }
210
+ RateLimit :: Seconds ( seconds) => {
211
+ Delay :: new ( Duration :: from_secs ( seconds) ) . await ;
212
+ execute_rpc_with_retries ( client, url, request, id, retries. step ( ) ) . await
213
+ }
214
214
}
215
215
}
216
- }
217
- } ,
218
- Err ( err ) => Err ( err ) ,
219
- }
216
+ } ,
217
+ Err ( err ) => Err ( err ) ,
218
+ }
219
+ } )
220
220
}
221
221
222
222
type RpcResult = Result < Value > ;
0 commit comments