@cloudbase/app 1.4.1 → 2.0.0-alpha.0

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/src/index.ts CHANGED
@@ -11,6 +11,7 @@ import { initCache, getCacheByEnvId, getLocalCache } from './libs/cache';
11
11
  import { ICloudbaseRequest } from '@cloudbase/types/request';
12
12
  import { initRequest, getRequestByEnvId } from './libs/request';
13
13
  import { getSdkName, setSdkVersion, setEndPoint, setRegionLevelEndpoint, setSdkName } from './constants/common';
14
+ export { getBaseEndPoint } from './constants/common'
14
15
  const { useAdapters, useDefaultAdapter, RUNTIME } = adapters;
15
16
  const { ERRORS, COMMUNITY_SITE_URL } = constants;
16
17
  const { printWarn } = utils;
@@ -33,12 +34,15 @@ const extensionMap: KV<ICloudbaseExtension> = {};
33
34
 
34
35
  class Cloudbase implements ICloudbase {
35
36
  public authInstance: ICloudbaseAuth;
37
+ public oauthInstance: any;
36
38
  public requestClient: any;
39
+ public oauthClient: any
37
40
  private _config: ICloudbaseConfig;
38
41
 
39
42
  constructor(config?: ICloudbaseConfig) {
40
43
  this._config = config ? config : this._config;
41
44
  this.authInstance = null;
45
+ this.oauthInstance = null
42
46
  }
43
47
 
44
48
  get config() {
@@ -119,14 +123,14 @@ class Cloudbase implements ICloudbase {
119
123
  // 修正timeout取值
120
124
  this._config.timeout = this._formatTimeout(this._config.timeout);
121
125
  // 初始化cache和request
122
- const { env, persistence, debug, timeout, appSecret, appSign } = this._config;
126
+ const { env, persistence, debug, timeout, appSecret, appSign, oauthClient } = this._config;
123
127
  initCache({ env, persistence, debug, platformInfo: this.platform });
124
- initRequest({ env, region: config.region || '', timeout, appSecret, appSign });
125
128
 
126
129
  if (config.region) {
127
130
  setRegionLevelEndpoint(env, config.region || '')
128
131
  }
129
132
  const app = new Cloudbase(this._config);
133
+ initRequest({ env, region: config.region || '', timeout, appSecret, appSign, oauthClient, _fromApp: app });
130
134
  app.requestClient = this.requestClient;
131
135
  return app;
132
136
  }
package/src/libs/cache.ts CHANGED
@@ -2,12 +2,13 @@ import { KV } from "@cloudbase/types";
2
2
  import { cache } from "@cloudbase/utilities";
3
3
  import { ICloudbaseCache, ICacheConfig } from "@cloudbase/types/cache";
4
4
 
5
- const KEY_ACCESS_TOKEN = 'access_token';
6
- const KEY_ACCESS_TOKEN_EXPIRE = 'access_token_expire';
7
- const KEY_REFRESH_TOKEN = 'refresh_token';
8
- const KEY_ANONYMOUS_UUID = 'anonymous_uuid';
9
- const KEY_LOGIN_TYPE = 'login_type';
10
5
  const USER_INFO_KEY = 'user_info';
6
+ // const KEY_ACCESS_TOKEN = 'access_token';
7
+ // const KEY_ACCESS_TOKEN_EXPIRE = 'access_token_expire';
8
+ // const KEY_REFRESH_TOKEN = 'refresh_token';
9
+ // const KEY_ANONYMOUS_UUID = 'anonymous_uuid';
10
+ // const KEY_LOGIN_TYPE = 'login_type';
11
+ // const DEVICE_INFO = 'device_id';
11
12
 
12
13
  const { CloudbaseCache } = cache;
13
14
 
@@ -15,30 +16,31 @@ const cacheMap: KV<ICloudbaseCache> = {};
15
16
  // 本地存储
16
17
  const localCacheMap: KV<ICloudbaseCache> = {};
17
18
 
18
- export function initCache(config: ICacheConfig&{env:string}) {
19
- const { env,persistence,platformInfo } = config;
19
+ export function initCache(config: ICacheConfig & { env: string }) {
20
+ const { env, persistence, platformInfo } = config;
20
21
 
21
- const accessTokenKey = `${KEY_ACCESS_TOKEN}_${env}`;
22
- const accessTokenExpireKey = `${KEY_ACCESS_TOKEN_EXPIRE}_${env}`;
23
- const refreshTokenKey = `${KEY_REFRESH_TOKEN}_${env}`;
24
- const anonymousUuidKey = `${KEY_ANONYMOUS_UUID}_${env}`;
25
- const loginTypeKey = `${KEY_LOGIN_TYPE}_${env}`;
26
- const userInfoKey = `${USER_INFO_KEY}_${env}`;
22
+ // const accessTokenKey = `${KEY_ACCESS_TOKEN}_${env}`;
23
+ // const accessTokenExpireKey = `${KEY_ACCESS_TOKEN_EXPIRE}_${env}`;
24
+ // const refreshTokenKey = `${KEY_REFRESH_TOKEN}_${env}`;
25
+ // const anonymousUuidKey = `${KEY_ANONYMOUS_UUID}_${env}`;
26
+ // const loginTypeKey = `${KEY_LOGIN_TYPE}_${env}`;
27
+ const userInfoKey = `${USER_INFO_KEY}_${env}`;
28
+ // const deviceIdKey = `${DEVICE_INFO}`; // 非环境级别
27
29
 
28
30
  const keys = {
29
- accessTokenKey,
30
- accessTokenExpireKey,
31
- refreshTokenKey,
32
- anonymousUuidKey,
33
- loginTypeKey,
34
- userInfoKey
31
+ userInfoKey,
32
+ // accessTokenKey,
33
+ // accessTokenExpireKey,
34
+ // refreshTokenKey,
35
+ // anonymousUuidKey,
36
+ // loginTypeKey,
37
+ // deviceIdKey
35
38
  };
36
39
  // 若指定env已存在cache则尝试更新persistence
37
- cacheMap[env]?cacheMap[env].updatePersistence(persistence):(cacheMap[env] = new CloudbaseCache({
40
+ cacheMap[env] ? cacheMap[env].updatePersistence(persistence) : (cacheMap[env] = new CloudbaseCache({
38
41
  ...config,
39
42
  keys,
40
43
  platformInfo,
41
- alwaysLocalKeys: ['anonymousUuidKey']
42
44
  }));
43
45
  localCacheMap[env] = localCacheMap[env] || new CloudbaseCache({
44
46
  ...config,
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  DATA_VERSION,
3
- LOGINTYPE,
4
3
  getSdkVersion,
5
- getEndPoint
4
+ getEndPoint,
5
+ getBaseEndPoint
6
6
  } from '../constants/common';
7
7
  import {
8
8
  IRequestOptions,
@@ -15,15 +15,15 @@ import { utils, adapters, constants } from '@cloudbase/utilities';
15
15
  import { KV } from '@cloudbase/types';
16
16
  import { IGetAccessTokenResult, ICloudbaseRequestConfig, IAppendedRequestInfo, IRequestBeforeHook } from '@cloudbase/types/request';
17
17
  import { ICloudbaseCache } from '@cloudbase/types/cache';
18
- import { cloudbase } from '..';
19
- import { getCacheByEnvId, getLocalCache } from './cache';
20
- import { EVENTS } from '../constants/events';
18
+ import { getLocalCache } from './cache';
21
19
  import { Platform } from './adapter';
22
-
23
20
  const { ERRORS } = constants;
24
21
  const { genSeqId, isFormData, formatUrl, createSign } = utils;
25
22
  const { RUNTIME } = adapters;
26
23
 
24
+ // import FingerprintJS from '@fingerprintjs/fingerprintjs'
25
+ // const fpPromise = FingerprintJS.load()
26
+
27
27
  // 下面几种 action 不需要 access token
28
28
  const ACTIONS_WITHOUT_ACCESSTOKEN = [
29
29
  'auth.getJwt',
@@ -85,8 +85,6 @@ export interface ICloudbaseRequest {
85
85
  post: (options: IRequestOptions) => Promise<ResponseObject>;
86
86
  upload: (options: IUploadRequestOptions) => Promise<ResponseObject>;
87
87
  download: (options: IRequestOptions) => Promise<ResponseObject>;
88
- refreshAccessToken: () => Promise<IGetAccessTokenResult>;
89
- getAccessToken: () => Promise<IGetAccessTokenResult>;
90
88
  request: (action: string, params: KV<any>, options?: KV<any>) => Promise<ResponseObject>;
91
89
  send: (action: string, data: KV<any>) => Promise<any>;
92
90
  }
@@ -101,7 +99,6 @@ export class CloudbaseRequest implements ICloudbaseRequest {
101
99
  _reqClass: SDKRequestInterface;
102
100
  // 请求失败是否抛出Error
103
101
  private _throwWhenRequestFail = false;
104
- private _cache: ICloudbaseCache;
105
102
  // 持久化本地存储
106
103
  private _localCache: ICloudbaseCache;
107
104
  /**
@@ -109,6 +106,7 @@ export class CloudbaseRequest implements ICloudbaseRequest {
109
106
  * @param config
110
107
  */
111
108
  constructor(config: ICloudbaseRequestConfig & { throw?: boolean }) {
109
+
112
110
  this.config = config;
113
111
  // eslint-disable-next-line
114
112
  this._reqClass = new Platform.adapter.reqClass(<IRequestConfig>{
@@ -117,12 +115,12 @@ export class CloudbaseRequest implements ICloudbaseRequest {
117
115
  restrictedMethods: ['post']
118
116
  });
119
117
  this._throwWhenRequestFail = config.throw || false;
120
- this._cache = getCacheByEnvId(this.config.env);
121
118
  this._localCache = getLocalCache(this.config.env);
122
119
  bindHooks(this._reqClass, 'post', [beforeEach]);
123
120
  bindHooks(this._reqClass, 'upload', [beforeEach]);
124
121
  bindHooks(this._reqClass, 'download', [beforeEach]);
125
122
  }
123
+
126
124
  public async post(options: IRequestOptions): Promise<ResponseObject> {
127
125
  const res = await this._reqClass.post(options);
128
126
  return res;
@@ -136,61 +134,20 @@ export class CloudbaseRequest implements ICloudbaseRequest {
136
134
  return res;
137
135
  }
138
136
 
139
- public async refreshAccessToken(): Promise<IGetAccessTokenResult> {
140
- // 可能会同时调用多次刷新access token,这里把它们合并成一个
141
- if (!this._refreshAccessTokenPromise) {
142
- // 没有正在刷新,那么正常执行刷新逻辑
143
- this._refreshAccessTokenPromise = this._refreshAccessToken();
144
- }
145
-
146
- let result;
147
- let err;
148
- try {
149
- result = await this._refreshAccessTokenPromise;
150
- } catch (e) {
151
- err = e;
152
- }
153
- this._refreshAccessTokenPromise = null;
154
- this._shouldRefreshAccessTokenHook = null;
155
- if (err) {
156
- throw err;
157
- }
158
- return result;
137
+ public getBaseEndPoint() {
138
+ return getBaseEndPoint()
159
139
  }
160
140
 
161
- // 获取access token
162
- public async getAccessToken(): Promise<IGetAccessTokenResult> {
163
- const { accessTokenKey, accessTokenExpireKey, refreshTokenKey } = this._cache.keys;
164
- const refreshToken = await this._cache.getStoreAsync(refreshTokenKey);
165
- if (!refreshToken) {
166
- // 不该出现的状态:有 access token 却没有 refresh token
167
- throw new Error(JSON.stringify({
168
- code: ERRORS.OPERATION_FAIL,
169
- msg: 'refresh token is not exist, your local data might be messed up, please retry after clear localStorage or sessionStorage'
170
- }));
171
- }
172
- // 如果没有access token或者过期,那么刷新
173
- const accessToken = await this._cache.getStoreAsync(accessTokenKey);
174
- const accessTokenExpire = Number(await this._cache.getStoreAsync(accessTokenExpireKey));
175
-
176
- // 调用钩子函数
177
- let shouldRefreshAccessToken = true;
178
- if (this._shouldRefreshAccessTokenHook && !(await this._shouldRefreshAccessTokenHook(accessToken, accessTokenExpire))) {
179
- shouldRefreshAccessToken = false;
180
- }
181
-
182
- if ((!accessToken || !accessTokenExpire || accessTokenExpire < Date.now()) && shouldRefreshAccessToken) {
183
- // 返回新的access tolen
184
- return await this.refreshAccessToken();
185
- } else {
186
- // 返回本地的access token
187
- return {
188
- accessToken,
189
- accessTokenExpire
190
- };
141
+ public async getOauthAccessTokenV2(oauthClient: any): Promise<IGetAccessTokenResult> {
142
+ const validAccessToken = await oauthClient.getAccessToken()
143
+ const credentials = await oauthClient._getCredentials()
144
+ return {
145
+ accessToken: validAccessToken,
146
+ accessTokenExpire: new Date(credentials.expires_at).getTime()
191
147
  }
192
148
  }
193
149
 
150
+
194
151
  /* eslint-disable complexity */
195
152
  public async request(action: string, params: KV<any>, options?: KV<any>): Promise<ResponseObject> {
196
153
  const tcbTraceKey = `x-tcb-trace_${this.config.env}`;
@@ -204,15 +161,10 @@ export class CloudbaseRequest implements ICloudbaseRequest {
204
161
  ...params
205
162
  };
206
163
 
207
-
208
164
  if (ACTIONS_WITHOUT_ACCESSTOKEN.indexOf(action) === -1) {
209
- const { refreshTokenKey } = this._cache.keys;
210
-
211
- // 若有 refreshToken 则任务有登录态 刷 accessToken
212
- const refreshToken = await this._cache.getStoreAsync(refreshTokenKey);
213
- if (refreshToken) {
214
- tmpObj.access_token = (await this.getAccessToken()).accessToken;
215
- }
165
+ const app = this.config._fromApp
166
+ const oauthClient = app.oauthInstance.oauth2client
167
+ tmpObj.access_token = (await this.getOauthAccessTokenV2(oauthClient)).accessToken
216
168
  }
217
169
 
218
170
  // 拼body和content-type
@@ -308,11 +260,6 @@ export class CloudbaseRequest implements ICloudbaseRequest {
308
260
 
309
261
  public async send(action: string, data: KV<any> = {}): Promise<any> {
310
262
  let response = await this.request(action, data, { onUploadProgress: data.onUploadProgress });
311
- if (response.data.code === 'ACCESS_TOKEN_EXPIRED' && ACTIONS_WITHOUT_ACCESSTOKEN.indexOf(action) === -1) {
312
- // access_token过期,重新获取
313
- await this.refreshAccessToken();
314
- response = await this.request(action, data, { onUploadProgress: data.onUploadProgress });
315
- }
316
263
 
317
264
  if (response.data.code && this._throwWhenRequestFail) {
318
265
  throw new Error(JSON.stringify({
@@ -323,86 +270,6 @@ export class CloudbaseRequest implements ICloudbaseRequest {
323
270
 
324
271
  return response.data;
325
272
  }
326
-
327
- // 调用接口刷新access token,并且返回
328
- private async _refreshAccessToken(retryNum = 1): Promise<IGetAccessTokenResult> {
329
- const { accessTokenKey, accessTokenExpireKey, refreshTokenKey, loginTypeKey, anonymousUuidKey } = this._cache.keys;
330
- await this._cache.removeStoreAsync(accessTokenKey);
331
- await this._cache.removeStoreAsync(accessTokenExpireKey);
332
-
333
- let refreshToken = await this._cache.getStoreAsync(refreshTokenKey);
334
- if (!refreshToken) {
335
- throw new Error(JSON.stringify({
336
- code: ERRORS.INVALID_OPERATION,
337
- msg: 'not login'
338
- }));
339
- }
340
- const params: KV<string> = {
341
- refresh_token: refreshToken
342
- };
343
- const response = await this.request('auth.fetchAccessTokenWithRefreshToken', params);
344
- if (response.data.code) {
345
- const { code } = response.data;
346
- if (code === 'SIGN_PARAM_INVALID' || code === 'REFRESH_TOKEN_EXPIRED' || code === 'INVALID_REFRESH_TOKEN') {
347
- // 这里处理以下逻辑:
348
- // 匿名登录时,如果刷新access token报错refresh token过期,此时应该:
349
- // 1. 再用 uuid 拿一次新的refresh token
350
- // 2. 拿新的refresh token换access token
351
- const isAnonymous = await this._cache.getStoreAsync(loginTypeKey) === LOGINTYPE.ANONYMOUS;
352
- if (isAnonymous && code === 'INVALID_REFRESH_TOKEN') {
353
- // 获取新的 refresh token
354
- const anonymous_uuid = await this._cache.getStoreAsync(anonymousUuidKey);
355
- // 此处cache为基类property
356
- const refresh_token = await this._cache.getStoreAsync(refreshTokenKey);
357
- const res = await this.send('auth.signInAnonymously', {
358
- anonymous_uuid,
359
- refresh_token
360
- });
361
- this._setRefreshToken(res.refresh_token);
362
- if (retryNum >= 1) {
363
- return this._refreshAccessToken(--retryNum);
364
- } else {
365
- throw new Error(
366
- JSON.stringify({
367
- code: ERRORS.OPERATION_FAIL,
368
- message: '重试获取 refresh token 失败'
369
- })
370
- )
371
- }
372
- }
373
- cloudbase.fire(EVENTS.LOGIN_STATE_EXPIRED);
374
- await this._cache.removeStoreAsync(refreshTokenKey);
375
- }
376
- throw new Error(JSON.stringify({
377
- code: ERRORS.NETWORK_ERROR,
378
- msg: `refresh access_token failed:${response.data.code}`
379
- }));
380
- }
381
- if (response.data.access_token) {
382
- cloudbase.fire(EVENTS.ACCESS_TOKEN_REFRESHD);
383
- await this._cache.setStoreAsync(accessTokenKey, response.data.access_token);
384
- // 本地时间可能没有同步
385
- await this._cache.setStoreAsync(accessTokenExpireKey, response.data.access_token_expire + Date.now());
386
- return {
387
- accessToken: response.data.access_token,
388
- accessTokenExpire: response.data.access_token_expire
389
- };
390
- }
391
- // 匿名登录refresh_token过期情况下返回refresh_token
392
- // 此场景下使用新的refresh_token获取access_token
393
- if (response.data.refresh_token) {
394
- await this._cache.removeStoreAsync(refreshTokenKey);
395
- await this._cache.setStoreAsync(refreshTokenKey, response.data.refresh_token);
396
- await this._refreshAccessToken();
397
- }
398
- }
399
- private async _setRefreshToken(refreshToken: string) {
400
- const { accessTokenKey, accessTokenExpireKey, refreshTokenKey } = this._cache.keys;
401
- // refresh token设置前,先清掉 access token
402
- await this._cache.removeStoreAsync(accessTokenKey);
403
- await this._cache.removeStoreAsync(accessTokenExpireKey);
404
- await this._cache.setStoreAsync(refreshTokenKey, refreshToken);
405
- }
406
273
  }
407
274
 
408
275
  const requestMap: KV<CloudbaseRequest> = {};
@@ -1,7 +0,0 @@
1
- export declare const EVENTS: {
2
- LOGIN_STATE_CHANGED: string;
3
- LOGIN_STATE_EXPIRED: string;
4
- LOGIN_TYPE_CHANGED: string;
5
- ANONYMOUS_CONVERTED: string;
6
- ACCESS_TOKEN_REFRESHD: string;
7
- };
@@ -1,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EVENTS = void 0;
4
- exports.EVENTS = {
5
- LOGIN_STATE_CHANGED: 'loginStateChanged',
6
- LOGIN_STATE_EXPIRED: 'loginStateExpire',
7
- LOGIN_TYPE_CHANGED: 'loginTypeChanged',
8
- ANONYMOUS_CONVERTED: 'anonymousConverted',
9
- ACCESS_TOKEN_REFRESHD: 'refreshAccessToken'
10
- };
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbnN0YW50cy9ldmVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQWEsUUFBQSxNQUFNLEdBQUc7SUFDcEIsbUJBQW1CLEVBQUksbUJBQW1CO0lBQzFDLG1CQUFtQixFQUFJLGtCQUFrQjtJQUN6QyxrQkFBa0IsRUFBSyxrQkFBa0I7SUFDekMsbUJBQW1CLEVBQUksb0JBQW9CO0lBQzNDLHFCQUFxQixFQUFFLG9CQUFvQjtDQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IEVWRU5UUyA9IHtcbiAgTE9HSU5fU1RBVEVfQ0hBTkdFRCAgOiAnbG9naW5TdGF0ZUNoYW5nZWQnLFxuICBMT0dJTl9TVEFURV9FWFBJUkVEICA6ICdsb2dpblN0YXRlRXhwaXJlJyxcbiAgTE9HSU5fVFlQRV9DSEFOR0VEICAgOiAnbG9naW5UeXBlQ2hhbmdlZCcsXG4gIEFOT05ZTU9VU19DT05WRVJURUQgIDogJ2Fub255bW91c0NvbnZlcnRlZCcsIC8v5Yy/5ZCN6LSm5oi36KKr6L2s5q2j5ZCO6Kem5Y+RXG4gIEFDQ0VTU19UT0tFTl9SRUZSRVNIRDogJ3JlZnJlc2hBY2Nlc3NUb2tlbidcbn07XG4iXX0=
@@ -1,7 +0,0 @@
1
- export declare const EVENTS: {
2
- LOGIN_STATE_CHANGED: string;
3
- LOGIN_STATE_EXPIRED: string;
4
- LOGIN_TYPE_CHANGED: string;
5
- ANONYMOUS_CONVERTED: string;
6
- ACCESS_TOKEN_REFRESHD: string;
7
- };
@@ -1,8 +0,0 @@
1
- export var EVENTS = {
2
- LOGIN_STATE_CHANGED: 'loginStateChanged',
3
- LOGIN_STATE_EXPIRED: 'loginStateExpire',
4
- LOGIN_TYPE_CHANGED: 'loginTypeChanged',
5
- ANONYMOUS_CONVERTED: 'anonymousConverted',
6
- ACCESS_TOKEN_REFRESHD: 'refreshAccessToken'
7
- };
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbnN0YW50cy9ldmVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLElBQU0sTUFBTSxHQUFHO0lBQ3BCLG1CQUFtQixFQUFJLG1CQUFtQjtJQUMxQyxtQkFBbUIsRUFBSSxrQkFBa0I7SUFDekMsa0JBQWtCLEVBQUssa0JBQWtCO0lBQ3pDLG1CQUFtQixFQUFJLG9CQUFvQjtJQUMzQyxxQkFBcUIsRUFBRSxvQkFBb0I7Q0FDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBFVkVOVFMgPSB7XG4gIExPR0lOX1NUQVRFX0NIQU5HRUQgIDogJ2xvZ2luU3RhdGVDaGFuZ2VkJyxcbiAgTE9HSU5fU1RBVEVfRVhQSVJFRCAgOiAnbG9naW5TdGF0ZUV4cGlyZScsXG4gIExPR0lOX1RZUEVfQ0hBTkdFRCAgIDogJ2xvZ2luVHlwZUNoYW5nZWQnLFxuICBBTk9OWU1PVVNfQ09OVkVSVEVEICA6ICdhbm9ueW1vdXNDb252ZXJ0ZWQnLCAvL+WMv+WQjei0puaIt+iiq+i9rOato+WQjuinpuWPkVxuICBBQ0NFU1NfVE9LRU5fUkVGUkVTSEQ6ICdyZWZyZXNoQWNjZXNzVG9rZW4nXG59O1xuIl19
@@ -1,7 +0,0 @@
1
- export const EVENTS = {
2
- LOGIN_STATE_CHANGED : 'loginStateChanged',
3
- LOGIN_STATE_EXPIRED : 'loginStateExpire',
4
- LOGIN_TYPE_CHANGED : 'loginTypeChanged',
5
- ANONYMOUS_CONVERTED : 'anonymousConverted', //匿名账户被转正后触发
6
- ACCESS_TOKEN_REFRESHD: 'refreshAccessToken'
7
- };