@cloudbase/auth 1.6.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.
Files changed (46) hide show
  1. package/dist/cjs/index.d.ts +50 -96
  2. package/dist/cjs/index.js +411 -679
  3. package/dist/esm/index.d.ts +50 -96
  4. package/dist/esm/index.js +412 -676
  5. package/package.json +52 -54
  6. package/src/index.ts +413 -650
  7. package/dist/cjs/constants.d.ts +0 -11
  8. package/dist/cjs/constants.js +0 -16
  9. package/dist/cjs/providers/anonymousAuthProvider.d.ts +0 -15
  10. package/dist/cjs/providers/anonymousAuthProvider.js +0 -255
  11. package/dist/cjs/providers/base.d.ts +0 -20
  12. package/dist/cjs/providers/base.js +0 -158
  13. package/dist/cjs/providers/customAuthProvider.d.ts +0 -5
  14. package/dist/cjs/providers/customAuthProvider.js +0 -149
  15. package/dist/cjs/providers/emailAuthProvider.d.ts +0 -9
  16. package/dist/cjs/providers/emailAuthProvider.js +0 -248
  17. package/dist/cjs/providers/phoneAuthProvider.d.ts +0 -17
  18. package/dist/cjs/providers/phoneAuthProvider.js +0 -217
  19. package/dist/cjs/providers/usernameAuthProvider.d.ts +0 -5
  20. package/dist/cjs/providers/usernameAuthProvider.js +0 -168
  21. package/dist/cjs/providers/weixinAuthProvider.d.ts +0 -28
  22. package/dist/cjs/providers/weixinAuthProvider.js +0 -294
  23. package/dist/esm/constants.d.ts +0 -11
  24. package/dist/esm/constants.js +0 -13
  25. package/dist/esm/providers/anonymousAuthProvider.d.ts +0 -15
  26. package/dist/esm/providers/anonymousAuthProvider.js +0 -252
  27. package/dist/esm/providers/base.d.ts +0 -20
  28. package/dist/esm/providers/base.js +0 -155
  29. package/dist/esm/providers/customAuthProvider.d.ts +0 -5
  30. package/dist/esm/providers/customAuthProvider.js +0 -146
  31. package/dist/esm/providers/emailAuthProvider.d.ts +0 -9
  32. package/dist/esm/providers/emailAuthProvider.js +0 -245
  33. package/dist/esm/providers/phoneAuthProvider.d.ts +0 -17
  34. package/dist/esm/providers/phoneAuthProvider.js +0 -214
  35. package/dist/esm/providers/usernameAuthProvider.d.ts +0 -5
  36. package/dist/esm/providers/usernameAuthProvider.js +0 -165
  37. package/dist/esm/providers/weixinAuthProvider.d.ts +0 -28
  38. package/dist/esm/providers/weixinAuthProvider.js +0 -291
  39. package/src/constants.ts +0 -11
  40. package/src/providers/anonymousAuthProvider.ts +0 -125
  41. package/src/providers/base.ts +0 -66
  42. package/src/providers/customAuthProvider.ts +0 -68
  43. package/src/providers/emailAuthProvider.ts +0 -139
  44. package/src/providers/phoneAuthProvider.ts +0 -130
  45. package/src/providers/usernameAuthProvider.ts +0 -76
  46. package/src/providers/weixinAuthProvider.ts +0 -193
