@@ -69,8 +69,12 @@ export function ConcurrencyQueue ({ axios, config }) {
6969 }
7070 }
7171
72- // Request interseptor to queue the request
72+ // Request interceptor to queue the request
7373 const requestHandler = request => {
74+ if ( typeof request . data === 'function' ) {
75+ request . formdata = request . data
76+ request . data = transformFormData ( request )
77+ }
7478 request . retryCount = request . retryCount || 0
7579 if ( request . headers . authorization && request . headers . authorization !== undefined ) {
7680 delete request . headers . authtoken
@@ -91,6 +95,9 @@ export function ConcurrencyQueue ({ axios, config }) {
9195 }
9296
9397 return new Promise ( resolve => {
98+ request . onComplete = ( ) => {
99+ this . running . pop ( { request, resolve } )
100+ }
94101 this . push ( { request, resolve } )
95102 } )
96103 }
@@ -117,7 +124,7 @@ export function ConcurrencyQueue ({ axios, config }) {
117124
118125 // Response interceptor used for
119126 const responseHandler = ( response ) => {
120- this . running . shift ( )
127+ response . config . onComplete ( )
121128 shift ( )
122129 return response
123130 }
@@ -130,15 +137,16 @@ export function ConcurrencyQueue ({ axios, config }) {
130137 }
131138
132139 // Error handling
133- let wait = this . config . retryDelay
134- const response = error . response
140+ const wait = this . config . retryDelay
141+ var response = error . response
135142 if ( ! response ) {
136143 if ( error . code === 'ECONNABORTED' ) {
137144 error . response = {
138145 ...error . response ,
139146 status : 408 ,
140147 statusText : `timeout of ${ this . config . timeout } ms exceeded`
141148 }
149+ response = error . response
142150 } else {
143151 return Promise . reject ( responseHandler ( error ) )
144152 }
@@ -150,38 +158,43 @@ export function ConcurrencyQueue ({ axios, config }) {
150158 return Promise . reject ( responseHandler ( error ) )
151159 }
152160 this . running . shift ( )
153- wait = 1000
154- // Cooldown the running requests
161+ // Cool down the running requests
155162 delay ( wait )
156163 error . config . retryCount = networkError
157164
158165 return axios ( updateRequestConfig ( error , retryErrorType , wait ) )
159- } else if ( this . config . retryCondition && this . config . retryCondition ( error ) ) {
160- retryErrorType = `Error with status: ${ response . status } `
166+ }
167+ if ( this . config . retryCondition && this . config . retryCondition ( error ) ) {
168+ retryErrorType = error . response ? `Error with status: ${ response . status } ` : `Error Code:${ error . code } `
161169 networkError ++
162- if ( networkError > this . config . retryLimit ) {
163- return Promise . reject ( responseHandler ( error ) )
164- }
165- if ( this . config . retryDelayOptions ) {
166- if ( this . config . retryDelayOptions . customBackoff ) {
167- wait = this . config . retryDelayOptions . customBackoff ( networkError , error )
168- if ( wait && wait <= 0 ) {
169- return Promise . reject ( responseHandler ( error ) )
170- }
171- } else if ( this . config . retryDelayOptions . base ) {
172- wait = this . config . retryDelayOptions . base * networkError
170+ return this . retry ( error , retryErrorType , networkError , wait )
171+ }
172+ return Promise . reject ( responseHandler ( error ) )
173+ }
174+
175+ this . retry = ( error , retryErrorType , retryCount , waittime ) => {
176+ let delaytime = waittime
177+ if ( retryCount > this . config . retryLimit ) {
178+ return Promise . reject ( responseHandler ( error ) )
179+ }
180+ if ( this . config . retryDelayOptions ) {
181+ if ( this . config . retryDelayOptions . customBackoff ) {
182+ delaytime = this . config . retryDelayOptions . customBackoff ( retryCount , error )
183+ if ( delaytime && delaytime <= 0 ) {
184+ return Promise . reject ( responseHandler ( error ) )
173185 }
174- } else {
175- wait = this . config . retryDelay
186+ } else if ( this . config . retryDelayOptions . base ) {
187+ delaytime = this . config . retryDelayOptions . base * retryCount
176188 }
177- error . config . retryCount = networkError
178- return new Promise ( function ( resolve ) {
179- return setTimeout ( function ( ) {
180- return resolve ( axios ( updateRequestConfig ( error , retryErrorType , wait ) ) )
181- } , wait )
182- } )
189+ } else {
190+ delaytime = this . config . retryDelay
183191 }
184- return Promise . reject ( responseHandler ( error ) )
192+ error . config . retryCount = retryCount
193+ return new Promise ( function ( resolve ) {
194+ return setTimeout ( function ( ) {
195+ return resolve ( axios ( updateRequestConfig ( error , retryErrorType , delaytime ) ) )
196+ } , delaytime )
197+ } )
185198 }
186199
187200 this . interceptors = {
@@ -204,12 +217,25 @@ export function ConcurrencyQueue ({ axios, config }) {
204217 }
205218 }
206219
220+ requestConfig . data = transformFormData ( requestConfig )
207221 requestConfig . transformRequest = [ function ( data ) {
208222 return data
209223 } ]
210224 return requestConfig
211225 }
212226
227+ const transformFormData = ( request ) => {
228+ if ( request . formdata ) {
229+ const formdata = request . formdata ( )
230+ request . headers = {
231+ ...request . headers ,
232+ ...formdata . getHeaders ( )
233+ }
234+ return formdata
235+ }
236+ return request . data
237+ }
238+
213239 // Adds interseptors in axios to queue request
214240 this . interceptors . request = axios . interceptors . request . use ( requestHandler )
215241 this . interceptors . response = axios . interceptors . response . use ( responseHandler , responseErrorHandler )
0 commit comments