xior-auth-refresh
Version:
Xior plugin which makes it very easy to automatically refresh the authorization tokens of your clients
2 lines (1 loc) • 1.82 kB
JavaScript
function e(){return(e=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var s=arguments[r];for(var t in s)Object.prototype.hasOwnProperty.call(s,t)&&(e[t]=s[t])}return e}).apply(this,arguments)}let r={statusCodes:[401],pauseInstanceWhileRefreshing:!1};function s(t,n,o={}){if("function"!=typeof n)throw Error("xior-auth-refresh requires `refreshAuthCall` to be a function that returns a promise.");let u={skipInstances:[],refreshCall:void 0,requestQueueInterceptorId:void 0};return t.interceptors.response.use(e=>e,s=>{var i,a,c,l,h;if(a=o=e({},r,{pauseInstanceWhileRefreshing:(i=o).skipWhileRefreshing},i),!(s&&(null==(c=s.config)||!c.skipAuthRefresh)&&(a.interceptNetworkError&&!s.response&&0===s.request.status||s.response&&((null==a?void 0:a.shouldRefresh)?a.shouldRefresh(s):null==(l=a.statusCodes)?void 0:l.includes(parseInt(s.response.status)))))||(s.response||(s.response={config:s.config}),a.pauseInstanceWhileRefreshing&&u.skipInstances.includes(t)))return Promise.reject(s);o.pauseInstanceWhileRefreshing&&u.skipInstances.push(t);let f=u.refreshCall||(u.refreshCall=n(s),"function"==typeof u.refreshCall.then)?u.refreshCall:(console.warn("xior-auth-refresh requires `refreshTokenCall` to return a promise."),Promise.reject());return h=o,void 0===u.requestQueueInterceptorId&&(u.requestQueueInterceptorId=t.interceptors.request.use(e=>u.refreshCall.catch(()=>{throw Error("Request call failed")}).then(()=>h.onRetry?h.onRetry(e):e))),u.requestQueueInterceptorId,f.catch(e=>Promise.reject(e)).then(()=>{var e;return e=o.retryInstance||t,s.config.skipAuthRefresh=!0,e.request(s.response.config)}).finally(()=>{t.interceptors.request.eject(u.requestQueueInterceptorId),u.requestQueueInterceptorId=void 0,u.refreshCall=void 0,u.skipInstances=u.skipInstances.filter(e=>e!==t)})})}export{s as default};