@yelon/bis 15.2.6 → 16.0.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/LICENSE +21 -21
- package/README.md +23 -23
- package/{esm2020 → esm2022}/bis.mjs +4 -4
- package/{esm2020 → esm2022}/index.mjs +1 -1
- package/{esm2020 → esm2022}/layout/bis.config.mjs +10 -10
- package/{esm2020 → esm2022}/layout/html-names.mjs +32 -32
- package/{esm2020 → esm2022}/layout/icon/style-icons.mjs +795 -795
- package/{esm2020 → esm2022}/layout/layout-basic/index.mjs +2 -2
- package/{esm2020 → esm2022}/layout/layout-basic/interface.mjs +6 -6
- package/{esm2020 → esm2022}/layout/layout-basic/layout-basic.component.mjs +356 -356
- package/{esm2020 → esm2022}/layout/layout-nav/index.mjs +4 -4
- package/esm2022/layout/layout-nav/layout-nav-application.component.mjs +328 -0
- package/{esm2020 → esm2022}/layout/layout-nav/layout-nav-group.component.mjs +125 -124
- package/esm2022/layout/layout-nav/layout-nav-tile.component.mjs +16 -0
- package/{esm2020 → esm2022}/layout/layout-nav/types.mjs +1 -1
- package/{esm2020 → esm2022}/layout/layout.mjs +4 -4
- package/{esm2020 → esm2022}/layout/public_api.mjs +12 -12
- package/{esm2020 → esm2022}/layout/widgets/index.mjs +6 -6
- package/esm2022/layout/widgets/yunzai-clear-storage.component.mjs +46 -0
- package/esm2022/layout/widgets/yunzai-fullscreen.component.mjs +46 -0
- package/{esm2020 → esm2022}/layout/widgets/yunzai-i18n.component.mjs +147 -146
- package/esm2022/layout/widgets/yunzai-notify.component.mjs +184 -0
- package/esm2022/layout/widgets/yunzai-theme-btn.component.mjs +202 -0
- package/esm2022/layout/widgets/yunzai-user.component.mjs +131 -0
- package/esm2022/layout/yunzai-act.guard.mjs +108 -0
- package/{esm2020 → esm2022}/layout/yunzai-auth.service.mjs +174 -174
- package/{esm2020 → esm2022}/layout/yunzai-default.interceptor.mjs +209 -209
- package/{esm2020 → esm2022}/layout/yunzai-i18n.service.mjs +131 -131
- package/{esm2020 → esm2022}/layout/yunzai-lang.mjs +113 -113
- package/esm2022/layout/yunzai-layout.module.mjs +77 -0
- package/{esm2020 → esm2022}/layout/yunzai-startup.service.mjs +157 -157
- package/{esm2020 → esm2022}/public_api.mjs +1 -1
- package/{fesm2015 → fesm2022}/bis.mjs +6 -6
- package/{fesm2020 → fesm2022}/layout.mjs +3245 -3245
- package/{fesm2015 → fesm2022}/layout.mjs.map +1 -1
- package/index.d.ts +1 -1
- package/index.less +1 -1
- package/layout/bis.config.d.ts +3 -3
- package/layout/html-names.d.ts +31 -31
- package/layout/icon/style-icons.d.ts +1 -1
- package/layout/index.d.ts +5 -5
- package/layout/layout-basic/index.d.ts +2 -2
- package/layout/layout-basic/interface.d.ts +24 -24
- package/layout/layout-basic/layout-basic.component.d.ts +32 -32
- package/layout/layout-nav/index.d.ts +4 -4
- package/layout/layout-nav/layout-nav-application.component.d.ts +27 -27
- package/layout/layout-nav/layout-nav-group.component.d.ts +17 -17
- package/layout/layout-nav/layout-nav-tile.component.d.ts +6 -6
- package/layout/layout-nav/types.d.ts +15 -15
- package/layout/public_api.d.ts +12 -12
- package/layout/style/index.less +154 -154
- package/layout/widgets/index.d.ts +6 -6
- package/layout/widgets/yunzai-clear-storage.component.d.ts +11 -11
- package/layout/widgets/yunzai-fullscreen.component.d.ts +8 -8
- package/layout/widgets/yunzai-i18n.component.d.ts +21 -21
- package/layout/widgets/yunzai-notify.component.d.ts +30 -30
- package/layout/widgets/yunzai-theme-btn.component.d.ts +32 -32
- package/layout/widgets/yunzai-user.component.d.ts +28 -28
- package/layout/yunzai-act.guard.d.ts +22 -22
- package/layout/yunzai-auth.service.d.ts +21 -21
- package/layout/yunzai-default.interceptor.d.ts +27 -27
- package/layout/yunzai-i18n.service.d.ts +33 -33
- package/layout/yunzai-lang.d.ts +11 -11
- package/layout/yunzai-layout.module.d.ts +21 -21
- package/layout/yunzai-startup.service.d.ts +37 -37
- package/package.json +39 -47
- package/public_api.d.ts +2 -2
- package/theme-compact.less +3 -3
- package/theme-dark.less +46 -46
- package/theme-default.less +46 -46
- package/esm2020/layout/layout-nav/layout-nav-application.component.mjs +0 -327
- package/esm2020/layout/layout-nav/layout-nav-tile.component.mjs +0 -15
- package/esm2020/layout/widgets/yunzai-clear-storage.component.mjs +0 -45
- package/esm2020/layout/widgets/yunzai-fullscreen.component.mjs +0 -45
- package/esm2020/layout/widgets/yunzai-notify.component.mjs +0 -183
- package/esm2020/layout/widgets/yunzai-theme-btn.component.mjs +0 -201
- package/esm2020/layout/widgets/yunzai-user.component.mjs +0 -130
- package/esm2020/layout/yunzai-act.guard.mjs +0 -107
- package/esm2020/layout/yunzai-layout.module.mjs +0 -76
- package/fesm2015/layout.mjs +0 -3236
- package/fesm2020/bis.mjs +0 -6
- package/fesm2020/bis.mjs.map +0 -1
- package/fesm2020/layout.mjs.map +0 -1
- /package/{fesm2015 → fesm2022}/bis.mjs.map +0 -0
|
@@ -1,174 +1,174 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { forkJoin, map, mergeAll, mergeMap, of } from 'rxjs';
|
|
3
|
-
import { YA_SERVICE_TOKEN } from '@yelon/auth';
|
|
4
|
-
import { CacheService } from '@yelon/cache';
|
|
5
|
-
import { _HttpClient } from '@yelon/theme';
|
|
6
|
-
import { log, WINDOW, YunzaiConfigService } from '@yelon/util';
|
|
7
|
-
import { mergeBisConfig } from './bis.config';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
class YunzaiAuthService {
|
|
10
|
-
constructor(injector) {
|
|
11
|
-
this.injector = injector;
|
|
12
|
-
this.config = mergeBisConfig(this.configService);
|
|
13
|
-
}
|
|
14
|
-
get configService() {
|
|
15
|
-
return this.injector.get(YunzaiConfigService);
|
|
16
|
-
}
|
|
17
|
-
get tokenService() {
|
|
18
|
-
return this.injector.get(YA_SERVICE_TOKEN);
|
|
19
|
-
}
|
|
20
|
-
get httpClient() {
|
|
21
|
-
return this.injector.get(_HttpClient);
|
|
22
|
-
}
|
|
23
|
-
get cacheService() {
|
|
24
|
-
return this.injector.get(CacheService);
|
|
25
|
-
}
|
|
26
|
-
askToken() {
|
|
27
|
-
log('yz.auth.service: ', 'askToken');
|
|
28
|
-
// if (this.tokenService.get()?.token) {
|
|
29
|
-
// const notCovertToken = this.tokenService.get();
|
|
30
|
-
// let convertedToken: ITokenModel;
|
|
31
|
-
// if (notCovertToken && notCovertToken['access_token']) {
|
|
32
|
-
// convertedToken = {
|
|
33
|
-
// token: notCovertToken['access_token'],
|
|
34
|
-
// expired: notCovertToken['expires_in'],
|
|
35
|
-
// refreshToken: notCovertToken['refresh_token'],
|
|
36
|
-
// scope: notCovertToken['scope'],
|
|
37
|
-
// tokenType: notCovertToken['token_type']
|
|
38
|
-
// };
|
|
39
|
-
// return of(convertedToken);
|
|
40
|
-
// } else {
|
|
41
|
-
// return of(this.tokenService.get()!);
|
|
42
|
-
// }
|
|
43
|
-
// } else {
|
|
44
|
-
if (this.config.loginForm) {
|
|
45
|
-
return this.fetchTokenByUP();
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
return this.fetchTokenByCas();
|
|
49
|
-
}
|
|
50
|
-
// }
|
|
51
|
-
}
|
|
52
|
-
fetchTokenByUP() {
|
|
53
|
-
log('yz.auth.service: ', 'fetchTokenByUP');
|
|
54
|
-
return this.httpClient.post(`/auth/oauth/token?_allow_anonymous=true`, this.config.loginForm).pipe(map((response) => {
|
|
55
|
-
const { access_token, expires_in, refresh_token, scope, token_type } = response;
|
|
56
|
-
return {
|
|
57
|
-
token: access_token,
|
|
58
|
-
expired: expires_in,
|
|
59
|
-
refreshToken: refresh_token,
|
|
60
|
-
tokenType: token_type,
|
|
61
|
-
scope
|
|
62
|
-
};
|
|
63
|
-
}));
|
|
64
|
-
}
|
|
65
|
-
fetchTokenByCas() {
|
|
66
|
-
log('yz.auth.service: ', 'fetchTokenByCas');
|
|
67
|
-
const uri = encodeURIComponent(this.injector.get(WINDOW).location.href);
|
|
68
|
-
return this.httpClient
|
|
69
|
-
.get(`/cas-proxy/app/validate_full?callback=${uri}&_allow_anonymous=true×tamp=${new Date().getTime()}`)
|
|
70
|
-
.pipe(map((response) => {
|
|
71
|
-
// 查看缓存中的用户是否与token验证回的用户id相同,如果不同则缓存为过期缓存,进行清除
|
|
72
|
-
if (response && response.userId) {
|
|
73
|
-
const user = this.cacheService.get('_yz_user', { mode: 'none' });
|
|
74
|
-
if (user && user.id && user.id !== response.userId) {
|
|
75
|
-
this.cacheService.clear();
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
switch (response.errcode) {
|
|
79
|
-
case 2000:
|
|
80
|
-
const { access_token, expires_in, refresh_token, scope, token_type } = response.data;
|
|
81
|
-
return {
|
|
82
|
-
token: access_token,
|
|
83
|
-
expired: expires_in,
|
|
84
|
-
refreshToken: refresh_token,
|
|
85
|
-
tokenType: token_type,
|
|
86
|
-
scope
|
|
87
|
-
};
|
|
88
|
-
case 2001:
|
|
89
|
-
this.injector.get(WINDOW).location.href = response.msg;
|
|
90
|
-
throw Error("Cookie Error: Can't find Cas Cookie,So jump to login!");
|
|
91
|
-
default:
|
|
92
|
-
if (response.data) {
|
|
93
|
-
console.error(response.data);
|
|
94
|
-
throw Error(response.data);
|
|
95
|
-
}
|
|
96
|
-
else if (response.msg) {
|
|
97
|
-
console.error(response.msg);
|
|
98
|
-
throw Error(response.msg);
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
console.error('cas unknown error');
|
|
102
|
-
throw Error('Unknown Error: Cas auth exception!');
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}));
|
|
106
|
-
}
|
|
107
|
-
login() {
|
|
108
|
-
log('yz.auth.service: ', 'login white login form->', this.config.loginForm);
|
|
109
|
-
return this.askToken().pipe(mergeMap(token => {
|
|
110
|
-
log('yz.auth.service: get token->', token);
|
|
111
|
-
this.configService.set('auth', {
|
|
112
|
-
token_send_key: 'Authorization',
|
|
113
|
-
token_send_template: `${token.tokenType} \${token}`,
|
|
114
|
-
token_send_place: 'header'
|
|
115
|
-
});
|
|
116
|
-
log('yz.auth.service: ', 'set token');
|
|
117
|
-
this.tokenService.set(token);
|
|
118
|
-
return this.cacheInit();
|
|
119
|
-
}), mergeAll());
|
|
120
|
-
}
|
|
121
|
-
cacheInit() {
|
|
122
|
-
log('yz.auth.service: ', 'cacheInit');
|
|
123
|
-
const tenant = this.cacheService.get('_yz_tenant', { mode: 'none' });
|
|
124
|
-
const user = this.cacheService.get('_yz_user', { mode: 'none' });
|
|
125
|
-
const header = this.cacheService.get('_yz_header', { mode: 'none' });
|
|
126
|
-
const project = this.cacheService.get('_yz_project_info', { mode: 'none' });
|
|
127
|
-
return forkJoin(of(user), of(header), of(project)).pipe(mergeMap(([u, h, p]) => {
|
|
128
|
-
let list = [];
|
|
129
|
-
// user cache
|
|
130
|
-
if (!u || !tenant) {
|
|
131
|
-
log('yz.auth.service: ', 'fetch user cache');
|
|
132
|
-
list.push(this.httpClient.get(`/auth/user`).pipe(map((user) => {
|
|
133
|
-
this.cacheService.set('_yz_tenant', user.tenantId);
|
|
134
|
-
this.cacheService.set('_yz_user', user.principal);
|
|
135
|
-
})));
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
log('yz.auth.service: ', 'user recache');
|
|
139
|
-
list.push(of(() => { }));
|
|
140
|
-
}
|
|
141
|
-
// header cache
|
|
142
|
-
if (!h) {
|
|
143
|
-
log('yz.auth.service: ', 'fetch header cache');
|
|
144
|
-
list.push(this.httpClient.get(`/auth/allheader/v2`).pipe(map((header) => {
|
|
145
|
-
this.cacheService.set('_yz_header', header.data);
|
|
146
|
-
})));
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
log('yz.auth.service: ', 'header recache');
|
|
150
|
-
list.push(of(() => { }));
|
|
151
|
-
}
|
|
152
|
-
// project cache
|
|
153
|
-
if (!p) {
|
|
154
|
-
log('yz.auth.service: ', 'fetch project cache');
|
|
155
|
-
list.push(this.httpClient.get(`/app-manager/project/info`).pipe(map((info) => {
|
|
156
|
-
this.cacheService.set('_yz_project_info', info.data);
|
|
157
|
-
})));
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
log('yz.auth.service: ', 'project recache');
|
|
161
|
-
list.push(of(() => { }));
|
|
162
|
-
}
|
|
163
|
-
return forkJoin(list);
|
|
164
|
-
}));
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
170
|
-
type: Injectable,
|
|
171
|
-
args: [{ providedIn: 'root' }]
|
|
172
|
-
}], ctorParameters: function () { return [{ type: i0.Injector }]; } });
|
|
173
|
-
export { YunzaiAuthService as YzAuthService, YunzaiAuthService };
|
|
174
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieXVuemFpLWF1dGguc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Jpcy9sYXlvdXQveXVuemFpLWF1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXpFLE9BQU8sRUFBOEIsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUF3QixtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVyRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDOztBQUU5QyxNQUNNLGlCQUFpQjtJQUdyQixZQUFvQixRQUFrQjtRQUFsQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ3BDLElBQUksQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsSUFBWSxhQUFhO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsSUFBWSxZQUFZO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsSUFBWSxVQUFVO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELElB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QUFDLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxJQUFJLENBQ1AsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxJQUFJLENBQ25ELEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO29CQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZELENBQUMsQ0FBQyxDQUNILENBQ0YsQ0FBQzthQUNIO2lCQUFNO2dCQUNMLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBTSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzlCO1lBQ0QsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7OzhHQXJMRyxpQkFBaUI7a0hBQWpCLGlCQUFpQixjQURHLE1BQU07MkZBQzFCLGlCQUFpQjtrQkFEdEIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7O0FBeUxsQyxPQUFPLEVBQUUsaUJBQWlCLElBQUksYUFBYSxFQUFFLGlCQUFpQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZm9ya0pvaW4sIG1hcCwgbWVyZ2VBbGwsIG1lcmdlTWFwLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBJVG9rZW5Nb2RlbCwgSVRva2VuU2VydmljZSwgWUFfU0VSVklDRV9UT0tFTiB9IGZyb20gJ0B5ZWxvbi9hdXRoJztcbmltcG9ydCB7IENhY2hlU2VydmljZSB9IGZyb20gJ0B5ZWxvbi9jYWNoZSc7XG5pbXBvcnQgeyBfSHR0cENsaWVudCB9IGZyb20gJ0B5ZWxvbi90aGVtZSc7XG5pbXBvcnQgeyBsb2csIFdJTkRPVywgWXVuemFpQnVzaW5lc3NDb25maWcsIFl1bnphaUNvbmZpZ1NlcnZpY2UgfSBmcm9tICdAeWVsb24vdXRpbCc7XG5cbmltcG9ydCB7IG1lcmdlQmlzQ29uZmlnIH0gZnJvbSAnLi9iaXMuY29uZmlnJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmNsYXNzIFl1bnphaUF1dGhTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjb25maWc6IFl1bnphaUJ1c2luZXNzQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgdGhpcy5jb25maWcgPSBtZXJnZUJpc0NvbmZpZyh0aGlzLmNvbmZpZ1NlcnZpY2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY29uZmlnU2VydmljZSgpOiBZdW56YWlDb25maWdTZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5nZXQoWXVuemFpQ29uZmlnU2VydmljZSk7XG4gIH1cblxuICBwcml2YXRlIGdldCB0b2tlblNlcnZpY2UoKTogSVRva2VuU2VydmljZSB7XG4gICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IuZ2V0KFlBX1NFUlZJQ0VfVE9LRU4pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgaHR0cENsaWVudCgpOiBfSHR0cENsaWVudCB7XG4gICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IuZ2V0KF9IdHRwQ2xpZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNhY2hlU2VydmljZSgpOiBDYWNoZVNlcnZpY2Uge1xuICAgIHJldHVybiB0aGlzLmluamVjdG9yLmdldChDYWNoZVNlcnZpY2UpO1xuICB9XG5cbiAgYXNrVG9rZW4oKTogT2JzZXJ2YWJsZTxJVG9rZW5Nb2RlbD4ge1xuICAgIGxvZygneXouYXV0aC5zZXJ2aWNlOiAnLCAnYXNrVG9rZW4nKTtcbiAgICAvLyBpZiAodGhpcy50b2tlblNlcnZpY2UuZ2V0KCk/LnRva2VuKSB7XG4gICAgLy8gICBjb25zdCBub3RDb3ZlcnRUb2tlbiA9IHRoaXMudG9rZW5TZXJ2aWNlLmdldCgpO1xuICAgIC8vICAgbGV0IGNvbnZlcnRlZFRva2VuOiBJVG9rZW5Nb2RlbDtcbiAgICAvLyAgIGlmIChub3RDb3ZlcnRUb2tlbiAmJiBub3RDb3ZlcnRUb2tlblsnYWNjZXNzX3Rva2VuJ10pIHtcbiAgICAvLyAgICAgY29udmVydGVkVG9rZW4gPSB7XG4gICAgLy8gICAgICAgdG9rZW46IG5vdENvdmVydFRva2VuWydhY2Nlc3NfdG9rZW4nXSxcbiAgICAvLyAgICAgICBleHBpcmVkOiBub3RDb3ZlcnRUb2tlblsnZXhwaXJlc19pbiddLFxuICAgIC8vICAgICAgIHJlZnJlc2hUb2tlbjogbm90Q292ZXJ0VG9rZW5bJ3JlZnJlc2hfdG9rZW4nXSxcbiAgICAvLyAgICAgICBzY29wZTogbm90Q292ZXJ0VG9rZW5bJ3Njb3BlJ10sXG4gICAgLy8gICAgICAgdG9rZW5UeXBlOiBub3RDb3ZlcnRUb2tlblsndG9rZW5fdHlwZSddXG4gICAgLy8gICAgIH07XG4gICAgLy8gICAgIHJldHVybiBvZihjb252ZXJ0ZWRUb2tlbik7XG4gICAgLy8gICB9IGVsc2Uge1xuICAgIC8vICAgICByZXR1cm4gb2YodGhpcy50b2tlblNlcnZpY2UuZ2V0KCkhKTtcbiAgICAvLyAgIH1cbiAgICAvLyB9IGVsc2Uge1xuICAgIGlmICh0aGlzLmNvbmZpZy5sb2dpbkZvcm0pIHtcbiAgICAgIHJldHVybiB0aGlzLmZldGNoVG9rZW5CeVVQKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmZldGNoVG9rZW5CeUNhcygpO1xuICAgIH1cbiAgICAvLyB9XG4gIH1cblxuICBmZXRjaFRva2VuQnlVUCgpOiBPYnNlcnZhYmxlPElUb2tlbk1vZGVsPiB7XG4gICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICdmZXRjaFRva2VuQnlVUCcpO1xuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdChgL2F1dGgvb2F1dGgvdG9rZW4/X2FsbG93X2Fub255bW91cz10cnVlYCwgdGhpcy5jb25maWcubG9naW5Gb3JtKS5waXBlKFxuICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgYWNjZXNzX3Rva2VuLCBleHBpcmVzX2luLCByZWZyZXNoX3Rva2VuLCBzY29wZSwgdG9rZW5fdHlwZSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9rZW46IGFjY2Vzc190b2tlbixcbiAgICAgICAgICBleHBpcmVkOiBleHBpcmVzX2luLFxuICAgICAgICAgIHJlZnJlc2hUb2tlbjogcmVmcmVzaF90b2tlbixcbiAgICAgICAgICB0b2tlblR5cGU6IHRva2VuX3R5cGUsXG4gICAgICAgICAgc2NvcGVcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGZldGNoVG9rZW5CeUNhcygpOiBPYnNlcnZhYmxlPElUb2tlbk1vZGVsPiB7XG4gICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICdmZXRjaFRva2VuQnlDYXMnKTtcbiAgICBjb25zdCB1cmkgPSBlbmNvZGVVUklDb21wb25lbnQodGhpcy5pbmplY3Rvci5nZXQoV0lORE9XKS5sb2NhdGlvbi5ocmVmKTtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50XG4gICAgICAuZ2V0KGAvY2FzLXByb3h5L2FwcC92YWxpZGF0ZV9mdWxsP2NhbGxiYWNrPSR7dXJpfSZfYWxsb3dfYW5vbnltb3VzPXRydWUmdGltZXN0YW1wPSR7bmV3IERhdGUoKS5nZXRUaW1lKCl9YClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyDmn6XnnIvnvJPlrZjkuK3nmoTnlKjmiLfmmK/lkKbkuI50b2tlbumqjOivgeWbnueahOeUqOaIt2lk55u45ZCM77yM5aaC5p6c5LiN5ZCM5YiZ57yT5a2Y5Li66L+H5pyf57yT5a2Y77yM6L+b6KGM5riF6ZmkXG4gICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnVzZXJJZCkge1xuICAgICAgICAgICAgY29uc3QgdXNlciA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldCgnX3l6X3VzZXInLCB7IG1vZGU6ICdub25lJyB9KTtcbiAgICAgICAgICAgIGlmICh1c2VyICYmIHVzZXIuaWQgJiYgdXNlci5pZCAhPT0gcmVzcG9uc2UudXNlcklkKSB7XG4gICAgICAgICAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLmNsZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHN3aXRjaCAocmVzcG9uc2UuZXJyY29kZSkge1xuICAgICAgICAgICAgY2FzZSAyMDAwOlxuICAgICAgICAgICAgICBjb25zdCB7IGFjY2Vzc190b2tlbiwgZXhwaXJlc19pbiwgcmVmcmVzaF90b2tlbiwgc2NvcGUsIHRva2VuX3R5cGUgfSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdG9rZW46IGFjY2Vzc190b2tlbixcbiAgICAgICAgICAgICAgICBleHBpcmVkOiBleHBpcmVzX2luLFxuICAgICAgICAgICAgICAgIHJlZnJlc2hUb2tlbjogcmVmcmVzaF90b2tlbixcbiAgICAgICAgICAgICAgICB0b2tlblR5cGU6IHRva2VuX3R5cGUsXG4gICAgICAgICAgICAgICAgc2NvcGVcbiAgICAgICAgICAgICAgfSBhcyBJVG9rZW5Nb2RlbDtcbiAgICAgICAgICAgIGNhc2UgMjAwMTpcbiAgICAgICAgICAgICAgdGhpcy5pbmplY3Rvci5nZXQoV0lORE9XKS5sb2NhdGlvbi5ocmVmID0gcmVzcG9uc2UubXNnO1xuICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcIkNvb2tpZSBFcnJvcjogQ2FuJ3QgZmluZCBDYXMgQ29va2llLFNvIGp1bXAgdG8gbG9naW4hXCIpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLm1zZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IocmVzcG9uc2UubXNnKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihyZXNwb25zZS5tc2cpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2NhcyB1bmtub3duIGVycm9yJyk7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1Vua25vd24gRXJyb3I6IENhcyBhdXRoIGV4Y2VwdGlvbiEnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBsb2dpbigpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBsb2coJ3l6LmF1dGguc2VydmljZTogJywgJ2xvZ2luIHdoaXRlIGxvZ2luIGZvcm0tPicsIHRoaXMuY29uZmlnLmxvZ2luRm9ybSk7XG4gICAgcmV0dXJuIHRoaXMuYXNrVG9rZW4oKS5waXBlKFxuICAgICAgbWVyZ2VNYXAodG9rZW4gPT4ge1xuICAgICAgICBsb2coJ3l6LmF1dGguc2VydmljZTogZ2V0IHRva2VuLT4nLCB0b2tlbik7XG4gICAgICAgIHRoaXMuY29uZmlnU2VydmljZS5zZXQoJ2F1dGgnLCB7XG4gICAgICAgICAgdG9rZW5fc2VuZF9rZXk6ICdBdXRob3JpemF0aW9uJyxcbiAgICAgICAgICB0b2tlbl9zZW5kX3RlbXBsYXRlOiBgJHt0b2tlbi50b2tlblR5cGV9IFxcJHt0b2tlbn1gLFxuICAgICAgICAgIHRva2VuX3NlbmRfcGxhY2U6ICdoZWFkZXInXG4gICAgICAgIH0pO1xuICAgICAgICBsb2coJ3l6LmF1dGguc2VydmljZTogJywgJ3NldCB0b2tlbicpO1xuICAgICAgICB0aGlzLnRva2VuU2VydmljZS5zZXQodG9rZW4pO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZUluaXQoKTtcbiAgICAgIH0pLFxuICAgICAgbWVyZ2VBbGwoKVxuICAgICk7XG4gIH1cblxuICBjYWNoZUluaXQoKTogT2JzZXJ2YWJsZTx2b2lkW10+IHtcbiAgICBsb2coJ3l6LmF1dGguc2VydmljZTogJywgJ2NhY2hlSW5pdCcpO1xuICAgIGNvbnN0IHRlbmFudCA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldCgnX3l6X3RlbmFudCcsIHsgbW9kZTogJ25vbmUnIH0pO1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmNhY2hlU2VydmljZS5nZXQoJ195el91c2VyJywgeyBtb2RlOiAnbm9uZScgfSk7XG4gICAgY29uc3QgaGVhZGVyID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCdfeXpfaGVhZGVyJywgeyBtb2RlOiAnbm9uZScgfSk7XG4gICAgY29uc3QgcHJvamVjdCA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldCgnX3l6X3Byb2plY3RfaW5mbycsIHsgbW9kZTogJ25vbmUnIH0pO1xuICAgIHJldHVybiBmb3JrSm9pbihvZih1c2VyKSwgb2YoaGVhZGVyKSwgb2YocHJvamVjdCkpLnBpcGUoXG4gICAgICBtZXJnZU1hcCgoW3UsIGgsIHBdKSA9PiB7XG4gICAgICAgIGxldCBsaXN0ID0gW107XG4gICAgICAgIC8vIHVzZXIgY2FjaGVcbiAgICAgICAgaWYgKCF1IHx8ICF0ZW5hbnQpIHtcbiAgICAgICAgICBsb2coJ3l6LmF1dGguc2VydmljZTogJywgJ2ZldGNoIHVzZXIgY2FjaGUnKTtcbiAgICAgICAgICBsaXN0LnB1c2goXG4gICAgICAgICAgICB0aGlzLmh0dHBDbGllbnQuZ2V0KGAvYXV0aC91c2VyYCkucGlwZShcbiAgICAgICAgICAgICAgbWFwKCh1c2VyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlU2VydmljZS5zZXQoJ195el90ZW5hbnQnLCB1c2VyLnRlbmFudElkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlU2VydmljZS5zZXQoJ195el91c2VyJywgdXNlci5wcmluY2lwYWwpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICd1c2VyIHJlY2FjaGUnKTtcbiAgICAgICAgICBsaXN0LnB1c2gob2Y8YW55PigoKSA9PiB7fSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGhlYWRlciBjYWNoZVxuICAgICAgICBpZiAoIWgpIHtcbiAgICAgICAgICBsb2coJ3l6LmF1dGguc2VydmljZTogJywgJ2ZldGNoIGhlYWRlciBjYWNoZScpO1xuICAgICAgICAgIGxpc3QucHVzaChcbiAgICAgICAgICAgIHRoaXMuaHR0cENsaWVudC5nZXQoYC9hdXRoL2FsbGhlYWRlci92MmApLnBpcGUoXG4gICAgICAgICAgICAgIG1hcCgoaGVhZGVyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlU2VydmljZS5zZXQoJ195el9oZWFkZXInLCBoZWFkZXIuZGF0YSk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2coJ3l6LmF1dGguc2VydmljZTogJywgJ2hlYWRlciByZWNhY2hlJyk7XG4gICAgICAgICAgbGlzdC5wdXNoKG9mPGFueT4oKCkgPT4ge30pKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBwcm9qZWN0IGNhY2hlXG4gICAgICAgIGlmICghcCkge1xuICAgICAgICAgIGxvZygneXouYXV0aC5zZXJ2aWNlOiAnLCAnZmV0Y2ggcHJvamVjdCBjYWNoZScpO1xuICAgICAgICAgIGxpc3QucHVzaChcbiAgICAgICAgICAgIHRoaXMuaHR0cENsaWVudC5nZXQoYC9hcHAtbWFuYWdlci9wcm9qZWN0L2luZm9gKS5waXBlKFxuICAgICAgICAgICAgICBtYXAoKGluZm86IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLnNldCgnX3l6X3Byb2plY3RfaW5mbycsIGluZm8uZGF0YSk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2coJ3l6LmF1dGguc2VydmljZTogJywgJ3Byb2plY3QgcmVjYWNoZScpO1xuICAgICAgICAgIGxpc3QucHVzaChvZjxhbnk+KCgpID0+IHt9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKGxpc3QpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7IFl1bnphaUF1dGhTZXJ2aWNlIGFzIFl6QXV0aFNlcnZpY2UsIFl1bnphaUF1dGhTZXJ2aWNlIH07XG4iXX0=
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { forkJoin, map, mergeAll, mergeMap, of } from 'rxjs';
|
|
3
|
+
import { YA_SERVICE_TOKEN } from '@yelon/auth';
|
|
4
|
+
import { CacheService } from '@yelon/cache';
|
|
5
|
+
import { _HttpClient } from '@yelon/theme';
|
|
6
|
+
import { log, WINDOW, YunzaiConfigService } from '@yelon/util';
|
|
7
|
+
import { mergeBisConfig } from './bis.config';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
class YunzaiAuthService {
|
|
10
|
+
constructor(injector) {
|
|
11
|
+
this.injector = injector;
|
|
12
|
+
this.config = mergeBisConfig(this.configService);
|
|
13
|
+
}
|
|
14
|
+
get configService() {
|
|
15
|
+
return this.injector.get(YunzaiConfigService);
|
|
16
|
+
}
|
|
17
|
+
get tokenService() {
|
|
18
|
+
return this.injector.get(YA_SERVICE_TOKEN);
|
|
19
|
+
}
|
|
20
|
+
get httpClient() {
|
|
21
|
+
return this.injector.get(_HttpClient);
|
|
22
|
+
}
|
|
23
|
+
get cacheService() {
|
|
24
|
+
return this.injector.get(CacheService);
|
|
25
|
+
}
|
|
26
|
+
askToken() {
|
|
27
|
+
log('yz.auth.service: ', 'askToken');
|
|
28
|
+
// if (this.tokenService.get()?.token) {
|
|
29
|
+
// const notCovertToken = this.tokenService.get();
|
|
30
|
+
// let convertedToken: ITokenModel;
|
|
31
|
+
// if (notCovertToken && notCovertToken['access_token']) {
|
|
32
|
+
// convertedToken = {
|
|
33
|
+
// token: notCovertToken['access_token'],
|
|
34
|
+
// expired: notCovertToken['expires_in'],
|
|
35
|
+
// refreshToken: notCovertToken['refresh_token'],
|
|
36
|
+
// scope: notCovertToken['scope'],
|
|
37
|
+
// tokenType: notCovertToken['token_type']
|
|
38
|
+
// };
|
|
39
|
+
// return of(convertedToken);
|
|
40
|
+
// } else {
|
|
41
|
+
// return of(this.tokenService.get()!);
|
|
42
|
+
// }
|
|
43
|
+
// } else {
|
|
44
|
+
if (this.config.loginForm) {
|
|
45
|
+
return this.fetchTokenByUP();
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
return this.fetchTokenByCas();
|
|
49
|
+
}
|
|
50
|
+
// }
|
|
51
|
+
}
|
|
52
|
+
fetchTokenByUP() {
|
|
53
|
+
log('yz.auth.service: ', 'fetchTokenByUP');
|
|
54
|
+
return this.httpClient.post(`/auth/oauth/token?_allow_anonymous=true`, this.config.loginForm).pipe(map((response) => {
|
|
55
|
+
const { access_token, expires_in, refresh_token, scope, token_type } = response;
|
|
56
|
+
return {
|
|
57
|
+
token: access_token,
|
|
58
|
+
expired: expires_in,
|
|
59
|
+
refreshToken: refresh_token,
|
|
60
|
+
tokenType: token_type,
|
|
61
|
+
scope
|
|
62
|
+
};
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
fetchTokenByCas() {
|
|
66
|
+
log('yz.auth.service: ', 'fetchTokenByCas');
|
|
67
|
+
const uri = encodeURIComponent(this.injector.get(WINDOW).location.href);
|
|
68
|
+
return this.httpClient
|
|
69
|
+
.get(`/cas-proxy/app/validate_full?callback=${uri}&_allow_anonymous=true×tamp=${new Date().getTime()}`)
|
|
70
|
+
.pipe(map((response) => {
|
|
71
|
+
// 查看缓存中的用户是否与token验证回的用户id相同,如果不同则缓存为过期缓存,进行清除
|
|
72
|
+
if (response && response.userId) {
|
|
73
|
+
const user = this.cacheService.get('_yz_user', { mode: 'none' });
|
|
74
|
+
if (user && user.id && user.id !== response.userId) {
|
|
75
|
+
this.cacheService.clear();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
switch (response.errcode) {
|
|
79
|
+
case 2000:
|
|
80
|
+
const { access_token, expires_in, refresh_token, scope, token_type } = response.data;
|
|
81
|
+
return {
|
|
82
|
+
token: access_token,
|
|
83
|
+
expired: expires_in,
|
|
84
|
+
refreshToken: refresh_token,
|
|
85
|
+
tokenType: token_type,
|
|
86
|
+
scope
|
|
87
|
+
};
|
|
88
|
+
case 2001:
|
|
89
|
+
this.injector.get(WINDOW).location.href = response.msg;
|
|
90
|
+
throw Error("Cookie Error: Can't find Cas Cookie,So jump to login!");
|
|
91
|
+
default:
|
|
92
|
+
if (response.data) {
|
|
93
|
+
console.error(response.data);
|
|
94
|
+
throw Error(response.data);
|
|
95
|
+
}
|
|
96
|
+
else if (response.msg) {
|
|
97
|
+
console.error(response.msg);
|
|
98
|
+
throw Error(response.msg);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
console.error('cas unknown error');
|
|
102
|
+
throw Error('Unknown Error: Cas auth exception!');
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
login() {
|
|
108
|
+
log('yz.auth.service: ', 'login white login form->', this.config.loginForm);
|
|
109
|
+
return this.askToken().pipe(mergeMap(token => {
|
|
110
|
+
log('yz.auth.service: get token->', token);
|
|
111
|
+
this.configService.set('auth', {
|
|
112
|
+
token_send_key: 'Authorization',
|
|
113
|
+
token_send_template: `${token.tokenType} \${token}`,
|
|
114
|
+
token_send_place: 'header'
|
|
115
|
+
});
|
|
116
|
+
log('yz.auth.service: ', 'set token');
|
|
117
|
+
this.tokenService.set(token);
|
|
118
|
+
return this.cacheInit();
|
|
119
|
+
}), mergeAll());
|
|
120
|
+
}
|
|
121
|
+
cacheInit() {
|
|
122
|
+
log('yz.auth.service: ', 'cacheInit');
|
|
123
|
+
const tenant = this.cacheService.get('_yz_tenant', { mode: 'none' });
|
|
124
|
+
const user = this.cacheService.get('_yz_user', { mode: 'none' });
|
|
125
|
+
const header = this.cacheService.get('_yz_header', { mode: 'none' });
|
|
126
|
+
const project = this.cacheService.get('_yz_project_info', { mode: 'none' });
|
|
127
|
+
return forkJoin(of(user), of(header), of(project)).pipe(mergeMap(([u, h, p]) => {
|
|
128
|
+
let list = [];
|
|
129
|
+
// user cache
|
|
130
|
+
if (!u || !tenant) {
|
|
131
|
+
log('yz.auth.service: ', 'fetch user cache');
|
|
132
|
+
list.push(this.httpClient.get(`/auth/user`).pipe(map((user) => {
|
|
133
|
+
this.cacheService.set('_yz_tenant', user.tenantId);
|
|
134
|
+
this.cacheService.set('_yz_user', user.principal);
|
|
135
|
+
})));
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
log('yz.auth.service: ', 'user recache');
|
|
139
|
+
list.push(of(() => { }));
|
|
140
|
+
}
|
|
141
|
+
// header cache
|
|
142
|
+
if (!h) {
|
|
143
|
+
log('yz.auth.service: ', 'fetch header cache');
|
|
144
|
+
list.push(this.httpClient.get(`/auth/allheader/v2`).pipe(map((header) => {
|
|
145
|
+
this.cacheService.set('_yz_header', header.data);
|
|
146
|
+
})));
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
log('yz.auth.service: ', 'header recache');
|
|
150
|
+
list.push(of(() => { }));
|
|
151
|
+
}
|
|
152
|
+
// project cache
|
|
153
|
+
if (!p) {
|
|
154
|
+
log('yz.auth.service: ', 'fetch project cache');
|
|
155
|
+
list.push(this.httpClient.get(`/app-manager/project/info`).pipe(map((info) => {
|
|
156
|
+
this.cacheService.set('_yz_project_info', info.data);
|
|
157
|
+
})));
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
log('yz.auth.service: ', 'project recache');
|
|
161
|
+
list.push(of(() => { }));
|
|
162
|
+
}
|
|
163
|
+
return forkJoin(list);
|
|
164
|
+
}));
|
|
165
|
+
}
|
|
166
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: YunzaiAuthService, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
167
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: YunzaiAuthService, providedIn: 'root' }); }
|
|
168
|
+
}
|
|
169
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: YunzaiAuthService, decorators: [{
|
|
170
|
+
type: Injectable,
|
|
171
|
+
args: [{ providedIn: 'root' }]
|
|
172
|
+
}], ctorParameters: function () { return [{ type: i0.Injector }]; } });
|
|
173
|
+
export { YunzaiAuthService as YzAuthService, YunzaiAuthService };
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieXVuemFpLWF1dGguc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Jpcy9sYXlvdXQveXVuemFpLWF1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXpFLE9BQU8sRUFBOEIsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUF3QixtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVyRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDOztBQUU5QyxNQUNNLGlCQUFpQjtJQUdyQixZQUFvQixRQUFrQjtRQUFsQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ3BDLElBQUksQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsSUFBWSxhQUFhO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsSUFBWSxZQUFZO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsSUFBWSxVQUFVO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELElB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QUFDLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxJQUFJLENBQ1AsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxJQUFJLENBQ25ELEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO29CQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZELENBQUMsQ0FBQyxDQUNILENBQ0YsQ0FBQzthQUNIO2lCQUFNO2dCQUNMLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBTSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzlCO1lBQ0QsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7OEdBckxHLGlCQUFpQjtrSEFBakIsaUJBQWlCLGNBREcsTUFBTTs7MkZBQzFCLGlCQUFpQjtrQkFEdEIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7O0FBeUxsQyxPQUFPLEVBQUUsaUJBQWlCLElBQUksYUFBYSxFQUFFLGlCQUFpQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZm9ya0pvaW4sIG1hcCwgbWVyZ2VBbGwsIG1lcmdlTWFwLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBJVG9rZW5Nb2RlbCwgSVRva2VuU2VydmljZSwgWUFfU0VSVklDRV9UT0tFTiB9IGZyb20gJ0B5ZWxvbi9hdXRoJztcbmltcG9ydCB7IENhY2hlU2VydmljZSB9IGZyb20gJ0B5ZWxvbi9jYWNoZSc7XG5pbXBvcnQgeyBfSHR0cENsaWVudCB9IGZyb20gJ0B5ZWxvbi90aGVtZSc7XG5pbXBvcnQgeyBsb2csIFdJTkRPVywgWXVuemFpQnVzaW5lc3NDb25maWcsIFl1bnphaUNvbmZpZ1NlcnZpY2UgfSBmcm9tICdAeWVsb24vdXRpbCc7XG5cbmltcG9ydCB7IG1lcmdlQmlzQ29uZmlnIH0gZnJvbSAnLi9iaXMuY29uZmlnJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmNsYXNzIFl1bnphaUF1dGhTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjb25maWc6IFl1bnphaUJ1c2luZXNzQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgdGhpcy5jb25maWcgPSBtZXJnZUJpc0NvbmZpZyh0aGlzLmNvbmZpZ1NlcnZpY2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY29uZmlnU2VydmljZSgpOiBZdW56YWlDb25maWdTZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5nZXQoWXVuemFpQ29uZmlnU2VydmljZSk7XG4gIH1cblxuICBwcml2YXRlIGdldCB0b2tlblNlcnZpY2UoKTogSVRva2VuU2VydmljZSB7XG4gICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IuZ2V0KFlBX1NFUlZJQ0VfVE9LRU4pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgaHR0cENsaWVudCgpOiBfSHR0cENsaWVudCB7XG4gICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IuZ2V0KF9IdHRwQ2xpZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNhY2hlU2VydmljZSgpOiBDYWNoZVNlcnZpY2Uge1xuICAgIHJldHVybiB0aGlzLmluamVjdG9yLmdldChDYWNoZVNlcnZpY2UpO1xuICB9XG5cbiAgYXNrVG9rZW4oKTogT2JzZXJ2YWJsZTxJVG9rZW5Nb2RlbD4ge1xuICAgIGxvZygneXouYXV0aC5zZXJ2aWNlOiAnLCAnYXNrVG9rZW4nKTtcbiAgICAvLyBpZiAodGhpcy50b2tlblNlcnZpY2UuZ2V0KCk/LnRva2VuKSB7XG4gICAgLy8gICBjb25zdCBub3RDb3ZlcnRUb2tlbiA9IHRoaXMudG9rZW5TZXJ2aWNlLmdldCgpO1xuICAgIC8vICAgbGV0IGNvbnZlcnRlZFRva2VuOiBJVG9rZW5Nb2RlbDtcbiAgICAvLyAgIGlmIChub3RDb3ZlcnRUb2tlbiAmJiBub3RDb3ZlcnRUb2tlblsnYWNjZXNzX3Rva2VuJ10pIHtcbiAgICAvLyAgICAgY29udmVydGVkVG9rZW4gPSB7XG4gICAgLy8gICAgICAgdG9rZW46IG5vdENvdmVydFRva2VuWydhY2Nlc3NfdG9rZW4nXSxcbiAgICAvLyAgICAgICBleHBpcmVkOiBub3RDb3ZlcnRUb2tlblsnZXhwaXJlc19pbiddLFxuICAgIC8vICAgICAgIHJlZnJlc2hUb2tlbjogbm90Q292ZXJ0VG9rZW5bJ3JlZnJlc2hfdG9rZW4nXSxcbiAgICAvLyAgICAgICBzY29wZTogbm90Q292ZXJ0VG9rZW5bJ3Njb3BlJ10sXG4gICAgLy8gICAgICAgdG9rZW5UeXBlOiBub3RDb3ZlcnRUb2tlblsndG9rZW5fdHlwZSddXG4gICAgLy8gICAgIH07XG4gICAgLy8gICAgIHJldHVybiBvZihjb252ZXJ0ZWRUb2tlbik7XG4gICAgLy8gICB9IGVsc2Uge1xuICAgIC8vICAgICByZXR1cm4gb2YodGhpcy50b2tlblNlcnZpY2UuZ2V0KCkhKTtcbiAgICAvLyAgIH1cbiAgICAvLyB9IGVsc2Uge1xuICAgIGlmICh0aGlzLmNvbmZpZy5sb2dpbkZvcm0pIHtcbiAgICAgIHJldHVybiB0aGlzLmZldGNoVG9rZW5CeVVQKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmZldGNoVG9rZW5CeUNhcygpO1xuICAgIH1cbiAgICAvLyB9XG4gIH1cblxuICBmZXRjaFRva2VuQnlVUCgpOiBPYnNlcnZhYmxlPElUb2tlbk1vZGVsPiB7XG4gICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICdmZXRjaFRva2VuQnlVUCcpO1xuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdChgL2F1dGgvb2F1dGgvdG9rZW4/X2FsbG93X2Fub255bW91cz10cnVlYCwgdGhpcy5jb25maWcubG9naW5Gb3JtKS5waXBlKFxuICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgYWNjZXNzX3Rva2VuLCBleHBpcmVzX2luLCByZWZyZXNoX3Rva2VuLCBzY29wZSwgdG9rZW5fdHlwZSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9rZW46IGFjY2Vzc190b2tlbixcbiAgICAgICAgICBleHBpcmVkOiBleHBpcmVzX2luLFxuICAgICAgICAgIHJlZnJlc2hUb2tlbjogcmVmcmVzaF90b2tlbixcbiAgICAgICAgICB0b2tlblR5cGU6IHRva2VuX3R5cGUsXG4gICAgICAgICAgc2NvcGVcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGZldGNoVG9rZW5CeUNhcygpOiBPYnNlcnZhYmxlPElUb2tlbk1vZGVsPiB7XG4gICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICdmZXRjaFRva2VuQnlDYXMnKTtcbiAgICBjb25zdCB1cmkgPSBlbmNvZGVVUklDb21wb25lbnQodGhpcy5pbmplY3Rvci5nZXQoV0lORE9XKS5sb2NhdGlvbi5ocmVmKTtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50XG4gICAgICAuZ2V0KGAvY2FzLXByb3h5L2FwcC92YWxpZGF0ZV9mdWxsP2NhbGxiYWNrPSR7dXJpfSZfYWxsb3dfYW5vbnltb3VzPXRydWUmdGltZXN0YW1wPSR7bmV3IERhdGUoKS5nZXRUaW1lKCl9YClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyDmn6XnnIvnvJPlrZjkuK3nmoTnlKjmiLfmmK/lkKbkuI50b2tlbumqjOivgeWbnueahOeUqOaIt2lk55u45ZCM77yM5aaC5p6c5LiN5ZCM5YiZ57yT5a2Y5Li66L+H5pyf57yT5a2Y77yM6L+b6KGM5riF6ZmkXG4gICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnVzZXJJZCkge1xuICAgICAgICAgICAgY29uc3QgdXNlciA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldCgnX3l6X3VzZXInLCB7IG1vZGU6ICdub25lJyB9KTtcbiAgICAgICAgICAgIGlmICh1c2VyICYmIHVzZXIuaWQgJiYgdXNlci5pZCAhPT0gcmVzcG9uc2UudXNlcklkKSB7XG4gICAgICAgICAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLmNsZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHN3aXRjaCAocmVzcG9uc2UuZXJyY29kZSkge1xuICAgICAgICAgICAgY2FzZSAyMDAwOlxuICAgICAgICAgICAgICBjb25zdCB7IGFjY2Vzc190b2tlbiwgZXhwaXJlc19pbiwgcmVmcmVzaF90b2tlbiwgc2NvcGUsIHRva2VuX3R5cGUgfSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdG9rZW46IGFjY2Vzc190b2tlbixcbiAgICAgICAgICAgICAgICBleHBpcmVkOiBleHBpcmVzX2luLFxuICAgICAgICAgICAgICAgIHJlZnJlc2hUb2tlbjogcmVmcmVzaF90b2tlbixcbiAgICAgICAgICAgICAgICB0b2tlblR5cGU6IHRva2VuX3R5cGUsXG4gICAgICAgICAgICAgICAgc2NvcGVcbiAgICAgICAgICAgICAgfSBhcyBJVG9rZW5Nb2RlbDtcbiAgICAgICAgICAgIGNhc2UgMjAwMTpcbiAgICAgICAgICAgICAgdGhpcy5pbmplY3Rvci5nZXQoV0lORE9XKS5sb2NhdGlvbi5ocmVmID0gcmVzcG9uc2UubXNnO1xuICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcIkNvb2tpZSBFcnJvcjogQ2FuJ3QgZmluZCBDYXMgQ29va2llLFNvIGp1bXAgdG8gbG9naW4hXCIpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLm1zZykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IocmVzcG9uc2UubXNnKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihyZXNwb25zZS5tc2cpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2NhcyB1bmtub3duIGVycm9yJyk7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1Vua25vd24gRXJyb3I6IENhcyBhdXRoIGV4Y2VwdGlvbiEnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBsb2dpbigpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBsb2coJ3l6LmF1dGguc2VydmljZTogJywgJ2xvZ2luIHdoaXRlIGxvZ2luIGZvcm0tPicsIHRoaXMuY29uZmlnLmxvZ2luRm9ybSk7XG4gICAgcmV0dXJuIHRoaXMuYXNrVG9rZW4oKS5waXBlKFxuICAgICAgbWVyZ2VNYXAodG9rZW4gPT4ge1xuICAgICAgICBsb2coJ3l6LmF1dGguc2VydmljZTogZ2V0IHRva2VuLT4nLCB0b2tlbik7XG4gICAgICAgIHRoaXMuY29uZmlnU2VydmljZS5zZXQoJ2F1dGgnLCB7XG4gICAgICAgICAgdG9rZW5fc2VuZF9rZXk6ICdBdXRob3JpemF0aW9uJyxcbiAgICAgICAgICB0b2tlbl9zZW5kX3RlbXBsYXRlOiBgJHt0b2tlbi50b2tlblR5cGV9IFxcJHt0b2tlbn1gLFxuICAgICAgICAgIHRva2VuX3NlbmRfcGxhY2U6ICdoZWFkZXInXG4gICAgICAgIH0pO1xuICAgICAgICBsb2coJ3l6LmF1dGguc2VydmljZTogJywgJ3NldCB0b2tlbicpO1xuICAgICAgICB0aGlzLnRva2VuU2VydmljZS5zZXQodG9rZW4pO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZUluaXQoKTtcbiAgICAgIH0pLFxuICAgICAgbWVyZ2VBbGwoKVxuICAgICk7XG4gIH1cblxuICBjYWNoZUluaXQoKTogT2JzZXJ2YWJsZTx2b2lkW10+IHtcbiAgICBsb2coJ3l6LmF1dGguc2VydmljZTogJywgJ2NhY2hlSW5pdCcpO1xuICAgIGNvbnN0IHRlbmFudCA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldCgnX3l6X3RlbmFudCcsIHsgbW9kZTogJ25vbmUnIH0pO1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmNhY2hlU2VydmljZS5nZXQoJ195el91c2VyJywgeyBtb2RlOiAnbm9uZScgfSk7XG4gICAgY29uc3QgaGVhZGVyID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCdfeXpfaGVhZGVyJywgeyBtb2RlOiAnbm9uZScgfSk7XG4gICAgY29uc3QgcHJvamVjdCA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldCgnX3l6X3Byb2plY3RfaW5mbycsIHsgbW9kZTogJ25vbmUnIH0pO1xuICAgIHJldHVybiBmb3JrSm9pbihvZih1c2VyKSwgb2YoaGVhZGVyKSwgb2YocHJvamVjdCkpLnBpcGUoXG4gICAgICBtZXJnZU1hcCgoW3UsIGgsIHBdKSA9PiB7XG4gICAgICAgIGxldCBsaXN0ID0gW107XG4gICAgICAgIC8vIHVzZXIgY2FjaGVcbiAgICAgICAgaWYgKCF1IHx8ICF0ZW5hbnQpIHtcbiAgICAgICAgICBsb2coJ3l6LmF1dGguc2VydmljZTogJywgJ2ZldGNoIHVzZXIgY2FjaGUnKTtcbiAgICAgICAgICBsaXN0LnB1c2goXG4gICAgICAgICAgICB0aGlzLmh0dHBDbGllbnQuZ2V0KGAvYXV0aC91c2VyYCkucGlwZShcbiAgICAgICAgICAgICAgbWFwKCh1c2VyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlU2VydmljZS5zZXQoJ195el90ZW5hbnQnLCB1c2VyLnRlbmFudElkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlU2VydmljZS5zZXQoJ195el91c2VyJywgdXNlci5wcmluY2lwYWwpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICd1c2VyIHJlY2FjaGUnKTtcbiAgICAgICAgICBsaXN0LnB1c2gob2Y8YW55PigoKSA9PiB7fSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGhlYWRlciBjYWNoZVxuICAgICAgICBpZiAoIWgpIHtcbiAgICAgICAgICBsb2coJ3l6LmF1dGguc2VydmljZTogJywgJ2ZldGNoIGhlYWRlciBjYWNoZScpO1xuICAgICAgICAgIGxpc3QucHVzaChcbiAgICAgICAgICAgIHRoaXMuaHR0cENsaWVudC5nZXQoYC9hdXRoL2FsbGhlYWRlci92MmApLnBpcGUoXG4gICAgICAgICAgICAgIG1hcCgoaGVhZGVyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlU2VydmljZS5zZXQoJ195el9oZWFkZXInLCBoZWFkZXIuZGF0YSk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2coJ3l6LmF1dGguc2VydmljZTogJywgJ2hlYWRlciByZWNhY2hlJyk7XG4gICAgICAgICAgbGlzdC5wdXNoKG9mPGFueT4oKCkgPT4ge30pKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBwcm9qZWN0IGNhY2hlXG4gICAgICAgIGlmICghcCkge1xuICAgICAgICAgIGxvZygneXouYXV0aC5zZXJ2aWNlOiAnLCAnZmV0Y2ggcHJvamVjdCBjYWNoZScpO1xuICAgICAgICAgIGxpc3QucHVzaChcbiAgICAgICAgICAgIHRoaXMuaHR0cENsaWVudC5nZXQoYC9hcHAtbWFuYWdlci9wcm9qZWN0L2luZm9gKS5waXBlKFxuICAgICAgICAgICAgICBtYXAoKGluZm86IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLnNldCgnX3l6X3Byb2plY3RfaW5mbycsIGluZm8uZGF0YSk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2coJ3l6LmF1dGguc2VydmljZTogJywgJ3Byb2plY3QgcmVjYWNoZScpO1xuICAgICAgICAgIGxpc3QucHVzaChvZjxhbnk+KCgpID0+IHt9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKGxpc3QpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7IFl1bnphaUF1dGhTZXJ2aWNlIGFzIFl6QXV0aFNlcnZpY2UsIFl1bnphaUF1dGhTZXJ2aWNlIH07XG4iXX0=
|