vanth/lib/fetch.js

108 lines
2.6 KiB
JavaScript
Raw Normal View History

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',
})
);
});
}