function mfetch (url, options = {}) {
const INTERVAL_TIME = 500;
const TIMEOUT = 20000;
function waitForRenewComplete (){
return new Promise((resolve, reject) => {
const timeout_time = Date.now() + TIMEOUT;
const t = setInterval(()=> {
if(!localStorage.getItem('renewing')){
clearInterval(t);
resolve();
} else if(Date.now() > timeout_time){
localStorage.removeItem('renewing');
reject({error: 'token renovation wait timed out'});
}
}, INTERVAL_TIME)
});
}
const RENOVATION_ERRORS = [
'JWT_EXPIRED',
'JWT_INVALID_SIGNATURE',
];
return window.fetch(url, Object.assign({}, options, {credentials: 'include'}))
.then(res => {
const mapp_auth_error = res.headers.get('MAPP-auth-error-message');
if (mapp_auth_error && res.status !== 403) {
if (RENOVATION_ERRORS.some(error => error === mapp_auth_error)){
if(!localStorage.getItem('renewing')){
//if(localStorage.getItem('token') !== access_token){
//return mfetch(url, options);
//}
localStorage.setItem('renewing', true);
const renew_url = `${"https://crm.walcu.com/"}refresh_token/renew`;
return window.fetch(renew_url).then(renew_response => {
const renew_mapp_auth_error = renew_response.headers.get('MAPP-auth-error-message');
if(renew_mapp_auth_error){
return Promise.reject(renew_mapp_auth_error);
} else {
return renew_response.json();
}
}).then((decoded_token) => {
if(decoded_token){
localStorage.setItem('decoded_token', JSON.stringify(decoded_token));
localStorage.removeItem('renewing');
return mfetch(url, options);
} else {
return Promise.reject('UNEXPECTED_AUTH_ERROR');
}
})
} else {
return waitForRenewComplete().then(() => mfetch(url,options));
}
} else {
localStorage.removeItem('renewing');
return Promise.reject(mapp_auth_error);
}
} else {
return res;
}
})
.catch(error => {
localStorage.removeItem('renewing');
if(error instanceof Error){
return Promise.reject(error);
} else {
localStorage.setItem('last_path', window.location.pathname);
if(!options.ignore_redirect_on_failure) window.location = '/'
}
});
}