ng-ipa-library 2.0.2 → 3.0.1
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/{esm2020 → esm2022}/lib/core/components/loading/loading.component.mjs +37 -37
- package/{esm2020 → esm2022}/lib/core/interceptors/error.interceptor.mjs +46 -46
- package/{esm2020 → esm2022}/lib/core/interceptors/loading.interceptor.mjs +58 -58
- package/{esm2020 → esm2022}/lib/core/interceptors/myIPAToken.interceptor.mjs +25 -25
- package/{esm2020 → esm2022}/lib/core/interceptors/token.interceptor.mjs +81 -81
- package/{esm2020 → esm2022}/lib/core/services/auth.service.mjs +62 -62
- package/{esm2020 → esm2022}/lib/core/services/error.service.mjs +55 -55
- package/{esm2020 → esm2022}/lib/core/services/loader.service.mjs +24 -24
- package/{esm2020 → esm2022}/lib/core/services/token.service.mjs +22 -22
- package/{esm2020 → esm2022}/lib/generate-form/generate-form.component.mjs +153 -153
- package/esm2022/lib/ipa-form/datepicker/datepicker.component.mjs +133 -0
- package/esm2022/lib/ipa-form/datepicker/gregorian-datepicker/gregorian-datepicker.component.mjs +27 -0
- package/{esm2020 → esm2022}/lib/ipa-form/datepicker/gregorian-datepicker/gregorian18n.mjs +38 -38
- package/{esm2020 → esm2022}/lib/ipa-form/datepicker/hijri-datepicker/IslamicI18n.mjs +38 -38
- package/esm2022/lib/ipa-form/datepicker/hijri-datepicker/hijri-datepicker.component.mjs +27 -0
- package/{esm2020 → esm2022}/lib/ipa-form/dropdown-input/dropdown-input.component.mjs +84 -84
- package/{esm2020 → esm2022}/lib/ipa-form/file-upload/file-upload.component.mjs +142 -142
- package/{esm2020 → esm2022}/lib/ipa-form/ipa-form.service.mjs +290 -290
- package/{esm2020 → esm2022}/lib/ipa-form/recaptcha/recaptcha.component.mjs +55 -55
- package/{esm2020 → esm2022}/lib/ipa-form/text-input/text-input.component.mjs +93 -93
- package/{esm2020 → esm2022}/lib/ipa-form/textarea-input/textarea-input.component.mjs +76 -76
- package/{esm2020 → esm2022}/lib/models/apiException.mjs +1 -1
- package/{esm2020 → esm2022}/lib/models/apiResponse.mjs +1 -1
- package/{esm2020 → esm2022}/lib/models/breadcrumbs.model.mjs +1 -1
- package/{esm2020 → esm2022}/lib/models/decodedToken.model.mjs +1 -1
- package/{esm2020 → esm2022}/lib/models/exceptionUrl.model.mjs +1 -1
- package/{esm2020 → esm2022}/lib/models/generateForm.model.mjs +1 -1
- package/{esm2020 → esm2022}/lib/models/pagedResult.mjs +1 -1
- package/{esm2020 → esm2022}/lib/models/user.model.mjs +1 -1
- package/{esm2020 → esm2022}/lib/ng-ipa-library.module.mjs +107 -107
- package/{esm2020 → esm2022}/lib/pipes/hijri-date.pipe.mjs +18 -18
- package/{esm2020 → esm2022}/lib/pipes/pipes.module.mjs +16 -16
- package/{esm2020 → esm2022}/lib/services/breadcrumbs.service.mjs +149 -149
- package/{esm2020 → esm2022}/lib/services/common.service.mjs +51 -51
- package/{esm2020 → esm2022}/lib/share-button/share-button.component.mjs +35 -35
- package/{esm2020 → esm2022}/lib/share-button/share-button.module.mjs +50 -50
- package/{esm2020 → esm2022}/ng-ipa-library.mjs +4 -4
- package/{esm2020 → esm2022}/public-api.mjs +41 -41
- package/{fesm2020 → fesm2022}/ng-ipa-library.mjs +1784 -1739
- package/fesm2022/ng-ipa-library.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/core/components/loading/loading.component.d.ts +13 -13
- package/lib/core/interceptors/error.interceptor.d.ts +12 -12
- package/lib/core/interceptors/loading.interceptor.d.ts +14 -14
- package/lib/core/interceptors/myIPAToken.interceptor.d.ts +11 -11
- package/lib/core/interceptors/token.interceptor.d.ts +19 -19
- package/lib/core/services/auth.service.d.ts +18 -18
- package/lib/core/services/error.service.d.ts +19 -19
- package/lib/core/services/loader.service.d.ts +12 -12
- package/lib/core/services/token.service.d.ts +10 -10
- package/lib/generate-form/generate-form.component.d.ts +34 -34
- package/lib/ipa-form/datepicker/datepicker.component.d.ts +38 -37
- package/lib/ipa-form/datepicker/gregorian-datepicker/gregorian-datepicker.component.d.ts +7 -7
- package/lib/ipa-form/datepicker/gregorian-datepicker/gregorian18n.d.ts +11 -11
- package/lib/ipa-form/datepicker/hijri-datepicker/IslamicI18n.d.ts +11 -11
- package/lib/ipa-form/datepicker/hijri-datepicker/hijri-datepicker.component.d.ts +7 -7
- package/lib/ipa-form/dropdown-input/dropdown-input.component.d.ts +34 -34
- package/lib/ipa-form/file-upload/file-upload.component.d.ts +40 -40
- package/lib/ipa-form/ipa-form.service.d.ts +51 -51
- package/lib/ipa-form/recaptcha/recaptcha.component.d.ts +22 -22
- package/lib/ipa-form/text-input/text-input.component.d.ts +35 -35
- package/lib/ipa-form/textarea-input/textarea-input.component.d.ts +32 -32
- package/lib/models/apiException.d.ts +5 -5
- package/lib/models/apiResponse.d.ts +5 -5
- package/lib/models/breadcrumbs.model.d.ts +4 -4
- package/lib/models/decodedToken.model.d.ts +6 -6
- package/lib/models/exceptionUrl.model.d.ts +4 -4
- package/lib/models/generateForm.model.d.ts +31 -31
- package/lib/models/pagedResult.d.ts +4 -4
- package/lib/models/user.model.d.ts +7 -7
- package/lib/ng-ipa-library.module.d.ts +25 -25
- package/lib/pipes/hijri-date.pipe.d.ts +7 -7
- package/lib/pipes/pipes.module.d.ts +7 -7
- package/lib/services/breadcrumbs.service.d.ts +18 -18
- package/lib/services/common.service.d.ts +11 -11
- package/lib/share-button/share-button.component.d.ts +11 -11
- package/lib/share-button/share-button.module.d.ts +13 -13
- package/package.json +12 -18
- package/public-api.d.ts +31 -31
- package/src/lib/assets/ngIPAStyle.scss +4 -1
- package/esm2020/lib/ipa-form/datepicker/datepicker.component.mjs +0 -88
- package/esm2020/lib/ipa-form/datepicker/gregorian-datepicker/gregorian-datepicker.component.mjs +0 -27
- package/esm2020/lib/ipa-form/datepicker/hijri-datepicker/hijri-datepicker.component.mjs +0 -27
- package/fesm2015/ng-ipa-library.mjs +0 -1867
- package/fesm2015/ng-ipa-library.mjs.map +0 -1
- package/fesm2020/ng-ipa-library.mjs.map +0 -1
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
import { Component, Input, } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "../../services/loader.service";
|
|
4
|
-
import * as i2 from "@angular/common";
|
|
5
|
-
export class LoaderComponent {
|
|
6
|
-
constructor(loaderService, cdr) {
|
|
7
|
-
this.loaderService = loaderService;
|
|
8
|
-
this.cdr = cdr;
|
|
9
|
-
this.loading = true;
|
|
10
|
-
this.isLocal = false;
|
|
11
|
-
}
|
|
12
|
-
ngAfterViewInit() {
|
|
13
|
-
this.loaderService.isLoading.subscribe((v) => {
|
|
14
|
-
this.loading = v;
|
|
15
|
-
const loader = document.getElementById('cover-spin');
|
|
16
|
-
if (loader) {
|
|
17
|
-
if (this.loading) {
|
|
18
|
-
loader.style.display = 'flex';
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
if (loader.style.display !== 'none')
|
|
22
|
-
loader.style.display = 'none';
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
this.cdr.detectChanges();
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
32
|
-
type: Component,
|
|
33
|
-
args: [{ selector: 'ipa-loader', template: "<div id=\"cover-spin\" *ngIf=\"loading && isLocal\">\r\n <div class=\"spinner\"></div>\r\n</div>\r\n", styles: ["#cover-spin{display:flex}\n"] }]
|
|
34
|
-
}], ctorParameters: function () { return [{ type: i1.LoaderService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { isLocal: [{
|
|
35
|
-
type: Input
|
|
36
|
-
}] } });
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import { Component, Input, } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../../services/loader.service";
|
|
4
|
+
import * as i2 from "@angular/common";
|
|
5
|
+
export class LoaderComponent {
|
|
6
|
+
constructor(loaderService, cdr) {
|
|
7
|
+
this.loaderService = loaderService;
|
|
8
|
+
this.cdr = cdr;
|
|
9
|
+
this.loading = true;
|
|
10
|
+
this.isLocal = false;
|
|
11
|
+
}
|
|
12
|
+
ngAfterViewInit() {
|
|
13
|
+
this.loaderService.isLoading.subscribe((v) => {
|
|
14
|
+
this.loading = v;
|
|
15
|
+
const loader = document.getElementById('cover-spin');
|
|
16
|
+
if (loader) {
|
|
17
|
+
if (this.loading) {
|
|
18
|
+
loader.style.display = 'flex';
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
if (loader.style.display !== 'none')
|
|
22
|
+
loader.style.display = 'none';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
this.cdr.detectChanges();
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: LoaderComponent, deps: [{ token: i1.LoaderService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
29
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.6", type: LoaderComponent, selector: "ipa-loader", inputs: { isLocal: "isLocal" }, ngImport: i0, template: "<div id=\"cover-spin\" *ngIf=\"loading && isLocal\">\r\n <div class=\"spinner\"></div>\r\n</div>\r\n", styles: ["#cover-spin{display:flex}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
|
|
30
|
+
}
|
|
31
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: LoaderComponent, decorators: [{
|
|
32
|
+
type: Component,
|
|
33
|
+
args: [{ selector: 'ipa-loader', template: "<div id=\"cover-spin\" *ngIf=\"loading && isLocal\">\r\n <div class=\"spinner\"></div>\r\n</div>\r\n", styles: ["#cover-spin{display:flex}\n"] }]
|
|
34
|
+
}], ctorParameters: function () { return [{ type: i1.LoaderService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { isLocal: [{
|
|
35
|
+
type: Input
|
|
36
|
+
}] } });
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGluZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1pcGEtbGlicmFyeS9zcmMvbGliL2NvcmUvY29tcG9uZW50cy9sb2FkaW5nL2xvYWRpbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctaXBhLWxpYnJhcnkvc3JjL2xpYi9jb3JlL2NvbXBvbmVudHMvbG9hZGluZy9sb2FkaW5nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBQ1QsS0FBSyxHQUNOLE1BQU0sZUFBZSxDQUFDOzs7O0FBUXZCLE1BQU0sT0FBTyxlQUFlO0lBSTFCLFlBQ1UsYUFBNEIsRUFDNUIsR0FBc0I7UUFEdEIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFMaEMsWUFBTyxHQUFHLElBQUksQ0FBQztRQUNOLFlBQU8sR0FBRyxLQUFLLENBQUM7SUFLdEIsQ0FBQztJQUVKLGVBQWU7UUFDYixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUMzQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNqQixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3JELElBQUksTUFBTSxFQUFFO2dCQUNWLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDaEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO2lCQUMvQjtxQkFBTTtvQkFDTCxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxLQUFLLE1BQU07d0JBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO2lCQUNwRTthQUNGO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBdEJVLGVBQWU7a0dBQWYsZUFBZSxrRkNiNUIsdUdBR0E7OzJGRFVhLGVBQWU7a0JBTDNCLFNBQVM7K0JBQ0UsWUFBWTtvSUFNYixPQUFPO3NCQUFmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbG9hZGVyLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdpcGEtbG9hZGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbG9hZGluZy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbG9hZGluZy5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTG9hZGVyQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgbG9hZGluZyA9IHRydWU7XHJcbiAgQElucHV0KCkgaXNMb2NhbCA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgbG9hZGVyU2VydmljZTogTG9hZGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkge31cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkZXJTZXJ2aWNlLmlzTG9hZGluZy5zdWJzY3JpYmUoKHYpID0+IHtcclxuICAgICAgdGhpcy5sb2FkaW5nID0gdjtcclxuICAgICAgY29uc3QgbG9hZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvdmVyLXNwaW4nKTtcclxuICAgICAgaWYgKGxvYWRlcikge1xyXG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmcpIHtcclxuICAgICAgICAgIGxvYWRlci5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAobG9hZGVyLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJykgbG9hZGVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGlkPVwiY292ZXItc3BpblwiICpuZ0lmPVwibG9hZGluZyAmJiBpc0xvY2FsXCI+XHJcbiAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { throwError } from 'rxjs';
|
|
3
|
-
import { catchError } from 'rxjs/operators';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "../services/error.service";
|
|
6
|
-
export class ErrorInterceptor {
|
|
7
|
-
constructor(errorService) {
|
|
8
|
-
this.errorService = errorService;
|
|
9
|
-
}
|
|
10
|
-
intercept(req, next) {
|
|
11
|
-
if (this.isException(req)) {
|
|
12
|
-
return next.handle(req);
|
|
13
|
-
}
|
|
14
|
-
return next.handle(req).pipe(catchError((error) => {
|
|
15
|
-
const response = error.error;
|
|
16
|
-
const toastrConfig = {
|
|
17
|
-
disableTimeOut: true,
|
|
18
|
-
closeButton: true,
|
|
19
|
-
tapToDismiss: false,
|
|
20
|
-
};
|
|
21
|
-
switch (response.statusCode) {
|
|
22
|
-
case 500:
|
|
23
|
-
this.errorService.show500ErrorMsg(response, toastrConfig);
|
|
24
|
-
break;
|
|
25
|
-
default:
|
|
26
|
-
this.errorService.showErrorMsg(response, toastrConfig);
|
|
27
|
-
break;
|
|
28
|
-
}
|
|
29
|
-
return throwError(() => error);
|
|
30
|
-
}));
|
|
31
|
-
}
|
|
32
|
-
isException(req) {
|
|
33
|
-
for (const url of this.errorService.urls) {
|
|
34
|
-
if (req.url.includes(url.path) && req.method === url.method) {
|
|
35
|
-
return true;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return false;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
44
|
-
type: Injectable
|
|
45
|
-
}], ctorParameters: function () { return [{ type: i1.ErrorService }]; } });
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { throwError } from 'rxjs';
|
|
3
|
+
import { catchError } from 'rxjs/operators';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "../services/error.service";
|
|
6
|
+
export class ErrorInterceptor {
|
|
7
|
+
constructor(errorService) {
|
|
8
|
+
this.errorService = errorService;
|
|
9
|
+
}
|
|
10
|
+
intercept(req, next) {
|
|
11
|
+
if (this.isException(req)) {
|
|
12
|
+
return next.handle(req);
|
|
13
|
+
}
|
|
14
|
+
return next.handle(req).pipe(catchError((error) => {
|
|
15
|
+
const response = error.error;
|
|
16
|
+
const toastrConfig = {
|
|
17
|
+
disableTimeOut: true,
|
|
18
|
+
closeButton: true,
|
|
19
|
+
tapToDismiss: false,
|
|
20
|
+
};
|
|
21
|
+
switch (response.statusCode) {
|
|
22
|
+
case 500:
|
|
23
|
+
this.errorService.show500ErrorMsg(response, toastrConfig);
|
|
24
|
+
break;
|
|
25
|
+
default:
|
|
26
|
+
this.errorService.showErrorMsg(response, toastrConfig);
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
return throwError(() => error);
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
isException(req) {
|
|
33
|
+
for (const url of this.errorService.urls) {
|
|
34
|
+
if (req.url.includes(url.path) && req.method === url.method) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: ErrorInterceptor, deps: [{ token: i1.ErrorService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
41
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: ErrorInterceptor }); }
|
|
42
|
+
}
|
|
43
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: ErrorInterceptor, decorators: [{
|
|
44
|
+
type: Injectable
|
|
45
|
+
}], ctorParameters: function () { return [{ type: i1.ErrorService }]; } });
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1pcGEtbGlicmFyeS9zcmMvbGliL2NvcmUvaW50ZXJjZXB0b3JzL2Vycm9yLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFPM0MsT0FBTyxFQUFjLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQU01QyxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLFlBQW9CLFlBQTBCO1FBQTFCLGlCQUFZLEdBQVosWUFBWSxDQUFjO0lBQUcsQ0FBQztJQUVsRCxTQUFTLENBQ1AsR0FBeUIsRUFDekIsSUFBaUI7UUFFakIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN6QjtRQUVELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQzFCLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFxQixDQUFDO1lBQzdDLE1BQU0sWUFBWSxHQUE4QjtnQkFDOUMsY0FBYyxFQUFFLElBQUk7Z0JBQ3BCLFdBQVcsRUFBRSxJQUFJO2dCQUNqQixZQUFZLEVBQUUsS0FBSzthQUNwQixDQUFDO1lBQ0YsUUFBUSxRQUFRLENBQUMsVUFBVSxFQUFFO2dCQUMzQixLQUFLLEdBQUc7b0JBQ04sSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUMxRCxNQUFNO2dCQUVSO29CQUNFLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFDdkQsTUFBTTthQUNUO1lBQ0QsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFTyxXQUFXLENBQUMsR0FBcUI7UUFDdkMsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRTtZQUN4QyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLEVBQUU7Z0JBQzNELE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs4R0F4Q1UsZ0JBQWdCO2tIQUFoQixnQkFBZ0I7OzJGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgSHR0cFJlcXVlc3QsXHJcbiAgSHR0cEhhbmRsZXIsXHJcbiAgSHR0cEV2ZW50LFxyXG4gIEh0dHBJbnRlcmNlcHRvcixcclxufSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRXJyb3JTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZXJyb3Iuc2VydmljZSc7XHJcbmltcG9ydCB7IEFwaUV4Y2VwdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9hcGlFeGNlcHRpb24nO1xyXG5pbXBvcnQgeyBJbmRpdmlkdWFsQ29uZmlnIH0gZnJvbSAnbmd4LXRvYXN0cic7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBFcnJvckludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVycm9yU2VydmljZTogRXJyb3JTZXJ2aWNlKSB7fVxyXG5cclxuICBpbnRlcmNlcHQoXHJcbiAgICByZXE6IEh0dHBSZXF1ZXN0PHVua25vd24+LFxyXG4gICAgbmV4dDogSHR0cEhhbmRsZXJcclxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDx1bmtub3duPj4ge1xyXG4gICAgaWYgKHRoaXMuaXNFeGNlcHRpb24ocmVxKSkge1xyXG4gICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXJyb3IuZXJyb3IgYXMgQXBpRXhjZXB0aW9uO1xyXG4gICAgICAgIGNvbnN0IHRvYXN0ckNvbmZpZzogUGFydGlhbDxJbmRpdmlkdWFsQ29uZmlnPiA9IHtcclxuICAgICAgICAgIGRpc2FibGVUaW1lT3V0OiB0cnVlLFxyXG4gICAgICAgICAgY2xvc2VCdXR0b246IHRydWUsXHJcbiAgICAgICAgICB0YXBUb0Rpc21pc3M6IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgc3dpdGNoIChyZXNwb25zZS5zdGF0dXNDb2RlKSB7XHJcbiAgICAgICAgICBjYXNlIDUwMDpcclxuICAgICAgICAgICAgdGhpcy5lcnJvclNlcnZpY2Uuc2hvdzUwMEVycm9yTXNnKHJlc3BvbnNlLCB0b2FzdHJDb25maWcpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICB0aGlzLmVycm9yU2VydmljZS5zaG93RXJyb3JNc2cocmVzcG9uc2UsIHRvYXN0ckNvbmZpZyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0V4Y2VwdGlvbihyZXE6IEh0dHBSZXF1ZXN0PGFueT4pOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3QgdXJsIG9mIHRoaXMuZXJyb3JTZXJ2aWNlLnVybHMpIHtcclxuICAgICAgaWYgKHJlcS51cmwuaW5jbHVkZXModXJsLnBhdGgpICYmIHJlcS5tZXRob2QgPT09IHVybC5tZXRob2QpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { HttpResponse, } from '@angular/common/http';
|
|
3
|
-
import { Observable } from 'rxjs';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "../services/loader.service";
|
|
6
|
-
export class LoadingInterceptor {
|
|
7
|
-
constructor(loaderService) {
|
|
8
|
-
this.loaderService = loaderService;
|
|
9
|
-
this.requests = [];
|
|
10
|
-
}
|
|
11
|
-
removeRequest(req) {
|
|
12
|
-
const i = this.requests.indexOf(req);
|
|
13
|
-
if (i >= 0) {
|
|
14
|
-
this.requests.splice(i, 1);
|
|
15
|
-
}
|
|
16
|
-
this.loaderService.isLoading.next(this.requests.length > 0);
|
|
17
|
-
}
|
|
18
|
-
intercept(req, next) {
|
|
19
|
-
if (this.isException(req)) {
|
|
20
|
-
return next.handle(req);
|
|
21
|
-
}
|
|
22
|
-
this.requests.push(req);
|
|
23
|
-
this.loaderService.isLoading.next(true);
|
|
24
|
-
return new Observable((observer) => {
|
|
25
|
-
const subscription = next.handle(req).subscribe((event) => {
|
|
26
|
-
if (event instanceof HttpResponse) {
|
|
27
|
-
this.removeRequest(req);
|
|
28
|
-
observer.next(event);
|
|
29
|
-
}
|
|
30
|
-
}, (err) => {
|
|
31
|
-
this.removeRequest(req);
|
|
32
|
-
observer.error(err);
|
|
33
|
-
}, () => {
|
|
34
|
-
this.removeRequest(req);
|
|
35
|
-
observer.complete();
|
|
36
|
-
});
|
|
37
|
-
// remove request from queue when cancelled
|
|
38
|
-
return () => {
|
|
39
|
-
this.removeRequest(req);
|
|
40
|
-
subscription.unsubscribe();
|
|
41
|
-
};
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
isException(req) {
|
|
45
|
-
for (const url of this.loaderService.urls) {
|
|
46
|
-
if (req.url.includes(url.path) && req.method === url.method) {
|
|
47
|
-
return true;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
56
|
-
type: Injectable
|
|
57
|
-
}], ctorParameters: function () { return [{ type: i1.LoaderService }]; } });
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { HttpResponse, } from '@angular/common/http';
|
|
3
|
+
import { Observable } from 'rxjs';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "../services/loader.service";
|
|
6
|
+
export class LoadingInterceptor {
|
|
7
|
+
constructor(loaderService) {
|
|
8
|
+
this.loaderService = loaderService;
|
|
9
|
+
this.requests = [];
|
|
10
|
+
}
|
|
11
|
+
removeRequest(req) {
|
|
12
|
+
const i = this.requests.indexOf(req);
|
|
13
|
+
if (i >= 0) {
|
|
14
|
+
this.requests.splice(i, 1);
|
|
15
|
+
}
|
|
16
|
+
this.loaderService.isLoading.next(this.requests.length > 0);
|
|
17
|
+
}
|
|
18
|
+
intercept(req, next) {
|
|
19
|
+
if (this.isException(req)) {
|
|
20
|
+
return next.handle(req);
|
|
21
|
+
}
|
|
22
|
+
this.requests.push(req);
|
|
23
|
+
this.loaderService.isLoading.next(true);
|
|
24
|
+
return new Observable((observer) => {
|
|
25
|
+
const subscription = next.handle(req).subscribe((event) => {
|
|
26
|
+
if (event instanceof HttpResponse) {
|
|
27
|
+
this.removeRequest(req);
|
|
28
|
+
observer.next(event);
|
|
29
|
+
}
|
|
30
|
+
}, (err) => {
|
|
31
|
+
this.removeRequest(req);
|
|
32
|
+
observer.error(err);
|
|
33
|
+
}, () => {
|
|
34
|
+
this.removeRequest(req);
|
|
35
|
+
observer.complete();
|
|
36
|
+
});
|
|
37
|
+
// remove request from queue when cancelled
|
|
38
|
+
return () => {
|
|
39
|
+
this.removeRequest(req);
|
|
40
|
+
subscription.unsubscribe();
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
isException(req) {
|
|
45
|
+
for (const url of this.loaderService.urls) {
|
|
46
|
+
if (req.url.includes(url.path) && req.method === url.method) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: LoadingInterceptor, deps: [{ token: i1.LoaderService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
53
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: LoadingInterceptor }); }
|
|
54
|
+
}
|
|
55
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: LoadingInterceptor, decorators: [{
|
|
56
|
+
type: Injectable
|
|
57
|
+
}], ctorParameters: function () { return [{ type: i1.LoaderService }]; } });
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGluZy5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWlwYS1saWJyYXJ5L3NyYy9saWIvY29yZS9pbnRlcmNlcHRvcnMvbG9hZGluZy5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFLTCxZQUFZLEdBQ2IsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7QUFJbEMsTUFBTSxPQUFPLGtCQUFrQjtJQUc3QixZQUFvQixhQUE0QjtRQUE1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUZ4QyxhQUFRLEdBQXVCLEVBQUUsQ0FBQztJQUVTLENBQUM7SUFFcEQsYUFBYSxDQUFDLEdBQXFCO1FBQ2pDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNWLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUM1QjtRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsU0FBUyxDQUNQLEdBQXlCLEVBQ3pCLElBQWlCO1FBRWpCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN6QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDekI7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV4QixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2pDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUM3QyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNSLElBQUksS0FBSyxZQUFZLFlBQVksRUFBRTtvQkFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDeEIsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDdEI7WUFDSCxDQUFDLEVBQ0QsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDTixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN4QixRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLENBQUMsRUFDRCxHQUFHLEVBQUU7Z0JBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDeEIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLENBQUMsQ0FDRixDQUFDO1lBQ0YsMkNBQTJDO1lBQzNDLE9BQU8sR0FBRyxFQUFFO2dCQUNWLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3hCLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM3QixDQUFDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsR0FBcUI7UUFDL0IsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRTtZQUN6QyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLEVBQUU7Z0JBQzNELE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs4R0F2RFUsa0JBQWtCO2tIQUFsQixrQkFBa0I7OzJGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgSHR0cFJlcXVlc3QsXHJcbiAgSHR0cEhhbmRsZXIsXHJcbiAgSHR0cEV2ZW50LFxyXG4gIEh0dHBJbnRlcmNlcHRvcixcclxuICBIdHRwUmVzcG9uc2UsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IExvYWRlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9sb2FkZXIuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBMb2FkaW5nSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xyXG4gIHByaXZhdGUgcmVxdWVzdHM6IEh0dHBSZXF1ZXN0PGFueT5bXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxvYWRlclNlcnZpY2U6IExvYWRlclNlcnZpY2UpIHt9XHJcblxyXG4gIHJlbW92ZVJlcXVlc3QocmVxOiBIdHRwUmVxdWVzdDxhbnk+KTogdm9pZCB7XHJcbiAgICBjb25zdCBpID0gdGhpcy5yZXF1ZXN0cy5pbmRleE9mKHJlcSk7XHJcbiAgICBpZiAoaSA+PSAwKSB7XHJcbiAgICAgIHRoaXMucmVxdWVzdHMuc3BsaWNlKGksIDEpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5sb2FkZXJTZXJ2aWNlLmlzTG9hZGluZy5uZXh0KHRoaXMucmVxdWVzdHMubGVuZ3RoID4gMCk7XHJcbiAgfVxyXG5cclxuICBpbnRlcmNlcHQoXHJcbiAgICByZXE6IEh0dHBSZXF1ZXN0PHVua25vd24+LFxyXG4gICAgbmV4dDogSHR0cEhhbmRsZXJcclxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDx1bmtub3duPj4ge1xyXG4gICAgaWYgKHRoaXMuaXNFeGNlcHRpb24ocmVxKSkge1xyXG4gICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVxdWVzdHMucHVzaChyZXEpO1xyXG5cclxuICAgIHRoaXMubG9hZGVyU2VydmljZS5pc0xvYWRpbmcubmV4dCh0cnVlKTtcclxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpID0+IHtcclxuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbmV4dC5oYW5kbGUocmVxKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVSZXF1ZXN0KHJlcSk7XHJcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoZXZlbnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVSZXF1ZXN0KHJlcSk7XHJcbiAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVSZXF1ZXN0KHJlcSk7XHJcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgICAgLy8gcmVtb3ZlIHJlcXVlc3QgZnJvbSBxdWV1ZSB3aGVuIGNhbmNlbGxlZFxyXG4gICAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlUmVxdWVzdChyZXEpO1xyXG4gICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpc0V4Y2VwdGlvbihyZXE6IEh0dHBSZXF1ZXN0PGFueT4pOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3QgdXJsIG9mIHRoaXMubG9hZGVyU2VydmljZS51cmxzKSB7XHJcbiAgICAgIGlmIChyZXEudXJsLmluY2x1ZGVzKHVybC5wYXRoKSAmJiByZXEubWV0aG9kID09PSB1cmwubWV0aG9kKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "../services/auth.service";
|
|
4
|
-
export class myIPATokenInterceptor {
|
|
5
|
-
constructor(authService) {
|
|
6
|
-
this.authService = authService;
|
|
7
|
-
}
|
|
8
|
-
intercept(request, next) {
|
|
9
|
-
const token = this.authService.getTokenFromHidden();
|
|
10
|
-
if (token) {
|
|
11
|
-
request = request.clone({
|
|
12
|
-
setHeaders: {
|
|
13
|
-
Authorization: `Bearer ${token}`,
|
|
14
|
-
},
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
return next.handle(request);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
23
|
-
type: Injectable
|
|
24
|
-
}], ctorParameters: function () { return [{ type: i1.AuthService }]; } });
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../services/auth.service";
|
|
4
|
+
export class myIPATokenInterceptor {
|
|
5
|
+
constructor(authService) {
|
|
6
|
+
this.authService = authService;
|
|
7
|
+
}
|
|
8
|
+
intercept(request, next) {
|
|
9
|
+
const token = this.authService.getTokenFromHidden();
|
|
10
|
+
if (token) {
|
|
11
|
+
request = request.clone({
|
|
12
|
+
setHeaders: {
|
|
13
|
+
Authorization: `Bearer ${token}`,
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
return next.handle(request);
|
|
18
|
+
}
|
|
19
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: myIPATokenInterceptor, deps: [{ token: i1.AuthService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
20
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: myIPATokenInterceptor }); }
|
|
21
|
+
}
|
|
22
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: myIPATokenInterceptor, decorators: [{
|
|
23
|
+
type: Injectable
|
|
24
|
+
}], ctorParameters: function () { return [{ type: i1.AuthService }]; } });
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXlJUEFUb2tlbi5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWlwYS1saWJyYXJ5L3NyYy9saWIvY29yZS9pbnRlcmNlcHRvcnMvbXlJUEFUb2tlbi5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFXM0MsTUFBTSxPQUFPLHFCQUFxQjtJQUNoQyxZQUFvQixXQUF3QjtRQUF4QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtJQUFHLENBQUM7SUFFaEQsU0FBUyxDQUNQLE9BQTZCLEVBQzdCLElBQWlCO1FBRWpCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNwRCxJQUFJLEtBQUssRUFBRTtZQUNULE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUN0QixVQUFVLEVBQUU7b0JBQ1YsYUFBYSxFQUFFLFVBQVUsS0FBSyxFQUFFO2lCQUNqQzthQUNGLENBQUMsQ0FBQztTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7OEdBaEJVLHFCQUFxQjtrSEFBckIscUJBQXFCOzsyRkFBckIscUJBQXFCO2tCQURqQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEh0dHBSZXF1ZXN0LFxyXG4gIEh0dHBIYW5kbGVyLFxyXG4gIEh0dHBFdmVudCxcclxuICBIdHRwSW50ZXJjZXB0b3IsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIG15SVBBVG9rZW5JbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UpIHt9XHJcblxyXG4gIGludGVyY2VwdChcclxuICAgIHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PHVua25vd24+LFxyXG4gICAgbmV4dDogSHR0cEhhbmRsZXJcclxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDx1bmtub3duPj4ge1xyXG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmF1dGhTZXJ2aWNlLmdldFRva2VuRnJvbUhpZGRlbigpO1xyXG4gICAgaWYgKHRva2VuKSB7XHJcbiAgICAgIHJlcXVlc3QgPSByZXF1ZXN0LmNsb25lKHtcclxuICAgICAgICBzZXRIZWFkZXJzOiB7XHJcbiAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXF1ZXN0KTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "../services/auth.service";
|
|
4
|
-
import * as i2 from "@angular/common/http";
|
|
5
|
-
import * as i3 from "../services/loader.service";
|
|
6
|
-
import * as i4 from "../services/token.service";
|
|
7
|
-
export class TokenInterceptor {
|
|
8
|
-
constructor(authService, http, loaderService, tokenService) {
|
|
9
|
-
this.authService = authService;
|
|
10
|
-
this.http = http;
|
|
11
|
-
this.loaderService = loaderService;
|
|
12
|
-
this.tokenService = tokenService;
|
|
13
|
-
this.refresh = true;
|
|
14
|
-
this.loaderService.addExceptionUrl({
|
|
15
|
-
path: '/api/users?refresh',
|
|
16
|
-
method: 'GET',
|
|
17
|
-
});
|
|
18
|
-
this.tokenService.addExceptionUrl({
|
|
19
|
-
path: '/api/users?refresh',
|
|
20
|
-
method: 'GET',
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
intercept(request, next) {
|
|
24
|
-
if (this.isException(request)) {
|
|
25
|
-
return next.handle(request);
|
|
26
|
-
}
|
|
27
|
-
const token = this.authService.getToken();
|
|
28
|
-
if (token) {
|
|
29
|
-
this.isTokenExpired(token);
|
|
30
|
-
request = request.clone({
|
|
31
|
-
setHeaders: {
|
|
32
|
-
Authorization: `Bearer ${token}`,
|
|
33
|
-
},
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
return next.handle(request);
|
|
37
|
-
}
|
|
38
|
-
isTokenExpired(token) {
|
|
39
|
-
const redirectPath = location.pathname;
|
|
40
|
-
const decodedToken = this.authService.getDecodedToken();
|
|
41
|
-
const expDate = new Date((decodedToken.exp ?? 0) * 1000);
|
|
42
|
-
if (expDate < new Date()) {
|
|
43
|
-
location.replace('/ar/login?redirect=' + redirectPath);
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
if (this.authService.currentUserUrl) {
|
|
48
|
-
if (this.refresh) {
|
|
49
|
-
this.http
|
|
50
|
-
.get(this.authService.currentUserUrl + `users?refresh`, {
|
|
51
|
-
headers: { Authorization: `Bearer ${token}` },
|
|
52
|
-
})
|
|
53
|
-
.subscribe((user) => {
|
|
54
|
-
localStorage.setItem('token', user.token);
|
|
55
|
-
this.refresh = false;
|
|
56
|
-
setTimeout(() => {
|
|
57
|
-
this.refresh = true;
|
|
58
|
-
}, 60 * 1000);
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
throw new Error("provide current base user api url using this function authService.setCurrentUserUrl('https://...')");
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
isException(req) {
|
|
68
|
-
for (const url of this.tokenService.urls) {
|
|
69
|
-
if (req.url.includes(url.path) && req.method === url.method) {
|
|
70
|
-
return true;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
return false;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
79
|
-
type: Injectable
|
|
80
|
-
}], ctorParameters: function () { return [{ type: i1.AuthService }, { type: i2.HttpClient }, { type: i3.LoaderService }, { type: i4.TokenService }]; } });
|
|
81
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../services/auth.service";
|
|
4
|
+
import * as i2 from "@angular/common/http";
|
|
5
|
+
import * as i3 from "../services/loader.service";
|
|
6
|
+
import * as i4 from "../services/token.service";
|
|
7
|
+
export class TokenInterceptor {
|
|
8
|
+
constructor(authService, http, loaderService, tokenService) {
|
|
9
|
+
this.authService = authService;
|
|
10
|
+
this.http = http;
|
|
11
|
+
this.loaderService = loaderService;
|
|
12
|
+
this.tokenService = tokenService;
|
|
13
|
+
this.refresh = true;
|
|
14
|
+
this.loaderService.addExceptionUrl({
|
|
15
|
+
path: '/api/users?refresh',
|
|
16
|
+
method: 'GET',
|
|
17
|
+
});
|
|
18
|
+
this.tokenService.addExceptionUrl({
|
|
19
|
+
path: '/api/users?refresh',
|
|
20
|
+
method: 'GET',
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
intercept(request, next) {
|
|
24
|
+
if (this.isException(request)) {
|
|
25
|
+
return next.handle(request);
|
|
26
|
+
}
|
|
27
|
+
const token = this.authService.getToken();
|
|
28
|
+
if (token) {
|
|
29
|
+
this.isTokenExpired(token);
|
|
30
|
+
request = request.clone({
|
|
31
|
+
setHeaders: {
|
|
32
|
+
Authorization: `Bearer ${token}`,
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
return next.handle(request);
|
|
37
|
+
}
|
|
38
|
+
isTokenExpired(token) {
|
|
39
|
+
const redirectPath = location.pathname;
|
|
40
|
+
const decodedToken = this.authService.getDecodedToken();
|
|
41
|
+
const expDate = new Date((decodedToken.exp ?? 0) * 1000);
|
|
42
|
+
if (expDate < new Date()) {
|
|
43
|
+
location.replace('/ar/login?redirect=' + redirectPath);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
if (this.authService.currentUserUrl) {
|
|
48
|
+
if (this.refresh) {
|
|
49
|
+
this.http
|
|
50
|
+
.get(this.authService.currentUserUrl + `users?refresh`, {
|
|
51
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
52
|
+
})
|
|
53
|
+
.subscribe((user) => {
|
|
54
|
+
localStorage.setItem('token', user.token);
|
|
55
|
+
this.refresh = false;
|
|
56
|
+
setTimeout(() => {
|
|
57
|
+
this.refresh = true;
|
|
58
|
+
}, 60 * 1000);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
throw new Error("provide current base user api url using this function authService.setCurrentUserUrl('https://...')");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
isException(req) {
|
|
68
|
+
for (const url of this.tokenService.urls) {
|
|
69
|
+
if (req.url.includes(url.path) && req.method === url.method) {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: TokenInterceptor, deps: [{ token: i1.AuthService }, { token: i2.HttpClient }, { token: i3.LoaderService }, { token: i4.TokenService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
76
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: TokenInterceptor }); }
|
|
77
|
+
}
|
|
78
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: TokenInterceptor, decorators: [{
|
|
79
|
+
type: Injectable
|
|
80
|
+
}], ctorParameters: function () { return [{ type: i1.AuthService }, { type: i2.HttpClient }, { type: i3.LoaderService }, { type: i4.TokenService }]; } });
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4uaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1pcGEtbGlicmFyeS9zcmMvbGliL2NvcmUvaW50ZXJjZXB0b3JzL3Rva2VuLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7OztBQWdCM0MsTUFBTSxPQUFPLGdCQUFnQjtJQUUzQixZQUNVLFdBQXdCLEVBQ3hCLElBQWdCLEVBQ2hCLGFBQTRCLEVBQzVCLFlBQTBCO1FBSDFCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFMcEMsWUFBTyxHQUFHLElBQUksQ0FBQztRQU9iLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDO1lBQ2pDLElBQUksRUFBRSxvQkFBb0I7WUFDMUIsTUFBTSxFQUFFLEtBQUs7U0FDZCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQztZQUNoQyxJQUFJLEVBQUUsb0JBQW9CO1lBQzFCLE1BQU0sRUFBRSxLQUFLO1NBQ2QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFNBQVMsQ0FDUCxPQUE2QixFQUM3QixJQUFpQjtRQUVqQixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDN0IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzdCO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMxQyxJQUFJLEtBQUssRUFBRTtZQUNULElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0IsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQ3RCLFVBQVUsRUFBRTtvQkFDVixhQUFhLEVBQUUsVUFBVSxLQUFLLEVBQUU7aUJBQ2pDO2FBQ0YsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVPLGNBQWMsQ0FBQyxLQUFhO1FBQ2xDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDdkMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQWtCLENBQUM7UUFDeEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3pELElBQUksT0FBTyxHQUFHLElBQUksSUFBSSxFQUFFLEVBQUU7WUFDeEIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsR0FBRyxZQUFZLENBQUMsQ0FBQztZQUN2RCxPQUFPO1NBQ1I7YUFBTTtZQUNMLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUU7Z0JBQ25DLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDaEIsSUFBSSxDQUFDLElBQUk7eUJBQ04sR0FBRyxDQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxHQUFHLGVBQWUsRUFBRTt3QkFDNUQsT0FBTyxFQUFFLEVBQUUsYUFBYSxFQUFFLFVBQVUsS0FBSyxFQUFFLEVBQUU7cUJBQzlDLENBQUM7eUJBQ0QsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7d0JBQ2xCLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDMUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7d0JBQ3JCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7NEJBQ2QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7d0JBQ3RCLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7b0JBQ2hCLENBQUMsQ0FBQyxDQUFDO2lCQUNOO2FBQ0Y7aUJBQU07Z0JBQ0wsTUFBTSxJQUFJLEtBQUssQ0FDYixvR0FBb0csQ0FDckcsQ0FBQzthQUNIO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLEdBQXFCO1FBQy9CLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUU7WUFDeEMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxFQUFFO2dCQUMzRCxPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7OEdBMUVVLGdCQUFnQjtrSEFBaEIsZ0JBQWdCOzsyRkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEh0dHBSZXF1ZXN0LFxyXG4gIEh0dHBIYW5kbGVyLFxyXG4gIEh0dHBFdmVudCxcclxuICBIdHRwSW50ZXJjZXB0b3IsXHJcbiAgSHR0cENsaWVudCxcclxufSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEZWNvZGVkVG9rZW4gfSBmcm9tICcuLi8uLi9tb2RlbHMvZGVjb2RlZFRva2VuLm1vZGVsJztcclxuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL21vZGVscy91c2VyLm1vZGVsJztcclxuaW1wb3J0IHsgTG9hZGVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2xvYWRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVG9rZW5TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdG9rZW4uc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBUb2tlbkludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcclxuICByZWZyZXNoID0gdHJ1ZTtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSBsb2FkZXJTZXJ2aWNlOiBMb2FkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2tlblNlcnZpY2U6IFRva2VuU2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy5sb2FkZXJTZXJ2aWNlLmFkZEV4Y2VwdGlvblVybCh7XHJcbiAgICAgIHBhdGg6ICcvYXBpL3VzZXJzP3JlZnJlc2gnLFxyXG4gICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRva2VuU2VydmljZS5hZGRFeGNlcHRpb25Vcmwoe1xyXG4gICAgICBwYXRoOiAnL2FwaS91c2Vycz9yZWZyZXNoJyxcclxuICAgICAgbWV0aG9kOiAnR0VUJyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaW50ZXJjZXB0KFxyXG4gICAgcmVxdWVzdDogSHR0cFJlcXVlc3Q8dW5rbm93bj4sXHJcbiAgICBuZXh0OiBIdHRwSGFuZGxlclxyXG4gICk6IE9ic2VydmFibGU8SHR0cEV2ZW50PHVua25vd24+PiB7XHJcbiAgICBpZiAodGhpcy5pc0V4Y2VwdGlvbihyZXF1ZXN0KSkge1xyXG4gICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxdWVzdCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuYXV0aFNlcnZpY2UuZ2V0VG9rZW4oKTtcclxuICAgIGlmICh0b2tlbikge1xyXG4gICAgICB0aGlzLmlzVG9rZW5FeHBpcmVkKHRva2VuKTtcclxuICAgICAgcmVxdWVzdCA9IHJlcXVlc3QuY2xvbmUoe1xyXG4gICAgICAgIHNldEhlYWRlcnM6IHtcclxuICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcXVlc3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1Rva2VuRXhwaXJlZCh0b2tlbjogc3RyaW5nKSB7XHJcbiAgICBjb25zdCByZWRpcmVjdFBhdGggPSBsb2NhdGlvbi5wYXRobmFtZTtcclxuICAgIGNvbnN0IGRlY29kZWRUb2tlbiA9IHRoaXMuYXV0aFNlcnZpY2UuZ2V0RGVjb2RlZFRva2VuKCkgYXMgRGVjb2RlZFRva2VuO1xyXG4gICAgY29uc3QgZXhwRGF0ZSA9IG5ldyBEYXRlKChkZWNvZGVkVG9rZW4uZXhwID8/IDApICogMTAwMCk7XHJcbiAgICBpZiAoZXhwRGF0ZSA8IG5ldyBEYXRlKCkpIHtcclxuICAgICAgbG9jYXRpb24ucmVwbGFjZSgnL2FyL2xvZ2luP3JlZGlyZWN0PScgKyByZWRpcmVjdFBhdGgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5hdXRoU2VydmljZS5jdXJyZW50VXNlclVybCkge1xyXG4gICAgICAgIGlmICh0aGlzLnJlZnJlc2gpIHtcclxuICAgICAgICAgIHRoaXMuaHR0cFxyXG4gICAgICAgICAgICAuZ2V0PFVzZXI+KHRoaXMuYXV0aFNlcnZpY2UuY3VycmVudFVzZXJVcmwgKyBgdXNlcnM/cmVmcmVzaGAsIHtcclxuICAgICAgICAgICAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gIH0sXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHVzZXIpID0+IHtcclxuICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9rZW4nLCB1c2VyLnRva2VuKTtcclxuICAgICAgICAgICAgICB0aGlzLnJlZnJlc2ggPSBmYWxzZTtcclxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfSwgNjAgKiAxMDAwKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgIFwicHJvdmlkZSBjdXJyZW50IGJhc2UgdXNlciBhcGkgdXJsIHVzaW5nIHRoaXMgZnVuY3Rpb24gYXV0aFNlcnZpY2Uuc2V0Q3VycmVudFVzZXJVcmwoJ2h0dHBzOi8vLi4uJylcIlxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzRXhjZXB0aW9uKHJlcTogSHR0cFJlcXVlc3Q8YW55Pik6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChjb25zdCB1cmwgb2YgdGhpcy50b2tlblNlcnZpY2UudXJscykge1xyXG4gICAgICBpZiAocmVxLnVybC5pbmNsdWRlcyh1cmwucGF0aCkgJiYgcmVxLm1ldGhvZCA9PT0gdXJsLm1ldGhvZCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|