@@ -12,10 +12,6 @@ import { isBrowser, isNode } from "../util";
12
12
export class IsomorphicFetchHttpLibrary implements HttpLibrary {
13
13
public debug = false ;
14
14
public zstdCompressorCallback : ZstdCompressorCallback | undefined ;
15
- public enableRetry ! : boolean ;
16
- public maxRetries ! : number ;
17
- public backoffBase ! : number ;
18
- public backoffMultiplier ! : number ;
19
15
20
16
public send ( request : RequestContext ) : Promise < ResponseContext > {
21
17
if ( this . debug ) {
@@ -56,67 +52,59 @@ export class IsomorphicFetchHttpLibrary implements HttpLibrary {
56
52
}
57
53
}
58
54
59
- let currentAttempt = 0 ;
55
+ let resultPromise : Promise < ResponseContext > ;
56
+
60
57
// On non-node environments, use native fetch if available.
61
58
// `cross-fetch` incorrectly assumes all browsers have XHR available.
62
59
// See https://github.com/lquixada/cross-fetch/issues/78
63
60
// TODO: Remove once once above issue is resolved.
64
- const fetchFunction = ( ! isNode && typeof fetch === "function" ) ? fetch : crossFetch ;
65
-
66
- const executeRequest = ( ) : Promise < ResponseContext > => {
67
- return fetchFunction ( request . getUrl ( ) , {
61
+ if ( ! isNode && typeof fetch === "function" ) {
62
+ resultPromise = fetch ( request . getUrl ( ) , {
68
63
method : method ,
69
64
body : body as any ,
70
65
headers : headers ,
71
66
signal : request . getHttpConfig ( ) . signal ,
72
67
} ) . then ( ( resp : any ) => {
73
- const responseHeaders : { [ name : string ] : string } = { } ;
68
+ const headers : { [ name : string ] : string } = { } ;
74
69
resp . headers . forEach ( ( value : string , name : string ) => {
75
- responseHeaders [ name ] = value ;
70
+ headers [ name ] = value ;
76
71
} ) ;
77
-
78
- const responseBody = {
72
+
73
+ const body = {
79
74
text : ( ) => resp . text ( ) ,
80
75
binary : ( ) => resp . buffer ( ) ,
81
76
} ;
82
-
83
- const response = new ResponseContext ( resp . status , responseHeaders , responseBody ) ;
84
-
77
+ const response = new ResponseContext ( resp . status , headers , body ) ;
85
78
if ( this . debug ) {
86
79
this . logResponse ( response ) ;
87
80
}
88
-
89
- if ( this . shouldRetry ( this . enableRetry , currentAttempt , this . maxRetries , response . httpStatusCode ) ) {
90
- const delay = this . calculateRetryInterval ( currentAttempt , this . backoffBase , this . backoffMultiplier , headers ) ;
91
- currentAttempt ++ ;
92
- return this . sleep ( delay * 1000 ) . then ( ( ) => executeRequest ( ) ) ;
93
- }
94
81
return response ;
95
82
} ) ;
96
- } ;
97
-
98
- const resultPromise : Promise < ResponseContext > = executeRequest ( ) ;
99
- return resultPromise ;
100
- }
101
-
102
- private sleep ( milliseconds : number ) : Promise < void > {
103
- return new Promise ( ( resolve ) => {
104
- setTimeout ( resolve , milliseconds ) ;
105
- } ) ;
106
- }
107
-
108
- private shouldRetry ( enableRetry :boolean , currentAttempt :number , maxRetries :number , responseCode :number ) :boolean {
109
- return ( responseCode == 429 || responseCode >= 500 ) && maxRetries > currentAttempt && enableRetry
110
- }
111
-
112
- private calculateRetryInterval ( currentAttempt :number , backoffBase :number , backoffMultiplier :number , headers : { [ name : string ] : string } ) : number {
113
- if ( "x-ratelimit-reset" in headers ) {
114
- const rateLimitHeaderString = headers [ "x-ratelimit-reset" ]
115
- const retryIntervalFromHeader = parseInt ( rateLimitHeaderString , 10 ) ;
116
- return retryIntervalFromHeader
117
83
} else {
118
- return ( backoffMultiplier ** currentAttempt ) * backoffBase
84
+ resultPromise = crossFetch ( request . getUrl ( ) , {
85
+ method : method ,
86
+ body : body as any ,
87
+ headers : headers ,
88
+ signal : request . getHttpConfig ( ) . signal ,
89
+ } ) . then ( ( resp : any ) => {
90
+ const headers : { [ name : string ] : string } = { } ;
91
+ resp . headers . forEach ( ( value : string , name : string ) => {
92
+ headers [ name ] = value ;
93
+ } ) ;
94
+
95
+ const body = {
96
+ text : ( ) => resp . text ( ) ,
97
+ binary : ( ) => resp . buffer ( ) ,
98
+ } ;
99
+ const response = new ResponseContext ( resp . status , headers , body ) ;
100
+ if ( this . debug ) {
101
+ this . logResponse ( response ) ;
102
+ }
103
+ return response ;
104
+ } ) ;
119
105
}
106
+
107
+ return resultPromise ;
120
108
}
121
109
122
110
private logRequest ( request : RequestContext ) : void {
0 commit comments