@nakedcreativity/membrs-angular-helper 0.1.5 → 0.1.7
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/esm2022/lib/auth.interceptor.mjs +66 -0
- package/{esm2020 → esm2022}/lib/membrs.module.mjs +31 -31
- package/esm2022/lib/membrs.service.mjs +128 -0
- package/{fesm2020 → fesm2022}/nakedcreativity-membrs-angular-helper.mjs +50 -43
- package/{fesm2015 → fesm2022}/nakedcreativity-membrs-angular-helper.mjs.map +1 -1
- package/package.json +6 -12
- package/esm2020/lib/auth.interceptor.mjs +0 -63
- package/esm2020/lib/membrs.service.mjs +0 -124
- package/fesm2015/nakedcreativity-membrs-angular-helper.mjs +0 -364
- package/fesm2020/nakedcreativity-membrs-angular-helper.mjs.map +0 -1
- /package/{esm2020 → esm2022}/lib/config.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/config.service.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/router.config.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/token.mjs +0 -0
- /package/{esm2020 → esm2022}/nakedcreativity-membrs-angular-helper.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Injectable } from "@angular/core";
|
|
2
|
+
import { from, throwError } from "rxjs";
|
|
3
|
+
import { switchMap, catchError, finalize, tap } from "rxjs/operators";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@auth0/angular-jwt";
|
|
6
|
+
import * as i2 from "./membrs.service";
|
|
7
|
+
import * as i3 from "@uirouter/angular";
|
|
8
|
+
export class TokenInterceptor {
|
|
9
|
+
jwtHelper;
|
|
10
|
+
membrsService;
|
|
11
|
+
stateService;
|
|
12
|
+
constructor(jwtHelper, membrsService, stateService) {
|
|
13
|
+
this.jwtHelper = jwtHelper;
|
|
14
|
+
this.membrsService = membrsService;
|
|
15
|
+
this.stateService = stateService;
|
|
16
|
+
}
|
|
17
|
+
intercept(request, next) {
|
|
18
|
+
const token = localStorage.getItem("membrs");
|
|
19
|
+
if (token && this.jwtHelper.isTokenExpired(token)) {
|
|
20
|
+
console.log("Token expired. Attempting to reissue.");
|
|
21
|
+
return from(this.membrsService.reissue()).pipe(switchMap(() => {
|
|
22
|
+
const refreshedToken = localStorage.getItem("membrs");
|
|
23
|
+
if (refreshedToken && !this.jwtHelper.isTokenExpired(refreshedToken)) {
|
|
24
|
+
console.log("Token successfully reissued.");
|
|
25
|
+
request = request.clone({
|
|
26
|
+
setHeaders: {
|
|
27
|
+
Authorization: refreshedToken,
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
return next.handle(request);
|
|
32
|
+
}), catchError((err) => {
|
|
33
|
+
console.warn("Token refresh failed. Logging out.");
|
|
34
|
+
this.membrsService.logout();
|
|
35
|
+
this.stateService.go("");
|
|
36
|
+
return throwError(() => err);
|
|
37
|
+
}), finalize(() => {
|
|
38
|
+
// this.busyService.finished()
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
if (token && !this.jwtHelper.isTokenExpired(token)) {
|
|
42
|
+
request = request.clone({
|
|
43
|
+
setHeaders: {
|
|
44
|
+
Authorization: token,
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return next.handle(request).pipe(tap((event) => {
|
|
49
|
+
// If this is an HttpResponse, check for x-new-token header
|
|
50
|
+
if (event && event.type === 4 && event.headers) {
|
|
51
|
+
const newToken = event.headers.get('x-new-token');
|
|
52
|
+
if (newToken) {
|
|
53
|
+
localStorage.setItem('membrs', newToken);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}), finalize(() => {
|
|
57
|
+
// this.busyService.finished()
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenInterceptor, deps: [{ token: i1.JwtHelperService }, { token: i2.MembrsService }, { token: i3.StateService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
61
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenInterceptor });
|
|
62
|
+
}
|
|
63
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenInterceptor, decorators: [{
|
|
64
|
+
type: Injectable
|
|
65
|
+
}], ctorParameters: () => [{ type: i1.JwtHelperService }, { type: i2.MembrsService }, { type: i3.StateService }] });
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21lbWJycy9zcmMvbGliL2F1dGguaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQWMsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBS3RFLE1BQU0sT0FBTyxnQkFBZ0I7SUFDUDtJQUFxQztJQUFzQztJQUEvRixZQUFvQixTQUEyQixFQUFVLGFBQTRCLEVBQVUsWUFBMEI7UUFBckcsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFVLGlCQUFZLEdBQVosWUFBWSxDQUFjO0lBQUcsQ0FBQztJQUU3SCxTQUFTLENBQUMsT0FBeUIsRUFBRSxJQUFpQjtRQUNwRCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTdDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2pELE9BQU8sQ0FBQyxHQUFHLENBQUMsdUNBQXVDLENBQUMsQ0FBQztZQUNyRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUM1QyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNiLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3RELElBQUksY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLEVBQUU7b0JBQ3BFLE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQztvQkFDNUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7d0JBQ3RCLFVBQVUsRUFBRTs0QkFDVixhQUFhLEVBQUUsY0FBYzt5QkFDOUI7cUJBQ0YsQ0FBQyxDQUFDO2lCQUNKO2dCQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QixDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDekIsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0IsQ0FBQyxDQUFDLEVBQ0YsUUFBUSxDQUFDLEdBQUcsRUFBRTtnQkFDWiw4QkFBOEI7WUFDaEMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztTQUNIO1FBRUQsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNsRCxPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDdEIsVUFBVSxFQUFFO29CQUNWLGFBQWEsRUFBRSxLQUFLO2lCQUNyQjthQUNGLENBQUMsQ0FBQztTQUNKO1FBRUQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDOUIsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDWiwyREFBMkQ7WUFDM0QsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtnQkFDOUMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2xELElBQUksUUFBUSxFQUFFO29CQUNaLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2lCQUMxQzthQUNGO1FBQ0gsQ0FBQyxDQUFDLEVBQ0YsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNaLDhCQUE4QjtRQUNoQyxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQzt3R0F2RFUsZ0JBQWdCOzRHQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBKd3RIZWxwZXJTZXJ2aWNlIH0gZnJvbSBcIkBhdXRoMC9hbmd1bGFyLWp3dFwiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBIdHRwUmVxdWVzdCwgSHR0cEhhbmRsZXIsIEh0dHBFdmVudCwgSHR0cEludGVyY2VwdG9yIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmcm9tLCB0aHJvd0Vycm9yIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IHN3aXRjaE1hcCwgY2F0Y2hFcnJvciwgZmluYWxpemUsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgTWVtYnJzU2VydmljZSB9IGZyb20gXCIuL21lbWJycy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBTdGF0ZVNlcnZpY2UgfSBmcm9tIFwiQHVpcm91dGVyL2FuZ3VsYXJcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRva2VuSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGp3dEhlbHBlcjogSnd0SGVscGVyU2VydmljZSwgcHJpdmF0ZSBtZW1icnNTZXJ2aWNlOiBNZW1icnNTZXJ2aWNlLCBwcml2YXRlIHN0YXRlU2VydmljZTogU3RhdGVTZXJ2aWNlKSB7fVxuXG4gIGludGVyY2VwdChyZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcbiAgICBjb25zdCB0b2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwibWVtYnJzXCIpO1xuXG4gICAgaWYgKHRva2VuICYmIHRoaXMuand0SGVscGVyLmlzVG9rZW5FeHBpcmVkKHRva2VuKSkge1xuICAgICAgY29uc29sZS5sb2coXCJUb2tlbiBleHBpcmVkLiBBdHRlbXB0aW5nIHRvIHJlaXNzdWUuXCIpO1xuICAgICAgcmV0dXJuIGZyb20odGhpcy5tZW1icnNTZXJ2aWNlLnJlaXNzdWUoKSkucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCByZWZyZXNoZWRUb2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwibWVtYnJzXCIpO1xuICAgICAgICAgIGlmIChyZWZyZXNoZWRUb2tlbiAmJiAhdGhpcy5qd3RIZWxwZXIuaXNUb2tlbkV4cGlyZWQocmVmcmVzaGVkVG9rZW4pKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlRva2VuIHN1Y2Nlc3NmdWxseSByZWlzc3VlZC5cIik7XG4gICAgICAgICAgICByZXF1ZXN0ID0gcmVxdWVzdC5jbG9uZSh7XG4gICAgICAgICAgICAgIHNldEhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiByZWZyZXNoZWRUb2tlbixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxdWVzdCk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXCJUb2tlbiByZWZyZXNoIGZhaWxlZC4gTG9nZ2luZyBvdXQuXCIpO1xuICAgICAgICAgIHRoaXMubWVtYnJzU2VydmljZS5sb2dvdXQoKTtcbiAgICAgICAgICB0aGlzLnN0YXRlU2VydmljZS5nbyhcIlwiKTtcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnIpO1xuICAgICAgICB9KSxcbiAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgIC8vIHRoaXMuYnVzeVNlcnZpY2UuZmluaXNoZWQoKVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodG9rZW4gJiYgIXRoaXMuand0SGVscGVyLmlzVG9rZW5FeHBpcmVkKHRva2VuKSkge1xuICAgICAgcmVxdWVzdCA9IHJlcXVlc3QuY2xvbmUoe1xuICAgICAgICBzZXRIZWFkZXJzOiB7XG4gICAgICAgICAgQXV0aG9yaXphdGlvbjogdG9rZW4sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxdWVzdCkucGlwZShcbiAgICAgIHRhcCgoZXZlbnQpID0+IHtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBIdHRwUmVzcG9uc2UsIGNoZWNrIGZvciB4LW5ldy10b2tlbiBoZWFkZXJcbiAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LnR5cGUgPT09IDQgJiYgZXZlbnQuaGVhZGVycykge1xuICAgICAgICAgIGNvbnN0IG5ld1Rva2VuID0gZXZlbnQuaGVhZGVycy5nZXQoJ3gtbmV3LXRva2VuJyk7XG4gICAgICAgICAgaWYgKG5ld1Rva2VuKSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbWVtYnJzJywgbmV3VG9rZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgIC8vIHRoaXMuYnVzeVNlcnZpY2UuZmluaXNoZWQoKVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
@@ -102,37 +102,37 @@ export class MembrsModule {
|
|
|
102
102
|
providers: moduleProviders //[{provide: MembrsConfigService,useValue: config}]
|
|
103
103
|
};
|
|
104
104
|
}
|
|
105
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MembrsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
106
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: MembrsModule, imports: [CommonModule,
|
|
107
|
+
HttpClientModule,
|
|
108
|
+
JwtModule
|
|
109
|
+
// JwtModule.forRoot({
|
|
110
|
+
// config: {
|
|
111
|
+
// tokenGetter: retrieveToken
|
|
112
|
+
// }
|
|
113
|
+
// })
|
|
114
|
+
// UIRouterModule.forChild({
|
|
115
|
+
// states: STATES,
|
|
116
|
+
// config: routerConfigFn,
|
|
117
|
+
// }),
|
|
118
|
+
// JwtModule.forRoot({})
|
|
119
|
+
] });
|
|
120
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MembrsModule, imports: [CommonModule,
|
|
121
|
+
HttpClientModule,
|
|
122
|
+
JwtModule
|
|
123
|
+
// JwtModule.forRoot({
|
|
124
|
+
// config: {
|
|
125
|
+
// tokenGetter: retrieveToken
|
|
126
|
+
// }
|
|
127
|
+
// })
|
|
128
|
+
// UIRouterModule.forChild({
|
|
129
|
+
// states: STATES,
|
|
130
|
+
// config: routerConfigFn,
|
|
131
|
+
// }),
|
|
132
|
+
// JwtModule.forRoot({})
|
|
133
|
+
] });
|
|
105
134
|
}
|
|
106
|
-
|
|
107
|
-
MembrsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: MembrsModule, imports: [CommonModule,
|
|
108
|
-
HttpClientModule,
|
|
109
|
-
JwtModule
|
|
110
|
-
// JwtModule.forRoot({
|
|
111
|
-
// config: {
|
|
112
|
-
// tokenGetter: retrieveToken
|
|
113
|
-
// }
|
|
114
|
-
// })
|
|
115
|
-
// UIRouterModule.forChild({
|
|
116
|
-
// states: STATES,
|
|
117
|
-
// config: routerConfigFn,
|
|
118
|
-
// }),
|
|
119
|
-
// JwtModule.forRoot({})
|
|
120
|
-
] });
|
|
121
|
-
MembrsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MembrsModule, imports: [CommonModule,
|
|
122
|
-
HttpClientModule,
|
|
123
|
-
JwtModule
|
|
124
|
-
// JwtModule.forRoot({
|
|
125
|
-
// config: {
|
|
126
|
-
// tokenGetter: retrieveToken
|
|
127
|
-
// }
|
|
128
|
-
// })
|
|
129
|
-
// UIRouterModule.forChild({
|
|
130
|
-
// states: STATES,
|
|
131
|
-
// config: routerConfigFn,
|
|
132
|
-
// }),
|
|
133
|
-
// JwtModule.forRoot({})
|
|
134
|
-
] });
|
|
135
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MembrsModule, decorators: [{
|
|
135
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MembrsModule, decorators: [{
|
|
136
136
|
type: NgModule,
|
|
137
137
|
args: [{
|
|
138
138
|
imports: [
|
|
@@ -152,4 +152,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
152
152
|
]
|
|
153
153
|
}]
|
|
154
154
|
}] });
|
|
155
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYnJzLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21lbWJycy9zcmMvbGliL21lbWJycy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBaUMsTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsU0FBUyxFQUFlLE1BQU0sb0JBQW9CLENBQUM7QUFDNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBR2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUM7O0FBRXhDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRztJQUMzQixLQUFLLEVBQUUsU0FBUztJQUNoQixJQUFJLEVBQUUsQ0FBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsQ0FBRTtJQUNsRSxTQUFTLEVBQUUsaUJBQWlCO0NBQy9CLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsS0FBSyxFQUFFLFNBQVM7SUFDaEIsSUFBSSxFQUFFLENBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsbUJBQW1CLENBQUU7SUFDbEUsU0FBUyxFQUFFLGdCQUFnQjtDQUM1QixDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUF1QjtJQUMvQyxJQUFJLEVBQUUsU0FBUztJQUNmLEdBQUcsRUFBRSxnQkFBZ0I7SUFDckIsS0FBSyxFQUFFLEVBQUc7SUFDVixPQUFPLEVBQUU7UUFDTixjQUFjO0tBQ2hCO0NBQ0QsQ0FBQTtBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxZQUF5QjtJQUV6Riw0QkFBNEI7SUFDNUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyx5Q0FBeUM7UUFDekMseUNBQXlDO1FBQ3pDLGFBQWEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBQyxFQUFFO1lBQzlELElBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxFQUFDO2dCQUMvQyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUE7Z0JBQzlELFlBQVksQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtnQkFDaEQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO2FBQ3BDO2lCQUFLO2dCQUNKLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUMsT0FBTyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUE7YUFDdkU7WUFDRCxNQUFNLEVBQUUsQ0FBQTtRQUNaLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUEsRUFBRTtZQUNaLHlDQUF5QztZQUN6QyxvQkFBb0I7WUFDcEIsMENBQTBDO1lBQzFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNqQixDQUFDLENBQUMsQ0FBQTtJQUVQLENBQUMsQ0FBQyxDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxZQUF5QjtJQUU1Riw0QkFBNEI7SUFDNUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQywwQ0FBMEM7UUFFMUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBQyxFQUFFO1lBQ3ZDLElBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxFQUFDO2dCQUMvQyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUE7Z0JBQzlELFlBQVksQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtnQkFDaEQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO2FBQ3BDO1lBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2YsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQSxFQUFFO1lBQ2QsWUFBWSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3ZFLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUE7WUFDekMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2YsQ0FBQyxDQUFDLENBQUE7SUFFTixDQUFDLENBQUMsQ0FBQTtBQUNGLENBQUM7QUFFRCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsTUFBTTtJQUN0QyxxQ0FBcUM7SUFDckMsc0JBQXNCO0lBQ3RCLE9BQU87UUFDTCxXQUFXLEVBQUUsR0FBRyxFQUFFO1lBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtZQUM1RCxPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELGNBQWMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7S0FDN0IsQ0FBQTtBQUNILENBQUM7QUFHRCw2QkFBNkI7QUFDN0IsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHO0lBQ2xCLFlBQVk7Q0FDZixDQUFBO0FBdUJELE1BQU0sT0FBTyxZQUFZO0lBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBb0I7UUFHakMsTUFBTSxlQUFlLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQztZQUM5QyxNQUFNLEVBQUUsTUFBTTtZQUNkLE1BQU0sRUFBRSxjQUFjO1NBQ3ZCLENBQUMsQ0FBQyxTQUFTLENBQUE7UUFFWixlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7WUFDckMsTUFBTSxFQUFFO2dCQUNOLFdBQVcsRUFBRSxhQUFhO2dCQUMxQixjQUFjLEVBQUUsRUFBRTthQUNuQjtTQUNGLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUViLGVBQWUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDbkMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxtQkFBbUIsRUFBQyxRQUFRLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQztRQUd0RSxPQUFPO1lBQ0wsUUFBUSxFQUFFLFlBQVk7WUFDdEIsU0FBUyxFQUFFLGVBQWUsQ0FBQyxtREFBbUQ7U0FDL0UsQ0FBQztJQUVKLENBQUM7OzBHQXpCVSxZQUFZOzJHQUFaLFlBQVksWUFsQnJCLFlBQVk7UUFDWixnQkFBZ0I7UUFDaEIsU0FBUztRQUNULHNCQUFzQjtRQUN0QixjQUFjO1FBQ2QsaUNBQWlDO1FBQ2pDLE1BQU07UUFDTixLQUFLO1FBQ0wsNEJBQTRCO1FBQzVCLG9CQUFvQjtRQUNwQiw0QkFBNEI7UUFDNUIsTUFBTTtRQUNOLHdCQUF3Qjs7MkdBTWYsWUFBWSxZQWxCckIsWUFBWTtRQUNaLGdCQUFnQjtRQUNoQixTQUFTO1FBQ1Qsc0JBQXNCO1FBQ3RCLGNBQWM7UUFDZCxpQ0FBaUM7UUFDakMsTUFBTTtRQUNOLEtBQUs7UUFDTCw0QkFBNEI7UUFDNUIsb0JBQW9CO1FBQ3BCLDRCQUE0QjtRQUM1QixNQUFNO1FBQ04sd0JBQXdCOzs0RkFNZixZQUFZO2tCQXBCeEIsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixnQkFBZ0I7d0JBQ2hCLFNBQVM7d0JBQ1Qsc0JBQXNCO3dCQUN0QixjQUFjO3dCQUNkLGlDQUFpQzt3QkFDakMsTUFBTTt3QkFDTixLQUFLO3dCQUNMLDRCQUE0Qjt3QkFDNUIsb0JBQW9CO3dCQUNwQiw0QkFBNEI7d0JBQzVCLE1BQU07d0JBQ04sd0JBQXdCO3FCQUN6QjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1lbWJyc1NlcnZpY2UgfSBmcm9tICcuL21lbWJycy5zZXJ2aWNlJztcbmltcG9ydCB7IEp3dE1vZHVsZSwgSldUX09QVElPTlMgfSBmcm9tIFwiQGF1dGgwL2FuZ3VsYXItand0XCI7XG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5pbXBvcnQgeyBVSVJvdXRlck1vZHVsZSB9IGZyb20gJ0B1aXJvdXRlci9hbmd1bGFyJ1xuXG5pbXBvcnQgeyBOZzJTdGF0ZURlY2xhcmF0aW9uIH0gZnJvbSAnQHVpcm91dGVyL2FuZ3VsYXInO1xuaW1wb3J0IHsgVHJhbnNpdGlvbiwgVUlSb3V0ZXIgfSBmcm9tICdAdWlyb3V0ZXIvYW5ndWxhcidcblxuaW1wb3J0IHsgcm91dGVyQ29uZmlnRm4gfSBmcm9tICcuL3JvdXRlci5jb25maWcnO1xuaW1wb3J0IHsgTWVtYnJzQ29uZmlnIH0gZnJvbSAnLi9jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IE1lbWJyc0NvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IHJldHJpZXZlVG9rZW4gfSBmcm9tICcuL3Rva2VuJztcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUmVzb2x2ZSA9IHtcbiAgICB0b2tlbjogJ3JlaXNzdWUnLFxuICAgIGRlcHM6IFsgVHJhbnNpdGlvbiwgVUlSb3V0ZXIsIE1lbWJyc1NlcnZpY2UsIE1lbWJyc0NvbmZpZ1NlcnZpY2UgXSxcbiAgICByZXNvbHZlRm46IHZhbGlkYXRlUmVzb2x2ZUZuXG59XG5cbmV4cG9ydCBjb25zdCByZWlzc3VlUmVzb2x2ZSA9IHtcbiAgdG9rZW46ICdyZWlzc3VlJyxcbiAgZGVwczogWyBUcmFuc2l0aW9uLCBVSVJvdXRlciwgTWVtYnJzU2VydmljZSwgTWVtYnJzQ29uZmlnU2VydmljZSBdLFxuICByZXNvbHZlRm46IHJlaXNzdWVSZXNvbHZlRm5cbn1cblxuZXhwb3J0IGNvbnN0IHJlaXNzdWVTdGF0ZTpOZzJTdGF0ZURlY2xhcmF0aW9uID0ge1xuXHRuYW1lOiAncmVpc3N1ZScsIFxuXHR1cmw6ICcvcmVpc3N1ZT90b2tlbicsXG5cdHZpZXdzOiB7IH0sXG5cdHJlc29sdmU6IFtcbiAgICByZWlzc3VlUmVzb2x2ZVxuXHRdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWlzc3VlUmVzb2x2ZUZuKHRyYW5zaXRpb24sIHJvdXRlciwgbWVtYnJzU2VydmljZSwgbWVtYnJzQ29uZmlnOk1lbWJyc0NvbmZpZykge1xuICAgIFxuICAgIC8vY29uc29sZS5sb2cobWVtYnJzU2VydmljZSlcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coJ3JlaXNzdWUgcHJvbWlzZSByZXNvbHZlJylcbiAgICAgIC8vIGNvbnNvbGUubG9nKHRyYW5zaXRpb24ucGFyYW1zKCkudG9rZW4pXG4gICAgICBtZW1icnNTZXJ2aWNlLnJlaXNzdWUodHJhbnNpdGlvbi5wYXJhbXMoKS50b2tlbikudGhlbigocmVzcG9uc2UpPT57XG4gICAgICAgICAgaWYobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3JlZGlyZWN0VXJsQWZ0ZXJMb2dpbicpKXtcbiAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3JlZGlyZWN0VXJsQWZ0ZXJMb2dpbicpXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgncmVkaXJlY3RVcmxBZnRlckxvZ2luJylcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSA9IHJlZGlyZWN0XG4gICAgICAgICAgfWVsc2Uge1xuICAgICAgICAgICAgcm91dGVyLnN0YXRlU2VydmljZS5nbyhtZW1icnNDb25maWcuZGVmYXVsdFN0YXRlLCB7fSwge2luaGVyaXQ6ZmFsc2V9KVxuICAgICAgICAgIH1cbiAgICAgICAgICByZWplY3QoKVxuICAgICAgfSkuY2F0Y2goZXJyb3I9PntcbiAgICAgICAgICAvL2NvbnNvbGUubG9nKCdlcnJvciBpbiByZWlzc3VlIHJlc29sdmUnKVxuICAgICAgICAgIC8vY29uc29sZS5sb2coZXJyb3IpXG4gICAgICAgICAgLy93aW5kb3cubG9jYXRpb24uaHJlZiA9IGVudmlyb25tZW50LmxvZ2luXG4gICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgfSlcblxuXHR9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSZXNvbHZlRm4odHJhbnNpdGlvbiwgcm91dGVyLCBtZW1icnNTZXJ2aWNlLCBtZW1icnNDb25maWc6TWVtYnJzQ29uZmlnKSB7XG4gIFxuICAvL2NvbnNvbGUubG9nKG1lbWJyc1NlcnZpY2UpXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLy8gY29uc29sZS5sb2coJ3ZhbGlkYXRlIHByb21pc2UgcmVzb2x2ZScpXG4gICAgXG4gICAgbWVtYnJzU2VydmljZS5yZWlzc3VlKCkudGhlbigocmVzcG9uc2UpPT57XG4gICAgICBpZihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncmVkaXJlY3RVcmxBZnRlckxvZ2luJykpe1xuICAgICAgICBjb25zdCByZWRpcmVjdCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdyZWRpcmVjdFVybEFmdGVyTG9naW4nKVxuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgncmVkaXJlY3RVcmxBZnRlckxvZ2luJylcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lID0gcmVkaXJlY3RcbiAgICAgIH1cbiAgICAgIHJlc29sdmUobnVsbClcbiAgICB9KS5jYXRjaChlcnJvcj0+e1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3JlZGlyZWN0VXJsQWZ0ZXJMb2dpbicsIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSlcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gbWVtYnJzQ29uZmlnLmxvZ2luXG4gICAgICByZWplY3QoZXJyb3IpXG4gICAgfSlcblxufSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGp3dE9wdGlvbnNGYWN0b3J5KGNvbmZpZykge1xuICAvLyBjb25zb2xlLmxvZygnand0IG9wdGlvbnMgZmFjdG9yeScpXG4gIC8vIGNvbnNvbGUubG9nKGNvbmZpZylcbiAgcmV0dXJuIHtcbiAgICB0b2tlbkdldHRlcjogKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ3Rva2VuIGdldHRlcicsICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbWVtYnJzJykpXG4gICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21lbWJycycpO1xuICAgIH0sXG4gICAgYWxsb3dlZERvbWFpbnM6IFtjb25maWcuYXBpXVxuICB9XG59XG5cblxuLyoqIFRoZSB0b3AgbGV2ZWwgc3RhdGUocykgKi9cbmV4cG9ydCBjb25zdCBTVEFURVMgPSBbXG4gICAgcmVpc3N1ZVN0YXRlXG5dXG5cblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBIdHRwQ2xpZW50TW9kdWxlLFxuICAgIEp3dE1vZHVsZVxuICAgIC8vIEp3dE1vZHVsZS5mb3JSb290KHtcbiAgICAvLyAgIGNvbmZpZzoge1xuICAgIC8vICAgICB0b2tlbkdldHRlcjogcmV0cmlldmVUb2tlblxuICAgIC8vICAgfVxuICAgIC8vIH0pXG4gICAgLy8gVUlSb3V0ZXJNb2R1bGUuZm9yQ2hpbGQoe1xuICAgIC8vICAgc3RhdGVzOiBTVEFURVMsXG4gICAgLy8gICBjb25maWc6IHJvdXRlckNvbmZpZ0ZuLFxuICAgIC8vIH0pLFxuICAgIC8vIEp3dE1vZHVsZS5mb3JSb290KHt9KVxuICBdXG59KVxuXG5cblxuZXhwb3J0IGNsYXNzIE1lbWJyc01vZHVsZSB7IFxuICBzdGF0aWMgZm9yUm9vdChjb25maWc6IE1lbWJyc0NvbmZpZyk6IE1vZHVsZVdpdGhQcm92aWRlcnM8TWVtYnJzTW9kdWxlPiB7XG5cblxuICAgIGNvbnN0IG1vZHVsZVByb3ZpZGVycyA9IFVJUm91dGVyTW9kdWxlLmZvckNoaWxkKHtcbiAgICAgIHN0YXRlczogU1RBVEVTLFxuICAgICAgY29uZmlnOiByb3V0ZXJDb25maWdGblxuICAgIH0pLnByb3ZpZGVyc1xuXG4gICAgbW9kdWxlUHJvdmlkZXJzLnB1c2goSnd0TW9kdWxlLmZvclJvb3Qoe1xuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHRva2VuR2V0dGVyOiByZXRyaWV2ZVRva2VuLFxuICAgICAgICBhbGxvd2VkRG9tYWluczogW11cbiAgICAgIH1cbiAgICB9KS5wcm92aWRlcnMpXG4gICAgICBcbiAgICBtb2R1bGVQcm92aWRlcnMucHVzaChNZW1icnNTZXJ2aWNlKVxuICAgIG1vZHVsZVByb3ZpZGVycy5wdXNoKHtwcm92aWRlOiBNZW1icnNDb25maWdTZXJ2aWNlLHVzZVZhbHVlOiBjb25maWd9KTtcbiAgICBcbiAgIFxuICAgIHJldHVybiB7XG4gICAgICBuZ01vZHVsZTogTWVtYnJzTW9kdWxlLCBcbiAgICAgIHByb3ZpZGVyczogbW9kdWxlUHJvdmlkZXJzIC8vW3twcm92aWRlOiBNZW1icnNDb25maWdTZXJ2aWNlLHVzZVZhbHVlOiBjb25maWd9XVxuICAgIH07XG4gICAgXG4gIH1cblxufVxuIl19
|
|
155
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYnJzLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21lbWJycy9zcmMvbGliL21lbWJycy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBaUMsTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsU0FBUyxFQUFlLE1BQU0sb0JBQW9CLENBQUM7QUFDNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBR2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUM7O0FBRXhDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRztJQUMzQixLQUFLLEVBQUUsU0FBUztJQUNoQixJQUFJLEVBQUUsQ0FBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsQ0FBRTtJQUNsRSxTQUFTLEVBQUUsaUJBQWlCO0NBQy9CLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsS0FBSyxFQUFFLFNBQVM7SUFDaEIsSUFBSSxFQUFFLENBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsbUJBQW1CLENBQUU7SUFDbEUsU0FBUyxFQUFFLGdCQUFnQjtDQUM1QixDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUF1QjtJQUMvQyxJQUFJLEVBQUUsU0FBUztJQUNmLEdBQUcsRUFBRSxnQkFBZ0I7SUFDckIsS0FBSyxFQUFFLEVBQUc7SUFDVixPQUFPLEVBQUU7UUFDTixjQUFjO0tBQ2hCO0NBQ0QsQ0FBQTtBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxZQUF5QjtJQUV6Riw0QkFBNEI7SUFDNUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyx5Q0FBeUM7UUFDekMseUNBQXlDO1FBQ3pDLGFBQWEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBQyxFQUFFO1lBQzlELElBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxFQUFDO2dCQUMvQyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUE7Z0JBQzlELFlBQVksQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtnQkFDaEQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO2FBQ3BDO2lCQUFLO2dCQUNKLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUMsT0FBTyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUE7YUFDdkU7WUFDRCxNQUFNLEVBQUUsQ0FBQTtRQUNaLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUEsRUFBRTtZQUNaLHlDQUF5QztZQUN6QyxvQkFBb0I7WUFDcEIsMENBQTBDO1lBQzFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNqQixDQUFDLENBQUMsQ0FBQTtJQUVQLENBQUMsQ0FBQyxDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxZQUF5QjtJQUU1Riw0QkFBNEI7SUFDNUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQywwQ0FBMEM7UUFFMUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBQyxFQUFFO1lBQ3ZDLElBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxFQUFDO2dCQUMvQyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUE7Z0JBQzlELFlBQVksQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtnQkFDaEQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO2FBQ3BDO1lBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2YsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQSxFQUFFO1lBQ2QsWUFBWSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3ZFLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUE7WUFDekMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2YsQ0FBQyxDQUFDLENBQUE7SUFFTixDQUFDLENBQUMsQ0FBQTtBQUNGLENBQUM7QUFFRCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsTUFBTTtJQUN0QyxxQ0FBcUM7SUFDckMsc0JBQXNCO0lBQ3RCLE9BQU87UUFDTCxXQUFXLEVBQUUsR0FBRyxFQUFFO1lBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtZQUM1RCxPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELGNBQWMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7S0FDN0IsQ0FBQTtBQUNILENBQUM7QUFHRCw2QkFBNkI7QUFDN0IsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHO0lBQ2xCLFlBQVk7Q0FDZixDQUFBO0FBdUJELE1BQU0sT0FBTyxZQUFZO0lBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBb0I7UUFHakMsTUFBTSxlQUFlLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQztZQUM5QyxNQUFNLEVBQUUsTUFBTTtZQUNkLE1BQU0sRUFBRSxjQUFjO1NBQ3ZCLENBQUMsQ0FBQyxTQUFTLENBQUE7UUFFWixlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7WUFDckMsTUFBTSxFQUFFO2dCQUNOLFdBQVcsRUFBRSxhQUFhO2dCQUMxQixjQUFjLEVBQUUsRUFBRTthQUNuQjtTQUNGLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUViLGVBQWUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDbkMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxtQkFBbUIsRUFBQyxRQUFRLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQztRQUd0RSxPQUFPO1lBQ0wsUUFBUSxFQUFFLFlBQVk7WUFDdEIsU0FBUyxFQUFFLGVBQWUsQ0FBQyxtREFBbUQ7U0FDL0UsQ0FBQztJQUVKLENBQUM7d0dBekJVLFlBQVk7eUdBQVosWUFBWSxZQWxCckIsWUFBWTtZQUNaLGdCQUFnQjtZQUNoQixTQUFTO1lBQ1Qsc0JBQXNCO1lBQ3RCLGNBQWM7WUFDZCxpQ0FBaUM7WUFDakMsTUFBTTtZQUNOLEtBQUs7WUFDTCw0QkFBNEI7WUFDNUIsb0JBQW9CO1lBQ3BCLDRCQUE0QjtZQUM1QixNQUFNO1lBQ04sd0JBQXdCOzt5R0FNZixZQUFZLFlBbEJyQixZQUFZO1lBQ1osZ0JBQWdCO1lBQ2hCLFNBQVM7WUFDVCxzQkFBc0I7WUFDdEIsY0FBYztZQUNkLGlDQUFpQztZQUNqQyxNQUFNO1lBQ04sS0FBSztZQUNMLDRCQUE0QjtZQUM1QixvQkFBb0I7WUFDcEIsNEJBQTRCO1lBQzVCLE1BQU07WUFDTix3QkFBd0I7Ozs0RkFNZixZQUFZO2tCQXBCeEIsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixnQkFBZ0I7d0JBQ2hCLFNBQVM7d0JBQ1Qsc0JBQXNCO3dCQUN0QixjQUFjO3dCQUNkLGlDQUFpQzt3QkFDakMsTUFBTTt3QkFDTixLQUFLO3dCQUNMLDRCQUE0Qjt3QkFDNUIsb0JBQW9CO3dCQUNwQiw0QkFBNEI7d0JBQzVCLE1BQU07d0JBQ04sd0JBQXdCO3FCQUN6QjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1lbWJyc1NlcnZpY2UgfSBmcm9tICcuL21lbWJycy5zZXJ2aWNlJztcbmltcG9ydCB7IEp3dE1vZHVsZSwgSldUX09QVElPTlMgfSBmcm9tIFwiQGF1dGgwL2FuZ3VsYXItand0XCI7XG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5pbXBvcnQgeyBVSVJvdXRlck1vZHVsZSB9IGZyb20gJ0B1aXJvdXRlci9hbmd1bGFyJ1xuXG5pbXBvcnQgeyBOZzJTdGF0ZURlY2xhcmF0aW9uIH0gZnJvbSAnQHVpcm91dGVyL2FuZ3VsYXInO1xuaW1wb3J0IHsgVHJhbnNpdGlvbiwgVUlSb3V0ZXIgfSBmcm9tICdAdWlyb3V0ZXIvYW5ndWxhcidcblxuaW1wb3J0IHsgcm91dGVyQ29uZmlnRm4gfSBmcm9tICcuL3JvdXRlci5jb25maWcnO1xuaW1wb3J0IHsgTWVtYnJzQ29uZmlnIH0gZnJvbSAnLi9jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IE1lbWJyc0NvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IHJldHJpZXZlVG9rZW4gfSBmcm9tICcuL3Rva2VuJztcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUmVzb2x2ZSA9IHtcbiAgICB0b2tlbjogJ3JlaXNzdWUnLFxuICAgIGRlcHM6IFsgVHJhbnNpdGlvbiwgVUlSb3V0ZXIsIE1lbWJyc1NlcnZpY2UsIE1lbWJyc0NvbmZpZ1NlcnZpY2UgXSxcbiAgICByZXNvbHZlRm46IHZhbGlkYXRlUmVzb2x2ZUZuXG59XG5cbmV4cG9ydCBjb25zdCByZWlzc3VlUmVzb2x2ZSA9IHtcbiAgdG9rZW46ICdyZWlzc3VlJyxcbiAgZGVwczogWyBUcmFuc2l0aW9uLCBVSVJvdXRlciwgTWVtYnJzU2VydmljZSwgTWVtYnJzQ29uZmlnU2VydmljZSBdLFxuICByZXNvbHZlRm46IHJlaXNzdWVSZXNvbHZlRm5cbn1cblxuZXhwb3J0IGNvbnN0IHJlaXNzdWVTdGF0ZTpOZzJTdGF0ZURlY2xhcmF0aW9uID0ge1xuXHRuYW1lOiAncmVpc3N1ZScsIFxuXHR1cmw6ICcvcmVpc3N1ZT90b2tlbicsXG5cdHZpZXdzOiB7IH0sXG5cdHJlc29sdmU6IFtcbiAgICByZWlzc3VlUmVzb2x2ZVxuXHRdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWlzc3VlUmVzb2x2ZUZuKHRyYW5zaXRpb24sIHJvdXRlciwgbWVtYnJzU2VydmljZSwgbWVtYnJzQ29uZmlnOk1lbWJyc0NvbmZpZykge1xuICAgIFxuICAgIC8vY29uc29sZS5sb2cobWVtYnJzU2VydmljZSlcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coJ3JlaXNzdWUgcHJvbWlzZSByZXNvbHZlJylcbiAgICAgIC8vIGNvbnNvbGUubG9nKHRyYW5zaXRpb24ucGFyYW1zKCkudG9rZW4pXG4gICAgICBtZW1icnNTZXJ2aWNlLnJlaXNzdWUodHJhbnNpdGlvbi5wYXJhbXMoKS50b2tlbikudGhlbigocmVzcG9uc2UpPT57XG4gICAgICAgICAgaWYobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3JlZGlyZWN0VXJsQWZ0ZXJMb2dpbicpKXtcbiAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3JlZGlyZWN0VXJsQWZ0ZXJMb2dpbicpXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgncmVkaXJlY3RVcmxBZnRlckxvZ2luJylcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSA9IHJlZGlyZWN0XG4gICAgICAgICAgfWVsc2Uge1xuICAgICAgICAgICAgcm91dGVyLnN0YXRlU2VydmljZS5nbyhtZW1icnNDb25maWcuZGVmYXVsdFN0YXRlLCB7fSwge2luaGVyaXQ6ZmFsc2V9KVxuICAgICAgICAgIH1cbiAgICAgICAgICByZWplY3QoKVxuICAgICAgfSkuY2F0Y2goZXJyb3I9PntcbiAgICAgICAgICAvL2NvbnNvbGUubG9nKCdlcnJvciBpbiByZWlzc3VlIHJlc29sdmUnKVxuICAgICAgICAgIC8vY29uc29sZS5sb2coZXJyb3IpXG4gICAgICAgICAgLy93aW5kb3cubG9jYXRpb24uaHJlZiA9IGVudmlyb25tZW50LmxvZ2luXG4gICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgfSlcblxuXHR9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSZXNvbHZlRm4odHJhbnNpdGlvbiwgcm91dGVyLCBtZW1icnNTZXJ2aWNlLCBtZW1icnNDb25maWc6TWVtYnJzQ29uZmlnKSB7XG4gIFxuICAvL2NvbnNvbGUubG9nKG1lbWJyc1NlcnZpY2UpXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLy8gY29uc29sZS5sb2coJ3ZhbGlkYXRlIHByb21pc2UgcmVzb2x2ZScpXG4gICAgXG4gICAgbWVtYnJzU2VydmljZS5yZWlzc3VlKCkudGhlbigocmVzcG9uc2UpPT57XG4gICAgICBpZihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncmVkaXJlY3RVcmxBZnRlckxvZ2luJykpe1xuICAgICAgICBjb25zdCByZWRpcmVjdCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdyZWRpcmVjdFVybEFmdGVyTG9naW4nKVxuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgncmVkaXJlY3RVcmxBZnRlckxvZ2luJylcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lID0gcmVkaXJlY3RcbiAgICAgIH1cbiAgICAgIHJlc29sdmUobnVsbClcbiAgICB9KS5jYXRjaChlcnJvcj0+e1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3JlZGlyZWN0VXJsQWZ0ZXJMb2dpbicsIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSlcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gbWVtYnJzQ29uZmlnLmxvZ2luXG4gICAgICByZWplY3QoZXJyb3IpXG4gICAgfSlcblxufSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGp3dE9wdGlvbnNGYWN0b3J5KGNvbmZpZykge1xuICAvLyBjb25zb2xlLmxvZygnand0IG9wdGlvbnMgZmFjdG9yeScpXG4gIC8vIGNvbnNvbGUubG9nKGNvbmZpZylcbiAgcmV0dXJuIHtcbiAgICB0b2tlbkdldHRlcjogKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ3Rva2VuIGdldHRlcicsICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbWVtYnJzJykpXG4gICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21lbWJycycpO1xuICAgIH0sXG4gICAgYWxsb3dlZERvbWFpbnM6IFtjb25maWcuYXBpXVxuICB9XG59XG5cblxuLyoqIFRoZSB0b3AgbGV2ZWwgc3RhdGUocykgKi9cbmV4cG9ydCBjb25zdCBTVEFURVMgPSBbXG4gICAgcmVpc3N1ZVN0YXRlXG5dXG5cblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBIdHRwQ2xpZW50TW9kdWxlLFxuICAgIEp3dE1vZHVsZVxuICAgIC8vIEp3dE1vZHVsZS5mb3JSb290KHtcbiAgICAvLyAgIGNvbmZpZzoge1xuICAgIC8vICAgICB0b2tlbkdldHRlcjogcmV0cmlldmVUb2tlblxuICAgIC8vICAgfVxuICAgIC8vIH0pXG4gICAgLy8gVUlSb3V0ZXJNb2R1bGUuZm9yQ2hpbGQoe1xuICAgIC8vICAgc3RhdGVzOiBTVEFURVMsXG4gICAgLy8gICBjb25maWc6IHJvdXRlckNvbmZpZ0ZuLFxuICAgIC8vIH0pLFxuICAgIC8vIEp3dE1vZHVsZS5mb3JSb290KHt9KVxuICBdXG59KVxuXG5cblxuZXhwb3J0IGNsYXNzIE1lbWJyc01vZHVsZSB7IFxuICBzdGF0aWMgZm9yUm9vdChjb25maWc6IE1lbWJyc0NvbmZpZyk6IE1vZHVsZVdpdGhQcm92aWRlcnM8TWVtYnJzTW9kdWxlPiB7XG5cblxuICAgIGNvbnN0IG1vZHVsZVByb3ZpZGVycyA9IFVJUm91dGVyTW9kdWxlLmZvckNoaWxkKHtcbiAgICAgIHN0YXRlczogU1RBVEVTLFxuICAgICAgY29uZmlnOiByb3V0ZXJDb25maWdGblxuICAgIH0pLnByb3ZpZGVyc1xuXG4gICAgbW9kdWxlUHJvdmlkZXJzLnB1c2goSnd0TW9kdWxlLmZvclJvb3Qoe1xuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHRva2VuR2V0dGVyOiByZXRyaWV2ZVRva2VuLFxuICAgICAgICBhbGxvd2VkRG9tYWluczogW11cbiAgICAgIH1cbiAgICB9KS5wcm92aWRlcnMpXG4gICAgICBcbiAgICBtb2R1bGVQcm92aWRlcnMucHVzaChNZW1icnNTZXJ2aWNlKVxuICAgIG1vZHVsZVByb3ZpZGVycy5wdXNoKHtwcm92aWRlOiBNZW1icnNDb25maWdTZXJ2aWNlLHVzZVZhbHVlOiBjb25maWd9KTtcbiAgICBcbiAgIFxuICAgIHJldHVybiB7XG4gICAgICBuZ01vZHVsZTogTWVtYnJzTW9kdWxlLCBcbiAgICAgIHByb3ZpZGVyczogbW9kdWxlUHJvdmlkZXJzIC8vW3twcm92aWRlOiBNZW1icnNDb25maWdTZXJ2aWNlLHVzZVZhbHVlOiBjb25maWd9XVxuICAgIH07XG4gICAgXG4gIH1cblxufVxuIl19
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { Injectable, Inject } from '@angular/core';
|
|
2
|
+
import { JwtHelperService } from '@auth0/angular-jwt';
|
|
3
|
+
import { MembrsConfigService } from './config.service';
|
|
4
|
+
import { BehaviorSubject } from 'rxjs';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common/http";
|
|
7
|
+
const jwtService = new JwtHelperService();
|
|
8
|
+
export class MembrsService {
|
|
9
|
+
http;
|
|
10
|
+
config;
|
|
11
|
+
_token;
|
|
12
|
+
_decoded;
|
|
13
|
+
decodedReady = new BehaviorSubject(null);
|
|
14
|
+
_lsKey = 'membrs';
|
|
15
|
+
_loggedInObservable = new BehaviorSubject(false);
|
|
16
|
+
constructor(http, config) {
|
|
17
|
+
this.http = http;
|
|
18
|
+
this.config = config;
|
|
19
|
+
// console.log('membrs constructor')
|
|
20
|
+
// if the token exists in local storage, retrieve it back to the service
|
|
21
|
+
if (localStorage.getItem(this._lsKey)) {
|
|
22
|
+
this.token = localStorage.getItem(this._lsKey);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
reissue(token) {
|
|
26
|
+
console.log('Reissuing token...'); // Log function entry
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
if (!token && !this._token) {
|
|
29
|
+
console.log('No token provided and no token found.'); // Log missing token
|
|
30
|
+
reject('NOT_LOGGED_IN');
|
|
31
|
+
}
|
|
32
|
+
if (token) {
|
|
33
|
+
console.log(`Token provided: ${token}`); // Log provided token
|
|
34
|
+
this.token = token;
|
|
35
|
+
}
|
|
36
|
+
// check stored token has not expired, or needs to be reissued soon
|
|
37
|
+
var reissueIn = this._decoded.exp - Math.floor(Date.now() / 1000);
|
|
38
|
+
// token has expired
|
|
39
|
+
if (reissueIn < 0) {
|
|
40
|
+
console.log('Token has expired.'); // Log expired token
|
|
41
|
+
reject('NOT_LOGGED_IN');
|
|
42
|
+
}
|
|
43
|
+
// token expiring soon
|
|
44
|
+
if (reissueIn < 300) {
|
|
45
|
+
console.log('Token expiring soon. Reissuing...'); // Log imminent expiration
|
|
46
|
+
this.http.post(this.config.apiProtocol + this.config.api + '/token/' + this._token, {}).subscribe((response) => {
|
|
47
|
+
if (response.token) {
|
|
48
|
+
this.token = response.token;
|
|
49
|
+
this._loggedInObservable.next(true);
|
|
50
|
+
console.log('Token successfully reissued.'); // Log success
|
|
51
|
+
resolve(this._token);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
console.log('Failed to reissue token.'); // Log failure
|
|
55
|
+
reject('NOT_LOGGED_IN');
|
|
56
|
+
}
|
|
57
|
+
}, (error) => {
|
|
58
|
+
console.log('Error reissuing token:', error); // Log error details
|
|
59
|
+
reject('NOT_LOGGED_IN');
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
this._loggedInObservable.next(true);
|
|
64
|
+
console.log('Token is valid. No need to reissue.'); // Log valid token
|
|
65
|
+
resolve(this._token);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
set token(token) {
|
|
70
|
+
this._token = token;
|
|
71
|
+
console.log('Token set.');
|
|
72
|
+
localStorage.setItem(this._lsKey, token);
|
|
73
|
+
this._decoded = jwtService.decodeToken(this._token);
|
|
74
|
+
}
|
|
75
|
+
deleteToken() {
|
|
76
|
+
localStorage.removeItem(this._lsKey);
|
|
77
|
+
}
|
|
78
|
+
isLoggedIn() {
|
|
79
|
+
return this.token ? true : false;
|
|
80
|
+
}
|
|
81
|
+
get profile() {
|
|
82
|
+
return this._decoded;
|
|
83
|
+
}
|
|
84
|
+
setProfile(decodedData) {
|
|
85
|
+
this._decoded = decodedData;
|
|
86
|
+
this.decodedReady.next(decodedData); // Emit the new value when profile is set
|
|
87
|
+
console.log(this.decodedReady);
|
|
88
|
+
}
|
|
89
|
+
get decodedReady$() {
|
|
90
|
+
return this.decodedReady.asObservable();
|
|
91
|
+
}
|
|
92
|
+
get token() {
|
|
93
|
+
return this._token;
|
|
94
|
+
}
|
|
95
|
+
get admin() {
|
|
96
|
+
return this.profile.permission == 1;
|
|
97
|
+
}
|
|
98
|
+
get isLoggedInObservable() {
|
|
99
|
+
return this._loggedInObservable;
|
|
100
|
+
}
|
|
101
|
+
logout() {
|
|
102
|
+
return new Promise((resolve, reject) => {
|
|
103
|
+
this.http.delete(this.config.apiProtocol + this.config.api + '/token/' + this._token).subscribe((response) => {
|
|
104
|
+
this._token = null;
|
|
105
|
+
localStorage.removeItem(this._lsKey);
|
|
106
|
+
resolve(this.config.login);
|
|
107
|
+
}, error => {
|
|
108
|
+
// If the API call fails (e.g. token already invalid/expired), still clear local state
|
|
109
|
+
console.warn('Logout API call failed, clearing local token anyway', error);
|
|
110
|
+
this._token = null;
|
|
111
|
+
localStorage.removeItem(this._lsKey);
|
|
112
|
+
resolve(this.config.login);
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MembrsService, deps: [{ token: i1.HttpClient }, { token: MembrsConfigService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
117
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MembrsService, providedIn: 'root' });
|
|
118
|
+
}
|
|
119
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MembrsService, decorators: [{
|
|
120
|
+
type: Injectable,
|
|
121
|
+
args: [{
|
|
122
|
+
providedIn: 'root'
|
|
123
|
+
}]
|
|
124
|
+
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: undefined, decorators: [{
|
|
125
|
+
type: Inject,
|
|
126
|
+
args: [MembrsConfigService]
|
|
127
|
+
}] }] });
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYnJzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tZW1icnMvc3JjL2xpYi9tZW1icnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUV0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7QUFDdkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFBO0FBT3pDLE1BQU0sT0FBTyxhQUFhO0lBVUo7SUFBdUQ7SUFSM0UsTUFBTSxDQUFTO0lBQ2YsUUFBUSxDQUFNO0lBRVAsWUFBWSxHQUFHLElBQUksZUFBZSxDQUFNLElBQUksQ0FBQyxDQUFDO0lBRXJELE1BQU0sR0FBVyxRQUFRLENBQUM7SUFDMUIsbUJBQW1CLEdBQTZCLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRTFFLFlBQW9CLElBQWdCLEVBQXVDLE1BQW9CO1FBQTNFLFNBQUksR0FBSixJQUFJLENBQVk7UUFBdUMsV0FBTSxHQUFOLE1BQU0sQ0FBYztRQUU3RixvQ0FBb0M7UUFDcEMsd0VBQXdFO1FBQ3hFLElBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUM7WUFDbkMsSUFBSSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtTQUMvQztJQUVILENBQUM7SUFFRCxPQUFPLENBQUMsS0FBYztRQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxxQkFBcUI7UUFFeEQsT0FBTyxJQUFJLE9B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O2dCQUNuQixZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDckMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFO2dCQUNULHNGQUFzRjtnQkFDdEYsT0FBTyxDQUFDLElBQUksQ0FBQyxxREFBcUQsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDM0UsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQ25CLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNyQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0EvSFUsYUFBYSw0Q0FVc0IsbUJBQW1COzRHQVZ0RCxhQUFhLGNBSlosTUFBTTs7NEZBSVAsYUFBYTtrQkFMekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQWF3QyxNQUFNOzJCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSnd0SGVscGVyU2VydmljZSB9IGZyb20gJ0BhdXRoMC9hbmd1bGFyLWp3dCc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnXG5pbXBvcnQgeyBNZW1icnNDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi9jb25maWcuc2VydmljZSdcbmltcG9ydCB7IE1lbWJyc0NvbmZpZyB9IGZyb20gJy4vY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmNvbnN0IGp3dFNlcnZpY2UgPSBuZXcgSnd0SGVscGVyU2VydmljZSgpXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuXG5cbmV4cG9ydCBjbGFzcyBNZW1icnNTZXJ2aWNlIHtcblxuICBfdG9rZW46IHN0cmluZztcbiAgX2RlY29kZWQ6IGFueTtcblxuICBwdWJsaWMgZGVjb2RlZFJlYWR5ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpO1xuXG4gIF9sc0tleTogc3RyaW5nID0gJ21lbWJycyc7XG4gIF9sb2dnZWRJbk9ic2VydmFibGU6IEJlaGF2aW9yU3ViamVjdDxCb29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpXG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBASW5qZWN0KE1lbWJyc0NvbmZpZ1NlcnZpY2UpIHByaXZhdGUgY29uZmlnOiBNZW1icnNDb25maWcpIHtcblxuICAgIC8vIGNvbnNvbGUubG9nKCdtZW1icnMgY29uc3RydWN0b3InKVxuICAgIC8vIGlmIHRoZSB0b2tlbiBleGlzdHMgaW4gbG9jYWwgc3RvcmFnZSwgcmV0cmlldmUgaXQgYmFjayB0byB0aGUgc2VydmljZVxuICAgIGlmKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuX2xzS2V5KSl7XG4gICAgICB0aGlzLnRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5fbHNLZXkpXG4gICAgfVxuICBcbiAgfVxuXG4gIHJlaXNzdWUodG9rZW4/OiBzdHJpbmcpIHtcbiAgICBjb25zb2xlLmxvZygnUmVpc3N1aW5nIHRva2VuLi4uJyk7IC8vIExvZyBmdW5jdGlvbiBlbnRyeVxuICAgIFxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIXRva2VuICYmICF0aGlzLl90b2tlbikge1xuICAgICAgICBjb25zb2xlLmxvZygnTm8gdG9rZW4gcHJvdmlkZWQgYW5kIG5vIHRva2VuIGZvdW5kLicpOyAvLyBMb2cgbWlzc2luZyB0b2tlblxuICAgICAgICByZWplY3QoJ05PVF9MT0dHRURfSU4nKTtcbiAgICAgIH1cbiAgXG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgY29uc29sZS5sb2coYFRva2VuIHByb3ZpZGVkOiAke3Rva2VufWApOyAvLyBMb2cgcHJvdmlkZWQgdG9rZW5cbiAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgICAgfVxuICBcbiAgICAgIC8vIGNoZWNrIHN0b3JlZCB0b2tlbiBoYXMgbm90IGV4cGlyZWQsIG9yIG5lZWRzIHRvIGJlIHJlaXNzdWVkIHNvb25cbiAgICAgIHZhciByZWlzc3VlSW4gPSB0aGlzLl9kZWNvZGVkLmV4cCAtIE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICBcbiAgICAgIC8vIHRva2VuIGhhcyBleHBpcmVkXG4gICAgICBpZiAocmVpc3N1ZUluIDwgMCkge1xuICAgICAgICBjb25zb2xlLmxvZygnVG9rZW4gaGFzIGV4cGlyZWQuJyk7IC8vIExvZyBleHBpcmVkIHRva2VuXG4gICAgICAgIHJlamVjdCgnTk9UX0xPR0dFRF9JTicpO1xuICAgICAgfVxuICBcbiAgICAgIC8vIHRva2VuIGV4cGlyaW5nIHNvb25cbiAgICAgIGlmIChyZWlzc3VlSW4gPCAzMDApIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1Rva2VuIGV4cGlyaW5nIHNvb24uIFJlaXNzdWluZy4uLicpOyAvLyBMb2cgaW1taW5lbnQgZXhwaXJhdGlvblxuICAgICAgICB0aGlzLmh0dHAucG9zdCh0aGlzLmNvbmZpZy5hcGlQcm90b2NvbCArIHRoaXMuY29uZmlnLmFwaSArICcvdG9rZW4vJyArIHRoaXMuX3Rva2VuLCB7fSkuc3Vic2NyaWJlKFxuICAgICAgICAgIChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UudG9rZW4pIHtcbiAgICAgICAgICAgICAgdGhpcy50b2tlbiA9IHJlc3BvbnNlLnRva2VuO1xuICAgICAgICAgICAgICB0aGlzLl9sb2dnZWRJbk9ic2VydmFibGUubmV4dCh0cnVlKTtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1Rva2VuIHN1Y2Nlc3NmdWxseSByZWlzc3VlZC4nKTsgLy8gTG9nIHN1Y2Nlc3NcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLl90b2tlbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIHRvIHJlaXNzdWUgdG9rZW4uJyk7IC8vIExvZyBmYWlsdXJlXG4gICAgICAgICAgICAgIHJlamVjdCgnTk9UX0xPR0dFRF9JTicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IgcmVpc3N1aW5nIHRva2VuOicsIGVycm9yKTsgLy8gTG9nIGVycm9yIGRldGFpbHNcbiAgICAgICAgICAgIHJlamVjdCgnTk9UX0xPR0dFRF9JTicpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlZEluT2JzZXJ2YWJsZS5uZXh0KHRydWUpO1xuICAgICAgICBjb25zb2xlLmxvZygnVG9rZW4gaXMgdmFsaWQuIE5vIG5lZWQgdG8gcmVpc3N1ZS4nKTsgLy8gTG9nIHZhbGlkIHRva2VuXG4gICAgICAgIHJlc29sdmUodGhpcy5fdG9rZW4pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIFxuXG4gIHNldCB0b2tlbih0b2tlbil7XG4gICAgdGhpcy5fdG9rZW4gPSB0b2tlblxuICAgIGNvbnNvbGUubG9nKCdUb2tlbiBzZXQuJyk7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5fbHNLZXksIHRva2VuKVxuICAgIHRoaXMuX2RlY29kZWQgPSBqd3RTZXJ2aWNlLmRlY29kZVRva2VuKHRoaXMuX3Rva2VuKVxuICB9XG5cbiAgZGVsZXRlVG9rZW4oKXtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLl9sc0tleSlcbiAgfVxuXG4gIGlzTG9nZ2VkSW4oKXtcbiAgICByZXR1cm4gdGhpcy50b2tlbiA/IHRydWUgOiBmYWxzZVxuICB9XG5cbiAgZ2V0IHByb2ZpbGUoKXtcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlZFxuICB9XG5cbiAgc2V0UHJvZmlsZShkZWNvZGVkRGF0YSkge1xuICAgIHRoaXMuX2RlY29kZWQgPSBkZWNvZGVkRGF0YTtcbiAgICB0aGlzLmRlY29kZWRSZWFkeS5uZXh0KGRlY29kZWREYXRhKTsgLy8gRW1pdCB0aGUgbmV3IHZhbHVlIHdoZW4gcHJvZmlsZSBpcyBzZXRcbiAgICBjb25zb2xlLmxvZyh0aGlzLmRlY29kZWRSZWFkeSk7XG4gIH1cblxuICBnZXQgZGVjb2RlZFJlYWR5JCgpIHtcbiAgICByZXR1cm4gdGhpcy5kZWNvZGVkUmVhZHkuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXQgdG9rZW4oKXtcbiAgICByZXR1cm4gdGhpcy5fdG9rZW5cbiAgfVxuXG4gIGdldCBhZG1pbiAoKXtcbiAgICByZXR1cm4gdGhpcy5wcm9maWxlLnBlcm1pc3Npb24gPT0gMVxuICB9XG5cbiAgZ2V0IGlzTG9nZ2VkSW5PYnNlcnZhYmxlKCl7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2dlZEluT2JzZXJ2YWJsZVxuICB9XG4gIFxuICBsb2dvdXQoKXtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCk9PntcbiAgICAgIHRoaXMuaHR0cC5kZWxldGUodGhpcy5jb25maWcuYXBpUHJvdG9jb2wgKyB0aGlzLmNvbmZpZy5hcGkgKyAnL3Rva2VuLycgKyB0aGlzLl90b2tlbikuc3Vic2NyaWJlKChyZXNwb25zZTphbnkpPT57XG4gICAgICAgIHRoaXMuX3Rva2VuID0gbnVsbDtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5fbHNLZXkpO1xuICAgICAgICByZXNvbHZlKHRoaXMuY29uZmlnLmxvZ2luKTtcbiAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgLy8gSWYgdGhlIEFQSSBjYWxsIGZhaWxzIChlLmcuIHRva2VuIGFscmVhZHkgaW52YWxpZC9leHBpcmVkKSwgc3RpbGwgY2xlYXIgbG9jYWwgc3RhdGVcbiAgICAgICAgY29uc29sZS53YXJuKCdMb2dvdXQgQVBJIGNhbGwgZmFpbGVkLCBjbGVhcmluZyBsb2NhbCB0b2tlbiBhbnl3YXknLCBlcnJvcik7XG4gICAgICAgIHRoaXMuX3Rva2VuID0gbnVsbDtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5fbHNLZXkpO1xuICAgICAgICByZXNvbHZlKHRoaXMuY29uZmlnLmxvZ2luKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cblxufVxuIl19
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken,
|
|
2
|
+
import { InjectionToken, Inject, Injectable, NgModule } from '@angular/core';
|
|
3
3
|
import * as i1$1 from '@auth0/angular-jwt';
|
|
4
4
|
import { JwtHelperService, JwtModule } from '@auth0/angular-jwt';
|
|
5
5
|
import { BehaviorSubject, from, throwError } from 'rxjs';
|
|
@@ -18,12 +18,16 @@ const MembrsConfigService = new InjectionToken("MembrsConfig");
|
|
|
18
18
|
|
|
19
19
|
const jwtService = new JwtHelperService();
|
|
20
20
|
class MembrsService {
|
|
21
|
+
http;
|
|
22
|
+
config;
|
|
23
|
+
_token;
|
|
24
|
+
_decoded;
|
|
25
|
+
decodedReady = new BehaviorSubject(null);
|
|
26
|
+
_lsKey = 'membrs';
|
|
27
|
+
_loggedInObservable = new BehaviorSubject(false);
|
|
21
28
|
constructor(http, config) {
|
|
22
29
|
this.http = http;
|
|
23
30
|
this.config = config;
|
|
24
|
-
this.decodedReady = new BehaviorSubject(null);
|
|
25
|
-
this._lsKey = 'membrs';
|
|
26
|
-
this._loggedInObservable = new BehaviorSubject(false);
|
|
27
31
|
// console.log('membrs constructor')
|
|
28
32
|
// if the token exists in local storage, retrieve it back to the service
|
|
29
33
|
if (localStorage.getItem(this._lsKey)) {
|
|
@@ -121,18 +125,18 @@ class MembrsService {
|
|
|
121
125
|
});
|
|
122
126
|
});
|
|
123
127
|
}
|
|
128
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MembrsService, deps: [{ token: i1.HttpClient }, { token: MembrsConfigService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
129
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MembrsService, providedIn: 'root' });
|
|
124
130
|
}
|
|
125
|
-
|
|
126
|
-
MembrsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MembrsService, providedIn: 'root' });
|
|
127
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MembrsService, decorators: [{
|
|
131
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MembrsService, decorators: [{
|
|
128
132
|
type: Injectable,
|
|
129
133
|
args: [{
|
|
130
134
|
providedIn: 'root'
|
|
131
135
|
}]
|
|
132
|
-
}], ctorParameters:
|
|
136
|
+
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: undefined, decorators: [{
|
|
133
137
|
type: Inject,
|
|
134
138
|
args: [MembrsConfigService]
|
|
135
|
-
}] }]
|
|
139
|
+
}] }] });
|
|
136
140
|
|
|
137
141
|
function routerConfigFn(router, injector) {
|
|
138
142
|
const transitionService = router.transitionService;
|
|
@@ -247,37 +251,37 @@ class MembrsModule {
|
|
|
247
251
|
providers: moduleProviders //[{provide: MembrsConfigService,useValue: config}]
|
|
248
252
|
};
|
|
249
253
|
}
|
|
254
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MembrsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
255
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: MembrsModule, imports: [CommonModule,
|
|
256
|
+
HttpClientModule,
|
|
257
|
+
JwtModule
|
|
258
|
+
// JwtModule.forRoot({
|
|
259
|
+
// config: {
|
|
260
|
+
// tokenGetter: retrieveToken
|
|
261
|
+
// }
|
|
262
|
+
// })
|
|
263
|
+
// UIRouterModule.forChild({
|
|
264
|
+
// states: STATES,
|
|
265
|
+
// config: routerConfigFn,
|
|
266
|
+
// }),
|
|
267
|
+
// JwtModule.forRoot({})
|
|
268
|
+
] });
|
|
269
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MembrsModule, imports: [CommonModule,
|
|
270
|
+
HttpClientModule,
|
|
271
|
+
JwtModule
|
|
272
|
+
// JwtModule.forRoot({
|
|
273
|
+
// config: {
|
|
274
|
+
// tokenGetter: retrieveToken
|
|
275
|
+
// }
|
|
276
|
+
// })
|
|
277
|
+
// UIRouterModule.forChild({
|
|
278
|
+
// states: STATES,
|
|
279
|
+
// config: routerConfigFn,
|
|
280
|
+
// }),
|
|
281
|
+
// JwtModule.forRoot({})
|
|
282
|
+
] });
|
|
250
283
|
}
|
|
251
|
-
|
|
252
|
-
MembrsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: MembrsModule, imports: [CommonModule,
|
|
253
|
-
HttpClientModule,
|
|
254
|
-
JwtModule
|
|
255
|
-
// JwtModule.forRoot({
|
|
256
|
-
// config: {
|
|
257
|
-
// tokenGetter: retrieveToken
|
|
258
|
-
// }
|
|
259
|
-
// })
|
|
260
|
-
// UIRouterModule.forChild({
|
|
261
|
-
// states: STATES,
|
|
262
|
-
// config: routerConfigFn,
|
|
263
|
-
// }),
|
|
264
|
-
// JwtModule.forRoot({})
|
|
265
|
-
] });
|
|
266
|
-
MembrsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MembrsModule, imports: [CommonModule,
|
|
267
|
-
HttpClientModule,
|
|
268
|
-
JwtModule
|
|
269
|
-
// JwtModule.forRoot({
|
|
270
|
-
// config: {
|
|
271
|
-
// tokenGetter: retrieveToken
|
|
272
|
-
// }
|
|
273
|
-
// })
|
|
274
|
-
// UIRouterModule.forChild({
|
|
275
|
-
// states: STATES,
|
|
276
|
-
// config: routerConfigFn,
|
|
277
|
-
// }),
|
|
278
|
-
// JwtModule.forRoot({})
|
|
279
|
-
] });
|
|
280
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MembrsModule, decorators: [{
|
|
284
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MembrsModule, decorators: [{
|
|
281
285
|
type: NgModule,
|
|
282
286
|
args: [{
|
|
283
287
|
imports: [
|
|
@@ -299,6 +303,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
299
303
|
}] });
|
|
300
304
|
|
|
301
305
|
class TokenInterceptor {
|
|
306
|
+
jwtHelper;
|
|
307
|
+
membrsService;
|
|
308
|
+
stateService;
|
|
302
309
|
constructor(jwtHelper, membrsService, stateService) {
|
|
303
310
|
this.jwtHelper = jwtHelper;
|
|
304
311
|
this.membrsService = membrsService;
|
|
@@ -347,12 +354,12 @@ class TokenInterceptor {
|
|
|
347
354
|
// this.busyService.finished()
|
|
348
355
|
}));
|
|
349
356
|
}
|
|
357
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenInterceptor, deps: [{ token: i1$1.JwtHelperService }, { token: MembrsService }, { token: i3.StateService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
358
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenInterceptor });
|
|
350
359
|
}
|
|
351
|
-
|
|
352
|
-
TokenInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TokenInterceptor });
|
|
353
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TokenInterceptor, decorators: [{
|
|
360
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenInterceptor, decorators: [{
|
|
354
361
|
type: Injectable
|
|
355
|
-
}], ctorParameters:
|
|
362
|
+
}], ctorParameters: () => [{ type: i1$1.JwtHelperService }, { type: MembrsService }, { type: i3.StateService }] });
|
|
356
363
|
|
|
357
364
|
/**
|
|
358
365
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nakedcreativity-membrs-angular-helper.mjs","sources":["../../../projects/membrs/src/lib/config.service.ts","../../../projects/membrs/src/lib/membrs.service.ts","../../../projects/membrs/src/lib/router.config.ts","../../../projects/membrs/src/lib/token.ts","../../../projects/membrs/src/lib/membrs.module.ts","../../../projects/membrs/src/lib/auth.interceptor.ts","../../../projects/membrs/src/nakedcreativity-membrs-angular-helper.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { MembrsConfig } from './config.interface';\n\n/**\n * This is not a real service, but it looks like it from the outside.\n * It's just an InjectionTToken used to import the config object, provided from the outside\n */\nexport const MembrsConfigService = new InjectionToken<MembrsConfig>(\"MembrsConfig\");\n","import { Injectable, Inject } from '@angular/core';\nimport { JwtHelperService } from '@auth0/angular-jwt';\nimport { HttpClient } from '@angular/common/http'\nimport { MembrsConfigService } from './config.service'\nimport { MembrsConfig } from './config.interface';\nimport { BehaviorSubject } from 'rxjs';\nconst jwtService = new JwtHelperService()\n\n@Injectable({\n providedIn: 'root'\n})\n\n\nexport class MembrsService {\n\n _token: string;\n _decoded: any;\n\n public decodedReady = new BehaviorSubject<any>(null);\n\n _lsKey: string = 'membrs';\n _loggedInObservable: BehaviorSubject<Boolean> = new BehaviorSubject(false)\n\n constructor(private http: HttpClient, @Inject(MembrsConfigService) private config: MembrsConfig) {\n\n // console.log('membrs constructor')\n // if the token exists in local storage, retrieve it back to the service\n if(localStorage.getItem(this._lsKey)){\n this.token = localStorage.getItem(this._lsKey)\n }\n \n }\n\n reissue(token?: string) {\n console.log('Reissuing token...'); // Log function entry\n \n return new Promise((resolve, reject) => {\n if (!token && !this._token) {\n console.log('No token provided and no token found.'); // Log missing token\n reject('NOT_LOGGED_IN');\n }\n \n if (token) {\n console.log(`Token provided: ${token}`); // Log provided token\n this.token = token;\n }\n \n // check stored token has not expired, or needs to be reissued soon\n var reissueIn = this._decoded.exp - Math.floor(Date.now() / 1000);\n \n // token has expired\n if (reissueIn < 0) {\n console.log('Token has expired.'); // Log expired token\n reject('NOT_LOGGED_IN');\n }\n \n // token expiring soon\n if (reissueIn < 300) {\n console.log('Token expiring soon. Reissuing...'); // Log imminent expiration\n this.http.post(this.config.apiProtocol + this.config.api + '/token/' + this._token, {}).subscribe(\n (response: any) => {\n if (response.token) {\n this.token = response.token;\n this._loggedInObservable.next(true);\n console.log('Token successfully reissued.'); // Log success\n resolve(this._token);\n } else {\n console.log('Failed to reissue token.'); // Log failure\n reject('NOT_LOGGED_IN');\n }\n },\n (error) => {\n console.log('Error reissuing token:', error); // Log error details\n reject('NOT_LOGGED_IN');\n }\n );\n } else {\n this._loggedInObservable.next(true);\n console.log('Token is valid. No need to reissue.'); // Log valid token\n resolve(this._token);\n }\n });\n }\n \n\n set token(token){\n this._token = token\n console.log('Token set.');\n localStorage.setItem(this._lsKey, token)\n this._decoded = jwtService.decodeToken(this._token)\n }\n\n deleteToken(){\n localStorage.removeItem(this._lsKey)\n }\n\n isLoggedIn(){\n return this.token ? true : false\n }\n\n get profile(){\n return this._decoded\n }\n\n setProfile(decodedData) {\n this._decoded = decodedData;\n this.decodedReady.next(decodedData); // Emit the new value when profile is set\n console.log(this.decodedReady);\n }\n\n get decodedReady$() {\n return this.decodedReady.asObservable();\n }\n\n get token(){\n return this._token\n }\n\n get admin (){\n return this.profile.permission == 1\n }\n\n get isLoggedInObservable(){\n return this._loggedInObservable\n }\n \n logout(){\n return new Promise((resolve, reject)=>{\n this.http.delete(this.config.apiProtocol + this.config.api + '/token/' + this._token).subscribe((response:any)=>{\n this._token = null;\n localStorage.removeItem(this._lsKey);\n resolve(this.config.login);\n }, error => {\n // If the API call fails (e.g. token already invalid/expired), still clear local state\n console.warn('Logout API call failed, clearing local token anyway', error);\n this._token = null;\n localStorage.removeItem(this._lsKey);\n resolve(this.config.login);\n });\n });\n }\n\n\n}\n","import { UIRouter } from '@uirouter/core';\nimport { MembrsConfigService } from './config.service'\nimport { MembrsConfig } from './config.interface';\nimport { Injector } from '@angular/core';\nimport { MembrsService } from './membrs.service';\n\nexport function routerConfigFn(router: UIRouter, injector: Injector) {\n\n const transitionService = router.transitionService;\n const stateService = router.stateService\n const config:MembrsConfig = injector.get(MembrsConfigService)\n const membrsService = injector.get(MembrsService)\n\n \tstateService.defaultErrorHandler(function(error) {\n\t\t \t\n\t\tif(error.detail == 'NOT_LOGGED_IN'){\n\t\t\tmembrsService.deleteToken()\n\t\t\twindow.location.href = config.login;\n\t\t}\n\n\t\tif(error.detail == 'INSUFFICIENT_PERMISSIONS')\n\t\t\tstateService.go(config.defaultState)\n\n\t});\n\t\n}","export function retrieveToken() {\n // console.log('retrieve from ls')\n return localStorage.getItem('membrs');\n}","import { NgModule, ModuleWithProviders, Injector } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MembrsService } from './membrs.service';\nimport { JwtModule, JWT_OPTIONS } from \"@auth0/angular-jwt\";\nimport { HttpClientModule } from \"@angular/common/http\";\nimport { UIRouterModule } from '@uirouter/angular'\n\nimport { Ng2StateDeclaration } from '@uirouter/angular';\nimport { Transition, UIRouter } from '@uirouter/angular'\n\nimport { routerConfigFn } from './router.config';\nimport { MembrsConfig } from './config.interface';\nimport { MembrsConfigService } from './config.service';\nimport { retrieveToken } from './token';\n\nexport const validateResolve = {\n token: 'reissue',\n deps: [ Transition, UIRouter, MembrsService, MembrsConfigService ],\n resolveFn: validateResolveFn\n}\n\nexport const reissueResolve = {\n token: 'reissue',\n deps: [ Transition, UIRouter, MembrsService, MembrsConfigService ],\n resolveFn: reissueResolveFn\n}\n\nexport const reissueState:Ng2StateDeclaration = {\n\tname: 'reissue', \n\turl: '/reissue?token',\n\tviews: { },\n\tresolve: [\n reissueResolve\n\t]\n}\n\nexport function reissueResolveFn(transition, router, membrsService, membrsConfig:MembrsConfig) {\n \n //console.log(membrsService)\n return new Promise((resolve, reject) => {\n // console.log('reissue promise resolve')\n // console.log(transition.params().token)\n membrsService.reissue(transition.params().token).then((response)=>{\n if(localStorage.getItem('redirectUrlAfterLogin')){\n const redirect = localStorage.getItem('redirectUrlAfterLogin')\n localStorage.removeItem('redirectUrlAfterLogin')\n window.location.pathname = redirect\n }else {\n router.stateService.go(membrsConfig.defaultState, {}, {inherit:false})\n }\n reject()\n }).catch(error=>{\n //console.log('error in reissue resolve')\n //console.log(error)\n //window.location.href = environment.login\n reject(error)\n })\n\n\t})\n}\n\nexport function validateResolveFn(transition, router, membrsService, membrsConfig:MembrsConfig) {\n \n //console.log(membrsService)\n return new Promise((resolve, reject) => {\n // console.log('validate promise resolve')\n \n membrsService.reissue().then((response)=>{\n if(localStorage.getItem('redirectUrlAfterLogin')){\n const redirect = localStorage.getItem('redirectUrlAfterLogin')\n localStorage.removeItem('redirectUrlAfterLogin')\n window.location.pathname = redirect\n }\n resolve(null)\n }).catch(error=>{\n localStorage.setItem('redirectUrlAfterLogin', window.location.pathname)\n window.location.href = membrsConfig.login\n reject(error)\n })\n\n})\n}\n\nexport function jwtOptionsFactory(config) {\n // console.log('jwt options factory')\n // console.log(config)\n return {\n tokenGetter: () => {\n console.log('token getter', localStorage.getItem('membrs'))\n return localStorage.getItem('membrs');\n },\n allowedDomains: [config.api]\n }\n}\n\n\n/** The top level state(s) */\nexport const STATES = [\n reissueState\n]\n\n\n@NgModule({\n imports: [\n CommonModule,\n HttpClientModule,\n JwtModule\n // JwtModule.forRoot({\n // config: {\n // tokenGetter: retrieveToken\n // }\n // })\n // UIRouterModule.forChild({\n // states: STATES,\n // config: routerConfigFn,\n // }),\n // JwtModule.forRoot({})\n ]\n})\n\n\n\nexport class MembrsModule { \n static forRoot(config: MembrsConfig): ModuleWithProviders<MembrsModule> {\n\n\n const moduleProviders = UIRouterModule.forChild({\n states: STATES,\n config: routerConfigFn\n }).providers\n\n moduleProviders.push(JwtModule.forRoot({\n config: {\n tokenGetter: retrieveToken,\n allowedDomains: []\n }\n }).providers)\n \n moduleProviders.push(MembrsService)\n moduleProviders.push({provide: MembrsConfigService,useValue: config});\n \n \n return {\n ngModule: MembrsModule, \n providers: moduleProviders //[{provide: MembrsConfigService,useValue: config}]\n };\n \n }\n\n}\n","import { JwtHelperService } from \"@auth0/angular-jwt\";\nimport { Injectable } from \"@angular/core\";\nimport { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from \"@angular/common/http\";\nimport { Observable, from, throwError } from \"rxjs\";\nimport { switchMap, catchError, finalize, tap } from \"rxjs/operators\";\nimport { MembrsService } from \"./membrs.service\";\nimport { StateService } from \"@uirouter/angular\";\n\n@Injectable()\nexport class TokenInterceptor implements HttpInterceptor {\n constructor(private jwtHelper: JwtHelperService, private membrsService: MembrsService, private stateService: StateService) {}\n\n intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n const token = localStorage.getItem(\"membrs\");\n\n if (token && this.jwtHelper.isTokenExpired(token)) {\n console.log(\"Token expired. Attempting to reissue.\");\n return from(this.membrsService.reissue()).pipe(\n switchMap(() => {\n const refreshedToken = localStorage.getItem(\"membrs\");\n if (refreshedToken && !this.jwtHelper.isTokenExpired(refreshedToken)) {\n console.log(\"Token successfully reissued.\");\n request = request.clone({\n setHeaders: {\n Authorization: refreshedToken,\n },\n });\n }\n return next.handle(request);\n }),\n catchError((err) => {\n console.warn(\"Token refresh failed. Logging out.\");\n this.membrsService.logout();\n this.stateService.go(\"\");\n return throwError(() => err);\n }),\n finalize(() => {\n // this.busyService.finished()\n })\n );\n }\n\n if (token && !this.jwtHelper.isTokenExpired(token)) {\n request = request.clone({\n setHeaders: {\n Authorization: token,\n },\n });\n }\n\n return next.handle(request).pipe(\n tap((event) => {\n // If this is an HttpResponse, check for x-new-token header\n if (event && event.type === 4 && event.headers) {\n const newToken = event.headers.get('x-new-token');\n if (newToken) {\n localStorage.setItem('membrs', newToken);\n }\n }\n }),\n finalize(() => {\n // this.busyService.finished()\n })\n );\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2.MembrsService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"nakedcreativity-membrs-angular-helper.mjs","sources":["../../../projects/membrs/src/lib/config.service.ts","../../../projects/membrs/src/lib/membrs.service.ts","../../../projects/membrs/src/lib/router.config.ts","../../../projects/membrs/src/lib/token.ts","../../../projects/membrs/src/lib/membrs.module.ts","../../../projects/membrs/src/lib/auth.interceptor.ts","../../../projects/membrs/src/nakedcreativity-membrs-angular-helper.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { MembrsConfig } from './config.interface';\n\n/**\n * This is not a real service, but it looks like it from the outside.\n * It's just an InjectionTToken used to import the config object, provided from the outside\n */\nexport const MembrsConfigService = new InjectionToken<MembrsConfig>(\"MembrsConfig\");\n","import { Injectable, Inject } from '@angular/core';\nimport { JwtHelperService } from '@auth0/angular-jwt';\nimport { HttpClient } from '@angular/common/http'\nimport { MembrsConfigService } from './config.service'\nimport { MembrsConfig } from './config.interface';\nimport { BehaviorSubject } from 'rxjs';\nconst jwtService = new JwtHelperService()\n\n@Injectable({\n providedIn: 'root'\n})\n\n\nexport class MembrsService {\n\n _token: string;\n _decoded: any;\n\n public decodedReady = new BehaviorSubject<any>(null);\n\n _lsKey: string = 'membrs';\n _loggedInObservable: BehaviorSubject<Boolean> = new BehaviorSubject(false)\n\n constructor(private http: HttpClient, @Inject(MembrsConfigService) private config: MembrsConfig) {\n\n // console.log('membrs constructor')\n // if the token exists in local storage, retrieve it back to the service\n if(localStorage.getItem(this._lsKey)){\n this.token = localStorage.getItem(this._lsKey)\n }\n \n }\n\n reissue(token?: string) {\n console.log('Reissuing token...'); // Log function entry\n \n return new Promise((resolve, reject) => {\n if (!token && !this._token) {\n console.log('No token provided and no token found.'); // Log missing token\n reject('NOT_LOGGED_IN');\n }\n \n if (token) {\n console.log(`Token provided: ${token}`); // Log provided token\n this.token = token;\n }\n \n // check stored token has not expired, or needs to be reissued soon\n var reissueIn = this._decoded.exp - Math.floor(Date.now() / 1000);\n \n // token has expired\n if (reissueIn < 0) {\n console.log('Token has expired.'); // Log expired token\n reject('NOT_LOGGED_IN');\n }\n \n // token expiring soon\n if (reissueIn < 300) {\n console.log('Token expiring soon. Reissuing...'); // Log imminent expiration\n this.http.post(this.config.apiProtocol + this.config.api + '/token/' + this._token, {}).subscribe(\n (response: any) => {\n if (response.token) {\n this.token = response.token;\n this._loggedInObservable.next(true);\n console.log('Token successfully reissued.'); // Log success\n resolve(this._token);\n } else {\n console.log('Failed to reissue token.'); // Log failure\n reject('NOT_LOGGED_IN');\n }\n },\n (error) => {\n console.log('Error reissuing token:', error); // Log error details\n reject('NOT_LOGGED_IN');\n }\n );\n } else {\n this._loggedInObservable.next(true);\n console.log('Token is valid. No need to reissue.'); // Log valid token\n resolve(this._token);\n }\n });\n }\n \n\n set token(token){\n this._token = token\n console.log('Token set.');\n localStorage.setItem(this._lsKey, token)\n this._decoded = jwtService.decodeToken(this._token)\n }\n\n deleteToken(){\n localStorage.removeItem(this._lsKey)\n }\n\n isLoggedIn(){\n return this.token ? true : false\n }\n\n get profile(){\n return this._decoded\n }\n\n setProfile(decodedData) {\n this._decoded = decodedData;\n this.decodedReady.next(decodedData); // Emit the new value when profile is set\n console.log(this.decodedReady);\n }\n\n get decodedReady$() {\n return this.decodedReady.asObservable();\n }\n\n get token(){\n return this._token\n }\n\n get admin (){\n return this.profile.permission == 1\n }\n\n get isLoggedInObservable(){\n return this._loggedInObservable\n }\n \n logout(){\n return new Promise((resolve, reject)=>{\n this.http.delete(this.config.apiProtocol + this.config.api + '/token/' + this._token).subscribe((response:any)=>{\n this._token = null;\n localStorage.removeItem(this._lsKey);\n resolve(this.config.login);\n }, error => {\n // If the API call fails (e.g. token already invalid/expired), still clear local state\n console.warn('Logout API call failed, clearing local token anyway', error);\n this._token = null;\n localStorage.removeItem(this._lsKey);\n resolve(this.config.login);\n });\n });\n }\n\n\n}\n","import { UIRouter } from '@uirouter/core';\nimport { MembrsConfigService } from './config.service'\nimport { MembrsConfig } from './config.interface';\nimport { Injector } from '@angular/core';\nimport { MembrsService } from './membrs.service';\n\nexport function routerConfigFn(router: UIRouter, injector: Injector) {\n\n const transitionService = router.transitionService;\n const stateService = router.stateService\n const config:MembrsConfig = injector.get(MembrsConfigService)\n const membrsService = injector.get(MembrsService)\n\n \tstateService.defaultErrorHandler(function(error) {\n\t\t \t\n\t\tif(error.detail == 'NOT_LOGGED_IN'){\n\t\t\tmembrsService.deleteToken()\n\t\t\twindow.location.href = config.login;\n\t\t}\n\n\t\tif(error.detail == 'INSUFFICIENT_PERMISSIONS')\n\t\t\tstateService.go(config.defaultState)\n\n\t});\n\t\n}","export function retrieveToken() {\n // console.log('retrieve from ls')\n return localStorage.getItem('membrs');\n}","import { NgModule, ModuleWithProviders, Injector } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MembrsService } from './membrs.service';\nimport { JwtModule, JWT_OPTIONS } from \"@auth0/angular-jwt\";\nimport { HttpClientModule } from \"@angular/common/http\";\nimport { UIRouterModule } from '@uirouter/angular'\n\nimport { Ng2StateDeclaration } from '@uirouter/angular';\nimport { Transition, UIRouter } from '@uirouter/angular'\n\nimport { routerConfigFn } from './router.config';\nimport { MembrsConfig } from './config.interface';\nimport { MembrsConfigService } from './config.service';\nimport { retrieveToken } from './token';\n\nexport const validateResolve = {\n token: 'reissue',\n deps: [ Transition, UIRouter, MembrsService, MembrsConfigService ],\n resolveFn: validateResolveFn\n}\n\nexport const reissueResolve = {\n token: 'reissue',\n deps: [ Transition, UIRouter, MembrsService, MembrsConfigService ],\n resolveFn: reissueResolveFn\n}\n\nexport const reissueState:Ng2StateDeclaration = {\n\tname: 'reissue', \n\turl: '/reissue?token',\n\tviews: { },\n\tresolve: [\n reissueResolve\n\t]\n}\n\nexport function reissueResolveFn(transition, router, membrsService, membrsConfig:MembrsConfig) {\n \n //console.log(membrsService)\n return new Promise((resolve, reject) => {\n // console.log('reissue promise resolve')\n // console.log(transition.params().token)\n membrsService.reissue(transition.params().token).then((response)=>{\n if(localStorage.getItem('redirectUrlAfterLogin')){\n const redirect = localStorage.getItem('redirectUrlAfterLogin')\n localStorage.removeItem('redirectUrlAfterLogin')\n window.location.pathname = redirect\n }else {\n router.stateService.go(membrsConfig.defaultState, {}, {inherit:false})\n }\n reject()\n }).catch(error=>{\n //console.log('error in reissue resolve')\n //console.log(error)\n //window.location.href = environment.login\n reject(error)\n })\n\n\t})\n}\n\nexport function validateResolveFn(transition, router, membrsService, membrsConfig:MembrsConfig) {\n \n //console.log(membrsService)\n return new Promise((resolve, reject) => {\n // console.log('validate promise resolve')\n \n membrsService.reissue().then((response)=>{\n if(localStorage.getItem('redirectUrlAfterLogin')){\n const redirect = localStorage.getItem('redirectUrlAfterLogin')\n localStorage.removeItem('redirectUrlAfterLogin')\n window.location.pathname = redirect\n }\n resolve(null)\n }).catch(error=>{\n localStorage.setItem('redirectUrlAfterLogin', window.location.pathname)\n window.location.href = membrsConfig.login\n reject(error)\n })\n\n})\n}\n\nexport function jwtOptionsFactory(config) {\n // console.log('jwt options factory')\n // console.log(config)\n return {\n tokenGetter: () => {\n console.log('token getter', localStorage.getItem('membrs'))\n return localStorage.getItem('membrs');\n },\n allowedDomains: [config.api]\n }\n}\n\n\n/** The top level state(s) */\nexport const STATES = [\n reissueState\n]\n\n\n@NgModule({\n imports: [\n CommonModule,\n HttpClientModule,\n JwtModule\n // JwtModule.forRoot({\n // config: {\n // tokenGetter: retrieveToken\n // }\n // })\n // UIRouterModule.forChild({\n // states: STATES,\n // config: routerConfigFn,\n // }),\n // JwtModule.forRoot({})\n ]\n})\n\n\n\nexport class MembrsModule { \n static forRoot(config: MembrsConfig): ModuleWithProviders<MembrsModule> {\n\n\n const moduleProviders = UIRouterModule.forChild({\n states: STATES,\n config: routerConfigFn\n }).providers\n\n moduleProviders.push(JwtModule.forRoot({\n config: {\n tokenGetter: retrieveToken,\n allowedDomains: []\n }\n }).providers)\n \n moduleProviders.push(MembrsService)\n moduleProviders.push({provide: MembrsConfigService,useValue: config});\n \n \n return {\n ngModule: MembrsModule, \n providers: moduleProviders //[{provide: MembrsConfigService,useValue: config}]\n };\n \n }\n\n}\n","import { JwtHelperService } from \"@auth0/angular-jwt\";\nimport { Injectable } from \"@angular/core\";\nimport { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from \"@angular/common/http\";\nimport { Observable, from, throwError } from \"rxjs\";\nimport { switchMap, catchError, finalize, tap } from \"rxjs/operators\";\nimport { MembrsService } from \"./membrs.service\";\nimport { StateService } from \"@uirouter/angular\";\n\n@Injectable()\nexport class TokenInterceptor implements HttpInterceptor {\n constructor(private jwtHelper: JwtHelperService, private membrsService: MembrsService, private stateService: StateService) {}\n\n intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n const token = localStorage.getItem(\"membrs\");\n\n if (token && this.jwtHelper.isTokenExpired(token)) {\n console.log(\"Token expired. Attempting to reissue.\");\n return from(this.membrsService.reissue()).pipe(\n switchMap(() => {\n const refreshedToken = localStorage.getItem(\"membrs\");\n if (refreshedToken && !this.jwtHelper.isTokenExpired(refreshedToken)) {\n console.log(\"Token successfully reissued.\");\n request = request.clone({\n setHeaders: {\n Authorization: refreshedToken,\n },\n });\n }\n return next.handle(request);\n }),\n catchError((err) => {\n console.warn(\"Token refresh failed. Logging out.\");\n this.membrsService.logout();\n this.stateService.go(\"\");\n return throwError(() => err);\n }),\n finalize(() => {\n // this.busyService.finished()\n })\n );\n }\n\n if (token && !this.jwtHelper.isTokenExpired(token)) {\n request = request.clone({\n setHeaders: {\n Authorization: token,\n },\n });\n }\n\n return next.handle(request).pipe(\n tap((event) => {\n // If this is an HttpResponse, check for x-new-token header\n if (event && event.type === 4 && event.headers) {\n const newToken = event.headers.get('x-new-token');\n if (newToken) {\n localStorage.setItem('membrs', newToken);\n }\n }\n }),\n finalize(() => {\n // this.busyService.finished()\n })\n );\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2.MembrsService"],"mappings":"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"}
|