@@ -73,6 +73,47 @@ export type Token = {
7373 refreshToken : string ;
7474 createtime : number ;
7575} ;
76+ const refreshTokenPromises : Partial < Record < NetDiskType , Promise < string > > > = { } ;
77+
78+ function refreshAccessToken (
79+ netDiskType : NetDiskType ,
80+ token : Token ,
81+ invalid : boolean | undefined ,
82+ key : string ,
83+ localStorageDAO : LocalStorageDAO
84+ ) {
85+ if ( refreshTokenPromises [ netDiskType ] ) {
86+ return refreshTokenPromises [ netDiskType ] ;
87+ }
88+
89+ const refreshPromiseFn = async ( ) => {
90+ const resp = await RefreshToken ( netDiskType , token . refreshToken ) ;
91+ if ( resp . code !== 0 ) {
92+ await localStorageDAO . delete ( key ) ;
93+ // 刷新失败,并且标记失效,尝试重新获取token
94+ if ( invalid ) {
95+ return await AuthVerify ( netDiskType ) ;
96+ }
97+ throw new WarpTokenError ( new Error ( resp . msg ) ) ;
98+ }
99+ const newToken = {
100+ accessToken : resp . data . token . access_token ,
101+ refreshToken : resp . data . token . refresh_token ,
102+ createtime : Date . now ( ) ,
103+ } ;
104+ // 更新token
105+ await localStorageDAO . saveValue ( key , newToken ) ;
106+ return newToken . accessToken ;
107+ } ;
108+ const refreshPromise : Promise < string > = refreshPromiseFn ( ) . finally ( ( ) => {
109+ if ( refreshTokenPromises [ netDiskType ] === refreshPromise ) {
110+ delete refreshTokenPromises [ netDiskType ] ;
111+ }
112+ } ) ;
113+
114+ refreshTokenPromises [ netDiskType ] = refreshPromise ;
115+ return refreshPromise ;
116+ }
76117
77118export async function AuthVerify ( netDiskType : NetDiskType , invalid ?: boolean ) {
78119 let token : Token | undefined = undefined ;
@@ -99,36 +140,16 @@ export async function AuthVerify(netDiskType: NetDiskType, invalid?: boolean) {
99140 invalid = false ;
100141 await localStorageDAO . saveValue ( key , token ) ;
101142 }
102- // token过期或者失效
103- const expired = Date . now ( ) >= token . createtime + 3600000 ;
104- if ( expired || invalid ) {
105- // 大于一小时刷新token
106- try {
107- const resp = await RefreshToken ( netDiskType , token . refreshToken ) ;
108- if ( resp . code !== 0 ) {
109- await localStorageDAO . delete ( key ) ;
110- // 刷新失败,并且标记失效,尝试重新获取token
111- if ( invalid ) {
112- return await AuthVerify ( netDiskType ) ;
113- }
114- throw new WarpTokenError ( new Error ( resp . msg ) ) ;
115- }
116- token = {
117- accessToken : resp . data . token . access_token ,
118- refreshToken : resp . data . token . refresh_token ,
119- createtime : Date . now ( ) ,
120- } ;
121- // 更新token
122- await localStorageDAO . saveValue ( key , token ) ;
123- } catch ( e ) {
124- // 已过期或已被服务端判定失效的 token 不能继续回退使用
125- console . warn ( e ) ;
126- throw e ;
127- }
128- } else {
129- return token . accessToken ;
143+ // token未过期(一小时内)及有效则保留,不用刷新token
144+ const unexpired = Date . now ( ) < token . createtime + 3600000 ;
145+ if ( unexpired && ! invalid ) return token . accessToken ;
146+ try {
147+ return await refreshAccessToken ( netDiskType , token , invalid , key , localStorageDAO ) ;
148+ } catch ( e ) {
149+ // 已过期或已被服务端判定失效的 token 不能继续回退使用
150+ console . warn ( e ) ;
151+ throw e ;
130152 }
131- return token . accessToken ;
132153}
133154
134155export const netDiskTypeMap : Partial < Record < FileSystemType , NetDiskType > > = {
0 commit comments