51 lines
1.3 KiB
JavaScript
51 lines
1.3 KiB
JavaScript
import 'cross-fetch/polyfill';
|
|
|
|
/**
|
|
* Parses the JSON returned by a network request
|
|
*
|
|
* @param {object} response A response from a network request
|
|
*
|
|
* @return {object} The parsed JSON from the request
|
|
*/
|
|
function parseJSON (response) {
|
|
if (response.status === 204 || response.status === 205) {
|
|
return null;
|
|
}
|
|
return response.json();
|
|
}
|
|
|
|
/**
|
|
* Parses the status returned by a network request
|
|
*
|
|
* @param {object} response A response from a network request
|
|
* @param {object} response The parsed JSON from the network request
|
|
*
|
|
* @return {object | undefined} Returns object with status and statusText, or undefined
|
|
*/
|
|
function checkStatus (response, jsonResponse) {
|
|
if (response.status >= 200 && response.status < 300) {
|
|
return jsonResponse;
|
|
}
|
|
const error = new Error(jsonResponse.message);
|
|
error.response = response;
|
|
throw error;
|
|
}
|
|
|
|
/**
|
|
* Requests a URL, returning a promise
|
|
*
|
|
* @param {string} url The URL we want to request
|
|
* @param {object} [options] The options we want to pass to "fetch"
|
|
*
|
|
* @return {object} The response data
|
|
*/
|
|
|
|
export default function request (url, options) {
|
|
return fetch(url, options)
|
|
.then(response => {
|
|
return Promise.all([response, parseJSON(response)]);
|
|
})
|
|
.then(([response, jsonResponse]) => {
|
|
return checkStatus(response, jsonResponse);
|
|
});
|
|
}
|