@odx/auth 17.2.0 → 18.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/CHANGELOG.md +99 -0
  2. package/fesm2022/odx-auth-plugins-service-connect.mjs +3 -3
  3. package/fesm2022/odx-auth-plugins-service-connect.mjs.map +1 -1
  4. package/fesm2022/odx-auth.mjs +41 -41
  5. package/fesm2022/odx-auth.mjs.map +1 -1
  6. package/index.d.ts +744 -15
  7. package/package.json +4 -8
  8. package/plugins/service-connect/index.d.ts +184 -8
  9. package/esm2022/index.mjs +0 -16
  10. package/esm2022/lib/auth.component.mjs +0 -50
  11. package/esm2022/lib/auth.config.mjs +0 -71
  12. package/esm2022/lib/auth.directive.mjs +0 -51
  13. package/esm2022/lib/auth.guard.mjs +0 -44
  14. package/esm2022/lib/auth.i18n.mjs +0 -13
  15. package/esm2022/lib/auth.interceptor.mjs +0 -23
  16. package/esm2022/lib/auth.logger.mjs +0 -3
  17. package/esm2022/lib/auth.module.mjs +0 -19
  18. package/esm2022/lib/auth.providers.mjs +0 -136
  19. package/esm2022/lib/auth.service.mjs +0 -317
  20. package/esm2022/lib/auth.typings.mjs +0 -2
  21. package/esm2022/lib/components/auth-actions/auth-actions.component.mjs +0 -40
  22. package/esm2022/lib/components/auth-loading-screen/auth-loading-screen.component.mjs +0 -53
  23. package/esm2022/lib/components/index.mjs +0 -3
  24. package/esm2022/lib/directives/auth-action.directive.mjs +0 -30
  25. package/esm2022/lib/directives/index.mjs +0 -4
  26. package/esm2022/lib/directives/sign-in.directive.mjs +0 -52
  27. package/esm2022/lib/directives/sign-out.directive.mjs +0 -50
  28. package/esm2022/lib/helpers/create-auth-host-url.mjs +0 -18
  29. package/esm2022/lib/helpers/create-inititals.mjs +0 -32
  30. package/esm2022/lib/helpers/handle-auth-error.mjs +0 -31
  31. package/esm2022/lib/helpers/handle-oauth-event.mjs +0 -13
  32. package/esm2022/lib/helpers/index.mjs +0 -9
  33. package/esm2022/lib/helpers/resolve-email.mjs +0 -34
  34. package/esm2022/lib/helpers/resolve-username.mjs +0 -38
  35. package/esm2022/lib/helpers/set-http-auth-header.mjs +0 -22
  36. package/esm2022/lib/helpers/user-language-loader.mjs +0 -17
  37. package/esm2022/lib/models/auth-environment.mjs +0 -3
  38. package/esm2022/lib/models/auth-plugin-manager.mjs +0 -49
  39. package/esm2022/lib/models/authorized-handler.mjs +0 -2
  40. package/esm2022/lib/models/index.mjs +0 -5
  41. package/esm2022/lib/models/offline-auth-error-handler.mjs +0 -7
  42. package/esm2022/lib/plugins/core-debug.plugin.mjs +0 -29
  43. package/esm2022/lib/plugins/core-identity.plugin.mjs +0 -20
  44. package/esm2022/lib/plugins/index.mjs +0 -4
  45. package/esm2022/lib/plugins/user-profile-link.plugin.mjs +0 -18
  46. package/esm2022/lib/unauth.guard.mjs +0 -38
  47. package/esm2022/odx-auth.mjs +0 -5
  48. package/esm2022/plugins/service-connect/index.mjs +0 -9
  49. package/esm2022/plugins/service-connect/lib/dtos/get-service-connect-rights-response.dto.mjs +0 -2
  50. package/esm2022/plugins/service-connect/lib/dtos/get-service-connect-user-response.dto.mjs +0 -2
  51. package/esm2022/plugins/service-connect/lib/dtos/index.mjs +0 -3
  52. package/esm2022/plugins/service-connect/lib/helpers/build-service-connect-url.mjs +0 -16
  53. package/esm2022/plugins/service-connect/lib/helpers/has-roles-or-rights-handler.mjs +0 -12
  54. package/esm2022/plugins/service-connect/lib/helpers/has-roles-or-rights.mjs +0 -11
  55. package/esm2022/plugins/service-connect/lib/helpers/index.mjs +0 -5
  56. package/esm2022/plugins/service-connect/lib/helpers/service-connect-plugin-factory.mjs +0 -25
  57. package/esm2022/plugins/service-connect/lib/service-connect-rights.directive.mjs +0 -44
  58. package/esm2022/plugins/service-connect/lib/service-connect-rights.guard.mjs +0 -15
  59. package/esm2022/plugins/service-connect/lib/service-connect-rights.plugin.mjs +0 -16
  60. package/esm2022/plugins/service-connect/lib/service-connect-user-language.plugin.mjs +0 -34
  61. package/esm2022/plugins/service-connect/lib/service-connect-user-profile.plugin.mjs +0 -28
  62. package/esm2022/plugins/service-connect/lib/service-connect.config.mjs +0 -17
  63. package/esm2022/plugins/service-connect/odx-auth-plugins-service-connect.mjs +0 -5
  64. package/lib/auth.component.d.ts +0 -20
  65. package/lib/auth.config.d.ts +0 -84
  66. package/lib/auth.directive.d.ts +0 -25
  67. package/lib/auth.guard.d.ts +0 -11
  68. package/lib/auth.i18n.d.ts +0 -3
  69. package/lib/auth.interceptor.d.ts +0 -10
  70. package/lib/auth.logger.d.ts +0 -3
  71. package/lib/auth.module.d.ts +0 -10
  72. package/lib/auth.providers.d.ts +0 -46
  73. package/lib/auth.service.d.ts +0 -206
  74. package/lib/auth.typings.d.ts +0 -27
  75. package/lib/components/auth-actions/auth-actions.component.d.ts +0 -16
  76. package/lib/components/auth-loading-screen/auth-loading-screen.component.d.ts +0 -24
  77. package/lib/components/index.d.ts +0 -2
  78. package/lib/directives/auth-action.directive.d.ts +0 -18
  79. package/lib/directives/index.d.ts +0 -3
  80. package/lib/directives/sign-in.directive.d.ts +0 -29
  81. package/lib/directives/sign-out.directive.d.ts +0 -28
  82. package/lib/helpers/create-auth-host-url.d.ts +0 -14
  83. package/lib/helpers/create-inititals.d.ts +0 -18
  84. package/lib/helpers/handle-auth-error.d.ts +0 -13
  85. package/lib/helpers/handle-oauth-event.d.ts +0 -11
  86. package/lib/helpers/index.d.ts +0 -8
  87. package/lib/helpers/resolve-email.d.ts +0 -21
  88. package/lib/helpers/resolve-username.d.ts +0 -22
  89. package/lib/helpers/set-http-auth-header.d.ts +0 -11
  90. package/lib/helpers/user-language-loader.d.ts +0 -11
  91. package/lib/models/auth-environment.d.ts +0 -6
  92. package/lib/models/auth-plugin-manager.d.ts +0 -21
  93. package/lib/models/authorized-handler.d.ts +0 -3
  94. package/lib/models/index.d.ts +0 -4
  95. package/lib/models/offline-auth-error-handler.d.ts +0 -2
  96. package/lib/plugins/core-debug.plugin.d.ts +0 -11
  97. package/lib/plugins/core-identity.plugin.d.ts +0 -18
  98. package/lib/plugins/index.d.ts +0 -3
  99. package/lib/plugins/user-profile-link.plugin.d.ts +0 -18
  100. package/lib/unauth.guard.d.ts +0 -11
  101. package/plugins/service-connect/lib/dtos/get-service-connect-rights-response.dto.d.ts +0 -3
  102. package/plugins/service-connect/lib/dtos/get-service-connect-user-response.dto.d.ts +0 -14
  103. package/plugins/service-connect/lib/dtos/index.d.ts +0 -2
  104. package/plugins/service-connect/lib/helpers/build-service-connect-url.d.ts +0 -10
  105. package/plugins/service-connect/lib/helpers/has-roles-or-rights-handler.d.ts +0 -10
  106. package/plugins/service-connect/lib/helpers/has-roles-or-rights.d.ts +0 -11
  107. package/plugins/service-connect/lib/helpers/index.d.ts +0 -4
  108. package/plugins/service-connect/lib/helpers/service-connect-plugin-factory.d.ts +0 -20
  109. package/plugins/service-connect/lib/service-connect-rights.directive.d.ts +0 -21
  110. package/plugins/service-connect/lib/service-connect-rights.guard.d.ts +0 -11
  111. package/plugins/service-connect/lib/service-connect-rights.plugin.d.ts +0 -18
  112. package/plugins/service-connect/lib/service-connect-user-language.plugin.d.ts +0 -24
  113. package/plugins/service-connect/lib/service-connect-user-profile.plugin.d.ts +0 -23
  114. package/plugins/service-connect/lib/service-connect.config.d.ts +0 -15
