@@ -210,22 +210,29 @@ class Agent extends EmbeddedDocument {
210210 * @return {Object } request The configured axios instance to use for a request.
211211 */
212212 request ( data , parameters = { } ) {
213+ const id = uuidv4 ( ) ;
213214 const interceptor = instance . interceptors . request . use (
214215 ( { httpAgent, httpsAgent, ...request } ) => {
215216 instance . interceptors . request . eject ( interceptor ) ;
216217 return new Promise ( ( resolve , reject ) =>
217218 this . push ( {
218- request : this . handleRequest ( request ) ,
219+ request : this . handleRequest ( request , id ) ,
219220 resolve,
220221 reject
221222 } )
222223 ) ;
223224 }
224225 ) ;
225226
226- instance . interceptors . response . use (
227- response => this . handleResponse ( response ) ,
228- error => this . handleError ( error )
227+ const response = instance . interceptors . response . use (
228+ response => {
229+ instance . interceptors . response . eject ( response ) ;
230+ return this . handleResponse ( response , id ) ;
231+ } ,
232+ error => {
233+ instance . interceptors . response . eject ( response ) ;
234+ return this . handleError ( error , id ) ;
235+ }
229236 ) ;
230237
231238 return instance (
@@ -246,17 +253,22 @@ class Agent extends EmbeddedDocument {
246253 * @description handles request data before it is sent to the resource. This function
247254 * will eventually be used to cancel the request and return the configuration body.
248255 * This function will test the url for an http proticol and reject if none exist.
249- * @param {Object } response The axios response
256+ * @param {Object } response The axios response.
257+ * @param {String } id the request id.
250258 * @return {Promise } the request configuration object
251259 */
252- handleResponse ( response ) {
260+ handleResponse ( response , id ) {
261+ const token = _ . get ( response , 'config.headers.Authorization' ) ;
262+ if ( token ) {
263+ this . connection . deactivate ( token , id ) ;
264+ }
253265 if ( typeof response . data !== 'object' ) {
254266 return Promise . reject ( {
255267 message : 'The Data API is currently unavailable' ,
256268 code : '1630'
257269 } ) ;
258270 } else {
259- this . connection . extend ( response . config . headers . Authorization ) ;
271+ this . connection . extend ( token ) ;
260272 return response ;
261273 }
262274 }
@@ -268,10 +280,12 @@ class Agent extends EmbeddedDocument {
268280 * @description handles request data before it is sent to the resource. This function
269281 * will eventually be used to cancel the request and return the configuration body.
270282 * This function will test the url for an http proticol and reject if none exist.
271- * @param {Object } config The axios request configuration
283+ * @param {Object } config The axios request configuration.
284+ * @param {String } id the request id.
272285 * @return {Promise } the request configuration object
273286 */
274- handleRequest ( config ) {
287+ handleRequest ( config , id ) {
288+ config . id = id ;
275289 return config . url . startsWith ( 'http' )
276290 ? omit ( config , [ 'params.request' , 'data.request' ] )
277291 : Promise . reject ( {
@@ -362,9 +376,17 @@ class Agent extends EmbeddedDocument {
362376 * function will add an expired property to the error response if it recieves a invalid
363377 * token response.
364378 * @param {Object } error The error recieved from the requested resource.
379+ * @param {String } id the request id.
365380 * @return {Promise } A promise rejection containing a code and a message
366381 */
367- handleError ( error ) {
382+ handleError ( error , id ) {
383+ const token = _ . get ( error , 'config.headers.Authorization' ) ;
384+ if ( token ) {
385+ this . connection . deactivate ( token , id ) ;
386+ }
387+
388+ this . connection . confirm ( ) ;
389+
368390 if ( error . code ) {
369391 return Promise . reject ( { code : error . code , message : error . message } ) ;
370392 } else if (
@@ -377,9 +399,7 @@ class Agent extends EmbeddedDocument {
377399 } ) ;
378400 } else {
379401 if ( error . response . data . messages [ 0 ] . code === '952' )
380- this . connection . clear (
381- _ . get ( error , 'response.config.headers.Authorization' )
382- ) ;
402+ this . connection . clear ( token ) ;
383403 return Promise . reject ( error . response . data . messages [ 0 ] ) ;
384404 }
385405 }
@@ -464,7 +484,8 @@ class Agent extends EmbeddedDocument {
464484 Object . assign (
465485 this . mutate ( pending . request , ( value , key ) =>
466486 key . replace ( / { { dot} } / g, '.' )
467- )
487+ ) ,
488+ { id : pending . id }
468489 ) ,
469490 _ . isEmpty ( this . agent ) ? { } : this . localize ( )
470491 )
0 commit comments