@@ -1,291 +0,0 @@
1
- var __extends = (this && this.__extends) || (function () {
2
- var extendStatics = function (d, b) {
3
- extendStatics = Object.setPrototypeOf ||
4
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
5
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
6
- return extendStatics(d, b);
7
- };
8
- return function (d, b) {
9
- extendStatics(d, b);
10
- function __() { this.constructor = d; }
11
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
12
- };
13
- })();
14
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
15
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
16
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
17
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
18
- return c > 3 && r && Object.defineProperty(target, key, r), r;
19
- };
20
- var __metadata = (this && this.__metadata) || function (k, v) {
21
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
22
- };
23
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
24
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
25
- return new (P || (P = Promise))(function (resolve, reject) {
26
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
27
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
28
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
29
- step((generator = generator.apply(thisArg, _arguments || [])).next());
30
- });
31
- };
32
- var __generator = (this && this.__generator) || function (thisArg, body) {
33
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
34
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
35
- function verb(n) { return function (v) { return step([n, v]); }; }
36
- function step(op) {
37
- if (f) throw new TypeError("Generator is already executing.");
38
- while (_) try {
39
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
40
- if (y = 0, t) op = [op[0] & 2, t.value];
41
- switch (op[0]) {
42
- case 0: case 1: t = op; break;
43
- case 4: _.label++; return { value: op[1], done: false };
44
- case 5: _.label++; y = op[1]; op = [0]; continue;
45
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
46
- default:
47
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
48
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
49
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
50
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
51
- if (t[2]) _.ops.pop();
52
- _.trys.pop(); continue;
53
- }
54
- op = body.call(thisArg, _);
55
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
56
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
57
- }
58
- };
59
- import { AuthProvider } from './base';
60
- import { constants, adapters, utils, helpers } from '@cloudbase/utilities/';
61
- import { eventBus, EVENTS, LoginState } from '..';
62
- import { LOGINTYPE } from '../constants';
63
- var getSdkName = constants.getSdkName, ERRORS = constants.ERRORS, COMMUNITY_SITE_URL = constants.COMMUNITY_SITE_URL;
64
- var RUNTIME = adapters.RUNTIME;
65
- var getQuery = utils.getQuery, getHash = utils.getHash, removeParam = utils.removeParam, printWarn = utils.printWarn;
66
- var catchErrorsDecorator = helpers.catchErrorsDecorator;
67
- var WeixinAuthProvider = (function (_super) {
68
- __extends(WeixinAuthProvider, _super);
69
- function WeixinAuthProvider(config, appid, scope, state) {
70
- var _this = _super.call(this, config) || this;
71
- _this._runtime = config.runtime;
72
- _this._appid = appid;
73
- _this._scope = scope;
74
- _this._state = state || 'weixin';
75
- return _this;
76
- }
77
- WeixinAuthProvider.prototype.signIn = function () {
78
- return __awaiter(this, void 0, void 0, function () {
79
- return __generator(this, function (_a) {
80
- return [2, printWarn(ERRORS.OPERATION_FAIL, 'API signIn has been deprecated, please use signInWithRedirect insteed')];
81
- });
82
- });
83
- };
84
- WeixinAuthProvider.prototype.signInWithRedirect = function () {
85
- return __awaiter(this, void 0, void 0, function () {
86
- return __generator(this, function (_a) {
87
- return [2, this._redirect()];
88
- });
89
- });
90
- };
91
- WeixinAuthProvider.prototype.getRedirectResult = function (options) {
92
- return __awaiter(this, void 0, void 0, function () {
93
- var code;
94
- return __generator(this, function (_a) {
95
- code = getWeixinCode();
96
- if (!code) {
97
- return [2, null];
98
- }
99
- return [2, this._signInWithCode(code, options)];
100
- });
101
- });
102
- };
103
- WeixinAuthProvider.prototype.getLinkRedirectResult = function (options) {
104
- if (options === void 0) { options = {}; }
105
- return __awaiter(this, void 0, void 0, function () {
106
- var _a, withUnionId, code, appid, loginType, hybridMiniapp;
107
- return __generator(this, function (_b) {
108
- _a = options.withUnionId, withUnionId = _a === void 0 ? false : _a;
109
- code = getWeixinCode();
110
- if (!code) {
111
- return [2, null];
112
- }
113
- appid = this._appid;
114
- loginType = (function (scope) {
115
- switch (scope) {
116
- case 'snsapi_login':
117
- return 'WECHAT-OPEN';
118
- default:
119
- return 'WECHAT-PUBLIC';
120
- }
121
- })(this._scope);
122
- hybridMiniapp = this._runtime === RUNTIME.WX_MP ? '1' : '0';
123
- return [2, this._request.send('auth.linkWithWeixinCode', {
124
- payload: {
125
- appid: appid,
126
- loginType: loginType,
127
- code: code,
128
- hybridMiniapp: hybridMiniapp,
129
- withUnionId: withUnionId
130
- }
131
- })];
132
- });
133
- });
134
- };
135
- WeixinAuthProvider.prototype._redirect = function () {
136
- var currUrl = removeParam('code', location.href);
137
- currUrl = removeParam('state', currUrl);
138
- currUrl = encodeURIComponent(currUrl);
139
- var host = '//open.weixin.qq.com/connect/oauth2/authorize';
140
- if (this._scope === 'snsapi_login') {
141
- host = '//open.weixin.qq.com/connect/qrconnect';
142
- }
143
- try {
144
- location.href = host + "?appid=" + this._appid + "&redirect_uri=" + currUrl + "&response_type=code&scope=" + this._scope + "&state=" + this._state + "#wechat_redirect";
145
- }
146
- catch (e) {
147
- throw new Error("[" + getSdkName() + "][" + ERRORS.UNKOWN_ERROR + "]" + e);
148
- }
149
- };
150
- WeixinAuthProvider.prototype._signInWithCode = function (code, options) {
151
- return __awaiter(this, void 0, void 0, function () {
152
- var _a, accessTokenKey, accessTokenExpireKey, refreshTokenKey, loginType, refreshTokenRes, refreshToken, loginState;
153
- return __generator(this, function (_b) {
154
- switch (_b.label) {
155
- case 0:
156
- _a = this._cache.keys, accessTokenKey = _a.accessTokenKey, accessTokenExpireKey = _a.accessTokenExpireKey, refreshTokenKey = _a.refreshTokenKey;
157
- loginType = (function (scope) {
158
- switch (scope) {
159
- case 'snsapi_login':
160
- return 'WECHAT-OPEN';
161
- default:
162
- return 'WECHAT-PUBLIC';
163
- }
164
- })(this._scope);
165
- return [4, this._getRefreshTokenByWXCode(this._appid, loginType, code, options)];
166
- case 1:
167
- refreshTokenRes = _b.sent();
168
- refreshToken = refreshTokenRes.refreshToken;
169
- return [4, this._cache.setStoreAsync(refreshTokenKey, refreshToken)];
170
- case 2:
171
- _b.sent();
172
- if (!refreshTokenRes.accessToken) return [3, 4];
173
- return [4, this._cache.setStoreAsync(accessTokenKey, refreshTokenRes.accessToken)];
174
- case 3:
175
- _b.sent();
176
- _b.label = 4;
177
- case 4:
178
- if (!refreshTokenRes.accessTokenExpire) return [3, 6];
179
- return [4, this._cache.setStoreAsync(accessTokenExpireKey, String(refreshTokenRes.accessTokenExpire + Date.now()))];
180
- case 5:
181
- _b.sent();
182
- _b.label = 6;
183
- case 6:
184
- eventBus.fire(EVENTS.LOGIN_STATE_CHANGED);
185
- eventBus.fire(EVENTS.LOGIN_TYPE_CHANGED, {
186
- env: this._config.env,
187
- loginType: LOGINTYPE.WECHAT,
188
- persistence: this._config.persistence
189
- });
190
- return [4, this.refreshUserInfo()];
191
- case 7:
192
- _b.sent();
193
- loginState = new LoginState({
194
- envId: this._config.env,
195
- cache: this._cache,
196
- request: this._request
197
- });
198
- return [4, loginState.checkLocalStateAsync()];
199
- case 8:
200
- _b.sent();
201
- return [2, loginState];
202
- }
203
- });
204
- });
205
- };
206
- WeixinAuthProvider.prototype._getRefreshTokenByWXCode = function (appid, loginType, code, options) {
207
- if (options === void 0) { options = {}; }
208
- return __awaiter(this, void 0, void 0, function () {
209
- var _a, withUnionId, _b, createUser, syncUserInfo, action, hybridMiniapp;
210
- return __generator(this, function (_c) {
211
- _a = options.withUnionId, withUnionId = _a === void 0 ? false : _a, _b = options.createUser, createUser = _b === void 0 ? true : _b;
212
- syncUserInfo = this._scope === 'snsapi_base' ? false : options.syncUserInfo || false;
213
- action = 'auth.signIn';
214
- hybridMiniapp = this._runtime === RUNTIME.WX_MP ? '1' : '0';
215
- return [2, this._request.send(action, {
216
- appid: appid,
217
- loginType: loginType,
218
- hybridMiniapp: hybridMiniapp,
219
- syncUserInfo: syncUserInfo,
220
- loginCredential: code,
221
- withUnionId: withUnionId,
222
- createUser: createUser
223
- }).then(function (res) {
224
- if (res.code) {
225
- throw new Error("[" + getSdkName() + "][" + ERRORS.OPERATION_FAIL + "] failed login via wechat: " + res.code);
226
- }
227
- if (res.refresh_token) {
228
- return {
229
- refreshToken: res.refresh_token,
230
- accessToken: res.access_token,
231
- accessTokenExpire: res.access_token_expire
232
- };
233
- }
234
- else {
235
- throw new Error("[" + getSdkName() + "][" + ERRORS.OPERATION_FAIL + "] action:getJwt not return refreshToken");
236
- }
237
- })];
238
- });
239
- });
240
- };
241
- __decorate([
242
- catchErrorsDecorator({
243
- title: '跳转微信公众号授权失败',
244
- messages: [
245
- '请确认以下各项:',
246
- ' 1 - 调用 auth().weixinAuthProvider().signInWithRedirect() 的语法或参数是否正确',
247
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A" + COMMUNITY_SITE_URL
248
- ]
249
- }),
250
- __metadata("design:type", Function),
251
- __metadata("design:paramtypes", []),
252
- __metadata("design:returntype", Promise)
253
- ], WeixinAuthProvider.prototype, "signInWithRedirect", null);
254
- __decorate([
255
- catchErrorsDecorator({
256
- title: '微信公众号登录失败',
257
- messages: [
258
- '请确认以下各项:',
259
- ' 1 - 调用 auth().weixinAuthProvider().getRedirectResult() 的语法或参数是否正确',
260
- ' 2 - 当前环境是否开通了微信公众号登录授权',
261
- ' 3 - 微信公众号的 AppId 与 AppSecret 配置是否正确',
262
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A" + COMMUNITY_SITE_URL
263
- ]
264
- }),
265
- __metadata("design:type", Function),
266
- __metadata("design:paramtypes", [Object]),
267
- __metadata("design:returntype", Promise)
268
- ], WeixinAuthProvider.prototype, "getRedirectResult", null);
269
- __decorate([
270
- catchErrorsDecorator({
271
- title: '获取微信重定向绑定结果',
272
- messages: [
273
- '请确认以下各项:',
274
- ' 1 - 调用 auth().weixinAuthProvider().getLinkRedirectResult() 的语法或参数是否正确',
275
- ' 2 - 当前环境是否开通了微信公众号登录授权',
276
- ' 3 - 微信公众号的 AppId 与 AppSecret 配置是否正确',
277
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A" + COMMUNITY_SITE_URL
278
- ]
279
- }),
280
- __metadata("design:type", Function),
281
- __metadata("design:paramtypes", [Object]),
282
- __metadata("design:returntype", Promise)
283
- ], WeixinAuthProvider.prototype, "getLinkRedirectResult", null);
284
- return WeixinAuthProvider;
285
- }(AuthProvider));
286
- export { WeixinAuthProvider };
287
- function getWeixinCode() {
288
- return getQuery('code') || getHash('code');
289
- }
290
- ;
291
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VpeGluQXV0aFByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy93ZWl4aW5BdXRoUHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFJdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLElBQUksQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRWpDLElBQUEsVUFBVSxHQUFpQyxTQUFTLFdBQTFDLEVBQUUsTUFBTSxHQUF5QixTQUFTLE9BQWxDLEVBQUUsa0JBQWtCLEdBQUssU0FBUyxtQkFBZCxDQUFlO0FBQ3JELElBQUEsT0FBTyxHQUFLLFFBQVEsUUFBYixDQUFjO0FBQ3JCLElBQUEsUUFBUSxHQUFzQyxLQUFLLFNBQTNDLEVBQUUsT0FBTyxHQUE2QixLQUFLLFFBQWxDLEVBQUUsV0FBVyxHQUFnQixLQUFLLFlBQXJCLEVBQUUsU0FBUyxHQUFLLEtBQUssVUFBVixDQUFXO0FBQ3BELElBQUEsb0JBQW9CLEdBQUssT0FBTyxxQkFBWixDQUFhO0FBRXpDO0lBQXdDLHNDQUFZO0lBTWxELDRCQUFZLE1BQTZGLEVBQUUsS0FBYSxFQUFFLEtBQWEsRUFBRSxLQUFjO1FBQXZKLFlBQ0Usa0JBQU0sTUFBTSxDQUFDLFNBTWQ7UUFKQyxLQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDL0IsS0FBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsS0FBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsS0FBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLElBQUksUUFBUSxDQUFDOztJQUNsQyxDQUFDO0lBRVksbUNBQU0sR0FBbkI7OztnQkFDRSxXQUFPLFNBQVMsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFDLHVFQUF1RSxDQUFDLEVBQUM7OztLQUNqSDtJQVNZLCtDQUFrQixHQUEvQjs7O2dCQUNFLFdBQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFDOzs7S0FDekI7SUFXWSw4Q0FBaUIsR0FBOUIsVUFBK0IsT0FBeUQ7Ozs7Z0JBQ2hGLElBQUksR0FBRyxhQUFhLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLElBQUksRUFBRTtvQkFDVCxXQUFPLElBQUksRUFBQztpQkFDYjtnQkFDRCxXQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFDLE9BQU8sQ0FBQyxFQUFDOzs7S0FDM0M7SUFXSyxrREFBcUIsR0FBM0IsVUFBNEIsT0FBdUM7UUFBdkMsd0JBQUEsRUFBQSxZQUF1Qzs7OztnQkFDekQsS0FBd0IsT0FBTyxZQUFaLEVBQW5CLFdBQVcsbUJBQUcsS0FBSyxLQUFBLENBQWE7Z0JBQ2xDLElBQUksR0FBRyxhQUFhLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLElBQUksRUFBRTtvQkFDVCxXQUFPLElBQUksRUFBQztpQkFDYjtnQkFDZSxLQUFLLEdBQUssSUFBSSxPQUFULENBQVU7Z0JBQ3pCLFNBQVMsR0FBRyxDQUFDLFVBQUEsS0FBSztvQkFDdEIsUUFBUSxLQUFLLEVBQUU7d0JBQ2IsS0FBSyxjQUFjOzRCQUNqQixPQUFPLGFBQWEsQ0FBQzt3QkFDdkI7NEJBQ0UsT0FBTyxlQUFlLENBQUM7cUJBQzFCO2dCQUNILENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDVixhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDbEUsV0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRTt3QkFDbkQsT0FBTyxFQUFFOzRCQUNQLEtBQUssT0FBQTs0QkFDTCxTQUFTLFdBQUE7NEJBQ1QsSUFBSSxNQUFBOzRCQUNKLGFBQWEsZUFBQTs0QkFDYixXQUFXLGFBQUE7eUJBQ1o7cUJBQ0YsQ0FBQyxFQUFDOzs7S0FDSjtJQUVPLHNDQUFTLEdBQWpCO1FBQ0UsSUFBSSxPQUFPLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDeEMsT0FBTyxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXRDLElBQUksSUFBSSxHQUFHLCtDQUErQyxDQUFDO1FBQzNELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxjQUFjLEVBQUU7WUFDbEMsSUFBSSxHQUFHLHdDQUF3QyxDQUFDO1NBQ2pEO1FBQ0QsSUFBRztZQUNELFFBQVEsQ0FBQyxJQUFJLEdBQU0sSUFBSSxlQUFVLElBQUksQ0FBQyxNQUFNLHNCQUFpQixPQUFPLGtDQUE2QixJQUFJLENBQUMsTUFBTSxlQUFVLElBQUksQ0FBQyxNQUFNLHFCQUFrQixDQUFDO1NBQ3JKO1FBQUEsT0FBTSxDQUFDLEVBQUM7WUFDUCxNQUFNLElBQUksS0FBSyxDQUFDLE1BQUksVUFBVSxFQUFFLFVBQUssTUFBTSxDQUFDLFlBQVksU0FBSSxDQUFHLENBQUMsQ0FBQTtTQUNqRTtJQUNILENBQUM7SUFFYSw0Q0FBZSxHQUE3QixVQUE4QixJQUFXLEVBQUMsT0FBTzs7Ozs7O3dCQUN6QyxLQUE0RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBMUUsY0FBYyxvQkFBQSxFQUFFLG9CQUFvQiwwQkFBQSxFQUFFLGVBQWUscUJBQUEsQ0FBc0I7d0JBRTdFLFNBQVMsR0FBRyxDQUFDLFVBQUEsS0FBSzs0QkFDdEIsUUFBUSxLQUFLLEVBQUU7Z0NBQ2IsS0FBSyxjQUFjO29DQUNqQixPQUFPLGFBQWEsQ0FBQztnQ0FDdkI7b0NBQ0UsT0FBTyxlQUFlLENBQUM7NkJBQzFCO3dCQUNILENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFFUSxXQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUMsT0FBTyxDQUFDLEVBQUE7O3dCQUEzRixlQUFlLEdBQUcsU0FBeUU7d0JBQ3pGLFlBQVksR0FBSyxlQUFlLGFBQXBCLENBQXFCO3dCQUd6QyxXQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUMsRUFBQTs7d0JBQTlELFNBQThELENBQUM7NkJBQzNELGVBQWUsQ0FBQyxXQUFXLEVBQTNCLGNBQTJCO3dCQUM3QixXQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxlQUFlLENBQUMsV0FBVyxDQUFDLEVBQUE7O3dCQUE1RSxTQUE0RSxDQUFDOzs7NkJBRTNFLGVBQWUsQ0FBQyxpQkFBaUIsRUFBakMsY0FBaUM7d0JBQ25DLFdBQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFBOzt3QkFBN0csU0FBNkcsQ0FBQzs7O3dCQUVoSCxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO3dCQUUxQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRTs0QkFDdkMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRzs0QkFDckIsU0FBUyxFQUFFLFNBQVMsQ0FBQyxNQUFNOzRCQUMzQixXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXO3lCQUN0QyxDQUFDLENBQUM7d0JBQ0gsV0FBTSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUE7O3dCQUE1QixTQUE0QixDQUFDO3dCQUN2QixVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUM7NEJBQ2hDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUc7NEJBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTTs0QkFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRO3lCQUN2QixDQUFDLENBQUM7d0JBQ0gsV0FBTSxVQUFVLENBQUMsb0JBQW9CLEVBQUUsRUFBQTs7d0JBQXZDLFNBQXVDLENBQUM7d0JBRXhDLFdBQU8sVUFBVSxFQUFDOzs7O0tBQ25CO0lBRWEscURBQXdCLEdBQXRDLFVBQ0UsS0FBYSxFQUNiLFNBQWlCLEVBQ2pCLElBQVksRUFDWixPQUFpQjtRQUFqQix3QkFBQSxFQUFBLFlBQWlCOzs7O2dCQUVULEtBQTJDLE9BQU8sWUFBL0IsRUFBbkIsV0FBVyxtQkFBRyxLQUFLLEtBQUEsRUFBRSxLQUFzQixPQUFPLFdBQVosRUFBakIsVUFBVSxtQkFBRyxJQUFJLEtBQUEsQ0FBYTtnQkFFckQsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLEtBQUssYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDO2dCQUVyRixNQUFNLEdBQUcsYUFBYSxDQUFDO2dCQUN2QixhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDbEUsV0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7d0JBQ2hDLEtBQUssT0FBQTt3QkFDTCxTQUFTLFdBQUE7d0JBQ1QsYUFBYSxlQUFBO3dCQUNiLFlBQVksY0FBQTt3QkFDWixlQUFlLEVBQUUsSUFBSTt3QkFDckIsV0FBVyxhQUFBO3dCQUNYLFVBQVUsWUFBQTtxQkFDWCxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRzt3QkFDVCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUU7NEJBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFJLFVBQVUsRUFBRSxVQUFLLE1BQU0sQ0FBQyxjQUFjLG1DQUE4QixHQUFHLENBQUMsSUFBTSxDQUFDLENBQUM7eUJBQ3JHO3dCQUNELElBQUksR0FBRyxDQUFDLGFBQWEsRUFBRTs0QkFDckIsT0FBTztnQ0FDTCxZQUFZLEVBQUUsR0FBRyxDQUFDLGFBQWE7Z0NBQy9CLFdBQVcsRUFBRSxHQUFHLENBQUMsWUFBWTtnQ0FDN0IsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLG1CQUFtQjs2QkFDM0MsQ0FBQzt5QkFDSDs2QkFBTTs0QkFDTCxNQUFNLElBQUksS0FBSyxDQUFDLE1BQUksVUFBVSxFQUFFLFVBQUssTUFBTSxDQUFDLGNBQWMsNENBQXlDLENBQUMsQ0FBQzt5QkFDdEc7b0JBQ0gsQ0FBQyxDQUFDLEVBQUM7OztLQUNKO0lBcEpEO1FBUkMsb0JBQW9CLENBQUM7WUFDcEIsS0FBSyxFQUFFLGFBQWE7WUFDcEIsUUFBUSxFQUFFO2dCQUNSLFVBQVU7Z0JBQ1Ysc0VBQXNFO2dCQUN0RSxpS0FBNkIsa0JBQW9CO2FBQ2xEO1NBQ0YsQ0FBQzs7OztnRUFHRDtJQVdEO1FBVkMsb0JBQW9CLENBQUM7WUFDcEIsS0FBSyxFQUFFLFdBQVc7WUFDbEIsUUFBUSxFQUFFO2dCQUNSLFVBQVU7Z0JBQ1YscUVBQXFFO2dCQUNyRSwwQkFBMEI7Z0JBQzFCLHVDQUF1QztnQkFDdkMsaUtBQTZCLGtCQUFvQjthQUNsRDtTQUNGLENBQUM7Ozs7K0RBT0Q7SUFXRDtRQVZDLG9CQUFvQixDQUFDO1lBQ3BCLEtBQUssRUFBRSxhQUFhO1lBQ3BCLFFBQVEsRUFBRTtnQkFDUixVQUFVO2dCQUNWLHlFQUF5RTtnQkFDekUsMEJBQTBCO2dCQUMxQix1Q0FBdUM7Z0JBQ3ZDLGlLQUE2QixrQkFBb0I7YUFDbEQ7U0FDRixDQUFDOzs7O21FQTBCRDtJQThGSCx5QkFBQztDQUFBLEFBL0tELENBQXdDLFlBQVksR0ErS25EO1NBL0tZLGtCQUFrQjtBQWlML0IsU0FBUyxhQUFhO0lBQ3BCLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF1dGhQcm92aWRlciB9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgeyBJQ2xvdWRiYXNlQXV0aENvbmZpZyB9IGZyb20gJ0BjbG91ZGJhc2UvdHlwZXMvYXV0aCc7XG5pbXBvcnQgeyBJQ2xvdWRiYXNlQ2FjaGUgfSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL2NhY2hlJztcbmltcG9ydCB7IElDbG91ZGJhc2VSZXF1ZXN0IH0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9yZXF1ZXN0JztcbmltcG9ydCB7IGNvbnN0YW50cywgYWRhcHRlcnMsdXRpbHMsIGhlbHBlcnMgfSBmcm9tICdAY2xvdWRiYXNlL3V0aWxpdGllcy8nO1xuaW1wb3J0IHsgZXZlbnRCdXMsIEVWRU5UUywgTG9naW5TdGF0ZSB9IGZyb20gJy4uJztcbmltcG9ydCB7IExPR0lOVFlQRSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbmNvbnN0IHsgZ2V0U2RrTmFtZSwgRVJST1JTLCBDT01NVU5JVFlfU0lURV9VUkwgfSA9IGNvbnN0YW50cztcbmNvbnN0IHsgUlVOVElNRSB9ID0gYWRhcHRlcnM7XG5jb25zdCB7IGdldFF1ZXJ5LCBnZXRIYXNoLCByZW1vdmVQYXJhbSwgcHJpbnRXYXJuIH0gPSB1dGlscztcbmNvbnN0IHsgY2F0Y2hFcnJvcnNEZWNvcmF0b3IgfSA9IGhlbHBlcnM7XG5cbmV4cG9ydCBjbGFzcyBXZWl4aW5BdXRoUHJvdmlkZXIgZXh0ZW5kcyBBdXRoUHJvdmlkZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IF9zY29wZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zdGF0ZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hcHBpZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOnN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IElDbG91ZGJhc2VBdXRoQ29uZmlnJntjYWNoZTpJQ2xvdWRiYXNlQ2FjaGUscmVxdWVzdDpJQ2xvdWRiYXNlUmVxdWVzdCxydW50aW1lOnN0cmluZ30sIGFwcGlkOiBzdHJpbmcsIHNjb3BlOiBzdHJpbmcsIHN0YXRlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuX3J1bnRpbWUgPSBjb25maWcucnVudGltZTtcbiAgICB0aGlzLl9hcHBpZCA9IGFwcGlkO1xuICAgIHRoaXMuX3Njb3BlID0gc2NvcGU7XG4gICAgdGhpcy5fc3RhdGUgPSBzdGF0ZSB8fCAnd2VpeGluJztcbiAgfVxuICBcbiAgcHVibGljIGFzeW5jIHNpZ25Jbigpe1xuICAgIHJldHVybiBwcmludFdhcm4oRVJST1JTLk9QRVJBVElPTl9GQUlMLCdBUEkgc2lnbkluIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2Ugc2lnbkluV2l0aFJlZGlyZWN0IGluc3RlZWQnKTtcbiAgfVxuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn6Lez6L2s5b6u5L+h5YWs5LyX5Y+35o6I5p2D5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGF1dGgoKS53ZWl4aW5BdXRoUHJvdmlkZXIoKS5zaWduSW5XaXRoUmVkaXJlY3QoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWBcbiAgICBdXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBzaWduSW5XaXRoUmVkaXJlY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlZGlyZWN0KCk7XG4gIH1cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+W+ruS/oeWFrOS8l+WPt+eZu+W9leWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBhdXRoKCkud2VpeGluQXV0aFByb3ZpZGVyKCkuZ2V0UmVkaXJlY3RSZXN1bHQoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOmAmuS6huW+ruS/oeWFrOS8l+WPt+eZu+W9leaOiOadgycsXG4gICAgICAnICAzIC0g5b6u5L+h5YWs5LyX5Y+355qEIEFwcElkIOS4jiBBcHBTZWNyZXQg6YWN572u5piv5ZCm5q2j56GuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gXG4gICAgXVxuICB9KVxuICBwdWJsaWMgYXN5bmMgZ2V0UmVkaXJlY3RSZXN1bHQob3B0aW9uczp7IHdpdGhVbmlvbklkPzogYm9vbGVhbjsgc3luY1VzZXJJbmZvPzogYm9vbGVhbiB9KSB7XG4gICAgY29uc3QgY29kZSA9IGdldFdlaXhpbkNvZGUoKTtcbiAgICBpZiAoIWNvZGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc2lnbkluV2l0aENvZGUoY29kZSxvcHRpb25zKTtcbiAgfVxuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn6I635Y+W5b6u5L+h6YeN5a6a5ZCR57uR5a6a57uT5p6cJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGF1dGgoKS53ZWl4aW5BdXRoUHJvdmlkZXIoKS5nZXRMaW5rUmVkaXJlY3RSZXN1bHQoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOmAmuS6huW+ruS/oeWFrOS8l+WPt+eZu+W9leaOiOadgycsXG4gICAgICAnICAzIC0g5b6u5L+h5YWs5LyX5Y+355qEIEFwcElkIOS4jiBBcHBTZWNyZXQg6YWN572u5piv5ZCm5q2j56GuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gXG4gICAgXVxuICB9KVxuICBhc3luYyBnZXRMaW5rUmVkaXJlY3RSZXN1bHQob3B0aW9uczogeyB3aXRoVW5pb25JZD86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgY29uc3QgeyB3aXRoVW5pb25JZCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNvZGUgPSBnZXRXZWl4aW5Db2RlKCk7XG4gICAgaWYgKCFjb2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgeyBfYXBwaWQ6IGFwcGlkIH0gPSB0aGlzO1xuICAgIGNvbnN0IGxvZ2luVHlwZSA9IChzY29wZSA9PiB7XG4gICAgICBzd2l0Y2ggKHNjb3BlKSB7XG4gICAgICAgIGNhc2UgJ3Nuc2FwaV9sb2dpbic6XG4gICAgICAgICAgcmV0dXJuICdXRUNIQVQtT1BFTic7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuICdXRUNIQVQtUFVCTElDJztcbiAgICAgIH1cbiAgICB9KSh0aGlzLl9zY29wZSk7XG4gICAgY29uc3QgaHlicmlkTWluaWFwcCA9IHRoaXMuX3J1bnRpbWUgPT09IFJVTlRJTUUuV1hfTVAgPyAnMScgOiAnMCc7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Quc2VuZCgnYXV0aC5saW5rV2l0aFdlaXhpbkNvZGUnLCB7IFxuICAgICAgcGF5bG9hZDogeyBcbiAgICAgICAgYXBwaWQsIFxuICAgICAgICBsb2dpblR5cGUsIFxuICAgICAgICBjb2RlLCBcbiAgICAgICAgaHlicmlkTWluaWFwcCwgXG4gICAgICAgIHdpdGhVbmlvbklkXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZWRpcmVjdCgpOiBhbnkge1xuICAgIGxldCBjdXJyVXJsID0gcmVtb3ZlUGFyYW0oJ2NvZGUnLCBsb2NhdGlvbi5ocmVmKTtcbiAgICBjdXJyVXJsID0gcmVtb3ZlUGFyYW0oJ3N0YXRlJywgY3VyclVybCk7XG4gICAgY3VyclVybCA9IGVuY29kZVVSSUNvbXBvbmVudChjdXJyVXJsKTtcblxuICAgIGxldCBob3N0ID0gJy8vb3Blbi53ZWl4aW4ucXEuY29tL2Nvbm5lY3Qvb2F1dGgyL2F1dGhvcml6ZSc7XG4gICAgaWYgKHRoaXMuX3Njb3BlID09PSAnc25zYXBpX2xvZ2luJykge1xuICAgICAgaG9zdCA9ICcvL29wZW4ud2VpeGluLnFxLmNvbS9jb25uZWN0L3FyY29ubmVjdCc7XG4gICAgfVxuICAgIHRyeXtcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSBgJHtob3N0fT9hcHBpZD0ke3RoaXMuX2FwcGlkfSZyZWRpcmVjdF91cmk9JHtjdXJyVXJsfSZyZXNwb25zZV90eXBlPWNvZGUmc2NvcGU9JHt0aGlzLl9zY29wZX0mc3RhdGU9JHt0aGlzLl9zdGF0ZX0jd2VjaGF0X3JlZGlyZWN0YDtcbiAgICB9Y2F0Y2goZSl7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFske2dldFNka05hbWUoKX1dWyR7RVJST1JTLlVOS09XTl9FUlJPUn1dJHtlfWApXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfc2lnbkluV2l0aENvZGUoY29kZTpzdHJpbmcsb3B0aW9ucykge1xuICAgIGNvbnN0IHsgYWNjZXNzVG9rZW5LZXksIGFjY2Vzc1Rva2VuRXhwaXJlS2V5LCByZWZyZXNoVG9rZW5LZXkgfSA9IHRoaXMuX2NhY2hlLmtleXM7XG4gICAgLy8g5pyJY29kZe+8jOeUqGNvZGXmjaJyZWZyZXNoIHRva2VuXG4gICAgY29uc3QgbG9naW5UeXBlID0gKHNjb3BlID0+IHtcbiAgICAgIHN3aXRjaCAoc2NvcGUpIHtcbiAgICAgICAgY2FzZSAnc25zYXBpX2xvZ2luJzpcbiAgICAgICAgICByZXR1cm4gJ1dFQ0hBVC1PUEVOJztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gJ1dFQ0hBVC1QVUJMSUMnO1xuICAgICAgfVxuICAgIH0pKHRoaXMuX3Njb3BlKTtcblxuICAgIGNvbnN0IHJlZnJlc2hUb2tlblJlcyA9IGF3YWl0IHRoaXMuX2dldFJlZnJlc2hUb2tlbkJ5V1hDb2RlKHRoaXMuX2FwcGlkLCBsb2dpblR5cGUsIGNvZGUsb3B0aW9ucyk7XG4gICAgY29uc3QgeyByZWZyZXNoVG9rZW4gfSA9IHJlZnJlc2hUb2tlblJlcztcblxuICAgIC8vIOacrOWcsOWtmOS4i1xuICAgIGF3YWl0IHRoaXMuX2NhY2hlLnNldFN0b3JlQXN5bmMocmVmcmVzaFRva2VuS2V5LCByZWZyZXNoVG9rZW4pO1xuICAgIGlmIChyZWZyZXNoVG9rZW5SZXMuYWNjZXNzVG9rZW4pIHtcbiAgICAgIGF3YWl0IHRoaXMuX2NhY2hlLnNldFN0b3JlQXN5bmMoYWNjZXNzVG9rZW5LZXksIHJlZnJlc2hUb2tlblJlcy5hY2Nlc3NUb2tlbik7XG4gICAgfVxuICAgIGlmIChyZWZyZXNoVG9rZW5SZXMuYWNjZXNzVG9rZW5FeHBpcmUpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2NhY2hlLnNldFN0b3JlQXN5bmMoYWNjZXNzVG9rZW5FeHBpcmVLZXksIFN0cmluZyhyZWZyZXNoVG9rZW5SZXMuYWNjZXNzVG9rZW5FeHBpcmUgKyBEYXRlLm5vdygpKSk7XG4gICAgfVxuICAgIGV2ZW50QnVzLmZpcmUoRVZFTlRTLkxPR0lOX1NUQVRFX0NIQU5HRUQpO1xuICAgIC8vIOaKm+WHuueZu+W9leexu+Wei+abtOaUueS6i+S7tlxuICAgIGV2ZW50QnVzLmZpcmUoRVZFTlRTLkxPR0lOX1RZUEVfQ0hBTkdFRCwgeyBcbiAgICAgIGVudjogdGhpcy5fY29uZmlnLmVudixcbiAgICAgIGxvZ2luVHlwZTogTE9HSU5UWVBFLldFQ0hBVCwgXG4gICAgICBwZXJzaXN0ZW5jZTogdGhpcy5fY29uZmlnLnBlcnNpc3RlbmNlIFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMucmVmcmVzaFVzZXJJbmZvKCk7XG4gICAgY29uc3QgbG9naW5TdGF0ZSA9IG5ldyBMb2dpblN0YXRlKHtcbiAgICAgIGVudklkOiB0aGlzLl9jb25maWcuZW52LFxuICAgICAgY2FjaGU6IHRoaXMuX2NhY2hlLFxuICAgICAgcmVxdWVzdDogdGhpcy5fcmVxdWVzdFxuICAgIH0pO1xuICAgIGF3YWl0IGxvZ2luU3RhdGUuY2hlY2tMb2NhbFN0YXRlQXN5bmMoKTtcbiAgICBcbiAgICByZXR1cm4gbG9naW5TdGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2dldFJlZnJlc2hUb2tlbkJ5V1hDb2RlKFxuICAgIGFwcGlkOiBzdHJpbmcsIFxuICAgIGxvZ2luVHlwZTogc3RyaW5nLCBcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgb3B0aW9uczogYW55ID0ge31cbiAgKTogUHJvbWlzZTx7IHJlZnJlc2hUb2tlbjogc3RyaW5nOyBhY2Nlc3NUb2tlbjogc3RyaW5nOyBhY2Nlc3NUb2tlbkV4cGlyZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB7IHdpdGhVbmlvbklkID0gZmFsc2UsIGNyZWF0ZVVzZXIgPSB0cnVlIH0gPSBvcHRpb25zO1xuICAgIC8vIHNuc2FwaV91c2VyaW5mbyDlkowgc25zYXBpX2xvZ2luIOaJjeWPr+S7peiOt+WPlueUqOaIt+eahOW+ruS/oeS/oeaBr1xuICAgIGNvbnN0IHN5bmNVc2VySW5mbyA9IHRoaXMuX3Njb3BlID09PSAnc25zYXBpX2Jhc2UnID8gZmFsc2UgOiBvcHRpb25zLnN5bmNVc2VySW5mbyB8fCBmYWxzZTtcblxuICAgIGNvbnN0IGFjdGlvbiA9ICdhdXRoLnNpZ25Jbic7XG4gICAgY29uc3QgaHlicmlkTWluaWFwcCA9IHRoaXMuX3J1bnRpbWUgPT09IFJVTlRJTUUuV1hfTVAgPyAnMScgOiAnMCc7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Quc2VuZChhY3Rpb24sIHsgXG4gICAgICBhcHBpZCwgXG4gICAgICBsb2dpblR5cGUsIFxuICAgICAgaHlicmlkTWluaWFwcCxcbiAgICAgIHN5bmNVc2VySW5mbyxcbiAgICAgIGxvZ2luQ3JlZGVudGlhbDogY29kZSxcbiAgICAgIHdpdGhVbmlvbklkLFxuICAgICAgY3JlYXRlVXNlclxuICAgIH0pLnRoZW4ocmVzID0+IHtcbiAgICAgIGlmIChyZXMuY29kZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFske2dldFNka05hbWUoKX1dWyR7RVJST1JTLk9QRVJBVElPTl9GQUlMfV0gZmFpbGVkIGxvZ2luIHZpYSB3ZWNoYXQ6ICR7cmVzLmNvZGV9YCk7XG4gICAgICB9XG4gICAgICBpZiAocmVzLnJlZnJlc2hfdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZWZyZXNoVG9rZW46IHJlcy5yZWZyZXNoX3Rva2VuLFxuICAgICAgICAgIGFjY2Vzc1Rva2VuOiByZXMuYWNjZXNzX3Rva2VuLFxuICAgICAgICAgIGFjY2Vzc1Rva2VuRXhwaXJlOiByZXMuYWNjZXNzX3Rva2VuX2V4cGlyZVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbJHtnZXRTZGtOYW1lKCl9XVske0VSUk9SUy5PUEVSQVRJT05fRkFJTH1dIGFjdGlvbjpnZXRKd3Qgbm90IHJldHVybiByZWZyZXNoVG9rZW5gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRXZWl4aW5Db2RlICgpIHtcbiAgcmV0dXJuIGdldFF1ZXJ5KCdjb2RlJykgfHwgZ2V0SGFzaCgnY29kZScpO1xufTsiXX0=
package/src/constants.ts DELETED
@@ -1,11 +0,0 @@
1
- export enum LOGINTYPE {
2
- ANONYMOUS = 'ANONYMOUS',
3
- WECHAT = 'WECHAT',
4
- WECHAT_PUBLIC = 'WECHAT-PUBLIC',
5
- WECHAT_OPEN = 'WECHAT-OPEN',
6
- CUSTOM = 'CUSTOM',
7
- EMAIL = 'EMAIL',
8
- USERNAME = 'USERNAME',
9
- NULL = 'NULL',
10
- PHONE = 'PHONE'
11
- }
@@ -1,125 +0,0 @@
1
- import { AuthProvider } from './base';
2
- import { ICloudbaseAuthConfig, ILoginState } from '@cloudbase/types/auth';
3
- import { constants, utils, helpers, events } from '@cloudbase/utilities';
4
- import { ICloudbaseCache } from '@cloudbase/types/cache';
5
- import { ICloudbaseRequest } from '@cloudbase/types/request';
6
- import { LOGINTYPE } from '../constants';
7
- import { EVENTS, eventBus, LoginState } from '..';
8
-
9
- const { ERRORS, COMMUNITY_SITE_URL } = constants;
10
- const { throwError, isString } = utils;
11
- const { addEventListener } = events;
12
- const { catchErrorsDecorator } = helpers;
13
-
14
- export class AnonymousAuthProvider extends AuthProvider {
15
- constructor(config:ICloudbaseAuthConfig&{cache:ICloudbaseCache,request:ICloudbaseRequest}){
16
- super(config);
17
-
18
- this._onConverted = this._onConverted.bind(this);
19
- // 监听转正事件
20
- addEventListener(EVENTS.ANONYMOUS_CONVERTED, this._onConverted);
21
- }
22
-
23
- @catchErrorsDecorator({
24
- title: '匿名登录失败',
25
- messages: [
26
- '请确认以下各项:',
27
- ' 1 - 当前环境是否开启了匿名登录',
28
- ' 2 - 调用 auth().anonymouseProvider().signIn() 的语法或参数是否正确',
29
- `如果问题依然存在,建议到官方问答社区提问或寻找帮助:${COMMUNITY_SITE_URL}`
30
- ]
31
- })
32
- public async signIn():Promise<ILoginState> {
33
- // 匿名登录前迁移cache到localstorage
34
- await this._cache.updatePersistenceAsync('local');
35
- const { anonymousUuidKey, refreshTokenKey } = this._cache.keys;
36
- // 如果本地存有uid则匿名登录时传给server
37
- const anonymous_uuid = await this._cache.getStoreAsync(anonymousUuidKey);
38
- // 此处cache为基类property
39
- const refresh_token = await this._cache.getStoreAsync(refreshTokenKey);
40
-
41
- const res = await this._request.send('auth.signInAnonymously', {
42
- anonymous_uuid,
43
- refresh_token
44
- });
45
- if (res.uuid && res.refresh_token) {
46
- await this._setAnonymousUUID(res.uuid);
47
- await this.setRefreshToken(res.refresh_token);
48
- await this._request.refreshAccessToken();
49
-
50
- eventBus.fire(EVENTS.LOGIN_TYPE_CHANGED, {
51
- env: this._config.env,
52
- loginType: LOGINTYPE.ANONYMOUS,
53
- persistence: 'local'
54
- });
55
-
56
- eventBus.fire(EVENTS.LOGIN_STATE_CHANGED);
57
-
58
- const loginState = new LoginState({
59
- envId: this._config.env,
60
- cache: this._cache,
61
- request: this._request
62
- });
63
- await loginState.checkLocalStateAsync();
64
- await loginState.user.refresh();
65
- return loginState;
66
- } else {
67
- throw new Error(JSON.stringify({
68
- code: ERRORS.OPERATION_FAIL,
69
- msg: JSON.stringify(res)||'anonymous signIn failed'
70
- }));
71
- }
72
- }
73
- /**
74
- * 匿名转正
75
- * @param ticket
76
- */
77
- public async linkAndRetrieveDataWithTicket(ticket: string):Promise<ILoginState> {
78
- if(!isString(ticket)){
79
- throwError(ERRORS.INVALID_PARAMS,'ticket must be a string');
80
- }
81
- const { anonymousUuidKey, refreshTokenKey } = this._cache.keys;
82
- const anonymous_uuid = await this._cache.getStoreAsync(anonymousUuidKey);
83
- const refresh_token = await this._cache.getStoreAsync(refreshTokenKey);
84
- const res = await this._request.send('auth.linkAndRetrieveDataWithTicket', {
85
- anonymous_uuid,
86
- refresh_token,
87
- ticket
88
- });
89
- if (res.refresh_token) {
90
- // 转正后清除本地保存的匿名uuid
91
- await this._clearAnonymousUUID();
92
- await this.setRefreshToken(res.refresh_token);
93
- await this._request.refreshAccessToken();
94
- eventBus.fire(EVENTS.ANONYMOUS_CONVERTED, { env: this._config.env });
95
- eventBus.fire(EVENTS.LOGIN_TYPE_CHANGED, { loginType: LOGINTYPE.CUSTOM, persistence: 'local' });
96
- const loginState = new LoginState({
97
- envId: this._config.env,
98
- cache: this._cache,
99
- request: this._request
100
- });
101
- await loginState.checkLocalStateAsync();
102
-
103
- return loginState;
104
- } else {
105
- throwError(ERRORS.OPERATION_FAIL,JSON.stringify(res)||'linkAndRetrieveDataWithTicket failed');
106
- }
107
- }
108
- private async _setAnonymousUUID(id: string) {
109
- const { anonymousUuidKey, loginTypeKey } = this._cache.keys;
110
- await this._cache.removeStoreAsync(anonymousUuidKey);
111
- await this._cache.setStoreAsync(anonymousUuidKey, id);
112
- await this._cache.setStoreAsync(loginTypeKey, LOGINTYPE.ANONYMOUS);
113
- }
114
- private async _clearAnonymousUUID() {
115
- await this._cache.removeStoreAsync(this._cache.keys.anonymousUuidKey);
116
- }
117
- private async _onConverted(ev) {
118
- const { env } = ev.data;
119
- if (env !== this._config.env) {
120
- return;
121
- }
122
- // 匿名转正后迁移cache
123
- await this._cache.updatePersistenceAsync(this._config.persistence);
124
- }
125
- }
@@ -1,66 +0,0 @@
1
- import { ICloudbaseConfig } from '@cloudbase/types';
2
- import { ICloudbaseCache } from '@cloudbase/types/cache';
3
- import { ICloudbaseRequest } from '@cloudbase/types/request';
4
- import { ICloudbaseAuthConfig } from '@cloudbase/types/auth';
5
- import { LoginState } from '..';
6
-
7
- export abstract class AuthProvider {
8
- protected readonly _config: ICloudbaseConfig;
9
- protected readonly _cache: ICloudbaseCache;
10
- protected readonly _request: ICloudbaseRequest;
11
-
12
- constructor(config: ICloudbaseAuthConfig&{cache:ICloudbaseCache,request:ICloudbaseRequest}) {
13
- this._config = config;
14
- this._cache = config.cache;
15
- this._request = config.request;
16
- }
17
- /**
18
- * 判断本地是否已经有登录态,如果有且没过期,则返回true,否则清理本地登录态
19
- */
20
- protected async checkLocalLoginState() {
21
- const { accessTokenKey, accessTokenExpireKey } = this._cache.keys;
22
- const accessToken = await this._cache.getStoreAsync(accessTokenKey);
23
- const accessTokenExpire = await this._cache.getStoreAsync(accessTokenExpireKey);
24
-
25
- if (accessToken) {
26
- if (accessTokenExpire && accessTokenExpire > Date.now()) {
27
- // access存在且没有过期,那么直接返回
28
- const loginState = new LoginState({
29
- envId: this._config.env,
30
- cache: this._cache,
31
- request: this._request
32
- });
33
- await loginState.checkLocalStateAsync();
34
-
35
- return loginState;
36
- } else {
37
- // access token存在但是过期了,那么删除掉重新拉
38
- await this._cache.removeStoreAsync(accessTokenKey);
39
- await this._cache.removeStoreAsync(accessTokenExpireKey);
40
- }
41
- }
42
- }
43
- protected async setRefreshToken(refreshToken:string) {
44
- const { accessTokenKey, accessTokenExpireKey, refreshTokenKey } = this._cache.keys;
45
- // refresh token设置前,先清掉 access token
46
- await this._cache.removeStoreAsync(accessTokenKey);
47
- await this._cache.removeStoreAsync(accessTokenExpireKey);
48
- await this._cache.setStoreAsync(refreshTokenKey, refreshToken);
49
- }
50
- protected async setAccessToken(accessToken:string, accessTokenExpire:string) {
51
- const { accessTokenKey, accessTokenExpireKey } = this._cache.keys;
52
- await this._cache.setStoreAsync(accessTokenKey, accessToken);
53
- await this._cache.setStoreAsync(accessTokenExpireKey, accessTokenExpire);
54
- }
55
- protected async refreshUserInfo() {
56
- const action = 'auth.getUserInfo';
57
- const { data: userInfo } = await this._request.send(action, {});
58
- await this.setLocalUserInfo(userInfo);
59
- return userInfo;
60
- }
61
- protected async setLocalUserInfo(userInfo) {
62
- const { userInfoKey } = this._cache.keys;
63
- await this._cache.setStoreAsync(userInfoKey, userInfo);
64
- }
65
- abstract signIn(...args:any[]):Promise<any>;
66
- }
@@ -1,68 +0,0 @@
1
-
2
- import { utils, constants, helpers } from '@cloudbase/utilities';
3
- import { ILoginState } from '@cloudbase/types/auth';
4
- import { AuthProvider } from './base';
5
- import { LOGINTYPE } from '../constants';
6
- import { eventBus, EVENTS, LoginState } from '..';
7
-
8
- const { ERRORS, COMMUNITY_SITE_URL } = constants;
9
- const { isString } = utils;
10
- const { catchErrorsDecorator } = helpers;
11
-
12
- export class CustomAuthProvider extends AuthProvider {
13
-
14
- @catchErrorsDecorator({
15
- title: '自定义登录失败',
16
- messages: [
17
- '请确认以下各项:',
18
- ' 1 - 当前环境是否开启了自定义登录',
19
- ' 2 - 调用 auth().customAuthProvider().signIn() 的语法或参数是否正确',
20
- ' 3 - ticket 是否归属于当前环境',
21
- ' 4 - 创建 ticket 的自定义登录私钥是否过期',
22
- `如果问题依然存在,建议到官方问答社区提问或寻找帮助:${COMMUNITY_SITE_URL}`
23
- ]
24
- })
25
- public async signIn(ticket: string): Promise<ILoginState> {
26
- if (!isString(ticket)) {
27
- throw new Error(JSON.stringify({
28
- code: ERRORS.INVALID_PARAMS,
29
- msg: 'ticket must be a string'
30
- }));
31
- }
32
- const { refreshTokenKey } = this._cache.keys;
33
- const res = await this._request.send('auth.signInWithTicket', {
34
- ticket,
35
- refresh_token: await this._cache.getStoreAsync(refreshTokenKey) || ''
36
- });
37
- if (res.refresh_token) {
38
- // 保存新refresh token并且刷新access token
39
- await this.setRefreshToken(res.refresh_token);
40
- await this._request.refreshAccessToken();
41
-
42
- eventBus.fire(EVENTS.LOGIN_TYPE_CHANGED, {
43
- env: this._config.env,
44
- loginType: LOGINTYPE.CUSTOM,
45
- persistence: this._config.persistence
46
- });
47
-
48
- eventBus.fire(EVENTS.LOGIN_STATE_CHANGED);
49
-
50
- // set user info
51
- await this.refreshUserInfo();
52
-
53
- const loginState = new LoginState({
54
- envId: this._config.env,
55
- cache: this._cache,
56
- request: this._request
57
- });
58
- await loginState.checkLocalStateAsync();
59
-
60
- return loginState;
61
- } else {
62
- throw new Error(JSON.stringify({
63
- code: ERRORS.OPERATION_FAIL,
64
- msg: 'custom signIn failed'
65
- }));
66
- }
67
- }
68
- }