@@ -1,136 +0,0 @@
1
- import { provideHttpClient, withInterceptors } from '@angular/common/http';
2
- import { APP_INITIALIZER, ENVIRONMENT_INITIALIZER, InjectionToken, inject, makeEnvironmentProviders } from '@angular/core';
3
- import { WindowRef } from '@odx/angular';
4
- import { DynamicViewService } from '@odx/angular/cdk/dynamic-view';
5
- import { buildUrl } from '@odx/angular/utils';
6
- import { OAuthStorage, provideOAuthClient } from 'angular-oauth2-oidc';
7
- import { tap } from 'rxjs';
8
- import { ODX_AUTH_DEFAULT_SCOPES, injectAuthConfig, provideAuthConfig } from './auth.config';
9
- import { authInterceptor } from './auth.interceptor';
10
- import logger from './auth.logger';
11
- import { AuthService } from './auth.service';
12
- import { AuthLoadingScreenComponent } from './components';
13
- import { createAuthHostUrl, handleAuthError } from './helpers';
14
- import { offlineAuthErrorHandler } from './models';
15
- import { coreDebugPlugin, coreIdentityPlugin, userProfileUrlPlugin } from './plugins';
16
- export const ODX_AUTH_ERROR_HANDLERS = new InjectionToken('@odx/auth::ErrorHandlers', {
17
- providedIn: 'root',
18
- factory: () => {
19
- const { errorHandler } = injectAuthConfig();
20
- return [offlineAuthErrorHandler, errorHandler];
21
- },
22
- });
23
- export const ODX_AUTH_PLUGINS_ERROR_HANDLER = new InjectionToken('@odx/auth::PluginsErrorHandler', {
24
- providedIn: 'root',
25
- factory: () => injectAuthConfig().pluginsErrorHandler ?? null,
26
- });
27
- export const ODX_AUTH_CORE_PLUGINS = new InjectionToken('@odx/auth::CorePlugins', {
28
- providedIn: 'root',
29
- factory: () => {
30
- const { showDebugInformation } = injectAuthConfig();
31
- const plugins = [coreIdentityPlugin, userProfileUrlPlugin];
32
- if (showDebugInformation) {
33
- plugins.push(coreDebugPlugin);
34
- }
35
- return plugins;
36
- },
37
- });
38
- export const ODX_AUTH_PLUGINS = new InjectionToken('@odx/auth::Plugins', {
39
- providedIn: 'root',
40
- factory: () => {
41
- const { plugins } = injectAuthConfig();
42
- const corePlugins = inject(ODX_AUTH_CORE_PLUGINS);
43
- return [...corePlugins, ...plugins].map((pluginFactory) => pluginFactory());
44
- },
45
- });
46
- /**
47
- * Provides a logger for the authentication module.
48
- *
49
- * @returns {Provider} - The provider for the logger.
50
- */
51
- export function provideAuthLogger() {
52
- return {
53
- provide: ENVIRONMENT_INITIALIZER,
54
- useFactory: () => {
55
- const { showDebugInformation } = injectAuthConfig();
56
- if (!showDebugInformation)
57
- logger.disable();
58
- return () => void 0;
59
- },
60
- multi: true,
61
- };
62
- }
63
- /**
64
- * Initializes the authentication error handlers.
65
- */
66
- export function initializeAuthErrorHandlers() {
67
- const authService = inject(AuthService);
68
- const handler = handleAuthError(inject(ODX_AUTH_ERROR_HANDLERS));
69
- authService.errors$.pipe(tap((error) => handler(error))).subscribe();
70
- }
71
- /**
72
- * Initializes the authentication configuration.
73
- *
74
- * @returns {() => Promise<void>} - A function that returns a promise resolving when the configuration is initialized.
75
- */
76
- export function initalizeAuthConfig() {
77
- const { clientId, scopes, redirectPath, environment, postLogoutRedirectUrl, issuer, timeoutFactor, discoveryUrl, enableLoadingScreen } = injectAuthConfig();
78
- const authService = inject(AuthService);
79
- const redirectUri = buildUrl(inject(WindowRef).getOrigin(), redirectPath);
80
- const scope = Array.from(new Set(ODX_AUTH_DEFAULT_SCOPES.concat(scopes ?? []))).join(' ');
81
- if (enableLoadingScreen) {
82
- AuthLoadingScreenComponent.initialize(authService, inject(DynamicViewService));
83
- }
84
- return () => authService.initialize({
85
- clientId,
86
- issuer: issuer ?? createAuthHostUrl(environment, 'oauth2/default'),
87
- scope,
88
- redirectUri,
89
- postLogoutRedirectUri: postLogoutRedirectUrl,
90
- preserveRequestedRoute: true,
91
- strictDiscoveryDocumentValidation: !discoveryUrl,
92
- responseType: 'code',
93
- showDebugInformation: false,
94
- timeoutFactor,
95
- waitForTokenInMsec: 1000,
96
- });
97
- }
98
- /**
99
- * Provides the authentication configuration and dependencies.
100
- *
101
- * @param {ConfigProvider<Partial<AuthConfig>, D>} config - The configuration provider.
102
- * @returns {EnvironmentProviders} The environment providers for authentication.
103
- * @template D
104
- *
105
- * @example Provide the authentication configuration and dependencies
106
- * ```ts
107
- * providers: [
108
- * provideAuth({
109
- * useFactory: ({ environment, auth: { clientId, loadUserProfile } }: ApplicationEnvironment) => ({
110
- * environment,
111
- * clientId,
112
- * loadUserProfile,
113
- * }),
114
- * deps: [APPLICATION_ENVIRONMENT],
115
- * }),
116
- * ],
117
- * ```
118
- */
119
- export function provideAuth(config) {
120
- return makeEnvironmentProviders([
121
- provideAuthConfig(config),
122
- provideAuthLogger(),
123
- provideOAuthClient({ resourceServer: { sendAccessToken: false, allowedUrls: [] } }),
124
- provideHttpClient(withInterceptors([authInterceptor])),
125
- {
126
- provide: APP_INITIALIZER,
127
- useFactory: initalizeAuthConfig,
128
- multi: true,
129
- },
130
- {
131
- provide: OAuthStorage,
132
- useFactory: () => injectAuthConfig().storage ?? inject(WindowRef).nativeWindow.localStorage,
133
- },
134
- ]);
135
- }
136
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5wcm92aWRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2F1dGgvc3JjL2xpYi9hdXRoLnByb3ZpZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLHVCQUF1QixFQUF3QixjQUFjLEVBQVksTUFBTSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNKLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkUsT0FBTyxFQUFzQyxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQixPQUFPLEVBQWtDLHVCQUF1QixFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9ELE9BQU8sRUFBeUQsdUJBQXVCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUcsT0FBTyxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV0RixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLGNBQWMsQ0FBdUIsMEJBQTBCLEVBQUU7SUFDMUcsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRTtRQUNaLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBRTVDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0YsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsSUFBSSxjQUFjLENBQWdDLGdDQUFnQyxFQUFFO0lBQ2hJLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLG1CQUFtQixJQUFJLElBQUk7Q0FDOUQsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxjQUFjLENBQXNCLHdCQUF3QixFQUFFO0lBQ3JHLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDWixNQUFNLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3BELE1BQU0sT0FBTyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUMzRCxJQUFJLG9CQUFvQixFQUFFLENBQUM7WUFDekIsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUFlLG9CQUFvQixFQUFFO0lBQ3JGLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDWixNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUN2QyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUVsRCxPQUFPLENBQUMsR0FBRyxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQztDQUNGLENBQUMsQ0FBQztBQUVIOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCO0lBQy9CLE9BQU87UUFDTCxPQUFPLEVBQUUsdUJBQXVCO1FBQ2hDLFVBQVUsRUFBRSxHQUFHLEVBQUU7WUFDZixNQUFNLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3BELElBQUksQ0FBQyxvQkFBb0I7Z0JBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRTVDLE9BQU8sR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsQ0FBQztRQUNELEtBQUssRUFBRSxJQUFJO0tBQ1osQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSwyQkFBMkI7SUFDekMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO0lBRWpFLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUN2RSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxtQkFBbUI7SUFDakMsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFDNUosTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDMUUsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUYsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQ3hCLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBQ0QsT0FBTyxHQUFHLEVBQUUsQ0FDVixXQUFXLENBQUMsVUFBVSxDQUFDO1FBQ3JCLFFBQVE7UUFDUixNQUFNLEVBQUUsTUFBTSxJQUFJLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQztRQUNsRSxLQUFLO1FBQ0wsV0FBVztRQUNYLHFCQUFxQixFQUFFLHFCQUFxQjtRQUM1QyxzQkFBc0IsRUFBRSxJQUFJO1FBQzVCLGlDQUFpQyxFQUFFLENBQUMsWUFBWTtRQUNoRCxZQUFZLEVBQUUsTUFBTTtRQUNwQixvQkFBb0IsRUFBRSxLQUFLO1FBQzNCLGFBQWE7UUFDYixrQkFBa0IsRUFBRSxJQUFJO0tBQ3pCLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUErQixNQUE4QztJQUN0RyxPQUFPLHdCQUF3QixDQUFDO1FBQzlCLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUN6QixpQkFBaUIsRUFBRTtRQUNuQixrQkFBa0IsQ0FBQyxFQUFFLGNBQWMsRUFBRSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDbkYsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ3REO1lBQ0UsT0FBTyxFQUFFLGVBQWU7WUFDeEIsVUFBVSxFQUFFLG1CQUFtQjtZQUMvQixLQUFLLEVBQUUsSUFBSTtTQUNaO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsWUFBWTtZQUNyQixVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxZQUFZO1NBQzVGO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHByb3ZpZGVIdHRwQ2xpZW50LCB3aXRoSW50ZXJjZXB0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQVBQX0lOSVRJQUxJWkVSLCBFTlZJUk9OTUVOVF9JTklUSUFMSVpFUiwgRW52aXJvbm1lbnRQcm92aWRlcnMsIEluamVjdGlvblRva2VuLCBQcm92aWRlciwgaW5qZWN0LCBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFdpbmRvd1JlZiB9IGZyb20gJ0BvZHgvYW5ndWxhcic7XG5pbXBvcnQgeyBEeW5hbWljVmlld1NlcnZpY2UgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY2RrL2R5bmFtaWMtdmlldyc7XG5pbXBvcnQgeyBDb25maWdEZXBlbmRlbmNpZXMsIENvbmZpZ1Byb3ZpZGVyLCBidWlsZFVybCB9IGZyb20gJ0BvZHgvYW5ndWxhci91dGlscyc7XG5pbXBvcnQgeyBPQXV0aFN0b3JhZ2UsIHByb3ZpZGVPQXV0aENsaWVudCB9IGZyb20gJ2FuZ3VsYXItb2F1dGgyLW9pZGMnO1xuaW1wb3J0IHsgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBdXRoQ29uZmlnLCBBdXRoRXJyb3JIYW5kbGVyRm4sIE9EWF9BVVRIX0RFRkFVTFRfU0NPUEVTLCBpbmplY3RBdXRoQ29uZmlnLCBwcm92aWRlQXV0aENvbmZpZyB9IGZyb20gJy4vYXV0aC5jb25maWcnO1xuaW1wb3J0IHsgYXV0aEludGVyY2VwdG9yIH0gZnJvbSAnLi9hdXRoLmludGVyY2VwdG9yJztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi9hdXRoLmxvZ2dlcic7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4vYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhMb2FkaW5nU2NyZWVuQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzJztcbmltcG9ydCB7IGNyZWF0ZUF1dGhIb3N0VXJsLCBoYW5kbGVBdXRoRXJyb3IgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgQXV0aFBsdWdpbiwgQXV0aFBsdWdpbkVycm9ySGFuZGxlciwgQXV0aFBsdWdpbkZhY3RvcnksIG9mZmxpbmVBdXRoRXJyb3JIYW5kbGVyIH0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHsgY29yZURlYnVnUGx1Z2luLCBjb3JlSWRlbnRpdHlQbHVnaW4sIHVzZXJQcm9maWxlVXJsUGx1Z2luIH0gZnJvbSAnLi9wbHVnaW5zJztcblxuZXhwb3J0IGNvbnN0IE9EWF9BVVRIX0VSUk9SX0hBTkRMRVJTID0gbmV3IEluamVjdGlvblRva2VuPEF1dGhFcnJvckhhbmRsZXJGbltdPignQG9keC9hdXRoOjpFcnJvckhhbmRsZXJzJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IHtcbiAgICBjb25zdCB7IGVycm9ySGFuZGxlciB9ID0gaW5qZWN0QXV0aENvbmZpZygpO1xuXG4gICAgcmV0dXJuIFtvZmZsaW5lQXV0aEVycm9ySGFuZGxlciwgZXJyb3JIYW5kbGVyXTtcbiAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgT0RYX0FVVEhfUExVR0lOU19FUlJPUl9IQU5ETEVSID0gbmV3IEluamVjdGlvblRva2VuPEF1dGhQbHVnaW5FcnJvckhhbmRsZXIgfCBudWxsPignQG9keC9hdXRoOjpQbHVnaW5zRXJyb3JIYW5kbGVyJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IGluamVjdEF1dGhDb25maWcoKS5wbHVnaW5zRXJyb3JIYW5kbGVyID8/IG51bGwsXG59KTtcblxuZXhwb3J0IGNvbnN0IE9EWF9BVVRIX0NPUkVfUExVR0lOUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxBdXRoUGx1Z2luRmFjdG9yeVtdPignQG9keC9hdXRoOjpDb3JlUGx1Z2lucycsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiAoKSA9PiB7XG4gICAgY29uc3QgeyBzaG93RGVidWdJbmZvcm1hdGlvbiB9ID0gaW5qZWN0QXV0aENvbmZpZygpO1xuICAgIGNvbnN0IHBsdWdpbnMgPSBbY29yZUlkZW50aXR5UGx1Z2luLCB1c2VyUHJvZmlsZVVybFBsdWdpbl07XG4gICAgaWYgKHNob3dEZWJ1Z0luZm9ybWF0aW9uKSB7XG4gICAgICBwbHVnaW5zLnB1c2goY29yZURlYnVnUGx1Z2luKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGx1Z2lucztcbiAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgT0RYX0FVVEhfUExVR0lOUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxBdXRoUGx1Z2luW10+KCdAb2R4L2F1dGg6OlBsdWdpbnMnLCB7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgZmFjdG9yeTogKCkgPT4ge1xuICAgIGNvbnN0IHsgcGx1Z2lucyB9ID0gaW5qZWN0QXV0aENvbmZpZygpO1xuICAgIGNvbnN0IGNvcmVQbHVnaW5zID0gaW5qZWN0KE9EWF9BVVRIX0NPUkVfUExVR0lOUyk7XG5cbiAgICByZXR1cm4gWy4uLmNvcmVQbHVnaW5zLCAuLi5wbHVnaW5zXS5tYXAoKHBsdWdpbkZhY3RvcnkpID0+IHBsdWdpbkZhY3RvcnkoKSk7XG4gIH0sXG59KTtcblxuLyoqXG4gKiBQcm92aWRlcyBhIGxvZ2dlciBmb3IgdGhlIGF1dGhlbnRpY2F0aW9uIG1vZHVsZS5cbiAqXG4gKiBAcmV0dXJucyB7UHJvdmlkZXJ9IC0gVGhlIHByb3ZpZGVyIGZvciB0aGUgbG9nZ2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUF1dGhMb2dnZXIoKTogUHJvdmlkZXIge1xuICByZXR1cm4ge1xuICAgIHByb3ZpZGU6IEVOVklST05NRU5UX0lOSVRJQUxJWkVSLFxuICAgIHVzZUZhY3Rvcnk6ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgc2hvd0RlYnVnSW5mb3JtYXRpb24gfSA9IGluamVjdEF1dGhDb25maWcoKTtcbiAgICAgIGlmICghc2hvd0RlYnVnSW5mb3JtYXRpb24pIGxvZ2dlci5kaXNhYmxlKCk7XG5cbiAgICAgIHJldHVybiAoKSA9PiB2b2lkIDA7XG4gICAgfSxcbiAgICBtdWx0aTogdHJ1ZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgYXV0aGVudGljYXRpb24gZXJyb3IgaGFuZGxlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplQXV0aEVycm9ySGFuZGxlcnMoKTogdm9pZCB7XG4gIGNvbnN0IGF1dGhTZXJ2aWNlID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgY29uc3QgaGFuZGxlciA9IGhhbmRsZUF1dGhFcnJvcihpbmplY3QoT0RYX0FVVEhfRVJST1JfSEFORExFUlMpKTtcblxuICBhdXRoU2VydmljZS5lcnJvcnMkLnBpcGUodGFwKChlcnJvcikgPT4gaGFuZGxlcihlcnJvcikpKS5zdWJzY3JpYmUoKTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgYXV0aGVudGljYXRpb24gY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAcmV0dXJucyB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHByb21pc2UgcmVzb2x2aW5nIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gaXMgaW5pdGlhbGl6ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0YWxpemVBdXRoQ29uZmlnKCk6ICgpID0+IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGNsaWVudElkLCBzY29wZXMsIHJlZGlyZWN0UGF0aCwgZW52aXJvbm1lbnQsIHBvc3RMb2dvdXRSZWRpcmVjdFVybCwgaXNzdWVyLCB0aW1lb3V0RmFjdG9yLCBkaXNjb3ZlcnlVcmwsIGVuYWJsZUxvYWRpbmdTY3JlZW4gfSA9IGluamVjdEF1dGhDb25maWcoKTtcbiAgY29uc3QgYXV0aFNlcnZpY2UgPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xuICBjb25zdCByZWRpcmVjdFVyaSA9IGJ1aWxkVXJsKGluamVjdChXaW5kb3dSZWYpLmdldE9yaWdpbigpLCByZWRpcmVjdFBhdGgpO1xuICBjb25zdCBzY29wZSA9IEFycmF5LmZyb20obmV3IFNldChPRFhfQVVUSF9ERUZBVUxUX1NDT1BFUy5jb25jYXQoc2NvcGVzID8/IFtdKSkpLmpvaW4oJyAnKTtcbiAgaWYgKGVuYWJsZUxvYWRpbmdTY3JlZW4pIHtcbiAgICBBdXRoTG9hZGluZ1NjcmVlbkNvbXBvbmVudC5pbml0aWFsaXplKGF1dGhTZXJ2aWNlLCBpbmplY3QoRHluYW1pY1ZpZXdTZXJ2aWNlKSk7XG4gIH1cbiAgcmV0dXJuICgpID0+XG4gICAgYXV0aFNlcnZpY2UuaW5pdGlhbGl6ZSh7XG4gICAgICBjbGllbnRJZCxcbiAgICAgIGlzc3VlcjogaXNzdWVyID8/IGNyZWF0ZUF1dGhIb3N0VXJsKGVudmlyb25tZW50LCAnb2F1dGgyL2RlZmF1bHQnKSxcbiAgICAgIHNjb3BlLFxuICAgICAgcmVkaXJlY3RVcmksXG4gICAgICBwb3N0TG9nb3V0UmVkaXJlY3RVcmk6IHBvc3RMb2dvdXRSZWRpcmVjdFVybCxcbiAgICAgIHByZXNlcnZlUmVxdWVzdGVkUm91dGU6IHRydWUsXG4gICAgICBzdHJpY3REaXNjb3ZlcnlEb2N1bWVudFZhbGlkYXRpb246ICFkaXNjb3ZlcnlVcmwsXG4gICAgICByZXNwb25zZVR5cGU6ICdjb2RlJyxcbiAgICAgIHNob3dEZWJ1Z0luZm9ybWF0aW9uOiBmYWxzZSxcbiAgICAgIHRpbWVvdXRGYWN0b3IsXG4gICAgICB3YWl0Rm9yVG9rZW5Jbk1zZWM6IDEwMDAsXG4gICAgfSk7XG59XG5cbi8qKlxuICogUHJvdmlkZXMgdGhlIGF1dGhlbnRpY2F0aW9uIGNvbmZpZ3VyYXRpb24gYW5kIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBAcGFyYW0ge0NvbmZpZ1Byb3ZpZGVyPFBhcnRpYWw8QXV0aENvbmZpZz4sIEQ+fSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBwcm92aWRlci5cbiAqIEByZXR1cm5zIHtFbnZpcm9ubWVudFByb3ZpZGVyc30gVGhlIGVudmlyb25tZW50IHByb3ZpZGVycyBmb3IgYXV0aGVudGljYXRpb24uXG4gKiBAdGVtcGxhdGUgRFxuICpcbiAqIEBleGFtcGxlIFByb3ZpZGUgdGhlIGF1dGhlbnRpY2F0aW9uIGNvbmZpZ3VyYXRpb24gYW5kIGRlcGVuZGVuY2llc1xuICogYGBgdHNcbiAqIHByb3ZpZGVyczogW1xuICogIHByb3ZpZGVBdXRoKHtcbiAqICAgdXNlRmFjdG9yeTogKHsgZW52aXJvbm1lbnQsIGF1dGg6IHsgY2xpZW50SWQsIGxvYWRVc2VyUHJvZmlsZSB9IH06IEFwcGxpY2F0aW9uRW52aXJvbm1lbnQpID0+ICh7XG4gKiAgICAgZW52aXJvbm1lbnQsXG4gKiAgICAgY2xpZW50SWQsXG4gKiAgICAgbG9hZFVzZXJQcm9maWxlLFxuICogICB9KSxcbiAqICAgZGVwczogW0FQUExJQ0FUSU9OX0VOVklST05NRU5UXSxcbiAqICB9KSxcbiAqIF0sXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVBdXRoPEQgZXh0ZW5kcyBDb25maWdEZXBlbmRlbmNpZXM+KGNvbmZpZzogQ29uZmlnUHJvdmlkZXI8UGFydGlhbDxBdXRoQ29uZmlnPiwgRD4pOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIHByb3ZpZGVBdXRoQ29uZmlnKGNvbmZpZyksXG4gICAgcHJvdmlkZUF1dGhMb2dnZXIoKSxcbiAgICBwcm92aWRlT0F1dGhDbGllbnQoeyByZXNvdXJjZVNlcnZlcjogeyBzZW5kQWNjZXNzVG9rZW46IGZhbHNlLCBhbGxvd2VkVXJsczogW10gfSB9KSxcbiAgICBwcm92aWRlSHR0cENsaWVudCh3aXRoSW50ZXJjZXB0b3JzKFthdXRoSW50ZXJjZXB0b3JdKSksXG4gICAge1xuICAgICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxuICAgICAgdXNlRmFjdG9yeTogaW5pdGFsaXplQXV0aENvbmZpZyxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogT0F1dGhTdG9yYWdlLFxuICAgICAgdXNlRmFjdG9yeTogKCkgPT4gaW5qZWN0QXV0aENvbmZpZygpLnN0b3JhZ2UgPz8gaW5qZWN0KFdpbmRvd1JlZikubmF0aXZlV2luZG93LmxvY2FsU3RvcmFnZSxcbiAgICB9LFxuICBdKTtcbn1cbiJdfQ==
@@ -1,317 +0,0 @@
1
- import { HttpErrorResponse } from '@angular/common/http';
2
- import { Injectable, inject } from '@angular/core';
3
- import { Router } from '@angular/router';
4
- import { WindowRef } from '@odx/angular';
5
- import { OAuthErrorEvent, OAuthService } from 'angular-oauth2-oidc';
6
- import { deepmerge } from 'deepmerge-ts';
7
- import { BehaviorSubject, catchError, combineLatest, distinctUntilChanged, filter, fromEvent, map, merge, of, share, shareReplay, startWith, switchMap, take, tap, timeout, } from 'rxjs';
8
- import { injectAuthConfig } from './auth.config';
9
- import { setHttpAuthHeader } from './helpers';
10
- import { AuthPluginManager } from './models';
11
- import * as i0 from "@angular/core";
12
- /**
13
- * The `AuthService` class provides authentication functionality for an Angular application.
14
- * It handles OAuth2/OIDC authentication, token management, and user identity claims.
15
- *
16
- * Key responsibilities include:
17
- * - Initializing authentication with a provided configuration.
18
- * - Managing tokens (access, refresh, and ID tokens).
19
- * - Checking and emitting authentication and authorization states.
20
- * - Handling user login and logout flows.
21
- * - Supporting silent refresh and offline authentication scenarios.
22
- * - Integrating authentication plugins via `AuthPluginManager`.
23
- *
24
- * @example
25
- * ```typescript
26
- * // Injecting the AuthService
27
- * constructor(private authService: AuthService) {}
28
- *
29
- * // Using the AuthService to initialize authentication
30
- * async ngOnInit() {
31
- * const config: AuthConfig = { clientId: 'your-client-id', discoveryUrl: 'https://example.com/.well-known/openid-configuration' };
32
- * await this.authService.initialize(config);
33
- * }
34
- * ```
35
- */
36
- export class AuthService {
37
- /**
38
- * Emits whenever the `access_token` in local storage is updated or cleared.
39
- * Provides an observable for tracking token updates.
40
- *
41
- * @type {Observable<StorageEvent | null>}
42
- */
43
- get accessTokenUpdate$() {
44
- return this.onAccessTokenUpdate$;
45
- }
46
- constructor() {
47
- this.authConfig = injectAuthConfig();
48
- this.authPluginManager = inject(AuthPluginManager);
49
- this.oauthService = inject(OAuthService);
50
- this.router = inject(Router);
51
- this.windowRef = inject(WindowRef);
52
- this.isInitialized$$ = new BehaviorSubject(false);
53
- this.isRedirecting$$ = new BehaviorSubject(false);
54
- this.onAccessTokenUpdate$ = fromEvent(this.windowRef.nativeWindow, 'storage').pipe(filter(({ key }) => key === 'access_token' || key === null), startWith(null), share());
55
- this.silentRefreshHandler$ = this.isInitialized$$.pipe(filter(Boolean), switchMap(() => this.windowRef.isOnline$), tap((isOnline) => this.updateSilentRefresh(isOnline)));
56
- this.onAuthStateChange$ = combineLatest([this.oauthService.events.pipe(startWith(null)), this.windowRef.isOnline$, this.onAccessTokenUpdate$]);
57
- /**
58
- * Emits `true` when the service has completed initialization.
59
- * Emits `false` until the initialization is complete.
60
- *
61
- * @type {Observable<boolean>}
62
- */
63
- this.isInitialized$ = this.isInitialized$$.pipe(filter(Boolean), distinctUntilChanged());
64
- /**
65
- * Emits `true` when the user is being redirected to the login page.
66
- * Emits `false` when there is no redirection in progress.
67
- *
68
- * @type {Observable<boolean>}
69
- */
70
- this.isRedirecting$ = this.isRedirecting$$.pipe(distinctUntilChanged(), shareReplay({ bufferSize: 1, refCount: true }));
71
- /**
72
- * Emits `true` when the application is in a loading state (e.g., during redirection or plugin initialization).
73
- * Emits `false` when there is no ongoing loading activity.
74
- *
75
- * @type {Observable<boolean>}
76
- */
77
- this.isLoading$ = merge(this.isRedirecting$, this.authPluginManager.pluginsLoading$).pipe(distinctUntilChanged());
78
- /**
79
- * Emits `true` when the user is authenticated.
80
- * Emits `false` when the user is not authenticated.
81
- *
82
- * @type {Observable<boolean>}
83
- */
84
- this.isAuthenticated$ = this.isInitialized$.pipe(switchMap(() => this.authPluginManager.pluginsReady$), switchMap(() => this.onAuthStateChange$), map(() => this.isAuthenticated()), distinctUntilChanged(), shareReplay({ bufferSize: 1, refCount: true }));
85
- /**
86
- * Emits the identity claims of the authenticated user.
87
- * If the user is not authenticated, emits `null`.
88
- *
89
- * @type {Observable<OdxAuth.IdentityClaims | null>}
90
- */
91
- this.identityClaims$ = this.isAuthenticated$.pipe(map(() => this.getIdentityClaims()), shareReplay({ bufferSize: 1, refCount: true }));
92
- /**
93
- * Emits OAuth error events.
94
- *
95
- * @type {Observable<OAuthErrorEvent>}
96
- */
97
- this.errors$ = this.oauthService.events.pipe(filter((event) => event instanceof OAuthErrorEvent), share());
98
- /**
99
- * Emits events when an OAuth token is successfully received.
100
- *
101
- * @type {Observable<Event>}
102
- */
103
- this.onTokenReceived$ = this.oauthService.events.pipe(filter((event) => event.type === 'token_received'), share());
104
- this.runPlugins();
105
- this.silentRefreshHandler$.subscribe();
106
- }
107
- /**
108
- * Initializes the authentication service with the provided configuration.
109
- *
110
- * @param {AuthConfig} config - The authentication configuration object.
111
- * @returns {Promise<void>} Resolves when initialization is complete.
112
- */
113
- async initialize(config) {
114
- this.assertAudience(config.clientId);
115
- this.oauthService.configure({ ...config, openUri: this.redirectToLogin.bind(this) });
116
- try {
117
- await this.oauthService.loadDiscoveryDocument(this.authConfig.discoveryUrl);
118
- await this.oauthService.tryLogin();
119
- if (this.authConfig.refreshTokenOnInit) {
120
- await this.tryRefreshToken();
121
- }
122
- }
123
- catch (error) {
124
- if (!(error instanceof HttpErrorResponse || error instanceof OAuthErrorEvent)) {
125
- throw error;
126
- }
127
- if (error.type === 'token_refresh_error' || (error instanceof HttpErrorResponse && (error.status === 401 || error.status === 400))) {
128
- this.signOut(true);
129
- this.signIn(this.windowRef.location.pathname);
130
- }
131
- }
132
- this.isInitialized$$.next(true);
133
- if (this.authConfig.requireSignIn && !this.isAuthenticated()) {
134
- this.signIn(this.windowRef.location.pathname);
135
- }
136
- await this.tryLoadUserProfile();
137
- await this.routeToRequestedUrl();
138
- }
139
- /**
140
- * Runs all authentication plugins registered in the `AuthPluginManager`.
141
- */
142
- runPlugins() {
143
- this.authPluginManager.runPlugins(this).subscribe();
144
- }
145
- /**
146
- * Returns the issuer URL for the OAuth server.
147
- *
148
- * @returns {URL} The issuer URL.
149
- */
150
- getIssuer() {
151
- return new URL(this.oauthService.issuer);
152
- }
153
- /**
154
- * Initiates the login flow for the user. Redirects to the login page.
155
- *
156
- * @param {string} [url] - The URL to redirect back to after login.
157
- */
158
- signIn(url) {
159
- this.oauthService.initLoginFlow(url);
160
- }
161
- /**
162
- * Logs the user out and clears their tokens.
163
- *
164
- * @param {boolean} [noRedirect] - If `true`, no redirection occurs after logout.
165
- */
166
- signOut(noRedirect) {
167
- this.oauthService.revokeTokenAndLogout(noRedirect || !this.getAccessToken());
168
- }
169
- /**
170
- * Attempts to refresh the user's tokens.
171
- *
172
- * @returns {Promise<TokenResponse>} Resolves with the new token response.
173
- */
174
- async refreshTokens() {
175
- return this.oauthService.refreshToken();
176
- }
177
- /**
178
- * Retrieves the current access token, if available.
179
- *
180
- * @returns {string | null} The access token, or `null` if not available.
181
- */
182
- getAccessToken() {
183
- return this.oauthService.getAccessToken() ?? null;
184
- }
185
- /**
186
- * Retrieves the current refresh token, if available.
187
- *
188
- * @returns {string | null} The refresh token, or `null` if not available.
189
- */
190
- getRefreshToken() {
191
- return this.oauthService.getRefreshToken() ?? null;
192
- }
193
- /**
194
- * Retrieves the current ID token, if available.
195
- *
196
- * @returns {string | null} The ID token, or `null` if not available.
197
- */
198
- getIdToken() {
199
- return this.oauthService.getIdToken() ?? null;
200
- }
201
- /**
202
- * Retrieves the identity claims of the authenticated user.
203
- *
204
- * @returns {OdxAuth.IdentityClaims | null} The identity claims, or `null` if not available.
205
- */
206
- getIdentityClaims() {
207
- if (!this.getIdToken())
208
- return null;
209
- return deepmerge(this.oauthService.getIdentityClaims(), this.authPluginManager.getResult());
210
- }
211
- /**
212
- * Retrieves the raw identity claims of the authenticated user.
213
- *
214
- * @returns {OdxAuth.RawIdentityClaims | null} The raw identity claims, or `null` if not available.
215
- */
216
- getRawIdentityClaims() {
217
- if (!this.getIdToken())
218
- return null;
219
- return this.oauthService.getIdentityClaims();
220
- }
221
- /**
222
- * Checks if the user is currently authenticated.
223
- *
224
- * @returns {boolean} `true` if authenticated, otherwise `false`.
225
- */
226
- isAuthenticated() {
227
- if (this.windowRef.isOnline()) {
228
- return this.oauthService.hasValidAccessToken() && this.oauthService.hasValidIdToken();
229
- }
230
- return this.hasValidOfflineToken();
231
- }
232
- /**
233
- * Checks if the user is authorized based on the provided handler.
234
- *
235
- * @param {AuthorizedHandler | null} [authorizedHandler] - A handler to determine authorization.
236
- * @returns {boolean} `true` if authorized, otherwise `false`.
237
- */
238
- isAuthorized(authorizedHandler) {
239
- const handler = authorizedHandler ?? this.authConfig.defaultAuthorizedHandler;
240
- return this.isAuthenticated() && (handler?.(this.getIdentityClaims(), this, this.router) ?? true);
241
- }
242
- /**
243
- * Emits whether the user is authorized based on the provided handler.
244
- *
245
- * @param {AuthorizedHandler | null} [authorizedHandler] - A handler to determine authorization.
246
- * @returns {Observable<boolean>} An observable emitting the authorization status.
247
- */
248
- isAuthorized$(authorizedHandler) {
249
- return this.isAuthenticated$.pipe(map(() => this.isAuthorized(authorizedHandler)));
250
- }
251
- /**
252
- * Prepares an HTTP request by adding the access token to its headers.
253
- *
254
- * @param {HttpRequest<T> | Request} req - The HTTP request to prepare.
255
- * @param {boolean} requireSignIn - Whether to require the user to sign in if no token is available.
256
- * @returns {Observable<R>} An observable emitting the prepared request.
257
- * @template R, T
258
- */
259
- prepareAuthRequest$(req, requireSignIn = false) {
260
- return this.waitForAccessToken$(requireSignIn).pipe(map((token) => setHttpAuthHeader(req, token)));
261
- }
262
- /**
263
- * Waits for a valid access token to become available.
264
- *
265
- * @param {boolean} requireSignIn - Whether to require the user to sign in if no token is available.
266
- * @returns {Observable<string | null>} An observable emitting the access token.
267
- */
268
- waitForAccessToken$(requireSignIn) {
269
- const accessToken$ = of(this.getAccessToken()).pipe(filter((token) => !!token && this.isAuthenticated()));
270
- const waitForAccessToken$ = this.onTokenReceived$.pipe(timeout(this.authConfig.waitForTokenInMs ?? 0), catchError(async () => this.tryRefreshToken().catch(() => null)));
271
- return this.isInitialized$.pipe(switchMap(() => merge(accessToken$, waitForAccessToken$)), take(1), map(() => this.getAccessToken()), tap((token) => !token && requireSignIn && this.signIn(this.windowRef.location.pathname)));
272
- }
273
- async routeToRequestedUrl() {
274
- if (!this.oauthService.state || !this.oauthService.hasValidAccessToken())
275
- return;
276
- await this.router.navigateByUrl(decodeURIComponent(this.oauthService.state));
277
- }
278
- hasValidOfflineToken() {
279
- const issuedAt = this.getIdentityClaims()?.iat ?? 0;
280
- return Date.now() - issuedAt * 1000 <= this.authConfig.maxOfflineTime * 1000;
281
- }
282
- redirectToLogin(uri) {
283
- this.windowRef.location.assign(uri);
284
- this.isRedirecting$$.next(true);
285
- }
286
- async tryLoadUserProfile() {
287
- if (!this.authConfig.loadUserProfile || !this.isAuthenticated())
288
- return;
289
- await this.oauthService.loadUserProfile().catch(() => null);
290
- }
291
- async tryRefreshToken() {
292
- if (!this.getRefreshToken())
293
- return;
294
- await this.oauthService.refreshToken();
295
- }
296
- assertAudience(clientId) {
297
- const tokenClientId = this.getIdentityClaims()?.aud;
298
- if (!clientId || !tokenClientId || clientId === tokenClientId)
299
- return;
300
- this.signOut(true);
301
- }
302
- updateSilentRefresh(enabled) {
303
- if (enabled) {
304
- this.oauthService.setupAutomaticSilentRefresh();
305
- }
306
- else {
307
- this.oauthService.stopAutomaticRefresh();
308
- }
309
- }
310
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AuthService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
311
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AuthService, providedIn: 'root' }); }
312
- }
313
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AuthService, decorators: [{
314
- type: Injectable,
315
- args: [{ providedIn: 'root' }]
316
- }], ctorParameters: () => [] });
317
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9hdXRoL3NyYy9saWIvYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBZSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBYyxlQUFlLEVBQUUsWUFBWSxFQUFpQixNQUFNLHFCQUFxQixDQUFDO0FBQy9GLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUNMLGVBQWUsRUFFZixVQUFVLEVBQ1YsYUFBYSxFQUNiLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sU0FBUyxFQUNULEdBQUcsRUFDSCxLQUFLLEVBQ0wsRUFBRSxFQUNGLEtBQUssRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUNULFNBQVMsRUFDVCxJQUFJLEVBQ0osR0FBRyxFQUNILE9BQU8sR0FDUixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDOUMsT0FBTyxFQUFFLGlCQUFpQixFQUFxQixNQUFNLFVBQVUsQ0FBQzs7QUFFaEU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBRUgsTUFBTSxPQUFPLFdBQVc7SUEwRnRCOzs7OztPQUtHO0lBQ0gsSUFBVyxrQkFBa0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDbkMsQ0FBQztJQUVEO1FBbkdpQixlQUFVLEdBQUcsZ0JBQWdCLEVB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RCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUMzQyxDQUFDO0lBQ0gsQ0FBQzsrR0E1VVUsV0FBVzttSEFBWCxXQUFXLGNBREUsTUFBTTs7NEZBQ25CLFdBQVc7a0JBRHZCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBSZXF1ZXN0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgV2luZG93UmVmIH0gZnJvbSAnQG9keC9hbmd1bGFyJztcbmltcG9ydCB7IEF1dGhDb25maWcsIE9BdXRoRXJyb3JFdmVudCwgT0F1dGhTZXJ2aWNlLCBUb2tlblJlc3BvbnNlIH0gZnJvbSAnYW5ndWxhci1vYXV0aDItb2lkYyc7XG5pbXBvcnQgeyBkZWVwbWVyZ2UgfSBmcm9tICdkZWVwbWVyZ2UtdHMnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBPYnNlcnZhYmxlLFxuICBjYXRjaEVycm9yLFxuICBjb21iaW5lTGF0ZXN0LFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBmcm9tRXZlbnQsXG4gIG1hcCxcbiAgbWVyZ2UsXG4gIG9mLFxuICBzaGFyZSxcbiAgc2hhcmVSZXBsYXksXG4gIHN0YXJ0V2l0aCxcbiAgc3dpdGNoTWFwLFxuICB0YWtlLFxuICB0YXAsXG4gIHRpbWVvdXQsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgaW5qZWN0QXV0aENvbmZpZyB9IGZyb20gJy4vYXV0aC5jb25maWcnO1xuaW1wb3J0IHsgc2V0SHR0cEF1dGhIZWFkZXIgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgQXV0aFBsdWdpbk1hbmFnZXIsIEF1dGhvcml6ZWRIYW5kbGVyIH0gZnJvbSAnLi9tb2RlbHMnO1xuXG4vKipcbiAqIFRoZSBgQXV0aFNlcnZpY2VgIGNsYXNzIHByb3ZpZGVzIGF1dGhlbnRpY2F0aW9uIGZ1bmN0aW9uYWxpdHkgZm9yIGFuIEFuZ3VsYXIgYXBwbGljYXRpb24uXG4gKiBJdCBoYW5kbGVzIE9BdXRoMi9PSURDIGF1dGhlbnRpY2F0aW9uLCB0b2tlbiBtYW5hZ2VtZW50LCBhbmQgdXNlciBpZGVudGl0eSBjbGFpbXMuXG4gKlxuICogS2V5IHJlc3BvbnNpYmlsaXRpZXMgaW5jbHVkZTpcbiAqIC0gSW5pdGlhbGl6aW5nIGF1dGhlbnRpY2F0aW9uIHdpdGggYSBwcm92aWRlZCBjb25maWd1cmF0aW9uLlxuICogLSBNYW5hZ2luZyB0b2tlbnMgKGFjY2VzcywgcmVmcmVzaCwgYW5kIElEIHRva2VucykuXG4gKiAtIENoZWNraW5nIGFuZCBlbWl0dGluZyBhdXRoZW50aWNhdGlvbiBhbmQgYXV0aG9yaXphdGlvbiBzdGF0ZXMuXG4gKiAtIEhhbmRsaW5nIHVzZXIgbG9naW4gYW5kIGxvZ291dCBmbG93cy5cbiAqIC0gU3VwcG9ydGluZyBzaWxlbnQgcmVmcmVzaCBhbmQgb2ZmbGluZSBhdXRoZW50aWNhdGlvbiBzY2VuYXJpb3MuXG4gKiAtIEludGVncmF0aW5nIGF1dGhlbnRpY2F0aW9uIHBsdWdpbnMgdmlhIGBBdXRoUGx1Z2luTWFuYWdlcmAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEluamVjdGluZyB0aGUgQXV0aFNlcnZpY2VcbiAqIGNvbnN0cnVjdG9yKHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlKSB7fVxuICpcbiAqIC8vIFVzaW5nIHRoZSBBdXRoU2VydmljZSB0byBpbml0aWFsaXplIGF1dGhlbnRpY2F0aW9uXG4gKiBhc3luYyBuZ09uSW5pdCgpIHtcbiAqICAgY29uc3QgY29uZmlnOiBBdXRoQ29uZmlnID0geyBjbGllbnRJZDogJ3lvdXItY2xpZW50LWlkJywgZGlzY292ZXJ5VXJsOiAnaHR0cHM6Ly9leGFtcGxlLmNvbS8ud2VsbC1rbm93bi9vcGVuaWQtY29uZmlndXJhdGlvbicgfTtcbiAqICAgYXdhaXQgdGhpcy5hdXRoU2VydmljZS5pbml0aWFsaXplKGNvbmZpZyk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBBdXRoU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0aENvbmZpZyA9IGluamVjdEF1dGhDb25maWcoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRoUGx1Z2luTWFuYWdlciA9IGluamVjdChBdXRoUGx1Z2luTWFuYWdlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2F1dGhTZXJ2aWNlID0gaW5qZWN0KE9BdXRoU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgd2luZG93UmVmID0gaW5qZWN0KFdpbmRvd1JlZik7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpc0luaXRpYWxpemVkJCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpc1JlZGlyZWN0aW5nJCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkFjY2Vzc1Rva2VuVXBkYXRlJCA9IGZyb21FdmVudDxTdG9yYWdlRXZlbnQ+KHRoaXMud2luZG93UmVmLm5hdGl2ZVdpbmRvdywgJ3N0b3JhZ2UnKS5waXBlKFxuICAgIGZpbHRlcigoeyBrZXkgfSkgPT4ga2V5ID09PSAnYWNjZXNzX3Rva2VuJyB8fCBrZXkgPT09IG51bGwpLFxuICAgIHN0YXJ0V2l0aChudWxsKSxcbiAgICBzaGFyZSgpLFxuICApO1xuICBwcml2YXRlIHJlYWRvbmx5IHNpbGVudFJlZnJlc2hIYW5kbGVyJCA9IHRoaXMuaXNJbml0aWFsaXplZCQkLnBpcGUoXG4gICAgZmlsdGVyKEJvb2xlYW4pLFxuICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLndpbmRvd1JlZi5pc09ubGluZSQpLFxuICAgIHRhcCgoaXNPbmxpbmUpID0+IHRoaXMudXBkYXRlU2lsZW50UmVmcmVzaChpc09ubGluZSkpLFxuICApO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uQXV0aFN0YXRlQ2hhbmdlJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMub2F1dGhTZXJ2aWNlLmV2ZW50cy5waXBlKHN0YXJ0V2l0aChudWxsKSksIHRoaXMud2luZG93UmVmLmlzT25saW5lJCwgdGhpcy5vbkFjY2Vzc1Rva2VuVXBkYXRlJF0pO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBgdHJ1ZWAgd2hlbiB0aGUgc2VydmljZSBoYXMgY29tcGxldGVkIGluaXRpYWxpemF0aW9uLlxuICAgKiBFbWl0cyBgZmFsc2VgIHVudGlsIHRoZSBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS5cbiAgICpcbiAgICogQHR5cGUge09ic2VydmFibGU8Ym9vbGVhbj59XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNJbml0aWFsaXplZCQgPSB0aGlzLmlzSW5pdGlhbGl6ZWQkJC5waXBlKGZpbHRlcihCb29sZWFuKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGB0cnVlYCB3aGVuIHRoZSB1c2VyIGlzIGJlaW5nIHJlZGlyZWN0ZWQgdG8gdGhlIGxvZ2luIHBhZ2UuXG4gICAqIEVtaXRzIGBmYWxzZWAgd2hlbiB0aGVyZSBpcyBubyByZWRpcmVjdGlvbiBpbiBwcm9ncmVzcy5cbiAgICpcbiAgICogQHR5cGUge09ic2VydmFibGU8Ym9vbGVhbj59XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNSZWRpcmVjdGluZyQgPSB0aGlzLmlzUmVkaXJlY3RpbmckJC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSkpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBgdHJ1ZWAgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgaW4gYSBsb2FkaW5nIHN0YXRlIChlLmcuLCBkdXJpbmcgcmVkaXJlY3Rpb24gb3IgcGx1Z2luIGluaXRpYWxpemF0aW9uKS5cbiAgICogRW1pdHMgYGZhbHNlYCB3aGVuIHRoZXJlIGlzIG5vIG9uZ29pbmcgbG9hZGluZyBhY3Rpdml0eS5cbiAgICpcbiAgICogQHR5cGUge09ic2VydmFibGU8Ym9vbGVhbj59XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNMb2FkaW5nJCA9IG1lcmdlKHRoaXMuaXNSZWRpcmVjdGluZyQsIHRoaXMuYXV0aFBsdWdpbk1hbmFnZXIucGx1Z2luc0xvYWRpbmckKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBgdHJ1ZWAgd2hlbiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkLlxuICAgKiBFbWl0cyBgZmFsc2VgIHdoZW4gdGhlIHVzZXIgaXMgbm90IGF1dGhlbnRpY2F0ZWQuXG4gICAqXG4gICAqIEB0eXBlIHtPYnNlcnZhYmxlPGJvb2xlYW4+fVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlzQXV0aGVudGljYXRlZCQgPSB0aGlzLmlzSW5pdGlhbGl6ZWQkLnBpcGUoXG4gICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuYXV0aFBsdWdpbk1hbmFnZXIucGx1Z2luc1JlYWR5JCksXG4gICAgc3dpdGNoTWFwKCgpID0+IHRoaXMub25BdXRoU3RhdGVDaGFuZ2UkKSxcbiAgICBtYXAoKCkgPT4gdGhpcy5pc0F1dGhlbnRpY2F0ZWQoKSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pLFxuICApO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgaWRlbnRpdHkgY2xhaW1zIG9mIHRoZSBhdXRoZW50aWNhdGVkIHVzZXIuXG4gICAqIElmIHRoZSB1c2VyIGlzIG5vdCBhdXRoZW50aWNhdGVkLCBlbWl0cyBgbnVsbGAuXG4gICAqXG4gICAqIEB0eXBlIHtPYnNlcnZhYmxlPE9keEF1dGguSWRlbnRpdHlDbGFpbXMgfCBudWxsPn1cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGVudGl0eUNsYWltcyQgPSB0aGlzLmlzQXV0aGVudGljYXRlZCQucGlwZShcbiAgICBtYXAoKCkgPT4gdGhpcy5nZXRJZGVudGl0eUNsYWltcygpKSxcbiAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pLFxuICApO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBPQXV0aCBlcnJvciBldmVudHMuXG4gICAqXG4gICAqIEB0eXBlIHtPYnNlcnZhYmxlPE9BdXRoRXJyb3JFdmVudD59XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXJyb3JzJCA9IHRoaXMub2F1dGhTZXJ2aWNlLmV2ZW50cy5waXBlKFxuICAgIGZpbHRlcigoZXZlbnQpOiBldmVudCBpcyBPQXV0aEVycm9yRXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBPQXV0aEVycm9yRXZlbnQpLFxuICAgIHNoYXJlKCksXG4gICk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGV2ZW50cyB3aGVuIGFuIE9BdXRoIHRva2VuIGlzIHN1Y2Nlc3NmdWxseSByZWNlaXZlZC5cbiAgICpcbiAgICogQHR5cGUge09ic2VydmFibGU8RXZlbnQ+fVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9uVG9rZW5SZWNlaXZlZCQgPSB0aGlzLm9hdXRoU2VydmljZS5ldmVudHMucGlwZShcbiAgICBmaWx0ZXIoKGV2ZW50KSA9PiBldmVudC50eXBlID09PSAndG9rZW5fcmVjZWl2ZWQnKSxcbiAgICBzaGFyZSgpLFxuICApO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuZXZlciB0aGUgYGFjY2Vzc190b2tlbmAgaW4gbG9jYWwgc3RvcmFnZSBpcyB1cGRhdGVkIG9yIGNsZWFyZWQuXG4gICAqIFByb3ZpZGVzIGFuIG9ic2VydmFibGUgZm9yIHRyYWNraW5nIHRva2VuIHVwZGF0ZXMuXG4gICAqXG4gICAqIEB0eXBlIHtPYnNlcnZhYmxlPFN0b3JhZ2VFdmVudCB8IG51bGw+fVxuICAgKi9cbiAgcHVibGljIGdldCBhY2Nlc3NUb2tlblVwZGF0ZSQoKTogT2JzZXJ2YWJsZTxTdG9yYWdlRXZlbnQgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMub25BY2Nlc3NUb2tlblVwZGF0ZSQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnJ1blBsdWdpbnMoKTtcbiAgICB0aGlzLnNpbGVudFJlZnJlc2hIYW5kbGVyJC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgYXV0aGVudGljYXRpb24gc2VydmljZSB3aXRoIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0F1dGhDb25maWd9IGNvbmZpZyAtIFRoZSBhdXRoZW50aWNhdGlvbiBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHdoZW4gaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW5pdGlhbGl6ZShjb25maWc6IEF1dGhDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFzc2VydEF1ZGllbmNlKGNvbmZpZy5jbGllbnRJZCk7XG4gICAgdGhpcy5vYXV0aFNlcnZpY2UuY29uZmlndXJlKHsgLi4uY29uZmlnLCBvcGVuVXJpOiB0aGlzLnJlZGlyZWN0VG9Mb2dpbi5iaW5kKHRoaXMpIH0pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLm9hdXRoU2VydmljZS5sb2FkRGlzY292ZXJ5RG9jdW1lbnQodGhpcy5hdXRoQ29uZmlnLmRpc2NvdmVyeVVybCk7XG4gICAgICBhd2FpdCB0aGlzLm9hdXRoU2VydmljZS50cnlMb2dpbigpO1xuICAgICAgaWYgKHRoaXMuYXV0aENvbmZpZy5yZWZyZXNoVG9rZW5PbkluaXQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy50cnlSZWZyZXNoVG9rZW4oKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSB8fCBlcnJvciBpbnN0YW5jZW9mIE9BdXRoRXJyb3JFdmVudCkpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3IudHlwZSA9PT0gJ3Rva2VuX3JlZnJlc2hfZXJyb3InIHx8IChlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlICYmIChlcnJvci5zdGF0dXMgPT09IDQwMSB8fCBlcnJvci5zdGF0dXMgPT09IDQwMCkpKSB7XG4gICAgICAgIHRoaXMuc2lnbk91dCh0cnVlKTtcbiAgICAgICAgdGhpcy5zaWduSW4odGhpcy53aW5kb3dSZWYubG9jYXRpb24ucGF0aG5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQkJC5uZXh0KHRydWUpO1xuICAgIGlmICh0aGlzLmF1dGhDb25maWcucmVxdWlyZVNpZ25JbiAmJiAhdGhpcy5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgdGhpcy5zaWduSW4odGhpcy53aW5kb3dSZWYubG9jYXRpb24ucGF0aG5hbWUpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnRyeUxvYWRVc2VyUHJvZmlsZSgpO1xuICAgIGF3YWl0IHRoaXMucm91dGVUb1JlcXVlc3RlZFVybCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWxsIGF1dGhlbnRpY2F0aW9uIHBsdWdpbnMgcmVnaXN0ZXJlZCBpbiB0aGUgYEF1dGhQbHVnaW5NYW5hZ2VyYC5cbiAgICovXG4gIHB1YmxpYyBydW5QbHVnaW5zKCk6IHZvaWQge1xuICAgIHRoaXMuYXV0aFBsdWdpbk1hbmFnZXIucnVuUGx1Z2lucyh0aGlzKS5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpc3N1ZXIgVVJMIGZvciB0aGUgT0F1dGggc2VydmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7VVJMfSBUaGUgaXNzdWVyIFVSTC5cbiAgICovXG4gIHB1YmxpYyBnZXRJc3N1ZXIoKTogVVJMIHtcbiAgICByZXR1cm4gbmV3IFVSTCh0aGlzLm9hdXRoU2VydmljZS5pc3N1ZXIhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZXMgdGhlIGxvZ2luIGZsb3cgZm9yIHRoZSB1c2VyLiBSZWRpcmVjdHMgdG8gdGhlIGxvZ2luIHBhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBVUkwgdG8gcmVkaXJlY3QgYmFjayB0byBhZnRlciBsb2dpbi5cbiAgICovXG4gIHB1YmxpYyBzaWduSW4odXJsPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5vYXV0aFNlcnZpY2UuaW5pdExvZ2luRmxvdyh1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgdGhlIHVzZXIgb3V0IGFuZCBjbGVhcnMgdGhlaXIgdG9rZW5zLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtub1JlZGlyZWN0XSAtIElmIGB0cnVlYCwgbm8gcmVkaXJlY3Rpb24gb2NjdXJzIGFmdGVyIGxvZ291dC5cbiAgICovXG4gIHB1YmxpYyBzaWduT3V0KG5vUmVkaXJlY3Q/OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5vYXV0aFNlcnZpY2UucmV2b2tlVG9rZW5BbmRMb2dvdXQobm9SZWRpcmVjdCB8fCAhdGhpcy5nZXRBY2Nlc3NUb2tlbigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byByZWZyZXNoIHRoZSB1c2VyJ3MgdG9rZW5zLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUb2tlblJlc3BvbnNlPn0gUmVzb2x2ZXMgd2l0aCB0aGUgbmV3IHRva2VuIHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZnJlc2hUb2tlbnMoKTogUHJvbWlzZTxUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLnJlZnJlc2hUb2tlbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBhY2Nlc3MgdG9rZW4sIGlmIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IFRoZSBhY2Nlc3MgdG9rZW4sIG9yIGBudWxsYCBpZiBub3QgYXZhaWxhYmxlLlxuICAgKi9cbiAgcHVibGljIGdldEFjY2Vzc1Rva2VuKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5nZXRBY2Nlc3NUb2tlbigpID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IHJlZnJlc2ggdG9rZW4sIGlmIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IFRoZSByZWZyZXNoIHRva2VuLCBvciBgbnVsbGAgaWYgbm90IGF2YWlsYWJsZS5cbiAgICovXG4gIHB1YmxpYyBnZXRSZWZyZXNoVG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLmdldFJlZnJlc2hUb2tlbigpID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IElEIHRva2VuLCBpZiBhdmFpbGFibGUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfSBUaGUgSUQgdG9rZW4sIG9yIGBudWxsYCBpZiBub3QgYXZhaWxhYmxlLlxuICAgKi9cbiAgcHVibGljIGdldElkVG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLmdldElkVG9rZW4oKSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgaWRlbnRpdHkgY2xhaW1zIG9mIHRoZSBhdXRoZW50aWNhdGVkIHVzZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPZHhBdXRoLklkZW50aXR5Q2xhaW1zIHwgbnVsbH0gVGhlIGlkZW50aXR5IGNsYWltcywgb3IgYG51bGxgIGlmIG5vdCBhdmFpbGFibGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0SWRlbnRpdHlDbGFpbXMoKTogT2R4QXV0aC5JZGVudGl0eUNsYWltcyB8IG51bGwge1xuICAgIGlmICghdGhpcy5nZXRJZFRva2VuKCkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBkZWVwbWVyZ2UodGhpcy5vYXV0aFNlcnZpY2UuZ2V0SWRlbnRpdHlDbGFpbXMoKSwgdGhpcy5hdXRoUGx1Z2luTWFuYWdlci5nZXRSZXN1bHQoKSkgYXMgT2R4QXV0aC5JZGVudGl0eUNsYWltcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHJhdyBpZGVudGl0eSBjbGFpbXMgb2YgdGhlIGF1dGhlbnRpY2F0ZWQgdXNlci5cbiAgICpcbiAgICogQHJldHVybnMge09keEF1dGguUmF3SWRlbnRpdHlDbGFpbXMgfCBudWxsfSBUaGUgcmF3IGlkZW50aXR5IGNsYWltcywgb3IgYG51bGxgIGlmIG5vdCBhdmFpbGFibGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0UmF3SWRlbnRpdHlDbGFpbXMoKTogT2R4QXV0aC5SYXdJZGVudGl0eUNsYWltcyB8IG51bGwge1xuICAgIGlmICghdGhpcy5nZXRJZFRva2VuKCkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5nZXRJZGVudGl0eUNsYWltcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgdXNlciBpcyBjdXJyZW50bHkgYXV0aGVudGljYXRlZC5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBhdXRoZW50aWNhdGVkLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICovXG4gIHB1YmxpYyBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMud2luZG93UmVmLmlzT25saW5lKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5oYXNWYWxpZEFjY2Vzc1Rva2VuKCkgJiYgdGhpcy5vYXV0aFNlcnZpY2UuaGFzVmFsaWRJZFRva2VuKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmhhc1ZhbGlkT2ZmbGluZVRva2VuKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSB1c2VyIGlzIGF1dGhvcml6ZWQgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7QXV0aG9yaXplZEhhbmRsZXIgfCBudWxsfSBbYXV0aG9yaXplZEhhbmRsZXJdIC0gQSBoYW5kbGVyIHRvIGRldGVybWluZSBhdXRob3JpemF0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGF1dGhvcml6ZWQsIG90aGVyd2lzZSBgZmFsc2VgLlxuICAgKi9cbiAgcHVibGljIGlzQXV0aG9yaXplZChhdXRob3JpemVkSGFuZGxlcj86IEF1dGhvcml6ZWRIYW5kbGVyIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSBhdXRob3JpemVkSGFuZGxlciA/PyB0aGlzLmF1dGhDb25maWcuZGVmYXVsdEF1dGhvcml6ZWRIYW5kbGVyO1xuXG4gICAgcmV0dXJuIHRoaXMuaXNBdXRoZW50aWNhdGVkKCkgJiYgKGhhbmRsZXI/Lih0aGlzLmdldElkZW50aXR5Q2xhaW1zKCksIHRoaXMsIHRoaXMucm91dGVyKSA/PyB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGV0aGVyIHRoZSB1c2VyIGlzIGF1dGhvcml6ZWQgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7QXV0aG9yaXplZEhhbmRsZXIgfCBudWxsfSBbYXV0aG9yaXplZEhhbmRsZXJdIC0gQSBoYW5kbGVyIHRvIGRldGVybWluZSBhdXRob3JpemF0aW9uLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxib29sZWFuPn0gQW4gb2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgYXV0aG9yaXphdGlvbiBzdGF0dXMuXG4gICAqL1xuICBwdWJsaWMgaXNBdXRob3JpemVkJChhdXRob3JpemVkSGFuZGxlcj86IEF1dGhvcml6ZWRIYW5kbGVyIHwgbnVsbCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmlzQXV0aGVudGljYXRlZCQucGlwZShtYXAoKCkgPT4gdGhpcy5pc0F1dGhvcml6ZWQoYXV0aG9yaXplZEhhbmRsZXIpKSk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYW4gSFRUUCByZXF1ZXN0IGJ5IGFkZGluZyB0aGUgYWNjZXNzIHRva2VuIHRvIGl0cyBoZWFkZXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge0h0dHBSZXF1ZXN0PFQ+IHwgUmVxdWVzdH0gcmVxIC0gVGhlIEhUVFAgcmVxdWVzdCB0byBwcmVwYXJlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlcXVpcmVTaWduSW4gLSBXaGV0aGVyIHRvIHJlcXVpcmUgdGhlIHVzZXIgdG8gc2lnbiBpbiBpZiBubyB0b2tlbiBpcyBhdmFpbGFibGUuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFI+fSBBbiBvYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSBwcmVwYXJlZCByZXF1ZXN0LlxuICAgKiBAdGVtcGxhdGUgUiwgVFxuICAgKi9cbiAgcHVibGljIHByZXBhcmVBdXRoUmVxdWVzdCQ8UiBleHRlbmRzIEh0dHBSZXF1ZXN0PFQ+IHwgUmVxdWVzdCwgVD4ocmVxOiBSLCByZXF1aXJlU2lnbkluID0gZmFsc2UpOiBPYnNlcnZhYmxlPFI+IHtcbiAgICByZXR1cm4gdGhpcy53YWl0Rm9yQWNjZXNzVG9rZW4kKHJlcXVpcmVTaWduSW4pLnBpcGUobWFwKCh0b2tlbikgPT4gc2V0SHR0cEF1dGhIZWFkZXIocmVxLCB0b2tlbikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgYSB2YWxpZCBhY2Nlc3MgdG9rZW4gdG8gYmVjb21lIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSByZXF1aXJlU2lnbkluIC0gV2hldGhlciB0byByZXF1aXJlIHRoZSB1c2VyIHRvIHNpZ24gaW4gaWYgbm8gdG9rZW4gaXMgYXZhaWxhYmxlLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPn0gQW4gb2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgYWNjZXNzIHRva2VuLlxuICAgKi9cbiAgcHVibGljIHdhaXRGb3JBY2Nlc3NUb2tlbiQocmVxdWlyZVNpZ25JbjogYm9vbGVhbik6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IGFjY2Vzc1Rva2VuJCA9IG9mKHRoaXMuZ2V0QWNjZXNzVG9rZW4oKSkucGlwZShmaWx0ZXIoKHRva2VuKSA9PiAhIXRva2VuICYmIHRoaXMuaXNBdXRoZW50aWNhdGVkKCkpKTtcbiAgICBjb25zdCB3YWl0Rm9yQWNjZXNzVG9rZW4kID0gdGhpcy5vblRva2VuUmVjZWl2ZWQkLnBpcGUoXG4gICAgICB0aW1lb3V0KHRoaXMuYXV0aENvbmZpZy53YWl0Rm9yVG9rZW5Jbk1zID8/IDApLFxuICAgICAgY2F0Y2hFcnJvcihhc3luYyAoKSA9PiB0aGlzLnRyeVJlZnJlc2hUb2tlbigpLmNhdGNoKCgpID0+IG51bGwpKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuaXNJbml0aWFsaXplZCQucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiBtZXJnZShhY2Nlc3NUb2tlbiQsIHdhaXRGb3JBY2Nlc3NUb2tlbiQpKSxcbiAgICAgIHRha2UoMSksXG4gICAgICBtYXAoKCkgPT4gdGhpcy5nZXRBY2Nlc3NUb2tlbigpKSxcbiAgICAgIHRhcCgodG9rZW4pID0+ICF0b2tlbiAmJiByZXF1aXJlU2lnbkluICYmIHRoaXMuc2lnbkluKHRoaXMud2luZG93UmVmLmxvY2F0aW9uLnBhdGhuYW1lKSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcm91dGVUb1JlcXVlc3RlZFVybCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMub2F1dGhTZXJ2aWNlLnN0YXRlIHx8ICF0aGlzLm9hdXRoU2VydmljZS5oYXNWYWxpZEFjY2Vzc1Rva2VuKCkpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKGRlY29kZVVSSUNvbXBvbmVudCh0aGlzLm9hdXRoU2VydmljZS5zdGF0ZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNWYWxpZE9mZmxpbmVUb2tlbigpOiBib29sZWFuIHtcbiAgICBjb25zdCBpc3N1ZWRBdCA9IHRoaXMuZ2V0SWRlbnRpdHlDbGFpbXMoKT8uaWF0ID8/IDA7XG5cbiAgICByZXR1cm4gRGF0ZS5ub3coKSAtIGlzc3VlZEF0ICogMTAwMCA8PSB0aGlzLmF1dGhDb25maWcubWF4T2ZmbGluZVRpbWUgKiAxMDAwO1xuICB9XG5cbiAgcHJpdmF0ZSByZWRpcmVjdFRvTG9naW4odXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLndpbmRvd1JlZi5sb2NhdGlvbi5hc3NpZ24odXJpKTtcbiAgICB0aGlzLmlzUmVkaXJlY3RpbmckJC5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB0cnlMb2FkVXNlclByb2ZpbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmF1dGhDb25maWcubG9hZFVzZXJQcm9maWxlIHx8ICF0aGlzLmlzQXV0aGVudGljYXRlZCgpKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5vYXV0aFNlcnZpY2UubG9hZFVzZXJQcm9maWxlKCkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHRyeVJlZnJlc2hUb2tlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuZ2V0UmVmcmVzaFRva2VuKCkpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLm9hdXRoU2VydmljZS5yZWZyZXNoVG9rZW4oKTtcbiAgfVxuXG4gIHByaXZhdGUgYXNzZXJ0QXVkaWVuY2UoY2xpZW50SWQ/OiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgdG9rZW5DbGllbnRJZCA9IHRoaXMuZ2V0SWRlbnRpdHlDbGFpbXMoKT8uYXVkO1xuICAgIGlmICghY2xpZW50SWQgfHwgIXRva2VuQ2xpZW50SWQgfHwgY2xpZW50SWQgPT09IHRva2VuQ2xpZW50SWQpIHJldHVybjtcbiAgICB0aGlzLnNpZ25PdXQodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNpbGVudFJlZnJlc2goZW5hYmxlZDogYm9vbGVhbikge1xuICAgIGlmIChlbmFibGVkKSB7XG4gICAgICB0aGlzLm9hdXRoU2VydmljZS5zZXR1cEF1dG9tYXRpY1NpbGVudFJlZnJlc2goKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vYXV0aFNlcnZpY2Uuc3RvcEF1dG9tYXRpY1JlZnJlc2goKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC50eXBpbmdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9hdXRoL3NyYy9saWIvYXV0aC50eXBpbmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJkZWNsYXJlIGdsb2JhbCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG4gIG5hbWVzcGFjZSBPZHhBdXRoIHtcbiAgICB0eXBlIFJhd0lkZW50aXR5Q2xhaW1zID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICBpbnRlcmZhY2UgQXV0aFBsdWdpblJlc3VsdCB7XG4gICAgICBpbnN0aXR1dGlvbk5hbWU/OiBzdHJpbmc7XG4gICAgICBsYW5ndWFnZUNvZGU/OiBzdHJpbmc7XG4gICAgICBwcmVmZXJyZWRMYW5ndWFnZT86IHN0cmluZztcbiAgICB9XG5cbiAgICBpbnRlcmZhY2UgSWRlbnRpdHlDbGFpbXMgZXh0ZW5kcyBBdXRoUGx1Z2luUmVzdWx0IHtcbiAgICAgIHN1Yjogc3RyaW5nO1xuICAgICAgb2t0YWlkOiBzdHJpbmc7XG4gICAgICBpYXQ6IG51bWJlcjtcbiAgICAgIGF1ZDogc3RyaW5nO1xuXG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBmaXJzdG5hbWU6IHN0cmluZztcbiAgICAgIGxhc3RuYW1lOiBzdHJpbmc7XG4gICAgICBkaXNwbGF5bmFtZTogc3RyaW5nO1xuICAgICAgcHJlZmVycmVkX3VzZXJuYW1lOiBzdHJpbmc7XG4gICAgICBlbWFpbDogc3RyaW5nO1xuICAgICAgaW5pdGlhbHM6IHN0cmluZztcbiAgICAgIG9yZ2FuaXphdGlvbjogc3RyaW5nO1xuXG4gICAgICBsb2NhbGU/OiBzdHJpbmc7XG4gICAgICB6b25laW5mbz86IHN0cmluZztcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHt9O1xuIl19
@@ -1,40 +0,0 @@
1
- import { __decorate } from "tslib";
2
- import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';
3
- import { CoreModule } from '@odx/angular';
4
- import { ListModule } from '@odx/angular/components/list';
5
- import { CSSComponent } from '@odx/angular/internal';
6
- import { TranslatePipe } from '@odx/angular/internal/translate';
7
- import { injectElement } from '@odx/angular/utils';
8
- import { SignOutDirective } from '../../directives';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "@angular/common";
11
- import * as i2 from "@odx/angular/components/list";
12
- import * as i3 from "@odx/angular/components/icon";
13
- /**
14
- * Displays authentication actions.
15
- */
16
- let AuthActionsComponent = class AuthActionsComponent {
17
- constructor() {
18
- this.element = injectElement();
19
- /**
20
- * The identity claims.
21
- *
22
- * @type {OdxAuth.IdentityClaims | null}
23
- * @default null
24
- */
25
- this.claims = null;
26
- }
27
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AuthActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AuthActionsComponent, isStandalone: true, selector: "odx-auth-actions", inputs: { claims: "claims" }, ngImport: i0, template: "<odx-list>\n @if (claims?.userProfileUrl; as url) {\n <a odxListItem data-testid=\"odx-auth-user-profile-link\" [href]=\"url\" rel=\"noopener\" target=\"_blank\">\n <odx-icon name=\"user-administration\" iconSet=\"core\" odxListItemPrefix />\n {{ 'userProfileLink' | odxTranslate | async }}\n </a>\n }\n <button odxListItem odxAuthSignOut data-testid=\"odx-auth-sign-out-button\" style=\"width: 100%\">\n <odx-icon name=\"logout\" iconSet=\"core\" odxListItemPrefix />\n {{ 'signOutButtonText' | odxTranslate | async }}\n </button>\n</odx-list>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: ListModule }, { kind: "component", type: i2.ListComponent, selector: "odx-list" }, { kind: "component", type: i2.ListItemComponent, selector: "odx-list-item, [odxListItem]", inputs: ["danger", "variant", "muted", "selected"] }, { kind: "component", type: i3.IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }, { kind: "pipe", type: TranslatePipe, name: "odxTranslate" }, { kind: "directive", type: SignOutDirective, selector: "[odxAuthSignOut]", outputs: ["odxAuthSignOut"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
29
- };
30
- AuthActionsComponent = __decorate([
31
- CSSComponent('auth-actions')
32
- ], AuthActionsComponent);
33
- export { AuthActionsComponent };
34
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AuthActionsComponent, decorators: [{
35
- type: Component,
36
- args: [{ standalone: true, selector: 'odx-auth-actions', imports: [CoreModule, ListModule, TranslatePipe, SignOutDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<odx-list>\n @if (claims?.userProfileUrl; as url) {\n <a odxListItem data-testid=\"odx-auth-user-profile-link\" [href]=\"url\" rel=\"noopener\" target=\"_blank\">\n <odx-icon name=\"user-administration\" iconSet=\"core\" odxListItemPrefix />\n {{ 'userProfileLink' | odxTranslate | async }}\n </a>\n }\n <button odxListItem odxAuthSignOut data-testid=\"odx-auth-sign-out-button\" style=\"width: 100%\">\n <odx-icon name=\"logout\" iconSet=\"core\" odxListItemPrefix />\n {{ 'signOutButtonText' | odxTranslate | async }}\n </button>\n</odx-list>\n" }]
37
- }], propDecorators: { claims: [{
38
- type: Input
39
- }] } });
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1hY3Rpb25zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYXV0aC9zcmMvbGliL2NvbXBvbmVudHMvYXV0aC1hY3Rpb25zL2F1dGgtYWN0aW9ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2F1dGgvc3JjL2xpYi9jb21wb25lbnRzL2F1dGgtYWN0aW9ucy9hdXRoLWFjdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDMUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7OztBQUVwRDs7R0FFRztBQVVJLElBQU0sb0JBQW9CLEdBQTFCLE1BQU0sb0JBQW9CO0lBQTFCO1FBQ1csWUFBTyxHQUFHLGFBQWEsRUFBRSxDQUFDO1FBRTFDOzs7OztXQUtHO1FBRUksV0FBTSxHQUFrQyxJQUFJLENBQUM7S0FDckQ7K0dBWFksb0JBQW9CO21HQUFwQixvQkFBb0IsMEdDcEJqQyw4akJBWUEsMkNER1ksVUFBVSxtRkFBRSxVQUFVLGtYQUFFLGFBQWEscURBQUUsZ0JBQWdCOztBQUt0RCxvQkFBb0I7SUFUaEMsWUFBWSxDQUFDLGNBQWMsQ0FBQztHQVNoQixvQkFBb0IsQ0FXaEM7OzRGQVhZLG9CQUFvQjtrQkFSaEMsU0FBUztpQ0FDSSxJQUFJLFlBQ04sa0JBQWtCLFdBQ25CLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsbUJBRWpELHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUk7OEJBWTlCLE1BQU07c0JBRFosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29yZU1vZHVsZSB9IGZyb20gJ0BvZHgvYW5ndWxhcic7XG5pbXBvcnQgeyBMaXN0TW9kdWxlIH0gZnJvbSAnQG9keC9hbmd1bGFyL2NvbXBvbmVudHMvbGlzdCc7XG5pbXBvcnQgeyBDU1NDb21wb25lbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvaW50ZXJuYWwnO1xuaW1wb3J0IHsgVHJhbnNsYXRlUGlwZSB9IGZyb20gJ0BvZHgvYW5ndWxhci9pbnRlcm5hbC90cmFuc2xhdGUnO1xuaW1wb3J0IHsgaW5qZWN0RWxlbWVudCB9IGZyb20gJ0BvZHgvYW5ndWxhci91dGlscyc7XG5pbXBvcnQgeyBTaWduT3V0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcyc7XG5cbi8qKlxuICogRGlzcGxheXMgYXV0aGVudGljYXRpb24gYWN0aW9ucy5cbiAqL1xuQENTU0NvbXBvbmVudCgnYXV0aC1hY3Rpb25zJylcbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ29keC1hdXRoLWFjdGlvbnMnLFxuICBpbXBvcnRzOiBbQ29yZU1vZHVsZSwgTGlzdE1vZHVsZSwgVHJhbnNsYXRlUGlwZSwgU2lnbk91dERpcmVjdGl2ZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9hdXRoLWFjdGlvbnMuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgQXV0aEFjdGlvbnNDb21wb25lbnQge1xuICBwdWJsaWMgcmVhZG9ubHkgZWxlbWVudCA9IGluamVjdEVsZW1lbnQoKTtcblxuICAvKipcbiAgICogVGhlIGlkZW50aXR5IGNsYWltcy5cbiAgICpcbiAgICogQHR5cGUge09keEF1dGguSWRlbnRpdHlDbGFpbXMgfCBudWxsfVxuICAgKiBAZGVmYXVsdCBudWxsXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgY2xhaW1zOiBPZHhBdXRoLklkZW50aXR5Q2xhaW1zIHwgbnVsbCA9IG51bGw7XG59XG4iLCI8b2R4LWxpc3Q+XG4gIEBpZiAoY2xhaW1zPy51c2VyUHJvZmlsZVVybDsgYXMgdXJsKSB7XG4gICAgPGEgb2R4TGlzdEl0ZW0gZGF0YS10ZXN0aWQ9XCJvZHgtYXV0aC11c2VyLXByb2ZpbGUtbGlua1wiIFtocmVmXT1cInVybFwiIHJlbD1cIm5vb3BlbmVyXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgICA8b2R4LWljb24gbmFtZT1cInVzZXItYWRtaW5pc3RyYXRpb25cIiBpY29uU2V0PVwiY29yZVwiIG9keExpc3RJdGVtUHJlZml4IC8+XG4gICAgICB7eyAndXNlclByb2ZpbGVMaW5rJyB8IG9keFRyYW5zbGF0ZSB8IGFzeW5jIH19XG4gICAgPC9hPlxuICB9XG4gIDxidXR0b24gb2R4TGlzdEl0ZW0gb2R4QXV0aFNpZ25PdXQgZGF0YS10ZXN0aWQ9XCJvZHgtYXV0aC1zaWduLW91dC1idXR0b25cIiBzdHlsZT1cIndpZHRoOiAxMDAlXCI+XG4gICAgPG9keC1pY29uIG5hbWU9XCJsb2dvdXRcIiBpY29uU2V0PVwiY29yZVwiIG9keExpc3RJdGVtUHJlZml4IC8+XG4gICAge3sgJ3NpZ25PdXRCdXR0b25UZXh0JyB8IG9keFRyYW5zbGF0ZSB8IGFzeW5jIH19XG4gIDwvYnV0dG9uPlxuPC9vZHgtbGlzdD5cbiJdfQ==