@nakedcreativity/membrs-angular-helper 0.1.4 → 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.
@@ -1,12 +1,14 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, Injectable, Inject, NgModule } from '@angular/core';
2
+ import { InjectionToken, Inject, Injectable, NgModule } from '@angular/core';
3
+ import * as i1$1 from '@auth0/angular-jwt';
3
4
  import { JwtHelperService, JwtModule } from '@auth0/angular-jwt';
4
- import { BehaviorSubject } from 'rxjs';
5
+ import { BehaviorSubject, from, throwError } from 'rxjs';
5
6
  import * as i1 from '@angular/common/http';
6
7
  import { HttpClientModule } from '@angular/common/http';
7
8
  import { CommonModule } from '@angular/common';
9
+ import * as i3 from '@uirouter/angular';
8
10
  import { Transition, UIRouter, UIRouterModule } from '@uirouter/angular';
9
- import { finalize } from 'rxjs/operators';
11
+ import { switchMap, catchError, finalize, tap } from 'rxjs/operators';
10
12
 
11
13
  /**
12
14
  * This is not a real service, but it looks like it from the outside.
@@ -16,11 +18,16 @@ const MembrsConfigService = new InjectionToken("MembrsConfig");
16
18
 
17
19
  const jwtService = new JwtHelperService();
18
20
  class MembrsService {
21
+ http;
22
+ config;
23
+ _token;
24
+ _decoded;
25
+ decodedReady = new BehaviorSubject(null);
26
+ _lsKey = 'membrs';
27
+ _loggedInObservable = new BehaviorSubject(false);
19
28
  constructor(http, config) {
20
29
  this.http = http;
21
30
  this.config = config;
22
- this._lsKey = 'membrs';
23
- this._loggedInObservable = new BehaviorSubject(false);
24
31
  // console.log('membrs constructor')
25
32
  // if the token exists in local storage, retrieve it back to the service
26
33
  if (localStorage.getItem(this._lsKey)) {
@@ -28,41 +35,52 @@ class MembrsService {
28
35
  }
29
36
  }
30
37
  reissue(token) {
38
+ console.log('Reissuing token...'); // Log function entry
31
39
  return new Promise((resolve, reject) => {
32
40
  if (!token && !this._token) {
41
+ console.log('No token provided and no token found.'); // Log missing token
33
42
  reject('NOT_LOGGED_IN');
34
43
  }
35
- if (token)
44
+ if (token) {
45
+ console.log(`Token provided: ${token}`); // Log provided token
36
46
  this.token = token;
47
+ }
37
48
  // check stored token has not expired, or needs to be reissued soon
38
49
  var reissueIn = this._decoded.exp - Math.floor(Date.now() / 1000);
39
50
  // token has expired
40
51
  if (reissueIn < 0) {
52
+ console.log('Token has expired.'); // Log expired token
41
53
  reject('NOT_LOGGED_IN');
42
54
  }
43
55
  // token expiring soon
44
56
  if (reissueIn < 300) {
57
+ console.log('Token expiring soon. Reissuing...'); // Log imminent expiration
45
58
  this.http.post(this.config.apiProtocol + this.config.api + '/token/' + this._token, {}).subscribe((response) => {
46
59
  if (response.token) {
47
60
  this.token = response.token;
48
61
  this._loggedInObservable.next(true);
62
+ console.log('Token successfully reissued.'); // Log success
49
63
  resolve(this._token);
50
64
  }
51
65
  else {
66
+ console.log('Failed to reissue token.'); // Log failure
52
67
  reject('NOT_LOGGED_IN');
53
68
  }
54
- }, error => {
69
+ }, (error) => {
70
+ console.log('Error reissuing token:', error); // Log error details
55
71
  reject('NOT_LOGGED_IN');
56
72
  });
57
73
  }
58
74
  else {
59
75
  this._loggedInObservable.next(true);
76
+ console.log('Token is valid. No need to reissue.'); // Log valid token
60
77
  resolve(this._token);
61
78
  }
62
79
  });
63
80
  }
64
81
  set token(token) {
65
82
  this._token = token;
83
+ console.log('Token set.');
66
84
  localStorage.setItem(this._lsKey, token);
67
85
  this._decoded = jwtService.decodeToken(this._token);
68
86
  }
@@ -75,6 +93,14 @@ class MembrsService {
75
93
  get profile() {
76
94
  return this._decoded;
77
95
  }
96
+ setProfile(decodedData) {
97
+ this._decoded = decodedData;
98
+ this.decodedReady.next(decodedData); // Emit the new value when profile is set
99
+ console.log(this.decodedReady);
100
+ }
101
+ get decodedReady$() {
102
+ return this.decodedReady.asObservable();
103
+ }
78
104
  get token() {
79
105
  return this._token;
80
106
  }
@@ -90,24 +116,27 @@ class MembrsService {
90
116
  this._token = null;
91
117
  localStorage.removeItem(this._lsKey);
92
118
  resolve(this.config.login);
93
- //this.router.stateService.go('dashboard')
94
119
  }, error => {
95
- reject(error);
120
+ // If the API call fails (e.g. token already invalid/expired), still clear local state
121
+ console.warn('Logout API call failed, clearing local token anyway', error);
122
+ this._token = null;
123
+ localStorage.removeItem(this._lsKey);
124
+ resolve(this.config.login);
96
125
  });
97
126
  });
98
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' });
99
130
  }
100
- MembrsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MembrsService, deps: [{ token: i1.HttpClient }, { token: MembrsConfigService }], target: i0.ɵɵFactoryTarget.Injectable });
101
- MembrsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MembrsService, providedIn: 'root' });
102
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MembrsService, decorators: [{
131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MembrsService, decorators: [{
103
132
  type: Injectable,
104
133
  args: [{
105
134
  providedIn: 'root'
106
135
  }]
107
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: undefined, decorators: [{
136
+ }], ctorParameters: () => [{ type: i1.HttpClient }, { type: undefined, decorators: [{
108
137
  type: Inject,
109
138
  args: [MembrsConfigService]
110
- }] }]; } });
139
+ }] }] });
111
140
 
112
141
  function routerConfigFn(router, injector) {
113
142
  const transitionService = router.transitionService;
@@ -175,6 +204,11 @@ function validateResolveFn(transition, router, membrsService, membrsConfig) {
175
204
  return new Promise((resolve, reject) => {
176
205
  // console.log('validate promise resolve')
177
206
  membrsService.reissue().then((response) => {
207
+ if (localStorage.getItem('redirectUrlAfterLogin')) {
208
+ const redirect = localStorage.getItem('redirectUrlAfterLogin');
209
+ localStorage.removeItem('redirectUrlAfterLogin');
210
+ window.location.pathname = redirect;
211
+ }
178
212
  resolve(null);
179
213
  }).catch(error => {
180
214
  localStorage.setItem('redirectUrlAfterLogin', window.location.pathname);
@@ -217,37 +251,37 @@ class MembrsModule {
217
251
  providers: moduleProviders //[{provide: MembrsConfigService,useValue: config}]
218
252
  };
219
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
+ ] });
220
283
  }
221
- MembrsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MembrsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
222
- MembrsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: MembrsModule, imports: [CommonModule,
223
- HttpClientModule,
224
- JwtModule
225
- // JwtModule.forRoot({
226
- // config: {
227
- // tokenGetter: retrieveToken
228
- // }
229
- // })
230
- // UIRouterModule.forChild({
231
- // states: STATES,
232
- // config: routerConfigFn,
233
- // }),
234
- // JwtModule.forRoot({})
235
- ] });
236
- MembrsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MembrsModule, imports: [CommonModule,
237
- HttpClientModule,
238
- JwtModule
239
- // JwtModule.forRoot({
240
- // config: {
241
- // tokenGetter: retrieveToken
242
- // }
243
- // })
244
- // UIRouterModule.forChild({
245
- // states: STATES,
246
- // config: routerConfigFn,
247
- // }),
248
- // JwtModule.forRoot({})
249
- ] });
250
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MembrsModule, decorators: [{
284
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MembrsModule, decorators: [{
251
285
  type: NgModule,
252
286
  args: [{
253
287
  imports: [
@@ -269,25 +303,63 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
269
303
  }] });
270
304
 
271
305
  class TokenInterceptor {
272
- constructor() { }
306
+ jwtHelper;
307
+ membrsService;
308
+ stateService;
309
+ constructor(jwtHelper, membrsService, stateService) {
310
+ this.jwtHelper = jwtHelper;
311
+ this.membrsService = membrsService;
312
+ this.stateService = stateService;
313
+ }
273
314
  intercept(request, next) {
274
- console.log('intercept request', localStorage.getItem('membrs'));
275
- //this.busyService.busy()
276
- request = request.clone({
277
- setHeaders: {
278
- Authorization: localStorage.getItem('membrs')
315
+ const token = localStorage.getItem("membrs");
316
+ if (token && this.jwtHelper.isTokenExpired(token)) {
317
+ console.log("Token expired. Attempting to reissue.");
318
+ return from(this.membrsService.reissue()).pipe(switchMap(() => {
319
+ const refreshedToken = localStorage.getItem("membrs");
320
+ if (refreshedToken && !this.jwtHelper.isTokenExpired(refreshedToken)) {
321
+ console.log("Token successfully reissued.");
322
+ request = request.clone({
323
+ setHeaders: {
324
+ Authorization: refreshedToken,
325
+ },
326
+ });
327
+ }
328
+ return next.handle(request);
329
+ }), catchError((err) => {
330
+ console.warn("Token refresh failed. Logging out.");
331
+ this.membrsService.logout();
332
+ this.stateService.go("");
333
+ return throwError(() => err);
334
+ }), finalize(() => {
335
+ // this.busyService.finished()
336
+ }));
337
+ }
338
+ if (token && !this.jwtHelper.isTokenExpired(token)) {
339
+ request = request.clone({
340
+ setHeaders: {
341
+ Authorization: token,
342
+ },
343
+ });
344
+ }
345
+ return next.handle(request).pipe(tap((event) => {
346
+ // If this is an HttpResponse, check for x-new-token header
347
+ if (event && event.type === 4 && event.headers) {
348
+ const newToken = event.headers.get('x-new-token');
349
+ if (newToken) {
350
+ localStorage.setItem('membrs', newToken);
351
+ }
279
352
  }
280
- });
281
- return next.handle(request).pipe(finalize(() => {
282
- //this.busyService.finished()
353
+ }), finalize(() => {
354
+ // this.busyService.finished()
283
355
  }));
284
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 });
285
359
  }
286
- TokenInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TokenInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
287
- TokenInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TokenInterceptor });
288
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TokenInterceptor, decorators: [{
360
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenInterceptor, decorators: [{
289
361
  type: Injectable
290
- }], ctorParameters: function () { return []; } });
362
+ }], ctorParameters: () => [{ type: i1$1.JwtHelperService }, { type: MembrsService }, { type: i3.StateService }] });
291
363
 
292
364
  /**
293
365
  * Generated bundle index. Do not edit.
@@ -0,0 +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,8 +1,14 @@
1
- import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';
2
- import { Observable } from 'rxjs';
1
+ import { JwtHelperService } from "@auth0/angular-jwt";
2
+ import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from "@angular/common/http";
3
+ import { Observable } from "rxjs";
4
+ import { MembrsService } from "./membrs.service";
5
+ import { StateService } from "@uirouter/angular";
3
6
  import * as i0 from "@angular/core";
4
7
  export declare class TokenInterceptor implements HttpInterceptor {
5
- constructor();
8
+ private jwtHelper;
9
+ private membrsService;
10
+ private stateService;
11
+ constructor(jwtHelper: JwtHelperService, membrsService: MembrsService, stateService: StateService);
6
12
  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>;
7
13
  static ɵfac: i0.ɵɵFactoryDeclaration<TokenInterceptor, never>;
8
14
  static ɵprov: i0.ɵɵInjectableDeclaration<TokenInterceptor>;
@@ -7,6 +7,7 @@ export declare class MembrsService {
7
7
  private config;
8
8
  _token: string;
9
9
  _decoded: any;
10
+ decodedReady: BehaviorSubject<any>;
10
11
  _lsKey: string;
11
12
  _loggedInObservable: BehaviorSubject<Boolean>;
12
13
  constructor(http: HttpClient, config: MembrsConfig);
@@ -15,6 +16,8 @@ export declare class MembrsService {
15
16
  deleteToken(): void;
16
17
  isLoggedIn(): boolean;
17
18
  get profile(): any;
19
+ setProfile(decodedData: any): void;
20
+ get decodedReady$(): import("rxjs").Observable<any>;
18
21
  get token(): string;
19
22
  get admin(): boolean;
20
23
  get isLoggedInObservable(): BehaviorSubject<Boolean>;
package/package.json CHANGED
@@ -1,20 +1,16 @@
1
1
  {
2
2
  "name": "@nakedcreativity/membrs-angular-helper",
3
- "version": "0.1.4",
3
+ "version": "0.1.7",
4
4
  "peerDependencies": {
5
- "@angular/common": "^15.x",
6
- "@angular/core": "^15.x",
7
- "@uirouter/angular": "^11.x",
5
+ "@angular/common": ">=15.0.0",
6
+ "@angular/core": ">=15.0.0",
7
+ "@uirouter/angular": ">=11.0.0",
8
8
  "@auth0/angular-jwt": "^5.x"
9
9
  },
10
10
  "dependencies": {
11
11
  "tslib": "^2.0.0"
12
12
  },
13
- "module": "fesm2015/nakedcreativity-membrs-angular-helper.mjs",
14
- "es2020": "fesm2020/nakedcreativity-membrs-angular-helper.mjs",
15
- "esm2020": "esm2020/nakedcreativity-membrs-angular-helper.mjs",
16
- "fesm2020": "fesm2020/nakedcreativity-membrs-angular-helper.mjs",
17
- "fesm2015": "fesm2015/nakedcreativity-membrs-angular-helper.mjs",
13
+ "module": "fesm2022/nakedcreativity-membrs-angular-helper.mjs",
18
14
  "typings": "index.d.ts",
19
15
  "exports": {
20
16
  "./package.json": {
@@ -22,11 +18,9 @@
22
18
  },
23
19
  ".": {
24
20
  "types": "./index.d.ts",
25
- "esm2020": "./esm2020/nakedcreativity-membrs-angular-helper.mjs",
26
- "es2020": "./fesm2020/nakedcreativity-membrs-angular-helper.mjs",
27
- "es2015": "./fesm2015/nakedcreativity-membrs-angular-helper.mjs",
28
- "node": "./fesm2015/nakedcreativity-membrs-angular-helper.mjs",
29
- "default": "./fesm2020/nakedcreativity-membrs-angular-helper.mjs"
21
+ "esm2022": "./esm2022/nakedcreativity-membrs-angular-helper.mjs",
22
+ "esm": "./esm2022/nakedcreativity-membrs-angular-helper.mjs",
23
+ "default": "./fesm2022/nakedcreativity-membrs-angular-helper.mjs"
30
24
  }
31
25
  },
32
26
  "sideEffects": false
@@ -1,25 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- //import { NgBusyService } from '@nakedcreativity/ng-busy';
3
- import { finalize } from 'rxjs/operators';
4
- import * as i0 from "@angular/core";
5
- export class TokenInterceptor {
6
- constructor() { }
7
- intercept(request, next) {
8
- console.log('intercept request', localStorage.getItem('membrs'));
9
- //this.busyService.busy()
10
- request = request.clone({
11
- setHeaders: {
12
- Authorization: localStorage.getItem('membrs')
13
- }
14
- });
15
- return next.handle(request).pipe(finalize(() => {
16
- //this.busyService.finished()
17
- }));
18
- }
19
- }
20
- TokenInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TokenInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
21
- TokenInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TokenInterceptor });
22
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TokenInterceptor, decorators: [{
23
- type: Injectable
24
- }], ctorParameters: function () { return []; } });
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21lbWJycy9zcmMvbGliL2F1dGguaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVEzQywyREFBMkQ7QUFDM0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUkxQyxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLGdCQUFlLENBQUM7SUFDaEIsU0FBUyxDQUFDLE9BQXlCLEVBQUUsSUFBaUI7UUFFcEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDaEUseUJBQXlCO1FBQ3pCLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ3RCLFVBQVUsRUFBRTtnQkFDVixhQUFhLEVBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7YUFDOUM7U0FDRixDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFFLEVBQUU7WUFDNUMsNkJBQTZCO1FBQy9CLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDOzs2R0FkVSxnQkFBZ0I7aUhBQWhCLGdCQUFnQjsyRkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgSHR0cFJlcXVlc3QsXG4gIEh0dHBIYW5kbGVyLFxuICBIdHRwRXZlbnQsXG4gIEh0dHBJbnRlcmNlcHRvclxufSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG4vL2ltcG9ydCB7IE5nQnVzeVNlcnZpY2UgfSBmcm9tICdAbmFrZWRjcmVhdGl2aXR5L25nLWJ1c3knO1xuaW1wb3J0IHsgZmluYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRva2VuSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xuICBjb25zdHJ1Y3RvcigpIHt9XG4gIGludGVyY2VwdChyZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcbiAgICBcbiAgICBjb25zb2xlLmxvZygnaW50ZXJjZXB0IHJlcXVlc3QnLCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbWVtYnJzJykpXG4gICAgLy90aGlzLmJ1c3lTZXJ2aWNlLmJ1c3koKVxuICAgIHJlcXVlc3QgPSByZXF1ZXN0LmNsb25lKHtcbiAgICAgIHNldEhlYWRlcnM6IHtcbiAgICAgICAgQXV0aG9yaXphdGlvbjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21lbWJycycpXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcXVlc3QpLnBpcGUoZmluYWxpemUoKCk9PntcbiAgICAgIC8vdGhpcy5idXN5U2VydmljZS5maW5pc2hlZCgpXG4gICAgfSkpO1xuICB9XG59Il19
@@ -1,150 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { MembrsService } from './membrs.service';
4
- import { JwtModule } from "@auth0/angular-jwt";
5
- import { HttpClientModule } from "@angular/common/http";
6
- import { UIRouterModule } from '@uirouter/angular';
7
- import { Transition, UIRouter } from '@uirouter/angular';
8
- import { routerConfigFn } from './router.config';
9
- import { MembrsConfigService } from './config.service';
10
- import { retrieveToken } from './token';
11
- import * as i0 from "@angular/core";
12
- export const validateResolve = {
13
- token: 'reissue',
14
- deps: [Transition, UIRouter, MembrsService, MembrsConfigService],
15
- resolveFn: validateResolveFn
16
- };
17
- export const reissueResolve = {
18
- token: 'reissue',
19
- deps: [Transition, UIRouter, MembrsService, MembrsConfigService],
20
- resolveFn: reissueResolveFn
21
- };
22
- export const reissueState = {
23
- name: 'reissue',
24
- url: '/reissue?token',
25
- views: {},
26
- resolve: [
27
- reissueResolve
28
- ]
29
- };
30
- export function reissueResolveFn(transition, router, membrsService, membrsConfig) {
31
- //console.log(membrsService)
32
- return new Promise((resolve, reject) => {
33
- // console.log('reissue promise resolve')
34
- // console.log(transition.params().token)
35
- membrsService.reissue(transition.params().token).then((response) => {
36
- if (localStorage.getItem('redirectUrlAfterLogin')) {
37
- const redirect = localStorage.getItem('redirectUrlAfterLogin');
38
- localStorage.removeItem('redirectUrlAfterLogin');
39
- window.location.pathname = redirect;
40
- }
41
- else {
42
- router.stateService.go(membrsConfig.defaultState, {}, { inherit: false });
43
- }
44
- reject();
45
- }).catch(error => {
46
- //console.log('error in reissue resolve')
47
- //console.log(error)
48
- //window.location.href = environment.login
49
- reject(error);
50
- });
51
- });
52
- }
53
- export function validateResolveFn(transition, router, membrsService, membrsConfig) {
54
- //console.log(membrsService)
55
- return new Promise((resolve, reject) => {
56
- // console.log('validate promise resolve')
57
- membrsService.reissue().then((response) => {
58
- resolve(null);
59
- }).catch(error => {
60
- localStorage.setItem('redirectUrlAfterLogin', window.location.pathname);
61
- window.location.href = membrsConfig.login;
62
- reject(error);
63
- });
64
- });
65
- }
66
- export function jwtOptionsFactory(config) {
67
- // console.log('jwt options factory')
68
- // console.log(config)
69
- return {
70
- tokenGetter: () => {
71
- console.log('token getter', localStorage.getItem('membrs'));
72
- return localStorage.getItem('membrs');
73
- },
74
- allowedDomains: [config.api]
75
- };
76
- }
77
- /** The top level state(s) */
78
- export const STATES = [
79
- reissueState
80
- ];
81
- export class MembrsModule {
82
- static forRoot(config) {
83
- const moduleProviders = UIRouterModule.forChild({
84
- states: STATES,
85
- config: routerConfigFn
86
- }).providers;
87
- moduleProviders.push(JwtModule.forRoot({
88
- config: {
89
- tokenGetter: retrieveToken,
90
- allowedDomains: []
91
- }
92
- }).providers);
93
- moduleProviders.push(MembrsService);
94
- moduleProviders.push({ provide: MembrsConfigService, useValue: config });
95
- return {
96
- ngModule: MembrsModule,
97
- providers: moduleProviders //[{provide: MembrsConfigService,useValue: config}]
98
- };
99
- }
100
- }
101
- MembrsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MembrsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
102
- MembrsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: MembrsModule, imports: [CommonModule,
103
- HttpClientModule,
104
- JwtModule
105
- // JwtModule.forRoot({
106
- // config: {
107
- // tokenGetter: retrieveToken
108
- // }
109
- // })
110
- // UIRouterModule.forChild({
111
- // states: STATES,
112
- // config: routerConfigFn,
113
- // }),
114
- // JwtModule.forRoot({})
115
- ] });
116
- MembrsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MembrsModule, imports: [CommonModule,
117
- HttpClientModule,
118
- JwtModule
119
- // JwtModule.forRoot({
120
- // config: {
121
- // tokenGetter: retrieveToken
122
- // }
123
- // })
124
- // UIRouterModule.forChild({
125
- // states: STATES,
126
- // config: routerConfigFn,
127
- // }),
128
- // JwtModule.forRoot({})
129
- ] });
130
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MembrsModule, decorators: [{
131
- type: NgModule,
132
- args: [{
133
- imports: [
134
- CommonModule,
135
- HttpClientModule,
136
- JwtModule
137
- // JwtModule.forRoot({
138
- // config: {
139
- // tokenGetter: retrieveToken
140
- // }
141
- // })
142
- // UIRouterModule.forChild({
143
- // states: STATES,
144
- // config: routerConfigFn,
145
- // }),
146
- // JwtModule.forRoot({})
147
- ]
148
- }]
149
- }] });
150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtYnJzLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21lbWJycy9zcmMvbGliL21lbWJycy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBaUMsTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsU0FBUyxFQUFlLE1BQU0sb0JBQW9CLENBQUM7QUFDNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBR2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUM7O0FBRXhDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRztJQUMzQixLQUFLLEVBQUUsU0FBUztJQUNoQixJQUFJLEVBQUUsQ0FBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsQ0FBRTtJQUNsRSxTQUFTLEVBQUUsaUJBQWlCO0NBQy9CLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsS0FBSyxFQUFFLFNBQVM7SUFDaEIsSUFBSSxFQUFFLENBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsbUJBQW1CLENBQUU7SUFDbEUsU0FBUyxFQUFFLGdCQUFnQjtDQUM1QixDQUFBO0FBRUQsTUFBTSxDQUFDLE1B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d0JBQ04sS0FBSzt3QkFDTCw0QkFBNEI7d0JBQzVCLG9CQUFvQjt3QkFDcEIsNEJBQTRCO3dCQUM1QixNQUFNO3dCQUNOLHdCQUF3QjtxQkFDekI7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSwgTW9kdWxlV2l0aFByb3ZpZGVycywgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNZW1icnNTZXJ2aWNlIH0gZnJvbSAnLi9tZW1icnMuc2VydmljZSc7XG5pbXBvcnQgeyBKd3RNb2R1bGUsIEpXVF9PUFRJT05TIH0gZnJvbSBcIkBhdXRoMC9hbmd1bGFyLWp3dFwiO1xuaW1wb3J0IHsgSHR0cENsaWVudE1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xuaW1wb3J0IHsgVUlSb3V0ZXJNb2R1bGUgfSBmcm9tICdAdWlyb3V0ZXIvYW5ndWxhcidcblxuaW1wb3J0IHsgTmcyU3RhdGVEZWNsYXJhdGlvbiB9IGZyb20gJ0B1aXJvdXRlci9hbmd1bGFyJztcbmltcG9ydCB7IFRyYW5zaXRpb24sIFVJUm91dGVyIH0gZnJvbSAnQHVpcm91dGVyL2FuZ3VsYXInXG5cbmltcG9ydCB7IHJvdXRlckNvbmZpZ0ZuIH0gZnJvbSAnLi9yb3V0ZXIuY29uZmlnJztcbmltcG9ydCB7IE1lbWJyc0NvbmZpZyB9IGZyb20gJy4vY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBNZW1icnNDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyByZXRyaWV2ZVRva2VuIH0gZnJvbSAnLi90b2tlbic7XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVJlc29sdmUgPSB7XG4gICAgdG9rZW46ICdyZWlzc3VlJyxcbiAgICBkZXBzOiBbIFRyYW5zaXRpb24sIFVJUm91dGVyLCBNZW1icnNTZXJ2aWNlLCBNZW1icnNDb25maWdTZXJ2aWNlIF0sXG4gICAgcmVzb2x2ZUZuOiB2YWxpZGF0ZVJlc29sdmVGblxufVxuXG5leHBvcnQgY29uc3QgcmVpc3N1ZVJlc29sdmUgPSB7XG4gIHRva2VuOiAncmVpc3N1ZScsXG4gIGRlcHM6IFsgVHJhbnNpdGlvbiwgVUlSb3V0ZXIsIE1lbWJyc1NlcnZpY2UsIE1lbWJyc0NvbmZpZ1NlcnZpY2UgXSxcbiAgcmVzb2x2ZUZuOiByZWlzc3VlUmVzb2x2ZUZuXG59XG5cbmV4cG9ydCBjb25zdCByZWlzc3VlU3RhdGU6TmcyU3RhdGVEZWNsYXJhdGlvbiA9IHtcblx0bmFtZTogJ3JlaXNzdWUnLCBcblx0dXJsOiAnL3JlaXNzdWU/dG9rZW4nLFxuXHR2aWV3czogeyB9LFxuXHRyZXNvbHZlOiBbXG4gICAgcmVpc3N1ZVJlc29sdmVcblx0XVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVpc3N1ZVJlc29sdmVGbih0cmFuc2l0aW9uLCByb3V0ZXIsIG1lbWJyc1NlcnZpY2UsIG1lbWJyc0NvbmZpZzpNZW1icnNDb25maWcpIHtcbiAgICBcbiAgICAvL2NvbnNvbGUubG9nKG1lbWJyc1NlcnZpY2UpXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdyZWlzc3VlIHByb21pc2UgcmVzb2x2ZScpXG4gICAgICAvLyBjb25zb2xlLmxvZyh0cmFuc2l0aW9uLnBhcmFtcygpLnRva2VuKVxuICAgICAgbWVtYnJzU2VydmljZS5yZWlzc3VlKHRyYW5zaXRpb24ucGFyYW1zKCkudG9rZW4pLnRoZW4oKHJlc3BvbnNlKT0+e1xuICAgICAgICAgIGlmKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdyZWRpcmVjdFVybEFmdGVyTG9naW4nKSl7XG4gICAgICAgICAgICBjb25zdCByZWRpcmVjdCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdyZWRpcmVjdFVybEFmdGVyTG9naW4nKVxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3JlZGlyZWN0VXJsQWZ0ZXJMb2dpbicpXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgPSByZWRpcmVjdFxuICAgICAgICAgIH1lbHNlIHtcbiAgICAgICAgICAgIHJvdXRlci5zdGF0ZVNlcnZpY2UuZ28obWVtYnJzQ29uZmlnLmRlZmF1bHRTdGF0ZSwge30sIHtpbmhlcml0OmZhbHNlfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVqZWN0KClcbiAgICAgIH0pLmNhdGNoKGVycm9yPT57XG4gICAgICAgICAgLy9jb25zb2xlLmxvZygnZXJyb3IgaW4gcmVpc3N1ZSByZXNvbHZlJylcbiAgICAgICAgICAvL2NvbnNvbGUubG9nKGVycm9yKVxuICAgICAgICAgIC8vd2luZG93LmxvY2F0aW9uLmhyZWYgPSBlbnZpcm9ubWVudC5sb2dpblxuICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgIH0pXG5cblx0fSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUmVzb2x2ZUZuKHRyYW5zaXRpb24sIHJvdXRlciwgbWVtYnJzU2VydmljZSwgbWVtYnJzQ29uZmlnOk1lbWJyc0NvbmZpZykge1xuICBcbiAgLy9jb25zb2xlLmxvZyhtZW1icnNTZXJ2aWNlKVxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIC8vIGNvbnNvbGUubG9nKCd2YWxpZGF0ZSBwcm9taXNlIHJlc29sdmUnKVxuICAgIFxuICAgIG1lbWJyc1NlcnZpY2UucmVpc3N1ZSgpLnRoZW4oKHJlc3BvbnNlKT0+e1xuICAgICAgcmVzb2x2ZShudWxsKVxuICAgIH0pLmNhdGNoKGVycm9yPT57XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncmVkaXJlY3RVcmxBZnRlckxvZ2luJywgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKVxuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBtZW1icnNDb25maWcubG9naW5cbiAgICAgIHJlamVjdChlcnJvcilcbiAgICB9KVxuXG59KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gand0T3B0aW9uc0ZhY3RvcnkoY29uZmlnKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdqd3Qgb3B0aW9ucyBmYWN0b3J5JylcbiAgLy8gY29uc29sZS5sb2coY29uZmlnKVxuICByZXR1cm4ge1xuICAgIHRva2VuR2V0dGVyOiAoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygndG9rZW4gZ2V0dGVyJywgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdtZW1icnMnKSlcbiAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbWVtYnJzJyk7XG4gICAgfSxcbiAgICBhbGxvd2VkRG9tYWluczogW2NvbmZpZy5hcGldXG4gIH1cbn1cblxuXG4vKiogVGhlIHRvcCBsZXZlbCBzdGF0ZShzKSAqL1xuZXhwb3J0IGNvbnN0IFNUQVRFUyA9IFtcbiAgICByZWlzc3VlU3RhdGVcbl1cblxuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEh0dHBDbGllbnRNb2R1bGUsXG4gICAgSnd0TW9kdWxlXG4gICAgLy8gSnd0TW9kdWxlLmZvclJvb3Qoe1xuICAgIC8vICAgY29uZmlnOiB7XG4gICAgLy8gICAgIHRva2VuR2V0dGVyOiByZXRyaWV2ZVRva2VuXG4gICAgLy8gICB9XG4gICAgLy8gfSlcbiAgICAvLyBVSVJvdXRlck1vZHVsZS5mb3JDaGlsZCh7XG4gICAgLy8gICBzdGF0ZXM6IFNUQVRFUyxcbiAgICAvLyAgIGNvbmZpZzogcm91dGVyQ29uZmlnRm4sXG4gICAgLy8gfSksXG4gICAgLy8gSnd0TW9kdWxlLmZvclJvb3Qoe30pXG4gIF1cbn0pXG5cblxuXG5leHBvcnQgY2xhc3MgTWVtYnJzTW9kdWxlIHsgXG4gIHN0YXRpYyBmb3JSb290KGNvbmZpZzogTWVtYnJzQ29uZmlnKTogTW9kdWxlV2l0aFByb3ZpZGVyczxNZW1icnNNb2R1bGU+IHtcblxuXG4gICAgY29uc3QgbW9kdWxlUHJvdmlkZXJzID0gVUlSb3V0ZXJNb2R1bGUuZm9yQ2hpbGQoe1xuICAgICAgc3RhdGVzOiBTVEFURVMsXG4gICAgICBjb25maWc6IHJvdXRlckNvbmZpZ0ZuXG4gICAgfSkucHJvdmlkZXJzXG5cbiAgICBtb2R1bGVQcm92aWRlcnMucHVzaChKd3RNb2R1bGUuZm9yUm9vdCh7XG4gICAgICBjb25maWc6IHtcbiAgICAgICAgdG9rZW5HZXR0ZXI6IHJldHJpZXZlVG9rZW4sXG4gICAgICAgIGFsbG93ZWREb21haW5zOiBbXVxuICAgICAgfVxuICAgIH0pLnByb3ZpZGVycylcbiAgICAgIFxuICAgIG1vZHVsZVByb3ZpZGVycy5wdXNoKE1lbWJyc1NlcnZpY2UpXG4gICAgbW9kdWxlUHJvdmlkZXJzLnB1c2goe3Byb3ZpZGU6IE1lbWJyc0NvbmZpZ1NlcnZpY2UsdXNlVmFsdWU6IGNvbmZpZ30pO1xuICAgIFxuICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBNZW1icnNNb2R1bGUsIFxuICAgICAgcHJvdmlkZXJzOiBtb2R1bGVQcm92aWRlcnMgLy9be3Byb3ZpZGU6IE1lbWJyc0NvbmZpZ1NlcnZpY2UsdXNlVmFsdWU6IGNvbmZpZ31dXG4gICAgfTtcbiAgICBcbiAgfVxuXG59XG4iXX0=