66 lines
1.6 KiB
JavaScript
66 lines
1.6 KiB
JavaScript
|
/**
|
||
|
* Base client.
|
||
|
*/
|
||
|
|
||
|
import Promise from '../../promise';
|
||
|
import xhrClient from './xhr';
|
||
|
import nodeClient from './node';
|
||
|
import {warn, when, isObject, isFunction, inBrowser} from '../../util';
|
||
|
|
||
|
export default function (context) {
|
||
|
|
||
|
const reqHandlers = [sendRequest], resHandlers = [];
|
||
|
|
||
|
if (!isObject(context)) {
|
||
|
context = null;
|
||
|
}
|
||
|
|
||
|
function Client(request) {
|
||
|
while (reqHandlers.length) {
|
||
|
|
||
|
const handler = reqHandlers.pop();
|
||
|
|
||
|
if (isFunction(handler)) {
|
||
|
|
||
|
let response, next;
|
||
|
|
||
|
response = handler.call(context, request, val => next = val) || next;
|
||
|
|
||
|
if (isObject(response)) {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
|
||
|
resHandlers.forEach(handler => {
|
||
|
response = when(response, response => {
|
||
|
return handler.call(context, response) || response;
|
||
|
}, reject);
|
||
|
});
|
||
|
|
||
|
when(response, resolve, reject);
|
||
|
|
||
|
}, context);
|
||
|
}
|
||
|
|
||
|
if (isFunction(response)) {
|
||
|
resHandlers.unshift(response);
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
warn(`Invalid interceptor of type ${typeof handler}, must be a function`);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Client.use = handler => {
|
||
|
reqHandlers.push(handler);
|
||
|
};
|
||
|
|
||
|
return Client;
|
||
|
}
|
||
|
|
||
|
function sendRequest(request) {
|
||
|
|
||
|
const client = request.client || (inBrowser ? xhrClient : nodeClient);
|
||
|
|
||
|
return client(request);
|
||
|
}
|