@@ -3,6 +3,18 @@ import { TokenService } from "./tokenService";
33
44const API_URL = import . meta. env . VITE_API_URL || "" ;
55
6+ let isRefreshing = false ;
7+ let refreshSubscribers : ( ( token : string ) => void ) [ ] = [ ] ;
8+
9+ const onRefreshed = ( accessToken : string ) => {
10+ refreshSubscribers . forEach ( ( callback ) => callback ( accessToken ) ) ;
11+ refreshSubscribers = [ ] ;
12+ } ;
13+
14+ const addRefreshSubscriber = ( callback : ( token : string ) => void ) => {
15+ refreshSubscribers . push ( callback ) ;
16+ } ;
17+
618const api = axios . create ( {
719 baseURL : API_URL ,
820 withCredentials : true ,
@@ -54,7 +66,17 @@ api.interceptors.response.use(
5466 }
5567
5668 if ( error . response ?. status === 401 && ! originalRequest . _retry ) {
69+ if ( isRefreshing ) {
70+ return new Promise ( ( resolve ) => {
71+ addRefreshSubscriber ( ( token : string ) => {
72+ originalRequest . headers . Authorization = `Bearer ${ token } ` ;
73+ resolve ( api ( originalRequest ) ) ;
74+ } ) ;
75+ } ) ;
76+ }
77+
5778 originalRequest . _retry = true ;
79+ isRefreshing = true ;
5880
5981 try {
6082 const { data } = await axios . post < { accessToken : string } > (
@@ -65,14 +87,19 @@ api.interceptors.response.use(
6587
6688 // update storage
6789 TokenService . setToken ( data . accessToken ) ;
68-
90+
91+ isRefreshing = false ;
92+ onRefreshed ( data . accessToken ) ;
93+
6994 // update header
7095 originalRequest . headers . Authorization = `Bearer ${ data . accessToken } ` ;
7196
7297 // retry original request
7398 return api ( originalRequest ) ;
7499 } catch ( refreshError ) {
75100 // refresh failed :
101+ isRefreshing = false ;
102+ refreshSubscribers = [ ] ;
76103 TokenService . clearTokens ( ) ;
77104 console . error ( "Session expired. Please sign in again" ) ;
78105 return Promise . reject ( refreshError ) ;
0 commit comments