@alauda-fe/common 1.3.1 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/api/auth-api.service.d.ts +14 -0
  2. package/api/platform-ui.service.d.ts +1 -0
  3. package/api/public-api.d.ts +1 -0
  4. package/array-form-table/form/component.d.ts +6 -2
  5. package/assets/icons/icon-refresh-drag.svg +1 -0
  6. package/authorization/interceptor.service.d.ts +2 -1
  7. package/authorization/public-api.d.ts +1 -0
  8. package/authorization/session-manage.service.d.ts +2 -4
  9. package/authorization/state.service.d.ts +19 -18
  10. package/authorization/storage-token.d.ts +4 -10
  11. package/core/constants/patterns.d.ts +4 -0
  12. package/core/directives/feature-gate.directive.d.ts +2 -1
  13. package/core/module.d.ts +21 -21
  14. package/core/pipes/minimum-format.pipe.d.ts +1 -1
  15. package/core/pipes/time.pipe.d.ts +1 -1
  16. package/core/services/context.service.d.ts +3 -4
  17. package/core/services/feature-gate.service.d.ts +1 -0
  18. package/core/services/workspace-helper.service.d.ts +3 -1
  19. package/core/types/commons.d.ts +2 -0
  20. package/core/types/k8s/crd.d.ts +64 -0
  21. package/core/types/resource-definitions.d.ts +3 -3
  22. package/core/utils/cache-store.d.ts +15 -13
  23. package/core/utils/common.d.ts +1 -2
  24. package/core/utils/public-api.d.ts +1 -0
  25. package/core/utils/router.d.ts +3 -0
  26. package/editable/editable.component.d.ts +23 -0
  27. package/editable/editable.directive.d.ts +9 -0
  28. package/editable/editable.type.d.ts +5 -0
  29. package/editable/public-api.d.ts +2 -0
  30. package/effect-directive/event.directive.d.ts +36 -0
  31. package/esm2022/api/auth-api.service.mjs +34 -0
  32. package/esm2022/api/platform-ui.service.mjs +2 -1
  33. package/esm2022/api/public-api.mjs +2 -1
  34. package/esm2022/array-form-table/form/component.mjs +30 -15
  35. package/esm2022/authorization/guard.service.mjs +2 -2
  36. package/esm2022/authorization/interceptor.service.mjs +31 -24
  37. package/esm2022/authorization/public-api.mjs +2 -1
  38. package/esm2022/authorization/session-manage.service.mjs +11 -24
  39. package/esm2022/authorization/state.service.mjs +94 -100
  40. package/esm2022/authorization/storage-token.mjs +12 -88
  41. package/esm2022/core/constants/patterns.mjs +6 -4
  42. package/esm2022/core/directives/feature-gate.directive.mjs +7 -4
  43. package/esm2022/core/guards/feature.guard.mjs +3 -2
  44. package/esm2022/core/module.mjs +7 -12
  45. package/esm2022/core/pipes/minimum-format.pipe.mjs +4 -3
  46. package/esm2022/core/pipes/time.pipe.mjs +3 -3
  47. package/esm2022/core/services/context.service.mjs +9 -12
  48. package/esm2022/core/services/feature-gate.service.mjs +4 -3
  49. package/esm2022/core/services/workspace-helper.service.mjs +7 -1
  50. package/esm2022/core/types/commons.mjs +1 -1
  51. package/esm2022/core/types/k8s/crd.mjs +8 -1
  52. package/esm2022/core/types/resource-definitions.mjs +2 -2
  53. package/esm2022/core/utils/cache-store.mjs +51 -29
  54. package/esm2022/core/utils/common.mjs +8 -10
  55. package/esm2022/core/utils/public-api.mjs +2 -1
  56. package/esm2022/core/utils/router.mjs +20 -0
  57. package/esm2022/editable/editable.component.mjs +136 -0
  58. package/esm2022/editable/editable.directive.mjs +25 -0
  59. package/esm2022/editable/editable.type.mjs +6 -0
  60. package/esm2022/editable/public-api.mjs +3 -0
  61. package/esm2022/effect-directive/event.directive.mjs +79 -4
  62. package/esm2022/exec/terminal/component.mjs +12 -19
  63. package/esm2022/k8s-resource-list/footer/component.mjs +63 -25
  64. package/esm2022/k8s-resource-list/k8s-resource-list.module.mjs +18 -6
  65. package/esm2022/k8s-resource-list/utils.mjs +7 -3
  66. package/esm2022/multi-search/multi-search-tags/component.mjs +2 -2
  67. package/esm2022/multi-search/types.mjs +1 -1
  68. package/esm2022/page-scaffold/navigation/breadcrumb/breadcrumb.component.mjs +55 -53
  69. package/esm2022/page-scaffold/navigation/navconfig-loader/navconfig-loader.service.mjs +4 -4
  70. package/esm2022/page-scaffold/page-header/account-menu/component/component.mjs +3 -8
  71. package/esm2022/page-scaffold/page-header/common-layout/product-select/component.mjs +6 -10
  72. package/esm2022/pie-derivative-chart/pie-derivative-chart.module.mjs +6 -6
  73. package/esm2022/pie-derivative-chart/radial-bar/radial-bar-chart.component.mjs +51 -40
  74. package/esm2022/pie-derivative-chart/units.mjs +14 -0
  75. package/esm2022/pod-status/component.mjs +34 -55
  76. package/esm2022/public-api.mjs +2 -1
  77. package/esm2022/searchable-selector/component.mjs +2 -2
  78. package/esm2022/table/component.mjs +47 -30
  79. package/esm2022/table/module.mjs +1 -1
  80. package/esm2022/view-chart/view-chart.component.mjs +5 -8
  81. package/esm2022/widget/public-api.mjs +2 -1
  82. package/esm2022/widget/resource-label/component.mjs +131 -0
  83. package/esm2022/widget/zero-state/zero-state.component.mjs +36 -21
  84. package/exec/terminal/component.d.ts +1 -3
  85. package/k8s-resource-list/footer/component.d.ts +8 -1
  86. package/k8s-resource-list/k8s-resource-list.module.d.ts +1 -1
  87. package/multi-search/types.d.ts +1 -0
  88. package/package.json +1 -1
  89. package/page-scaffold/page-header/common-layout/product-select/component.d.ts +1 -3
  90. package/pie-derivative-chart/radial-bar/radial-bar-chart.component.d.ts +4 -0
  91. package/pie-derivative-chart/units.d.ts +2 -0
  92. package/pod-status/component.d.ts +1 -3
  93. package/public-api.d.ts +1 -0
  94. package/styles/global.scss +1 -0
  95. package/styles/tailwind-preset.scss +1 -1
  96. package/table/component.d.ts +4 -3
  97. package/widget/public-api.d.ts +1 -0
  98. package/widget/resource-label/component.d.ts +25 -0
  99. package/widget/zero-state/zero-state.component.d.ts +4 -1
@@ -9,4 +9,5 @@ export * from './interceptor.service';
9
9
  export * from './app-init-url';
10
10
  export * from './session-manage.service';
11
11
  export * from './state.service';
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9hdXRob3JpemF0aW9uL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILGNBQWM7QUFDZCxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsaUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFtbaW5jbHVkZTphdXRob3JpemF0aW9uL1JFQURNRS5tZF1dXG4gKiBAbW9kdWxlIGF1dGhvcml6YXRpb25cbiAqIEBwcmVmZXJyZWRcbiAqL1xuXG4vKiogaW1wb3J0cyAqL1xuZXhwb3J0ICogZnJvbSAnLi9ndWFyZC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJjZXB0b3Iuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2FwcC1pbml0LXVybCc7XG5leHBvcnQgKiBmcm9tICcuL3Nlc3Npb24tbWFuYWdlLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zdGF0ZS5zZXJ2aWNlJztcbiJdfQ==
12
+ export * from './storage-token';
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9hdXRob3JpemF0aW9uL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILGNBQWM7QUFDZCxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogW1tpbmNsdWRlOmF1dGhvcml6YXRpb24vUkVBRE1FLm1kXV1cbiAqIEBtb2R1bGUgYXV0aG9yaXphdGlvblxuICogQHByZWZlcnJlZFxuICovXG5cbi8qKiBpbXBvcnRzICovXG5leHBvcnQgKiBmcm9tICcuL2d1YXJkLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmNlcHRvci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vYXBwLWluaXQtdXJsJztcbmV4cG9ydCAqIGZyb20gJy4vc2Vzc2lvbi1tYW5hZ2Uuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3N0YXRlLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zdG9yYWdlLXRva2VuJztcbiJdfQ==
@@ -1,43 +1,30 @@
1
1
  import { HttpClient } from '@angular/common/http';
2
2
  import { Inject, Injectable } from '@angular/core';
3
- import { asyncScheduler, bufferTime, filter, fromEvent, map, merge, subscribeOn, switchMap, withLatestFrom, } from 'rxjs';
3
+ import { bufferTime, filter, fromEvent, merge, switchMap, withLatestFrom, } from 'rxjs';
4
4
  import { PageVisibilityService } from '../api/page-visibility.service';
5
- import { API_GATEWAY, K8sApiService, TOKEN_DISABLE_SESSION_MANAGE, publishRef, skipError, } from '../public-api';
5
+ import { getGlobalEnvironments } from '../core/constants/public-api';
6
+ import { API_GATEWAY, TOKEN_DISABLE_SESSION_MANAGE, skipError, } from '../public-api';
6
7
  import * as i0 from "@angular/core";
7
8
  import * as i1 from "@angular/common/http";
8
9
  import * as i2 from "../api/page-visibility.service";
9
- import * as i3 from "../public-api";
10
10
  const EVENT_TRIGGERS = ['click', 'keypress'];
11
- const HEARTBEAT_POLLING = 15_000;
11
+ export const HEARTBEAT_POLLING = 15_000;
12
12
  export const SESSION_MANAGE_KEY = 'session-manage-construct-time';
