UNPKG

axios-refresh-me

Version:

Axios wrapper for refresh token and retry request

6 lines (3 loc) 3.56 kB
import p from 'axios'; var h=Object.defineProperty;var b=(r,e,t)=>e in r?h(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var u=(r,e,t)=>(b(r,typeof e!="symbol"?e+"":e,t),t);var C={refreshHandler:()=>Promise.resolve(),combineAbortSignals:!1,statusCodes:[401],retryCount:1},f={interceptors:{request:{onFulfilled:r=>r,onRejected:r=>r},response:{onFulfilled:r=>r,onRejected:r=>r}}},a=class{suspendedQueue;baseOptions;abortController;isSuspended;constructor(e){this.suspendedQueue=new Set,this.baseOptions={...C,...e},this.abortController=new AbortController,this.isSuspended=!1;}combineSignals=e=>{let t=this.abortController.signal;if(!e||!this?.baseOptions?.combineAbortSignals)return t;let s=new AbortController,i=()=>s.abort();return t.onabort=i,e.onabort=i,s.signal};subscribe=()=>new Promise(e=>this.suspendedQueue.add(e));notify=()=>{this.abortController=new AbortController,this.suspendedQueue.forEach(e=>e()),this.suspendedQueue.clear(),this.isSuspended=!1;};exchangeToken=async()=>{if(this.isSuspended)return this.subscribe();this.isSuspended=!0,this.abortController.abort();try{return await this.baseOptions.refreshHandler(),this.notify()}catch(e){console.error("Can not notify the suspended queue due to error in refreshHandler",e);}};baseRequestIntercept=async e=>(e?._retryCount||(e._retryCount=0),(e?._retryCount>0||this.isSuspended)&&await this.exchangeToken(),e.signal=this.combineSignals(e.signal),e);baseResponseIntercept=async(e,t)=>{let s=e?.config,i=e?.response,l=p.isCancel(e)&&this.isSuspended,d=this.baseOptions.shouldRefresh?this.baseOptions.shouldRefresh(e):this.baseOptions.statusCodes?.includes(i?.status);return s?._retryCount>=this.baseOptions.retryCount?Promise.reject(`Observer refresh token success, but retrying still failed after ${s._retryCount} time(s).`):d||l?(s._retryCount+=1,t(s)):e}},c=class{api;mergedInterceptors;observer;constructor(e,t,s){this.observer=s;let{interceptors:i,...l}=e||{};this.api=p.create({...l}),this.mergedInterceptors={...t,...i||{}},this.api.interceptors.request.use(this.onReqFulfilled,this.onReqRejected),this.api.interceptors.response.use(this.onResFulfilled,this.onResRejected);}onReqFulfilled=async e=>{let t=await this.observer.baseRequestIntercept(e);return this.mergedInterceptors?.request?.onFulfilled?this.mergedInterceptors?.request?.onFulfilled(t):t};onReqRejected=e=>this.mergedInterceptors?.request?.onRejected?this.mergedInterceptors?.request?.onRejected(e):Promise.reject(e);onResFulfilled=e=>this.mergedInterceptors?.response?.onFulfilled?this.mergedInterceptors?.response?.onFulfilled(e):e;onResRejected=async e=>{let t=await this.observer.baseResponseIntercept(e,this.api);return p.isAxiosError(t)&&this.mergedInterceptors?.response?.onRejected?this.mergedInterceptors.response.onRejected(t):t};get instance(){return this.api}},o=class{constructor(){throw new Error("This class cannot be instantiated")}static use(e){this.observer||(this.observer=new a(e));}static getInstance(e){if(!this.observer)throw new Error("RequestObserver is not registered!");return new c(e,this.internalInterceptor,this.observer).instance}},n=o;u(n,"observer"),u(n,"internalInterceptor",f.interceptors),u(n,"useInterceptorReq",(e,t)=>{o.internalInterceptor.request.onFulfilled=e,t&&(o.internalInterceptor.request.onRejected=t);}),u(n,"useInterceptorRes",(e,t)=>{o.internalInterceptor.response.onFulfilled=e,t&&(o.internalInterceptor.response.onRejected=t);}),u(n,"interceptor",{request:{use:o.useInterceptorReq},response:{use:o.useInterceptorRes}});var I=n; export { a, I as b };