in src/providers/session.ts [72:112]
async refreshSession(): Promise<void> {
try {
const session = await this.refresher();
const now = Date.now() / 1000;
const oldSessionAvailable = this.staleTimestamp > now;
const oldSession = this.session;
this.expirationTimestamp = parseUTC(session.expiration) / 1000;
this.session = session;
this.refreshFaliure = 0;
this.refreshTimestamp();
// 过期时间大于15分钟,不用管
if (this.staleTimestamp > now) {
return;
}
// 不足或等于15分钟,但未过期,下次会再次刷新
if (now < (this.staleTimestamp + this.staleTime)) {
this.expirationTimestamp = now + this.staleTime;
}
// 已过期,看缓存,缓存若大于15分钟,返回缓存,若小于15分钟,则根据策略判断是立刻重试还是稍后重试
if (now > (this.staleTimestamp + this.staleTime)) {
if(oldSessionAvailable) {
this.session = oldSession;
this.expirationTimestamp = parseUTC(oldSession.expiration) / 1000;
this.refreshTimestamp();
return;
}
const waitUntilNextRefresh = 50 + getRandomInt(20);
this.expirationTimestamp = now + waitUntilNextRefresh + this.staleTime;
}
} catch(err) {
if (!this.session) {
throw err;
}
const now = Date.now() / 1000;
if (now < this.staleTimestamp) {
return;
}
this.refreshFaliure++;
this.expirationTimestamp = this.jitterTime(now, 1, this.maxStaleFailureJitter()) + this.staleTime;
}
}