diff --git a/src/middleware-stack.ts b/src/middleware-stack.ts index b93a35a..98a8e29 100644 --- a/src/middleware-stack.ts +++ b/src/middleware-stack.ts @@ -1,5 +1,9 @@ export type BeforeFilter = (requestUrl: string, options: RequestInit) => void -export type AfterFilter = (response: Response, json: JSON) => void +export type AfterFilter = ( + response: Response, + json: JSON, + requestOptions: RequestInit +) => void async function asyncForEach(array: Array, callback: Function) { for (let index = 0; index < array.length; index += 1) { @@ -10,10 +14,12 @@ async function asyncForEach(array: Array, callback: Function) { export class MiddlewareStack { private _beforeFilters: BeforeFilter[] = [] private _afterFilters: AfterFilter[] = [] + public newResponse: Response | null = null constructor(before: BeforeFilter[] = [], after: AfterFilter[] = []) { this._beforeFilters = before this._afterFilters = after + this.newResponse = null } get beforeFilters() { @@ -30,9 +36,13 @@ export class MiddlewareStack { }) } - async afterFetch(response: Response, json: JSON) { + async afterFetch( + response: Response, + json: JSON, + requestOptions: RequestInit + ) { await asyncForEach(this._afterFilters, async (filter: Function) => { - await filter(response, json) + await filter(response, json, requestOptions) }) } } diff --git a/src/request.ts b/src/request.ts index 907e34e..148a35f 100644 --- a/src/request.ts +++ b/src/request.ts @@ -109,9 +109,9 @@ export class Request { throw new ResponseError(null, e.message, e) } - await this._handleResponse(response, options) + const middlewareResponse = await this._handleResponse(response, options) - return response + return middlewareResponse || response } private async _handleResponse( @@ -133,7 +133,13 @@ export class Request { } try { - await this.middleware.afterFetch(response, json) + await this.middleware.afterFetch(response, json, requestOptions) + + if (this.middleware.newResponse) { + response = this.middleware.newResponse.clone() + json = await response.json() + this.middleware.newResponse = null + } } catch (e) { // afterFetch middleware failed throw new ResponseError( @@ -156,6 +162,8 @@ export class Request { } ;(response).jsonPayload = json + + return response } }