Skip to content

Commit 2d24bea

Browse files
committed
feat(interceptors): provide Request to response interceptors
closes #33
1 parent 50eb3aa commit 2d24bea

File tree

3 files changed

+11
-10
lines changed

3 files changed

+11
-10
lines changed

src/http-client.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,13 @@ export class HttpClient {
105105
if (Response.prototype.isPrototypeOf(result)) {
106106
response = result;
107107
} else if (Request.prototype.isPrototypeOf(result)) {
108+
request = Promise.resolve(result);
108109
response = fetch(result);
109110
} else {
110111
throw new Error(`An invalid result was returned by the interceptor chain. Expected a Request or Response instance, but got [${result}]`);
111112
}
112113

113-
return processResponse(response, this.interceptors);
114+
return request.then(_request => processResponse(response, this.interceptors, _request));
114115
});
115116

116117
return this::trackRequestEndWith(promise);
@@ -191,18 +192,18 @@ function processRequest(request, interceptors) {
191192
return applyInterceptors(request, interceptors, 'request', 'requestError');
192193
}
193194

194-
function processResponse(response, interceptors) {
195-
return applyInterceptors(response, interceptors, 'response', 'responseError');
195+
function processResponse(response, interceptors, request) {
196+
return applyInterceptors(response, interceptors, 'response', 'responseError', request);
196197
}
197198

198-
function applyInterceptors(input, interceptors, successName, errorName) {
199+
function applyInterceptors(input, interceptors, successName, errorName, ...interceptorArgs) {
199200
return (interceptors || [])
200201
.reduce((chain, interceptor) => {
201202
let successHandler = interceptor[successName];
202203
let errorHandler = interceptor[errorName];
203204

204205
return chain.then(
205-
successHandler && interceptor::successHandler,
206-
errorHandler && interceptor::errorHandler);
206+
successHandler && (value => interceptor::successHandler(value, ...interceptorArgs)),
207+
errorHandler && (reason => interceptor::errorHandler(reason, ...interceptorArgs)));
207208
}, Promise.resolve(input));
208209
}

src/interfaces.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ interface Interceptor {
2929
*
3030
* @param response - The response.
3131
*/
32-
response?: (response: Response) => Response|Promise<Response>;
32+
response?: (response: Response, request?: Request) => Response|Promise<Response>;
3333

3434
/**
3535
* Handles fetch errors and errors generated by previous interceptors. This
@@ -39,7 +39,7 @@ interface Interceptor {
3939
* @param error - The rejection value from the fetch request or from a
4040
* previous interceptor.
4141
*/
42-
responseError?: (error: any) => Response|Promise<Response>;
42+
responseError?: (error: any, request?: Request) => Response|Promise<Response>;
4343
}
4444

4545
/**

test/http-client.spec.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ describe('HttpClient', () => {
172172

173173
client.fetch('path')
174174
.then(() => {
175-
expect(interceptor.response).toHaveBeenCalledWith(jasmine.any(Response));
175+
expect(interceptor.response).toHaveBeenCalledWith(jasmine.any(Response), jasmine.any(Request));
176176
expect(interceptor.responseError).not.toHaveBeenCalled();
177177
done();
178178
});
@@ -189,7 +189,7 @@ describe('HttpClient', () => {
189189
client.fetch('path')
190190
.catch(() => {
191191
expect(interceptor.response).not.toHaveBeenCalled();
192-
expect(interceptor.responseError).toHaveBeenCalledWith(jasmine.any(Response));
192+
expect(interceptor.responseError).toHaveBeenCalledWith(jasmine.any(Response), jasmine.any(Request));
193193
done();
194194
});
195195
});

0 commit comments

Comments
 (0)