108 lines
2.6 KiB
JavaScript
108 lines
2.6 KiB
JavaScript
function FetchError(url, status, errors) {
|
|
this.errors = errors;
|
|
this.message = `Status code ${status} was returned from ${url}`;
|
|
this.name = 'FetchError';
|
|
this.status = status;
|
|
this.url = url;
|
|
}
|
|
|
|
let _handleResults = function(resolve, reject, url, fetchRequest) {
|
|
fetchRequest
|
|
.then(response => {
|
|
if(response.status == 204) {
|
|
resolve({
|
|
headers : response.headers,
|
|
json : null,
|
|
text : '',
|
|
});
|
|
} else if(response.status >= 400) {
|
|
console.error(`The request to ${url} failed with status ${response.status}`, response);
|
|
response.json()
|
|
.then(json => {
|
|
reject(new FetchError(url, response.status, json.errors));
|
|
})
|
|
.catch(reject);
|
|
} else {
|
|
if(response.headers.get('Content-Type') == 'application/json') {
|
|
response.json()
|
|
.then(json => {
|
|
resolve({
|
|
headers : response.headers,
|
|
json : json,
|
|
text : null,
|
|
});
|
|
}).catch(reject);
|
|
} else {
|
|
response.text()
|
|
.then(text => {
|
|
resolve({
|
|
headers : response.headers,
|
|
json : null,
|
|
text : text,
|
|
});
|
|
}).catch(reject);
|
|
}
|
|
}
|
|
})
|
|
.catch(error => {
|
|
if(error instanceof Error) {
|
|
reject(error);
|
|
} else {
|
|
console.error("Unrecognized error raised when fetching", error);
|
|
reject(new Error("Unknown error occurred during fetch"));
|
|
}
|
|
});
|
|
}
|
|
|
|
export function get(url) {
|
|
return new Promise(function(resolve, reject) {
|
|
_handleResults(resolve, reject, url,
|
|
fetch(url, {
|
|
credentials : 'include',
|
|
method : 'GET',
|
|
})
|
|
);
|
|
});
|
|
}
|
|
|
|
export function post(url, data) {
|
|
return new Promise(function(resolve, reject) {
|
|
_handleResults(resolve, reject, url,
|
|
fetch(url, {
|
|
credentials : 'include',
|
|
headers : {
|
|
"Content-Type": "application/json"
|
|
},
|
|
method : 'POST',
|
|
body : JSON.stringify(data),
|
|
})
|
|
);
|
|
});
|
|
}
|
|
|
|
export function put(url, data) {
|
|
return new Promise(function(resolve, reject) {
|
|
_handleResults(resolve, reject, url,
|
|
fetch(url, {
|
|
credentials : 'include',
|
|
headers : {
|
|
"Content-Type": "application/json"
|
|
},
|
|
method : 'PUT',
|
|
body : JSON.stringify(data),
|
|
})
|
|
);
|
|
});
|
|
}
|
|
|
|
module.exports.delete = function(url) {
|
|
return new Promise(function(resolve, reject) {
|
|
_handleResults(resolve, reject, url,
|
|
fetch(url, {
|
|
credentials : 'include',
|
|
method : 'DELETE',
|
|
})
|
|
);
|
|
});
|
|
}
|