@tmsfe/tms-core 0.0.215 → 0.0.217

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tmsfe/tms-core",
3
- "version": "0.0.215",
3
+ "version": "0.0.217",
4
4
  "description": "tms运行时框架",
5
5
  "repository": {
6
6
  "type": "git",
package/src/request.js CHANGED
@@ -14,6 +14,7 @@ import { safeJsonParse } from './objUtils';
14
14
  import { encryptObjInit } from './encrypt/index';
15
15
  import reporter from './report/index';
16
16
  import logger from './logger';
17
+ import storage from './storage';
17
18
 
18
19
  // 微信底层错误重试码 600001-微信cronet组件错误 600003-网络中断 5-接口超时
19
20
  export const RETRY_WX_ERR_NOS = [600001, 600003, 5];
@@ -431,6 +432,12 @@ export default class Request {
431
432
  return await this.invokeRequest(path, param, method, header);
432
433
  }
433
434
 
435
+ // 重试case2:token即将过期,静默刷新token,token有效期剩余不足一小时会返回X-Twt-Expire为1
436
+ const needSilentRefreshLogin = res?.header?.['X-Twt-Expire'] === 1;
437
+ if (needSilentRefreshLogin) {
438
+ loginRefresh();
439
+ }
440
+
434
441
  // 重试case3:处理网关框架码重试 requestRetryFlag?.gwCodeReTryPath由七彩石配置
435
442
  const { requestRetryFlag } = wx.tmsFlagMap || {};
436
443
  // X-Gateway-Code必须首字母大写,否则真机取不到
@@ -656,14 +663,25 @@ const isPathNeedRetryLogin = (path) => {
656
663
  const isGatewayCodeNeedRetry = gatewayCode => (gatewayCode > 1 && gatewayCode <= 999) || +gatewayCode === 5000;
657
664
 
658
665
  let refreshPromise;
666
+ let lastRefreshTime = 0;
667
+ const REFRESH_COOLDOWN = 60 * 1000; // 60秒冷却期
659
668
  async function loginRefresh() {
669
+ // 冷却期内不重复刷新
670
+ if (Date.now() - lastRefreshTime < REFRESH_COOLDOWN) {
671
+ return;
672
+ }
660
673
  if (!refreshPromise) {
661
674
  // 调用runtime的login方法刷新token
662
675
  const { tms } = getApp();
663
676
  wx.tmsLoginPromise = undefined;
677
+ // 刷新登录态时清除缓存,确保重新走登录流程
678
+ storage.removeItem('sinanCacheUserInfo');
664
679
  try {
665
680
  refreshPromise = tms.login();
666
- await refreshPromise;
681
+ const loginInfo = await refreshPromise;
682
+ // 刷新登录后写缓存
683
+ storage.setItem('sinanCacheUserInfo', loginInfo);
684
+ lastRefreshTime = Date.now(); // 记录最后成功刷新时间
667
685
  // 登录成功,清除Promise
668
686
  refreshPromise = undefined;
669
687
  } catch (err) {
@@ -54,9 +54,14 @@ const loginFn = async () => {
54
54
  userData = await login();
55
55
  }
56
56
  if (userData.errCode === 0) {
57
- userInfo = userData.resData.userInfo;
58
- // 缓存登录信息
59
- wx.setStorageSync('sinanCacheUserInfo', userInfo);
57
+ userInfo = userData.resData.userInfo || {};
58
+ // 登录信息,附带 expire 和时间校准字段
59
+ userInfo = {
60
+ ...userInfo,
61
+ expire: userInfo.expire,
62
+ loginTime: userInfo.loginTime,
63
+ localTime: Date.now(),
64
+ };
60
65
  }
61
66
  } catch (e) {}
62
67
  resolve(userInfo);
package/src/storage.js CHANGED
@@ -98,6 +98,7 @@ function getCacheData(key, version, defaultData = null) {
98
98
  export {
99
99
  getItem,
100
100
  setItem,
101
+ removeItem,
101
102
  setCacheData,
102
103
  getCacheData,
103
104
  };