13
13
  export class SessionManageService {
14
- constructor(http, pageVisibility, k8sApi, disabled) {
14
+ constructor(http, pageVisibility, disabled) {
15
15
  this.http = http;
16
16
  this.pageVisibility = pageVisibility;
17
- this.k8sApi = k8sApi;
18
17
  this.visibility$ = this.pageVisibility.getPageVisibility();
19
- this.policy$ = this.k8sApi
20
- .getGlobalResource({
21
- definition: {
22
- type: 'userpolicies',
23
- apiGroup: 'security.alauda.io',
24
- apiVersion: 'v1alpha1',
25
- },
26
- name: 'user-security-policy',
27
- })
28
- .pipe(map(p => p.rules
29
- .find(r => r.name === 'AccessControlPolicy')
30
- ?.items?.find(i => i.key === 'SESSION_SWITCH')?.enable), subscribeOn(asyncScheduler), publishRef());
31
18
  this.userAction$ = merge(...EVENT_TRIGGERS.map(ev => fromEvent(document, ev)))
32
- .pipe(bufferTime(HEARTBEAT_POLLING), withLatestFrom(this.visibility$, this.policy$))
33
- .pipe(filter(([_, v, p]) => v && p), switchMap(([i]) => this.http
19
+ .pipe(bufferTime(HEARTBEAT_POLLING), withLatestFrom(this.visibility$))
20
+ .pipe(filter(([_, visible]) => visible), switchMap(([i]) => this.http
34
21
  .get(`${API_GATEWAY}/auth/v1/heartbeat`, {
35
22
  params: { action: !!i.length },
36
23
  })
37
24
  .pipe(
38
25
  // 错误由 HttpInterceptor 处理,仅由 HttpInterceptor 主动结束此流,自身一直进行心跳
39
26
  skipError())));
40
- if (!disabled) {
27
+ if (!disabled && getGlobalEnvironments('CPAAS_SESSION_SWITCH') === 'on') {
41
28
  sessionStorage.setItem(SESSION_MANAGE_KEY, String(Date.now()));
42
29
  this.subscription = this.userAction$.subscribe();
43
30
  }
@@ -45,7 +32,7 @@ export class SessionManageService {
45
32
  complete() {
46
33
  this.subscription?.unsubscribe();
47
34
  }
48
- static { this.ɵfac = function SessionManageService_Factory(t) { return new (t || SessionManageService)(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.PageVisibilityService), i0.ɵɵinject(i3.K8sApiService), i0.ɵɵinject(TOKEN_DISABLE_SESSION_MANAGE)); }; }
35
+ static { this.ɵfac = function SessionManageService_Factory(t) { return new (t || SessionManageService)(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.PageVisibilityService), i0.ɵɵinject(TOKEN_DISABLE_SESSION_MANAGE)); }; }
49
36
  static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: SessionManageService, factory: SessionManageService.ɵfac, providedIn: 'root' }); }
50
37
  }
51
38
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SessionManageService, [{
@@ -53,8 +40,8 @@ export class SessionManageService {
53
40
  args: [{
54
41
  providedIn: 'root',
55
42
  }]
56
- }], () => [{ type: i1.HttpClient }, { type: i2.PageVisibilityService }, { type: i3.K8sApiService }, { type: undefined, decorators: [{
43
+ }], () => [{ type: i1.HttpClient }, { type: i2.PageVisibilityService }, { type: undefined, decorators: [{
57
44
  type: Inject,
58
45
  args: [TOKEN_DISABLE_SESSION_MANAGE]
59
46
  }] }], null); })();
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi1tYW5hZ2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9hdXRob3JpemF0aW9uL3Nlc3Npb24tbWFuYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFFTCxjQUFjLEVBQ2QsVUFBVSxFQUNWLE1BQU0sRUFDTixTQUFTLEVBQ1QsR0FBRyxFQUNILEtBQUssRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUNULGNBQWMsR0FDZixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sRUFDTCxXQUFXLEVBQ1gsYUFBYSxFQUViLDRCQUE0QixFQUM1QixVQUFVLEVBQ1YsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDOzs7OztBQUV2QixNQUFNLGNBQWMsR0FBRyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztBQUM3QyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztBQUNqQyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywrQkFBK0IsQ0FBQztBQUtsRSxNQUFNLE9BQU8sb0JBQW9CO0lBNEMvQixZQUNtQixJQUFnQixFQUNoQixjQUFxQyxFQUNyQyxNQUFxQixFQUNBLFFBQWlCO1FBSHRDLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBQ3JDLFdBQU0sR0FBTixNQUFNLENBQWU7UUE3Q3ZCLGdCQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3RELFlBQU8sR0FBRyxJQUFJLENBQUMsTUFBTTthQUNuQyxpQkFBaUIsQ0FBeUI7WUFDekMsVUFBVSxFQUFFO2dCQUNWLElBQUksRUFBRSxjQUFjO2dCQUNwQixRQUFRLEVBQUUsb0JBQW9CO2dCQUM5QixVQUFVLEVBQUUsVUFBVTthQUN2QjtZQUNELElBQUksRUFBRSxzQkFBc0I7U0FDN0IsQ0FBQzthQUNELElBQUksQ0FDSCxHQUFHLENBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FDRixDQUFDLENBQUMsS0FBSzthQUNKLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUsscUJBQXFCLENBQUM7WUFDNUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxnQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sQ0FDM0QsRUFDRCxXQUFXLENBQUMsY0FBYyxDQUFDLEVBQzNCLFVBQVUsRUFBRSxDQUNiLENBQUM7UUFFYSxnQkFBVyxHQUFHLEtBQUssQ0FDbEMsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUNyRDthQUNFLElBQUksQ0FDSCxVQUFVLENBQUMsaUJBQWlCLENBQUMsRUFDN0IsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUMvQzthQUNBLElBQUksQ0FDSCxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFDN0IsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ2hCLElBQUksQ0FBQyxJQUFJO2FBQ04sR0FBRyxDQUFDLEdBQUcsV0FBVyxvQkFBb0IsRUFBRTtZQUN2QyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUU7U0FDL0IsQ0FBQzthQUNELElBQUk7UUFDSCw0REFBNEQ7UUFDNUQsU0FBUyxFQUFFLENBQ1osQ0FDSixDQUNGLENBQUM7UUFRRixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxjQUFjLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuRCxDQUFDO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQ25DLENBQUM7cUZBMURVLG9CQUFvQixnSEFnRHJCLDRCQUE0Qjt1RUFoRDNCLG9CQUFvQixXQUFwQixvQkFBb0IsbUJBRm5CLE1BQU07O2lGQUVQLG9CQUFvQjtjQUhoQyxVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7O3NCQWlESSxNQUFNO3VCQUFDLDRCQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIFN1YnNjcmlwdGlvbixcbiAgYXN5bmNTY2hlZHVsZXIsXG4gIGJ1ZmZlclRpbWUsXG4gIGZpbHRlcixcbiAgZnJvbUV2ZW50LFxuICBtYXAsXG4gIG1lcmdlLFxuICBzdWJzY3JpYmVPbixcbiAgc3dpdGNoTWFwLFxuICB3aXRoTGF0ZXN0RnJvbSxcbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFBhZ2VWaXNpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL2FwaS9wYWdlLXZpc2liaWxpdHkuc2VydmljZSc7XG5pbXBvcnQge1xuICBBUElfR0FURVdBWSxcbiAgSzhzQXBpU2VydmljZSxcbiAgU2VjdXJpdHlQb2xpY3lSZXNvdXJjZSxcbiAgVE9LRU5fRElTQUJMRV9TRVNTSU9OX01BTkFHRSxcbiAgcHVibGlzaFJlZixcbiAgc2tpcEVycm9yLFxufSBmcm9tICcuLi9wdWJsaWMtYXBpJztcblxuY29uc3QgRVZFTlRfVFJJR0dFUlMgPSBbJ2NsaWNrJywgJ2tleXByZXNzJ107XG5jb25zdCBIRUFSVEJFQVRfUE9MTElORyA9IDE1XzAwMDtcbmV4cG9ydCBjb25zdCBTRVNTSU9OX01BTkFHRV9LRVkgPSAnc2Vzc2lvbi1tYW5hZ2UtY29uc3RydWN0LXRpbWUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgU2Vzc2lvbk1hbmFnZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IHZpc2liaWxpdHkkID0gdGhpcy5wYWdlVmlzaWJpbGl0eS5nZXRQYWdlVmlzaWJpbGl0eSgpO1xuICBwcml2YXRlIHJlYWRvbmx5IHBvbGljeSQgPSB0aGlzLms4c0FwaVxuICAgIC5nZXRHbG9iYWxSZXNvdXJjZTxTZWN1cml0eVBvbGljeVJlc291cmNlPih7XG4gICAgICBkZWZpbml0aW9uOiB7XG4gICAgICAgIHR5cGU6ICd1c2VycG9saWNpZXMnLFxuICAgICAgICBhcGlHcm91cDogJ3NlY3VyaXR5LmFsYXVkYS5pbycsXG4gICAgICAgIGFwaVZlcnNpb246ICd2MWFscGhhMScsXG4gICAgICB9LFxuICAgICAgbmFtZTogJ3VzZXItc2VjdXJpdHktcG9saWN5JyxcbiAgICB9KVxuICAgIC5waXBlKFxuICAgICAgbWFwKFxuICAgICAgICBwID0+XG4gICAgICAgICAgcC5ydWxlc1xuICAgICAgICAgICAgLmZpbmQociA9PiByLm5hbWUgPT09ICdBY2Nlc3NDb250cm9sUG9saWN5JylcbiAgICAgICAgICAgID8uaXRlbXM/LmZpbmQoaSA9PiBpLmtleSA9PT0gJ1NFU1NJT05fU1dJVENIJyk/LmVuYWJsZSxcbiAgICAgICksXG4gICAgICBzdWJzY3JpYmVPbihhc3luY1NjaGVkdWxlciksXG4gICAgICBwdWJsaXNoUmVmKCksXG4gICAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJBY3Rpb24kID0gbWVyZ2UoXG4gICAgLi4uRVZFTlRfVFJJR0dFUlMubWFwKGV2ID0+IGZyb21FdmVudChkb2N1bWVudCwgZXYpKSxcbiAgKVxuICAgIC5waXBlKFxuICAgICAgYnVmZmVyVGltZShIRUFSVEJFQVRfUE9MTElORyksXG4gICAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLnZpc2liaWxpdHkkLCB0aGlzLnBvbGljeSQpLFxuICAgIClcbiAgICAucGlwZShcbiAgICAgIGZpbHRlcigoW18sIHYsIHBdKSA9PiB2ICYmIHApLFxuICAgICAgc3dpdGNoTWFwKChbaV0pID0+XG4gICAgICAgIHRoaXMuaHR0cFxuICAgICAgICAgIC5nZXQoYCR7QVBJX0dBVEVXQVl9L2F1dGgvdjEvaGVhcnRiZWF0YCwge1xuICAgICAgICAgICAgcGFyYW1zOiB7IGFjdGlvbjogISFpLmxlbmd0aCB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAvLyDplJnor6/nlLEgSHR0cEludGVyY2VwdG9yIOWkhOeQhu+8jOS7heeUsSBIdHRwSW50ZXJjZXB0b3Ig5Li75Yqo57uT5p2f5q2k5rWB77yM6Ieq6Lqr5LiA55u06L+b6KGM5b+D6LezXG4gICAgICAgICAgICBza2lwRXJyb3IoKSxcbiAgICAgICAgICApLFxuICAgICAgKSxcbiAgICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VWaXNpYmlsaXR5OiBQYWdlVmlzaWJpbGl0eVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBrOHNBcGk6IEs4c0FwaVNlcnZpY2UsXG4gICAgQEluamVjdChUT0tFTl9ESVNBQkxFX1NFU1NJT05fTUFOQUdFKSBkaXNhYmxlZDogYm9vbGVhbixcbiAgKSB7XG4gICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShTRVNTSU9OX01BTkFHRV9LRVksIFN0cmluZyhEYXRlLm5vdygpKSk7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMudXNlckFjdGlvbiQuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgY29tcGxldGUoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiJdfQ==
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi1tYW5hZ2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9hdXRob3JpemF0aW9uL3Nlc3Npb24tbWFuYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFFTCxVQUFVLEVBQ1YsTUFBTSxFQUNOLFNBQVMsRUFDVCxLQUFLLEVBQ0wsU0FBUyxFQUNULGNBQWMsR0FDZixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3JFLE9BQU8sRUFDTCxXQUFXLEVBQ1gsNEJBQTRCLEVBQzVCLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQzs7OztBQUV2QixNQUFNLGNBQWMsR0FBRyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztBQUM3QyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUM7QUFDeEMsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsK0JBQStCLENBQUM7QUFLbEUsTUFBTSxPQUFPLG9CQUFvQjtJQXNCL0IsWUFDbUIsSUFBZ0IsRUFDaEIsY0FBcUMsRUFDaEIsUUFBaUI7UUFGdEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixtQkFBYyxHQUFkLGNBQWMsQ0FBdUI7UUF0QnZDLGdCQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXRELGdCQUFXLEdBQUcsS0FBSyxDQUNsQyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQ3JEO2FBQ0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDckUsSUFBSSxDQUNILE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFDakMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ2hCLElBQUksQ0FBQyxJQUFJO2FBQ04sR0FBRyxDQUFDLEdBQUcsV0FBVyxvQkFBb0IsRUFBRTtZQUN2QyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUU7U0FDL0IsQ0FBQzthQUNELElBQUk7UUFDSCw0REFBNEQ7UUFDNUQsU0FBUyxFQUFFLENBQ1osQ0FDSixDQUNGLENBQUM7UUFPRixJQUFJLENBQUMsUUFBUSxJQUFJLHFCQUFxQixDQUFDLHNCQUFzQixDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDeEUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUNuQyxDQUFDO3FGQW5DVSxvQkFBb0IsaUZBeUJyQiw0QkFBNEI7dUVBekIzQixvQkFBb0IsV0FBcEIsb0JBQW9CLG1CQUZuQixNQUFNOztpRkFFUCxvQkFBb0I7Y0FIaEMsVUFBVTtlQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COztzQkEwQkksTUFBTTt1QkFBQyw0QkFBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBTdWJzY3JpcHRpb24sXG4gIGJ1ZmZlclRpbWUsXG4gIGZpbHRlcixcbiAgZnJvbUV2ZW50LFxuICBtZXJnZSxcbiAgc3dpdGNoTWFwLFxuICB3aXRoTGF0ZXN0RnJvbSxcbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFBhZ2VWaXNpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL2FwaS9wYWdlLXZpc2liaWxpdHkuc2VydmljZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxFbnZpcm9ubWVudHMgfSBmcm9tICcuLi9jb3JlL2NvbnN0YW50cy9wdWJsaWMtYXBpJztcbmltcG9ydCB7XG4gIEFQSV9HQVRFV0FZLFxuICBUT0tFTl9ESVNBQkxFX1NFU1NJT05fTUFOQUdFLFxuICBza2lwRXJyb3IsXG59IGZyb20gJy4uL3B1YmxpYy1hcGknO1xuXG5jb25zdCBFVkVOVF9UUklHR0VSUyA9IFsnY2xpY2snLCAna2V5cHJlc3MnXTtcbmV4cG9ydCBjb25zdCBIRUFSVEJFQVRfUE9MTElORyA9IDE1XzAwMDtcbmV4cG9ydCBjb25zdCBTRVNTSU9OX01BTkFHRV9LRVkgPSAnc2Vzc2lvbi1tYW5hZ2UtY29uc3RydWN0LXRpbWUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgU2Vzc2lvbk1hbmFnZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IHZpc2liaWxpdHkkID0gdGhpcy5wYWdlVmlzaWJpbGl0eS5nZXRQYWdlVmlzaWJpbGl0eSgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckFjdGlvbiQgPSBtZXJnZShcbiAgICAuLi5FVkVOVF9UUklHR0VSUy5tYXAoZXYgPT4gZnJvbUV2ZW50KGRvY3VtZW50LCBldikpLFxuICApXG4gICAgLnBpcGUoYnVmZmVyVGltZShIRUFSVEJFQVRfUE9MTElORyksIHdpdGhMYXRlc3RGcm9tKHRoaXMudmlzaWJpbGl0eSQpKVxuICAgIC5waXBlKFxuICAgICAgZmlsdGVyKChbXywgdmlzaWJsZV0pID0+IHZpc2libGUpLFxuICAgICAgc3dpdGNoTWFwKChbaV0pID0+XG4gICAgICAgIHRoaXMuaHR0cFxuICAgICAgICAgIC5nZXQoYCR7QVBJX0dBVEVXQVl9L2F1dGgvdjEvaGVhcnRiZWF0YCwge1xuICAgICAgICAgICAgcGFyYW1zOiB7IGFjdGlvbjogISFpLmxlbmd0aCB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAvLyDplJnor6/nlLEgSHR0cEludGVyY2VwdG9yIOWkhOeQhu+8jOS7heeUsSBIdHRwSW50ZXJjZXB0b3Ig5Li75Yqo57uT5p2f5q2k5rWB77yM6Ieq6Lqr5LiA55u06L+b6KGM5b+D6LezXG4gICAgICAgICAgICBza2lwRXJyb3IoKSxcbiAgICAgICAgICApLFxuICAgICAgKSxcbiAgICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VWaXNpYmlsaXR5OiBQYWdlVmlzaWJpbGl0eVNlcnZpY2UsXG4gICAgQEluamVjdChUT0tFTl9ESVNBQkxFX1NFU1NJT05fTUFOQUdFKSBkaXNhYmxlZDogYm9vbGVhbixcbiAgKSB7XG4gICAgaWYgKCFkaXNhYmxlZCAmJiBnZXRHbG9iYWxFbnZpcm9ubWVudHMoJ0NQQUFTX1NFU1NJT05fU1dJVENIJykgPT09ICdvbicpIHtcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oU0VTU0lPTl9NQU5BR0VfS0VZLCBTdHJpbmcoRGF0ZS5ub3coKSkpO1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLnVzZXJBY3Rpb24kLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBsZXRlKCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iXX0=
@@ -4,59 +4,70 @@
4
4
  */
5
5
  import { HttpClient } from '@angular/common/http';
6
6
  import { Injectable, inject } from '@angular/core';
7
- import { decodeUrl } from 'ab64';
8
- import { EMPTY, Subject, concat, of, catchError, map, shareReplay, switchMap, tap, pipe, from, } from 'rxjs';
9
- import { API_GATEWAY, NOT_NOTIFY_ON_ERROR_HEADERS, publishRef, getTopWindow, } from '../core/public-api';
7
+ import { EMPTY, of, catchError, map, shareReplay, switchMap, tap, pipe, timeout, timer, fromEvent, merge, } from 'rxjs';
8
+ import { NOT_NOTIFY_ON_ERROR_HEADERS, publishRef, getTopWindow, skipError, getGlobalEnvironments, TRUE, } from '../core/public-api';
10
9
  import { getInitUrl } from './app-init-url';
11
- import { asyncReadStorageToken, cleanStorageToken, readStorageToken, readStorageType, writeStorageToken, } from './storage-token';
10
+ import { HEARTBEAT_POLLING } from './session-manage.service';
11
+ import { cleanStorageToken, readStorageAliveRecord, readStorageToken, refreshStorageAliveRecord, writeStorageToken, } from './storage-token';
12
12
  import * as i0 from "@angular/core";
13
13
  export const STORAGE_TYPE_KEY = 'token_storage';
14
- export const ID_TOKEN_KEY = 'id_token';
15
- export const REFRESH_TOKEN_KEY = 'refresh_token';
16
14
  export const CODE_KEY = 'code';
17
- const LOGIN_API = '/console/api/v1/token/login';
18
- const CALLBACK_API = '/console/api/v1/token/callback';
19
- const TOKEN_REFRESH_API = '/console/api/v1/token/refresh';
20
- const TOKEN_INFO_API = '/console/api/v1/token/info';
15
+ export const ID_TOKEN_KEY = 'id_token';
16
+ const LOADING_CACHE = 15_000;
17
+ const LOGIN_API = '/console/api/v2/token/login';
18
+ const LOGOUT_API = '/console/api/v2/token/logout';
19
+ const CALLBACK_API = '/console/api/v2/token/callback';
20
+ const TOKEN_REFRESH_API = '/console/api/v2/token/refresh';
21
+ const TOKEN_INFO_API = '/console/api/v2/token/info';
22
+ const EXTERNAL_REDIRECT_API = '/console/api/v2/token/redirect';
21
23
  const REDIRECT_URIS = new Set(['redirect_uri', 'post_logout_redirect_uri']);
22
24
  export class AuthorizationStateService {
23
25
  constructor() {
24
26
  this.http = inject(HttpClient);
25
- this.refreshToken$$ = new Subject();
26
- this.state$ = this.getAuthConfiguration().pipe(switchMap(config => concat(this.getExistedToken(config), this.refreshToken$$).pipe(map(token => ({ ...config, ...token })))), tap(state => {
27
- this.stateSnapshot = state;
28
- if (!state.idToken) {
27
+ this.state$ = this.getAuthConfiguration().pipe(switchMap(config => this.getExistedToken(config).pipe(switchMap(token => this.http.get(TOKEN_INFO_API, {}).pipe(skipError(null), map(info => ({
28
+ ...config,
29
+ ...token,
30
+ info,
31
+ })))))), tap(state => {
32
+ if (!state.info) {
29
33
  this.logout(true);
30
34
  }
31
- this.payloadSnapshot = getAccountInfo(state);
35
+ this.stateSnapshot = state;
36
+ this.payloadSnapshot = state.info;
32
37
  }), shareReplay(1));
33
- this.checkTokenCache = {};
38
+ this.checkTokenCache$ = null;
34
39
  this.stateSnapshot = null;
40
+ if (getGlobalEnvironments('CLOSE_BROWSER_END_SESSION') === TRUE) {
41
+ this.state$
42
+ .pipe(switchMap(state => {
43
+ const aliveRecord = readStorageAliveRecord();
44
+ if (!aliveRecord ||
45
+ Date.now() - aliveRecord > HEARTBEAT_POLLING + LOADING_CACHE) {
46
+ this.logout();
47
+ return EMPTY;
48
+ }
49
+ return of(state);
50
+ }), switchMap(() => {
51
+ return merge(timer(0, HEARTBEAT_POLLING), fromEvent(window, 'beforeunload'));
52
+ }))
53
+ .subscribe(refreshStorageAliveRecord);
54
+ }
35
55
  }
36
56
  logout(specificUrl = false) {
37
- cleanStorageToken();
38
- this.redirectToDex(specificUrl && location.href);
39
- }
40
- logoutAudit() {
41
- return this.http.post(`${API_GATEWAY}/auth/v1/logout`, {}, {
57
+ this.http
58
+ .get(LOGOUT_API, {
42
59
  headers: NOT_NOTIFY_ON_ERROR_HEADERS,
60
+ })
61
+ .pipe(timeout(1000))
62
+ .subscribe(() => {
63
+ cleanStorageToken();
64
+ this.redirectToDex(specificUrl && location.href);
43
65
  });
44
66
  }
45
67
  async redirectToDex(redirectUrl = null) {
46
68
  if (!this.stateSnapshot) {
47
69
  return;
48
70
  }
49
- // 主动退出或 session 模式跳转到 dex 前需要主动清除 `user_login` cookie 防止自动授权
50
- if (!!this.stateSnapshot.idToken || readStorageType() === 'session') {
51
- try {
52
- await fetch(`${this.stateSnapshot.logoutUrl}&id_token_hint=${
53
- // 主动退出时禁用现有 token
54
- this.stateSnapshot.idToken || ''}`);
55
- }
56
- catch (e) {
57
- console.error(e);
58
- }
59
- }
60
71
  const href = replaceRedirectUrl(this.stateSnapshot.authUrl,
61
72
  // authUrl 中的 redirectUrl 是根路由,根路由二次重定向回 portal 时会丢失 code 导致登录失败
62
73
  // 如果后期有定制化要求默认首页不是 portal,可以改回之前的方案,使用浏览器导航打开 logoutUrl,然后 dex 重定向到根路由,根路由重定向到默认首页,首页再将 authUrl 中的 redirectUrl 替换为当前 url 跳转到 dex 进行登录;
@@ -71,52 +82,43 @@ export class AuthorizationStateService {
71
82
  }
72
83
  }
73
84
  refreshToken() {
74
- const refreshToken = readStorageToken()?.refreshToken;
75
- if (refreshToken) {
76
- if (!this.refreshTokenCache$) {
77
- this.refreshTokenCache$ = this.getTokenByRefreshToken(refreshToken).pipe(tap(token => {
78
- this.refreshTokenCache$ = null;
79
- this.refreshToken$$.next(token);
80
- }), map(({ idToken }) => idToken), catchError(() => {
81
- this.logout(true);
82
- return EMPTY;
83
- }), publishRef());
84
- }
85
+ if (this.refreshTokenCache$) {
85
86
  return this.refreshTokenCache$;
86
87
  }
87
- this.logout(true);
88
- return EMPTY;
89
- }
90
- checkToken(token) {
91
- if (!this.checkTokenCache[token]) {
92
- this.checkTokenCache[token] = this.http
93
- .get(TOKEN_INFO_API, {
94
- headers: {
95
- Authorization: `Bearer ${token}`,
96
- },
97
- })
98
- .pipe(tap({
88
+ this.refreshTokenCache$ = this.http
89
+ .get(TOKEN_REFRESH_API)
90
+ .pipe(tap(() => {
91
+ this.refreshTokenCache$ = null;
92
+ }), catchError(() => {
93
+ this.logout(true);
94
+ return EMPTY;
95
+ }), publishRef());
96
+ return this.refreshTokenCache$;
97
+ }
98
+ checkToken() {
99
+ if (!this.checkTokenCache$) {
100
+ this.checkTokenCache$ = this.http.get(TOKEN_INFO_API).pipe(tap({
99
101
  next: () => {
100
- this.checkTokenCache[token] = null;
102
+ this.checkTokenCache$ = null;
101
103
  },
102
104
  error: () => {
103
- this.checkTokenCache[token] = null;
105
+ this.checkTokenCache$ = null;
104
106
  },
105
107
  }), publishRef());
106
108
  }
107
- return this.checkTokenCache[token];
108
- }
109
- getToken() {
110
- return this.state$.pipe(map(state => state.idToken));
109
+ return this.checkTokenCache$;
111
110
  }
112
111
  getTokenPayload() {
113
- return this.state$.pipe(map(state => getAccountInfo(state)));
112
+ return this.state$.pipe(map(state => state.info));
114
113
  }
115
114
  getAccountInfo() {
116
115
  if (this.payloadSnapshot) {
117
116
  return of(this.payloadSnapshot);
118
117
  }
119
- return this.state$.pipe(map(state => getAccountInfo(state) || {}));
118
+ return this.state$.pipe(map(state => state.info || {}));
119
+ }
120
+ getTokenByStorage() {
121
+ return readStorageToken();
120
122
  }
121
123
  getAuthConfiguration() {
122
124
  return this.http
@@ -130,41 +132,32 @@ export class AuthorizationStateService {
130
132
  getExistedToken(config) {
131
133
  return this.getTokenFromLocal(config).pipe(catchError(error => {
132
134
  console.error(error);
133
- return of({ idToken: '', refreshToken: '' });
135
+ return of({});
134
136
  }));
135
137
  }
136
138
  getTokenFromLocal(config) {
137
139
  const { queryParams, hashParams } = this.getParams();
138
140
  const code = queryParams[CODE_KEY] || hashParams[CODE_KEY];
139
- if (code) {
140
- return this.getTokenByCode(code, config.state);
141
- }
142
- const refreshToken = queryParams[REFRESH_TOKEN_KEY] || hashParams[REFRESH_TOKEN_KEY];
143
- if (refreshToken) {
144
- return this.getTokenByRefreshToken(refreshToken);
145
- }
146
141
  const idToken = queryParams[ID_TOKEN_KEY] || hashParams[ID_TOKEN_KEY];
147
- if (idToken) {
148
- writeStorageToken({
149
- storageType: (queryParams[STORAGE_TYPE_KEY] ||
150
- hashParams[STORAGE_TYPE_KEY]),
151
- idToken,
152
- refreshToken: '',
153
- });
142
+ if (!code && !idToken) {
143
+ return of(null);
154
144
  }
155
- return from(asyncReadStorageToken());
145
+ refreshStorageAliveRecord();
146
+ return code
147
+ ? this.setCookieByCode(code, config.state)
148
+ : this.setCookieByToken(idToken);
156
149
  }
157
- getTokenByRefreshToken(refreshToken) {
150
+ setCookieByCode(code, state) {
158
151
  return this.http
159
- .get(TOKEN_REFRESH_API, {
160
- params: { refresh_token: refreshToken },
152
+ .get(CALLBACK_API, {
153
+ params: { code, state },
161
154
  })
162
155
  .pipe(mapTokenResponse());
163
156
  }
164
- getTokenByCode(code, state) {
157
+ setCookieByToken(idToken) {
165
158
  return this.http
166
159
  .get(CALLBACK_API, {
167
- params: { code, state },
160
+ params: { id_token: idToken },
168
161
  })
169
162
  .pipe(mapTokenResponse());
170
163
  }
@@ -181,7 +174,7 @@ export class AuthorizationStateService {
181
174
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AuthorizationStateService, [{
182
175
  type: Injectable,
183
176
  args: [{ providedIn: 'root' }]
184
- }], null, null); })();
177
+ }], () => [], null); })();
185
178
  function replaceRedirectUrl(dexUrl, redirectUrl) {
186
179
  const [path, queryParams] = dexUrl.split('?');
187
180
  const replacedQueryParams = queryParams
@@ -195,6 +188,14 @@ function replaceRedirectUrl(dexUrl, redirectUrl) {
195
188
  .join('&');
196
189
  return `${path}?${replacedQueryParams}`;
197
190
  }
191
+ export function redirectSSOEntry(entry) {
192
+ const hasQuery = entry.includes('?');
193
+ if (hasQuery) {
194
+ const [url, query] = entry.split('?');
195
+ return `${EXTERNAL_REDIRECT_API}?redirect_url=${url}&${query}`;
196
+ }
197
+ return `${EXTERNAL_REDIRECT_API}?redirect_url=${entry}`;
198
+ }
198
199
  function parseParams(query) {
199
200
  if (!query) {
200
201
  return {};
@@ -207,21 +208,14 @@ function parseParams(query) {
207
208
  };
208
209
  }, {});
209
210
  }
210
- function getAccountInfo(state) {
211
- return state.idToken
212
- ? JSON.parse(decodeUrl(state.idToken.split('.')[1]))
213
- : null;
214
- }
215
211
  function mapTokenResponse() {
216
- return pipe(tap(({ token_storage, id_token, refresh_token }) => {
217
- writeStorageToken({
218
- storageType: token_storage,
219
- idToken: id_token,
220
- refreshToken: refresh_token,
221
- });
222
- }), map(({ id_token, refresh_token }) => ({
223
- idToken: id_token,
224
- refreshToken: refresh_token,
212
+ return pipe(tap(({ id_token: idToken }) => {
213
+ writeStorageToken(idToken);
214
+ }), map(({ token_type, token_storage, expire_at, issued_at }) => ({
215
+ storageType: token_storage,
216
+ tokenType: token_type,
217
+ expireAt: expire_at,
218
+ issuedAt: issued_at,
225
219
  })));
226
220
  }
227
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9hdXRob3JpemF0aW9uL3N0YXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakMsT0FBTyxFQUNMLEtBQUssRUFFTCxPQUFPLEVBQ1AsTUFBTSxFQUNOLEVBQUUsRUFDRixVQUFVLEVBQ1YsR0FBRyxFQUNILFdBQVcsRUFDWCxTQUFTLEVBQ1QsR0FBRyxFQUNILElBQUksRUFDSixJQUFJLEdBQ0wsTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBRUwsV0FBVyxFQUNYLDJCQUEyQixFQUMzQixVQUFVLEVBQ1YsWUFBWSxHQUNiLE1BQU0sb0JBQW9CLENBQUM7QUFHNUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsaUJBQWlCLEdBQ2xCLE1BQU0saUJBQWlCLENBQUM7O0FBa0J6QixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxlQUFlLENBQUM7QUFDaEQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQztBQUN2QyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxlQUFlLENBQUM7QUFDakQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQztBQUUvQixNQUFNLFNBQVMsR0FBRyw2QkFBNkIsQ0FBQztBQUNoRCxNQUFNLFlBQVksR0FBRyxnQ0FBZ0MsQ0FBQztBQUN0RCxNQUFN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RyxFQUFFLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFdEMsT0FBTztZQUNMLEdBQUcsR0FBRztZQUNOLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSztTQUNiLENBQUM7SUFDSixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDVCxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsS0FBeUI7SUFDL0MsT0FBTyxLQUFLLENBQUMsT0FBTztRQUNsQixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ1gsQ0FBQztBQUVELFNBQVMsZ0JBQWdCO0lBQ3ZCLE9BQU8sSUFBSSxDQUNULEdBQUcsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQWlCLEVBQUUsRUFBRTtRQUNoRSxpQkFBaUIsQ0FBQztZQUNoQixXQUFXLEVBQUUsYUFBYTtZQUMxQixPQUFPLEVBQUUsUUFBUTtZQUNqQixZQUFZLEVBQUUsYUFBYTtTQUM1QixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwQyxPQUFPLEVBQUUsUUFBUTtRQUNqQixZQUFZLEVBQUUsYUFBYTtLQUM1QixDQUFDLENBQUMsQ0FDSixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBAbW9kdWxlIGF1dGhvcml6YXRpb25cbiAqL1xuXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBkZWNvZGVVcmwgfSBmcm9tICdhYjY0JztcbmltcG9ydCB7XG4gIEVNUFRZLFxuICBPYnNlcnZhYmxlLFxuICBTdWJqZWN0LFxuICBjb25jYXQsXG4gIG9mLFxuICBjYXRjaEVycm9yLFxuICBtYXAsXG4gIHNoYXJlUmVwbGF5LFxuICBzd2l0Y2hNYXAsXG4gIHRhcCxcbiAgcGlwZSxcbiAgZnJvbSxcbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gIFN0cmluZ01hcCxcbiAgQVBJX0dBVEVXQVksXG4gIE5PVF9OT1RJRllfT05fRVJST1JfSEVBREVSUyxcbiAgcHVibGlzaFJlZixcbiAgZ2V0VG9wV2luZG93LFxufSBmcm9tICcuLi9jb3JlL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgQWNjb3VudEluZm8gfSBmcm9tICcuLi9wYWdlLXNjYWZmb2xkL3B1YmxpYy1hcGknO1xuXG5pbXBvcnQgeyBnZXRJbml0VXJsIH0gZnJvbSAnLi9hcHAtaW5pdC11cmwnO1xuaW1wb3J0IHtcbiAgYXN5bmNSZWFkU3RvcmFnZVRva2VuLFxuICBjbGVhblN0b3JhZ2VUb2tlbixcbiAgcmVhZFN0b3JhZ2VUb2tlbixcbiAgcmVhZFN0b3JhZ2VUeXBlLFxuICB3cml0ZVN0b3JhZ2VUb2tlbixcbn0gZnJvbSAnLi9zdG9yYWdlLXRva2VuJztcblxuZXhwb3J0IGludGVyZmFjZSBBdXRob3JpemF0aW9uU3RhdGUge1xuICBpZFRva2VuPzogc3RyaW5nO1xuICByZWZyZXNoVG9rZW4/OiBzdHJpbmc7XG4gIHN0YXRlPzogc3RyaW5nO1xuICBhdXRoVXJsPzogc3RyaW5nO1xuICBsb2dvdXRVcmw/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5SZXNwb25zZSB7XG4gIHRva2VuX3N0b3JhZ2U6IFN0b3JhZ2VUeXBlO1xuICBpZF90b2tlbjogc3RyaW5nO1xuICByZWZyZXNoX3Rva2VuOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VUeXBlID0gJ2xvY2FsJyB8ICdzZXNzaW9uJztcblxuZXhwb3J0IGNvbnN0IFNUT1JBR0VfVFlQRV9LRVkgPSAndG9rZW5fc3RvcmFnZSc7XG5leHBvcnQgY29uc3QgSURfVE9LRU5fS0VZID0gJ2lkX3Rva2VuJztcbmV4cG9ydCBjb25zdCBSRUZSRVNIX1RPS0VOX0tFWSA9ICdyZWZyZXNoX3Rva2VuJztcbmV4cG9ydCBjb25zdCBDT0RFX0tFWSA9ICdjb2RlJztcblxuY29uc3QgTE9HSU5fQVBJID0gJy9jb25zb2xlL2FwaS92MS90b2tlbi9sb2dpbic7XG5jb25zdCBDQUxMQkFDS19BUEkgPSAnL2NvbnNvbGUvYXBpL3YxL3Rva2VuL2NhbGxiYWNrJztcbmNvbnN0IFRPS0VOX1JFRlJFU0hfQVBJID0gJy9jb25zb2xlL2FwaS92MS90b2tlbi9yZWZyZXNoJztcbmNvbnN0IFRPS0VOX0lORk9fQVBJID0gJy9jb25zb2xlL2FwaS92MS90b2tlbi9pbmZvJztcblxuY29uc3QgUkVESVJFQ1RfVVJJUyA9IG5ldyBTZXQoWydyZWRpcmVjdF91cmknLCAncG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpJ10pO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEF1dGhvcml6YXRpb25TdGF0ZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSByZWZyZXNoVG9rZW4kJCA9IG5ldyBTdWJqZWN0PHtcbiAgICBpZFRva2VuOiBzdHJpbmc7XG4gICAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gIH0+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZSQgPSB0aGlzLmdldEF1dGhDb25maWd1cmF0aW9uKCkucGlwZShcbiAgICBzd2l0Y2hNYXAoY29uZmlnID0+XG4gICAgICBjb25jYXQodGhpcy5nZXRFeGlzdGVkVG9rZW4oY29uZmlnKSwgdGhpcy5yZWZyZXNoVG9rZW4kJCkucGlwZShcbiAgICAgICAgbWFwKHRva2VuID0+ICh7IC4uLmNvbmZpZywgLi4udG9rZW4gfSkpLFxuICAgICAgKSxcbiAgICApLFxuICAgIHRhcChzdGF0ZSA9PiB7XG4gICAgICB0aGlzLnN0YXRlU25hcHNob3QgPSBzdGF0ZTtcbiAgICAgIGlmICghc3RhdGUuaWRUb2tlbikge1xuICAgICAgICB0aGlzLmxvZ291dCh0cnVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGF5bG9hZFNuYXBzaG90ID0gZ2V0QWNjb3VudEluZm8oc3RhdGUpO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpLFxuICApO1xuXG4gIHByaXZhdGUgY2hlY2tUb2tlbkNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBPYnNlcnZhYmxlPHVua25vd24+PiA9IHt9O1xuICBwcml2YXRlIHJlZnJlc2hUb2tlbkNhY2hlJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuXG4gIHN0YXRlU25hcHNob3Q6IEF1dGhvcml6YXRpb25TdGF0ZSA9IG51bGw7XG5cbiAgcGF5bG9hZFNuYXBzaG90OiBBY2NvdW50SW5mbztcblxuICBsb2dvdXQoc3BlY2lmaWNVcmwgPSBmYWxzZSkge1xuICAgIGNsZWFuU3RvcmFnZVRva2VuKCk7XG4gICAgdGhpcy5yZWRpcmVjdFRvRGV4KHNwZWNpZmljVXJsICYmIGxvY2F0aW9uLmhyZWYpO1xuICB9XG5cbiAgbG9nb3V0QXVkaXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KFxuICAgICAgYCR7QVBJX0dBVEVXQVl9L2F1dGgvdjEvbG9nb3V0YCxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBoZWFkZXJzOiBOT1RfTk9USUZZX09OX0VSUk9SX0hFQURFUlMsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBhc3luYyByZWRpcmVjdFRvRGV4KHJlZGlyZWN0VXJsOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgaWYgKCF0aGlzLnN0YXRlU25hcHNob3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDkuLvliqjpgIDlh7rmiJYgc2Vzc2lvbiDmqKHlvI/ot7PovazliLAgZGV4IOWJjemcgOimgeS4u+WKqOa4hemZpCBgdXNlcl9sb2dpbmAgY29va2llIOmYsuatouiHquWKqOaOiOadg1xuICAgIGlmICghIXRoaXMuc3RhdGVTbmFwc2hvdC5pZFRva2VuIHx8IHJlYWRTdG9yYWdlVHlwZSgpID09PSAnc2Vzc2lvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZldGNoKFxuICAgICAgICAgIGAke3RoaXMuc3RhdGVTbmFwc2hvdC5sb2dvdXRVcmx9JmlkX3Rva2VuX2hpbnQ9JHtcbiAgICAgICAgICAgIC8vIOS4u+WKqOmAgOWHuuaXtuemgeeUqOeOsOaciSB0b2tlblxuICAgICAgICAgICAgdGhpcy5zdGF0ZVNuYXBzaG90LmlkVG9rZW4gfHwgJydcbiAgICAgICAgICB9YCxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBocmVmID0gcmVwbGFjZVJlZGlyZWN0VXJsKFxuICAgICAgdGhpcy5zdGF0ZVNuYXBzaG90LmF1dGhVcmwsXG4gICAgICAvLyBhdXRoVXJsIOS4reeahCByZWRpcmVjdFVybCDmmK/moLnot6/nlLHvvIzmoLnot6/nlLHkuozmrKHph43lrprlkJHlm54gcG9ydGFsIOaXtuS8muS4ouWksSBjb2RlIOWvvOiHtOeZu+W9leWksei0pVxuICAgICAgLy8g5aaC5p6c5ZCO5pyf5pyJ5a6a5Yi25YyW6KaB5rGC6buY6K6k6aaW6aG15LiN5pivIHBvcnRhbO+8jOWPr+S7peaUueWbnuS5i+WJjeeahOaWueahiO+8jOS9v+eUqOa1j+iniOWZqOWvvOiIquaJk+W8gCBsb2dvdXRVcmzvvIznhLblkI4gZGV4IOmHjeWumuWQkeWIsOaguei3r+eUse+8jOaguei3r+eUsemHjeWumuWQkeWIsOm7mOiupOmmlumhte+8jOmmlumhteWGjeWwhiBhdXRoVXJsIOS4reeahCByZWRpcmVjdFVybCDmm7/mjaLkuLrlvZPliY0gdXJsIOi3s+i9rOWIsCBkZXgg6L+b6KGM55m75b2V77ybXG4gICAgICAvLyDmnIDlpb3njq/looPlj5jph4/lop7liqDpu5jorqTpppbpobXlnLDlnYDmiJbogIUgZGV4IHJlZGlyZWN0VXJsIOebtOaOpeaYr+ato+ehruWcsOWdgFxuICAgICAgcmVkaXJlY3RVcmwgfHwgbG9jYXRpb24ub3JpZ2luICsgJy9jb25zb2xlLXBvcnRhbCcsXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBnZXRUb3BXaW5kb3coKS5sb2NhdGlvbi5ocmVmID0gaHJlZjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4sIGp1c3QgZm9yIHJvYnVzdG5lc3MgaW4gY2FzZSBvZiBjcm9zcy1vcmlnaW4gaWZyYW1lXG4gICAgICBsb2NhdGlvbi5ocmVmID0gaHJlZjtcbiAgICB9XG4gIH1cblxuICByZWZyZXNoVG9rZW4oKSB7XG4gICAgY29uc3QgcmVmcmVzaFRva2VuID0gcmVhZFN0b3JhZ2VUb2tlbigpPy5yZWZyZXNoVG9rZW47XG4gICAgaWYgKHJlZnJlc2hUb2tlbikge1xuICAgICAgaWYgKCF0aGlzLnJlZnJlc2hUb2tlbkNhY2hlJCkge1xuICAgICAgICB0aGlzLnJlZnJlc2hUb2tlbkNhY2hlJCA9IHRoaXMuZ2V0VG9rZW5CeVJlZnJlc2hUb2tlbihcbiAgICAgICAgICByZWZyZXNoVG9rZW4sXG4gICAgICAgICkucGlwZShcbiAgICAgICAgICB0YXAodG9rZW4gPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW5DYWNoZSQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4kJC5uZXh0KHRva2VuKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBtYXAoKHsgaWRUb2tlbiB9KSA9PiBpZFRva2VuKSxcbiAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nb3V0KHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHB1Ymxpc2hSZWYoKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnJlZnJlc2hUb2tlbkNhY2hlJDtcbiAgICB9XG4gICAgdGhpcy5sb2dvdXQodHJ1ZSk7XG4gICAgcmV0dXJuIEVNUFRZO1xuICB9XG5cbiAgY2hlY2tUb2tlbih0b2tlbjogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLmNoZWNrVG9rZW5DYWNoZVt0b2tlbl0pIHtcbiAgICAgIHRoaXMuY2hlY2tUb2tlbkNhY2hlW3Rva2VuXSA9IHRoaXMuaHR0cFxuICAgICAgICAuZ2V0KFRPS0VOX0lORk9fQVBJLCB7XG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKHtcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5jaGVja1Rva2VuQ2FjaGVbdG9rZW5dID0gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNoZWNrVG9rZW5DYWNoZVt0b2tlbl0gPSBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwdWJsaXNoUmVmKCksXG4gICAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNoZWNrVG9rZW5DYWNoZVt0b2tlbl07XG4gIH1cblxuICBnZXRUb2tlbigpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSQucGlwZShtYXAoc3RhdGUgPT4gc3RhdGUuaWRUb2tlbikpO1xuICB9XG5cbiAgZ2V0VG9rZW5QYXlsb2FkPFQ+KCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlJC5waXBlKG1hcChzdGF0ZSA9PiBnZXRBY2NvdW50SW5mbyhzdGF0ZSkgYXMgVCkpO1xuICB9XG5cbiAgZ2V0QWNjb3VudEluZm8oKSB7XG4gICAgaWYgKHRoaXMucGF5bG9hZFNuYXBzaG90KSB7XG4gICAgICByZXR1cm4gb2YodGhpcy5wYXlsb2FkU25hcHNob3QpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGF0ZSQucGlwZShtYXAoc3RhdGUgPT4gZ2V0QWNjb3VudEluZm8oc3RhdGUpIHx8IHt9KSk7XG4gIH1cblxuICBwcml2YXRlIGdldEF1dGhDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5nZXQ8eyBhdXRoX3VybDogc3RyaW5nOyBzdGF0ZTogc3RyaW5nOyBsb2dvdXRfdXJsOiBzdHJpbmcgfT4oTE9HSU5fQVBJKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChyZXMgPT4gKHtcbiAgICAgICAgICBhdXRoVXJsOiByZXMuYXV0aF91cmwsXG4gICAgICAgICAgc3RhdGU6IHJlcy5zdGF0ZSxcbiAgICAgICAgICBsb2dvdXRVcmw6IHJlcy5sb2dvdXRfdXJsIHx8ICcnLFxuICAgICAgICB9KSksXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeGlzdGVkVG9rZW4oY29uZmlnOiBBdXRob3JpemF0aW9uU3RhdGUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRUb2tlbkZyb21Mb2NhbChjb25maWcpLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIHJldHVybiBvZih7IGlkVG9rZW46ICcnLCByZWZyZXNoVG9rZW46ICcnIH0pO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VG9rZW5Gcm9tTG9jYWwoXG4gICAgY29uZmlnOiBBdXRob3JpemF0aW9uU3RhdGUsXG4gICk6IE9ic2VydmFibGU8eyBpZFRva2VuPzogc3RyaW5nOyByZWZyZXNoVG9rZW4/OiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHsgcXVlcnlQYXJhbXMsIGhhc2hQYXJhbXMgfSA9IHRoaXMuZ2V0UGFyYW1zKCk7XG5cbiAgICBjb25zdCBjb2RlID0gcXVlcnlQYXJhbXNbQ09ERV9LRVldIHx8IGhhc2hQYXJhbXNbQ09ERV9LRVldO1xuXG4gICAgaWYgKGNvZGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFRva2VuQnlDb2RlKGNvZGUsIGNvbmZpZy5zdGF0ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVmcmVzaFRva2VuID1cbiAgICAgIHF1ZXJ5UGFyYW1zW1JFRlJFU0hfVE9LRU5fS0VZXSB8fCBoYXNoUGFyYW1zW1JFRlJFU0hfVE9LRU5fS0VZXTtcblxuICAgIGlmIChyZWZyZXNoVG9rZW4pIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFRva2VuQnlSZWZyZXNoVG9rZW4ocmVmcmVzaFRva2VuKTtcbiAgICB9XG5cbiAgICBjb25zdCBpZFRva2VuID0gcXVlcnlQYXJhbXNbSURfVE9LRU5fS0VZXSB8fCBoYXNoUGFyYW1zW0lEX1RPS0VOX0tFWV07XG5cbiAgICBpZiAoaWRUb2tlbikge1xuICAgICAgd3JpdGVTdG9yYWdlVG9rZW4oe1xuICAgICAgICBzdG9yYWdlVHlwZTogKHF1ZXJ5UGFyYW1zW1NUT1JBR0VfVFlQRV9LRVldIHx8XG4gICAgICAgICAgaGFzaFBhcmFtc1tTVE9SQUdFX1RZUEVfS0VZXSkgYXMgVG9rZW5SZXNwb25zZVsndG9rZW5fc3RvcmFnZSddLFxuICAgICAgICBpZFRva2VuLFxuICAgICAgICByZWZyZXNoVG9rZW46ICcnLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb20oYXN5bmNSZWFkU3RvcmFnZVRva2VuKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUb2tlbkJ5UmVmcmVzaFRva2VuKHJlZnJlc2hUb2tlbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmdldDxUb2tlblJlc3BvbnNlPihUT0tFTl9SRUZSRVNIX0FQSSwge1xuICAgICAgICBwYXJhbXM6IHsgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuIH0sXG4gICAgICB9KVxuICAgICAgLnBpcGUobWFwVG9rZW5SZXNwb25zZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VG9rZW5CeUNvZGUoY29kZTogc3RyaW5nLCBzdGF0ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmdldDxUb2tlblJlc3BvbnNlPihDQUxMQkFDS19BUEksIHtcbiAgICAgICAgcGFyYW1zOiB7IGNvZGUsIHN0YXRlIH0sXG4gICAgICB9KVxuICAgICAgLnBpcGUobWFwVG9rZW5SZXNwb25zZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFyYW1zKCkge1xuICAgIGNvbnN0IGluaXRVcmwgPSBnZXRJbml0VXJsKCk7XG5cbiAgICBjb25zdCBpbml0TG9jYXRpb24gPSBuZXcgVVJMKGluaXRVcmwpO1xuXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBwYXJzZVBhcmFtcyhcbiAgICAgIGluaXRMb2NhdGlvbi5zZWFyY2ggPyBpbml0TG9jYXRpb24uc2VhcmNoLnNsaWNlKDEpIDogJycsXG4gICAgKTtcblxuICAgIGNvbnN0IGhhc2hQYXJhbXMgPSBwYXJzZVBhcmFtcyhcbiAgICAgIGluaXRMb2NhdGlvbi5oYXNoID8gaW5pdExvY2F0aW9uLmhhc2guc2xpY2UoMSkgOiAnJyxcbiAgICApO1xuXG4gICAgcmV0dXJuIHsgcXVlcnlQYXJhbXMsIGhhc2hQYXJhbXMgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlUmVkaXJlY3RVcmwoZGV4VXJsOiBzdHJpbmcsIHJlZGlyZWN0VXJsOiBzdHJpbmcpIHtcbiAgY29uc3QgW3BhdGgsIHF1ZXJ5UGFyYW1zXSA9IGRleFVybC5zcGxpdCgnPycpO1xuXG4gIGNvbnN0IHJlcGxhY2VkUXVlcnlQYXJhbXMgPSBxdWVyeVBhcmFtc1xuICAgIC5zcGxpdCgnJicpXG4gICAgLm1hcChwYWlyID0+IHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHBhaXIuc3BsaXQoJz0nKTtcbiAgICAgIHJldHVybiBSRURJUkVDVF9VUklTLmhhcyhrZXkpXG4gICAgICAgID8gYCR7a2V5fT0ke2VuY29kZVVSSUNvbXBvbmVudChyZWRpcmVjdFVybCl9YFxuICAgICAgICA6IGAke2tleX09JHt2YWx1ZX1gO1xuICAgIH0pXG4gICAgLmpvaW4oJyYnKTtcblxuICByZXR1cm4gYCR7cGF0aH0/JHtyZXBsYWNlZFF1ZXJ5UGFyYW1zfWA7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUGFyYW1zKHF1ZXJ5OiBzdHJpbmcpOiBTdHJpbmdNYXAge1xuICBpZiAoIXF1ZXJ5KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmV0dXJuIHF1ZXJ5LnNwbGl0KCcmJykucmVkdWNlKChhY2MsIHBhcmFtKSA9PiB7XG4gICAgY29uc3QgW2tleSwgdmFsdWVdID0gcGFyYW0uc3BsaXQoJz0nKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5hY2MsXG4gICAgICBba2V5XTogdmFsdWUsXG4gICAgfTtcbiAgfSwge30pO1xufVxuXG5mdW5jdGlvbiBnZXRBY2NvdW50SW5mbyhzdGF0ZTogQXV0aG9yaXphdGlvblN0YXRlKTogQWNjb3VudEluZm8ge1xuICByZXR1cm4gc3RhdGUuaWRUb2tlblxuICAgID8gSlNPTi5wYXJzZShkZWNvZGVVcmwoc3RhdGUuaWRUb2tlbi5zcGxpdCgnLicpWzFdKSlcbiAgICA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIG1hcFRva2VuUmVzcG9uc2UoKSB7XG4gIHJldHVybiBwaXBlKFxuICAgIHRhcCgoeyB0b2tlbl9zdG9yYWdlLCBpZF90b2tlbiwgcmVmcmVzaF90b2tlbiB9OiBUb2tlblJlc3BvbnNlKSA9PiB7XG4gICAgICB3cml0ZVN0b3JhZ2VUb2tlbih7XG4gICAgICAgIHN0b3JhZ2VUeXBlOiB0b2tlbl9zdG9yYWdlLFxuICAgICAgICBpZFRva2VuOiBpZF90b2tlbixcbiAgICAgICAgcmVmcmVzaFRva2VuOiByZWZyZXNoX3Rva2VuLFxuICAgICAgfSk7XG4gICAgfSksXG4gICAgbWFwKCh7IGlkX3Rva2VuLCByZWZyZXNoX3Rva2VuIH0pID0+ICh7XG4gICAgICBpZFRva2VuOiBpZF90b2tlbixcbiAgICAgIHJlZnJlc2hUb2tlbjogcmVmcmVzaF90b2tlbixcbiAgICB9KSksXG4gICk7XG59XG4iXX0=
221
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9hdXRob3JpemF0aW9uL3N0YXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFDTCxLQUFLLEVBRUwsRUFBRSxFQUNGLFVBQVUsRUFDVixHQUFHLEVBQ0gsV0FBVyxFQUNYLFNBQVMsRUFDVCxHQUFHLEVBQ0gsSUFBSSxFQUNKLE9BQU8sRUFDUCxLQUFLLEVBQ0wsU0FBUyxFQUNULEtBQUssR0FDTixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFFTCwyQkFBMkIsRUFDM0IsVUFBVSxFQUNWLFlBQVksRUFDWixTQUFTLEVBQ1QscUJBQXFCLEVBQ3JCLElBQUksR0FDTCxNQUFNLG9CQUFvQixDQUFDO0FBRzVCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIseUJBQXlCLEVBQ3pCLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDOztBQW1CekIsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsZUFBZSxDQUFDO0FBQ2hELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUM7QUFDL0IsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQztBQUV2QyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUM7QUFFN0IsTUFBTSxTQUFTLEdBQUcsNkJBQTZCLENBQUM7QUFDaEQsTUFBTSxVQUFV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QUFLLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXRDLE9BQU87WUFDTCxHQUFHLEdBQUc7WUFDTixDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUs7U0FDYixDQUFDO0lBQ0osQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ1QsQ0FBQztBQUVELFNBQVMsZ0JBQWdCO0lBQ3ZCLE9BQU8sSUFBSSxDQUNULEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBaUIsRUFBRSxFQUFFO1FBQzNDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdCLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FDRCxDQUFDLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLFdBQVcsRUFBRSxhQUFhO1FBQzFCLFNBQVMsRUFBRSxVQUFVO1FBQ3JCLFFBQVEsRUFBRSxTQUFTO1FBQ25CLFFBQVEsRUFBRSxTQUFTO0tBQ3BCLENBQUMsQ0FDSCxDQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIEBtb2R1bGUgYXV0aG9yaXphdGlvblxuICovXG5cbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEVNUFRZLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgY2F0Y2hFcnJvcixcbiAgbWFwLFxuICBzaGFyZVJlcGxheSxcbiAgc3dpdGNoTWFwLFxuICB0YXAsXG4gIHBpcGUsXG4gIHRpbWVvdXQsXG4gIHRpbWVyLFxuICBmcm9tRXZlbnQsXG4gIG1lcmdlLFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtcbiAgU3RyaW5nTWFwLFxuICBOT1RfTk9USUZZX09OX0VSUk9SX0hFQURFUlMsXG4gIHB1Ymxpc2hSZWYsXG4gIGdldFRvcFdpbmRvdyxcbiAgc2tpcEVycm9yLFxuICBnZXRHbG9iYWxFbnZpcm9ubWVudHMsXG4gIFRSVUUsXG59IGZyb20gJy4uL2NvcmUvcHVibGljLWFwaSc7XG5pbXBvcnQgeyBBY2NvdW50SW5mbyB9IGZyb20gJy4uL3BhZ2Utc2NhZmZvbGQvcHVibGljLWFwaSc7XG5cbmltcG9ydCB7IGdldEluaXRVcmwgfSBmcm9tICcuL2FwcC1pbml0LXVybCc7XG5pbXBvcnQgeyBIRUFSVEJFQVRfUE9MTElORyB9IGZyb20gJy4vc2Vzc2lvbi1tYW5hZ2Uuc2VydmljZSc7XG5pbXBvcnQge1xuICBjbGVhblN0b3JhZ2VUb2tlbixcbiAgcmVhZFN0b3JhZ2VBbGl2ZVJlY29yZCxcbiAgcmVhZFN0b3JhZ2VUb2tlbixcbiAgcmVmcmVzaFN0b3JhZ2VBbGl2ZVJlY29yZCxcbiAgd3JpdGVTdG9yYWdlVG9rZW4sXG59IGZyb20gJy4vc3RvcmFnZS10b2tlbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aG9yaXphdGlvblN0YXRlIHtcbiAgZXhwaXJlQXQ/OiBzdHJpbmc7XG4gIGlzc3VlZEF0Pzogc3RyaW5nO1xuICBzdGF0ZT86IHN0cmluZztcbiAgYXV0aFVybD86IHN0cmluZztcbiAgbG9nb3V0VXJsPzogc3RyaW5nO1xuICBpbmZvPzogQWNjb3VudEluZm87XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5SZXNwb25zZSB7XG4gIHRva2VuX3N0b3JhZ2U6IHN0cmluZztcbiAgdG9rZW5fdHlwZTogc3RyaW5nO1xuICBleHBpcmVfYXQ6IHN0cmluZztcbiAgaXNzdWVkX2F0OiBzdHJpbmc7XG4gIGlkX3Rva2VuPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgU1RPUkFHRV9UWVBFX0tFWSA9ICd0b2tlbl9zdG9yYWdlJztcbmV4cG9ydCBjb25zdCBDT0RFX0tFWSA9ICdjb2RlJztcbmV4cG9ydCBjb25zdCBJRF9UT0tFTl9LRVkgPSAnaWRfdG9rZW4nO1xuXG5jb25zdCBMT0FESU5HX0NBQ0hFID0gMTVfMDAwO1xuXG5jb25zdCBMT0dJTl9BUEkgPSAnL2NvbnNvbGUvYXBpL3YyL3Rva2VuL2xvZ2luJztcbmNvbnN0IExPR09VVF9BUEkgPSAnL2NvbnNvbGUvYXBpL3YyL3Rva2VuL2xvZ291dCc7XG5jb25zdCBDQUxMQkFDS19BUEkgPSAnL2NvbnNvbGUvYXBpL3YyL3Rva2VuL2NhbGxiYWNrJztcbmNvbnN0IFRPS0VOX1JFRlJFU0hfQVBJID0gJy9jb25zb2xlL2FwaS92Mi90b2tlbi9yZWZyZXNoJztcbmNvbnN0IFRPS0VOX0lORk9fQVBJID0gJy9jb25zb2xlL2FwaS92Mi90b2tlbi9pbmZvJztcbmNvbnN0IEVYVEVSTkFMX1JFRElSRUNUX0FQSSA9ICcvY29uc29sZS9hcGkvdjIvdG9rZW4vcmVkaXJlY3QnO1xuXG5jb25zdCBSRURJUkVDVF9VUklTID0gbmV3IFNldChbJ3JlZGlyZWN0X3VyaScsICdwb3N0X2xvZ291dF9yZWRpcmVjdF91cmknXSk7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQXV0aG9yaXphdGlvblN0YXRlU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaHR0cCA9IGluamVjdChIdHRwQ2xpZW50KTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlJCA9IHRoaXMuZ2V0QXV0aENvbmZpZ3VyYXRpb24oKS5waXBlKFxuICAgIHN3aXRjaE1hcChjb25maWcgPT5cbiAgICAgIHRoaXMuZ2V0RXhpc3RlZFRva2VuKGNvbmZpZykucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKHRva2VuID0+XG4gICAgICAgICAgdGhpcy5odHRwLmdldDxBY2NvdW50SW5mbz4oVE9LRU5fSU5GT19BUEksIHt9KS5waXBlKFxuICAgICAgICAgICAgc2tpcEVycm9yKG51bGwpLFxuICAgICAgICAgICAgbWFwKGluZm8gPT4gKHtcbiAgICAgICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgICAgICAuLi50b2tlbixcbiAgICAgICAgICAgICAgaW5mbyxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApLFxuICAgIHRhcChzdGF0ZSA9PiB7XG4gICAgICBpZiAoIXN0YXRlLmluZm8pIHtcbiAgICAgICAgdGhpcy5sb2dvdXQodHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RhdGVTbmFwc2hvdCA9IHN0YXRlO1xuICAgICAgdGhpcy5wYXlsb2FkU25hcHNob3QgPSBzdGF0ZS5pbmZvO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpLFxuICApO1xuXG4gIHByaXZhdGUgY2hlY2tUb2tlbkNhY2hlJDogT2JzZXJ2YWJsZTx1bmtub3duPiA9IG51bGw7XG4gIHByaXZhdGUgcmVmcmVzaFRva2VuQ2FjaGUkOiBPYnNlcnZhYmxlPFRva2VuUmVzcG9uc2U+O1xuICBzdGF0ZVNuYXBzaG90OiBBdXRob3JpemF0aW9uU3RhdGUgPSBudWxsO1xuXG4gIHBheWxvYWRTbmFwc2hvdDogQWNjb3VudEluZm87XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKGdldEdsb2JhbEVudmlyb25tZW50cygnQ0xPU0VfQlJPV1NFUl9FTkRfU0VTU0lPTicpID09PSBUUlVFKSB7XG4gICAgICB0aGlzLnN0YXRlJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoc3RhdGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWxpdmVSZWNvcmQgPSByZWFkU3RvcmFnZUFsaXZlUmVjb3JkKCk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICFhbGl2ZVJlY29yZCB8fFxuICAgICAgICAgICAgICBEYXRlLm5vdygpIC0gYWxpdmVSZWNvcmQgPiBIRUFSVEJFQVRfUE9MTElORyArIExPQURJTkdfQ0FDSEVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aGlzLmxvZ291dCgpO1xuICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb2Yoc3RhdGUpO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2UoXG4gICAgICAgICAgICAgIHRpbWVyKDAsIEhFQVJUQkVBVF9QT0xMSU5HKSxcbiAgICAgICAgICAgICAgZnJvbUV2ZW50KHdpbmRvdywgJ2JlZm9yZXVubG9hZCcpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHJlZnJlc2hTdG9yYWdlQWxpdmVSZWNvcmQpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ291dChzcGVjaWZpY1VybCA9IGZhbHNlKSB7XG4gICAgdGhpcy5odHRwXG4gICAgICAuZ2V0KExPR09VVF9BUEksIHtcbiAgICAgICAgaGVhZGVyczogTk9UX05PVElGWV9PTl9FUlJPUl9IRUFERVJTLFxuICAgICAgfSlcbiAgICAgIC5waXBlKHRpbWVvdXQoMTAwMCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY2xlYW5TdG9yYWdlVG9rZW4oKTtcbiAgICAgICAgdGhpcy5yZWRpcmVjdFRvRGV4KHNwZWNpZmljVXJsICYmIGxvY2F0aW9uLmhyZWYpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZGlyZWN0VG9EZXgocmVkaXJlY3RVcmw6IHN0cmluZyA9IG51bGwpIHtcbiAgICBpZiAoIXRoaXMuc3RhdGVTbmFwc2hvdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhyZWYgPSByZXBsYWNlUmVkaXJlY3RVcmwoXG4gICAgICB0aGlzLnN0YXRlU25hcHNob3QuYXV0aFVybCxcbiAgICAgIC8vIGF1dGhVcmwg5Lit55qEIHJlZGlyZWN0VXJsIOaYr+aguei3r+eUse+8jOaguei3r+eUseS6jOasoemHjeWumuWQkeWbniBwb3J0YWwg5pe25Lya5Lii5aSxIGNvZGUg5a+86Ie055m75b2V5aSx6LSlXG4gICAgICAvLyDlpoLmnpzlkI7mnJ/mnInlrprliLbljJbopoHmsYLpu5jorqTpppbpobXkuI3mmK8gcG9ydGFs77yM5Y+v5Lul5pS55Zue5LmL5YmN55qE5pa55qGI77yM5L2/55So5rWP6KeI5Zmo5a+86Iiq5omT5byAIGxvZ291dFVybO+8jOeEtuWQjiBkZXgg6YeN5a6a5ZCR5Yiw5qC56Lev55Sx77yM5qC56Lev55Sx6YeN5a6a5ZCR5Yiw6buY6K6k6aaW6aG177yM6aaW6aG15YaN5bCGIGF1dGhVcmwg5Lit55qEIHJlZGlyZWN0VXJsIOabv+aNouS4uuW9k+WJjSB1cmwg6Lez6L2s5YiwIGRleCDov5vooYznmbvlvZXvvJtcbiAgICAgIC8vIOacgOWlveeOr+Wig+WPmOmHj+WinuWKoOm7mOiupOmmlumhteWcsOWdgOaIluiAhSBkZXggcmVkaXJlY3RVcmwg55u05o6l5piv5q2j56Gu5Zyw5Z2AXG4gICAgICByZWRpcmVjdFVybCB8fCBsb2NhdGlvbi5vcmlnaW4gKyAnL2NvbnNvbGUtcG9ydGFsJyxcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGdldFRvcFdpbmRvdygpLmxvY2F0aW9uLmhyZWYgPSBocmVmO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiwganVzdCBmb3Igcm9idXN0bmVzcyBpbiBjYXNlIG9mIGNyb3NzLW9yaWdpbiBpZnJhbWVcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSBocmVmO1xuICAgIH1cbiAgfVxuXG4gIHJlZnJlc2hUb2tlbigpIHtcbiAgICBpZiAodGhpcy5yZWZyZXNoVG9rZW5DYWNoZSQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlZnJlc2hUb2tlbkNhY2hlJDtcbiAgICB9XG5cbiAgICB0aGlzLnJlZnJlc2hUb2tlbkNhY2hlJCA9IHRoaXMuaHR0cFxuICAgICAgLmdldDxUb2tlblJlc3BvbnNlPihUT0tFTl9SRUZSRVNIX0FQSSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVmcmVzaFRva2VuQ2FjaGUkID0gbnVsbDtcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nb3V0KHRydWUpO1xuICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgfSksXG4gICAgICAgIHB1Ymxpc2hSZWYoKSxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5yZWZyZXNoVG9rZW5DYWNoZSQ7XG4gIH1cblxuICBjaGVja1Rva2VuKCkge1xuICAgIGlmICghdGhpcy5jaGVja1Rva2VuQ2FjaGUkKSB7XG4gICAgICB0aGlzLmNoZWNrVG9rZW5DYWNoZSQgPSB0aGlzLmh0dHAuZ2V0KFRPS0VOX0lORk9fQVBJKS5waXBlKFxuICAgICAgICB0YXAoe1xuICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tUb2tlbkNhY2hlJCA9IG51bGw7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGVja1Rva2VuQ2FjaGUkID0gbnVsbDtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICAgcHVibGlzaFJlZigpLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tUb2tlbkNhY2hlJDtcbiAgfVxuXG4gIGdldFRva2VuUGF5bG9hZDxUPigpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSQucGlwZShtYXAoc3RhdGUgPT4gc3RhdGUuaW5mbyBhcyBUKSk7XG4gIH1cblxuICBnZXRBY2NvdW50SW5mbygpIHtcbiAgICBpZiAodGhpcy5wYXlsb2FkU25hcHNob3QpIHtcbiAgICAgIHJldHVybiBvZih0aGlzLnBheWxvYWRTbmFwc2hvdCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlJC5waXBlKG1hcChzdGF0ZSA9PiBzdGF0ZS5pbmZvIHx8IHt9KSk7XG4gIH1cblxuICBnZXRUb2tlbkJ5U3RvcmFnZSgpIHtcbiAgICByZXR1cm4gcmVhZFN0b3JhZ2VUb2tlbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBdXRoQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZ2V0PHsgYXV0aF91cmw6IHN0cmluZzsgc3RhdGU6IHN0cmluZzsgbG9nb3V0X3VybDogc3RyaW5nIH0+KExPR0lOX0FQSSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAocmVzID0+ICh7XG4gICAgICAgICAgYXV0aFVybDogcmVzLmF1dGhfdXJsLFxuICAgICAgICAgIHN0YXRlOiByZXMuc3RhdGUsXG4gICAgICAgICAgbG9nb3V0VXJsOiByZXMubG9nb3V0X3VybCB8fCAnJyxcbiAgICAgICAgfSkpLFxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXhpc3RlZFRva2VuKGNvbmZpZzogQXV0aG9yaXphdGlvblN0YXRlKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW5Gcm9tTG9jYWwoY29uZmlnKS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICByZXR1cm4gb2Yoe30gYXMgQXV0aG9yaXphdGlvblN0YXRlKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFRva2VuRnJvbUxvY2FsKFxuICAgIGNvbmZpZzogQXV0aG9yaXphdGlvblN0YXRlLFxuICApOiBPYnNlcnZhYmxlPEF1dGhvcml6YXRpb25TdGF0ZT4ge1xuICAgIGNvbnN0IHsgcXVlcnlQYXJhbXMsIGhhc2hQYXJhbXMgfSA9IHRoaXMuZ2V0UGFyYW1zKCk7XG5cbiAgICBjb25zdCBjb2RlID0gcXVlcnlQYXJhbXNbQ09ERV9LRVldIHx8IGhhc2hQYXJhbXNbQ09ERV9LRVldO1xuICAgIGNvbnN0IGlkVG9rZW4gPSBxdWVyeVBhcmFtc1tJRF9UT0tFTl9LRVldIHx8IGhhc2hQYXJhbXNbSURfVE9LRU5fS0VZXTtcblxuICAgIGlmICghY29kZSAmJiAhaWRUb2tlbikge1xuICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgIH1cblxuICAgIHJlZnJlc2hTdG9yYWdlQWxpdmVSZWNvcmQoKTtcblxuICAgIHJldHVybiBjb2RlXG4gICAgICA/IHRoaXMuc2V0Q29va2llQnlDb2RlKGNvZGUsIGNvbmZpZy5zdGF0ZSlcbiAgICAgIDogdGhpcy5zZXRDb29raWVCeVRva2VuKGlkVG9rZW4pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRDb29raWVCeUNvZGUoY29kZTogc3RyaW5nLCBzdGF0ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmdldDxUb2tlblJlc3BvbnNlPihDQUxMQkFDS19BUEksIHtcbiAgICAgICAgcGFyYW1zOiB7IGNvZGUsIHN0YXRlIH0sXG4gICAgICB9KVxuICAgICAgLnBpcGUobWFwVG9rZW5SZXNwb25zZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q29va2llQnlUb2tlbihpZFRva2VuOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZ2V0PFRva2VuUmVzcG9uc2U+KENBTExCQUNLX0FQSSwge1xuICAgICAgICBwYXJhbXM6IHsgaWRfdG9rZW46IGlkVG9rZW4gfSxcbiAgICAgIH0pXG4gICAgICAucGlwZShtYXBUb2tlblJlc3BvbnNlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXJhbXMoKSB7XG4gICAgY29uc3QgaW5pdFVybCA9IGdldEluaXRVcmwoKTtcblxuICAgIGNvbnN0IGluaXRMb2NhdGlvbiA9IG5ldyBVUkwoaW5pdFVybCk7XG5cbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHBhcnNlUGFyYW1zKFxuICAgICAgaW5pdExvY2F0aW9uLnNlYXJjaCA/IGluaXRMb2NhdGlvbi5zZWFyY2guc2xpY2UoMSkgOiAnJyxcbiAgICApO1xuXG4gICAgY29uc3QgaGFzaFBhcmFtcyA9IHBhcnNlUGFyYW1zKFxuICAgICAgaW5pdExvY2F0aW9uLmhhc2ggPyBpbml0TG9jYXRpb24uaGFzaC5zbGljZSgxKSA6ICcnLFxuICAgICk7XG5cbiAgICByZXR1cm4geyBxdWVyeVBhcmFtcywgaGFzaFBhcmFtcyB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VSZWRpcmVjdFVybChkZXhVcmw6IHN0cmluZywgcmVkaXJlY3RVcmw6IHN0cmluZykge1xuICBjb25zdCBbcGF0aCwgcXVlcnlQYXJhbXNdID0gZGV4VXJsLnNwbGl0KCc/Jyk7XG5cbiAgY29uc3QgcmVwbGFjZWRRdWVyeVBhcmFtcyA9IHF1ZXJ5UGFyYW1zXG4gICAgLnNwbGl0KCcmJylcbiAgICAubWFwKHBhaXIgPT4ge1xuICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gcGFpci5zcGxpdCgnPScpO1xuICAgICAgcmV0dXJuIFJFRElSRUNUX1VSSVMuaGFzKGtleSlcbiAgICAgICAgPyBgJHtrZXl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHJlZGlyZWN0VXJsKX1gXG4gICAgICAgIDogYCR7a2V5fT0ke3ZhbHVlfWA7XG4gICAgfSlcbiAgICAuam9pbignJicpO1xuXG4gIHJldHVybiBgJHtwYXRofT8ke3JlcGxhY2VkUXVlcnlQYXJhbXN9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZGlyZWN0U1NPRW50cnkoZW50cnk6IHN0cmluZykge1xuICBjb25zdCBoYXNRdWVyeSA9IGVudHJ5LmluY2x1ZGVzKCc/Jyk7XG5cbiAgaWYgKGhhc1F1ZXJ5KSB7XG4gICAgY29uc3QgW3VybCwgcXVlcnldID0gZW50cnkuc3BsaXQoJz8nKTtcbiAgICByZXR1cm4gYCR7RVhURVJOQUxfUkVESVJFQ1RfQVBJfT9yZWRpcmVjdF91cmw9JHt1cmx9JiR7cXVlcnl9YDtcbiAgfVxuXG4gIHJldHVybiBgJHtFWFRFUk5BTF9SRURJUkVDVF9BUEl9P3JlZGlyZWN0X3VybD0ke2VudHJ5fWA7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUGFyYW1zKHF1ZXJ5OiBzdHJpbmcpOiBTdHJpbmdNYXAge1xuICBpZiAoIXF1ZXJ5KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmV0dXJuIHF1ZXJ5LnNwbGl0KCcmJykucmVkdWNlKChhY2MsIHBhcmFtKSA9PiB7XG4gICAgY29uc3QgW2tleSwgdmFsdWVdID0gcGFyYW0uc3BsaXQoJz0nKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5hY2MsXG4gICAgICBba2V5XTogdmFsdWUsXG4gICAgfTtcbiAgfSwge30pO1xufVxuXG5mdW5jdGlvbiBtYXBUb2tlblJlc3BvbnNlKCkge1xuICByZXR1cm4gcGlwZShcbiAgICB0YXAoKHsgaWRfdG9rZW46IGlkVG9rZW4gfTogVG9rZW5SZXNwb25zZSkgPT4ge1xuICAgICAgd3JpdGVTdG9yYWdlVG9rZW4oaWRUb2tlbik7XG4gICAgfSksXG4gICAgbWFwKFxuICAgICAgKHsgdG9rZW5fdHlwZSwgdG9rZW5fc3RvcmFnZSwgZXhwaXJlX2F0LCBpc3N1ZWRfYXQgfTogVG9rZW5SZXNwb25zZSkgPT4gKHtcbiAgICAgICAgc3RvcmFnZVR5cGU6IHRva2VuX3N0b3JhZ2UsXG4gICAgICAgIHRva2VuVHlwZTogdG9rZW5fdHlwZSxcbiAgICAgICAgZXhwaXJlQXQ6IGV4cGlyZV9hdCxcbiAgICAgICAgaXNzdWVkQXQ6IGlzc3VlZF9hdCxcbiAgICAgIH0pLFxuICAgICksXG4gICk7XG59XG4iXX0=
@@ -1,98 +1,22 @@
1
- import { ID_TOKEN_KEY, REFRESH_TOKEN_KEY, STORAGE_TYPE_KEY, } from './state.service';
2
- let sessionTokenShareChannel;
3
- const SESSION_TOKEN_SHARE_CHANNEL = 'SESSION_TOKEN_SHARE_CHANNEL';
4
- const SESSION_CLOSE_TIMESTAMP = 'session_close_timestamp';
5
- const recordSessionTimestamp = () => {
6
- sessionStorage.setItem(SESSION_CLOSE_TIMESTAMP, Date.now().toString());
7
- };
8
- const getStorage = (storageType) => storageType === 'session' ? sessionStorage : localStorage;
9
- export function readStorageType() {
10
- return (localStorage.getItem(STORAGE_TYPE_KEY) === 'session' ? 'session' : 'local');
11
- }
1
+ import { ID_TOKEN_KEY } from './state.service';
2
+ const APP_ALIVE_RECORD = 'app_alive_record';
12
3
  export function cleanStorageToken() {
13
4
  localStorage.removeItem(ID_TOKEN_KEY);
14
- localStorage.removeItem(REFRESH_TOKEN_KEY);
15
- sessionStorage.removeItem(ID_TOKEN_KEY);
16
- sessionStorage.removeItem(REFRESH_TOKEN_KEY);
17
5
  }
18
6
  export function writeStorageToken(token) {
19
- cleanStorageToken();
20
- sessionStorage.removeItem(SESSION_CLOSE_TIMESTAMP);
21
- const storage = getStorage(token.storageType);
22
- storage.setItem(ID_TOKEN_KEY, token.idToken);
23
- storage.setItem(REFRESH_TOKEN_KEY, token.refreshToken);
24
- localStorage.setItem(STORAGE_TYPE_KEY, token.storageType);
25
- if (token.storageType === 'session') {
26
- setupSessionTokenShareChannel();
27
- }
28
- else {
29
- closeSessionTokenShareChannel();
7
+ if (!token) {
8
+ return;
30
9
  }
10
+ cleanStorageToken();
11
+ localStorage.setItem(ID_TOKEN_KEY, token);
31
12
  }
32
13
  export function readStorageToken() {
33
- const storageType = readStorageType();
34
- if (storageType === 'session') {
35
- const sessionTimestamp = sessionStorage.getItem(SESSION_CLOSE_TIMESTAMP);
36
- sessionStorage.removeItem(SESSION_CLOSE_TIMESTAMP);
37
- if (sessionTimestamp &&
38
- Date.now() - parseInt(sessionTimestamp) > 30 * 1000) {
39
- // 浏览器恢复标签时清除 session token
40
- cleanStorageToken();
41
- console.warn('session timeout');
42
- }
43
- setupSessionTokenShareChannel();
44
- }
45
- const storage = getStorage(storageType);
46
- return {
47
- storageType,
48
- idToken: storage.getItem(ID_TOKEN_KEY),
49
- refreshToken: storage.getItem(REFRESH_TOKEN_KEY),
50
- };
14
+ return localStorage.getItem(ID_TOKEN_KEY);
51
15
  }
52
- export function asyncReadStorageToken() {
53
- const storageToken = readStorageToken();
54
- if (storageToken.storageType === 'session' && !storageToken.idToken) {
55
- return new Promise(resolve => {
56
- const timer = window.setTimeout(() => {
57
- console.warn('request session token timeout');
58
- sessionTokenShareChannel.removeEventListener('message', receiveSessionToken);
59
- resolve({});
60
- }, 50);
61
- function receiveSessionToken({ data, }) {
62
- if (data.type === 'provide') {
63
- window.clearTimeout(timer);
64
- sessionTokenShareChannel.removeEventListener('message', receiveSessionToken);
65
- writeStorageToken(data.token);
66
- resolve(data.token);
67
- }
68
- }
69
- sessionTokenShareChannel.addEventListener('message', receiveSessionToken);
70
- sessionTokenShareChannel.postMessage({ type: 'request' });
71
- });
72
- }
73
- return Promise.resolve(storageToken);
74
- }
75
- function setupSessionTokenShareChannel() {
76
- if (sessionTokenShareChannel) {
77
- return;
78
- }
79
- sessionTokenShareChannel = new BroadcastChannel(SESSION_TOKEN_SHARE_CHANNEL);
80
- sessionTokenShareChannel.addEventListener('message', ({ data }) => {
81
- if (data.type === 'request') {
82
- sessionTokenShareChannel.postMessage({
83
- type: 'provide',
84
- token: readStorageToken(),
85
- });
86
- }
87
- });
88
- window.addEventListener('beforeunload', recordSessionTimestamp);
16
+ export function refreshStorageAliveRecord() {
17
+ localStorage.setItem(APP_ALIVE_RECORD, Date.now().toString());
89
18
  }
90
- function closeSessionTokenShareChannel() {
91
- if (!sessionTokenShareChannel) {
92
- return;
93
- }
94
- sessionTokenShareChannel.close();
95
- sessionTokenShareChannel = null;
96
- window.removeEventListener('beforeunload', recordSessionTimestamp);
19
+ export function readStorageAliveRecord() {
20
+ return parseInt(localStorage.getItem(APP_ALIVE_RECORD));
97
21
  }
98
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS10b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9hdXRob3JpemF0aW9uL3N0b3JhZ2UtdG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFlBQVksRUFDWixpQkFBaUIsRUFDakIsZ0JBQWdCLEdBRWpCLE1BQU0saUJBQWlCLENBQUM7QUFFekIsSUFBSSx3QkFBMEMsQ0FBQztBQUUvQyxNQUFNLDJCQUEyQixHQUFHLDZCQUE2QixDQUFDO0FBRWxFLE1BQU0sdUJBQXVCLEdBQUcseUJBQXlCLENBQUM7QUFFMUQsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLEVBQUU7SUFDbEMsY0FBYyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUN6RSxDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUsR0FBRyxDQUFDLFdBQXdCLEVBQVcsRUFBRSxDQUN2RCxXQUFXLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztBQWU1RCxNQUFNLFVBQVUsZUFBZTtJQUM3QixPQUFPLENBQ0wsWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQzVELENBQUM7QUFDbkIsQ0FBQztBQUVELE1BQU0sVUFBVSxpQkFBaUI7SUFDL0IsWUFBWSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN0QyxZQUFZLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFM0MsY0FBYyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4QyxjQUFjLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVE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LENBQUMsQ0FBQztZQUUxRSx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUM1RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUVELFNBQVMsNkJBQTZCO0lBQ3BDLElBQUksd0JBQXdCLEVBQUUsQ0FBQztRQUM3QixPQUFPO0lBQ1QsQ0FBQztJQUVELHdCQUF3QixHQUFHLElBQUksZ0JBQWdCLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUU3RSx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FDdkMsU0FBUyxFQUNULENBQUMsRUFBRSxJQUFJLEVBQXVDLEVBQUUsRUFBRTtRQUNoRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDNUIsd0JBQXdCLENBQUMsV0FBVyxDQUFDO2dCQUNuQyxJQUFJLEVBQUUsU0FBUztnQkFDZixLQUFLLEVBQUUsZ0JBQWdCLEVBQUU7YUFDRCxDQUFDLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUMsQ0FDRixDQUFDO0lBRUYsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRCxTQUFTLDZCQUE2QjtJQUNwQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUM5QixPQUFPO0lBQ1QsQ0FBQztJQUVELHdCQUF3QixDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2pDLHdCQUF3QixHQUFHLElBQUksQ0FBQztJQUVoQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsY0FBYyxFQUFFLHNCQUFzQixDQUFDLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIElEX1RPS0VOX0tFWSxcbiAgUkVGUkVTSF9UT0tFTl9LRVksXG4gIFNUT1JBR0VfVFlQRV9LRVksXG4gIFN0b3JhZ2VUeXBlLFxufSBmcm9tICcuL3N0YXRlLnNlcnZpY2UnO1xuXG5sZXQgc2Vzc2lvblRva2VuU2hhcmVDaGFubmVsOiBCcm9hZGNhc3RDaGFubmVsO1xuXG5jb25zdCBTRVNTSU9OX1RPS0VOX1NIQVJFX0NIQU5ORUwgPSAnU0VTU0lPTl9UT0tFTl9TSEFSRV9DSEFOTkVMJztcblxuY29uc3QgU0VTU0lPTl9DTE9TRV9USU1FU1RBTVAgPSAnc2Vzc2lvbl9jbG9zZV90aW1lc3RhbXAnO1xuXG5jb25zdCByZWNvcmRTZXNzaW9uVGltZXN0YW1wID0gKCkgPT4ge1xuICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFNFU1NJT05fQ0xPU0VfVElNRVNUQU1QLCBEYXRlLm5vdygpLnRvU3RyaW5nKCkpO1xufTtcblxuY29uc3QgZ2V0U3RvcmFnZSA9IChzdG9yYWdlVHlwZTogU3RvcmFnZVR5cGUpOiBTdG9yYWdlID0+XG4gIHN0b3JhZ2VUeXBlID09PSAnc2Vzc2lvbicgPyBzZXNzaW9uU3RvcmFnZSA6IGxvY2FsU3RvcmFnZTtcblxudHlwZSBTZXNzaW9uVG9rZW5TaGFyZURhdGEgPVxuICB8IHtcbiAgICAgIHR5cGU6ICdwcm92aWRlJztcbiAgICAgIHRva2VuOiBTdG9yYWdlVG9rZW47XG4gICAgfVxuICB8IHsgdHlwZTogJ3JlcXVlc3QnIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZVRva2VuIHtcbiAgc3RvcmFnZVR5cGU6IFN0b3JhZ2VUeXBlO1xuICBpZFRva2VuOiBzdHJpbmc7XG4gIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFN0b3JhZ2VUeXBlKCkge1xuICByZXR1cm4gKFxuICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfVFlQRV9LRVkpID09PSAnc2Vzc2lvbicgPyAnc2Vzc2lvbicgOiAnbG9jYWwnXG4gICkgYXMgU3RvcmFnZVR5cGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblN0b3JhZ2VUb2tlbigpIHtcbiAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oSURfVE9LRU5fS0VZKTtcbiAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oUkVGUkVTSF9UT0tFTl9LRVkpO1xuXG4gIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oSURfVE9LRU5fS0VZKTtcbiAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShSRUZSRVNIX1RPS0VOX0tFWSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVN0b3JhZ2VUb2tlbih0b2tlbjogU3RvcmFnZVRva2VuKSB7XG4gIGNsZWFuU3RvcmFnZVRva2VuKCk7XG4gIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oU0VTU0lPTl9DTE9TRV9USU1FU1RBTVApO1xuXG4gIGNvbnN0IHN0b3JhZ2UgPSBnZXRTdG9yYWdlKHRva2VuLnN0b3JhZ2VUeXBlKTtcblxuICBzdG9yYWdlLnNldEl0ZW0oSURfVE9LRU5fS0VZLCB0b2tlbi5pZFRva2VuKTtcbiAgc3RvcmFnZS5zZXRJdGVtKFJFRlJFU0hfVE9LRU5fS0VZLCB0b2tlbi5yZWZyZXNoVG9rZW4pO1xuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX1RZUEVfS0VZLCB0b2tlbi5zdG9yYWdlVHlwZSk7XG5cbiAgaWYgKHRva2VuLnN0b3JhZ2VUeXBlID09PSAnc2Vzc2lvbicpIHtcbiAgICBzZXR1cFNlc3Npb25Ub2tlblNoYXJlQ2hhbm5lbCgpO1xuICB9IGVsc2Uge1xuICAgIGNsb3NlU2Vzc2lvblRva2VuU2hhcmVDaGFubmVsKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRTdG9yYWdlVG9rZW4oKTogUGFydGlhbDxTdG9yYWdlVG9rZW4+IHtcbiAgY29uc3Qgc3RvcmFnZVR5cGUgPSByZWFkU3RvcmFnZVR5cGUoKTtcblxuICBpZiAoc3RvcmFnZVR5cGUgPT09ICdzZXNzaW9uJykge1xuICAgIGNvbnN0IHNlc3Npb25UaW1lc3RhbXAgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFNFU1NJT05fQ0xPU0VfVElNRVNUQU1QKTtcbiAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFNFU1NJT05fQ0xPU0VfVElNRVNUQU1QKTtcblxuICAgIGlmIChcbiAgICAgIHNlc3Npb25UaW1lc3RhbXAgJiZcbiAgICAgIERhdGUubm93KCkgLSBwYXJzZUludChzZXNzaW9uVGltZXN0YW1wKSA+IDMwICogMTAwMFxuICAgICkge1xuICAgICAgLy8g5rWP6KeI5Zmo5oGi5aSN5qCH562+5pe25riF6ZmkIHNlc3Npb24gdG9rZW5cbiAgICAgIGNsZWFuU3RvcmFnZVRva2VuKCk7XG4gICAgICBjb25zb2xlLndhcm4oJ3Nlc3Npb24gdGltZW91dCcpO1xuICAgIH1cblxuICAgIHNldHVwU2Vzc2lvblRva2VuU2hhcmVDaGFubmVsKCk7XG4gIH1cblxuICBjb25zdCBzdG9yYWdlID0gZ2V0U3RvcmFnZShzdG9yYWdlVHlwZSk7XG5cbiAgcmV0dXJuIHtcbiAgICBzdG9yYWdlVHlwZSxcbiAgICBpZFRva2VuOiBzdG9yYWdlLmdldEl0ZW0oSURfVE9LRU5fS0VZKSxcbiAgICByZWZyZXNoVG9rZW46IHN0b3JhZ2UuZ2V0SXRlbShSRUZSRVNIX1RPS0VOX0tFWSksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3luY1JlYWRTdG9yYWdlVG9rZW4oKTogUHJvbWlzZTxQYXJ0aWFsPFN0b3JhZ2VUb2tlbj4+IHtcbiAgY29uc3Qgc3RvcmFnZVRva2VuID0gcmVhZFN0b3JhZ2VUb2tlbigpO1xuXG4gIGlmIChzdG9yYWdlVG9rZW4uc3RvcmFnZVR5cGUgPT09ICdzZXNzaW9uJyAmJiAhc3RvcmFnZVRva2VuLmlkVG9rZW4pIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBjb25zdCB0aW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKCdyZXF1ZXN0IHNlc3Npb24gdG9rZW4gdGltZW91dCcpO1xuXG4gICAgICAgIHNlc3Npb25Ub2tlblNoYXJlQ2hhbm5lbC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICAgICdtZXNzYWdlJyxcbiAgICAgICAgICByZWNlaXZlU2Vzc2lvblRva2VuLFxuICAgICAgICApO1xuICAgICAgICByZXNvbHZlKHt9KTtcbiAgICAgIH0sIDUwKTtcblxuICAgICAgZnVuY3Rpb24gcmVjZWl2ZVNlc3Npb25Ub2tlbih7XG4gICAgICAgIGRhdGEsXG4gICAgICB9OiBNZXNzYWdlRXZlbnQ8U2Vzc2lvblRva2VuU2hhcmVEYXRhPikge1xuICAgICAgICBpZiAoZGF0YS50eXBlID09PSAncHJvdmlkZScpIHtcbiAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICBzZXNzaW9uVG9rZW5TaGFyZUNoYW5uZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICdtZXNzYWdlJyxcbiAgICAgICAgICAgIHJlY2VpdmVTZXNzaW9uVG9rZW4sXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHdyaXRlU3RvcmFnZVRva2VuKGRhdGEudG9rZW4pO1xuICAgICAgICAgIHJlc29sdmUoZGF0YS50b2tlbik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2Vzc2lvblRva2VuU2hhcmVDaGFubmVsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCByZWNlaXZlU2Vzc2lvblRva2VuKTtcblxuICAgICAgc2Vzc2lvblRva2VuU2hhcmVDaGFubmVsLnBvc3RNZXNzYWdlKHsgdHlwZTogJ3JlcXVlc3QnIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzdG9yYWdlVG9rZW4pO1xufVxuXG5mdW5jdGlvbiBzZXR1cFNlc3Npb25Ub2tlblNoYXJlQ2hhbm5lbCgpIHtcbiAgaWYgKHNlc3Npb25Ub2tlblNoYXJlQ2hhbm5lbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHNlc3Npb25Ub2tlblNoYXJlQ2hhbm5lbCA9IG5ldyBCcm9hZGNhc3RDaGFubmVsKFNFU1NJT05fVE9LRU5fU0hBUkVfQ0hBTk5FTCk7XG5cbiAgc2Vzc2lvblRva2VuU2hhcmVDaGFubmVsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgJ21lc3NhZ2UnLFxuICAgICh7IGRhdGEgfTogTWVzc2FnZUV2ZW50PFNlc3Npb25Ub2tlblNoYXJlRGF0YT4pID0+IHtcbiAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdyZXF1ZXN0Jykge1xuICAgICAgICBzZXNzaW9uVG9rZW5TaGFyZUNoYW5uZWwucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHR5cGU6ICdwcm92aWRlJyxcbiAgICAgICAgICB0b2tlbjogcmVhZFN0b3JhZ2VUb2tlbigpLFxuICAgICAgICB9IGFzIFNlc3Npb25Ub2tlblNoYXJlRGF0YSk7XG4gICAgICB9XG4gICAgfSxcbiAgKTtcblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgcmVjb3JkU2Vzc2lvblRpbWVzdGFtcCk7XG59XG5cbmZ1bmN0aW9uIGNsb3NlU2Vzc2lvblRva2VuU2hhcmVDaGFubmVsKCkge1xuICBpZiAoIXNlc3Npb25Ub2tlblNoYXJlQ2hhbm5lbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHNlc3Npb25Ub2tlblNoYXJlQ2hhbm5lbC5jbG9zZSgpO1xuICBzZXNzaW9uVG9rZW5TaGFyZUNoYW5uZWwgPSBudWxsO1xuXG4gIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCByZWNvcmRTZXNzaW9uVGltZXN0YW1wKTtcbn1cbiJdfQ==
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS10b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9hdXRob3JpemF0aW9uL3N0b3JhZ2UtdG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE1BQU0sZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUM7QUFFNUMsTUFBTSxVQUFVLGlCQUFpQjtJQUMvQixZQUFZLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBYTtJQUM3QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxPQUFPO0lBQ1QsQ0FBQztJQUNELGlCQUFpQixFQUFFLENBQUM7SUFFcEIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0I7SUFDOUIsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxNQUFNLFVBQVUseUJBQXlCO0lBQ3ZDLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVELE1BQU0sVUFBVSxzQkFBc0I7SUFDcEMsT0FBTyxRQUFRLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7QUFDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElEX1RPS0VOX0tFWSB9IGZyb20gJy4vc3RhdGUuc2VydmljZSc7XG5cbmNvbnN0IEFQUF9BTElWRV9SRUNPUkQgPSAnYXBwX2FsaXZlX3JlY29yZCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblN0b3JhZ2VUb2tlbigpIHtcbiAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oSURfVE9LRU5fS0VZKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlU3RvcmFnZVRva2VuKHRva2VuOiBzdHJpbmcpIHtcbiAgaWYgKCF0b2tlbikge1xuICAgIHJldHVybjtcbiAgfVxuICBjbGVhblN0b3JhZ2VUb2tlbigpO1xuXG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKElEX1RPS0VOX0tFWSwgdG9rZW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFN0b3JhZ2VUb2tlbigpOiBzdHJpbmcge1xuICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oSURfVE9LRU5fS0VZKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZnJlc2hTdG9yYWdlQWxpdmVSZWNvcmQoKSB7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKEFQUF9BTElWRV9SRUNPUkQsIERhdGUubm93KCkudG9TdHJpbmcoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkU3RvcmFnZUFsaXZlUmVjb3JkKCk6IG51bWJlciB7XG4gIHJldHVybiBwYXJzZUludChsb2NhbFN0b3JhZ2UuZ2V0SXRlbShBUFBfQUxJVkVfUkVDT1JEKSk7XG59XG4iXX0=