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