@reskin/core 0.0.21 → 0.1.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/bundles/reskin-core-directives.umd.js +303 -163
- package/bundles/reskin-core-directives.umd.js.map +1 -1
- package/bundles/reskin-core-guards.umd.js +119 -32
- package/bundles/reskin-core-guards.umd.js.map +1 -1
- package/bundles/reskin-core-interceptors.umd.js +310 -92
- package/bundles/reskin-core-interceptors.umd.js.map +1 -1
- package/bundles/reskin-core-utils.umd.js +220 -77
- package/bundles/reskin-core-utils.umd.js.map +1 -1
- package/directives/auth.directive.d.ts +56 -9
- package/directives/load.styles.directive.d.ts +45 -5
- package/directives/string.template.outlet.directive.d.ts +68 -11
- package/esm2015/directives/auth.directive.js +71 -30
- package/esm2015/directives/load.styles.directive.js +84 -15
- package/esm2015/directives/string.template.outlet.directive.js +118 -60
- package/esm2015/guards/auth.guard.js +117 -30
- package/esm2015/interceptors/blob.interceptor.js +67 -28
- package/esm2015/interceptors/cache.interceptor.js +46 -14
- package/esm2015/interceptors/error.interceptor.js +104 -12
- package/esm2015/interceptors/public-api.js +2 -1
- package/esm2015/interceptors/token.interceptor.js +86 -42
- package/esm2015/interceptors/types.js +5 -0
- package/esm2015/utils/array.js +42 -22
- package/esm2015/utils/dom.js +29 -11
- package/esm2015/utils/form.js +44 -13
- package/esm2015/utils/store.js +101 -26
- package/fesm2015/reskin-core-directives.js +269 -103
- package/fesm2015/reskin-core-directives.js.map +1 -1
- package/fesm2015/reskin-core-guards.js +116 -29
- package/fesm2015/reskin-core-guards.js.map +1 -1
- package/fesm2015/reskin-core-interceptors.js +302 -91
- package/fesm2015/reskin-core-interceptors.js.map +1 -1
- package/fesm2015/reskin-core-utils.js +212 -68
- package/fesm2015/reskin-core-utils.js.map +1 -1
- package/guards/auth.guard.d.ts +85 -5
- package/interceptors/blob.interceptor.d.ts +30 -3
- package/interceptors/cache.interceptor.d.ts +28 -4
- package/interceptors/error.interceptor.d.ts +43 -2
- package/interceptors/public-api.d.ts +1 -0
- package/interceptors/token.interceptor.d.ts +41 -12
- package/interceptors/types.d.ts +68 -0
- package/package.json +1 -1
- package/utils/array.d.ts +8 -1
- package/utils/dom.d.ts +32 -5
- package/utils/form.d.ts +37 -2
- package/utils/store.d.ts +56 -15
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { Inject, Injectable, InjectionToken } from '@angular/core';
|
|
2
|
-
import {
|
|
1
|
+
import { Inject, Injectable, InjectionToken, Optional } from '@angular/core';
|
|
2
|
+
import { of } from 'rxjs';
|
|
3
|
+
import { catchError, filter, map } from 'rxjs/operators';
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
4
5
|
import * as i1 from "@reskin/core/services";
|
|
5
6
|
import * as i2 from "@angular/router";
|
|
@@ -7,60 +8,139 @@ import * as i2 from "@angular/router";
|
|
|
7
8
|
* 路由守卫配置注入令牌
|
|
8
9
|
*/
|
|
9
10
|
export const RK_ROUTER_GUARD_CONFIG = new InjectionToken('router_guard_config');
|
|
11
|
+
/**
|
|
12
|
+
* 路由守卫选项注入令牌
|
|
13
|
+
*/
|
|
14
|
+
export const RK_ROUTER_GUARD_OPTIONS = new InjectionToken('router_guard_options');
|
|
10
15
|
/**
|
|
11
16
|
* 路由守卫提供者配置函数
|
|
12
17
|
*
|
|
13
18
|
* @param urls - 路由守卫配置数组,包含需要保护的路由配置信息
|
|
19
|
+
* @param options - 可选的守卫选项配置
|
|
14
20
|
* @returns 返回Angular依赖注入的Provider数组,用于配置路由守卫
|
|
15
21
|
*/
|
|
16
|
-
export function providerRouterGuard(urls) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
{ provide:
|
|
20
|
-
|
|
22
|
+
export function providerRouterGuard(urls, options) {
|
|
23
|
+
const providers = [{ provide: RK_ROUTER_GUARD_CONFIG, useValue: urls }];
|
|
24
|
+
if (options) {
|
|
25
|
+
providers.push({ provide: RK_ROUTER_GUARD_OPTIONS, useValue: options });
|
|
26
|
+
}
|
|
27
|
+
return providers;
|
|
21
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* 路由权限守卫
|
|
31
|
+
*
|
|
32
|
+
* 用于保护路由,确保用户只能访问其被授权的路由。
|
|
33
|
+
* 支持权限继承机制和自定义权限检查逻辑。
|
|
34
|
+
*/
|
|
22
35
|
export class RkAuthGuard {
|
|
23
|
-
constructor(config, menu, router) {
|
|
36
|
+
constructor(config, options, menu, router) {
|
|
24
37
|
this.config = config;
|
|
38
|
+
this.options = options;
|
|
25
39
|
this.menu = menu;
|
|
26
40
|
this.router = router;
|
|
27
41
|
}
|
|
28
42
|
canActivateChild(childRoute, state) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
43
|
+
var _a;
|
|
44
|
+
// 检查路由数据中是否配置跳过权限检查
|
|
45
|
+
if (childRoute.data['skipAuth'] === true) {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
// 执行前置钩子
|
|
49
|
+
if (((_a = this.options) === null || _a === void 0 ? void 0 : _a.beforeCheck) && !this.options.beforeCheck(childRoute, state)) {
|
|
50
|
+
return this.handleNoAccess(state.url);
|
|
51
|
+
}
|
|
52
|
+
return this.menu.requestData().pipe(filter((json) => json.code === 0), map((json) => json.data), map((menus) => this.checkAccess(menus, state.url)), catchError((error) => {
|
|
53
|
+
console.error('路由权限检查失败:', error);
|
|
54
|
+
return of(this.handleNoAccess(state.url));
|
|
32
55
|
}));
|
|
33
56
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
57
|
+
/**
|
|
58
|
+
* 检查用户是否有权限访问指定路由
|
|
59
|
+
*
|
|
60
|
+
* @param menus - 用户菜单权限数据
|
|
61
|
+
* @param url - 目标路由地址
|
|
62
|
+
* @returns 返回 true 允许访问,返回 false 或 UrlTree 拒绝访问
|
|
63
|
+
*/
|
|
64
|
+
checkAccess(menus, url) {
|
|
65
|
+
if (!menus || menus.length === 0) {
|
|
66
|
+
console.error('此账号无任何功能权限');
|
|
67
|
+
return this.handleNoAccess(url);
|
|
37
68
|
}
|
|
38
|
-
|
|
69
|
+
// 移除查询参数,只保留路径部分
|
|
70
|
+
const routerUrl = this.normalizeUrl(url);
|
|
71
|
+
// 构建用户权限路由集合
|
|
39
72
|
const authRoutes = new Set(menus.map((m) => m.SYSTEM_RESOURCE_URL));
|
|
73
|
+
// 直接权限检查
|
|
40
74
|
if (authRoutes.has(routerUrl)) {
|
|
41
75
|
return true;
|
|
42
76
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
77
|
+
// 继承权限检查
|
|
78
|
+
if (this.hasInheritedPermission(routerUrl, authRoutes)) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
// 无权限访问
|
|
82
|
+
return this.handleNoAccess(url);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 检查是否有继承的权限
|
|
86
|
+
*
|
|
87
|
+
* @param routerUrl - 标准化后的路由地址
|
|
88
|
+
* @param authRoutes - 用户权限路由集合
|
|
89
|
+
* @returns 返回 true 表示有继承权限
|
|
90
|
+
*/
|
|
91
|
+
hasInheritedPermission(routerUrl, authRoutes) {
|
|
92
|
+
if (!this.config || this.config.length === 0) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
// 查找匹配的继承配置
|
|
96
|
+
const matchedConfigs = this.config.filter((item) => {
|
|
97
|
+
return item.extends.some((route) => this.matchRoute(route, routerUrl));
|
|
98
|
+
});
|
|
99
|
+
// 检查是否有任一配置的 url 在用户权限中
|
|
100
|
+
return matchedConfigs.some((item) => authRoutes.has(item.url));
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 匹配路由规则
|
|
104
|
+
*
|
|
105
|
+
* @param pattern - 路由模式(支持 ** 通配符)
|
|
106
|
+
* @param path - 实际路由路径
|
|
107
|
+
* @returns 返回 true 表示匹配成功
|
|
108
|
+
*/
|
|
109
|
+
matchRoute(pattern, path) {
|
|
110
|
+
if (pattern.includes('**')) {
|
|
111
|
+
const regexPattern = pattern.replace(/\*\*/g, '.*');
|
|
112
|
+
return new RegExp(`^${regexPattern}$`).test(path);
|
|
50
113
|
}
|
|
51
|
-
|
|
52
|
-
return false;
|
|
114
|
+
return pattern === path;
|
|
53
115
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
116
|
+
/**
|
|
117
|
+
* 标准化URL,移除查询参数和片段标识符
|
|
118
|
+
*
|
|
119
|
+
* @param url - 原始URL
|
|
120
|
+
* @returns 标准化后的URL
|
|
121
|
+
*/
|
|
122
|
+
normalizeUrl(url) {
|
|
123
|
+
return url.replace(/[?#].*/, '');
|
|
57
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* 处理无权限访问
|
|
127
|
+
*
|
|
128
|
+
* @param url - 被拒绝访问的路由地址
|
|
129
|
+
* @returns 返回 false 或 UrlTree
|
|
130
|
+
*/
|
|
58
131
|
handleNoAccess(url) {
|
|
132
|
+
var _a, _b;
|
|
59
133
|
console.error(`无权限访问路由地址: ${url}`);
|
|
60
|
-
|
|
134
|
+
// 使用自定义回调
|
|
135
|
+
if ((_a = this.options) === null || _a === void 0 ? void 0 : _a.onAccessDenied) {
|
|
136
|
+
return this.options.onAccessDenied(url);
|
|
137
|
+
}
|
|
138
|
+
// 使用自定义未授权路径或默认路径
|
|
139
|
+
const unauthorizedPath = ((_b = this.options) === null || _b === void 0 ? void 0 : _b.unauthorizedPath) || '/errors/401';
|
|
140
|
+
return this.router.createUrlTree([unauthorizedPath]);
|
|
61
141
|
}
|
|
62
142
|
}
|
|
63
|
-
RkAuthGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RkAuthGuard, deps: [{ token: RK_ROUTER_GUARD_CONFIG }, { token: i1.RkMenuService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
143
|
+
RkAuthGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RkAuthGuard, deps: [{ token: RK_ROUTER_GUARD_CONFIG, optional: true }, { token: RK_ROUTER_GUARD_OPTIONS, optional: true }, { token: i1.RkMenuService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
64
144
|
RkAuthGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RkAuthGuard, providedIn: 'root' });
|
|
65
145
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RkAuthGuard, decorators: [{
|
|
66
146
|
type: Injectable,
|
|
@@ -68,7 +148,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
68
148
|
providedIn: 'root',
|
|
69
149
|
}]
|
|
70
150
|
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
151
|
+
type: Optional
|
|
152
|
+
}, {
|
|
71
153
|
type: Inject,
|
|
72
154
|
args: [RK_ROUTER_GUARD_CONFIG]
|
|
155
|
+
}] }, { type: undefined, decorators: [{
|
|
156
|
+
type: Optional
|
|
157
|
+
}, {
|
|
158
|
+
type: Inject,
|
|
159
|
+
args: [RK_ROUTER_GUARD_OPTIONS]
|
|
73
160
|
}] }, { type: i1.RkMenuService }, { type: i2.Router }]; } });
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnJhcnkvY29yZS9ndWFyZHMvYXV0aC5ndWFyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQVksTUFBTSxlQUFlLENBQUM7QUFHN0UsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFHekQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBZ0JoRjs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxJQUEwQjtJQUMxRCxPQUFPO1FBQ0gsU0FBUztRQUNULEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7S0FDdEQsQ0FBQztBQUNOLENBQUM7QUFLRCxNQUFNLE9BQU8sV0FBVztJQUNwQixZQUM0QyxNQUE0QixFQUM1RCxJQUFtQixFQUNuQixNQUFjO1FBRmtCLFdBQU0sR0FBTixNQUFNLENBQXNCO1FBQzVELFNBQUksR0FBSixJQUFJLENBQWU7UUFDbkIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtJQUN2QixDQUFDO0lBRUosZ0JBQWdCLENBQ1osVUFBa0MsRUFDbEMsS0FBMEI7UUFFMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FDL0IsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUNqQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFDeEIsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQzlELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQ0wsQ0FBQztJQUNOLENBQUM7SUFFTyxXQUFXLENBQUMsS0FBWSxFQUFFLFVBQWtDLEVBQUUsR0FBVztRQUM3RSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDbEM7UUFFRCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxQyxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBUyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1FBRTVFLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUMzQixPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUM3QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUM3SCxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3pCLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUNoRTtTQUNKO1FBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRU8sS0FBSyxDQUFDLE9BQWUsRUFBRSxJQUFZO1FBQ3ZDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BELE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU8sY0FBYyxDQUFDLEdBQVc7UUFDOUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2pELENBQUM7O3lHQXZEUSxXQUFXLGtCQUVSLHNCQUFzQjs2R0FGekIsV0FBVyxjQUZSLE1BQU07NEZBRVQsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7OzBCQUdRLE1BQU07MkJBQUMsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgUHJvdmlkZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgQ2FuQWN0aXZhdGVDaGlsZCwgUm91dGVyLCBSb3V0ZXJTdGF0ZVNuYXBzaG90LCBVcmxUcmVlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgUmtNZW51U2VydmljZSB9IGZyb20gJ0ByZXNraW4vY29yZS9zZXJ2aWNlcyc7XHJcblxyXG4vKipcclxuICog6Lev55Sx5a6I5Y2r6YWN572u5rOo5YWl5Luk54mMXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUktfUk9VVEVSX0dVQVJEX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbigncm91dGVyX2d1YXJkX2NvbmZpZycpO1xyXG5cclxuLyoqXHJcbiAqIOi3r+eUseWuiOWNq+mFjee9rlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBJUm91dGVyR3VhcmRDb25maWcge1xyXG4gICAgLyoqXHJcbiAgICAgKiDot6/nlLHlnLDlnYBcclxuICAgICAqL1xyXG4gICAgdXJsOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIOe7p+aJv+eahOadg+mZkFxyXG4gICAgICovXHJcbiAgICBleHRlbmRzOiBzdHJpbmdbXTtcclxufVxyXG5cclxuLyoqXHJcbiAqIOi3r+eUseWuiOWNq+aPkOS+m+iAhemFjee9ruWHveaVsFxyXG4gKlxyXG4gKiBAcGFyYW0gdXJscyAtIOi3r+eUseWuiOWNq+mFjee9ruaVsOe7hO+8jOWMheWQq+mcgOimgeS/neaKpOeahOi3r+eUsemFjee9ruS/oeaBr1xyXG4gKiBAcmV0dXJucyDov5Tlm55Bbmd1bGFy5L6d6LWW5rOo5YWl55qEUHJvdmlkZXLmlbDnu4TvvIznlKjkuo7phY3nva7ot6/nlLHlrojljatcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlclJvdXRlckd1YXJkKHVybHM6IElSb3V0ZXJHdWFyZENvbmZpZ1tdKTogUHJvdmlkZXJbXSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAgIC8vIOi3r+eUseWuiOWNq+mFjee9rlxyXG4gICAgICAgIHsgcHJvdmlkZTogUktfUk9VVEVSX0dVQVJEX0NPTkZJRywgdXNlVmFsdWU6IHVybHMgfSxcclxuICAgIF07XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFJrQXV0aEd1YXJkIGltcGxlbWVudHMgQ2FuQWN0aXZhdGVDaGlsZCB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBASW5qZWN0KFJLX1JPVVRFUl9HVUFSRF9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBJUm91dGVyR3VhcmRDb25maWdbXSxcclxuICAgICAgICBwcml2YXRlIG1lbnU6IFJrTWVudVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgICkge31cclxuXHJcbiAgICBjYW5BY3RpdmF0ZUNoaWxkKFxyXG4gICAgICAgIGNoaWxkUm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsXHJcbiAgICAgICAgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QsXHJcbiAgICApOiBPYnNlcnZhYmxlPGJvb2xlYW4gfCBVcmxUcmVlPiB8IFByb21pc2U8Ym9vbGVhbiB8IFVybFRyZWU+IHwgYm9vbGVhbiB8IFVybFRyZWUge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1lbnUucmVxdWVzdERhdGEoKS5waXBlKFxyXG4gICAgICAgICAgICBmaWx0ZXIoKGpzb24pID0+IGpzb24uY29kZSA9PT0gMCksXHJcbiAgICAgICAgICAgIG1hcCgoanNvbikgPT4ganNvbi5kYXRhKSxcclxuICAgICAgICAgICAgbWFwKChtZW51cykgPT4gdGhpcy5jaGVja0FjY2VzcyhtZW51cywgY2hpbGRSb3V0ZSwgc3RhdGUudXJsKSksXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVOb0FjY2VzcyhzdGF0ZS51cmwpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtmYWxzZV07XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja0FjY2VzcyhtZW51czogYW55W10sIGNoaWxkUm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHVybDogc3RyaW5nKTogYm9vbGVhbiB8IFVybFRyZWUge1xyXG4gICAgICAgIGlmICghbWVudXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg5q2k6LSm5Y+35peg5Lu75L2V5Yqf6IO95p2D6ZmQLmApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgcm91dGVyVXJsID0gdXJsLnJlcGxhY2UoL1xcPy4qLywgJycpO1xyXG4gICAgICAgIGNvbnN0IGF1dGhSb3V0ZXMgPSBuZXcgU2V0PHN0cmluZz4obWVudXMubWFwKChtKSA9PiBtLlNZU1RFTV9SRVNPVVJDRV9VUkwpKTtcclxuXHJcbiAgICAgICAgaWYgKGF1dGhSb3V0ZXMuaGFzKHJvdXRlclVybCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBleHRlbmRSb3V0ZXMgPSB0aGlzLmNvbmZpZy5maWx0ZXIoKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmV4dGVuZHMuc29tZSgocm91dGU6IHN0cmluZykgPT4gKHJvdXRlLmluY2x1ZGVzKCcqKicpID8gdGhpcy5tYXRjaChyb3V0ZSwgcm91dGVyVXJsKSA6IHJvdXRlID09PSByb3V0ZXJVcmwpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChleHRlbmRSb3V0ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4dGVuZFJvdXRlcy5zb21lKChpdGVtKSA9PiBhdXRoUm91dGVzLmhhcyhpdGVtLnVybCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmhhbmRsZU5vQWNjZXNzKHVybCk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbWF0Y2gocGF0dGVybjogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCByZWdleFBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2UoL1xcKlxcKi9nLCAnLionKTtcclxuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7cmVnZXhQYXR0ZXJufSRgKS50ZXN0KHBhdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlTm9BY2Nlc3ModXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGDml6DmnYPpmZDorr/pl67ot6/nlLHlnLDlnYA6ICR7dXJsfWApO1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2Vycm9ycy80MDEnXSkudGhlbigpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
161
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnJhcnkvY29yZS9ndWFyZHMvYXV0aC5ndWFyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBRXZGLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFHekQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLGNBQWMsQ0FBdUIscUJBQXFCLENBQUMsQ0FBQztBQUV0Rzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLElBQUksY0FBYyxDQUFvQixzQkFBc0IsQ0FBQyxDQUFDO0FBbURyRzs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsSUFBMEIsRUFBRSxPQUEyQjtJQUN2RixNQUFNLFNBQVMsR0FBZSxDQUFDLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRXBGLElBQUksT0FBTyxFQUFFO1FBQ1QsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztLQUMzRTtJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ3JCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUlILE1BQU0sT0FBTyxXQUFXO0lBQ3BCLFlBQ3dELE1BQW1DLEVBQ2xDLE9BQWlDLEVBQzlFLElBQW1CLEVBQ25CLE1BQWM7UUFIOEIsV0FBTSxHQUFOLE1BQU0sQ0FBNkI7UUFDbEMsWUFBTyxHQUFQLE9BQU8sQ0FBMEI7UUFDOUUsU0FB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QUMsQ0FBQztJQUN6RCxDQUFDOzt5R0FqSVEsV0FBVyxrQkFFSSxzQkFBc0IsNkJBQ3RCLHVCQUF1Qjs2R0FIdEMsV0FBVyxjQUZSLE1BQU07NEZBRVQsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7OzBCQUdRLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsc0JBQXNCOzswQkFDekMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBPcHRpb25hbCwgUHJvdmlkZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgQ2FuQWN0aXZhdGVDaGlsZCwgUm91dGVyLCBSb3V0ZXJTdGF0ZVNuYXBzaG90LCBVcmxUcmVlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmlsdGVyLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFJrTWVudVNlcnZpY2UgfSBmcm9tICdAcmVza2luL2NvcmUvc2VydmljZXMnO1xyXG5cclxuLyoqXHJcbiAqIOi3r+eUseWuiOWNq+mFjee9ruazqOWFpeS7pOeJjFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFJLX1JPVVRFUl9HVUFSRF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48SVJvdXRlckd1YXJkQ29uZmlnW10+KCdyb3V0ZXJfZ3VhcmRfY29uZmlnJyk7XHJcblxyXG4vKipcclxuICog6Lev55Sx5a6I5Y2r6YCJ6aG55rOo5YWl5Luk54mMXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgUktfUk9VVEVSX0dVQVJEX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48SUF1dGhHdWFyZE9wdGlvbnM+KCdyb3V0ZXJfZ3VhcmRfb3B0aW9ucycpO1xyXG5cclxuLyoqXHJcbiAqIOiPnOWNleaVsOaNruaOpeWPo1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBJTWVudURhdGEge1xyXG4gICAgLyoqXHJcbiAgICAgKiDns7vnu5/otYTmupBVUkxcclxuICAgICAqL1xyXG4gICAgU1lTVEVNX1JFU09VUkNFX1VSTDogc3RyaW5nO1xyXG4gICAgW2tleTogc3RyaW5nXTogYW55O1xyXG59XHJcblxyXG4vKipcclxuICog6Lev55Sx5a6I5Y2r6YWN572uXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElSb3V0ZXJHdWFyZENvbmZpZyB7XHJcbiAgICAvKipcclxuICAgICAqIOi3r+eUseWcsOWdgFxyXG4gICAgICovXHJcbiAgICB1cmw6IHN0cmluZztcclxuICAgIC8qKlxyXG4gICAgICog57un5om/55qE5p2D6ZmQXHJcbiAgICAgKi9cclxuICAgIGV4dGVuZHM6IHN0cmluZ1tdO1xyXG59XHJcblxyXG4vKipcclxuICog6Lev55Sx5a6I5Y2r6YCJ6aG56YWN572uXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElBdXRoR3VhcmRPcHRpb25zIHtcclxuICAgIC8qKlxyXG4gICAgICog5peg5p2D6ZmQ5pe255qE6Lez6L2s6Lev5b6EXHJcbiAgICAgKiBAZGVmYXVsdCAnL2Vycm9ycy80MDEnXHJcbiAgICAgKi9cclxuICAgIHVuYXV0aG9yaXplZFBhdGg/OiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIOiHquWumuS5ieaXoOadg+mZkOWkhOeQhuWbnuiwg1xyXG4gICAgICogQHBhcmFtIHVybCAtIOiiq+aLkue7neiuv+mXrueahOi3r+eUseWcsOWdgFxyXG4gICAgICogQHJldHVybnMg6L+U5ZueIGZhbHNlIOmYu+atouWvvOiIqu+8jOi/lOWbniBVcmxUcmVlIOi/m+ihjOmHjeWumuWQke+8jOi/lOWbniB0cnVlIOWFgeiuuOiuv+mXrlxyXG4gICAgICovXHJcbiAgICBvbkFjY2Vzc0RlbmllZD86ICh1cmw6IHN0cmluZykgPT4gYm9vbGVhbiB8IFVybFRyZWU7XHJcbiAgICAvKipcclxuICAgICAqIOadg+mZkOajgOafpeWJjeeahOmSqeWtkOWHveaVsFxyXG4gICAgICogQHBhcmFtIHJvdXRlIC0g5r+A5rS755qE6Lev55Sx5b+r54WnXHJcbiAgICAgKiBAcGFyYW0gc3RhdGUgLSDot6/nlLHnirbmgIHlv6vnhadcclxuICAgICAqIEByZXR1cm5zIOi/lOWbniBmYWxzZSDot7Pov4fmnYPpmZDmo4Dmn6Xlubbmi5Lnu53orr/pl67vvIzov5Tlm54gdHJ1ZSDnu6fnu63mnYPpmZDmo4Dmn6VcclxuICAgICAqL1xyXG4gICAgYmVmb3JlQ2hlY2s/OiAocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KSA9PiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuICog6Lev55Sx5a6I5Y2r5o+Q5L6b6ICF6YWN572u5Ye95pWwXHJcbiAqXHJcbiAqIEBwYXJhbSB1cmxzIC0g6Lev55Sx5a6I5Y2r6YWN572u5pWw57uE77yM5YyF5ZCr6ZyA6KaB5L+d5oqk55qE6Lev55Sx6YWN572u5L+h5oGvXHJcbiAqIEBwYXJhbSBvcHRpb25zIC0g5Y+v6YCJ55qE5a6I5Y2r6YCJ6aG56YWN572uXHJcbiAqIEByZXR1cm5zIOi/lOWbnkFuZ3VsYXLkvp3otZbms6jlhaXnmoRQcm92aWRlcuaVsOe7hO+8jOeUqOS6jumFjee9rui3r+eUseWuiOWNq1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVyUm91dGVyR3VhcmQodXJsczogSVJvdXRlckd1YXJkQ29uZmlnW10sIG9wdGlvbnM/OiBJQXV0aEd1YXJkT3B0aW9ucyk6IFByb3ZpZGVyW10ge1xyXG4gICAgY29uc3QgcHJvdmlkZXJzOiBQcm92aWRlcltdID0gW3sgcHJvdmlkZTogUktfUk9VVEVSX0dVQVJEX0NPTkZJRywgdXNlVmFsdWU6IHVybHMgfV07XHJcblxyXG4gICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgICBwcm92aWRlcnMucHVzaCh7IHByb3ZpZGU6IFJLX1JPVVRFUl9HVUFSRF9PUFRJT05TLCB1c2VWYWx1ZTogb3B0aW9ucyB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcHJvdmlkZXJzO1xyXG59XHJcblxyXG4vKipcclxuICog6Lev55Sx5p2D6ZmQ5a6I5Y2rXHJcbiAqXHJcbiAqIOeUqOS6juS/neaKpOi3r+eUse+8jOehruS/neeUqOaIt+WPquiDveiuv+mXruWFtuiiq+aOiOadg+eahOi3r+eUseOAglxyXG4gKiDmlK/mjIHmnYPpmZDnu6fmib/mnLrliLblkozoh6rlrprkuYnmnYPpmZDmo4Dmn6XpgLvovpHjgIJcclxuICovXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFJrQXV0aEd1YXJkIGltcGxlbWVudHMgQ2FuQWN0aXZhdGVDaGlsZCB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFJLX1JPVVRFUl9HVUFSRF9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBJUm91dGVyR3VhcmRDb25maWdbXSB8IG51bGwsXHJcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChSS19ST1VURVJfR1VBUkRfT1BUSU9OUykgcHJpdmF0ZSBvcHRpb25zOiBJQXV0aEd1YXJkT3B0aW9ucyB8IG51bGwsXHJcbiAgICAgICAgcHJpdmF0ZSBtZW51OiBSa01lbnVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICApIHt9XHJcblxyXG4gICAgY2FuQWN0aXZhdGVDaGlsZChcclxuICAgICAgICBjaGlsZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxyXG4gICAgICAgIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90LFxyXG4gICAgKTogT2JzZXJ2YWJsZTxib29sZWFuIHwgVXJsVHJlZT4gfCBQcm9taXNlPGJvb2xlYW4gfCBVcmxUcmVlPiB8IGJvb2xlYW4gfCBVcmxUcmVlIHtcclxuICAgICAgICAvLyDmo4Dmn6Xot6/nlLHmlbDmja7kuK3mmK/lkKbphY3nva7ot7Pov4fmnYPpmZDmo4Dmn6VcclxuICAgICAgICBpZiAoY2hpbGRSb3V0ZS5kYXRhWydza2lwQXV0aCddID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5omn6KGM5YmN572u6ZKp5a2QXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucz8uYmVmb3JlQ2hlY2sgJiYgIXRoaXMub3B0aW9ucy5iZWZvcmVDaGVjayhjaGlsZFJvdXRlLCBzdGF0ZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlTm9BY2Nlc3Moc3RhdGUudXJsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLm1lbnUucmVxdWVzdERhdGEoKS5waXBlKFxyXG4gICAgICAgICAgICBmaWx0ZXIoKGpzb24pID0+IGpzb24uY29kZSA9PT0gMCksXHJcbiAgICAgICAgICAgIG1hcCgoanNvbikgPT4ganNvbi5kYXRhIGFzIElNZW51RGF0YVtdKSxcclxuICAgICAgICAgICAgbWFwKChtZW51cykgPT4gdGhpcy5jaGVja0FjY2VzcyhtZW51cywgc3RhdGUudXJsKSksXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCfot6/nlLHmnYPpmZDmo4Dmn6XlpLHotKU6JywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKHRoaXMuaGFuZGxlTm9BY2Nlc3Moc3RhdGUudXJsKSk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmo4Dmn6XnlKjmiLfmmK/lkKbmnInmnYPpmZDorr/pl67mjIflrprot6/nlLFcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbWVudXMgLSDnlKjmiLfoj5zljZXmnYPpmZDmlbDmja5cclxuICAgICAqIEBwYXJhbSB1cmwgLSDnm67moIfot6/nlLHlnLDlnYBcclxuICAgICAqIEByZXR1cm5zIOi/lOWbniB0cnVlIOWFgeiuuOiuv+mXru+8jOi/lOWbniBmYWxzZSDmiJYgVXJsVHJlZSDmi5Lnu53orr/pl65cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjaGVja0FjY2VzcyhtZW51czogSU1lbnVEYXRhW10sIHVybDogc3RyaW5nKTogYm9vbGVhbiB8IFVybFRyZWUge1xyXG4gICAgICAgIGlmICghbWVudXMgfHwgbWVudXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ+atpOi0puWPt+aXoOS7u+S9leWKn+iDveadg+mZkCcpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVOb0FjY2Vzcyh1cmwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g56e76Zmk5p+l6K+i5Y+C5pWw77yM5Y+q5L+d55WZ6Lev5b6E6YOo5YiGXHJcbiAgICAgICAgY29uc3Qgcm91dGVyVXJsID0gdGhpcy5ub3JtYWxpemVVcmwodXJsKTtcclxuXHJcbiAgICAgICAgLy8g5p6E5bu655So5oi35p2D6ZmQ6Lev55Sx6ZuG5ZCIXHJcbiAgICAgICAgY29uc3QgYXV0aFJvdXRlcyA9IG5ldyBTZXQ8c3RyaW5nPihtZW51cy5tYXAoKG0pID0+IG0uU1lTVEVNX1JFU09VUkNFX1VSTCkpO1xyXG5cclxuICAgICAgICAvLyDnm7TmjqXmnYPpmZDmo4Dmn6VcclxuICAgICAgICBpZiAoYXV0aFJvdXRlcy5oYXMocm91dGVyVXJsKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOe7p+aJv+adg+mZkOajgOafpVxyXG4gICAgICAgIGlmICh0aGlzLmhhc0luaGVyaXRlZFBlcm1pc3Npb24ocm91dGVyVXJsLCBhdXRoUm91dGVzKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOaXoOadg+mZkOiuv+mXrlxyXG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZU5vQWNjZXNzKHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmo4Dmn6XmmK/lkKbmnInnu6fmib/nmoTmnYPpmZBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gcm91dGVyVXJsIC0g5qCH5YeG5YyW5ZCO55qE6Lev55Sx5Zyw5Z2AXHJcbiAgICAgKiBAcGFyYW0gYXV0aFJvdXRlcyAtIOeUqOaIt+adg+mZkOi3r+eUsembhuWQiFxyXG4gICAgICogQHJldHVybnMg6L+U5ZueIHRydWUg6KGo56S65pyJ57un5om/5p2D6ZmQXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaGFzSW5oZXJpdGVkUGVybWlzc2lvbihyb3V0ZXJVcmw6IHN0cmluZywgYXV0aFJvdXRlczogU2V0PHN0cmluZz4pOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXRoaXMuY29uZmlnIHx8IHRoaXMuY29uZmlnLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDmn6Xmib7ljLnphY3nmoTnu6fmib/phY3nva5cclxuICAgICAgICBjb25zdCBtYXRjaGVkQ29uZmlncyA9IHRoaXMuY29uZmlnLmZpbHRlcigoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbS5leHRlbmRzLnNvbWUoKHJvdXRlOiBzdHJpbmcpID0+IHRoaXMubWF0Y2hSb3V0ZShyb3V0ZSwgcm91dGVyVXJsKSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIOajgOafpeaYr+WQpuacieS7u+S4gOmFjee9rueahCB1cmwg5Zyo55So5oi35p2D6ZmQ5LitXHJcbiAgICAgICAgcmV0dXJuIG1hdGNoZWRDb25maWdzLnNvbWUoKGl0ZW0pID0+IGF1dGhSb3V0ZXMuaGFzKGl0ZW0udXJsKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDljLnphY3ot6/nlLHop4TliJlcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gcGF0dGVybiAtIOi3r+eUseaooeW8j++8iOaUr+aMgSAqKiDpgJrphY3nrKbvvIlcclxuICAgICAqIEBwYXJhbSBwYXRoIC0g5a6e6ZmF6Lev55Sx6Lev5b6EXHJcbiAgICAgKiBAcmV0dXJucyDov5Tlm54gdHJ1ZSDooajnpLrljLnphY3miJDlip9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBtYXRjaFJvdXRlKHBhdHRlcm46IHN0cmluZywgcGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHBhdHRlcm4uaW5jbHVkZXMoJyoqJykpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVnZXhQYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlKC9cXCpcXCovZywgJy4qJyk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBeJHtyZWdleFBhdHRlcm59JGApLnRlc3QocGF0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwYXR0ZXJuID09PSBwYXRoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5qCH5YeG5YyWVVJM77yM56e76Zmk5p+l6K+i5Y+C5pWw5ZKM54mH5q615qCH6K+G56ymXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHVybCAtIOWOn+Wni1VSTFxyXG4gICAgICogQHJldHVybnMg5qCH5YeG5YyW5ZCO55qEVVJMXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgbm9ybWFsaXplVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdXJsLnJlcGxhY2UoL1s/I10uKi8sICcnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWkhOeQhuaXoOadg+mZkOiuv+mXrlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB1cmwgLSDooqvmi5Lnu53orr/pl67nmoTot6/nlLHlnLDlnYBcclxuICAgICAqIEByZXR1cm5zIOi/lOWbniBmYWxzZSDmiJYgVXJsVHJlZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGhhbmRsZU5vQWNjZXNzKHVybDogc3RyaW5nKTogYm9vbGVhbiB8IFVybFRyZWUge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYOaXoOadg+mZkOiuv+mXrui3r+eUseWcsOWdgDogJHt1cmx9YCk7XHJcblxyXG4gICAgICAgIC8vIOS9v+eUqOiHquWumuS5ieWbnuiwg1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnM/Lm9uQWNjZXNzRGVuaWVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMub25BY2Nlc3NEZW5pZWQodXJsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOS9v+eUqOiHquWumuS5ieacquaOiOadg+i3r+W+hOaIlum7mOiupOi3r+W+hFxyXG4gICAgICAgIGNvbnN0IHVuYXV0aG9yaXplZFBhdGggPSB0aGlzLm9wdGlvbnM/LnVuYXV0aG9yaXplZFBhdGggfHwgJy9lcnJvcnMvNDAxJztcclxuICAgICAgICByZXR1cm4gdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbdW5hdXRob3JpemVkUGF0aF0pO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -1,54 +1,91 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
2
|
import { HttpEventType, HttpResponse, HTTP_INTERCEPTORS, } from '@angular/common/http';
|
|
3
3
|
import { Observable } from 'rxjs';
|
|
4
|
-
import {
|
|
4
|
+
import { switchMap, catchError } from 'rxjs/operators';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
|
+
/**
|
|
7
|
+
* Blob 响应拦截器
|
|
8
|
+
* 处理文件下载请求中的 JSON 错误响应
|
|
9
|
+
*/
|
|
6
10
|
export class BlobInterceptor {
|
|
11
|
+
/**
|
|
12
|
+
* 拦截 HTTP 请求,处理 Blob 类型响应
|
|
13
|
+
* @param request HTTP 请求对象
|
|
14
|
+
* @param next 下一个拦截器处理器
|
|
15
|
+
* @returns Observable<HttpEvent<T>>
|
|
16
|
+
*/
|
|
7
17
|
intercept(request, next) {
|
|
18
|
+
// 只处理 responseType 为 blob 的请求
|
|
8
19
|
if (request.responseType !== 'blob') {
|
|
9
20
|
return next.handle(request);
|
|
10
21
|
}
|
|
11
|
-
return next.handle(request).pipe(switchMap((
|
|
22
|
+
return next.handle(request).pipe(switchMap((event) => this.handleBlobResponse(event)), catchError((error) => this.handleBlobError(error)));
|
|
12
23
|
}
|
|
13
|
-
|
|
14
|
-
|
|
24
|
+
/**
|
|
25
|
+
* 处理 Blob 响应事件
|
|
26
|
+
* @param event HTTP 事件
|
|
27
|
+
* @returns Observable<HttpEvent<any>>
|
|
28
|
+
*/
|
|
29
|
+
handleBlobResponse(event) {
|
|
30
|
+
var _a;
|
|
31
|
+
// 只处理完整的响应事件
|
|
32
|
+
if (event.type !== HttpEventType.Response) {
|
|
15
33
|
return new Observable((subscriber) => {
|
|
16
|
-
subscriber.next(
|
|
34
|
+
subscriber.next(event);
|
|
17
35
|
subscriber.complete();
|
|
18
36
|
});
|
|
19
37
|
}
|
|
20
|
-
|
|
21
|
-
|
|
38
|
+
// 检查响应体是否为 JSON 类型(通常表示错误)
|
|
39
|
+
if (event instanceof HttpResponse && ((_a = event.body) === null || _a === void 0 ? void 0 : _a.type) === 'application/json') {
|
|
40
|
+
return this.convertBlobToJson(event.body);
|
|
22
41
|
}
|
|
23
42
|
return new Observable((subscriber) => {
|
|
24
|
-
subscriber.next(
|
|
43
|
+
subscriber.next(event);
|
|
25
44
|
subscriber.complete();
|
|
26
45
|
});
|
|
27
46
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
47
|
+
/**
|
|
48
|
+
* 处理 Blob 错误响应
|
|
49
|
+
* @param error HTTP 错误响应
|
|
50
|
+
* @returns Observable<HttpEvent<any>>
|
|
51
|
+
*/
|
|
52
|
+
handleBlobError(error) {
|
|
53
|
+
var _a;
|
|
54
|
+
// 如果错误响应体是 JSON 类型的 Blob,转换为 JSON 对象
|
|
55
|
+
if (((_a = error.error) === null || _a === void 0 ? void 0 : _a.type) === 'application/json') {
|
|
56
|
+
return this.convertBlobToJson(error.error);
|
|
31
57
|
}
|
|
32
58
|
return new Observable((subscriber) => {
|
|
33
|
-
subscriber.error(
|
|
59
|
+
subscriber.error(error);
|
|
34
60
|
subscriber.complete();
|
|
35
61
|
});
|
|
36
62
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
63
|
+
/**
|
|
64
|
+
* 将 Blob 转换为 JSON 对象并抛出错误
|
|
65
|
+
* @param blob Blob 对象
|
|
66
|
+
* @returns Observable<HttpEvent<T>>
|
|
67
|
+
*/
|
|
68
|
+
convertBlobToJson(blob) {
|
|
69
|
+
return new Observable((subscriber) => {
|
|
70
|
+
const reader = new FileReader();
|
|
71
|
+
reader.addEventListener('loadend', () => {
|
|
72
|
+
try {
|
|
73
|
+
const json = JSON.parse(reader.result);
|
|
74
|
+
subscriber.error(json);
|
|
75
|
+
}
|
|
76
|
+
catch (parseError) {
|
|
77
|
+
subscriber.error(parseError);
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
subscriber.complete();
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
reader.addEventListener('error', () => {
|
|
84
|
+
subscriber.error(new Error('读取 Blob 数据失败'));
|
|
48
85
|
subscriber.complete();
|
|
49
|
-
}
|
|
86
|
+
});
|
|
87
|
+
reader.readAsText(blob, 'utf-8');
|
|
50
88
|
});
|
|
51
|
-
reader.readAsText(blob, 'utf-8');
|
|
52
89
|
}
|
|
53
90
|
}
|
|
54
91
|
BlobInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BlobInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
@@ -57,10 +94,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
57
94
|
type: Injectable
|
|
58
95
|
}] });
|
|
59
96
|
/**
|
|
60
|
-
*
|
|
61
|
-
*
|
|
97
|
+
* 提供 Blob 响应拦截器
|
|
98
|
+
* @returns Provider 配置对象
|
|
99
|
+
* @example
|
|
100
|
+
* providers: [providerDownBlob()]
|
|
62
101
|
*/
|
|
63
102
|
export function providerDownBlob() {
|
|
64
103
|
return { provide: HTTP_INTERCEPTORS, useClass: BlobInterceptor, multi: true };
|
|
65
104
|
}
|
|
66
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYi5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnJhcnkvY29yZS9pbnRlcmNlcHRvcnMvYmxvYi5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFLSCxhQUFhLEVBQ2IsWUFBWSxFQUVaLGlCQUFpQixHQUNwQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFdkQ7OztHQUdHO0FBRUgsTUFBTSxPQUFPLGVBQWU7SUFDeEI7Ozs7O09BS0c7SUFDSCxTQUFTLENBQUksT0FBdUIsRUFBRSxJQUFpQjtRQUNuRCw4QkFBOEI7UUFDOUIsSUFBSSxPQUFPLENBQUMsWUFBWSxLQUFLLE1BQU0sRUFBRTtZQUNqQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDL0I7UUFFRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUM1QixTQUFTLENBQUMsQ0FBQyxLQUFxQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDcEUsVUFBVSxDQUFDLENBQUMsS0FBd0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUN4RSxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxrQkFBa0IsQ0FBQyxLQUFxQjs7UUFDNUMsYUFBYTtRQUNiLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsUUFBUSxFQUFFO1lBQ3ZDLE9BQU8sSUFBSSxVQUFVLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtnQkFDakMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkIsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzFCLENBQUMsQ0FBQyxDQUFDO1NBQ047UUFFRCwyQkFBMkI7UUFDM0IsSUFBSSxLQUFLLFlBQVksWUFBWSxJQUFJLENBQUEsTUFBQSxLQUFLLENBQUMsSUFBSSwwQ0FBRSxJQUFJLE1BQUssa0JBQWtCLEVBQUU7WUFDMUUsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzdDO1FBRUQsT0FBTyxJQUFJLFVBQVUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ2pDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkIsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxlQUFlLENBQUMsS0FBd0I7O1FBQzVDLHFDQUFxQztRQUNyQyxJQUFJLENBQUEsTUFBQSxLQUFLLENBQUMsS0FBSywwQ0FBRSxJQUFJLE1BQUssa0JBQWtCLEVBQUU7WUFDMUMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzlDO1FBRUQsT0FBTyxJQUFJLFVBQVUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ2pDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxpQkFBaUIsQ0FBSSxJQUFVO1FBQ25DLE9BQU8sSUFBSSxVQUFVLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUNqQyxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBRWhDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO2dCQUNwQyxJQUFJO29CQUNBLE1BQU0sSUFBSSxHQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQWdCLENBQUMsQ0FBQztvQkFDcEQsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDMUI7Z0JBQUMsT0FBTyxVQUFVLEVBQUU7b0JBQ2pCLFVBQVUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ2hDO3dCQUFTO29CQUNOLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztpQkFDekI7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO2dCQUNsQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMxQixDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7NkdBeEZRLGVBQWU7aUhBQWYsZUFBZTs0RkFBZixlQUFlO2tCQUQzQixVQUFVOztBQTRGWDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxnQkFBZ0I7SUFDNUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNsRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gICAgSHR0cFJlcXVlc3QsXHJcbiAgICBIdHRwSGFuZGxlcixcclxuICAgIEh0dHBFdmVudCxcclxuICAgIEh0dHBJbnRlcmNlcHRvcixcclxuICAgIEh0dHBFdmVudFR5cGUsXHJcbiAgICBIdHRwUmVzcG9uc2UsXHJcbiAgICBIdHRwRXJyb3JSZXNwb25zZSxcclxuICAgIEhUVFBfSU5URVJDRVBUT1JTLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBzd2l0Y2hNYXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG4vKipcclxuICogQmxvYiDlk43lupTmi6bmiKrlmahcclxuICog5aSE55CG5paH5Lu25LiL6L296K+35rGC5Lit55qEIEpTT04g6ZSZ6K+v5ZON5bqUXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBCbG9iSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xyXG4gICAgLyoqXHJcbiAgICAgKiDmi6bmiKogSFRUUCDor7fmsYLvvIzlpITnkIYgQmxvYiDnsbvlnovlk43lupRcclxuICAgICAqIEBwYXJhbSByZXF1ZXN0IEhUVFAg6K+35rGC5a+56LGhXHJcbiAgICAgKiBAcGFyYW0gbmV4dCDkuIvkuIDkuKrmi6bmiKrlmajlpITnkIblmahcclxuICAgICAqIEByZXR1cm5zIE9ic2VydmFibGU8SHR0cEV2ZW50PFQ+PlxyXG4gICAgICovXHJcbiAgICBpbnRlcmNlcHQ8VD4ocmVxdWVzdDogSHR0cFJlcXVlc3Q8VD4sIG5leHQ6IEh0dHBIYW5kbGVyKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VD4+IHtcclxuICAgICAgICAvLyDlj6rlpITnkIYgcmVzcG9uc2VUeXBlIOS4uiBibG9iIOeahOivt+axglxyXG4gICAgICAgIGlmIChyZXF1ZXN0LnJlc3BvbnNlVHlwZSAhPT0gJ2Jsb2InKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXF1ZXN0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXF1ZXN0KS5waXBlKFxyXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKGV2ZW50OiBIdHRwRXZlbnQ8YW55PikgPT4gdGhpcy5oYW5kbGVCbG9iUmVzcG9uc2UoZXZlbnQpKSxcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUJsb2JFcnJvcihlcnJvcikpLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlpITnkIYgQmxvYiDlk43lupTkuovku7ZcclxuICAgICAqIEBwYXJhbSBldmVudCBIVFRQIOS6i+S7tlxyXG4gICAgICogQHJldHVybnMgT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVCbG9iUmVzcG9uc2UoZXZlbnQ6IEh0dHBFdmVudDxhbnk+KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4ge1xyXG4gICAgICAgIC8vIOWPquWkhOeQhuWujOaVtOeahOWTjeW6lOS6i+S7tlxyXG4gICAgICAgIGlmIChldmVudC50eXBlICE9PSBIdHRwRXZlbnRUeXBlLlJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoc3Vic2NyaWJlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDmo4Dmn6Xlk43lupTkvZPmmK/lkKbkuLogSlNPTiDnsbvlnovvvIjpgJrluLjooajnpLrplJnor6/vvIlcclxuICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgJiYgZXZlbnQuYm9keT8udHlwZSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRCbG9iVG9Kc29uKGV2ZW50LmJvZHkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChzdWJzY3JpYmVyKSA9PiB7XHJcbiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChldmVudCk7XHJcbiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWkhOeQhiBCbG9iIOmUmeivr+WTjeW6lFxyXG4gICAgICogQHBhcmFtIGVycm9yIEhUVFAg6ZSZ6K+v5ZON5bqUXHJcbiAgICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUJsb2JFcnJvcihlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XHJcbiAgICAgICAgLy8g5aaC5p6c6ZSZ6K+v5ZON5bqU5L2T5pivIEpTT04g57G75Z6L55qEIEJsb2LvvIzovazmjaLkuLogSlNPTiDlr7nosaFcclxuICAgICAgICBpZiAoZXJyb3IuZXJyb3I/LnR5cGUgPT09ICdhcHBsaWNhdGlvbi9qc29uJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0QmxvYlRvSnNvbihlcnJvci5lcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKHN1YnNjcmliZXIpID0+IHtcclxuICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWwhiBCbG9iIOi9rOaNouS4uiBKU09OIOWvueixoeW5tuaKm+WHuumUmeivr1xyXG4gICAgICogQHBhcmFtIGJsb2IgQmxvYiDlr7nosaFcclxuICAgICAqIEByZXR1cm5zIE9ic2VydmFibGU8SHR0cEV2ZW50PFQ+PlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvbnZlcnRCbG9iVG9Kc29uPFQ+KGJsb2I6IEJsb2IpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxUPj4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoc3Vic2NyaWJlcikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlbmQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb246IFQgPSBKU09OLnBhcnNlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcclxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGpzb24pO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAocGFyc2VFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IocGFyc2VFcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZWFkZXIuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKG5ldyBFcnJvcign6K+75Y+WIEJsb2Ig5pWw5o2u5aSx6LSlJykpO1xyXG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNUZXh0KGJsb2IsICd1dGYtOCcpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICog5o+Q5L6bIEJsb2Ig5ZON5bqU5oum5oiq5ZmoXHJcbiAqIEByZXR1cm5zIFByb3ZpZGVyIOmFjee9ruWvueixoVxyXG4gKiBAZXhhbXBsZVxyXG4gKiBwcm92aWRlcnM6IFtwcm92aWRlckRvd25CbG9iKCldXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZXJEb3duQmxvYigpIHtcclxuICAgIHJldHVybiB7IHByb3ZpZGU6IEhUVFBfSU5URVJDRVBUT1JTLCB1c2VDbGFzczogQmxvYkludGVyY2VwdG9yLCBtdWx0aTogdHJ1ZSB9O1xyXG59XHJcbiJdfQ==
|
|
@@ -1,24 +1,41 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
|
-
import { HTTP_INTERCEPTORS } from '@angular/common/http';
|
|
2
|
+
import { HTTP_INTERCEPTORS, HttpHeaders } from '@angular/common/http';
|
|
3
3
|
import { shareReplay } from 'rxjs/operators';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
import * as i1 from "@reskin/core/services";
|
|
6
|
+
/**
|
|
7
|
+
* 缓存策略标识
|
|
8
|
+
*/
|
|
9
|
+
const CACHE_HEADER = 'Cache-Map';
|
|
10
|
+
const CACHE_STRATEGY = 'Storage';
|
|
11
|
+
/**
|
|
12
|
+
* HTTP 缓存拦截器
|
|
13
|
+
* 为 GET 请求提供缓存功能,减少重复请求
|
|
14
|
+
*/
|
|
6
15
|
export class CacheInterceptor {
|
|
7
|
-
constructor(
|
|
8
|
-
this.
|
|
16
|
+
constructor(cacheHttpService) {
|
|
17
|
+
this.cacheHttpService = cacheHttpService;
|
|
9
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* 拦截 HTTP 请求,实现缓存逻辑
|
|
21
|
+
* @param request HTTP 请求对象
|
|
22
|
+
* @param next 下一个拦截器处理器
|
|
23
|
+
* @returns Observable<HttpEvent<unknown>>
|
|
24
|
+
*/
|
|
10
25
|
intercept(request, next) {
|
|
11
|
-
//
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
let
|
|
16
|
-
if (!
|
|
17
|
-
|
|
18
|
-
|
|
26
|
+
// 只缓存 GET 请求且明确标记了缓存策略的请求
|
|
27
|
+
const cacheStrategy = request.headers.get(CACHE_HEADER);
|
|
28
|
+
if (request.method === 'GET' && cacheStrategy === CACHE_STRATEGY) {
|
|
29
|
+
// 尝试从缓存中获取响应
|
|
30
|
+
let cachedResponse = this.cacheHttpService.get(request.url);
|
|
31
|
+
if (!cachedResponse) {
|
|
32
|
+
// 缓存未命中,发起请求并缓存结果
|
|
33
|
+
cachedResponse = next.handle(request).pipe(shareReplay(1));
|
|
34
|
+
this.cacheHttpService.set(request.url, cachedResponse);
|
|
19
35
|
}
|
|
20
|
-
return
|
|
36
|
+
return cachedResponse;
|
|
21
37
|
}
|
|
38
|
+
// 非缓存请求,直接放行
|
|
22
39
|
return next.handle(request);
|
|
23
40
|
}
|
|
24
41
|
}
|
|
@@ -28,9 +45,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
28
45
|
type: Injectable
|
|
29
46
|
}], ctorParameters: function () { return [{ type: i1.RkCacheHttpService }]; } });
|
|
30
47
|
/**
|
|
31
|
-
*
|
|
48
|
+
* 提供 HTTP 缓存拦截器
|
|
49
|
+
* @returns Provider 配置对象
|
|
50
|
+
* @example
|
|
51
|
+
* providers: [providerHttpCache()]
|
|
32
52
|
*/
|
|
33
53
|
export function providerHttpCache() {
|
|
34
54
|
return { provide: HTTP_INTERCEPTORS, useClass: CacheInterceptor, multi: true };
|
|
35
55
|
}
|
|
36
|
-
|
|
56
|
+
/**
|
|
57
|
+
* 创建带缓存标记的 GET 请求配置
|
|
58
|
+
* @param urls 模板字符串数组
|
|
59
|
+
* @param params 模板参数
|
|
60
|
+
* @returns [url, options] 元组
|
|
61
|
+
* @example
|
|
62
|
+
* this.http.get(...CacheHttpTemplate`/api/data`).subscribe();
|
|
63
|
+
*/
|
|
64
|
+
export function CacheHttpTemplate(urls, ...params) {
|
|
65
|
+
const url = params.length > 0 ? String.raw(urls, ...params) : urls[0];
|
|
66
|
+
return [url, { headers: new HttpHeaders({ [CACHE_HEADER]: CACHE_STRATEGY }) }];
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUuaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJyYXJ5L2NvcmUvaW50ZXJjZXB0b3JzL2NhY2hlLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUF3RCxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU1SCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQUc3Qzs7R0FFRztBQUNILE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQztBQUNqQyxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUM7QUFFakM7OztHQUdHO0FBRUgsTUFBTSxPQUFPLGdCQUFnQjtJQUN6QixZQUFvQixnQkFBb0M7UUFBcEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFvQjtJQUFHLENBQUM7SUFFNUQ7Ozs7O09BS0c7SUFDSCxTQUFTLENBQUMsT0FBNkIsRUFBRSxJQUFpQjtRQUN0RCwwQkFBMEI7UUFDMUIsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFeEQsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxhQUFhLEtBQUssY0FBYyxFQUFFO1lBQzlELGFBQWE7WUFDYixJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUU1RCxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUNqQixrQkFBa0I7Z0JBQ2xCLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2FBQzFEO1lBRUQsT0FBTyxjQUFjLENBQUM7U0FDekI7UUFFRCxhQUFhO1FBQ2IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7OzhHQTVCUSxnQkFBZ0I7a0hBQWhCLGdCQUFnQjs0RkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVOztBQWdDWDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxpQkFBaUI7SUFDN0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ25GLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLElBQTBCLEVBQUUsR0FBRyxNQUFhO0lBQzFFLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbkYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cFJlcXVlc3QsIEh0dHBIYW5kbGVyLCBIdHRwRXZlbnQsIEh0dHBJbnRlcmNlcHRvciwgSFRUUF9JTlRFUkNFUFRPUlMsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHNoYXJlUmVwbGF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBSa0NhY2hlSHR0cFNlcnZpY2UgfSBmcm9tICdAcmVza2luL2NvcmUvc2VydmljZXMnO1xyXG5cclxuLyoqXHJcbiAqIOe8k+WtmOetlueVpeagh+ivhlxyXG4gKi9cclxuY29uc3QgQ0FDSEVfSEVBREVSID0gJ0NhY2hlLU1hcCc7XHJcbmNvbnN0IENBQ0hFX1NUUkFURUdZID0gJ1N0b3JhZ2UnO1xyXG5cclxuLyoqXHJcbiAqIEhUVFAg57yT5a2Y5oum5oiq5ZmoXHJcbiAqIOS4uiBHRVQg6K+35rGC5o+Q5L6b57yT5a2Y5Yqf6IO977yM5YeP5bCR6YeN5aSN6K+35rGCXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDYWNoZUludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY2FjaGVIdHRwU2VydmljZTogUmtDYWNoZUh0dHBTZXJ2aWNlKSB7fVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5oum5oiqIEhUVFAg6K+35rGC77yM5a6e546w57yT5a2Y6YC76L6RXHJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBIVFRQIOivt+axguWvueixoVxyXG4gICAgICogQHBhcmFtIG5leHQg5LiL5LiA5Liq5oum5oiq5Zmo5aSE55CG5ZmoXHJcbiAgICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlPEh0dHBFdmVudDx1bmtub3duPj5cclxuICAgICAqL1xyXG4gICAgaW50ZXJjZXB0KHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PHVua25vd24+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PHVua25vd24+PiB7XHJcbiAgICAgICAgLy8g5Y+q57yT5a2YIEdFVCDor7fmsYLkuJTmmI7noa7moIforrDkuobnvJPlrZjnrZbnlaXnmoTor7fmsYJcclxuICAgICAgICBjb25zdCBjYWNoZVN0cmF0ZWd5ID0gcmVxdWVzdC5oZWFkZXJzLmdldChDQUNIRV9IRUFERVIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCA9PT0gJ0dFVCcgJiYgY2FjaGVTdHJhdGVneSA9PT0gQ0FDSEVfU1RSQVRFR1kpIHtcclxuICAgICAgICAgICAgLy8g5bCd6K+V5LuO57yT5a2Y5Lit6I635Y+W5ZON5bqUXHJcbiAgICAgICAgICAgIGxldCBjYWNoZWRSZXNwb25zZSA9IHRoaXMuY2FjaGVIdHRwU2VydmljZS5nZXQocmVxdWVzdC51cmwpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKCFjYWNoZWRSZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgLy8g57yT5a2Y5pyq5ZG95Lit77yM5Y+R6LW36K+35rGC5bm257yT5a2Y57uT5p6cXHJcbiAgICAgICAgICAgICAgICBjYWNoZWRSZXNwb25zZSA9IG5leHQuaGFuZGxlKHJlcXVlc3QpLnBpcGUoc2hhcmVSZXBsYXkoMSkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZUh0dHBTZXJ2aWNlLnNldChyZXF1ZXN0LnVybCwgY2FjaGVkUmVzcG9uc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkUmVzcG9uc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDpnZ7nvJPlrZjor7fmsYLvvIznm7TmjqXmlL7ooYxcclxuICAgICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxdWVzdCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDmj5DkvpsgSFRUUCDnvJPlrZjmi6bmiKrlmahcclxuICogQHJldHVybnMgUHJvdmlkZXIg6YWN572u5a+56LGhXHJcbiAqIEBleGFtcGxlXHJcbiAqIHByb3ZpZGVyczogW3Byb3ZpZGVySHR0cENhY2hlKCldXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZXJIdHRwQ2FjaGUoKSB7XHJcbiAgICByZXR1cm4geyBwcm92aWRlOiBIVFRQX0lOVEVSQ0VQVE9SUywgdXNlQ2xhc3M6IENhY2hlSW50ZXJjZXB0b3IsIG11bHRpOiB0cnVlIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDliJvlu7rluKbnvJPlrZjmoIforrDnmoQgR0VUIOivt+axgumFjee9rlxyXG4gKiBAcGFyYW0gdXJscyDmqKHmnb/lrZfnrKbkuLLmlbDnu4RcclxuICogQHBhcmFtIHBhcmFtcyDmqKHmnb/lj4LmlbBcclxuICogQHJldHVybnMgW3VybCwgb3B0aW9uc10g5YWD57uEXHJcbiAqIEBleGFtcGxlXHJcbiAqIHRoaXMuaHR0cC5nZXQoLi4uQ2FjaGVIdHRwVGVtcGxhdGVgL2FwaS9kYXRhYCkuc3Vic2NyaWJlKCk7XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gQ2FjaGVIdHRwVGVtcGxhdGUodXJsczogVGVtcGxhdGVTdHJpbmdzQXJyYXksIC4uLnBhcmFtczogYW55W10pOiBbc3RyaW5nLCB7IGhlYWRlcnM6IEh0dHBIZWFkZXJzIH1dIHtcclxuICAgIGNvbnN0IHVybCA9IHBhcmFtcy5sZW5ndGggPiAwID8gU3RyaW5nLnJhdyh1cmxzLCAuLi5wYXJhbXMpIDogdXJsc1swXTtcclxuICAgIHJldHVybiBbdXJsLCB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7IFtDQUNIRV9IRUFERVJdOiBDQUNIRV9TVFJBVEVHWSB9KSB9XTtcclxufVxyXG4iXX0=
|