diff --git a/package.json b/package.json index 252ad84..395f3b0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kevisual/api", - "version": "0.0.55", + "version": "0.0.56", "description": "", "main": "mod.ts", "scripts": { diff --git a/query/query-login/login-cache.ts b/query/query-login/login-cache.ts index 4eeee34..8dfa36d 100644 --- a/query/query-login/login-cache.ts +++ b/query/query-login/login-cache.ts @@ -82,7 +82,8 @@ export type CacheStore = { getValue(): Promise; setValue(value: CacheLogin): Promise; delValue(): Promise; - init(): Promise; + init(): Promise; + getIsExpired(): Promise; }; export type LoginCacheStoreOpts = { @@ -124,6 +125,13 @@ export class LoginCacheStore implements CacheStore { */ async delValue() { await this.cache.del(); + this.cacheData = { + loginUsers: [], + user: undefined, + id: undefined, + accessToken: undefined, + refreshToken: undefined, + }; } getValue(): Promise { return this.cache.get(this.name); @@ -132,12 +140,14 @@ export class LoginCacheStore implements CacheStore { * 初始化,设置默认值 */ async init() { - const defaultData = { + const defaultData: CacheLogin = { loginUsers: [], - user: null, - id: null, - accessToken: null, - refreshToken: null, + user: undefined, + id: undefined, + accessToken: undefined, + refreshToken: undefined, + accessTokenExpiresIn: undefined, + createdAt: undefined, }; if (this.cache.init) { try { @@ -149,6 +159,7 @@ export class LoginCacheStore implements CacheStore { } else { this.cacheData = (await this.getValue()) || defaultData; } + return this.cacheData; } /** * 设置当前用户 @@ -184,6 +195,18 @@ export class LoginCacheStore implements CacheStore { const cacheData = this.cacheData; return Promise.resolve(cacheData.accessToken || ''); } + getIsExpired(): Promise { + const cacheData = this.cacheData; + if (!cacheData.accessToken) { + return Promise.resolve(true); + } + if (!cacheData.createdAt || !cacheData.accessTokenExpiresIn) { + return Promise.resolve(false); + } + const now = Date.now(); + const expiresIn = cacheData.createdAt + cacheData.accessTokenExpiresIn * 1000; + return Promise.resolve(now >= expiresIn); + } async clearCurrentUser() { const user = await this.getCurrentUser(); @@ -195,6 +218,8 @@ export class LoginCacheStore implements CacheStore { this.cacheData.id = undefined; this.cacheData.accessToken = undefined; this.cacheData.refreshToken = undefined; + this.cacheData.accessTokenExpiresIn = undefined; + this.cacheData.createdAt = undefined; await this.setValue(this.cacheData); } async clearAll() { @@ -203,6 +228,8 @@ export class LoginCacheStore implements CacheStore { this.cacheData.id = undefined; this.cacheData.accessToken = undefined; this.cacheData.refreshToken = undefined; + this.cacheData.accessTokenExpiresIn = undefined; + this.cacheData.createdAt = undefined; await this.setValue(this.cacheData); } } diff --git a/query/query-login/query-login.ts b/query/query-login/query-login.ts index ea08c8b..5e2c35f 100644 --- a/query/query-login/query-login.ts +++ b/query/query-login/query-login.ts @@ -305,6 +305,9 @@ export class QueryLogin extends BaseQuery { const token = this.storage.getItem('token'); return !!token; } + async checkTokenValid() { + return this.cacheStore.getIsExpired(); + } /** * 检查本地用户列表 * @returns @@ -313,6 +316,7 @@ export class QueryLogin extends BaseQuery { const token = this.storage.getItem('token'); return token || ''; } + async beforeRequest(opts: any = {}) { const token = this.storage.getItem('token'); if (token) {