@acorex-platform/framework-client 0.0.59 → 0.0.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/acorex-platform-framework-client-auth.mjs +397 -93
- package/fesm2022/acorex-platform-framework-client-auth.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-common.mjs +33 -31
- package/fesm2022/acorex-platform-framework-client-common.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-components.mjs +12 -4
- package/fesm2022/acorex-platform-framework-client-layout-components.mjs.map +1 -1
- package/fesm2022/{acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-BBuYugjl.mjs → acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-D0jDsA6M.mjs} +80 -13
- package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-D0jDsA6M.mjs.map +1 -0
- package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-DZDf_nVq.mjs → acorex-platform-framework-client-layout-entity-attachments-page.component-Bdvd1iYt.mjs} +2 -2
- package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-DZDf_nVq.mjs.map → acorex-platform-framework-client-layout-entity-attachments-page.component-Bdvd1iYt.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-framework-client-layout-entity-bulk-entity.command-CFFv3jDs.mjs → acorex-platform-framework-client-layout-entity-bulk-entity.command-CsTP8YHv.mjs} +2 -2
- package/fesm2022/{acorex-platform-framework-client-layout-entity-bulk-entity.command-CFFv3jDs.mjs.map → acorex-platform-framework-client-layout-entity-bulk-entity.command-CsTP8YHv.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-BDNPJg_6.mjs → acorex-platform-framework-client-layout-entity-gallery-page.component-UvMk0GbU.mjs} +2 -2
- package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-BDNPJg_6.mjs.map → acorex-platform-framework-client-layout-entity-gallery-page.component-UvMk0GbU.mjs.map} +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-entity.mjs +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs +257 -30
- package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs.map +1 -1
- package/fesm2022/{acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-Rv0K9r_e.mjs → acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-KrDsAa3H.mjs} +555 -121
- package/fesm2022/acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-KrDsAa3H.mjs.map +1 -0
- package/fesm2022/{acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-Dzqn3rGa.mjs → acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-BDlo6nTx.mjs} +2 -2
- package/fesm2022/{acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-Dzqn3rGa.mjs.map → acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-BDlo6nTx.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-C97rrrmu.mjs → acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-By3wntCB.mjs} +2 -2
- package/fesm2022/{acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-C97rrrmu.mjs.map → acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-By3wntCB.mjs.map} +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-widgets.mjs +1 -1
- package/fesm2022/acorex-platform-framework-client-themes-default.mjs +4 -4
- package/fesm2022/acorex-platform-framework-client-themes-default.mjs.map +1 -1
- package/layout/builder/README.md +10 -0
- package/layout/widget-core/README.md +47 -3
- package/layout/widgets/README.md +8 -2
- package/package.json +2 -2
- package/types/acorex-platform-framework-client-auth.d.ts +60 -1
- package/types/acorex-platform-framework-client-common.d.ts +3 -2
- package/types/acorex-platform-framework-client-layout-components.d.ts +3 -1
- package/types/acorex-platform-framework-client-layout-entity.d.ts +8 -1
- package/types/acorex-platform-framework-client-layout-widget-core.d.ts +72 -1
- package/types/acorex-platform-framework-client-layout-widgets.d.ts +25 -5
- package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-BBuYugjl.mjs.map +0 -1
- package/fesm2022/acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-Rv0K9r_e.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-framework-client-auth.mjs","sources":["../../../../../libs/framework/client/auth/src/lib/application/application.loader.ts","../../../../../libs/framework/client/auth/src/lib/contracts/errors.types.ts","../../../../../libs/framework/client/auth/src/lib/contracts/session.types.ts","../../../../../libs/framework/client/auth/src/lib/contracts/index.ts","../../../../../libs/framework/client/auth/src/lib/tenant/tenant.loader.ts","../../../../../libs/framework/client/auth/src/lib/auth-trace.constants.ts","../../../../../libs/framework/client/auth/src/lib/auth-session.trace.ts","../../../../../libs/framework/client/auth/src/lib/auth-registry.service.ts","../../../../../libs/framework/client/auth/src/lib/feature/feature.loader.ts","../../../../../libs/framework/client/auth/src/lib/feature/feature.directive.ts","../../../../../libs/framework/client/auth/src/lib/feature/feature.guard.ts","../../../../../libs/framework/client/auth/src/lib/feature/feature-checker.token.ts","../../../../../libs/framework/client/auth/src/lib/feature/feature-evaluator-scope.provider.ts","../../../../../libs/framework/client/auth/src/lib/permission/permission.loader.ts","../../../../../libs/framework/client/auth/src/lib/permission/permission-checker.token.ts","../../../../../libs/framework/client/auth/src/lib/access-policy/access-policy-cache.port.ts","../../../../../libs/framework/client/auth/src/lib/oauth-pending.util.ts","../../../../../libs/framework/client/auth/src/lib/auth-refresh-lock.util.ts","../../../../../libs/framework/client/auth/src/lib/max-active-device-sessions.util.ts","../../../../../libs/framework/client/auth/src/lib/session.service.ts","../../../../../libs/framework/client/auth/src/lib/permission/permission.directive.ts","../../../../../libs/framework/client/auth/src/lib/permission/permission.guard.ts","../../../../../libs/framework/client/auth/src/lib/permission/permission-definition.builder.ts","../../../../../libs/framework/client/auth/src/lib/permission/permission-definition.service.ts","../../../../../libs/framework/client/auth/src/lib/permission/permission-evaluator-scope.provider.ts","../../../../../libs/framework/client/auth/src/lib/auth.guard.ts","../../../../../libs/framework/client/auth/src/lib/auth.module.ts","../../../../../libs/framework/client/auth/src/lib/auth.strategy.ts","../../../../../libs/framework/client/auth/src/lib/auth.utils.ts","../../../../../libs/framework/client/auth/src/lib/platform-oauth-session.util.ts","../../../../../libs/framework/client/auth/src/lib/platform-oauth.util.ts","../../../../../libs/framework/client/auth/src/lib/auth-list-providers.types.ts","../../../../../libs/framework/client/auth/src/lib/command-message-text.util.ts","../../../../../libs/framework/client/auth/src/lib/platform-auth-runtime.service.ts","../../../../../libs/framework/client/auth/src/lib/user-avatar-cache.port.ts","../../../../../libs/framework/client/auth/src/lib/user-profile-identity.service.ts","../../../../../libs/framework/client/auth/src/lib/challenge/challenge.types.ts","../../../../../libs/framework/client/auth/src/lib/challenge/challenge.provider.ts","../../../../../libs/framework/client/auth/src/lib/challenge/challenge.token.ts","../../../../../libs/framework/client/auth/src/lib/challenge/challenge-component.base.ts","../../../../../libs/framework/client/auth/src/lib/sign-in-method/sign-in-method.types.ts","../../../../../libs/framework/client/auth/src/lib/sign-in-method/sign-in-method.registry.ts","../../../../../libs/framework/client/auth/src/acorex-platform-framework-client-auth.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { AXPSessionContext } from '../contracts/session.types';\nimport { AXPApplication } from './application.types';\n\nexport interface AXPApplicationLoader {\n getList(context: AXPSessionContext): Promise<AXPApplication[]>;\n}\n\nexport const AXP_APPLICATION_LOADER = new InjectionToken<AXPApplicationLoader>('AXP_APPLICATION_LOADER', {\n providedIn: 'root',\n factory: () => {\n return new AXPApplicationDefaultLoader();\n },\n});\n\nclass AXPApplicationDefaultLoader implements AXPApplicationLoader {\n async getList(context: AXPSessionContext): Promise<AXPApplication[]> {\n return [\n {\n id: '1',\n name: 'default-app',\n title: 'Default Application',\n version: '1.0.0',\n edition: {\n id: 'default-edition-1',\n title: 'Standard',\n },\n },\n {\n id: '2',\n name: 'default-app',\n title: 'Default Application',\n version: '1.0.0',\n edition: {\n id: 'default-edition-2',\n title: 'Standard',\n },\n },\n ];\n }\n}\n","export class AXPUnauthorizedError extends Error {\n constructor(message?: string, public data?: { redirectUrl?: string }) {\n super(message);\n this.name = 'AXPUnauthorizedError';\n }\n}\n\nexport class AXPUnauthenticatedError extends Error {\n constructor(message?: string, public data?: { redirectUrl?: string }) {\n super(message);\n this.name = 'AXPUnauthenticatedError';\n }\n}","import { AXPApplication } from \"../application/application.types\";\nimport { AXPTenant } from \"../tenant/tenant.types\";\nimport { AXPUser } from \"../user/user.types\";\n\nexport class AXPSessionContext {\n\n private _user: AXPUser | null = null;\n public get user(): AXPUser | null {\n return this._user;\n }\n\n private _tenant: AXPTenant | null = null;\n public get tenant(): AXPTenant | null {\n return this._tenant;\n }\n\n private _application: AXPApplication | null = null;\n public get application(): AXPApplication | null {\n return this._application;\n }\n\n constructor(context: {\n user: AXPUser | null,\n tenant: AXPTenant | null,\n application: AXPApplication | null,\n }) {\n this._user = context.user;\n this._tenant = context.tenant;\n this._application = context.application;\n }\n}\n\nexport enum AXPSessionStatus {\n Authenticated = \"authenticated\",\n Unauthenticated = \"unauthenticated\",\n Unauthorized = \"unauthorized\",\n Authorized = \"authorized\",\n Expired = \"expired\",\n SignedOut = \"signedOut\"\n}","//#region ---- Contracts barrel ----\n\nexport * from './errors.types';\nexport * from './session.types';\n\n//#endregion\n","import { InjectionToken } from '@angular/core';\nimport { AXPTenant } from './tenant.types';\nimport { AXPSessionContext } from '../contracts/session.types';\n\nexport interface AXPTenantLoader {\n getList(context: AXPSessionContext): Promise<AXPTenant[]>;\n}\n\nexport const AXP_TENANT_LOADER = new InjectionToken<AXPTenantLoader>('AXP_TENANT_LOADER', {\n providedIn: 'root',\n factory: () => {\n return new AXPTenantDefaultLoader();\n },\n});\n\nclass AXPTenantDefaultLoader implements AXPTenantLoader {\n async getList(context: AXPSessionContext): Promise<AXPTenant[]> {\n return [\n {\n id: '1',\n name: 'default-tenant',\n title: 'Default Tenant',\n },\n ];\n }\n}\n","/** Debug namespace for auth session diagnostics. Filter console with `[AXP:AUTH-SESSION]`. */\nexport const AUTH_SESSION_TRACE_NS = 'AUTH-SESSION';\n\n//#region ----- Trace area titles -----\n\nexport const AUTH_SESSION_TRACE_TITLE = {\n /** Sign-in / register / sign-out lifecycle. */\n Lifecycle: 'Lifecycle',\n /** Cookie session restore + refresh. */\n Restore: 'Restore',\n /** Tenant / application bind via UpdateSession. */\n Workspace: 'Workspace',\n /** Auth:GetAccessPolicy load (permissions + features). */\n AccessPolicy: 'AccessPolicy',\n /** ListTenants / ListApplications. */\n Catalog: 'Catalog',\n /** Route guards (login, tenant-chooser, app-chooser). */\n Guard: 'Guard',\n} as const;\n\n//#endregion\n","import { AXPDebugService } from '@acorex-platform/framework-client/core';\nimport { AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE } from './auth-trace.constants';\n\n//#region ----- Lifecycle -----\n\nexport function traceAuthLifecycle(message: string, data?: () => Record<string, unknown>): void {\n AXPDebugService.instance?.trace(AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE.Lifecycle, message, data);\n}\n\nexport function traceAuthLifecycleError(message: string, data?: () => Record<string, unknown>): void {\n AXPDebugService.instance?.error(AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE.Lifecycle, message, data);\n}\n\n/** Always emits (Debug Mode not required) — use for logout / empty-menu diagnosis. */\nexport function warnAuthLifecycle(message: string, data?: () => Record<string, unknown>): void {\n AXPDebugService.instance?.warn(AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE.Lifecycle, message, data);\n}\n\n//#endregion\n\n//#region ----- Restore -----\n\nexport function traceAuthRestore(message: string, data?: () => Record<string, unknown>): void {\n AXPDebugService.instance?.trace(AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE.Restore, message, data);\n}\n\n//#endregion\n\n//#region ----- Workspace -----\n\nexport function traceAuthWorkspace(message: string, data?: () => Record<string, unknown>): void {\n AXPDebugService.instance?.trace(AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE.Workspace, message, data);\n}\n\nexport function warnAuthWorkspace(message: string, data?: () => Record<string, unknown>): void {\n AXPDebugService.instance?.warn(AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE.Workspace, message, data);\n}\n\n//#endregion\n\n//#region ----- Access policy -----\n\nexport function traceAuthAccessPolicy(message: string, data?: () => Record<string, unknown>): void {\n AXPDebugService.instance?.trace(AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE.AccessPolicy, message, data);\n}\n\nexport function warnAuthAccessPolicy(message: string, data?: () => Record<string, unknown>): void {\n AXPDebugService.instance?.warn(AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE.AccessPolicy, message, data);\n}\n\n//#endregion\n\n//#region ----- Catalog -----\n\nexport function traceAuthCatalog(message: string, data?: () => Record<string, unknown>): void {\n AXPDebugService.instance?.trace(AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE.Catalog, message, data);\n}\n\n//#endregion\n\n//#region ----- Guards -----\n\nexport function traceAuthGuard(message: string, data?: () => Record<string, unknown>): void {\n AXPDebugService.instance?.trace(AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE.Guard, message, data);\n}\n\n//#endregion\n","import { Injectable, Injector } from \"@angular/core\";\nimport { AXPAuthStrategy } from \"./auth.strategy\";\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AXPAuthStrategyRegistryService {\n private strategies = new Map<string, AXPAuthStrategy>();\n\n private injector: Injector;\n\n constructor(injector: Injector) {\n this.injector = injector;\n }\n\n register(...plugins: (new () => AXPAuthStrategy)[]) {\n plugins.forEach(t => {\n const childInjector = Injector.create({ providers: [{ provide: t, useClass: t, deps: [] }], parent: this.injector });\n const strategy = childInjector.get(t);\n if (strategy) {\n this.strategies.set(strategy.name, strategy);\n }\n })\n }\n\n get(strategyKey: string): AXPAuthStrategy | undefined {\n return this.strategies.get(strategyKey);\n }\n}","import { InjectionToken } from '@angular/core';\nimport { AXPFeature } from './feature.types';\nimport { AXPSessionContext } from '../contracts/session.types';\n\nexport interface AXPFeatureLoader {\n getList(context: AXPSessionContext): Promise<AXPFeature[]>;\n}\n\nexport const AXP_FEATURE_LOADER = new InjectionToken<AXPFeatureLoader>('AXP_FEATURE_LOADER', {\n providedIn: 'root',\n factory: () => {\n return new AXPFeatureDefaultLoader();\n },\n});\n\nclass AXPFeatureDefaultLoader implements AXPFeatureLoader {\n async getList(context: AXPSessionContext): Promise<AXPFeature[]> {\n return [];\n }\n}\n","import { Directive, Input, TemplateRef, ViewContainerRef, inject, signal } from '@angular/core';\nimport { Subscription, first } from 'rxjs';\nimport { AXPSessionService } from '../session.service';\n\n@Directive({\n selector: '[feature]',\n standalone: false\n})\nexport class AXPFeatureDirective {\n private hasView = signal(false);\n private subscription!: Subscription;\n private sessionService = inject(AXPSessionService);\n\n constructor(\n private templateRef: TemplateRef<any>,\n private viewContainer: ViewContainerRef\n ) { }\n\n @Input()\n public set feature(featureKeys: string | string[] | null) {\n const keys: string[] = !featureKeys ? [] : (Array.isArray(featureKeys) ? featureKeys : [featureKeys]);\n if (keys.length == 0) {\n // If featureKey is null or empty, decide the default behavior here\n this.viewContainer.createEmbeddedView(this.templateRef);\n this.hasView.set(true);\n return;\n }\n this.subscription = this.sessionService.features$\n //.pipe(first())\n .subscribe(() => {\n if (this.sessionService.isFeatureEnabled(...keys)) {\n if (!this.hasView()) {\n this.viewContainer.createEmbeddedView(this.templateRef);\n this.hasView.set(true);\n }\n } else {\n this.viewContainer.clear();\n this.hasView.set(false);\n }\n });\n }\n\n @Input()\n public set featureElse(elseTemplateRef: TemplateRef<any>) {\n if (!this.hasView()) {\n this.viewContainer.createEmbeddedView(elseTemplateRef);\n }\n }\n\n ngOnDestroy() {\n this.subscription?.unsubscribe();\n }\n}\n","import { ActivatedRouteSnapshot, CanActivateFn, RouterStateSnapshot, UrlTree } from \"@angular/router\";\nimport { inject } from \"@angular/core\";\nimport { AXPSessionService } from \"../session.service\";\nimport { Observable, first, map } from \"rxjs\";\nimport { AXPUnauthorizedError } from \"../contracts/errors.types\";\n\nexport const AXPFeatureGuard: CanActivateFn =\n (route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> => {\n const sessionService = inject(AXPSessionService);\n const requiredFeatures = route.data['requiredFeature'] as (string | string[] | null);\n\n return sessionService.features$.pipe(\n map(() => {\n const keys: string[] = !requiredFeatures ? [] : (Array.isArray(requiredFeatures) ? requiredFeatures : [requiredFeatures]);\n const hasFeature = keys.length == 0 || sessionService.isFeatureEnabled(...keys);\n if (!hasFeature) {\n throw new AXPUnauthorizedError(\n `Access Denied. You do not have access to this feature. Required feature(s): ${keys.join(', ')}. Please contact support if you need access.`,\n {\n redirectUrl: state.url\n }\n );\n }\n return true;\n })\n );\n };\n","import { InjectionToken } from '@angular/core';\nimport { AXPFeatureChecker } from './feature-checker.types';\n\n/**\n * Optional injection token for feature checker.\n * If provided, the checker will be called to potentially override\n * feature enablement results based on custom logic.\n */\nexport const AXP_FEATURE_CHECKER = new InjectionToken<AXPFeatureChecker>(\n 'AXP_FEATURE_CHECKER'\n);\n\n","//#region ----- Imports -----\n\nimport {\n AXPExpressionEvaluatorScopeProvider,\n AXPExpressionEvaluatorScopeProviderContext,\n} from '@acorex-platform/framework-shared/core';\nimport { inject } from '@angular/core';\nimport { AXPSessionService } from '../session.service';\n\n//#endregion\n\n//#region ----- Feature Evaluator Scope Provider -----\n\n/**\n * Exposes `feature.check(...)` / `feature.checkAny(...)` for entity expressions\n * (e.g. `schema.visible: '{{ feature.check(\"Module:Feature:X\") }}'`).\n */\nexport class AXPFeatureEvaluatorScopeProvider implements AXPExpressionEvaluatorScopeProvider {\n protected sessionService = inject(AXPSessionService);\n\n async provide(context: AXPExpressionEvaluatorScopeProviderContext): Promise<void> {\n context.addScope('feature', {\n /**\n * True when every listed feature key is enabled for the session.\n */\n check: (...features: string[]) => {\n return this.sessionService.isFeatureEnabled(...features);\n },\n\n /**\n * True when any listed feature key is enabled for the session.\n */\n checkAny: (...features: string[]) => {\n return features.some((f) => this.sessionService.isFeatureEnabled(f));\n },\n });\n }\n}\n\n//#endregion\n","import { InjectionToken } from \"@angular/core\";\nimport { AXPPermission } from \"./permission.types\";\nimport { AXPSessionContext } from \"../contracts/session.types\";\n\nexport interface AXPPermissionLoader {\n getList(context: AXPSessionContext): Promise<AXPPermission[]>;\n}\n\nexport const AXP_PERMISSION_LOADER = new InjectionToken<AXPPermissionLoader>('AXP_PERMISSION_LOADER', {\n providedIn: 'root',\n factory: () => {\n return new AXPPermissionDefaultLoader();\n }\n});\n\nclass AXPPermissionDefaultLoader implements AXPPermissionLoader {\n async getList(context: AXPSessionContext): Promise<AXPPermission[]> {\n return [];\n }\n}","import { InjectionToken } from '@angular/core';\nimport { AXPPermissionChecker } from './permission-checker.types';\n\n/**\n * Optional injection token for permission checker.\n * If provided, the checker will be called to potentially override\n * authorization results based on custom logic.\n */\nexport const AXP_PERMISSION_CHECKER = new InjectionToken<AXPPermissionChecker>(\n 'AXP_PERMISSION_CHECKER'\n);\n\n","import { InjectionToken } from '@angular/core';\n\n//#region ----- Access policy cache port -----\n\n/** Allows connectivity loaders to invalidate cached session access policy when context changes. */\nexport interface AXPAccessPolicyCachePort {\n invalidate(): void;\n}\n\nexport const AXP_ACCESS_POLICY_CACHE_PORT = new InjectionToken<AXPAccessPolicyCachePort>(\n 'AXP_ACCESS_POLICY_CACHE_PORT',\n);\n\n//#endregion\n","//#region ---- OAuth pending strategy (callback routing) ----\n\n/**\n * When the SPA is redirected to `/auth/oauth-callback`, the active auth strategy name\n * must survive so `/auth/oauth-callback` can resolve the strategy.\n */\nconst OAUTH_PENDING_STRATEGY_KEY = 'axp_oauth_pending_strategy';\n\nexport const AXP_OAUTH_PKCE_VERIFIER_KEY = 'pkce_code_verifier';\n\nexport function setOAuthPendingStrategy(strategy: string): void {\n sessionStorage.setItem(OAUTH_PENDING_STRATEGY_KEY, strategy);\n}\n\nexport function getOAuthPendingStrategy(): string | null {\n return sessionStorage.getItem(OAUTH_PENDING_STRATEGY_KEY);\n}\n\nexport function clearOAuthPendingStrategy(): void {\n sessionStorage.removeItem(OAUTH_PENDING_STRATEGY_KEY);\n}\n\n/** @deprecated Server-side PKCE replaced localStorage verifier; kept for legacy detection only. */\nexport function hasLegacyOAuthPkceVerifier(): boolean {\n return !!localStorage.getItem(AXP_OAUTH_PKCE_VERIFIER_KEY);\n}\n\nexport function hasOAuthPendingFlow(): boolean {\n return !!getOAuthPendingStrategy();\n}\n\nexport function isOAuthRedirectInFlight(): boolean {\n return hasOAuthPendingFlow() || hasLegacyOAuthPkceVerifier();\n}\n\n//#endregion\n","//#region ---- Auth refresh lock (cross-tab) ----\n\n/**\n * Serializes cookie refresh across browser tabs so two restores cannot consume the\n * same refresh `jti` and trigger server reuse detection (full `sid` revoke).\n *\n * 1. Web Locks API (Chrome / Edge / Firefox) — exclusive across tabs of this origin.\n * 2. localStorage lock — fallback when Web Locks is missing (two JS heaps otherwise race).\n * 3. In-tab promise chain — last resort (does not coordinate tabs).\n */\nconst AUTH_REFRESH_LOCK_NAME = 'axp.auth.refresh';\nconst AUTH_REFRESH_LS_LOCK_KEY = 'axp.auth.refresh.ls-lock';\nconst AUTH_REFRESH_LS_TTL_MS = 20_000;\nconst AUTH_REFRESH_LS_WAIT_MS = 40;\n\nlet memoryTail: Promise<unknown> = Promise.resolve();\n\nexport async function withAuthRefreshLock<T>(run: () => Promise<T>): Promise<T> {\n const locks = typeof navigator !== 'undefined' ? navigator.locks : undefined;\n if (typeof locks?.request === 'function') {\n return locks.request(AUTH_REFRESH_LOCK_NAME, { mode: 'exclusive' }, async () => run());\n }\n\n if (typeof localStorage !== 'undefined') {\n return withLocalStorageRefreshLock(run);\n }\n\n return withMemoryRefreshLock(run);\n}\n\nasync function withLocalStorageRefreshLock<T>(run: () => Promise<T>): Promise<T> {\n const owner = `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n const deadline = Date.now() + AUTH_REFRESH_LS_TTL_MS;\n\n while (Date.now() < deadline) {\n const now = Date.now();\n const held = readLocalStorageLock();\n if (held && held.until > now && held.owner !== owner) {\n await delay(AUTH_REFRESH_LS_WAIT_MS);\n continue;\n }\n\n writeLocalStorageLock(owner, now + AUTH_REFRESH_LS_TTL_MS);\n const confirmed = readLocalStorageLock();\n if (confirmed?.owner !== owner) {\n await delay(AUTH_REFRESH_LS_WAIT_MS);\n continue;\n }\n\n try {\n return await run();\n } finally {\n const current = readLocalStorageLock();\n if (current?.owner === owner) {\n localStorage.removeItem(AUTH_REFRESH_LS_LOCK_KEY);\n }\n }\n }\n\n return withMemoryRefreshLock(run);\n}\n\nfunction readLocalStorageLock(): { owner: string; until: number } | null {\n try {\n const raw = localStorage.getItem(AUTH_REFRESH_LS_LOCK_KEY);\n if (!raw) {\n return null;\n }\n const parsed = JSON.parse(raw) as { owner?: unknown; until?: unknown };\n if (typeof parsed.owner !== 'string' || typeof parsed.until !== 'number') {\n return null;\n }\n return { owner: parsed.owner, until: parsed.until };\n } catch {\n return null;\n }\n}\n\nfunction writeLocalStorageLock(owner: string, until: number): void {\n localStorage.setItem(AUTH_REFRESH_LS_LOCK_KEY, JSON.stringify({ owner, until }));\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction withMemoryRefreshLock<T>(run: () => Promise<T>): Promise<T> {\n const runExclusive = memoryTail.then(\n () => run(),\n () => run(),\n );\n memoryTail = runExclusive.then(\n () => undefined,\n () => undefined,\n );\n return runExclusive;\n}\n\n//#endregion\n","//#region ---- Max active device sessions (client) ----\n\n/** Stable API / ForbiddenException code from AuthService. */\nexport const MAX_ACTIVE_DEVICE_SESSIONS_CODE = 'MAX_ACTIVE_DEVICE_SESSIONS';\n\nconst PENDING_TENANT_STORAGE_KEY = 'axp.auth.sessionLimit.pendingTenant';\n\nexport interface AXPSessionLimitPendingTenant {\n id: string;\n name?: string;\n title?: unknown;\n}\n\nfunction textContainsMaxSessionsCode(value: unknown): boolean {\n if (typeof value === 'string') {\n return value === MAX_ACTIVE_DEVICE_SESSIONS_CODE || value.includes(MAX_ACTIVE_DEVICE_SESSIONS_CODE);\n }\n if (Array.isArray(value)) {\n return value.some((item) => textContainsMaxSessionsCode(item));\n }\n return false;\n}\n\n/**\n * Detects tenant max concurrent device-session rejection from command / HTTP shapes.\n * Must recognize {@link Error} subclasses (e.g. AuthApiError) via `.message`.\n */\nexport function isMaxActiveDeviceSessionsError(error: unknown): boolean {\n if (error == null) {\n return false;\n }\n\n if (typeof error === 'string') {\n return textContainsMaxSessionsCode(error);\n }\n\n if (typeof error !== 'object') {\n return false;\n }\n\n // Error.message is reliable for AuthApiError / Error thrown from UpdateSession.\n if (error instanceof Error && textContainsMaxSessionsCode(error.message)) {\n return true;\n }\n\n const err = error as Record<string, unknown>;\n const candidates: unknown[] = [err['message'], err['error'], err['code']];\n\n const nestedError = err['error'];\n if (nestedError && typeof nestedError === 'object') {\n const nested = nestedError as Record<string, unknown>;\n candidates.push(nested['message'], nested['error'], nested['code']);\n }\n\n const apiError = err['apiError'];\n if (apiError && typeof apiError === 'object') {\n const api = apiError as Record<string, unknown>;\n candidates.push(api['message'], api['error'], api['code']);\n }\n\n return candidates.some((value) => textContainsMaxSessionsCode(value));\n}\n\nexport function storeSessionLimitPendingTenant(tenant: AXPSessionLimitPendingTenant): void {\n try {\n sessionStorage.setItem(PENDING_TENANT_STORAGE_KEY, JSON.stringify(tenant));\n } catch {\n // Ignore quota / private-mode failures; route state may still carry the tenant.\n }\n}\n\nexport function readSessionLimitPendingTenant(): AXPSessionLimitPendingTenant | null {\n try {\n const raw = sessionStorage.getItem(PENDING_TENANT_STORAGE_KEY);\n if (!raw) {\n return null;\n }\n const parsed = JSON.parse(raw) as AXPSessionLimitPendingTenant;\n if (!parsed?.id || typeof parsed.id !== 'string') {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport function clearSessionLimitPendingTenant(): void {\n try {\n sessionStorage.removeItem(PENDING_TENANT_STORAGE_KEY);\n } catch {\n // ignore\n }\n}\n\n//#endregion\n","import { AXPBroadcastEventService } from '@acorex-platform/framework-client/core';\nimport { Injectable, inject, Injector } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { isEmpty } from 'lodash-es';\nimport { BehaviorSubject, Observable, combineLatest, defaultIfEmpty, distinctUntilChanged, filter, from, map, of, shareReplay, switchMap } from 'rxjs';\nimport { AXP_APPLICATION_LOADER } from './application/application.loader';\nimport { AXPApplication } from './application/application.types';\nimport {\n traceAuthAccessPolicy,\n warnAuthAccessPolicy,\n traceAuthCatalog,\n traceAuthLifecycle,\n traceAuthLifecycleError,\n warnAuthLifecycle,\n traceAuthRestore,\n traceAuthWorkspace,\n warnAuthWorkspace,\n} from './auth-session.trace';\nimport { AXPAuthStrategyRegistryService } from './auth-registry.service';\nimport { AXPBaseCredentials, AXPSessionData, AXPSignInResult, AXPAuthStrategy } from './auth.strategy';\nimport { AXPFeature, AXP_FEATURE_LOADER, AXP_FEATURE_CHECKER } from './feature';\nimport { AXP_PERMISSION_LOADER } from './permission/permission.loader';\nimport { AXP_PERMISSION_CHECKER } from './permission/permission-checker.token';\nimport { AXPPermission } from './permission/permission.types';\nimport { AXPSessionContext, AXPSessionStatus } from './contracts/session.types';\nimport { AXP_TENANT_LOADER } from './tenant/tenant.loader';\nimport { AXPTenant } from './tenant/tenant.types';\nimport { AXPUser } from './user/user.types';\nimport { AXP_ACCESS_POLICY_CACHE_PORT } from './access-policy/access-policy-cache.port';\nimport {\n clearOAuthPendingStrategy,\n getOAuthPendingStrategy,\n isOAuthRedirectInFlight,\n setOAuthPendingStrategy,\n} from './oauth-pending.util';\nimport { withAuthRefreshLock } from './auth-refresh-lock.util';\nimport { isMaxActiveDeviceSessionsError } from './max-active-device-sessions.util';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPSessionService {\n private eventService = inject(AXPBroadcastEventService);\n\n private authStrategyRegistry = inject(AXPAuthStrategyRegistryService);\n private readonly injector = inject(Injector);\n public static readonly SESSION_KEY = 'AXP_SESSION';\n\n private readonly permissionLoader = inject(AXP_PERMISSION_LOADER);\n private readonly featureLoader = inject(AXP_FEATURE_LOADER);\n private readonly tenantLoader = inject(AXP_TENANT_LOADER);\n private readonly applicationLoader = inject(AXP_APPLICATION_LOADER);\n private readonly permissionChecker = inject(AXP_PERMISSION_CHECKER, { optional: true });\n private readonly featureChecker = inject(AXP_FEATURE_CHECKER, { optional: true });\n private readonly accessPolicyCache = inject(AXP_ACCESS_POLICY_CACHE_PORT, { optional: true });\n\n /** In-memory catalog caches — shared by guards and chooser UI (one List* per bind). */\n private tenantsListCache: { userId: string; items: AXPTenant[] } | null = null;\n private applicationsListCache: { tenantId: string; items: AXPApplication[] } | null = null;\n private signoutInFlight: Promise<void> | null = null;\n\n private status = new BehaviorSubject<AXPSessionStatus>(AXPSessionStatus.Unauthenticated);\n public readonly status$ = this.status.asObservable().pipe(shareReplay(1));\n\n // Add loading state to prevent premature redirects\n private isLoading = new BehaviorSubject<boolean>(true);\n public readonly isLoading$ = this.isLoading.asObservable().pipe(shareReplay(1));\n\n private currentUserSubject = new BehaviorSubject<AXPUser | null>(null);\n public readonly user$ = this.currentUserSubject.asObservable().pipe(shareReplay(1));\n public get user(): AXPUser | null {\n this.syncContextSubjectsFromStorage();\n return this.currentUserSubject.value;\n }\n\n private currentTenantSubject = new BehaviorSubject<AXPTenant | null>(null);\n public readonly tenant$ = this.currentTenantSubject.asObservable().pipe(shareReplay(1));\n public get tenant(): AXPTenant | null {\n this.syncContextSubjectsFromStorage();\n return this.currentTenantSubject.value;\n }\n\n private currentApplicationSubject = new BehaviorSubject<AXPApplication | null>(null);\n public readonly application$ = this.currentApplicationSubject.asObservable().pipe(shareReplay(1));\n public get application(): AXPApplication | null {\n this.syncContextSubjectsFromStorage();\n return this.currentApplicationSubject.value;\n }\n\n private permissionsSubject = new BehaviorSubject<AXPPermission[]>([]);\n public readonly permissions$ = this.permissionsSubject.asObservable().pipe(shareReplay(1), defaultIfEmpty([]));\n public get permissions(): AXPPermission[] {\n return this.permissionsSubject.value ?? [];\n }\n\n private featuresSubject = new BehaviorSubject<AXPFeature[]>([]);\n public readonly features$ = this.featuresSubject.asObservable().pipe(shareReplay(1), defaultIfEmpty([]));\n public get features(): AXPFeature[] {\n return this.featuresSubject.value ?? [];\n }\n\n public readonly isAuthenticated$ = this.status$.pipe(\n map((status) => this.isAuthenticatedStatus(status)),\n shareReplay(1),\n );\n\n /** Synchronous counterpart to {@link isAuthenticated$}. */\n public get isAuthenticated(): boolean {\n return this.isAuthenticatedStatus(this.status.value);\n }\n\n // Add a new observable that considers loading state\n public readonly isAuthenticatedWithLoading$ = this.isLoading$.pipe(\n switchMap((loading) => {\n if (loading) {\n // Wait for loading to complete, then return authentication status\n return this.isLoading$.pipe(\n filter((isLoading) => !isLoading),\n switchMap(() => this.isAuthenticated$),\n );\n }\n // If not loading, return current authentication status\n return this.isAuthenticated$;\n }),\n shareReplay(1),\n );\n\n public readonly isAuthorized$ = this.status$.pipe(\n map((status) => status === AXPSessionStatus.Authorized),\n shareReplay(1),\n );\n\n /** Synchronous counterpart to {@link isAuthorized$}. */\n public get isAuthorized(): boolean {\n return this.status.value === AXPSessionStatus.Authorized;\n }\n\n /**\n * Tenant and application are selected and permissions are loaded.\n * Gate app-scoped runtime work (entity queries, inbox, activity).\n */\n public get isReadyForAppScopedApi(): boolean {\n return this.isAuthorized && this.hasSessionCredentials();\n }\n\n public readonly isReadyForAppScopedApi$ = this.isAuthorized$.pipe(\n map((authorized) => authorized && this.hasSessionCredentials()),\n distinctUntilChanged(),\n shareReplay(1),\n );\n\n /** Tenant list for the signed-in user; skips the API when there is no cookie session. */\n public readonly tenants$: Observable<AXPTenant[]> = this.isAuthenticated$.pipe(\n distinctUntilChanged(),\n switchMap((authenticated): Observable<AXPTenant[]> => {\n if (!authenticated || !this.hasSessionCredentials()) {\n return of([]);\n }\n return from(this.getTenantsList());\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n\n /** Application list for the current tenant; skips the API when there is no cookie session. */\n public readonly applications$: Observable<AXPApplication[]> = combineLatest([\n this.isAuthenticated$,\n this.tenant$,\n ]).pipe(\n distinctUntilChanged(\n ([authenticated, tenant], [previousAuthenticated, previousTenant]) =>\n authenticated === previousAuthenticated && tenant?.id === previousTenant?.id,\n ),\n switchMap(([authenticated, tenant]): Observable<AXPApplication[]> => {\n if (!authenticated || !this.hasSessionCredentials() || !tenant?.id) {\n return of([]);\n }\n return from(this.getApplicationsList());\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n\n /** Waits for session restore to finish, then emits whether the session is fully authorized. */\n public readonly isAuthorizedWithLoading$ = this.isLoading$.pipe(\n switchMap((loading) => {\n if (loading) {\n return this.isLoading$.pipe(\n filter((isLoading) => !isLoading),\n switchMap(() => this.isAuthorized$),\n );\n }\n return this.isAuthorized$;\n }),\n shareReplay(1),\n );\n\n public async restoreSession(): Promise<void> {\n this.isLoading.next(true);\n const startedAt = Date.now();\n\n try {\n const sessionData = this.getSessionData();\n if (!sessionData?.user || !sessionData.cookieSession) {\n // OAuth code exchange needs `strategy` after redirect. Do not wipe the\n // pre-login strategy / pending key while PKCE (or pending strategy) exists.\n if (isOAuthRedirectInFlight()) {\n const strategy = sessionData?.strategy || getOAuthPendingStrategy();\n if (strategy && sessionData?.strategy !== strategy) {\n this.setSession({\n strategy,\n user: null,\n tenant: null,\n application: null,\n cookieSession: false,\n });\n }\n this.status.next(AXPSessionStatus.Unauthorized);\n traceAuthRestore('OAuth redirect in flight — kept strategy', () => ({ strategy }));\n return;\n }\n this.clearSession();\n this.status.next(AXPSessionStatus.Unauthorized);\n traceAuthRestore('No cookie session metadata — cleared');\n return;\n }\n\n // Validate HttpOnly cookies and rotate tokens before trusting local metadata.\n const strategyName = sessionData.strategy;\n const strategy = strategyName ? this.authStrategyRegistry.get(strategyName) : null;\n if (!strategy) {\n this.clearSession();\n this.status.next(AXPSessionStatus.Unauthorized);\n traceAuthRestore('Strategy missing — cleared', () => ({ strategyName }));\n return;\n }\n\n // Keep subjects warm for refresh context, but do NOT mark Authenticated yet —\n // that would trigger settings/chat side-effects while isLoading is still true.\n this.currentUserSubject.next(sessionData.user);\n this.currentTenantSubject.next(sessionData.tenant ?? null);\n this.currentApplicationSubject.next(sessionData.application ?? null);\n\n traceAuthRestore('Refreshing cookie session', () => ({\n userId: sessionData.user?.id,\n tenantId: sessionData.tenant?.id,\n applicationId: sessionData.application?.id,\n strategy: strategyName,\n }));\n\n // Cross-tab exclusive refresh — avoids concurrent jti reuse / sid revoke.\n const refreshResult = await this.refreshCookieSessionExclusive(strategyName, strategy);\n if (!refreshResult?.succeed || !refreshResult.data?.user) {\n this.clearSession();\n this.status.next(AXPSessionStatus.Unauthorized);\n traceAuthRestore('Refresh failed — cleared');\n return;\n }\n\n await this.applySignInResult(strategyName, refreshResult);\n traceAuthRestore('Restore complete', () => ({\n ms: Date.now() - startedAt,\n status: this.status.value,\n tenantId: this.tenant?.id,\n applicationId: this.application?.id,\n }));\n } catch (error) {\n this.clearSession();\n this.status.next(AXPSessionStatus.Unauthorized);\n traceAuthRestore('Restore error — cleared', () => ({\n error: error instanceof Error ? error.message : String(error),\n }));\n } finally {\n this.isLoading.next(false);\n }\n }\n\n async signin(credentials: AXPBaseCredentials): Promise<void> {\n this.isLoading.next(true);\n const startedAt = Date.now();\n traceAuthLifecycle('Sign-in started', () => ({ strategy: credentials.strategy }));\n try {\n const strategy = this.authStrategyRegistry.get(credentials.strategy);\n if (!strategy) {\n throw new Error(`Authentication strategy '${credentials.strategy}' is not supported`);\n }\n const result = await strategy.signin(credentials);\n if (!result) {\n // Redirect / multi-step strategies return void — keep strategy + PKCE metadata.\n this.status.next(AXPSessionStatus.Unauthenticated);\n return;\n }\n if (result?.succeed) {\n await this.applySignInResult(credentials.strategy, result);\n traceAuthLifecycle('Sign-in succeeded', () => ({\n ms: Date.now() - startedAt,\n userId: this.user?.id,\n tenantId: this.tenant?.id,\n applicationId: this.application?.id,\n status: this.status.value,\n }));\n } else {\n this.clearSession();\n this.status.next(AXPSessionStatus.Unauthenticated);\n throw new Error(`Invalid Username or Password`);\n }\n } catch (error) {\n traceAuthLifecycleError('Sign-in failed', () => ({\n error: error instanceof Error ? error.message : String(error),\n }));\n this.clearSession();\n this.status.next(AXPSessionStatus.Unauthenticated);\n throw error;\n } finally {\n this.isLoading.next(false);\n }\n }\n\n async register(credentials: AXPBaseCredentials): Promise<void> {\n this.isLoading.next(true);\n try {\n const strategy = this.authStrategyRegistry.get(credentials.strategy);\n if (!strategy || typeof (strategy as { register?: unknown }).register !== 'function') {\n throw new Error(`Registration is not supported for strategy '${credentials.strategy}'`);\n }\n\n const result = await (\n strategy as AXPAuthStrategy & {\n register: (input: AXPBaseCredentials) => Promise<AXPSignInResult>;\n }\n ).register(credentials);\n\n if (!result?.succeed) {\n this.status.next(AXPSessionStatus.Unauthenticated);\n throw new Error('Registration failed');\n }\n\n await this.applySignInResult(credentials.strategy, result);\n } catch (error) {\n console.error('Register error:', error);\n this.clearSession();\n this.status.next(AXPSessionStatus.Unauthenticated);\n throw error;\n } finally {\n this.isLoading.next(false);\n }\n }\n\n private async applySignInResult(strategy: string, result: AXPSignInResult): Promise<void> {\n // Reset client metadata only — do not call clearSession() (that flips status to\n // Unauthenticated and can trigger logout listeners mid-flow).\n this.invalidateAccessPolicyCache();\n this.clearCatalogCaches();\n this.permissionsSubject.next([]);\n this.featuresSubject.next([]);\n this.currentUserSubject.next(result.data!.user);\n this.setSession({\n strategy,\n user: result.data!.user,\n tenant: result.data?.tenant ?? null,\n // Fresh sign-in tokens omit application; refresh/restore may include it.\n application: result.data?.application ?? null,\n expiresIn: result.data?.expiresIn,\n locked: false,\n cookieSession: true,\n });\n await this.reloadAccessPolicyIfReady('applySignInResult');\n await this.syncSessionAuthorization();\n }\n\n /**\n * Clears the selected application so the user must pick one (app chooser).\n * Keeps tenant/user/token intact and demotes status to Authenticated.\n */\n public clearApplicationSelection(): void {\n if (!this.application?.id) {\n return;\n }\n\n this.setSession({ application: null });\n if (this.user) {\n this.status.next(AXPSessionStatus.Authenticated);\n }\n }\n\n async updateToken(params?: { [key: string]: any }): Promise<void> {\n this.isLoading.next(true);\n const startedAt = Date.now();\n\n const isApplicationUpdate = this.isApplicationContextUpdate(params);\n const isTenantUpdate = this.isTenantContextUpdate(params);\n\n traceAuthWorkspace('UpdateSession started', () => ({\n isTenantUpdate,\n isApplicationUpdate,\n tenantId: params?.['tenant']?.id ?? params?.['tenantId'],\n applicationId: params?.['application']?.id ?? params?.['applicationId'],\n }));\n\n // Pause app-scoped API work while token/context is rebound (avoids 401/403 races).\n if (this.isAuthorized) {\n this.status.next(AXPSessionStatus.Authenticated);\n }\n if (isTenantUpdate && !isApplicationUpdate) {\n this.currentApplicationSubject.next(null);\n this.applicationsListCache = null;\n }\n\n try {\n const strategyName = this.resolveStrategyName();\n if (!strategyName) {\n throw new Error('Strategy not found');\n }\n const strategy = this.authStrategyRegistry.get(strategyName);\n if (!strategy) {\n throw new Error(`Authentication strategy '${strategyName}' is not supported`);\n }\n // Same lock as cookie refresh — UpdateSession rotates refresh `jti`.\n // A restore in another tab must not consume the previous cookie concurrently.\n const result = await withAuthRefreshLock(() => strategy.updateToken(params));\n if (result?.succeed) {\n if (params?.['code']) {\n this.clearSession();\n clearOAuthPendingStrategy();\n } else {\n this.permissionsSubject.next([]);\n this.featuresSubject.next([]);\n this.invalidateAccessPolicyCache();\n }\n this.currentUserSubject.next(result.data!.user);\n this.setSession({\n strategy: strategyName,\n user: result.data!.user,\n tenant: result.data?.tenant ?? null,\n application: this.resolveApplicationAfterUpdate(\n result.data?.application ?? null,\n isApplicationUpdate,\n isTenantUpdate,\n ),\n expiresIn: result.data?.expiresIn,\n locked: false,\n cookieSession: true,\n });\n await this.reloadAccessPolicyIfReady('updateToken');\n await this.syncSessionAuthorization();\n traceAuthWorkspace('UpdateSession complete', () => ({\n ms: Date.now() - startedAt,\n status: this.status.value,\n tenantId: this.tenant?.id,\n applicationId: this.application?.id,\n }));\n } else {\n this.status.next(AXPSessionStatus.Unauthenticated);\n throw new Error(`Invalid Username or Password`);\n }\n } catch (error) {\n traceAuthLifecycleError('UpdateSession failed', () => ({\n error: error instanceof Error ? error.message : String(error),\n }));\n warnAuthWorkspace('UpdateSession failed — clearing session (logout UX)', () => ({\n error: error instanceof Error ? error.message : String(error),\n tenantId: params?.['tenant']?.id ?? params?.['tenantId'] ?? null,\n applicationId: params?.['application']?.id ?? params?.['applicationId'] ?? null,\n }));\n // Failed workspace bind must not leave a half-authenticated cookie session\n // (that causes splash restore loops after refresh).\n // Exception: max device sessions — keep identity session so the user can\n // terminate another device and retry tenant bind.\n if (isMaxActiveDeviceSessionsError(error)) {\n throw error;\n }\n if (params?.['code']) {\n clearOAuthPendingStrategy();\n }\n this.clearSession();\n throw error;\n } finally {\n this.isLoading.next(false);\n }\n }\n\n async signout(): Promise<void> {\n if (this.signoutInFlight) {\n return this.signoutInFlight;\n }\n\n this.signoutInFlight = this.performSignout().finally(() => {\n this.signoutInFlight = null;\n });\n return this.signoutInFlight;\n }\n\n /**\n * Clears the client session first, then redirects, then revokes the server session.\n * Waiting on the logout HTTP call (or flipping isLoading) used to skip the login\n * redirect and let in-flight 401s start a competing navigation back into the app.\n */\n private async performSignout(): Promise<void> {\n const userId = this.user?.id;\n const sessionData = this.getSessionData();\n const strategy = sessionData?.strategy\n ? this.authStrategyRegistry.get(sessionData.strategy)\n : null;\n\n traceAuthLifecycle('Sign-out started', () => ({ userId }));\n\n this.clearSession();\n this.eventService.publish(AXPSessionStatus.SignedOut, { id: userId });\n this.status.next(AXPSessionStatus.SignedOut);\n this.navigateToLoginAfterSignout();\n\n if (strategy) {\n try {\n await strategy.signout();\n } catch {\n // Ignore logout network errors; client session is already cleared.\n }\n }\n\n traceAuthLifecycle('Sign-out complete', () => ({ userId }));\n }\n\n private navigateToLoginAfterSignout(): void {\n try {\n const router = this.injector.get(Router);\n const path = (router.url ?? '').split('?')[0];\n if (path.startsWith('/auth')) {\n return;\n }\n void router.navigateByUrl('/auth/login', { replaceUrl: true });\n } catch {\n // Router is unavailable in some test / early-boot hosts.\n }\n }\n\n async refreshToken(): Promise<boolean> {\n const sessionData = this.getSessionData();\n if (!sessionData?.strategy || !sessionData.cookieSession) {\n throw new Error('No cookie session available');\n }\n const strategyName = sessionData.strategy;\n const strategy = this.authStrategyRegistry.get(strategyName);\n if (!strategy) {\n throw new Error(`Authentication strategy '${strategyName}' is not found`);\n }\n\n try {\n const result = await this.refreshCookieSessionExclusive(strategyName, strategy);\n if (!result.succeed || !result.data?.user) {\n warnAuthLifecycle('Token refresh failed — clearing session', () => ({\n strategy: strategyName,\n }));\n this.clearSession();\n this.status.next(AXPSessionStatus.Expired);\n throw new Error('Token refresh failed');\n }\n return true;\n } catch (error) {\n warnAuthLifecycle('Token refresh error — clearing session', () => ({\n error: error instanceof Error ? error.message : String(error),\n }));\n this.clearSession();\n this.status.next(AXPSessionStatus.Expired);\n throw error;\n }\n }\n\n /**\n * One refresh at a time across tabs (Web Locks). Re-reads and writes session\n * metadata inside the lock so a peer tab never replays the same refresh `jti`.\n */\n private async refreshCookieSessionExclusive(\n strategyName: string,\n strategy: AXPAuthStrategy,\n ): Promise<AXPSignInResult> {\n return withAuthRefreshLock(async () => {\n const latest = this.getSessionData();\n if (!latest?.user || !latest.cookieSession) {\n return { succeed: false };\n }\n\n const activeStrategyName = latest.strategy?.trim() || strategyName;\n const activeStrategy =\n activeStrategyName === strategyName\n ? strategy\n : this.authStrategyRegistry.get(activeStrategyName);\n if (!activeStrategy) {\n return { succeed: false };\n }\n\n const refreshResult = await activeStrategy.refreshToken(this.getContext());\n if (!refreshResult?.succeed || !refreshResult.data?.user) {\n return { succeed: false };\n }\n\n const merged: AXPSignInResult = {\n succeed: true,\n data: {\n ...refreshResult.data,\n tenant: refreshResult.data.tenant ?? latest.tenant ?? null,\n application: refreshResult.data.application ?? latest.application ?? null,\n },\n };\n\n // Persist before releasing the lock so the next tab reads updated metadata.\n this.setSession({\n strategy: activeStrategyName,\n user: merged.data!.user,\n tenant: merged.data!.tenant ?? null,\n application: merged.data!.application ?? null,\n expiresIn: merged.data!.expiresIn,\n cookieSession: true,\n locked: latest.locked === true,\n });\n\n return merged;\n });\n }\n\n /**\n * Auth:GetAccessPolicy is only meaningful with tenant + application bound.\n * Skipping incomplete contexts cuts 2 redundant calls on the common login path.\n */\n private async reloadAccessPolicyIfReady(reason: string): Promise<void> {\n if (!this.hasCompleteSessionContext()) {\n this.permissionsSubject.next([]);\n this.featuresSubject.next([]);\n traceAuthAccessPolicy('Skipped GetAccessPolicy (incomplete workspace)', () => ({\n reason,\n tenantId: this.tenant?.id ?? null,\n applicationId: this.application?.id ?? null,\n }));\n return;\n }\n\n const startedAt = Date.now();\n await this.loadPermissions();\n await this.loadFeatures();\n traceAuthAccessPolicy('GetAccessPolicy loaded', () => ({\n reason,\n ms: Date.now() - startedAt,\n permissionCount: this.permissions.length,\n featureCount: this.features.length,\n tenantId: this.tenant?.id,\n applicationId: this.application?.id,\n }));\n if (reason === 'updateToken' && this.permissions.length === 0) {\n warnAuthAccessPolicy('GetAccessPolicy returned empty permissions after workspace bind', () => ({\n reason,\n tenantId: this.tenant?.id ?? null,\n applicationId: this.application?.id ?? null,\n featureCount: this.features.length,\n }));\n }\n }\n\n private async loadPermissions(): Promise<void> {\n try {\n const permissions = await this.permissionLoader.getList(this.getContext());\n this.permissionsSubject.next(permissions ?? []);\n } catch (error) {\n traceAuthLifecycleError('Load permissions failed', () => ({\n error: error instanceof Error ? error.message : String(error),\n }));\n warnAuthLifecycle('Load permissions failed — menus may be empty', () => ({\n error: error instanceof Error ? error.message : String(error),\n tenantId: this.tenant?.id ?? null,\n applicationId: this.application?.id ?? null,\n }));\n this.permissionsSubject.next([]);\n }\n }\n\n private async loadFeatures(): Promise<void> {\n try {\n const features = await this.featureLoader.getList(this.getContext());\n this.featuresSubject.next(features ?? []);\n } catch (error) {\n traceAuthLifecycleError('Load features failed', () => ({\n error: error instanceof Error ? error.message : String(error),\n }));\n this.featuresSubject.next([]);\n }\n }\n\n /** Shared ListTenants — used by guards and {@link tenants$}. */\n public async getTenantsList(): Promise<AXPTenant[]> {\n if (!this.hasSessionCredentials()) {\n return [];\n }\n const userId = this.user?.id ?? '';\n if (this.tenantsListCache?.userId === userId) {\n traceAuthCatalog('Tenants cache hit', () => ({\n userId,\n count: this.tenantsListCache!.items.length,\n }));\n return this.tenantsListCache.items;\n }\n\n const startedAt = Date.now();\n const items = await this.tenantLoader.getList(this.getContext());\n this.tenantsListCache = { userId, items };\n traceAuthCatalog('Tenants fetched', () => ({\n userId,\n count: items.length,\n ms: Date.now() - startedAt,\n }));\n return items;\n }\n\n /** Shared ListApplications — used by guards and {@link applications$}. */\n public async getApplicationsList(): Promise<AXPApplication[]> {\n if (!this.hasSessionCredentials() || !this.tenant?.id) {\n return [];\n }\n const tenantId = this.tenant.id;\n if (this.applicationsListCache?.tenantId === tenantId) {\n traceAuthCatalog('Applications cache hit', () => ({\n tenantId,\n count: this.applicationsListCache!.items.length,\n }));\n return this.applicationsListCache.items;\n }\n\n const startedAt = Date.now();\n const items = await this.applicationLoader.getList(this.getContext());\n this.applicationsListCache = { tenantId, items };\n traceAuthCatalog('Applications fetched', () => ({\n tenantId,\n count: items.length,\n ms: Date.now() - startedAt,\n }));\n return items;\n }\n\n private clearCatalogCaches(): void {\n this.tenantsListCache = null;\n this.applicationsListCache = null;\n }\n\n async signInComplete() {\n // Ensure we have the required data\n if (!this.user) {\n this.status.next(AXPSessionStatus.Unauthenticated);\n return;\n }\n\n // Set status to Authorized\n this.status.next(AXPSessionStatus.Authorized);\n }\n\n /** Tenant + application must be bound before menu, permissions, and features are fully valid. */\n private hasCompleteSessionContext(): boolean {\n return !!(this.tenant?.id && this.application?.id);\n }\n\n /**\n * Keeps session status aligned with context: Authenticated after sign-in / tenant pick,\n * Authorized only once tenant and application are selected and loaders have finished.\n */\n private async syncSessionAuthorization(): Promise<void> {\n if (!this.user) {\n this.status.next(AXPSessionStatus.Unauthenticated);\n return;\n }\n\n if (this.hasCompleteSessionContext()) {\n await this.signInComplete();\n return;\n }\n\n this.status.next(AXPSessionStatus.Authenticated);\n }\n\n public setSession(partial: Partial<AXPSessionData>): void {\n const existing = this.getSessionData() ?? { strategy: partial.strategy ?? 'user-pass' };\n const sessionData: AXPSessionData = {\n ...existing,\n ...partial,\n strategy: partial.strategy ?? existing.strategy ?? 'user-pass',\n };\n\n // Never persist tokens in browser storage — HttpOnly cookies are authoritative.\n delete (sessionData as { accessToken?: unknown }).accessToken;\n delete (sessionData as { refreshToken?: unknown }).refreshToken;\n delete (sessionData as { idToken?: unknown }).idToken;\n\n if (partial.user) {\n this.currentUserSubject.next(partial.user);\n }\n if ('tenant' in partial) {\n this.currentTenantSubject.next(partial.tenant ?? null);\n }\n if ('application' in partial) {\n this.currentApplicationSubject.next(partial.application ?? null);\n }\n localStorage.setItem(AXPSessionService.SESSION_KEY, JSON.stringify(sessionData));\n }\n\n /** Whether the client lock overlay should remain active after reload. */\n public isLocked(): boolean {\n return this.getSessionData()?.locked === true;\n }\n\n /** Persists client lock state inside {@link AXPSessionService.SESSION_KEY}. */\n public setLocked(locked: boolean): void {\n const existing = this.getSessionData();\n if (!existing) {\n return;\n }\n\n this.setSession({ locked });\n }\n\n public setStrategy(strategy: string): void {\n setOAuthPendingStrategy(strategy);\n const sessionData = this.getSessionData();\n // Do not invent a persisted session from strategy alone (pre-login).\n // That leaves a partial AXP_SESSION and can break splash restore after a failed sign-in.\n if (!sessionData?.user && !sessionData?.cookieSession) {\n this.setSession({ strategy, user: null, tenant: null, application: null, cookieSession: false });\n return;\n }\n this.setSession({ ...sessionData, strategy });\n }\n\n /** Session strategy, or pending OAuth strategy left for the callback page. */\n private resolveStrategyName(): string | null {\n return this.getSessionData()?.strategy?.trim() || getOAuthPendingStrategy();\n }\n\n public getSessionData(): AXPSessionData | null {\n try {\n const sessionDataString = localStorage.getItem(AXPSessionService.SESSION_KEY);\n if (sessionDataString) {\n const sessionData = JSON.parse(sessionDataString);\n\n return sessionData;\n } else {\n return null;\n }\n } catch (error) {\n localStorage.removeItem(AXPSessionService.SESSION_KEY);\n return null;\n }\n }\n\n private clearSession(): void {\n this.invalidateAccessPolicyCache();\n this.clearCatalogCaches();\n this.status.next(AXPSessionStatus.Unauthenticated);\n this.currentUserSubject.next(null);\n this.currentTenantSubject.next(null);\n this.currentApplicationSubject.next(null);\n this.permissionsSubject.next([]);\n this.featuresSubject.next([]);\n localStorage.removeItem(AXPSessionService.SESSION_KEY);\n clearOAuthPendingStrategy();\n }\n\n /** Keeps in-memory subjects aligned with persisted session (e.g. after user switch). */\n private syncContextSubjectsFromStorage(): void {\n const session = this.getSessionData();\n if (!session) {\n return;\n }\n\n const sessionUser = session.user ?? null;\n if (sessionUser?.id !== this.currentUserSubject.value?.id) {\n this.currentUserSubject.next(sessionUser);\n }\n\n const sessionTenant = session.tenant ?? null;\n if (sessionTenant?.id !== this.currentTenantSubject.value?.id) {\n this.currentTenantSubject.next(sessionTenant);\n }\n\n const sessionApplication = session.application ?? null;\n if (sessionApplication?.id !== this.currentApplicationSubject.value?.id) {\n this.currentApplicationSubject.next(sessionApplication);\n }\n }\n\n public authorize(...keys: string[]): boolean {\n // Calculate base result\n const baseResult = keys.every((k) => {\n if (isEmpty(k)) return true;\n\n // Check if user has the permission\n const hasPermission = this.permissions.indexOf(k) > -1;\n if (!hasPermission) return false;\n\n // Check if permission has required features (if permission definition service is available)\n // Note: This is a lightweight check. Full feature validation happens in permission definition service.\n return true;\n });\n\n // If permission checker is provided, use it to potentially override the result\n if (this.permissionChecker) {\n const context = this.getContext();\n return this.permissionChecker.check(keys, context, baseResult);\n }\n\n return baseResult;\n }\n\n public isFeatureEnabled(...keys: string[]): boolean {\n // Calculate base result\n const baseResult = keys.every((k) => isEmpty(k) || this.features.some((c) => c.name == k && c.value == true));\n\n // If feature checker is provided, use it to potentially override the result\n if (this.featureChecker) {\n const context = this.getContext();\n return this.featureChecker.check(keys, context, baseResult);\n }\n\n return baseResult;\n }\n\n /**\n * Checks if a module is enabled for the current tenant/application.\n * Module names are stored as features with value: true when enabled.\n * Module names can be provided in PascalCase (e.g., 'SecurityManagement') or kebab-case (e.g., 'security-management').\n */\n public isModuleEnabled(moduleName: string): boolean {\n if (!moduleName) {\n return false;\n }\n\n // Normalize module name: convert kebab-case to PascalCase if needed\n const normalizedModuleName = moduleName.includes('-')\n ? moduleName.split('-').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join('')\n : moduleName;\n\n // Module names are stored as features with value: true when enabled\n return this.features.some(f => f.name === normalizedModuleName && f.value === true);\n }\n\n /**\n * Access tokens are HttpOnly and not readable from JS.\n * Use {@link hasSessionCredentials} for auth gating.\n */\n public getToken(): string | undefined {\n return undefined;\n }\n\n /** True when the SPA has an active cookie-backed session. */\n public hasSessionCredentials(): boolean {\n return this.getSessionData()?.cookieSession === true && this.isAuthenticated;\n }\n\n public getContext(): AXPSessionContext {\n return new AXPSessionContext({\n user: this.user,\n tenant: this.tenant,\n application: this.application,\n });\n }\n\n private invalidateAccessPolicyCache(): void {\n this.accessPolicyCache?.invalidate();\n }\n\n private isApplicationContextUpdate(params?: { [key: string]: unknown }): boolean {\n return params?.['application'] != null || params?.['applicationId'] != null;\n }\n\n private isTenantContextUpdate(params?: { [key: string]: unknown }): boolean {\n return params?.['tenant'] != null || params?.['tenantId'] != null;\n }\n\n private resolveApplicationAfterUpdate(\n fromToken: AXPApplication | null,\n isApplicationUpdate: boolean,\n isTenantUpdate: boolean,\n ): AXPApplication | null {\n if (isApplicationUpdate) {\n return fromToken;\n }\n if (isTenantUpdate) {\n return null;\n }\n return fromToken;\n }\n\n private isAuthenticatedStatus(status: AXPSessionStatus): boolean {\n return status === AXPSessionStatus.Authenticated || status === AXPSessionStatus.Authorized;\n }\n}\n","import { Directive, Input, TemplateRef, ViewContainerRef, inject, signal } from '@angular/core';\nimport { Subscription, combineLatest } from 'rxjs';\nimport { AXPSessionService } from '../session.service';\n\n@Directive({\n selector: '[permission]',\n standalone: false\n})\nexport class AXPPermissionDirective {\n private hasView = signal(false);\n private subscription!: Subscription;\n private sessionService = inject(AXPSessionService);\n\n constructor(\n private templateRef: TemplateRef<any>,\n private viewContainer: ViewContainerRef\n ) { }\n\n @Input()\n public set permission(permissionKeys: string | string[] | null) {\n const keys: string[] = !permissionKeys ? [] : (Array.isArray(permissionKeys) ? permissionKeys : [permissionKeys]);\n if (keys.length == 0) {\n // If permissionKey is null or empty, decide the default behavior here\n this.viewContainer.createEmbeddedView(this.templateRef);\n this.hasView.set(true);\n return;\n }\n this.subscription = combineLatest([\n this.sessionService.isAuthorized$,\n this.sessionService.permissions$,\n ]).subscribe(([isAuthorized]) => {\n if (isAuthorized && this.sessionService.authorize(...keys)) {\n if (!this.hasView()) {\n this.viewContainer.createEmbeddedView(this.templateRef);\n this.hasView.set(true);\n }\n } else {\n this.viewContainer.clear();\n this.hasView.set(false);\n }\n });\n }\n\n @Input()\n public set permissionElse(elseTemplateRef: TemplateRef<any>) {\n if (!this.hasView()) {\n this.viewContainer.createEmbeddedView(elseTemplateRef);\n }\n }\n\n ngOnDestroy() {\n this.subscription?.unsubscribe();\n }\n}\n","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivateFn, RouterStateSnapshot } from '@angular/router';\nimport { first, map } from 'rxjs';\nimport { AXPUnauthorizedError } from '../contracts/errors.types';\nimport { AXPSessionService } from '../session.service';\n\nexport const AXPPermissionGuard: CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n const sessionService = inject(AXPSessionService);\n\n const permissionKeys = route.data['requiredPermission'] as string | string[] | null;\n\n return sessionService.isAuthorizedWithLoading$.pipe(\n first(),\n map((value) => {\n const keys: string[] = !permissionKeys ? [] : Array.isArray(permissionKeys) ? permissionKeys : [permissionKeys];\n const hasPermission = keys.length == 0 || sessionService.authorize(...keys);\n if (!hasPermission) {\n throw new AXPUnauthorizedError(\n `Access denied. Required permissions: ${keys.join(', ')}. Please contact your administrator if you believe this is an error.`,\n {\n redirectUrl: state.url,\n },\n );\n }\n return true;\n }),\n );\n};\n","import { AXPPermissionDefinition, AXPPermissionGroupDefinition } from './permission.types';\n\n//#region ----- Types -----\n\nexport type AXPPermissionGroupAddOptions = {\n /** Parent group name — makes this group a right-panel section under that root. */\n parent?: string;\n /** Sort order among sibling sections (lower first). */\n order?: number;\n};\n\nexport type AXPPermissionAddOptions = {\n /** Required feature flags for this permission to appear. */\n requiredFeatures?: string[];\n /**\n * Edition module names this permission belongs to.\n * Availability uses ANY-match against the tenant application edition modules.\n */\n modules?: string[];\n};\n\n//#endregion\n\n//#region ----- Context -----\n\nexport class AXPPermissionDefinitionProviderContext {\n private builders: Map<string, AXPPermissionDefinitionGroupBuilder> = new Map();\n\n addGroup(\n name: string,\n title: string,\n description?: string,\n options?: AXPPermissionGroupAddOptions,\n ): AXPPermissionDefinitionGroupBuilder {\n if (this.isGroupDefined(name)) {\n const existing = this.findGroup(name)!;\n if (options?.parent && !existing.group.parent) {\n existing.group.parent = options.parent;\n }\n if (options?.order != null && existing.group.order == null) {\n existing.group.order = options.order;\n }\n return existing;\n }\n const group: AXPPermissionGroupDefinition = {\n name,\n title,\n description,\n parent: options?.parent,\n order: options?.order,\n permissions: [],\n };\n const builder = new AXPPermissionDefinitionGroupBuilder(this, group);\n this.builders.set(name, builder);\n return builder;\n }\n\n getGroupDefinitions(): AXPPermissionGroupDefinition[] {\n return Array.from(this.builders.values()).map((b) => b.group);\n }\n\n findGroup(name: string): AXPPermissionDefinitionGroupBuilder | undefined {\n return this.builders.get(name);\n }\n\n isGroupDefined(name: string): boolean {\n return this.builders.has(name);\n }\n}\n\n//#endregion\n\n//#region ----- Group Builder -----\n\nexport class AXPPermissionDefinitionGroupBuilder {\n private context: AXPPermissionDefinitionProviderContext;\n private _group: AXPPermissionGroupDefinition;\n\n public get group(): AXPPermissionGroupDefinition {\n return this._group;\n }\n\n constructor(context: AXPPermissionDefinitionProviderContext, group: AXPPermissionGroupDefinition) {\n this.context = context;\n this._group = group;\n }\n\n addPermission(\n name: string,\n title: string,\n description?: string,\n options?: AXPPermissionAddOptions | string[],\n ): AXPPermissionDefinitionBuilder {\n const normalized = normalizePermissionAddOptions(options);\n const existing = this._group.permissions.find((p) => p.name === name);\n if (existing) {\n mergePermissionOptions(existing, normalized);\n return new AXPPermissionDefinitionBuilder(this, existing);\n }\n const permission: AXPPermissionDefinition = {\n name,\n title,\n description,\n children: [],\n requiredFeatures: normalized.requiredFeatures,\n modules: normalized.modules,\n };\n this._group.permissions.push(permission);\n return new AXPPermissionDefinitionBuilder(this, permission);\n }\n\n endGroup(): AXPPermissionDefinitionProviderContext {\n return this.context;\n }\n\n findPermission(_path: string): AXPPermissionDefinition | undefined {\n return undefined;\n }\n\n findGroup(_name: string): AXPPermissionDefinitionGroupBuilder | undefined {\n return undefined;\n }\n}\n\n//#endregion\n\n//#region ----- Permission Builder -----\n\nexport class AXPPermissionDefinitionBuilder {\n private groupBuilder: AXPPermissionDefinitionGroupBuilder;\n private permission: AXPPermissionDefinition;\n\n constructor(groupBuilder: AXPPermissionDefinitionGroupBuilder, permission: AXPPermissionDefinition) {\n this.groupBuilder = groupBuilder;\n this.permission = permission;\n }\n\n addChild(\n name: string,\n title: string,\n description?: string,\n options?: AXPPermissionAddOptions | string[],\n ): AXPPermissionDefinitionBuilder {\n const normalized = normalizePermissionAddOptions(options);\n const existing = this.permission.children.find((p) => p.name === name);\n if (existing) {\n mergePermissionOptions(existing, normalized);\n return this;\n }\n const permission: AXPPermissionDefinition = {\n name,\n title,\n description,\n children: [],\n requiredFeatures: normalized.requiredFeatures,\n modules: normalized.modules,\n };\n this.permission.children.push(permission);\n return this;\n }\n\n /**\n * Set required features for this permission.\n * @param features - Array of feature names (e.g., ['PlatformManagement.menu-customization'])\n */\n requireFeatures(...features: string[]): AXPPermissionDefinitionBuilder {\n this.permission.requiredFeatures = features;\n return this;\n }\n\n /**\n * Set edition module ownership for this permission (ANY-match for availability).\n */\n modules(...moduleNames: string[]): AXPPermissionDefinitionBuilder {\n this.permission.modules = moduleNames;\n return this;\n }\n\n endPermission(): AXPPermissionDefinitionGroupBuilder {\n return this.groupBuilder;\n }\n}\n\n//#endregion\n\n//#region ----- Helpers -----\n\nfunction normalizePermissionAddOptions(\n options?: AXPPermissionAddOptions | string[],\n): AXPPermissionAddOptions {\n if (!options) {\n return {};\n }\n // Legacy: 4th argument was `requiredFeatures: string[]`\n if (Array.isArray(options)) {\n return { requiredFeatures: options };\n }\n return options;\n}\n\nfunction mergePermissionOptions(\n target: AXPPermissionDefinition,\n options: AXPPermissionAddOptions,\n): void {\n if (options.requiredFeatures?.length) {\n const set = new Set([...(target.requiredFeatures ?? []), ...options.requiredFeatures]);\n target.requiredFeatures = Array.from(set);\n }\n if (options.modules?.length) {\n const set = new Set([...(target.modules ?? []), ...options.modules]);\n target.modules = Array.from(set);\n }\n}\n\n//#endregion\n","import { inject, Injectable, InjectionToken } from '@angular/core';\nimport { AXPPermissionDefinition, AXPPermissionGroupDefinition } from './permission.types';\nimport { AXPPermissionDefinitionProviderContext } from './permission-definition.builder';\nimport { AXPSessionService } from '../session.service';\n\nexport interface AXPPermissionDefinitionProvider {\n define(context: AXPPermissionDefinitionProviderContext): Promise<void>;\n}\n\n/** Resolves edition module names for a permission key (product map). */\nexport type AXPPermissionModulesResolver = (permissionKey: string) => readonly string[];\n\nexport const AXP_PERMISSION_DEFINITION_PROVIDER = new InjectionToken<AXPPermissionDefinitionProvider[]>(\n 'AXP_PERMISSION_DEFINITION_PROVIDER',\n {\n providedIn: 'root',\n factory: () => {\n return [];\n },\n },\n);\n\nexport const AXP_PERMISSION_MODULES_RESOLVER = new InjectionToken<AXPPermissionModulesResolver>(\n 'AXP_PERMISSION_MODULES_RESOLVER',\n);\n\n@Injectable({ providedIn: 'root' })\nexport class AXPPermissionDefinitionService {\n private providers = inject(AXP_PERMISSION_DEFINITION_PROVIDER, { optional: true });\n private modulesResolver = inject(AXP_PERMISSION_MODULES_RESOLVER, { optional: true });\n private sessionService = inject(AXPSessionService);\n private cache: AXPPermissionGroupDefinition[] | null = null;\n /** Invalidates cache when the session edition modules/features change (e.g. app switch). */\n private cacheAvailabilityKey: string | null = null;\n\n private buildAvailabilityKey(): string {\n const enabled = this.sessionService.features\n .filter((feature) => feature.value === true && !!feature.name)\n .map((feature) => feature.name)\n .sort();\n const applicationId = this.sessionService.application?.id ?? '';\n const tenantId = this.sessionService.tenant?.id ?? '';\n return `${tenantId}|${applicationId}|${enabled.join(',')}`;\n }\n\n private async load(): Promise<void> {\n const availabilityKey = this.buildAvailabilityKey();\n if (this.cache && this.cacheAvailabilityKey === availabilityKey) {\n return;\n }\n this.cacheAvailabilityKey = availabilityKey;\n const context = new AXPPermissionDefinitionProviderContext();\n\n if (Array.isArray(this.providers)) {\n for (const provider of this.providers) {\n if (provider instanceof Promise) {\n const resolvedProvider = await provider;\n await resolvedProvider.define(context);\n } else {\n await provider.define(context);\n }\n }\n }\n\n const allGroups = context.getGroupDefinitions().map((group) => this.enrichGroupModules(group));\n this.cache = this.filterUnavailablePermissions(allGroups);\n }\n\n /** Attach modules[] from the product resolver when providers omitted them. */\n private enrichGroupModules(group: AXPPermissionGroupDefinition): AXPPermissionGroupDefinition {\n return {\n ...group,\n permissions: group.permissions.map((permission) => this.enrichPermissionModules(permission)),\n };\n }\n\n private enrichPermissionModules(permission: AXPPermissionDefinition): AXPPermissionDefinition {\n const resolved =\n permission.modules?.length || !this.modulesResolver\n ? permission.modules\n : [...this.modulesResolver(permission.name)];\n return {\n ...permission,\n modules: resolved,\n children: (permission.children ?? []).map((child) => this.enrichPermissionModules(child)),\n };\n }\n\n /**\n * Filter permissions by edition modules (ANY-match) and required features.\n * Keeps parent groups that still have at least one child section with permissions.\n */\n private filterUnavailablePermissions(groups: AXPPermissionGroupDefinition[]): AXPPermissionGroupDefinition[] {\n const filtered = groups.map((group) => ({\n ...group,\n permissions: this.filterPermissions(group.permissions),\n }));\n\n const withPermissions = new Set(filtered.filter((g) => g.permissions.length > 0).map((g) => g.name));\n const parentsOfKept = new Set(\n filtered.filter((g) => withPermissions.has(g.name) && g.parent).map((g) => g.parent as string),\n );\n\n return filtered.filter((g) => withPermissions.has(g.name) || parentsOfKept.has(g.name));\n }\n\n private filterPermissions(permissions: AXPPermissionDefinition[]): AXPPermissionDefinition[] {\n return permissions\n .filter((permission) => {\n if (permission.modules?.length) {\n const anyModuleEnabled = permission.modules.some((moduleName) =>\n this.sessionService.isModuleEnabled(moduleName),\n );\n if (!anyModuleEnabled) {\n return false;\n }\n }\n if (permission.requiredFeatures && permission.requiredFeatures.length > 0) {\n const allFeaturesEnabled = permission.requiredFeatures.every((featureName) =>\n this.sessionService.isFeatureEnabled(featureName),\n );\n if (!allFeaturesEnabled) {\n return false;\n }\n }\n return true;\n })\n .map((permission) => ({\n ...permission,\n children: this.filterPermissions(permission.children),\n }));\n }\n\n public async reload(): Promise<void> {\n this.cache = null;\n this.cacheAvailabilityKey = null;\n await this.load();\n }\n\n public async getGroups(): Promise<AXPPermissionGroupDefinition[]> {\n await this.load();\n return this.cache ?? [];\n }\n\n public async getPermissions(): Promise<AXPPermissionDefinition[]> {\n await this.load();\n return this.cache?.flatMap((g) => g.permissions) ?? [];\n }\n\n public async getGroup(name: string): Promise<AXPPermissionGroupDefinition | null> {\n await this.load();\n return this.cache?.find((g) => g.name === name) ?? null;\n }\n\n public async getPermission(name: string): Promise<AXPPermissionDefinition | null> {\n await this.load();\n for (const group of this.cache ?? []) {\n const found = this.findPermissionRecursive(group.permissions, name);\n if (found) {\n return found;\n }\n }\n return null;\n }\n\n private findPermissionRecursive(\n permissions: AXPPermissionDefinition[],\n name: string,\n ): AXPPermissionDefinition | null {\n for (const permission of permissions) {\n if (permission.name === name) {\n return permission;\n }\n const child = this.findPermissionRecursive(permission.children ?? [], name);\n if (child) {\n return child;\n }\n }\n return null;\n }\n}\n","import { AXPExpressionEvaluatorScopeProvider, AXPExpressionEvaluatorScopeProviderContext } from \"@acorex-platform/framework-shared/core\";\nimport { inject } from \"@angular/core\";\nimport { AXPSessionService } from \"../session.service\";\n\nexport class AXPPermissionEvaluatorScopeProvider implements AXPExpressionEvaluatorScopeProvider {\n\n protected sessionService = inject(AXPSessionService);\n\n async provide(context: AXPExpressionEvaluatorScopeProviderContext): Promise<void> {\n context.addScope('permission', {\n /**\n * Check if the current user has all specified permissions\n * @param permissions - Single permission string or array of permission strings\n * @returns boolean - true if user has all permissions, false otherwise\n */\n check: (...permissions: string[]) => {\n return this.sessionService.authorize(...permissions);\n },\n\n /**\n * Check if the current user has any of the specified permissions\n * @param permissions - Array of permission strings\n * @returns boolean - true if user has any of the permissions, false otherwise\n */\n checkAny: (...permissions: string[]) => {\n return permissions.some(p => this.sessionService.authorize(p));\n },\n });\n }\n} ","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivateFn, RouterStateSnapshot } from '@angular/router';\nimport { first, map } from 'rxjs';\nimport { AXPUnauthenticatedError } from './contracts/errors.types';\nimport { AXPSessionService } from './session.service';\n\nexport const AXPAuthGuard: CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n const sessionService = inject(AXPSessionService);\n return sessionService.isAuthenticatedWithLoading$.pipe(\n first(),\n map((value) => {\n if (value) {\n return true;\n }\n throw new AXPUnauthenticatedError(\n `Access denied. You are not currently logged in. Please log in to access this page. If you continue to see this message after logging in, please contact support.`,\n {\n redirectUrl: state.url,\n },\n );\n }),\n );\n};\n","import { Inject, ModuleWithProviders, NgModule, Optional, inject } from '@angular/core';\nimport {\n AXP_APP_STARTUP_PRIORITY,\n AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,\n AXP_SESSION_SERVICE,\n provideAppStartUpTask,\n} from '@acorex-platform/framework-client/core';\nimport { AXPAuthStrategyRegistryService } from './auth-registry.service';\nimport { AXPAuthStrategy } from './auth.strategy';\nimport { AXPFeatureDirective, AXPFeatureEvaluatorScopeProvider } from './feature';\nimport { AXPPermissionDirective } from './permission/permission.directive';\nimport { AXPPermissionEvaluatorScopeProvider } from './permission/permission-evaluator-scope.provider';\nimport { AXPSessionService } from './session.service';\n\nexport interface AXPAuthModuleConfigs {\n strategies: (new () => AXPAuthStrategy)[];\n}\n\n@NgModule({\n imports: [],\n exports: [AXPPermissionDirective, AXPFeatureDirective],\n declarations: [AXPPermissionDirective, AXPFeatureDirective],\n providers: [\n provideAppStartUpTask(() => {\n const service = inject(AXPSessionService);\n return {\n name: 'session-restore',\n priority: AXP_APP_STARTUP_PRIORITY.sessionRestore,\n run: async () => {\n try {\n await service.restoreSession();\n } catch (error) {\n console.error(error);\n }\n },\n };\n }),\n {\n provide: AXP_SESSION_SERVICE,\n useExisting: AXPSessionService,\n },\n {\n provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,\n useClass: AXPFeatureEvaluatorScopeProvider,\n multi: true,\n },\n {\n provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,\n useClass: AXPPermissionEvaluatorScopeProvider,\n multi: true,\n },\n ],\n})\nexport class AXPAuthModule {\n static forRoot(configs?: AXPAuthModuleConfigs): ModuleWithProviders<AXPAuthModule> {\n return {\n ngModule: AXPAuthModule,\n providers: [\n ...(configs?.strategies || []),\n {\n provide: 'AXPAuthModuleFactory',\n useFactory: (registry: AXPAuthStrategyRegistryService) => () => {\n registry.register(...(configs?.strategies || []));\n },\n deps: [AXPAuthStrategyRegistryService],\n multi: true,\n },\n ],\n };\n }\n\n static forChild(configs?: AXPAuthModuleConfigs): ModuleWithProviders<AXPAuthModule> {\n return {\n ngModule: AXPAuthModule,\n providers: [\n ...(configs?.strategies || []),\n {\n provide: 'AXPAuthModuleFactory',\n useFactory: (registry: AXPAuthStrategyRegistryService) => () => {\n registry.register(...(configs?.strategies || []));\n },\n deps: [AXPAuthStrategyRegistryService],\n multi: true,\n },\n ],\n };\n }\n\n /**\n * @ignore\n */\n constructor(@Optional() @Inject('AXPAuthModuleFactory') instances: any[]) {\n instances?.forEach((f) => {\n f();\n });\n }\n}\n","import { AXPApplication } from './application/application.types';\nimport { AXPSessionContext } from './contracts/session.types';\nimport { AXPTenant } from './tenant/tenant.types';\nimport { AXPUser } from './user/user.types';\n\n//#region ----- Types -----\n\nexport interface AXPBaseCredentials {\n strategy: string;\n [key: string]: string | boolean | undefined;\n}\n\nexport interface AXPTokenResult {\n /** Present only for non-browser clients; SPA uses HttpOnly cookies. */\n accessToken?: string;\n expiresIn?: string | null;\n refreshToken?: string;\n idToken?: string;\n tenant?: AXPTenant | null;\n application?: AXPApplication | null;\n}\n\nexport interface AXPSignInResult {\n succeed: boolean;\n data?: {\n /** Present only for non-browser clients; SPA uses HttpOnly cookies. */\n accessToken?: string;\n idToken?: string | null;\n expiresIn?: string | null;\n refreshToken?: string;\n user: AXPUser;\n tenant?: AXPTenant | null;\n application?: AXPApplication | null;\n };\n}\n\nexport abstract class AXPAuthStrategy {\n abstract get name(): string;\n abstract signin(credentials: AXPBaseCredentials): Promise<AXPSignInResult | void>;\n abstract signout(): Promise<void>;\n abstract refreshToken(context: AXPSessionContext): Promise<AXPSignInResult>;\n abstract updateToken(params?: { [key: string]: any }): Promise<AXPSignInResult | void>;\n}\n\n/**\n * Client-persisted session metadata. Tokens are never stored here — they live in HttpOnly cookies.\n */\nexport interface AXPSessionData {\n strategy: string;\n user?: AXPUser | null;\n tenant?: AXPTenant | null;\n application?: AXPApplication | null;\n expiresIn?: string | null;\n /** When true, the client lock overlay stays active until PIN/password unlock or sign-out. */\n locked?: boolean;\n /** True when the server issued HttpOnly auth cookies for this session. */\n cookieSession?: boolean;\n}\n\n//#endregion\n","//#region ---- JWT Utility ----\n\n/**\n * Utility class for JWT token operations\n */\nexport class JwtUtil {\n /**\n * Parses a JWT token and returns the payload\n */\n static parseJwt(token: string): any {\n try {\n const base64Url = token.split('.')[1];\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split('')\n .map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))\n .join('')\n );\n return JSON.parse(jsonPayload);\n } catch (error) {\n throw new Error('Invalid JWT token');\n }\n }\n}\n\n//#endregion\n\n//#region ---- PKCE Utility ----\n\n/**\n * Utility class for PKCE (Proof Key for Code Exchange) operations\n */\nexport class PkceUtil {\n /**\n * Generates a random string for PKCE code verifier\n */\n static generateRandomString(length: number): string {\n const array = new Uint8Array(length);\n crypto.getRandomValues(array);\n return this.base64UrlEncode(array);\n }\n\n /**\n * Generates PKCE code challenge from verifier\n */\n static async generateCodeChallenge(codeVerifier: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(codeVerifier);\n const digest = await crypto.subtle.digest('SHA-256', data);\n return this.base64UrlEncode(new Uint8Array(digest));\n }\n\n /**\n * Base64 URL encoding for PKCE\n */\n private static base64UrlEncode(array: Uint8Array): string {\n return btoa(String.fromCharCode(...array))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n }\n}\n\n//#endregion\n\n//#region ---- Time Utility ----\n\n/**\n * Utility class for time and date operations\n */\nexport class TimeUtil {\n /**\n * Calculates the time difference in milliseconds between a future date and now\n */\n static expiresInMilliseconds(expiresInDate: string): number {\n return new Date(expiresInDate).getTime() - new Date().getTime();\n }\n\n /**\n * Calculates expiration date from seconds\n */\n static calculateExpireInDate(expireInSeconds: number): string {\n return new Date(Date.now() + expireInSeconds * 1000).toISOString();\n }\n}\n\n//#endregion ","import type { AXPApplication } from './application/application.types';\nimport type { AXPSessionContext } from './contracts/session.types';\nimport type { AXPSignInResult } from './auth.strategy';\nimport type { AXPTenant } from './tenant/tenant.types';\nimport type { AXPUser } from './user/user.types';\nimport { TimeUtil } from './auth.utils';\nimport type { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\n\n//#region ---- Platform OAuth session update (tenant / application binding) ----\n\nexport interface PlatformAuthTokenResponseDto {\n accessToken: string;\n refreshToken: string;\n expiresIn?: string;\n id_token?: string | null;\n user: AXPUser;\n tenant?: { id: string; name?: string; title?: AXPMultiLanguageString } | null;\n application?: { id: string; name?: string; title?: AXPMultiLanguageString } | null;\n}\n\nexport function platformOAuthSessionUpdateParams(params: {\n [key: string]: unknown;\n}): {\n tenant?: AXPTenant;\n application?: AXPApplication;\n tenantId?: string;\n applicationId?: string;\n} {\n const tenant = params['tenant'] as AXPTenant | undefined;\n const application = params['application'] as AXPApplication | undefined;\n\n return {\n tenant,\n application,\n tenantId: (params['tenantId'] as string | undefined) ?? tenant?.id,\n applicationId: (params['applicationId'] as string | undefined) ?? application?.id,\n };\n}\n\nexport function shouldPlatformOAuthBindSession(\n hasCredentials: boolean,\n params: { [key: string]: unknown },\n): boolean {\n if (!hasCredentials) {\n return false;\n }\n\n const { tenant, application, tenantId, applicationId } = platformOAuthSessionUpdateParams(params);\n return Boolean(tenantId || applicationId || tenant || application);\n}\n\nexport function toPlatformOAuthSignInResult(\n result: PlatformAuthTokenResponseDto,\n context?: Partial<AXPSessionContext>,\n): AXPSignInResult {\n const tenant = mergeTenant(mapPlatformTenant(result.tenant), context?.tenant ?? null);\n const application = mergeApplication(mapPlatformApplication(result.application), context?.application ?? null);\n\n return {\n succeed: true,\n data: {\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n idToken: result.id_token ?? null,\n expiresIn: parsePlatformExpiresIn(result.expiresIn),\n user: result.user,\n tenant,\n application,\n },\n };\n}\n\nfunction mapPlatformTenant(value: PlatformAuthTokenResponseDto['tenant']): AXPTenant | null {\n if (!value?.id) {\n return null;\n }\n\n return {\n id: value.id,\n name: value.name ?? value.id,\n title: value.title ?? value.name ?? value.id,\n };\n}\n\nfunction mapPlatformApplication(value: PlatformAuthTokenResponseDto['application']): AXPApplication | null {\n if (!value?.id) {\n return null;\n }\n\n return {\n id: value.id,\n name: value.name ?? value.id,\n title: value.title ?? value.name ?? value.id,\n };\n}\n\nfunction mergeTenant(mapped: AXPTenant | null, contextTenant: AXPTenant | null): AXPTenant | null {\n if (!mapped && !contextTenant) {\n return null;\n }\n\n if (!mapped) {\n return contextTenant;\n }\n\n if (!contextTenant) {\n return mapped;\n }\n\n return {\n ...contextTenant,\n ...mapped,\n title: mapped.title && mapped.title !== mapped.id ? mapped.title : contextTenant.title || mapped.title,\n name: mapped.name && mapped.name !== mapped.id ? mapped.name : contextTenant.name || mapped.name,\n };\n}\n\nfunction mergeApplication(\n mapped: AXPApplication | null,\n contextApplication: AXPApplication | null,\n): AXPApplication | null {\n if (!mapped && !contextApplication) {\n return null;\n }\n\n if (!mapped) {\n return contextApplication;\n }\n\n if (!contextApplication) {\n return mapped;\n }\n\n return {\n ...contextApplication,\n ...mapped,\n title: mapped.title && mapped.title !== mapped.id ? mapped.title : contextApplication.title || mapped.title,\n name: mapped.name && mapped.name !== mapped.id ? mapped.name : contextApplication.name || mapped.name,\n };\n}\n\nfunction parsePlatformExpiresIn(expiresIn?: string): string {\n if (!expiresIn) {\n return TimeUtil.calculateExpireInDate(0);\n }\n\n const asDate = new Date(expiresIn);\n if (!Number.isNaN(asDate.getTime())) {\n return asDate.toISOString();\n }\n\n return TimeUtil.calculateExpireInDate(Number(expiresIn) || 0);\n}\n\n//#endregion\n","//#region ---- Platform OAuth helpers (PKCE + /connect/*) ----\n\nexport interface AXPPlatformOAuthDiscoveryDocument {\n issuer?: string;\n authorization_endpoint?: string;\n token_endpoint?: string;\n jwks_uri?: string;\n}\n\nexport interface AXPPlatformOAuthClientConfig {\n clientId: string;\n redirectUri: string;\n scope: string;\n}\n\nexport const AXP_DEFAULT_PLATFORM_OAUTH_CLIENT_ID = 'acorex';\nexport const AXP_DEFAULT_PLATFORM_OAUTH_SCOPE = 'openid profile email offline_access';\nexport const AXP_PLATFORM_OAUTH_CSRF_COOKIE = 'acx_csrf_token';\n\nexport function resolvePlatformOAuthIssuer(baseUrl?: string): string {\n const issuer = baseUrl?.replace(/\\/$/, '');\n if (!issuer) {\n throw new Error('API baseUrl is not configured');\n }\n return issuer;\n}\n\nexport function resolvePlatformOAuthRedirectUri(): string {\n return `${window.location.origin}/auth/oauth-callback`;\n}\n\nexport function resolvePlatformOAuthClientConfig(\n authConfig?: {\n clientId?: string;\n client_id?: string;\n redirectUri?: string;\n scope?: string;\n } | null,\n): AXPPlatformOAuthClientConfig {\n return {\n clientId: authConfig?.clientId ?? authConfig?.client_id ?? AXP_DEFAULT_PLATFORM_OAUTH_CLIENT_ID,\n redirectUri: authConfig?.redirectUri ?? resolvePlatformOAuthRedirectUri(),\n scope: authConfig?.scope ?? AXP_DEFAULT_PLATFORM_OAUTH_SCOPE,\n };\n}\n\nexport function readPlatformOAuthCsrfToken(): string | null {\n const match = document.cookie.match(\n new RegExp(`(?:^|; )${AXP_PLATFORM_OAUTH_CSRF_COOKIE.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}=([^;]*)`),\n );\n if (!match?.[1]) {\n return null;\n }\n try {\n return decodeURIComponent(match[1]);\n } catch {\n return match[1];\n }\n}\n\nexport async function fetchPlatformOAuthDiscoveryDocument(\n issuer: string,\n): Promise<AXPPlatformOAuthDiscoveryDocument> {\n const response = await fetch(`${issuer}/.well-known/openid-configuration`);\n if (!response.ok) {\n throw new Error(`Failed to load OpenID discovery document: ${response.status} ${response.statusText}`);\n }\n return (await response.json()) as AXPPlatformOAuthDiscoveryDocument;\n}\n\nexport function resolvePlatformOAuthAuthorizeEndpoint(\n issuer: string,\n discovery?: AXPPlatformOAuthDiscoveryDocument | null,\n): string {\n return discovery?.authorization_endpoint ?? `${issuer}/connect/authorize`;\n}\n\nexport function resolvePlatformOAuthTokenEndpoint(\n issuer: string,\n discovery?: AXPPlatformOAuthDiscoveryDocument | null,\n): string {\n return discovery?.token_endpoint ?? `${issuer}/connect/token`;\n}\n\n/**\n * BFF: server generates PKCE verifier/challenge and returns the platform authorize URL.\n * Verifier never touches browser localStorage.\n */\nexport async function initPlatformOAuthAuthorization(input: {\n issuer: string;\n clientId: string;\n redirectUri: string;\n scope: string;\n provider: string;\n}): Promise<{ authorizeUrl: string }> {\n const response = await fetch(`${input.issuer}/connect/authorize/init`, {\n method: 'POST',\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n client_id: input.clientId,\n redirect_uri: input.redirectUri,\n scope: input.scope,\n identity_provider: input.provider,\n }),\n });\n\n if (!response.ok) {\n const detail = await response.text().catch(() => '');\n throw new Error(\n `OAuth authorize init failed: ${response.status} ${response.statusText}${detail ? ` — ${detail}` : ''}`,\n );\n }\n\n return (await response.json()) as { authorizeUrl: string };\n}\n\nexport async function exchangePlatformOAuthAuthorizationCode(input: {\n issuer: string;\n tokenEndpoint?: string;\n clientId: string;\n redirectUri: string;\n code: string;\n}): Promise<Record<string, unknown>> {\n const tokenEndpoint = input.tokenEndpoint ?? resolvePlatformOAuthTokenEndpoint(input.issuer);\n const csrfToken = readPlatformOAuthCsrfToken();\n\n const body = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: input.clientId,\n code: input.code,\n redirect_uri: input.redirectUri,\n });\n\n const headers: Record<string, string> = { 'Content-Type': 'application/x-www-form-urlencoded' };\n if (csrfToken) {\n headers['X-CSRF-Token'] = csrfToken;\n }\n\n const response = await fetch(tokenEndpoint, {\n method: 'POST',\n credentials: 'include',\n headers,\n body: body.toString(),\n });\n\n if (!response.ok) {\n const detail = await response.text().catch(() => '');\n throw new Error(\n `Token exchange failed: ${response.status} ${response.statusText}${detail ? ` — ${detail}` : ''}`,\n );\n }\n\n return (await response.json()) as Record<string, unknown>;\n}\n\n//#endregion\n","//#region ---- Auth:ListProviders public DTOs ----\n\nexport interface AXPAuthLocalSignInMethod {\n id: string;\n title: string;\n protocol: 'password' | 'otp' | 'custom';\n enabled: boolean;\n}\n\n/** Public IdP row — never includes secrets. `id` is used as OAuth `acr_values`. */\nexport interface AXPAuthIdentityProvider {\n id: string;\n title: string;\n icon?: string;\n priority: number;\n}\n\nexport interface AXPAuthListProvidersResponse {\n localMethods: AXPAuthLocalSignInMethod[];\n identityProviders: AXPAuthIdentityProvider[];\n}\n\nexport function asAuthListProvidersResponse(payload: unknown): AXPAuthListProvidersResponse {\n const data = (payload ?? {}) as Partial<AXPAuthListProvidersResponse>;\n return {\n localMethods: Array.isArray(data.localMethods) ? data.localMethods : [],\n identityProviders: Array.isArray(data.identityProviders) ? data.identityProviders : [],\n };\n}\n\nexport function findIdentityProvider(\n payload: unknown,\n id: string,\n): AXPAuthIdentityProvider | undefined {\n const { identityProviders } = asAuthListProvidersResponse(payload);\n return identityProviders.find((p) => p.id === id);\n}\n\n//#endregion\n","import type { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\n\n/**\n * Best-effort plain string for thrown {@link Error} messages from command results (no i18n lookup).\n */\nexport function commandMessageTextForError(value: AXPMultiLanguageString | undefined | null): string {\n if (value == null) {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'object' && !Array.isArray(value)) {\n const values = Object.values(value as Record<string, string>);\n const first = values.find((v) => typeof v === 'string' && v.length > 0);\n return first ?? '';\n }\n return String(value);\n}\n","import { AXPCommandService, AXPQueryService } from '@acorex-platform/framework-client/runtime';\nimport {\n AUTH_LIST_OWN_DEVICE_SESSIONS_DEFAULT,\n AUTH_LIST_PROVIDERS_DEFAULT,\n AUTH_LOGOUT_DEFAULT,\n AUTH_REFRESH_DEFAULT,\n AUTH_TERMINATE_OWN_DEVICE_SESSION_DEFAULT,\n AUTH_UPDATE_SESSION_DEFAULT,\n} from '@acorex-platform/framework-shared/runtime';\nimport { runtimeCommandPayloadData, runtimeQueryCollectionData, runtimeQueryObjectData } from '@acorex-platform/framework-shared/core';\nimport { inject, Injectable } from '@angular/core';\n\nimport {\n asAuthListProvidersResponse,\n type AXPAuthListProvidersResponse,\n} from './auth-list-providers.types';\nimport { commandMessageTextForError } from './command-message-text.util';\nimport type { PlatformAuthTokenResponseDto } from './platform-oauth-session.util';\nimport { AXPSessionService } from './session.service';\nimport type { AXPApplication } from './application/application.types';\nimport type { AXPTenant } from './tenant/tenant.types';\n\n//#region ---- Platform auth runtime (command/query transport) ----\n\nexport interface PlatformAuthUpdateSessionInput {\n tenantId?: string;\n applicationId?: string;\n tenant?: AXPTenant;\n application?: AXPApplication;\n}\n\nexport interface PlatformAuthOwnDeviceSessionDto {\n id: string;\n sessionId: string;\n tenantId: string;\n deviceName: string;\n browser: string;\n operatingSystem: string;\n ipAddress: string;\n lastLoginAt?: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AXPPlatformAuthRuntimeService {\n private readonly commandService = inject(AXPCommandService);\n private readonly queryService = inject(AXPQueryService);\n private readonly sessionService = inject(AXPSessionService);\n private listProvidersCache: AXPAuthListProvidersResponse | null = null;\n private listProvidersInFlight: Promise<AXPAuthListProvidersResponse> | null = null;\n\n async logout(_refreshToken?: string | null): Promise<void> {\n try {\n // Refresh token is read from HttpOnly cookie on the server.\n await this.commandService.execute(AUTH_LOGOUT_DEFAULT, {});\n } catch {\n // Ignore logout network errors; client session is cleared regardless.\n } finally {\n this.clearListProvidersCache();\n }\n }\n\n async refresh(_refreshToken?: string): Promise<PlatformAuthTokenResponseDto> {\n return this.executeCommand<PlatformAuthTokenResponseDto>(AUTH_REFRESH_DEFAULT, {});\n }\n\n async updateSession(input: PlatformAuthUpdateSessionInput): Promise<PlatformAuthTokenResponseDto> {\n return this.executeCommand<PlatformAuthTokenResponseDto>(AUTH_UPDATE_SESSION_DEFAULT, input);\n }\n\n async listOwnDeviceSessions(tenantId: string): Promise<PlatformAuthOwnDeviceSessionDto[]> {\n const result = await this.queryService.fetch<\n { tenantId: string },\n PlatformAuthOwnDeviceSessionDto\n >(AUTH_LIST_OWN_DEVICE_SESSIONS_DEFAULT, { tenantId });\n return runtimeQueryCollectionData(result)?.items ?? [];\n }\n\n async terminateOwnDeviceSession(id: string): Promise<void> {\n const result = await this.commandService.execute(AUTH_TERMINATE_OWN_DEVICE_SESSION_DEFAULT, { id });\n if (!result?.success) {\n throw new Error(\n commandMessageTextForError(result?.message?.text) || 'Failed to terminate device session',\n );\n }\n }\n\n async listProviders(): Promise<AXPAuthListProvidersResponse> {\n if (this.listProvidersCache) {\n return this.listProvidersCache;\n }\n if (this.listProvidersInFlight) {\n return this.listProvidersInFlight;\n }\n\n this.listProvidersInFlight = this.queryService\n .fetch<Record<string, never>, AXPAuthListProvidersResponse>(AUTH_LIST_PROVIDERS_DEFAULT, {})\n .then((result) => {\n this.listProvidersCache = asAuthListProvidersResponse(runtimeQueryObjectData(result));\n return this.listProvidersCache;\n })\n .finally(() => {\n this.listProvidersInFlight = null;\n });\n\n return this.listProvidersInFlight;\n }\n\n clearListProvidersCache(): void {\n this.listProvidersCache = null;\n this.listProvidersInFlight = null;\n }\n\n private async executeCommand<T>(key: string, input: unknown): Promise<T> {\n const result = await this.commandService.execute<unknown, T>(key, input);\n const data = runtimeCommandPayloadData(result);\n if (data == null) {\n throw new Error(commandMessageTextForError(result?.message?.text) || `Auth command failed: ${key}`);\n }\n return data;\n }\n}\n\n//#endregion\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Narrow API for refreshing cached user avatar display data.\n * Implemented via auth-gateway; keeps auth free of layout/components imports (avoids circular deps).\n */\nexport interface AXPUserAvatarCachePort {\n refreshUserInfo(userId: string): Promise<void>;\n}\n\nexport const AXP_USER_AVATAR_CACHE_PORT = new InjectionToken<AXPUserAvatarCachePort>(\n 'AXP_USER_AVATAR_CACHE_PORT',\n);\n","import { Injectable, inject } from '@angular/core';\n\nimport { AXP_USER_AVATAR_CACHE_PORT } from './user-avatar-cache.port';\nimport { AXPUser } from './user/user.types';\nimport { AXPSessionService } from './session.service';\n\n//#region ---- User profile identity service ----\n\n/** Keeps session and avatar cache aligned after self-service profile identity updates. */\n@Injectable({ providedIn: 'root' })\nexport class AXPUserProfileIdentityService {\n //#region ---- Services & Dependencies ----\n\n private readonly sessionService = inject(AXPSessionService);\n private readonly avatarCachePort = inject(AXP_USER_AVATAR_CACHE_PORT, { optional: true });\n\n //#endregion\n\n //#region ---- Public API ----\n\n async applySessionPatch(patch: Partial<Pick<AXPUser, 'name' | 'title' | 'avatar'>>): Promise<void> {\n const session = this.sessionService.getSessionData();\n const userId = session?.user?.id;\n if (!session?.user || !userId) {\n return;\n }\n\n this.sessionService.setSession({\n ...session,\n user: {\n ...session.user,\n ...patch,\n },\n });\n\n await this.refreshAvatar(userId);\n }\n\n async refreshAvatar(userId?: string): Promise<void> {\n const id = userId ?? this.sessionService.user?.id;\n if (!id) {\n return;\n }\n\n await this.avatarCachePort?.refreshUserInfo(id);\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Challenge Data Types ----\n\n/**\n * Supported content types for challenge display\n */\nexport type AXPChallengeContentType = 'image-url' | 'image-base64' | 'text' | 'audio-url';\n\n/**\n * Challenge data returned from the server\n * Contains all information needed to display and submit a challenge\n */\nexport interface AXPLoginChallengeData {\n /**\n * Unique identifier for this challenge\n * Must be sent back with credentials when submitting login\n */\n id: string;\n\n /**\n * The challenge content to display\n * Could be an image URL, base64 encoded image, text, or audio URL\n */\n content: string;\n\n /**\n * Type of content for proper rendering\n */\n contentType: AXPChallengeContentType;\n\n /**\n * When this challenge expires (optional)\n * After expiration, a new challenge should be fetched\n */\n expiresAt?: Date;\n\n /**\n * Additional metadata from server (optional)\n */\n metadata?: Record<string, unknown>;\n}\n\n//#endregion\n\n//#region ---- Challenge Check Result ----\n\n/**\n * Result of checking a login error response\n * Determines if a challenge should be displayed\n */\nexport interface AXPChallengeCheckResult {\n /**\n * Whether a challenge is required\n */\n required: boolean;\n\n /**\n * Optional message to display to the user\n */\n message?: string;\n\n /**\n * Additional data from server that may be needed for getChallenge()\n * For example: sessionId, attemptId, etc.\n */\n serverData?: Record<string, unknown>;\n}\n\n//#endregion\n\n","import { Type } from '@angular/core';\nimport { AXPLoginChallengeComponentBase } from './challenge-component.base';\nimport { AXPChallengeCheckResult, AXPLoginChallengeData } from './challenge.types';\n\n//#region ---- Abstract Challenge Provider ----\n\n/**\n * Abstract base class for login challenge providers\n *\n * Implement this class to create custom challenge mechanisms like:\n * - Image CAPTCHA\n * - reCAPTCHA\n * - SMS verification\n * - Email verification\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class MyImageCaptchaProvider extends AXPLoginChallengeProvider {\n * readonly name = 'image-captcha';\n *\n * checkResponse(error: unknown): AXPChallengeCheckResult | null {\n * if (error instanceof HttpErrorResponse) {\n * if (error.error?.requiresCaptcha) {\n * return { required: true };\n * }\n * }\n * return null;\n * }\n *\n * async getChallenge(): Promise<AXPLoginChallengeData> {\n * const response = await this.http.get('/api/captcha').toPromise();\n * return {\n * id: response.id,\n * content: response.image,\n * contentType: 'image-base64'\n * };\n * }\n *\n * async refreshChallenge(): Promise<AXPLoginChallengeData> {\n * return this.getChallenge();\n * }\n *\n * getChallengeComponent(): Type<AXPLoginChallengeComponentBase> {\n * return MyCaptchaChallengeComponent;\n * }\n * }\n * ```\n */\nexport abstract class AXPLoginChallengeProvider {\n\n /**\n * Unique name identifier for this provider\n */\n abstract readonly name: string;\n\n /**\n * Checks the login error response to determine if a challenge is required\n *\n * This method is called after a failed login attempt. The implementation\n * should inspect the error and return a result indicating whether a\n * challenge should be displayed.\n *\n * @param error - The error from the failed login attempt (type varies by implementation)\n * @returns Challenge check result, or null if this provider doesn't handle this error\n */\n abstract checkResponse(error: unknown): AXPChallengeCheckResult | null;\n\n /**\n * Fetches a new challenge from the server\n *\n * Called when checkResponse indicates a challenge is required.\n * Should make an API call to get challenge data (e.g., CAPTCHA image).\n *\n * @param serverData - Optional data from checkResponse result that may be needed\n * @returns Promise resolving to challenge data for display\n */\n abstract getChallenge(serverData?: Record<string, unknown>): Promise<AXPLoginChallengeData>;\n\n /**\n * Fetches a fresh challenge, replacing the current one\n *\n * Called when user requests a new challenge (e.g., clicks \"new image\" button).\n * Typically delegates to getChallenge() but may have different behavior.\n *\n * @returns Promise resolving to new challenge data\n */\n abstract refreshChallenge(): Promise<AXPLoginChallengeData>;\n\n /**\n * Returns the component type for rendering the challenge UI\n *\n * Override this method to provide a custom challenge UI component.\n * If not overridden (returns null), the login component will use\n * a default built-in UI.\n *\n * @returns Component type extending AXPLoginChallengeComponentBase, or null for default UI\n */\n getChallengeComponent(): Type<AXPLoginChallengeComponentBase> | null {\n return null;\n }\n}\n\n//#endregion\n\n","import { InjectionToken } from '@angular/core';\nimport { AXPLoginChallengeProvider } from './challenge.provider';\n\n//#region ---- Injection Token ----\n\n/**\n * Injection token for the login challenge provider\n *\n * This token is optional - if not provided, no challenge mechanism will be used.\n *\n * @example\n * ```typescript\n * // In your app module or provider configuration:\n * providers: [\n * {\n * provide: AXP_LOGIN_CHALLENGE_PROVIDER,\n * useClass: MyImageCaptchaProvider\n * }\n * ]\n *\n * // In a component:\n * private challengeProvider = inject(AXP_LOGIN_CHALLENGE_PROVIDER, { optional: true });\n * ```\n */\nexport const AXP_LOGIN_CHALLENGE_PROVIDER = new InjectionToken<AXPLoginChallengeProvider>(\n 'AXP_LOGIN_CHALLENGE_PROVIDER'\n);\n\n//#endregion\n\n","import { Component, input, output, ChangeDetectionStrategy } from '@angular/core';\nimport { AXPLoginChallengeData } from './challenge.types';\n\n//#region ---- Base Challenge Component ----\n\n/**\n * Base class for login challenge UI components\n *\n * Providers can extend this class to create custom challenge UIs.\n * The login component will render this component and listen to its outputs.\n *\n * @example\n * ```typescript\n * @Component({\n * selector: 'my-captcha-challenge',\n * template: `\n * <div class=\"captcha-container\">\n * <img [src]=\"'data:image/png;base64,' + challengeData().content\" />\n * <input\n * type=\"text\"\n * [value]=\"response()\"\n * (input)=\"onResponseChange($event)\"\n * />\n * <button (click)=\"onRefreshClick()\">Refresh</button>\n * </div>\n * `\n * })\n * export class MyCaptchaChallengeComponent extends AXPLoginChallengeComponentBase {\n * response = signal('');\n *\n * onResponseChange(event: Event) {\n * const value = (event.target as HTMLInputElement).value;\n * this.response.set(value);\n * this.responseChange.emit(value);\n * }\n *\n * onRefreshClick() {\n * this.refreshRequest.emit();\n * }\n * }\n * ```\n */\n@Component({\n template: '',\n changeDetection: ChangeDetectionStrategy.Eager,\n standalone: true,\n})\nexport abstract class AXPLoginChallengeComponentBase {\n //#region ---- Inputs ----\n\n /**\n * Challenge data to display\n * Contains the image/content and metadata from the server\n */\n challengeData = input.required<AXPLoginChallengeData>();\n\n /**\n * Whether the challenge is currently loading (e.g., refreshing)\n */\n isLoading = input<boolean>(false);\n\n //#endregion\n\n //#region ---- Outputs ----\n\n /**\n * Emits when the user enters or changes their response\n * The login component will capture this value and include it in credentials\n */\n responseChange = output<string>();\n\n /**\n * Emits when the user requests a new challenge (e.g., clicks refresh button)\n * The login component will call provider.refreshChallenge()\n */\n refreshRequest = output<void>();\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- Sign-in method types -----\n\n/** Protocol family for a sign-in method. */\nexport type AXPSignInMethodProtocol = 'password' | 'otp' | 'oidc' | 'saml' | 'ldap' | 'custom';\n\n/** One interactive step in a multi-factor / challenge flow. */\nexport type AXPSignInMethodStepKind =\n | 'credentials'\n | 'otp'\n | 'captcha'\n | 'external-redirect'\n | 'complete';\n\nexport interface AXPSignInMethodDescriptor {\n /** Stable id, e.g. `password`, `oidc:google`, `saml:okta-hr`. */\n readonly id: string;\n readonly title: string;\n readonly protocol: AXPSignInMethodProtocol;\n readonly enabled: boolean;\n /** Lower = higher on the login page. */\n readonly priority?: number;\n readonly icon?: string;\n}\n\nexport interface AXPSignInMethodStep {\n readonly kind: AXPSignInMethodStepKind;\n readonly challengeId?: string;\n readonly message?: string;\n readonly redirectUrl?: string;\n}\n\nexport interface AXPSignInMethodStartResult {\n readonly status: 'completed' | 'continue' | 'redirect';\n readonly step?: AXPSignInMethodStep;\n /** When status is completed, session cookies are already set by the server. */\n readonly userId?: string;\n}\n\n/**\n * Pluggable sign-in method. Multiple methods can be registered and offered at once.\n * Session remember/refresh live in {@link AXPSessionService}; methods only prove identity.\n */\nexport abstract class AXPSignInMethod {\n abstract get descriptor(): AXPSignInMethodDescriptor;\n\n /** Begin or continue the method flow. */\n abstract start(input: Record<string, unknown>): Promise<AXPSignInMethodStartResult>;\n\n /** Submit a challenge / OTP / captcha step. */\n abstract continue(\n step: AXPSignInMethodStep,\n input: Record<string, unknown>,\n ): Promise<AXPSignInMethodStartResult>;\n}\n\n//#endregion\n","import { Injectable } from '@angular/core';\nimport type { AXPSignInMethod, AXPSignInMethodDescriptor } from './sign-in-method.types';\n\n//#region ----- Sign-in method registry -----\n\n/**\n * Registry of enabled sign-in methods for the login UI.\n * Methods are independent of session refresh/remember (owned by session service).\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPSignInMethodRegistry {\n private readonly methods = new Map<string, AXPSignInMethod>();\n\n register(...methods: AXPSignInMethod[]): void {\n for (const method of methods) {\n this.methods.set(method.descriptor.id, method);\n }\n }\n\n get(id: string): AXPSignInMethod | undefined {\n return this.methods.get(id);\n }\n\n listEnabled(): AXPSignInMethodDescriptor[] {\n return [...this.methods.values()]\n .map((m) => m.descriptor)\n .filter((d) => d.enabled)\n .sort((a, b) => (a.priority ?? 100) - (b.priority ?? 100));\n }\n}\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-platform-framework-client-auth.mjs","sources":["../../../../../libs/framework/client/auth/src/lib/application/application.loader.ts","../../../../../libs/framework/client/auth/src/lib/contracts/errors.types.ts","../../../../../libs/framework/client/auth/src/lib/contracts/session.types.ts","../../../../../libs/framework/client/auth/src/lib/contracts/index.ts","../../../../../libs/framework/client/auth/src/lib/tenant/tenant.loader.ts","../../../../../libs/framework/client/auth/src/lib/auth-trace.constants.ts","../../../../../libs/framework/client/auth/src/lib/auth-session.trace.ts","../../../../../libs/framework/client/auth/src/lib/auth-registry.service.ts","../../../../../libs/framework/client/auth/src/lib/feature/feature.loader.ts","../../../../../libs/framework/client/auth/src/lib/feature/feature.directive.ts","../../../../../libs/framework/client/auth/src/lib/feature/feature.guard.ts","../../../../../libs/framework/client/auth/src/lib/feature/feature-checker.token.ts","../../../../../libs/framework/client/auth/src/lib/feature/feature-evaluator-scope.provider.ts","../../../../../libs/framework/client/auth/src/lib/permission/permission.loader.ts","../../../../../libs/framework/client/auth/src/lib/permission/permission-checker.token.ts","../../../../../libs/framework/client/auth/src/lib/access-policy/access-policy-cache.port.ts","../../../../../libs/framework/client/auth/src/lib/oauth-pending.util.ts","../../../../../libs/framework/client/auth/src/lib/auth-refresh-lock.util.ts","../../../../../libs/framework/client/auth/src/lib/auth-refresh-failure.util.ts","../../../../../libs/framework/client/auth/src/lib/auth-soft-restore.util.ts","../../../../../libs/framework/client/auth/src/lib/session.service.ts","../../../../../libs/framework/client/auth/src/lib/permission/permission.directive.ts","../../../../../libs/framework/client/auth/src/lib/permission/permission.guard.ts","../../../../../libs/framework/client/auth/src/lib/permission/permission-definition.builder.ts","../../../../../libs/framework/client/auth/src/lib/permission/permission-definition.service.ts","../../../../../libs/framework/client/auth/src/lib/permission/permission-evaluator-scope.provider.ts","../../../../../libs/framework/client/auth/src/lib/auth.guard.ts","../../../../../libs/framework/client/auth/src/lib/auth.module.ts","../../../../../libs/framework/client/auth/src/lib/auth.strategy.ts","../../../../../libs/framework/client/auth/src/lib/auth.utils.ts","../../../../../libs/framework/client/auth/src/lib/platform-oauth-session.util.ts","../../../../../libs/framework/client/auth/src/lib/platform-oauth.util.ts","../../../../../libs/framework/client/auth/src/lib/auth-list-providers.types.ts","../../../../../libs/framework/client/auth/src/lib/command-message-text.util.ts","../../../../../libs/framework/client/auth/src/lib/platform-auth-runtime.service.ts","../../../../../libs/framework/client/auth/src/lib/max-active-device-sessions.util.ts","../../../../../libs/framework/client/auth/src/lib/user-avatar-cache.port.ts","../../../../../libs/framework/client/auth/src/lib/user-profile-identity.service.ts","../../../../../libs/framework/client/auth/src/lib/challenge/challenge.types.ts","../../../../../libs/framework/client/auth/src/lib/challenge/challenge.provider.ts","../../../../../libs/framework/client/auth/src/lib/challenge/challenge.token.ts","../../../../../libs/framework/client/auth/src/lib/challenge/challenge-component.base.ts","../../../../../libs/framework/client/auth/src/lib/sign-in-method/sign-in-method.types.ts","../../../../../libs/framework/client/auth/src/lib/sign-in-method/sign-in-method.registry.ts","../../../../../libs/framework/client/auth/src/acorex-platform-framework-client-auth.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { AXPSessionContext } from '../contracts/session.types';\nimport { AXPApplication } from './application.types';\n\nexport interface AXPApplicationLoader {\n getList(context: AXPSessionContext): Promise<AXPApplication[]>;\n}\n\nexport const AXP_APPLICATION_LOADER = new InjectionToken<AXPApplicationLoader>('AXP_APPLICATION_LOADER', {\n providedIn: 'root',\n factory: () => {\n return new AXPApplicationDefaultLoader();\n },\n});\n\nclass AXPApplicationDefaultLoader implements AXPApplicationLoader {\n async getList(context: AXPSessionContext): Promise<AXPApplication[]> {\n return [\n {\n id: '1',\n name: 'default-app',\n title: 'Default Application',\n version: '1.0.0',\n edition: {\n id: 'default-edition-1',\n title: 'Standard',\n },\n },\n {\n id: '2',\n name: 'default-app',\n title: 'Default Application',\n version: '1.0.0',\n edition: {\n id: 'default-edition-2',\n title: 'Standard',\n },\n },\n ];\n }\n}\n","export class AXPUnauthorizedError extends Error {\n constructor(message?: string, public data?: { redirectUrl?: string }) {\n super(message);\n this.name = 'AXPUnauthorizedError';\n }\n}\n\nexport class AXPUnauthenticatedError extends Error {\n constructor(message?: string, public data?: { redirectUrl?: string }) {\n super(message);\n this.name = 'AXPUnauthenticatedError';\n }\n}","import { AXPApplication } from \"../application/application.types\";\nimport { AXPTenant } from \"../tenant/tenant.types\";\nimport { AXPUser } from \"../user/user.types\";\n\nexport class AXPSessionContext {\n\n private _user: AXPUser | null = null;\n public get user(): AXPUser | null {\n return this._user;\n }\n\n private _tenant: AXPTenant | null = null;\n public get tenant(): AXPTenant | null {\n return this._tenant;\n }\n\n private _application: AXPApplication | null = null;\n public get application(): AXPApplication | null {\n return this._application;\n }\n\n constructor(context: {\n user: AXPUser | null,\n tenant: AXPTenant | null,\n application: AXPApplication | null,\n }) {\n this._user = context.user;\n this._tenant = context.tenant;\n this._application = context.application;\n }\n}\n\nexport enum AXPSessionStatus {\n Authenticated = \"authenticated\",\n Unauthenticated = \"unauthenticated\",\n Unauthorized = \"unauthorized\",\n Authorized = \"authorized\",\n Expired = \"expired\",\n SignedOut = \"signedOut\"\n}","//#region ---- Contracts barrel ----\n\nexport * from './errors.types';\nexport * from './session.types';\n\n//#endregion\n","import { InjectionToken } from '@angular/core';\nimport { AXPTenant } from './tenant.types';\nimport { AXPSessionContext } from '../contracts/session.types';\n\nexport interface AXPTenantLoader {\n getList(context: AXPSessionContext): Promise<AXPTenant[]>;\n}\n\nexport const AXP_TENANT_LOADER = new InjectionToken<AXPTenantLoader>('AXP_TENANT_LOADER', {\n providedIn: 'root',\n factory: () => {\n return new AXPTenantDefaultLoader();\n },\n});\n\nclass AXPTenantDefaultLoader implements AXPTenantLoader {\n async getList(context: AXPSessionContext): Promise<AXPTenant[]> {\n return [\n {\n id: '1',\n name: 'default-tenant',\n title: 'Default Tenant',\n },\n ];\n }\n}\n","/** Debug namespace for auth session diagnostics. Filter console with `[AXP:AUTH-SESSION]`. */\nexport const AUTH_SESSION_TRACE_NS = 'AUTH-SESSION';\n\n//#region ----- Trace area titles -----\n\nexport const AUTH_SESSION_TRACE_TITLE = {\n /** Sign-in / register / sign-out lifecycle. */\n Lifecycle: 'Lifecycle',\n /** Cookie session restore + refresh. */\n Restore: 'Restore',\n /** Tenant / application bind via UpdateSession. */\n Workspace: 'Workspace',\n /** Auth:GetAccessPolicy load (permissions + features). */\n AccessPolicy: 'AccessPolicy',\n /** ListTenants / ListApplications. */\n Catalog: 'Catalog',\n /** Route guards (login, tenant-chooser, app-chooser). */\n Guard: 'Guard',\n} as const;\n\n//#endregion\n","import { AXPDebugService } from '@acorex-platform/framework-client/core';\nimport { AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE } from './auth-trace.constants';\n\n//#region ----- Lifecycle -----\n\nexport function traceAuthLifecycle(message: string, data?: () => Record<string, unknown>): void {\n AXPDebugService.instance?.trace(AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE.Lifecycle, message, data);\n}\n\nexport function traceAuthLifecycleError(message: string, data?: () => Record<string, unknown>): void {\n AXPDebugService.instance?.error(AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE.Lifecycle, message, data);\n}\n\n/** Always emits (Debug Mode not required) — use for logout / empty-menu diagnosis. */\nexport function warnAuthLifecycle(message: string, data?: () => Record<string, unknown>): void {\n AXPDebugService.instance?.warn(AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE.Lifecycle, message, data);\n}\n\n//#endregion\n\n//#region ----- Restore -----\n\nexport function traceAuthRestore(message: string, data?: () => Record<string, unknown>): void {\n AXPDebugService.instance?.trace(AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE.Restore, message, data);\n}\n\n//#endregion\n\n//#region ----- Workspace -----\n\nexport function traceAuthWorkspace(message: string, data?: () => Record<string, unknown>): void {\n AXPDebugService.instance?.trace(AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE.Workspace, message, data);\n}\n\nexport function warnAuthWorkspace(message: string, data?: () => Record<string, unknown>): void {\n AXPDebugService.instance?.warn(AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE.Workspace, message, data);\n}\n\n//#endregion\n\n//#region ----- Access policy -----\n\nexport function traceAuthAccessPolicy(message: string, data?: () => Record<string, unknown>): void {\n AXPDebugService.instance?.trace(AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE.AccessPolicy, message, data);\n}\n\nexport function warnAuthAccessPolicy(message: string, data?: () => Record<string, unknown>): void {\n AXPDebugService.instance?.warn(AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE.AccessPolicy, message, data);\n}\n\n//#endregion\n\n//#region ----- Catalog -----\n\nexport function traceAuthCatalog(message: string, data?: () => Record<string, unknown>): void {\n AXPDebugService.instance?.trace(AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE.Catalog, message, data);\n}\n\n//#endregion\n\n//#region ----- Guards -----\n\nexport function traceAuthGuard(message: string, data?: () => Record<string, unknown>): void {\n AXPDebugService.instance?.trace(AUTH_SESSION_TRACE_NS, AUTH_SESSION_TRACE_TITLE.Guard, message, data);\n}\n\n//#endregion\n","import { Injectable, Injector } from \"@angular/core\";\nimport { AXPAuthStrategy } from \"./auth.strategy\";\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AXPAuthStrategyRegistryService {\n private strategies = new Map<string, AXPAuthStrategy>();\n\n private injector: Injector;\n\n constructor(injector: Injector) {\n this.injector = injector;\n }\n\n register(...plugins: (new () => AXPAuthStrategy)[]) {\n plugins.forEach(t => {\n const childInjector = Injector.create({ providers: [{ provide: t, useClass: t, deps: [] }], parent: this.injector });\n const strategy = childInjector.get(t);\n if (strategy) {\n this.strategies.set(strategy.name, strategy);\n }\n })\n }\n\n get(strategyKey: string): AXPAuthStrategy | undefined {\n return this.strategies.get(strategyKey);\n }\n}","import { InjectionToken } from '@angular/core';\nimport { AXPFeature } from './feature.types';\nimport { AXPSessionContext } from '../contracts/session.types';\n\nexport interface AXPFeatureLoader {\n getList(context: AXPSessionContext): Promise<AXPFeature[]>;\n}\n\nexport const AXP_FEATURE_LOADER = new InjectionToken<AXPFeatureLoader>('AXP_FEATURE_LOADER', {\n providedIn: 'root',\n factory: () => {\n return new AXPFeatureDefaultLoader();\n },\n});\n\nclass AXPFeatureDefaultLoader implements AXPFeatureLoader {\n async getList(context: AXPSessionContext): Promise<AXPFeature[]> {\n return [];\n }\n}\n","import { Directive, Input, TemplateRef, ViewContainerRef, inject, signal } from '@angular/core';\nimport { Subscription, first } from 'rxjs';\nimport { AXPSessionService } from '../session.service';\n\n@Directive({\n selector: '[feature]',\n standalone: false\n})\nexport class AXPFeatureDirective {\n private hasView = signal(false);\n private subscription!: Subscription;\n private sessionService = inject(AXPSessionService);\n\n constructor(\n private templateRef: TemplateRef<any>,\n private viewContainer: ViewContainerRef\n ) { }\n\n @Input()\n public set feature(featureKeys: string | string[] | null) {\n const keys: string[] = !featureKeys ? [] : (Array.isArray(featureKeys) ? featureKeys : [featureKeys]);\n if (keys.length == 0) {\n // If featureKey is null or empty, decide the default behavior here\n this.viewContainer.createEmbeddedView(this.templateRef);\n this.hasView.set(true);\n return;\n }\n this.subscription = this.sessionService.features$\n //.pipe(first())\n .subscribe(() => {\n if (this.sessionService.isFeatureEnabled(...keys)) {\n if (!this.hasView()) {\n this.viewContainer.createEmbeddedView(this.templateRef);\n this.hasView.set(true);\n }\n } else {\n this.viewContainer.clear();\n this.hasView.set(false);\n }\n });\n }\n\n @Input()\n public set featureElse(elseTemplateRef: TemplateRef<any>) {\n if (!this.hasView()) {\n this.viewContainer.createEmbeddedView(elseTemplateRef);\n }\n }\n\n ngOnDestroy() {\n this.subscription?.unsubscribe();\n }\n}\n","import { ActivatedRouteSnapshot, CanActivateFn, RouterStateSnapshot, UrlTree } from \"@angular/router\";\nimport { inject } from \"@angular/core\";\nimport { AXPSessionService } from \"../session.service\";\nimport { Observable, first, map } from \"rxjs\";\nimport { AXPUnauthorizedError } from \"../contracts/errors.types\";\n\nexport const AXPFeatureGuard: CanActivateFn =\n (route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> => {\n const sessionService = inject(AXPSessionService);\n const requiredFeatures = route.data['requiredFeature'] as (string | string[] | null);\n\n return sessionService.features$.pipe(\n map(() => {\n const keys: string[] = !requiredFeatures ? [] : (Array.isArray(requiredFeatures) ? requiredFeatures : [requiredFeatures]);\n const hasFeature = keys.length == 0 || sessionService.isFeatureEnabled(...keys);\n if (!hasFeature) {\n throw new AXPUnauthorizedError(\n `Access Denied. You do not have access to this feature. Required feature(s): ${keys.join(', ')}. Please contact support if you need access.`,\n {\n redirectUrl: state.url\n }\n );\n }\n return true;\n })\n );\n };\n","import { InjectionToken } from '@angular/core';\nimport { AXPFeatureChecker } from './feature-checker.types';\n\n/**\n * Optional injection token for feature checker.\n * If provided, the checker will be called to potentially override\n * feature enablement results based on custom logic.\n */\nexport const AXP_FEATURE_CHECKER = new InjectionToken<AXPFeatureChecker>(\n 'AXP_FEATURE_CHECKER'\n);\n\n","//#region ----- Imports -----\n\nimport {\n AXPExpressionEvaluatorScopeProvider,\n AXPExpressionEvaluatorScopeProviderContext,\n} from '@acorex-platform/framework-shared/core';\nimport { inject } from '@angular/core';\nimport { AXPSessionService } from '../session.service';\n\n//#endregion\n\n//#region ----- Feature Evaluator Scope Provider -----\n\n/**\n * Exposes `feature.check(...)` / `feature.checkAny(...)` for entity expressions\n * (e.g. `schema.visible: '{{ feature.check(\"Module:Feature:X\") }}'`).\n */\nexport class AXPFeatureEvaluatorScopeProvider implements AXPExpressionEvaluatorScopeProvider {\n protected sessionService = inject(AXPSessionService);\n\n async provide(context: AXPExpressionEvaluatorScopeProviderContext): Promise<void> {\n context.addScope('feature', {\n /**\n * True when every listed feature key is enabled for the session.\n */\n check: (...features: string[]) => {\n return this.sessionService.isFeatureEnabled(...features);\n },\n\n /**\n * True when any listed feature key is enabled for the session.\n */\n checkAny: (...features: string[]) => {\n return features.some((f) => this.sessionService.isFeatureEnabled(f));\n },\n });\n }\n}\n\n//#endregion\n","import { InjectionToken } from \"@angular/core\";\nimport { AXPPermission } from \"./permission.types\";\nimport { AXPSessionContext } from \"../contracts/session.types\";\n\nexport interface AXPPermissionLoader {\n getList(context: AXPSessionContext): Promise<AXPPermission[]>;\n}\n\nexport const AXP_PERMISSION_LOADER = new InjectionToken<AXPPermissionLoader>('AXP_PERMISSION_LOADER', {\n providedIn: 'root',\n factory: () => {\n return new AXPPermissionDefaultLoader();\n }\n});\n\nclass AXPPermissionDefaultLoader implements AXPPermissionLoader {\n async getList(context: AXPSessionContext): Promise<AXPPermission[]> {\n return [];\n }\n}","import { InjectionToken } from '@angular/core';\nimport { AXPPermissionChecker } from './permission-checker.types';\n\n/**\n * Optional injection token for permission checker.\n * If provided, the checker will be called to potentially override\n * authorization results based on custom logic.\n */\nexport const AXP_PERMISSION_CHECKER = new InjectionToken<AXPPermissionChecker>(\n 'AXP_PERMISSION_CHECKER'\n);\n\n","import { InjectionToken } from '@angular/core';\n\n//#region ----- Access policy cache port -----\n\n/** Allows connectivity loaders to invalidate cached session access policy when context changes. */\nexport interface AXPAccessPolicyCachePort {\n invalidate(): void;\n}\n\nexport const AXP_ACCESS_POLICY_CACHE_PORT = new InjectionToken<AXPAccessPolicyCachePort>(\n 'AXP_ACCESS_POLICY_CACHE_PORT',\n);\n\n//#endregion\n","//#region ---- OAuth pending strategy (callback routing) ----\n\n/**\n * When the SPA is redirected to `/auth/oauth-callback`, the active auth strategy name\n * must survive so `/auth/oauth-callback` can resolve the strategy.\n */\nconst OAUTH_PENDING_STRATEGY_KEY = 'axp_oauth_pending_strategy';\n\nexport const AXP_OAUTH_PKCE_VERIFIER_KEY = 'pkce_code_verifier';\n\nexport function setOAuthPendingStrategy(strategy: string): void {\n sessionStorage.setItem(OAUTH_PENDING_STRATEGY_KEY, strategy);\n}\n\nexport function getOAuthPendingStrategy(): string | null {\n return sessionStorage.getItem(OAUTH_PENDING_STRATEGY_KEY);\n}\n\nexport function clearOAuthPendingStrategy(): void {\n sessionStorage.removeItem(OAUTH_PENDING_STRATEGY_KEY);\n}\n\n/** @deprecated Server-side PKCE replaced localStorage verifier; kept for legacy detection only. */\nexport function hasLegacyOAuthPkceVerifier(): boolean {\n return !!localStorage.getItem(AXP_OAUTH_PKCE_VERIFIER_KEY);\n}\n\nexport function hasOAuthPendingFlow(): boolean {\n return !!getOAuthPendingStrategy();\n}\n\nexport function isOAuthRedirectInFlight(): boolean {\n return hasOAuthPendingFlow() || hasLegacyOAuthPkceVerifier();\n}\n\n//#endregion\n","//#region ---- Auth refresh lock (cross-tab) ----\n\n/**\n * Serializes cookie refresh across browser tabs so two restores cannot consume the\n * same refresh `jti` and trigger server reuse detection (full `sid` revoke).\n *\n * 1. Web Locks API (Chrome / Edge / Firefox) — exclusive across tabs of this origin.\n * 2. localStorage lock — fallback when Web Locks is missing (two JS heaps otherwise race).\n * 3. In-tab promise chain — last resort (does not coordinate tabs).\n */\nconst AUTH_REFRESH_LOCK_NAME = 'axp.auth.refresh';\nconst AUTH_REFRESH_LS_LOCK_KEY = 'axp.auth.refresh.ls-lock';\nconst AUTH_REFRESH_LS_TTL_MS = 20_000;\nconst AUTH_REFRESH_LS_WAIT_MS = 40;\n\nlet memoryTail: Promise<unknown> = Promise.resolve();\n\nexport async function withAuthRefreshLock<T>(run: () => Promise<T>): Promise<T> {\n const locks = typeof navigator !== 'undefined' ? navigator.locks : undefined;\n if (typeof locks?.request === 'function') {\n return locks.request(AUTH_REFRESH_LOCK_NAME, { mode: 'exclusive' }, async () => run());\n }\n\n if (typeof localStorage !== 'undefined') {\n return withLocalStorageRefreshLock(run);\n }\n\n return withMemoryRefreshLock(run);\n}\n\nasync function withLocalStorageRefreshLock<T>(run: () => Promise<T>): Promise<T> {\n const owner = `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n const deadline = Date.now() + AUTH_REFRESH_LS_TTL_MS;\n\n while (Date.now() < deadline) {\n const now = Date.now();\n const held = readLocalStorageLock();\n if (held && held.until > now && held.owner !== owner) {\n await delay(AUTH_REFRESH_LS_WAIT_MS);\n continue;\n }\n\n writeLocalStorageLock(owner, now + AUTH_REFRESH_LS_TTL_MS);\n const confirmed = readLocalStorageLock();\n if (confirmed?.owner !== owner) {\n await delay(AUTH_REFRESH_LS_WAIT_MS);\n continue;\n }\n\n try {\n return await run();\n } finally {\n const current = readLocalStorageLock();\n if (current?.owner === owner) {\n localStorage.removeItem(AUTH_REFRESH_LS_LOCK_KEY);\n }\n }\n }\n\n return withMemoryRefreshLock(run);\n}\n\nfunction readLocalStorageLock(): { owner: string; until: number } | null {\n try {\n const raw = localStorage.getItem(AUTH_REFRESH_LS_LOCK_KEY);\n if (!raw) {\n return null;\n }\n const parsed = JSON.parse(raw) as { owner?: unknown; until?: unknown };\n if (typeof parsed.owner !== 'string' || typeof parsed.until !== 'number') {\n return null;\n }\n return { owner: parsed.owner, until: parsed.until };\n } catch {\n return null;\n }\n}\n\nfunction writeLocalStorageLock(owner: string, until: number): void {\n localStorage.setItem(AUTH_REFRESH_LS_LOCK_KEY, JSON.stringify({ owner, until }));\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction withMemoryRefreshLock<T>(run: () => Promise<T>): Promise<T> {\n const runExclusive = memoryTail.then(\n () => run(),\n () => run(),\n );\n memoryTail = runExclusive.then(\n () => undefined,\n () => undefined,\n );\n return runExclusive;\n}\n\n//#endregion\n","//#region ----- Auth refresh failure classification -----\n\n/**\n * Stable server codes for definitive refresh/session death (prefer over message text).\n * Keep in sync with `AUTH_REFRESH_ERROR_CODES` / `SESSION_MEMBERSHIP_DENIED` on the server.\n */\nexport const DEFINITIVE_AUTH_REFRESH_CODES = [\n 'REFRESH_MISSING',\n 'REFRESH_EXPIRED',\n 'REFRESH_REVOKED',\n 'REFRESH_REUSE',\n 'SESSION_REVOKED',\n 'USER_NOT_FOUND',\n 'SESSION_MEMBERSHIP_DENIED',\n] as const;\n\n/**\n * Backward-compatible message patterns when older servers omit `code`.\n * Do NOT treat bare HTTP 401/403 / Redis unavailable / 5xx as definitive.\n */\nconst DEFINITIVE_AUTH_REFRESH_PATTERNS: readonly RegExp[] = [\n /refresh token reuse detected/i,\n /refresh token has been revoked/i,\n /refreshToken is required/i,\n /invalid or expired refresh token/i,\n /invalid refresh token/i,\n /session has been revoked/i,\n /user not found/i,\n /SESSION_MEMBERSHIP_DENIED/i,\n /you do not have access to this organization/i,\n /you do not have access to this application/i,\n];\n\nfunction collectErrorText(error: unknown): string {\n if (error == null) {\n return '';\n }\n if (typeof error === 'string') {\n return error;\n }\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error !== 'object') {\n return String(error);\n }\n\n const err = error as Record<string, unknown>;\n const parts: string[] = [];\n for (const key of ['message', 'error', 'code', 'statusText'] as const) {\n const value = err[key];\n if (typeof value === 'string') {\n parts.push(value);\n }\n }\n const nested = err['error'];\n if (nested && typeof nested === 'object') {\n parts.push(collectErrorText(nested));\n }\n const apiError = err['apiError'];\n if (apiError && typeof apiError === 'object') {\n parts.push(collectErrorText(apiError));\n }\n return parts.filter(Boolean).join(' ');\n}\n\nfunction collectErrorCodes(error: unknown): string[] {\n if (error == null || typeof error !== 'object') {\n return typeof error === 'string' && DEFINITIVE_AUTH_REFRESH_CODES.includes(error as (typeof DEFINITIVE_AUTH_REFRESH_CODES)[number])\n ? [error]\n : [];\n }\n\n const err = error as Record<string, unknown>;\n const codes: string[] = [];\n for (const key of ['code', 'error'] as const) {\n const value = err[key];\n if (typeof value === 'string' && value.trim()) {\n codes.push(value.trim());\n }\n }\n const apiError = err['apiError'];\n if (apiError && typeof apiError === 'object') {\n codes.push(...collectErrorCodes(apiError));\n }\n const nested = err['error'];\n if (nested && typeof nested === 'object') {\n codes.push(...collectErrorCodes(nested));\n }\n const details = err['details'];\n if (details && typeof details === 'object') {\n codes.push(...collectErrorCodes(details));\n }\n return codes;\n}\n\n/**\n * True only when refresh failed because the refresh cookie / session family is dead.\n * Network / 5xx / Redis unavailable / empty transient results → false.\n */\nexport function isDefinitiveAuthRefreshFailure(error: unknown): boolean {\n const codes = collectErrorCodes(error);\n if (codes.some((code) => (DEFINITIVE_AUTH_REFRESH_CODES as readonly string[]).includes(code))) {\n return true;\n }\n\n const text = collectErrorText(error);\n if (!text.trim()) {\n return false;\n }\n\n // Do not treat generic \"Authentication failed\" / Redis unavailable as definitive.\n if (/session store \\(redis\\) is unavailable/i.test(text)) {\n return false;\n }\n\n return DEFINITIVE_AUTH_REFRESH_PATTERNS.some((pattern) => pattern.test(text));\n}\n\n//#endregion\n","//#region ----- Soft restore authorization status -----\n\nimport { AXPSessionStatus } from './contracts/session.types';\n\n/**\n * After soft restore: keep identity without promoting to Authorized when\n * access policy could not be loaded (transient API/refresh failure).\n */\nexport function resolveStatusAfterSoftRestore(options: {\n hasUser: boolean;\n hasCompleteWorkspace: boolean;\n policyLoadSucceeded: boolean;\n}): AXPSessionStatus {\n if (!options.hasUser) {\n return AXPSessionStatus.Unauthenticated;\n }\n if (options.hasCompleteWorkspace && options.policyLoadSucceeded) {\n return AXPSessionStatus.Authorized;\n }\n return AXPSessionStatus.Authenticated;\n}\n\n/**\n * Soft-restore left the session Authenticated (policy unavailable).\n * Retry access-policy load after connectivity / successful token refresh recovers.\n */\nexport function shouldRetryAccessPolicyAuthorization(\n status: AXPSessionStatus,\n): boolean {\n return status === AXPSessionStatus.Authenticated;\n}\n\n//#endregion\n","import { AXPBroadcastEventService } from '@acorex-platform/framework-client/core';\nimport { Injectable, inject, Injector } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { isEmpty } from 'lodash-es';\nimport { BehaviorSubject, Observable, combineLatest, defaultIfEmpty, distinctUntilChanged, filter, from, map, of, shareReplay, switchMap } from 'rxjs';\nimport { AXP_APPLICATION_LOADER } from './application/application.loader';\nimport { AXPApplication } from './application/application.types';\nimport {\n traceAuthAccessPolicy,\n warnAuthAccessPolicy,\n traceAuthCatalog,\n traceAuthLifecycle,\n traceAuthLifecycleError,\n warnAuthLifecycle,\n traceAuthRestore,\n traceAuthWorkspace,\n warnAuthWorkspace,\n} from './auth-session.trace';\nimport { AXPAuthStrategyRegistryService } from './auth-registry.service';\nimport { AXPBaseCredentials, AXPSessionData, AXPSignInResult, AXPAuthStrategy } from './auth.strategy';\nimport { AXPFeature, AXP_FEATURE_LOADER, AXP_FEATURE_CHECKER } from './feature';\nimport { AXP_PERMISSION_LOADER } from './permission/permission.loader';\nimport { AXP_PERMISSION_CHECKER } from './permission/permission-checker.token';\nimport { AXPPermission } from './permission/permission.types';\nimport { AXPSessionContext, AXPSessionStatus } from './contracts/session.types';\nimport { AXP_TENANT_LOADER } from './tenant/tenant.loader';\nimport { AXPTenant } from './tenant/tenant.types';\nimport { AXPUser } from './user/user.types';\nimport { AXP_ACCESS_POLICY_CACHE_PORT } from './access-policy/access-policy-cache.port';\nimport {\n clearOAuthPendingStrategy,\n getOAuthPendingStrategy,\n isOAuthRedirectInFlight,\n setOAuthPendingStrategy,\n} from './oauth-pending.util';\nimport { withAuthRefreshLock } from './auth-refresh-lock.util';\nimport { isDefinitiveAuthRefreshFailure } from './auth-refresh-failure.util';\nimport {\n resolveStatusAfterSoftRestore,\n shouldRetryAccessPolicyAuthorization,\n} from './auth-soft-restore.util';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPSessionService {\n private eventService = inject(AXPBroadcastEventService);\n\n private authStrategyRegistry = inject(AXPAuthStrategyRegistryService);\n private readonly injector = inject(Injector);\n public static readonly SESSION_KEY = 'AXP_SESSION';\n\n private readonly permissionLoader = inject(AXP_PERMISSION_LOADER);\n private readonly featureLoader = inject(AXP_FEATURE_LOADER);\n private readonly tenantLoader = inject(AXP_TENANT_LOADER);\n private readonly applicationLoader = inject(AXP_APPLICATION_LOADER);\n private readonly permissionChecker = inject(AXP_PERMISSION_CHECKER, { optional: true });\n private readonly featureChecker = inject(AXP_FEATURE_CHECKER, { optional: true });\n private readonly accessPolicyCache = inject(AXP_ACCESS_POLICY_CACHE_PORT, { optional: true });\n\n /** In-memory catalog caches — shared by guards and chooser UI (one List* per bind). */\n private tenantsListCache: { userId: string; items: AXPTenant[] } | null = null;\n private applicationsListCache: { tenantId: string; items: AXPApplication[] } | null = null;\n /** Bumps when catalogs must re-fetch (e.g. after tenant-request approve). */\n private readonly catalogEpoch$ = new BehaviorSubject(0);\n private signoutInFlight: Promise<void> | null = null;\n /** Coalesces soft-restore → Authorized promotion after connectivity recovers. */\n private accessPolicyRetryInFlight: Promise<boolean> | null = null;\n private softRestoreOnlineRecoveryAttached = false;\n private softRestoreOnlineRecoveryHandler: (() => void) | null = null;\n\n private status = new BehaviorSubject<AXPSessionStatus>(AXPSessionStatus.Unauthenticated);\n public readonly status$ = this.status.asObservable().pipe(shareReplay(1));\n\n // Add loading state to prevent premature redirects\n private isLoading = new BehaviorSubject<boolean>(true);\n public readonly isLoading$ = this.isLoading.asObservable().pipe(shareReplay(1));\n\n private currentUserSubject = new BehaviorSubject<AXPUser | null>(null);\n public readonly user$ = this.currentUserSubject.asObservable().pipe(shareReplay(1));\n public get user(): AXPUser | null {\n this.syncContextSubjectsFromStorage();\n return this.currentUserSubject.value;\n }\n\n private currentTenantSubject = new BehaviorSubject<AXPTenant | null>(null);\n public readonly tenant$ = this.currentTenantSubject.asObservable().pipe(shareReplay(1));\n public get tenant(): AXPTenant | null {\n this.syncContextSubjectsFromStorage();\n return this.currentTenantSubject.value;\n }\n\n private currentApplicationSubject = new BehaviorSubject<AXPApplication | null>(null);\n public readonly application$ = this.currentApplicationSubject.asObservable().pipe(shareReplay(1));\n public get application(): AXPApplication | null {\n this.syncContextSubjectsFromStorage();\n return this.currentApplicationSubject.value;\n }\n\n private permissionsSubject = new BehaviorSubject<AXPPermission[]>([]);\n public readonly permissions$ = this.permissionsSubject.asObservable().pipe(shareReplay(1), defaultIfEmpty([]));\n public get permissions(): AXPPermission[] {\n return this.permissionsSubject.value ?? [];\n }\n\n private featuresSubject = new BehaviorSubject<AXPFeature[]>([]);\n public readonly features$ = this.featuresSubject.asObservable().pipe(shareReplay(1), defaultIfEmpty([]));\n public get features(): AXPFeature[] {\n return this.featuresSubject.value ?? [];\n }\n\n public readonly isAuthenticated$ = this.status$.pipe(\n map((status) => this.isAuthenticatedStatus(status)),\n shareReplay(1),\n );\n\n /** Synchronous counterpart to {@link isAuthenticated$}. */\n public get isAuthenticated(): boolean {\n return this.isAuthenticatedStatus(this.status.value);\n }\n\n // Add a new observable that considers loading state\n public readonly isAuthenticatedWithLoading$ = this.isLoading$.pipe(\n switchMap((loading) => {\n if (loading) {\n // Wait for loading to complete, then return authentication status\n return this.isLoading$.pipe(\n filter((isLoading) => !isLoading),\n switchMap(() => this.isAuthenticated$),\n );\n }\n // If not loading, return current authentication status\n return this.isAuthenticated$;\n }),\n shareReplay(1),\n );\n\n public readonly isAuthorized$ = this.status$.pipe(\n map((status) => status === AXPSessionStatus.Authorized),\n shareReplay(1),\n );\n\n /** Synchronous counterpart to {@link isAuthorized$}. */\n public get isAuthorized(): boolean {\n return this.status.value === AXPSessionStatus.Authorized;\n }\n\n /**\n * Tenant and application are selected and permissions are loaded.\n * Gate app-scoped runtime work (entity queries, inbox, activity).\n */\n public get isReadyForAppScopedApi(): boolean {\n return this.isAuthorized && this.hasSessionCredentials();\n }\n\n public readonly isReadyForAppScopedApi$ = this.isAuthorized$.pipe(\n map((authorized) => authorized && this.hasSessionCredentials()),\n distinctUntilChanged(),\n shareReplay(1),\n );\n\n /** Tenant list for the signed-in user; skips the API when there is no cookie session. */\n public readonly tenants$: Observable<AXPTenant[]> = combineLatest([\n this.isAuthenticated$,\n this.catalogEpoch$,\n ]).pipe(\n switchMap(([authenticated]): Observable<AXPTenant[]> => {\n if (!authenticated || !this.hasSessionCredentials()) {\n return of([]);\n }\n return from(this.getTenantsList());\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n\n /** Application list for the current tenant; skips the API when there is no cookie session. */\n public readonly applications$: Observable<AXPApplication[]> = combineLatest([\n this.isAuthenticated$,\n this.tenant$,\n ]).pipe(\n distinctUntilChanged(\n ([authenticated, tenant], [previousAuthenticated, previousTenant]) =>\n authenticated === previousAuthenticated && tenant?.id === previousTenant?.id,\n ),\n switchMap(([authenticated, tenant]): Observable<AXPApplication[]> => {\n if (!authenticated || !this.hasSessionCredentials() || !tenant?.id) {\n return of([]);\n }\n return from(this.getApplicationsList());\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n\n /** Waits for session restore to finish, then emits whether the session is fully authorized. */\n public readonly isAuthorizedWithLoading$ = this.isLoading$.pipe(\n switchMap((loading) => {\n if (loading) {\n return this.isLoading$.pipe(\n filter((isLoading) => !isLoading),\n switchMap(() => this.isAuthorized$),\n );\n }\n return this.isAuthorized$;\n }),\n shareReplay(1),\n );\n\n public async restoreSession(): Promise<void> {\n this.isLoading.next(true);\n const startedAt = Date.now();\n\n try {\n const sessionData = this.getSessionData();\n if (!sessionData?.user || !sessionData.cookieSession) {\n // OAuth code exchange needs `strategy` after redirect. Do not wipe the\n // pre-login strategy / pending key while PKCE (or pending strategy) exists.\n if (isOAuthRedirectInFlight()) {\n const strategy = sessionData?.strategy || getOAuthPendingStrategy();\n if (strategy && sessionData?.strategy !== strategy) {\n this.setSession({\n strategy,\n user: null,\n tenant: null,\n application: null,\n cookieSession: false,\n });\n }\n this.status.next(AXPSessionStatus.Unauthorized);\n traceAuthRestore('OAuth redirect in flight — kept strategy', () => ({ strategy }));\n return;\n }\n this.clearSession();\n this.status.next(AXPSessionStatus.Unauthorized);\n traceAuthRestore('No cookie session metadata — cleared');\n return;\n }\n\n // Validate HttpOnly cookies and rotate tokens before trusting local metadata.\n const strategyName = sessionData.strategy;\n const strategy = strategyName ? this.authStrategyRegistry.get(strategyName) : null;\n if (!strategy) {\n // Keep AXP_SESSION — wiping here permanently logs the user out on a\n // registry timing race. Soft-restore; interceptor can refresh later.\n warnAuthLifecycle('Restore strategy missing — soft restore (kept session)', () => ({\n strategyName,\n }));\n await this.softRestoreFromStoredSession(sessionData);\n return;\n }\n\n // Keep subjects warm for refresh context, but do NOT mark Authenticated yet —\n // that would trigger settings/chat side-effects while isLoading is still true.\n this.currentUserSubject.next(sessionData.user);\n this.currentTenantSubject.next(sessionData.tenant ?? null);\n this.currentApplicationSubject.next(sessionData.application ?? null);\n\n traceAuthRestore('Refreshing cookie session', () => ({\n userId: sessionData.user?.id,\n tenantId: sessionData.tenant?.id,\n applicationId: sessionData.application?.id,\n strategy: strategyName,\n }));\n\n try {\n // Cross-tab exclusive refresh — avoids concurrent jti reuse / sid revoke.\n const refreshResult = await this.refreshCookieSessionExclusive(strategyName, strategy);\n if (refreshResult?.succeed && refreshResult.data?.user) {\n await this.applySignInResult(strategyName, refreshResult);\n traceAuthRestore('Restore complete', () => ({\n ms: Date.now() - startedAt,\n status: this.status.value,\n tenantId: this.tenant?.id,\n applicationId: this.application?.id,\n }));\n return;\n }\n\n // succeed:false without throw — usually lock/metadata race; do not kick out.\n warnAuthLifecycle('Restore refresh returned empty — soft restore (kept session)');\n await this.softRestoreFromStoredSession(sessionData);\n } catch (error) {\n if (isDefinitiveAuthRefreshFailure(error)) {\n this.clearSession();\n this.status.next(AXPSessionStatus.Unauthorized);\n traceAuthRestore('Restore refresh rejected — cleared', () => ({\n error: error instanceof Error ? error.message : String(error),\n }));\n return;\n }\n\n // Network / 5xx / aborted XHR after HMR reload — keep local session.\n warnAuthLifecycle('Restore refresh transient failure — soft restore (kept session)', () => ({\n error: error instanceof Error ? error.message : String(error),\n }));\n await this.softRestoreFromStoredSession(sessionData);\n }\n } catch (error) {\n const sessionData = this.getSessionData();\n if (sessionData?.user && sessionData.cookieSession && !isDefinitiveAuthRefreshFailure(error)) {\n warnAuthLifecycle('Restore error — soft restore (kept session)', () => ({\n error: error instanceof Error ? error.message : String(error),\n }));\n await this.softRestoreFromStoredSession(sessionData);\n return;\n }\n\n this.clearSession();\n this.status.next(AXPSessionStatus.Unauthorized);\n traceAuthRestore('Restore error — cleared', () => ({\n error: error instanceof Error ? error.message : String(error),\n }));\n } finally {\n this.isLoading.next(false);\n }\n }\n\n /**\n * Trust persisted AXP_SESSION after a non-definitive restore refresh failure.\n * Keeps identity; promotes to Authorized only when access policy load succeeds.\n */\n private async softRestoreFromStoredSession(sessionData: AXPSessionData): Promise<void> {\n this.currentUserSubject.next(sessionData.user ?? null);\n this.currentTenantSubject.next(sessionData.tenant ?? null);\n this.currentApplicationSubject.next(sessionData.application ?? null);\n\n const policyLoadSucceeded = await this.tryLoadAccessPolicyForSoftRestore();\n const nextStatus = resolveStatusAfterSoftRestore({\n hasUser: !!sessionData.user,\n hasCompleteWorkspace: this.hasCompleteSessionContext(),\n policyLoadSucceeded,\n });\n this.status.next(nextStatus);\n traceAuthRestore('Soft restore status', () => ({\n status: nextStatus,\n policyLoadSucceeded,\n tenantId: sessionData.tenant?.id ?? null,\n applicationId: sessionData.application?.id ?? null,\n }));\n if (shouldRetryAccessPolicyAuthorization(nextStatus)) {\n this.armSoftRestorePolicyRecovery();\n }\n }\n\n /**\n * Soft-restore policy load: success = both loaders completed without throw\n * (empty permission/feature lists still count as a successful load).\n */\n private async tryLoadAccessPolicyForSoftRestore(): Promise<boolean> {\n if (!this.hasCompleteSessionContext()) {\n this.permissionsSubject.next([]);\n this.featuresSubject.next([]);\n return false;\n }\n\n let permissionsOk = false;\n let featuresOk = false;\n\n try {\n const permissions = await this.permissionLoader.getList(this.getContext());\n this.permissionsSubject.next(permissions ?? []);\n permissionsOk = true;\n } catch (error) {\n warnAuthLifecycle('Soft restore permissions load failed — stay Authenticated', () => ({\n error: error instanceof Error ? error.message : String(error),\n }));\n this.permissionsSubject.next([]);\n }\n\n try {\n const features = await this.featureLoader.getList(this.getContext());\n this.featuresSubject.next(features ?? []);\n featuresOk = true;\n } catch (error) {\n warnAuthLifecycle('Soft restore features load failed — stay Authenticated', () => ({\n error: error instanceof Error ? error.message : String(error),\n }));\n this.featuresSubject.next([]);\n }\n\n return permissionsOk && featuresOk;\n }\n\n /**\n * Retries access-policy load after a soft restore that stayed Authenticated.\n * On success with complete workspace, promotes to Authorized (no logout on failure).\n * Coalesces concurrent callers (refresh / online / successful API).\n */\n public async retryAccessPolicyAuthorization(): Promise<boolean> {\n if (!this.user) {\n return false;\n }\n if (!shouldRetryAccessPolicyAuthorization(this.status.value)) {\n return this.status.value === AXPSessionStatus.Authorized;\n }\n if (this.accessPolicyRetryInFlight) {\n return this.accessPolicyRetryInFlight;\n }\n this.accessPolicyRetryInFlight = (async () => {\n const policyLoadSucceeded = await this.tryLoadAccessPolicyForSoftRestore();\n const nextStatus = resolveStatusAfterSoftRestore({\n hasUser: true,\n hasCompleteWorkspace: this.hasCompleteSessionContext(),\n policyLoadSucceeded,\n });\n this.status.next(nextStatus);\n if (nextStatus === AXPSessionStatus.Authorized) {\n this.disarmSoftRestorePolicyRecovery();\n }\n return nextStatus === AXPSessionStatus.Authorized;\n })().finally(() => {\n this.accessPolicyRetryInFlight = null;\n });\n return this.accessPolicyRetryInFlight;\n }\n\n /**\n * Bounded recovery after soft-restore Authenticated: browser `online` once per arm.\n * Successful token refresh also retries (see {@link refreshToken}).\n */\n private armSoftRestorePolicyRecovery(): void {\n if (this.softRestoreOnlineRecoveryAttached || typeof window === 'undefined') {\n return;\n }\n this.softRestoreOnlineRecoveryAttached = true;\n this.softRestoreOnlineRecoveryHandler = () => {\n void this.retryAccessPolicyAuthorization();\n };\n window.addEventListener('online', this.softRestoreOnlineRecoveryHandler);\n }\n\n private disarmSoftRestorePolicyRecovery(): void {\n if (\n this.softRestoreOnlineRecoveryAttached &&\n this.softRestoreOnlineRecoveryHandler &&\n typeof window !== 'undefined'\n ) {\n window.removeEventListener('online', this.softRestoreOnlineRecoveryHandler);\n }\n this.softRestoreOnlineRecoveryAttached = false;\n this.softRestoreOnlineRecoveryHandler = null;\n }\n\n async signin(credentials: AXPBaseCredentials): Promise<void> {\n this.isLoading.next(true);\n const startedAt = Date.now();\n traceAuthLifecycle('Sign-in started', () => ({ strategy: credentials.strategy }));\n try {\n const strategy = this.authStrategyRegistry.get(credentials.strategy);\n if (!strategy) {\n throw new Error(`Authentication strategy '${credentials.strategy}' is not supported`);\n }\n const result = await strategy.signin(credentials);\n if (!result) {\n // Redirect / multi-step strategies return void — keep strategy + PKCE metadata.\n this.status.next(AXPSessionStatus.Unauthenticated);\n return;\n }\n if (result?.succeed) {\n await this.applySignInResult(credentials.strategy, result);\n traceAuthLifecycle('Sign-in succeeded', () => ({\n ms: Date.now() - startedAt,\n userId: this.user?.id,\n tenantId: this.tenant?.id,\n applicationId: this.application?.id,\n status: this.status.value,\n }));\n } else {\n this.clearSession();\n this.status.next(AXPSessionStatus.Unauthenticated);\n throw new Error(`Invalid Username or Password`);\n }\n } catch (error) {\n traceAuthLifecycleError('Sign-in failed', () => ({\n error: error instanceof Error ? error.message : String(error),\n }));\n this.clearSession();\n this.status.next(AXPSessionStatus.Unauthenticated);\n throw error;\n } finally {\n this.isLoading.next(false);\n }\n }\n\n async register(credentials: AXPBaseCredentials): Promise<void> {\n this.isLoading.next(true);\n try {\n const strategy = this.authStrategyRegistry.get(credentials.strategy);\n if (!strategy || typeof (strategy as { register?: unknown }).register !== 'function') {\n throw new Error(`Registration is not supported for strategy '${credentials.strategy}'`);\n }\n\n const result = await (\n strategy as AXPAuthStrategy & {\n register: (input: AXPBaseCredentials) => Promise<AXPSignInResult>;\n }\n ).register(credentials);\n\n if (!result?.succeed) {\n this.status.next(AXPSessionStatus.Unauthenticated);\n throw new Error('Registration failed');\n }\n\n await this.applySignInResult(credentials.strategy, result);\n } catch (error) {\n console.error('Register error:', error);\n this.clearSession();\n this.status.next(AXPSessionStatus.Unauthenticated);\n throw error;\n } finally {\n this.isLoading.next(false);\n }\n }\n\n private async applySignInResult(strategy: string, result: AXPSignInResult): Promise<void> {\n // Reset client metadata only — do not call clearSession() (that flips status to\n // Unauthenticated and can trigger logout listeners mid-flow).\n this.invalidateAccessPolicyCache();\n this.clearCatalogCaches();\n this.permissionsSubject.next([]);\n this.featuresSubject.next([]);\n this.currentUserSubject.next(result.data!.user);\n this.setSession({\n strategy,\n user: result.data!.user,\n tenant: result.data?.tenant ?? null,\n // Fresh sign-in tokens omit application; refresh/restore may include it.\n application: result.data?.application ?? null,\n expiresIn: result.data?.expiresIn,\n locked: false,\n cookieSession: true,\n });\n await this.reloadAccessPolicyIfReady('applySignInResult');\n await this.syncSessionAuthorization();\n }\n\n /**\n * Clears the selected application so the user must pick one (app chooser).\n * Keeps tenant/user/token intact and demotes status to Authenticated.\n */\n public clearApplicationSelection(): void {\n if (!this.application?.id) {\n return;\n }\n\n this.setSession({ application: null });\n if (this.user) {\n this.status.next(AXPSessionStatus.Authenticated);\n }\n }\n\n async updateToken(params?: { [key: string]: any }): Promise<void> {\n this.isLoading.next(true);\n const startedAt = Date.now();\n\n const isApplicationUpdate = this.isApplicationContextUpdate(params);\n const isTenantUpdate = this.isTenantContextUpdate(params);\n\n traceAuthWorkspace('UpdateSession started', () => ({\n isTenantUpdate,\n isApplicationUpdate,\n tenantId: params?.['tenant']?.id ?? params?.['tenantId'],\n applicationId: params?.['application']?.id ?? params?.['applicationId'],\n }));\n\n // Pause app-scoped API work while token/context is rebound (avoids 401/403 races).\n if (this.isAuthorized) {\n this.status.next(AXPSessionStatus.Authenticated);\n }\n if (isTenantUpdate && !isApplicationUpdate) {\n this.currentApplicationSubject.next(null);\n this.applicationsListCache = null;\n }\n\n try {\n const strategyName = this.resolveStrategyName();\n if (!strategyName) {\n throw new Error('Strategy not found');\n }\n const strategy = this.authStrategyRegistry.get(strategyName);\n if (!strategy) {\n throw new Error(`Authentication strategy '${strategyName}' is not supported`);\n }\n // Same lock as cookie refresh — UpdateSession rotates refresh `jti`.\n // A restore in another tab must not consume the previous cookie concurrently.\n const result = await withAuthRefreshLock(() => strategy.updateToken(params));\n if (result?.succeed) {\n if (params?.['code']) {\n // OAuth code exchange replaces identity metadata; wipe stale local fields first.\n this.clearSession();\n clearOAuthPendingStrategy();\n } else {\n this.permissionsSubject.next([]);\n this.featuresSubject.next([]);\n this.invalidateAccessPolicyCache();\n }\n this.currentUserSubject.next(result.data!.user);\n this.setSession({\n strategy: strategyName,\n user: result.data!.user,\n tenant: result.data?.tenant ?? null,\n application: this.resolveApplicationAfterUpdate(\n result.data?.application ?? null,\n isApplicationUpdate,\n isTenantUpdate,\n ),\n expiresIn: result.data?.expiresIn,\n locked: false,\n cookieSession: true,\n });\n await this.reloadAccessPolicyIfReady('updateToken');\n await this.syncSessionAuthorization();\n traceAuthWorkspace('UpdateSession complete', () => ({\n ms: Date.now() - startedAt,\n status: this.status.value,\n tenantId: this.tenant?.id,\n applicationId: this.application?.id,\n }));\n } else {\n throw new Error('UpdateSession failed');\n }\n } catch (error) {\n traceAuthLifecycleError('UpdateSession failed', () => ({\n error: error instanceof Error ? error.message : String(error),\n }));\n warnAuthWorkspace('UpdateSession failed — identity session kept', () => ({\n error: error instanceof Error ? error.message : String(error),\n tenantId: params?.['tenant']?.id ?? params?.['tenantId'] ?? null,\n applicationId: params?.['application']?.id ?? params?.['applicationId'] ?? null,\n }));\n if (params?.['code']) {\n clearOAuthPendingStrategy();\n }\n // Workspace bind failure (tenant/app/network/membership) must not log the user out.\n // Restore subjects from AXP_SESSION after the optimistic application clear above.\n this.syncContextSubjectsFromStorage();\n const stored = this.getSessionData();\n if (stored?.user && stored.cookieSession) {\n await this.syncSessionAuthorization();\n }\n throw error;\n } finally {\n this.isLoading.next(false);\n }\n }\n\n async signout(): Promise<void> {\n if (this.signoutInFlight) {\n return this.signoutInFlight;\n }\n\n this.signoutInFlight = this.performSignout().finally(() => {\n this.signoutInFlight = null;\n });\n return this.signoutInFlight;\n }\n\n /**\n * Clears the client session first, then redirects, then revokes the server session.\n * Waiting on the logout HTTP call (or flipping isLoading) used to skip the login\n * redirect and let in-flight 401s start a competing navigation back into the app.\n */\n private async performSignout(): Promise<void> {\n const userId = this.user?.id;\n const sessionData = this.getSessionData();\n const strategy = sessionData?.strategy\n ? this.authStrategyRegistry.get(sessionData.strategy)\n : null;\n\n traceAuthLifecycle('Sign-out started', () => ({ userId }));\n\n this.clearSession();\n this.eventService.publish(AXPSessionStatus.SignedOut, { id: userId });\n this.status.next(AXPSessionStatus.SignedOut);\n this.navigateToLoginAfterSignout();\n\n if (strategy) {\n try {\n await strategy.signout();\n } catch {\n // Ignore logout network errors; client session is already cleared.\n }\n }\n\n traceAuthLifecycle('Sign-out complete', () => ({ userId }));\n }\n\n private navigateToLoginAfterSignout(): void {\n try {\n const router = this.injector.get(Router);\n const path = (router.url ?? '').split('?')[0];\n if (path.startsWith('/auth')) {\n return;\n }\n void router.navigateByUrl('/auth/login', { replaceUrl: true });\n } catch {\n // Router is unavailable in some test / early-boot hosts.\n }\n }\n\n async refreshToken(): Promise<boolean> {\n const sessionData = this.getSessionData();\n if (!sessionData?.strategy || !sessionData.cookieSession) {\n throw new Error('No cookie session available');\n }\n const strategyName = sessionData.strategy;\n const strategy = this.authStrategyRegistry.get(strategyName);\n if (!strategy) {\n throw new Error(`Authentication strategy '${strategyName}' is not found`);\n }\n\n try {\n const result = await this.refreshCookieSessionExclusive(strategyName, strategy);\n if (!result.succeed || !result.data?.user) {\n // Empty result is usually a lock/metadata race — not proof the cookie is dead.\n warnAuthLifecycle('Token refresh returned empty — session kept', () => ({\n strategy: strategyName,\n }));\n throw new Error('Token refresh failed');\n }\n // Soft restore may have left Authenticated; promote once API/refresh works again.\n if (shouldRetryAccessPolicyAuthorization(this.status.value)) {\n await this.retryAccessPolicyAuthorization();\n }\n return true;\n } catch (error) {\n if (isDefinitiveAuthRefreshFailure(error)) {\n warnAuthLifecycle('Token refresh definitive failure — clearing session', () => ({\n error: error instanceof Error ? error.message : String(error),\n }));\n this.clearSession();\n this.status.next(AXPSessionStatus.Expired);\n } else {\n warnAuthLifecycle('Token refresh transient error — session kept', () => ({\n error: error instanceof Error ? error.message : String(error),\n }));\n }\n throw error;\n }\n }\n\n /**\n * One refresh at a time across tabs (Web Locks). Re-reads and writes session\n * metadata inside the lock so a peer tab never replays the same refresh `jti`.\n */\n private async refreshCookieSessionExclusive(\n strategyName: string,\n strategy: AXPAuthStrategy,\n ): Promise<AXPSignInResult> {\n return withAuthRefreshLock(async () => {\n const latest = this.getSessionData();\n if (!latest?.user || !latest.cookieSession) {\n return { succeed: false };\n }\n\n const activeStrategyName = latest.strategy?.trim() || strategyName;\n const activeStrategy =\n activeStrategyName === strategyName\n ? strategy\n : this.authStrategyRegistry.get(activeStrategyName);\n if (!activeStrategy) {\n return { succeed: false };\n }\n\n const refreshResult = await activeStrategy.refreshToken(this.getContext());\n if (!refreshResult?.succeed || !refreshResult.data?.user) {\n return { succeed: false };\n }\n\n const merged: AXPSignInResult = {\n succeed: true,\n data: {\n ...refreshResult.data,\n tenant: refreshResult.data.tenant ?? latest.tenant ?? null,\n application: refreshResult.data.application ?? latest.application ?? null,\n },\n };\n\n // Persist before releasing the lock so the next tab reads updated metadata.\n this.setSession({\n strategy: activeStrategyName,\n user: merged.data!.user,\n tenant: merged.data!.tenant ?? null,\n application: merged.data!.application ?? null,\n expiresIn: merged.data!.expiresIn,\n cookieSession: true,\n locked: latest.locked === true,\n });\n\n return merged;\n });\n }\n\n /**\n * Auth:GetAccessPolicy is only meaningful with tenant + application bound.\n * Skipping incomplete contexts cuts 2 redundant calls on the common login path.\n */\n private async reloadAccessPolicyIfReady(reason: string): Promise<void> {\n if (!this.hasCompleteSessionContext()) {\n this.permissionsSubject.next([]);\n this.featuresSubject.next([]);\n traceAuthAccessPolicy('Skipped GetAccessPolicy (incomplete workspace)', () => ({\n reason,\n tenantId: this.tenant?.id ?? null,\n applicationId: this.application?.id ?? null,\n }));\n return;\n }\n\n const startedAt = Date.now();\n await this.loadPermissions();\n await this.loadFeatures();\n traceAuthAccessPolicy('GetAccessPolicy loaded', () => ({\n reason,\n ms: Date.now() - startedAt,\n permissionCount: this.permissions.length,\n featureCount: this.features.length,\n tenantId: this.tenant?.id,\n applicationId: this.application?.id,\n }));\n if (reason === 'updateToken' && this.permissions.length === 0) {\n warnAuthAccessPolicy('GetAccessPolicy returned empty permissions after workspace bind', () => ({\n reason,\n tenantId: this.tenant?.id ?? null,\n applicationId: this.application?.id ?? null,\n featureCount: this.features.length,\n }));\n }\n }\n\n private async loadPermissions(): Promise<void> {\n try {\n const permissions = await this.permissionLoader.getList(this.getContext());\n this.permissionsSubject.next(permissions ?? []);\n } catch (error) {\n traceAuthLifecycleError('Load permissions failed', () => ({\n error: error instanceof Error ? error.message : String(error),\n }));\n warnAuthLifecycle('Load permissions failed — menus may be empty', () => ({\n error: error instanceof Error ? error.message : String(error),\n tenantId: this.tenant?.id ?? null,\n applicationId: this.application?.id ?? null,\n }));\n this.permissionsSubject.next([]);\n }\n }\n\n private async loadFeatures(): Promise<void> {\n try {\n const features = await this.featureLoader.getList(this.getContext());\n this.featuresSubject.next(features ?? []);\n } catch (error) {\n traceAuthLifecycleError('Load features failed', () => ({\n error: error instanceof Error ? error.message : String(error),\n }));\n this.featuresSubject.next([]);\n }\n }\n\n /** Shared ListTenants — used by guards and {@link tenants$}. */\n public async getTenantsList(): Promise<AXPTenant[]> {\n if (!this.hasSessionCredentials()) {\n return [];\n }\n const userId = this.user?.id ?? '';\n if (this.tenantsListCache?.userId === userId) {\n traceAuthCatalog('Tenants cache hit', () => ({\n userId,\n count: this.tenantsListCache!.items.length,\n }));\n return this.tenantsListCache.items;\n }\n\n const startedAt = Date.now();\n const items = await this.tenantLoader.getList(this.getContext());\n this.tenantsListCache = { userId, items };\n traceAuthCatalog('Tenants fetched', () => ({\n userId,\n count: items.length,\n ms: Date.now() - startedAt,\n }));\n return items;\n }\n\n /** Shared ListApplications — used by guards and {@link applications$}. */\n public async getApplicationsList(): Promise<AXPApplication[]> {\n if (!this.hasSessionCredentials() || !this.tenant?.id) {\n return [];\n }\n const tenantId = this.tenant.id;\n if (this.applicationsListCache?.tenantId === tenantId) {\n traceAuthCatalog('Applications cache hit', () => ({\n tenantId,\n count: this.applicationsListCache!.items.length,\n }));\n return this.applicationsListCache.items;\n }\n\n const startedAt = Date.now();\n const items = await this.applicationLoader.getList(this.getContext());\n this.applicationsListCache = { tenantId, items };\n traceAuthCatalog('Applications fetched', () => ({\n tenantId,\n count: items.length,\n ms: Date.now() - startedAt,\n }));\n return items;\n }\n\n private clearCatalogCaches(): void {\n this.tenantsListCache = null;\n this.applicationsListCache = null;\n }\n\n /**\n * Drops ListTenants / ListApplications caches and re-emits {@link tenants$}.\n * Call after membership/tenant availability changes (e.g. approve tenant request).\n */\n public invalidateCatalogCaches(): void {\n this.clearCatalogCaches();\n this.catalogEpoch$.next(this.catalogEpoch$.value + 1);\n }\n\n async signInComplete() {\n // Ensure we have the required data\n if (!this.user) {\n this.status.next(AXPSessionStatus.Unauthenticated);\n return;\n }\n\n // Set status to Authorized\n this.status.next(AXPSessionStatus.Authorized);\n }\n\n /** Tenant + application must be bound before menu, permissions, and features are fully valid. */\n private hasCompleteSessionContext(): boolean {\n return !!(this.tenant?.id && this.application?.id);\n }\n\n /**\n * Keeps session status aligned with context: Authenticated after sign-in / tenant pick,\n * Authorized only once tenant and application are selected and loaders have finished.\n */\n private async syncSessionAuthorization(): Promise<void> {\n if (!this.user) {\n this.status.next(AXPSessionStatus.Unauthenticated);\n return;\n }\n\n if (this.hasCompleteSessionContext()) {\n await this.signInComplete();\n return;\n }\n\n this.status.next(AXPSessionStatus.Authenticated);\n }\n\n public setSession(partial: Partial<AXPSessionData>): void {\n const existing = this.getSessionData() ?? { strategy: partial.strategy ?? 'user-pass' };\n const sessionData: AXPSessionData = {\n ...existing,\n ...partial,\n strategy: partial.strategy ?? existing.strategy ?? 'user-pass',\n };\n\n // Never persist tokens in browser storage — HttpOnly cookies are authoritative.\n delete (sessionData as { accessToken?: unknown }).accessToken;\n delete (sessionData as { refreshToken?: unknown }).refreshToken;\n delete (sessionData as { idToken?: unknown }).idToken;\n\n if (partial.user) {\n this.currentUserSubject.next(partial.user);\n }\n if ('tenant' in partial) {\n this.currentTenantSubject.next(partial.tenant ?? null);\n }\n if ('application' in partial) {\n this.currentApplicationSubject.next(partial.application ?? null);\n }\n localStorage.setItem(AXPSessionService.SESSION_KEY, JSON.stringify(sessionData));\n }\n\n /** Whether the client lock overlay should remain active after reload. */\n public isLocked(): boolean {\n return this.getSessionData()?.locked === true;\n }\n\n /** Persists client lock state inside {@link AXPSessionService.SESSION_KEY}. */\n public setLocked(locked: boolean): void {\n const existing = this.getSessionData();\n if (!existing) {\n return;\n }\n\n this.setSession({ locked });\n }\n\n public setStrategy(strategy: string): void {\n setOAuthPendingStrategy(strategy);\n const sessionData = this.getSessionData();\n // Do not invent a persisted session from strategy alone (pre-login).\n // That leaves a partial AXP_SESSION and can break splash restore after a failed sign-in.\n if (!sessionData?.user && !sessionData?.cookieSession) {\n this.setSession({ strategy, user: null, tenant: null, application: null, cookieSession: false });\n return;\n }\n this.setSession({ ...sessionData, strategy });\n }\n\n /** Session strategy, or pending OAuth strategy left for the callback page. */\n private resolveStrategyName(): string | null {\n return this.getSessionData()?.strategy?.trim() || getOAuthPendingStrategy();\n }\n\n public getSessionData(): AXPSessionData | null {\n try {\n const sessionDataString = localStorage.getItem(AXPSessionService.SESSION_KEY);\n if (sessionDataString) {\n const sessionData = JSON.parse(sessionDataString);\n\n return sessionData;\n } else {\n return null;\n }\n } catch (error) {\n localStorage.removeItem(AXPSessionService.SESSION_KEY);\n return null;\n }\n }\n\n private clearSession(): void {\n this.disarmSoftRestorePolicyRecovery();\n this.invalidateAccessPolicyCache();\n this.clearCatalogCaches();\n this.status.next(AXPSessionStatus.Unauthenticated);\n this.currentUserSubject.next(null);\n this.currentTenantSubject.next(null);\n this.currentApplicationSubject.next(null);\n this.permissionsSubject.next([]);\n this.featuresSubject.next([]);\n localStorage.removeItem(AXPSessionService.SESSION_KEY);\n clearOAuthPendingStrategy();\n }\n\n /** Keeps in-memory subjects aligned with persisted session (e.g. after user switch). */\n private syncContextSubjectsFromStorage(): void {\n const session = this.getSessionData();\n if (!session) {\n return;\n }\n\n const sessionUser = session.user ?? null;\n if (sessionUser?.id !== this.currentUserSubject.value?.id) {\n this.currentUserSubject.next(sessionUser);\n }\n\n const sessionTenant = session.tenant ?? null;\n if (sessionTenant?.id !== this.currentTenantSubject.value?.id) {\n this.currentTenantSubject.next(sessionTenant);\n }\n\n const sessionApplication = session.application ?? null;\n if (sessionApplication?.id !== this.currentApplicationSubject.value?.id) {\n this.currentApplicationSubject.next(sessionApplication);\n }\n }\n\n public authorize(...keys: string[]): boolean {\n // Calculate base result\n const baseResult = keys.every((k) => {\n if (isEmpty(k)) return true;\n\n // Check if user has the permission\n const hasPermission = this.permissions.indexOf(k) > -1;\n if (!hasPermission) return false;\n\n // Check if permission has required features (if permission definition service is available)\n // Note: This is a lightweight check. Full feature validation happens in permission definition service.\n return true;\n });\n\n // If permission checker is provided, use it to potentially override the result\n if (this.permissionChecker) {\n const context = this.getContext();\n return this.permissionChecker.check(keys, context, baseResult);\n }\n\n return baseResult;\n }\n\n public isFeatureEnabled(...keys: string[]): boolean {\n // Calculate base result\n const baseResult = keys.every((k) => isEmpty(k) || this.features.some((c) => c.name == k && c.value == true));\n\n // If feature checker is provided, use it to potentially override the result\n if (this.featureChecker) {\n const context = this.getContext();\n return this.featureChecker.check(keys, context, baseResult);\n }\n\n return baseResult;\n }\n\n /**\n * Checks if a module is enabled for the current tenant/application.\n * Module names are stored as features with value: true when enabled.\n * Module names can be provided in PascalCase (e.g., 'SecurityManagement') or kebab-case (e.g., 'security-management').\n */\n public isModuleEnabled(moduleName: string): boolean {\n if (!moduleName) {\n return false;\n }\n\n // Normalize module name: convert kebab-case to PascalCase if needed\n const normalizedModuleName = moduleName.includes('-')\n ? moduleName.split('-').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join('')\n : moduleName;\n\n // Module names are stored as features with value: true when enabled\n return this.features.some(f => f.name === normalizedModuleName && f.value === true);\n }\n\n /**\n * Access tokens are HttpOnly and not readable from JS.\n * Use {@link hasSessionCredentials} for auth gating.\n */\n public getToken(): string | undefined {\n return undefined;\n }\n\n /** True when the SPA has an active cookie-backed session. */\n public hasSessionCredentials(): boolean {\n return this.getSessionData()?.cookieSession === true && this.isAuthenticated;\n }\n\n public getContext(): AXPSessionContext {\n return new AXPSessionContext({\n user: this.user,\n tenant: this.tenant,\n application: this.application,\n });\n }\n\n private invalidateAccessPolicyCache(): void {\n this.accessPolicyCache?.invalidate();\n }\n\n private isApplicationContextUpdate(params?: { [key: string]: unknown }): boolean {\n return params?.['application'] != null || params?.['applicationId'] != null;\n }\n\n private isTenantContextUpdate(params?: { [key: string]: unknown }): boolean {\n return params?.['tenant'] != null || params?.['tenantId'] != null;\n }\n\n private resolveApplicationAfterUpdate(\n fromToken: AXPApplication | null,\n isApplicationUpdate: boolean,\n isTenantUpdate: boolean,\n ): AXPApplication | null {\n if (isApplicationUpdate) {\n return fromToken;\n }\n if (isTenantUpdate) {\n return null;\n }\n return fromToken;\n }\n\n private isAuthenticatedStatus(status: AXPSessionStatus): boolean {\n return status === AXPSessionStatus.Authenticated || status === AXPSessionStatus.Authorized;\n }\n}\n","import { Directive, Input, TemplateRef, ViewContainerRef, inject, signal } from '@angular/core';\nimport { Subscription, combineLatest } from 'rxjs';\nimport { AXPSessionService } from '../session.service';\n\n@Directive({\n selector: '[permission]',\n standalone: false\n})\nexport class AXPPermissionDirective {\n private hasView = signal(false);\n private subscription!: Subscription;\n private sessionService = inject(AXPSessionService);\n\n constructor(\n private templateRef: TemplateRef<any>,\n private viewContainer: ViewContainerRef\n ) { }\n\n @Input()\n public set permission(permissionKeys: string | string[] | null) {\n const keys: string[] = !permissionKeys ? [] : (Array.isArray(permissionKeys) ? permissionKeys : [permissionKeys]);\n if (keys.length == 0) {\n // If permissionKey is null or empty, decide the default behavior here\n this.viewContainer.createEmbeddedView(this.templateRef);\n this.hasView.set(true);\n return;\n }\n this.subscription = combineLatest([\n this.sessionService.isAuthorized$,\n this.sessionService.permissions$,\n ]).subscribe(([isAuthorized]) => {\n if (isAuthorized && this.sessionService.authorize(...keys)) {\n if (!this.hasView()) {\n this.viewContainer.createEmbeddedView(this.templateRef);\n this.hasView.set(true);\n }\n } else {\n this.viewContainer.clear();\n this.hasView.set(false);\n }\n });\n }\n\n @Input()\n public set permissionElse(elseTemplateRef: TemplateRef<any>) {\n if (!this.hasView()) {\n this.viewContainer.createEmbeddedView(elseTemplateRef);\n }\n }\n\n ngOnDestroy() {\n this.subscription?.unsubscribe();\n }\n}\n","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivateFn, RouterStateSnapshot } from '@angular/router';\nimport { first, map } from 'rxjs';\nimport { AXPUnauthorizedError } from '../contracts/errors.types';\nimport { AXPSessionService } from '../session.service';\n\nexport const AXPPermissionGuard: CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n const sessionService = inject(AXPSessionService);\n\n const permissionKeys = route.data['requiredPermission'] as string | string[] | null;\n\n return sessionService.isAuthorizedWithLoading$.pipe(\n first(),\n map((value) => {\n const keys: string[] = !permissionKeys ? [] : Array.isArray(permissionKeys) ? permissionKeys : [permissionKeys];\n const hasPermission = keys.length == 0 || sessionService.authorize(...keys);\n if (!hasPermission) {\n throw new AXPUnauthorizedError(\n `Access denied. Required permissions: ${keys.join(', ')}. Please contact your administrator if you believe this is an error.`,\n {\n redirectUrl: state.url,\n },\n );\n }\n return true;\n }),\n );\n};\n","import { AXPPermissionDefinition, AXPPermissionGroupDefinition } from './permission.types';\n\n//#region ----- Types -----\n\nexport type AXPPermissionGroupAddOptions = {\n /** Parent group name — makes this group a right-panel section under that root. */\n parent?: string;\n /** Sort order among sibling sections (lower first). */\n order?: number;\n};\n\nexport type AXPPermissionAddOptions = {\n /** Required feature flags for this permission to appear. */\n requiredFeatures?: string[];\n /**\n * Edition module names this permission belongs to.\n * Availability uses ANY-match against the tenant application edition modules.\n */\n modules?: string[];\n};\n\n//#endregion\n\n//#region ----- Context -----\n\nexport class AXPPermissionDefinitionProviderContext {\n private builders: Map<string, AXPPermissionDefinitionGroupBuilder> = new Map();\n\n addGroup(\n name: string,\n title: string,\n description?: string,\n options?: AXPPermissionGroupAddOptions,\n ): AXPPermissionDefinitionGroupBuilder {\n if (this.isGroupDefined(name)) {\n const existing = this.findGroup(name)!;\n if (options?.parent && !existing.group.parent) {\n existing.group.parent = options.parent;\n }\n if (options?.order != null && existing.group.order == null) {\n existing.group.order = options.order;\n }\n return existing;\n }\n const group: AXPPermissionGroupDefinition = {\n name,\n title,\n description,\n parent: options?.parent,\n order: options?.order,\n permissions: [],\n };\n const builder = new AXPPermissionDefinitionGroupBuilder(this, group);\n this.builders.set(name, builder);\n return builder;\n }\n\n getGroupDefinitions(): AXPPermissionGroupDefinition[] {\n return Array.from(this.builders.values()).map((b) => b.group);\n }\n\n findGroup(name: string): AXPPermissionDefinitionGroupBuilder | undefined {\n return this.builders.get(name);\n }\n\n isGroupDefined(name: string): boolean {\n return this.builders.has(name);\n }\n}\n\n//#endregion\n\n//#region ----- Group Builder -----\n\nexport class AXPPermissionDefinitionGroupBuilder {\n private context: AXPPermissionDefinitionProviderContext;\n private _group: AXPPermissionGroupDefinition;\n\n public get group(): AXPPermissionGroupDefinition {\n return this._group;\n }\n\n constructor(context: AXPPermissionDefinitionProviderContext, group: AXPPermissionGroupDefinition) {\n this.context = context;\n this._group = group;\n }\n\n addPermission(\n name: string,\n title: string,\n description?: string,\n options?: AXPPermissionAddOptions | string[],\n ): AXPPermissionDefinitionBuilder {\n const normalized = normalizePermissionAddOptions(options);\n const existing = this._group.permissions.find((p) => p.name === name);\n if (existing) {\n mergePermissionOptions(existing, normalized);\n return new AXPPermissionDefinitionBuilder(this, existing);\n }\n const permission: AXPPermissionDefinition = {\n name,\n title,\n description,\n children: [],\n requiredFeatures: normalized.requiredFeatures,\n modules: normalized.modules,\n };\n this._group.permissions.push(permission);\n return new AXPPermissionDefinitionBuilder(this, permission);\n }\n\n endGroup(): AXPPermissionDefinitionProviderContext {\n return this.context;\n }\n\n findPermission(_path: string): AXPPermissionDefinition | undefined {\n return undefined;\n }\n\n findGroup(_name: string): AXPPermissionDefinitionGroupBuilder | undefined {\n return undefined;\n }\n}\n\n//#endregion\n\n//#region ----- Permission Builder -----\n\nexport class AXPPermissionDefinitionBuilder {\n private groupBuilder: AXPPermissionDefinitionGroupBuilder;\n private permission: AXPPermissionDefinition;\n\n constructor(groupBuilder: AXPPermissionDefinitionGroupBuilder, permission: AXPPermissionDefinition) {\n this.groupBuilder = groupBuilder;\n this.permission = permission;\n }\n\n addChild(\n name: string,\n title: string,\n description?: string,\n options?: AXPPermissionAddOptions | string[],\n ): AXPPermissionDefinitionBuilder {\n const normalized = normalizePermissionAddOptions(options);\n const existing = this.permission.children.find((p) => p.name === name);\n if (existing) {\n mergePermissionOptions(existing, normalized);\n return this;\n }\n const permission: AXPPermissionDefinition = {\n name,\n title,\n description,\n children: [],\n requiredFeatures: normalized.requiredFeatures,\n modules: normalized.modules,\n };\n this.permission.children.push(permission);\n return this;\n }\n\n /**\n * Set required features for this permission.\n * @param features - Array of feature names (e.g., ['PlatformManagement.menu-customization'])\n */\n requireFeatures(...features: string[]): AXPPermissionDefinitionBuilder {\n this.permission.requiredFeatures = features;\n return this;\n }\n\n /**\n * Set edition module ownership for this permission (ANY-match for availability).\n */\n modules(...moduleNames: string[]): AXPPermissionDefinitionBuilder {\n this.permission.modules = moduleNames;\n return this;\n }\n\n endPermission(): AXPPermissionDefinitionGroupBuilder {\n return this.groupBuilder;\n }\n}\n\n//#endregion\n\n//#region ----- Helpers -----\n\nfunction normalizePermissionAddOptions(\n options?: AXPPermissionAddOptions | string[],\n): AXPPermissionAddOptions {\n if (!options) {\n return {};\n }\n // Legacy: 4th argument was `requiredFeatures: string[]`\n if (Array.isArray(options)) {\n return { requiredFeatures: options };\n }\n return options;\n}\n\nfunction mergePermissionOptions(\n target: AXPPermissionDefinition,\n options: AXPPermissionAddOptions,\n): void {\n if (options.requiredFeatures?.length) {\n const set = new Set([...(target.requiredFeatures ?? []), ...options.requiredFeatures]);\n target.requiredFeatures = Array.from(set);\n }\n if (options.modules?.length) {\n const set = new Set([...(target.modules ?? []), ...options.modules]);\n target.modules = Array.from(set);\n }\n}\n\n//#endregion\n","import { inject, Injectable, InjectionToken } from '@angular/core';\nimport { AXPPermissionDefinition, AXPPermissionGroupDefinition } from './permission.types';\nimport { AXPPermissionDefinitionProviderContext } from './permission-definition.builder';\nimport { AXPSessionService } from '../session.service';\n\nexport interface AXPPermissionDefinitionProvider {\n define(context: AXPPermissionDefinitionProviderContext): Promise<void>;\n}\n\n/** Resolves edition module names for a permission key (product map). */\nexport type AXPPermissionModulesResolver = (permissionKey: string) => readonly string[];\n\nexport const AXP_PERMISSION_DEFINITION_PROVIDER = new InjectionToken<AXPPermissionDefinitionProvider[]>(\n 'AXP_PERMISSION_DEFINITION_PROVIDER',\n {\n providedIn: 'root',\n factory: () => {\n return [];\n },\n },\n);\n\nexport const AXP_PERMISSION_MODULES_RESOLVER = new InjectionToken<AXPPermissionModulesResolver>(\n 'AXP_PERMISSION_MODULES_RESOLVER',\n);\n\n@Injectable({ providedIn: 'root' })\nexport class AXPPermissionDefinitionService {\n private providers = inject(AXP_PERMISSION_DEFINITION_PROVIDER, { optional: true });\n private modulesResolver = inject(AXP_PERMISSION_MODULES_RESOLVER, { optional: true });\n private sessionService = inject(AXPSessionService);\n private cache: AXPPermissionGroupDefinition[] | null = null;\n /** Invalidates cache when the session edition modules/features change (e.g. app switch). */\n private cacheAvailabilityKey: string | null = null;\n\n private buildAvailabilityKey(): string {\n const enabled = this.sessionService.features\n .filter((feature) => feature.value === true && !!feature.name)\n .map((feature) => feature.name)\n .sort();\n const applicationId = this.sessionService.application?.id ?? '';\n const tenantId = this.sessionService.tenant?.id ?? '';\n return `${tenantId}|${applicationId}|${enabled.join(',')}`;\n }\n\n private async load(): Promise<void> {\n const availabilityKey = this.buildAvailabilityKey();\n if (this.cache && this.cacheAvailabilityKey === availabilityKey) {\n return;\n }\n this.cacheAvailabilityKey = availabilityKey;\n const context = new AXPPermissionDefinitionProviderContext();\n\n if (Array.isArray(this.providers)) {\n for (const provider of this.providers) {\n if (provider instanceof Promise) {\n const resolvedProvider = await provider;\n await resolvedProvider.define(context);\n } else {\n await provider.define(context);\n }\n }\n }\n\n const allGroups = context.getGroupDefinitions().map((group) => this.enrichGroupModules(group));\n this.cache = this.filterUnavailablePermissions(allGroups);\n }\n\n /** Attach modules[] from the product resolver when providers omitted them. */\n private enrichGroupModules(group: AXPPermissionGroupDefinition): AXPPermissionGroupDefinition {\n return {\n ...group,\n permissions: group.permissions.map((permission) => this.enrichPermissionModules(permission)),\n };\n }\n\n private enrichPermissionModules(permission: AXPPermissionDefinition): AXPPermissionDefinition {\n const resolved =\n permission.modules?.length || !this.modulesResolver\n ? permission.modules\n : [...this.modulesResolver(permission.name)];\n return {\n ...permission,\n modules: resolved,\n children: (permission.children ?? []).map((child) => this.enrichPermissionModules(child)),\n };\n }\n\n /**\n * Filter permissions by edition modules (ANY-match) and required features.\n * Keeps parent groups that still have at least one child section with permissions.\n */\n private filterUnavailablePermissions(groups: AXPPermissionGroupDefinition[]): AXPPermissionGroupDefinition[] {\n const filtered = groups.map((group) => ({\n ...group,\n permissions: this.filterPermissions(group.permissions),\n }));\n\n const withPermissions = new Set(filtered.filter((g) => g.permissions.length > 0).map((g) => g.name));\n const parentsOfKept = new Set(\n filtered.filter((g) => withPermissions.has(g.name) && g.parent).map((g) => g.parent as string),\n );\n\n return filtered.filter((g) => withPermissions.has(g.name) || parentsOfKept.has(g.name));\n }\n\n private filterPermissions(permissions: AXPPermissionDefinition[]): AXPPermissionDefinition[] {\n return permissions\n .filter((permission) => {\n if (permission.modules?.length) {\n const anyModuleEnabled = permission.modules.some((moduleName) =>\n this.sessionService.isModuleEnabled(moduleName),\n );\n if (!anyModuleEnabled) {\n return false;\n }\n }\n if (permission.requiredFeatures && permission.requiredFeatures.length > 0) {\n const allFeaturesEnabled = permission.requiredFeatures.every((featureName) =>\n this.sessionService.isFeatureEnabled(featureName),\n );\n if (!allFeaturesEnabled) {\n return false;\n }\n }\n return true;\n })\n .map((permission) => ({\n ...permission,\n children: this.filterPermissions(permission.children),\n }));\n }\n\n public async reload(): Promise<void> {\n this.cache = null;\n this.cacheAvailabilityKey = null;\n await this.load();\n }\n\n public async getGroups(): Promise<AXPPermissionGroupDefinition[]> {\n await this.load();\n return this.cache ?? [];\n }\n\n public async getPermissions(): Promise<AXPPermissionDefinition[]> {\n await this.load();\n return this.cache?.flatMap((g) => g.permissions) ?? [];\n }\n\n public async getGroup(name: string): Promise<AXPPermissionGroupDefinition | null> {\n await this.load();\n return this.cache?.find((g) => g.name === name) ?? null;\n }\n\n public async getPermission(name: string): Promise<AXPPermissionDefinition | null> {\n await this.load();\n for (const group of this.cache ?? []) {\n const found = this.findPermissionRecursive(group.permissions, name);\n if (found) {\n return found;\n }\n }\n return null;\n }\n\n private findPermissionRecursive(\n permissions: AXPPermissionDefinition[],\n name: string,\n ): AXPPermissionDefinition | null {\n for (const permission of permissions) {\n if (permission.name === name) {\n return permission;\n }\n const child = this.findPermissionRecursive(permission.children ?? [], name);\n if (child) {\n return child;\n }\n }\n return null;\n }\n}\n","import { AXPExpressionEvaluatorScopeProvider, AXPExpressionEvaluatorScopeProviderContext } from \"@acorex-platform/framework-shared/core\";\nimport { inject } from \"@angular/core\";\nimport { AXPSessionService } from \"../session.service\";\n\nexport class AXPPermissionEvaluatorScopeProvider implements AXPExpressionEvaluatorScopeProvider {\n\n protected sessionService = inject(AXPSessionService);\n\n async provide(context: AXPExpressionEvaluatorScopeProviderContext): Promise<void> {\n context.addScope('permission', {\n /**\n * Check if the current user has all specified permissions\n * @param permissions - Single permission string or array of permission strings\n * @returns boolean - true if user has all permissions, false otherwise\n */\n check: (...permissions: string[]) => {\n return this.sessionService.authorize(...permissions);\n },\n\n /**\n * Check if the current user has any of the specified permissions\n * @param permissions - Array of permission strings\n * @returns boolean - true if user has any of the permissions, false otherwise\n */\n checkAny: (...permissions: string[]) => {\n return permissions.some(p => this.sessionService.authorize(p));\n },\n });\n }\n} ","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivateFn, RouterStateSnapshot } from '@angular/router';\nimport { first, map } from 'rxjs';\nimport { AXPUnauthenticatedError } from './contracts/errors.types';\nimport { AXPSessionService } from './session.service';\n\nexport const AXPAuthGuard: CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n const sessionService = inject(AXPSessionService);\n return sessionService.isAuthenticatedWithLoading$.pipe(\n first(),\n map((value) => {\n if (value) {\n return true;\n }\n throw new AXPUnauthenticatedError(\n `Access denied. You are not currently logged in. Please log in to access this page. If you continue to see this message after logging in, please contact support.`,\n {\n redirectUrl: state.url,\n },\n );\n }),\n );\n};\n","import { Inject, ModuleWithProviders, NgModule, Optional, inject } from '@angular/core';\nimport {\n AXP_APP_STARTUP_PRIORITY,\n AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,\n AXP_SESSION_SERVICE,\n provideAppStartUpTask,\n} from '@acorex-platform/framework-client/core';\nimport { AXPAuthStrategyRegistryService } from './auth-registry.service';\nimport { AXPAuthStrategy } from './auth.strategy';\nimport { AXPFeatureDirective, AXPFeatureEvaluatorScopeProvider } from './feature';\nimport { AXPPermissionDirective } from './permission/permission.directive';\nimport { AXPPermissionEvaluatorScopeProvider } from './permission/permission-evaluator-scope.provider';\nimport { AXPSessionService } from './session.service';\n\nexport interface AXPAuthModuleConfigs {\n strategies: (new () => AXPAuthStrategy)[];\n}\n\n@NgModule({\n imports: [],\n exports: [AXPPermissionDirective, AXPFeatureDirective],\n declarations: [AXPPermissionDirective, AXPFeatureDirective],\n providers: [\n provideAppStartUpTask(() => {\n const service = inject(AXPSessionService);\n return {\n name: 'session-restore',\n priority: AXP_APP_STARTUP_PRIORITY.sessionRestore,\n run: async () => {\n try {\n await service.restoreSession();\n } catch (error) {\n console.error(error);\n }\n },\n };\n }),\n {\n provide: AXP_SESSION_SERVICE,\n useExisting: AXPSessionService,\n },\n {\n provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,\n useClass: AXPFeatureEvaluatorScopeProvider,\n multi: true,\n },\n {\n provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,\n useClass: AXPPermissionEvaluatorScopeProvider,\n multi: true,\n },\n ],\n})\nexport class AXPAuthModule {\n static forRoot(configs?: AXPAuthModuleConfigs): ModuleWithProviders<AXPAuthModule> {\n return {\n ngModule: AXPAuthModule,\n providers: [\n ...(configs?.strategies || []),\n {\n provide: 'AXPAuthModuleFactory',\n useFactory: (registry: AXPAuthStrategyRegistryService) => () => {\n registry.register(...(configs?.strategies || []));\n },\n deps: [AXPAuthStrategyRegistryService],\n multi: true,\n },\n ],\n };\n }\n\n static forChild(configs?: AXPAuthModuleConfigs): ModuleWithProviders<AXPAuthModule> {\n return {\n ngModule: AXPAuthModule,\n providers: [\n ...(configs?.strategies || []),\n {\n provide: 'AXPAuthModuleFactory',\n useFactory: (registry: AXPAuthStrategyRegistryService) => () => {\n registry.register(...(configs?.strategies || []));\n },\n deps: [AXPAuthStrategyRegistryService],\n multi: true,\n },\n ],\n };\n }\n\n /**\n * @ignore\n */\n constructor(@Optional() @Inject('AXPAuthModuleFactory') instances: any[]) {\n instances?.forEach((f) => {\n f();\n });\n }\n}\n","import { AXPApplication } from './application/application.types';\nimport { AXPSessionContext } from './contracts/session.types';\nimport { AXPTenant } from './tenant/tenant.types';\nimport { AXPUser } from './user/user.types';\n\n//#region ----- Types -----\n\nexport interface AXPBaseCredentials {\n strategy: string;\n [key: string]: string | boolean | undefined;\n}\n\nexport interface AXPTokenResult {\n /** Present only for non-browser clients; SPA uses HttpOnly cookies. */\n accessToken?: string;\n expiresIn?: string | null;\n refreshToken?: string;\n idToken?: string;\n tenant?: AXPTenant | null;\n application?: AXPApplication | null;\n}\n\nexport interface AXPSignInResult {\n succeed: boolean;\n data?: {\n /** Present only for non-browser clients; SPA uses HttpOnly cookies. */\n accessToken?: string;\n idToken?: string | null;\n expiresIn?: string | null;\n refreshToken?: string;\n user: AXPUser;\n tenant?: AXPTenant | null;\n application?: AXPApplication | null;\n };\n}\n\nexport abstract class AXPAuthStrategy {\n abstract get name(): string;\n abstract signin(credentials: AXPBaseCredentials): Promise<AXPSignInResult | void>;\n abstract signout(): Promise<void>;\n abstract refreshToken(context: AXPSessionContext): Promise<AXPSignInResult>;\n abstract updateToken(params?: { [key: string]: any }): Promise<AXPSignInResult | void>;\n}\n\n/**\n * Client-persisted session metadata. Tokens are never stored here — they live in HttpOnly cookies.\n */\nexport interface AXPSessionData {\n strategy: string;\n user?: AXPUser | null;\n tenant?: AXPTenant | null;\n application?: AXPApplication | null;\n expiresIn?: string | null;\n /** When true, the client lock overlay stays active until PIN/password unlock or sign-out. */\n locked?: boolean;\n /** True when the server issued HttpOnly auth cookies for this session. */\n cookieSession?: boolean;\n}\n\n//#endregion\n","//#region ---- JWT Utility ----\n\n/**\n * Utility class for JWT token operations\n */\nexport class JwtUtil {\n /**\n * Parses a JWT token and returns the payload\n */\n static parseJwt(token: string): any {\n try {\n const base64Url = token.split('.')[1];\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split('')\n .map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))\n .join('')\n );\n return JSON.parse(jsonPayload);\n } catch (error) {\n throw new Error('Invalid JWT token');\n }\n }\n}\n\n//#endregion\n\n//#region ---- PKCE Utility ----\n\n/**\n * Utility class for PKCE (Proof Key for Code Exchange) operations\n */\nexport class PkceUtil {\n /**\n * Generates a random string for PKCE code verifier\n */\n static generateRandomString(length: number): string {\n const array = new Uint8Array(length);\n crypto.getRandomValues(array);\n return this.base64UrlEncode(array);\n }\n\n /**\n * Generates PKCE code challenge from verifier\n */\n static async generateCodeChallenge(codeVerifier: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(codeVerifier);\n const digest = await crypto.subtle.digest('SHA-256', data);\n return this.base64UrlEncode(new Uint8Array(digest));\n }\n\n /**\n * Base64 URL encoding for PKCE\n */\n private static base64UrlEncode(array: Uint8Array): string {\n return btoa(String.fromCharCode(...array))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n }\n}\n\n//#endregion\n\n//#region ---- Time Utility ----\n\n/**\n * Utility class for time and date operations\n */\nexport class TimeUtil {\n /**\n * Calculates the time difference in milliseconds between a future date and now\n */\n static expiresInMilliseconds(expiresInDate: string): number {\n return new Date(expiresInDate).getTime() - new Date().getTime();\n }\n\n /**\n * Calculates expiration date from seconds\n */\n static calculateExpireInDate(expireInSeconds: number): string {\n return new Date(Date.now() + expireInSeconds * 1000).toISOString();\n }\n}\n\n//#endregion ","import type { AXPApplication } from './application/application.types';\nimport type { AXPSessionContext } from './contracts/session.types';\nimport type { AXPSignInResult } from './auth.strategy';\nimport type { AXPTenant } from './tenant/tenant.types';\nimport type { AXPUser } from './user/user.types';\nimport { TimeUtil } from './auth.utils';\nimport type { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\n\n//#region ---- Platform OAuth session update (tenant / application binding) ----\n\nexport interface PlatformAuthTokenResponseDto {\n accessToken: string;\n refreshToken: string;\n expiresIn?: string;\n id_token?: string | null;\n user: AXPUser;\n tenant?: { id: string; name?: string; title?: AXPMultiLanguageString } | null;\n application?: { id: string; name?: string; title?: AXPMultiLanguageString } | null;\n}\n\nexport function platformOAuthSessionUpdateParams(params: {\n [key: string]: unknown;\n}): {\n tenant?: AXPTenant;\n application?: AXPApplication;\n tenantId?: string;\n applicationId?: string;\n} {\n const tenant = params['tenant'] as AXPTenant | undefined;\n const application = params['application'] as AXPApplication | undefined;\n\n return {\n tenant,\n application,\n tenantId: (params['tenantId'] as string | undefined) ?? tenant?.id,\n applicationId: (params['applicationId'] as string | undefined) ?? application?.id,\n };\n}\n\nexport function shouldPlatformOAuthBindSession(\n hasCredentials: boolean,\n params: { [key: string]: unknown },\n): boolean {\n if (!hasCredentials) {\n return false;\n }\n\n const { tenant, application, tenantId, applicationId } = platformOAuthSessionUpdateParams(params);\n return Boolean(tenantId || applicationId || tenant || application);\n}\n\nexport function toPlatformOAuthSignInResult(\n result: PlatformAuthTokenResponseDto,\n context?: Partial<AXPSessionContext>,\n): AXPSignInResult {\n const tenant = mergeTenant(mapPlatformTenant(result.tenant), context?.tenant ?? null);\n const application = mergeApplication(mapPlatformApplication(result.application), context?.application ?? null);\n\n return {\n succeed: true,\n data: {\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n idToken: result.id_token ?? null,\n expiresIn: parsePlatformExpiresIn(result.expiresIn),\n user: result.user,\n tenant,\n application,\n },\n };\n}\n\nfunction mapPlatformTenant(value: PlatformAuthTokenResponseDto['tenant']): AXPTenant | null {\n if (!value?.id) {\n return null;\n }\n\n return {\n id: value.id,\n name: value.name ?? value.id,\n title: value.title ?? value.name ?? value.id,\n };\n}\n\nfunction mapPlatformApplication(value: PlatformAuthTokenResponseDto['application']): AXPApplication | null {\n if (!value?.id) {\n return null;\n }\n\n return {\n id: value.id,\n name: value.name ?? value.id,\n title: value.title ?? value.name ?? value.id,\n };\n}\n\nfunction mergeTenant(mapped: AXPTenant | null, contextTenant: AXPTenant | null): AXPTenant | null {\n if (!mapped && !contextTenant) {\n return null;\n }\n\n if (!mapped) {\n return contextTenant;\n }\n\n if (!contextTenant) {\n return mapped;\n }\n\n return {\n ...contextTenant,\n ...mapped,\n title: mapped.title && mapped.title !== mapped.id ? mapped.title : contextTenant.title || mapped.title,\n name: mapped.name && mapped.name !== mapped.id ? mapped.name : contextTenant.name || mapped.name,\n };\n}\n\nfunction mergeApplication(\n mapped: AXPApplication | null,\n contextApplication: AXPApplication | null,\n): AXPApplication | null {\n if (!mapped && !contextApplication) {\n return null;\n }\n\n if (!mapped) {\n return contextApplication;\n }\n\n if (!contextApplication) {\n return mapped;\n }\n\n return {\n ...contextApplication,\n ...mapped,\n title: mapped.title && mapped.title !== mapped.id ? mapped.title : contextApplication.title || mapped.title,\n name: mapped.name && mapped.name !== mapped.id ? mapped.name : contextApplication.name || mapped.name,\n };\n}\n\nfunction parsePlatformExpiresIn(expiresIn?: string): string {\n if (!expiresIn) {\n return TimeUtil.calculateExpireInDate(0);\n }\n\n const asDate = new Date(expiresIn);\n if (!Number.isNaN(asDate.getTime())) {\n return asDate.toISOString();\n }\n\n return TimeUtil.calculateExpireInDate(Number(expiresIn) || 0);\n}\n\n//#endregion\n","//#region ---- Platform OAuth helpers (PKCE + /connect/*) ----\n\nexport interface AXPPlatformOAuthDiscoveryDocument {\n issuer?: string;\n authorization_endpoint?: string;\n token_endpoint?: string;\n jwks_uri?: string;\n}\n\nexport interface AXPPlatformOAuthClientConfig {\n clientId: string;\n redirectUri: string;\n scope: string;\n}\n\nexport const AXP_DEFAULT_PLATFORM_OAUTH_CLIENT_ID = 'acorex';\nexport const AXP_DEFAULT_PLATFORM_OAUTH_SCOPE = 'openid profile email offline_access';\nexport const AXP_PLATFORM_OAUTH_CSRF_COOKIE = 'acx_csrf_token';\n\nexport function resolvePlatformOAuthIssuer(baseUrl?: string): string {\n const issuer = baseUrl?.replace(/\\/$/, '');\n if (!issuer) {\n throw new Error('API baseUrl is not configured');\n }\n return issuer;\n}\n\nexport function resolvePlatformOAuthRedirectUri(): string {\n return `${window.location.origin}/auth/oauth-callback`;\n}\n\nexport function resolvePlatformOAuthClientConfig(\n authConfig?: {\n clientId?: string;\n client_id?: string;\n redirectUri?: string;\n scope?: string;\n } | null,\n): AXPPlatformOAuthClientConfig {\n return {\n clientId: authConfig?.clientId ?? authConfig?.client_id ?? AXP_DEFAULT_PLATFORM_OAUTH_CLIENT_ID,\n redirectUri: authConfig?.redirectUri ?? resolvePlatformOAuthRedirectUri(),\n scope: authConfig?.scope ?? AXP_DEFAULT_PLATFORM_OAUTH_SCOPE,\n };\n}\n\nexport function readPlatformOAuthCsrfToken(): string | null {\n const match = document.cookie.match(\n new RegExp(`(?:^|; )${AXP_PLATFORM_OAUTH_CSRF_COOKIE.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}=([^;]*)`),\n );\n if (!match?.[1]) {\n return null;\n }\n try {\n return decodeURIComponent(match[1]);\n } catch {\n return match[1];\n }\n}\n\nexport async function fetchPlatformOAuthDiscoveryDocument(\n issuer: string,\n): Promise<AXPPlatformOAuthDiscoveryDocument> {\n const response = await fetch(`${issuer}/.well-known/openid-configuration`);\n if (!response.ok) {\n throw new Error(`Failed to load OpenID discovery document: ${response.status} ${response.statusText}`);\n }\n return (await response.json()) as AXPPlatformOAuthDiscoveryDocument;\n}\n\nexport function resolvePlatformOAuthAuthorizeEndpoint(\n issuer: string,\n discovery?: AXPPlatformOAuthDiscoveryDocument | null,\n): string {\n return discovery?.authorization_endpoint ?? `${issuer}/connect/authorize`;\n}\n\nexport function resolvePlatformOAuthTokenEndpoint(\n issuer: string,\n discovery?: AXPPlatformOAuthDiscoveryDocument | null,\n): string {\n return discovery?.token_endpoint ?? `${issuer}/connect/token`;\n}\n\n/**\n * BFF: server generates PKCE verifier/challenge and returns the platform authorize URL.\n * Verifier never touches browser localStorage.\n */\nexport async function initPlatformOAuthAuthorization(input: {\n issuer: string;\n clientId: string;\n redirectUri: string;\n scope: string;\n provider: string;\n}): Promise<{ authorizeUrl: string }> {\n const response = await fetch(`${input.issuer}/connect/authorize/init`, {\n method: 'POST',\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n client_id: input.clientId,\n redirect_uri: input.redirectUri,\n scope: input.scope,\n identity_provider: input.provider,\n }),\n });\n\n if (!response.ok) {\n const detail = await response.text().catch(() => '');\n throw new Error(\n `OAuth authorize init failed: ${response.status} ${response.statusText}${detail ? ` — ${detail}` : ''}`,\n );\n }\n\n return (await response.json()) as { authorizeUrl: string };\n}\n\nexport async function exchangePlatformOAuthAuthorizationCode(input: {\n issuer: string;\n tokenEndpoint?: string;\n clientId: string;\n redirectUri: string;\n code: string;\n}): Promise<Record<string, unknown>> {\n const tokenEndpoint = input.tokenEndpoint ?? resolvePlatformOAuthTokenEndpoint(input.issuer);\n const csrfToken = readPlatformOAuthCsrfToken();\n\n const body = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: input.clientId,\n code: input.code,\n redirect_uri: input.redirectUri,\n });\n\n const headers: Record<string, string> = { 'Content-Type': 'application/x-www-form-urlencoded' };\n if (csrfToken) {\n headers['X-CSRF-Token'] = csrfToken;\n }\n\n const response = await fetch(tokenEndpoint, {\n method: 'POST',\n credentials: 'include',\n headers,\n body: body.toString(),\n });\n\n if (!response.ok) {\n const detail = await response.text().catch(() => '');\n throw new Error(\n `Token exchange failed: ${response.status} ${response.statusText}${detail ? ` — ${detail}` : ''}`,\n );\n }\n\n return (await response.json()) as Record<string, unknown>;\n}\n\n//#endregion\n","//#region ---- Auth:ListProviders public DTOs ----\n\nexport interface AXPAuthLocalSignInMethod {\n id: string;\n title: string;\n protocol: 'password' | 'otp' | 'custom';\n enabled: boolean;\n}\n\n/** Public IdP row — never includes secrets. `id` is used as OAuth `acr_values`. */\nexport interface AXPAuthIdentityProvider {\n id: string;\n title: string;\n icon?: string;\n priority: number;\n}\n\nexport interface AXPAuthListProvidersResponse {\n localMethods: AXPAuthLocalSignInMethod[];\n identityProviders: AXPAuthIdentityProvider[];\n}\n\nexport function asAuthListProvidersResponse(payload: unknown): AXPAuthListProvidersResponse {\n const data = (payload ?? {}) as Partial<AXPAuthListProvidersResponse>;\n return {\n localMethods: Array.isArray(data.localMethods) ? data.localMethods : [],\n identityProviders: Array.isArray(data.identityProviders) ? data.identityProviders : [],\n };\n}\n\nexport function findIdentityProvider(\n payload: unknown,\n id: string,\n): AXPAuthIdentityProvider | undefined {\n const { identityProviders } = asAuthListProvidersResponse(payload);\n return identityProviders.find((p) => p.id === id);\n}\n\n//#endregion\n","import type { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\n\n/**\n * Best-effort plain string for thrown {@link Error} messages from command results (no i18n lookup).\n */\nexport function commandMessageTextForError(value: AXPMultiLanguageString | undefined | null): string {\n if (value == null) {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'object' && !Array.isArray(value)) {\n const values = Object.values(value as Record<string, string>);\n const first = values.find((v) => typeof v === 'string' && v.length > 0);\n return first ?? '';\n }\n return String(value);\n}\n","import { AXPCommandService, AXPQueryService } from '@acorex-platform/framework-client/runtime';\nimport {\n AUTH_LIST_OWN_DEVICE_SESSIONS_DEFAULT,\n AUTH_LIST_PROVIDERS_DEFAULT,\n AUTH_LOGOUT_DEFAULT,\n AUTH_REFRESH_DEFAULT,\n AUTH_TERMINATE_OWN_DEVICE_SESSION_DEFAULT,\n AUTH_UPDATE_SESSION_DEFAULT,\n} from '@acorex-platform/framework-shared/runtime';\nimport { runtimeCommandPayloadData, runtimeQueryCollectionData, runtimeQueryObjectData } from '@acorex-platform/framework-shared/core';\nimport { inject, Injectable } from '@angular/core';\n\nimport {\n asAuthListProvidersResponse,\n type AXPAuthListProvidersResponse,\n} from './auth-list-providers.types';\nimport { commandMessageTextForError } from './command-message-text.util';\nimport type { PlatformAuthTokenResponseDto } from './platform-oauth-session.util';\nimport { AXPSessionService } from './session.service';\nimport type { AXPApplication } from './application/application.types';\nimport type { AXPTenant } from './tenant/tenant.types';\n\n//#region ---- Platform auth runtime (command/query transport) ----\n\nexport interface PlatformAuthUpdateSessionInput {\n tenantId?: string;\n applicationId?: string;\n tenant?: AXPTenant;\n application?: AXPApplication;\n}\n\nexport interface PlatformAuthOwnDeviceSessionDto {\n id: string;\n sessionId: string;\n tenantId: string;\n deviceName: string;\n browser: string;\n operatingSystem: string;\n ipAddress: string;\n lastLoginAt?: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AXPPlatformAuthRuntimeService {\n private readonly commandService = inject(AXPCommandService);\n private readonly queryService = inject(AXPQueryService);\n private readonly sessionService = inject(AXPSessionService);\n private listProvidersCache: AXPAuthListProvidersResponse | null = null;\n private listProvidersInFlight: Promise<AXPAuthListProvidersResponse> | null = null;\n\n async logout(_refreshToken?: string | null): Promise<void> {\n try {\n // Refresh token is read from HttpOnly cookie on the server.\n await this.commandService.execute(AUTH_LOGOUT_DEFAULT, {});\n } catch {\n // Ignore logout network errors; client session is cleared regardless.\n } finally {\n this.clearListProvidersCache();\n }\n }\n\n async refresh(_refreshToken?: string): Promise<PlatformAuthTokenResponseDto> {\n return this.executeCommand<PlatformAuthTokenResponseDto>(AUTH_REFRESH_DEFAULT, {});\n }\n\n async updateSession(input: PlatformAuthUpdateSessionInput): Promise<PlatformAuthTokenResponseDto> {\n return this.executeCommand<PlatformAuthTokenResponseDto>(AUTH_UPDATE_SESSION_DEFAULT, input);\n }\n\n async listOwnDeviceSessions(tenantId: string): Promise<PlatformAuthOwnDeviceSessionDto[]> {\n const result = await this.queryService.fetch<\n { tenantId: string },\n PlatformAuthOwnDeviceSessionDto\n >(AUTH_LIST_OWN_DEVICE_SESSIONS_DEFAULT, { tenantId });\n return runtimeQueryCollectionData(result)?.items ?? [];\n }\n\n async terminateOwnDeviceSession(id: string): Promise<void> {\n const result = await this.commandService.execute(AUTH_TERMINATE_OWN_DEVICE_SESSION_DEFAULT, { id });\n if (!result?.success) {\n throw new Error(\n commandMessageTextForError(result?.message?.text) || 'Failed to terminate device session',\n );\n }\n }\n\n async listProviders(): Promise<AXPAuthListProvidersResponse> {\n if (this.listProvidersCache) {\n return this.listProvidersCache;\n }\n if (this.listProvidersInFlight) {\n return this.listProvidersInFlight;\n }\n\n this.listProvidersInFlight = this.queryService\n .fetch<Record<string, never>, AXPAuthListProvidersResponse>(AUTH_LIST_PROVIDERS_DEFAULT, {})\n .then((result) => {\n this.listProvidersCache = asAuthListProvidersResponse(runtimeQueryObjectData(result));\n return this.listProvidersCache;\n })\n .finally(() => {\n this.listProvidersInFlight = null;\n });\n\n return this.listProvidersInFlight;\n }\n\n clearListProvidersCache(): void {\n this.listProvidersCache = null;\n this.listProvidersInFlight = null;\n }\n\n private async executeCommand<T>(key: string, input: unknown): Promise<T> {\n const result = await this.commandService.execute<unknown, T>(key, input);\n const data = runtimeCommandPayloadData(result);\n if (data == null) {\n throw new Error(commandMessageTextForError(result?.message?.text) || `Auth command failed: ${key}`);\n }\n return data;\n }\n}\n\n//#endregion\n","//#region ---- Max active device sessions (client) ----\n\n/** Stable API / ForbiddenException code from AuthService. */\nexport const MAX_ACTIVE_DEVICE_SESSIONS_CODE = 'MAX_ACTIVE_DEVICE_SESSIONS';\n\nconst PENDING_TENANT_STORAGE_KEY = 'axp.auth.sessionLimit.pendingTenant';\n\nexport interface AXPSessionLimitPendingTenant {\n id: string;\n name?: string;\n title?: unknown;\n}\n\nfunction textContainsMaxSessionsCode(value: unknown): boolean {\n if (typeof value === 'string') {\n return value === MAX_ACTIVE_DEVICE_SESSIONS_CODE || value.includes(MAX_ACTIVE_DEVICE_SESSIONS_CODE);\n }\n if (Array.isArray(value)) {\n return value.some((item) => textContainsMaxSessionsCode(item));\n }\n return false;\n}\n\n/**\n * Detects tenant max concurrent device-session rejection from command / HTTP shapes.\n * Must recognize {@link Error} subclasses (e.g. AuthApiError) via `.message`.\n */\nexport function isMaxActiveDeviceSessionsError(error: unknown): boolean {\n if (error == null) {\n return false;\n }\n\n if (typeof error === 'string') {\n return textContainsMaxSessionsCode(error);\n }\n\n if (typeof error !== 'object') {\n return false;\n }\n\n // Error.message is reliable for AuthApiError / Error thrown from UpdateSession.\n if (error instanceof Error && textContainsMaxSessionsCode(error.message)) {\n return true;\n }\n\n const err = error as Record<string, unknown>;\n const candidates: unknown[] = [err['message'], err['error'], err['code']];\n\n const nestedError = err['error'];\n if (nestedError && typeof nestedError === 'object') {\n const nested = nestedError as Record<string, unknown>;\n candidates.push(nested['message'], nested['error'], nested['code']);\n }\n\n const apiError = err['apiError'];\n if (apiError && typeof apiError === 'object') {\n const api = apiError as Record<string, unknown>;\n candidates.push(api['message'], api['error'], api['code']);\n }\n\n return candidates.some((value) => textContainsMaxSessionsCode(value));\n}\n\nexport function storeSessionLimitPendingTenant(tenant: AXPSessionLimitPendingTenant): void {\n try {\n sessionStorage.setItem(PENDING_TENANT_STORAGE_KEY, JSON.stringify(tenant));\n } catch {\n // Ignore quota / private-mode failures; route state may still carry the tenant.\n }\n}\n\nexport function readSessionLimitPendingTenant(): AXPSessionLimitPendingTenant | null {\n try {\n const raw = sessionStorage.getItem(PENDING_TENANT_STORAGE_KEY);\n if (!raw) {\n return null;\n }\n const parsed = JSON.parse(raw) as AXPSessionLimitPendingTenant;\n if (!parsed?.id || typeof parsed.id !== 'string') {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport function clearSessionLimitPendingTenant(): void {\n try {\n sessionStorage.removeItem(PENDING_TENANT_STORAGE_KEY);\n } catch {\n // ignore\n }\n}\n\n//#endregion\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Narrow API for refreshing cached user avatar display data.\n * Implemented via auth-gateway; keeps auth free of layout/components imports (avoids circular deps).\n */\nexport interface AXPUserAvatarCachePort {\n refreshUserInfo(userId: string): Promise<void>;\n}\n\nexport const AXP_USER_AVATAR_CACHE_PORT = new InjectionToken<AXPUserAvatarCachePort>(\n 'AXP_USER_AVATAR_CACHE_PORT',\n);\n","import { Injectable, inject } from '@angular/core';\n\nimport { AXP_USER_AVATAR_CACHE_PORT } from './user-avatar-cache.port';\nimport { AXPUser } from './user/user.types';\nimport { AXPSessionService } from './session.service';\n\n//#region ---- User profile identity service ----\n\n/** Keeps session and avatar cache aligned after self-service profile identity updates. */\n@Injectable({ providedIn: 'root' })\nexport class AXPUserProfileIdentityService {\n //#region ---- Services & Dependencies ----\n\n private readonly sessionService = inject(AXPSessionService);\n private readonly avatarCachePort = inject(AXP_USER_AVATAR_CACHE_PORT, { optional: true });\n\n //#endregion\n\n //#region ---- Public API ----\n\n async applySessionPatch(patch: Partial<Pick<AXPUser, 'name' | 'title' | 'avatar'>>): Promise<void> {\n const session = this.sessionService.getSessionData();\n const userId = session?.user?.id;\n if (!session?.user || !userId) {\n return;\n }\n\n this.sessionService.setSession({\n ...session,\n user: {\n ...session.user,\n ...patch,\n },\n });\n\n await this.refreshAvatar(userId);\n }\n\n async refreshAvatar(userId?: string): Promise<void> {\n const id = userId ?? this.sessionService.user?.id;\n if (!id) {\n return;\n }\n\n await this.avatarCachePort?.refreshUserInfo(id);\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Challenge Data Types ----\n\n/**\n * Supported content types for challenge display\n */\nexport type AXPChallengeContentType = 'image-url' | 'image-base64' | 'text' | 'audio-url';\n\n/**\n * Challenge data returned from the server\n * Contains all information needed to display and submit a challenge\n */\nexport interface AXPLoginChallengeData {\n /**\n * Unique identifier for this challenge\n * Must be sent back with credentials when submitting login\n */\n id: string;\n\n /**\n * The challenge content to display\n * Could be an image URL, base64 encoded image, text, or audio URL\n */\n content: string;\n\n /**\n * Type of content for proper rendering\n */\n contentType: AXPChallengeContentType;\n\n /**\n * When this challenge expires (optional)\n * After expiration, a new challenge should be fetched\n */\n expiresAt?: Date;\n\n /**\n * Additional metadata from server (optional)\n */\n metadata?: Record<string, unknown>;\n}\n\n//#endregion\n\n//#region ---- Challenge Check Result ----\n\n/**\n * Result of checking a login error response\n * Determines if a challenge should be displayed\n */\nexport interface AXPChallengeCheckResult {\n /**\n * Whether a challenge is required\n */\n required: boolean;\n\n /**\n * Optional message to display to the user\n */\n message?: string;\n\n /**\n * Additional data from server that may be needed for getChallenge()\n * For example: sessionId, attemptId, etc.\n */\n serverData?: Record<string, unknown>;\n}\n\n//#endregion\n\n","import { Type } from '@angular/core';\nimport { AXPLoginChallengeComponentBase } from './challenge-component.base';\nimport { AXPChallengeCheckResult, AXPLoginChallengeData } from './challenge.types';\n\n//#region ---- Abstract Challenge Provider ----\n\n/**\n * Abstract base class for login challenge providers\n *\n * Implement this class to create custom challenge mechanisms like:\n * - Image CAPTCHA\n * - reCAPTCHA\n * - SMS verification\n * - Email verification\n *\n * @example\n * ```typescript\n * @Injectable()\n * export class MyImageCaptchaProvider extends AXPLoginChallengeProvider {\n * readonly name = 'image-captcha';\n *\n * checkResponse(error: unknown): AXPChallengeCheckResult | null {\n * if (error instanceof HttpErrorResponse) {\n * if (error.error?.requiresCaptcha) {\n * return { required: true };\n * }\n * }\n * return null;\n * }\n *\n * async getChallenge(): Promise<AXPLoginChallengeData> {\n * const response = await this.http.get('/api/captcha').toPromise();\n * return {\n * id: response.id,\n * content: response.image,\n * contentType: 'image-base64'\n * };\n * }\n *\n * async refreshChallenge(): Promise<AXPLoginChallengeData> {\n * return this.getChallenge();\n * }\n *\n * getChallengeComponent(): Type<AXPLoginChallengeComponentBase> {\n * return MyCaptchaChallengeComponent;\n * }\n * }\n * ```\n */\nexport abstract class AXPLoginChallengeProvider {\n\n /**\n * Unique name identifier for this provider\n */\n abstract readonly name: string;\n\n /**\n * Checks the login error response to determine if a challenge is required\n *\n * This method is called after a failed login attempt. The implementation\n * should inspect the error and return a result indicating whether a\n * challenge should be displayed.\n *\n * @param error - The error from the failed login attempt (type varies by implementation)\n * @returns Challenge check result, or null if this provider doesn't handle this error\n */\n abstract checkResponse(error: unknown): AXPChallengeCheckResult | null;\n\n /**\n * Fetches a new challenge from the server\n *\n * Called when checkResponse indicates a challenge is required.\n * Should make an API call to get challenge data (e.g., CAPTCHA image).\n *\n * @param serverData - Optional data from checkResponse result that may be needed\n * @returns Promise resolving to challenge data for display\n */\n abstract getChallenge(serverData?: Record<string, unknown>): Promise<AXPLoginChallengeData>;\n\n /**\n * Fetches a fresh challenge, replacing the current one\n *\n * Called when user requests a new challenge (e.g., clicks \"new image\" button).\n * Typically delegates to getChallenge() but may have different behavior.\n *\n * @returns Promise resolving to new challenge data\n */\n abstract refreshChallenge(): Promise<AXPLoginChallengeData>;\n\n /**\n * Returns the component type for rendering the challenge UI\n *\n * Override this method to provide a custom challenge UI component.\n * If not overridden (returns null), the login component will use\n * a default built-in UI.\n *\n * @returns Component type extending AXPLoginChallengeComponentBase, or null for default UI\n */\n getChallengeComponent(): Type<AXPLoginChallengeComponentBase> | null {\n return null;\n }\n}\n\n//#endregion\n\n","import { InjectionToken } from '@angular/core';\nimport { AXPLoginChallengeProvider } from './challenge.provider';\n\n//#region ---- Injection Token ----\n\n/**\n * Injection token for the login challenge provider\n *\n * This token is optional - if not provided, no challenge mechanism will be used.\n *\n * @example\n * ```typescript\n * // In your app module or provider configuration:\n * providers: [\n * {\n * provide: AXP_LOGIN_CHALLENGE_PROVIDER,\n * useClass: MyImageCaptchaProvider\n * }\n * ]\n *\n * // In a component:\n * private challengeProvider = inject(AXP_LOGIN_CHALLENGE_PROVIDER, { optional: true });\n * ```\n */\nexport const AXP_LOGIN_CHALLENGE_PROVIDER = new InjectionToken<AXPLoginChallengeProvider>(\n 'AXP_LOGIN_CHALLENGE_PROVIDER'\n);\n\n//#endregion\n\n","import { Component, input, output, ChangeDetectionStrategy } from '@angular/core';\nimport { AXPLoginChallengeData } from './challenge.types';\n\n//#region ---- Base Challenge Component ----\n\n/**\n * Base class for login challenge UI components\n *\n * Providers can extend this class to create custom challenge UIs.\n * The login component will render this component and listen to its outputs.\n *\n * @example\n * ```typescript\n * @Component({\n * selector: 'my-captcha-challenge',\n * template: `\n * <div class=\"captcha-container\">\n * <img [src]=\"'data:image/png;base64,' + challengeData().content\" />\n * <input\n * type=\"text\"\n * [value]=\"response()\"\n * (input)=\"onResponseChange($event)\"\n * />\n * <button (click)=\"onRefreshClick()\">Refresh</button>\n * </div>\n * `\n * })\n * export class MyCaptchaChallengeComponent extends AXPLoginChallengeComponentBase {\n * response = signal('');\n *\n * onResponseChange(event: Event) {\n * const value = (event.target as HTMLInputElement).value;\n * this.response.set(value);\n * this.responseChange.emit(value);\n * }\n *\n * onRefreshClick() {\n * this.refreshRequest.emit();\n * }\n * }\n * ```\n */\n@Component({\n template: '',\n changeDetection: ChangeDetectionStrategy.Eager,\n standalone: true,\n})\nexport abstract class AXPLoginChallengeComponentBase {\n //#region ---- Inputs ----\n\n /**\n * Challenge data to display\n * Contains the image/content and metadata from the server\n */\n challengeData = input.required<AXPLoginChallengeData>();\n\n /**\n * Whether the challenge is currently loading (e.g., refreshing)\n */\n isLoading = input<boolean>(false);\n\n //#endregion\n\n //#region ---- Outputs ----\n\n /**\n * Emits when the user enters or changes their response\n * The login component will capture this value and include it in credentials\n */\n responseChange = output<string>();\n\n /**\n * Emits when the user requests a new challenge (e.g., clicks refresh button)\n * The login component will call provider.refreshChallenge()\n */\n refreshRequest = output<void>();\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- Sign-in method types -----\n\n/** Protocol family for a sign-in method. */\nexport type AXPSignInMethodProtocol = 'password' | 'otp' | 'oidc' | 'saml' | 'ldap' | 'custom';\n\n/** One interactive step in a multi-factor / challenge flow. */\nexport type AXPSignInMethodStepKind =\n | 'credentials'\n | 'otp'\n | 'captcha'\n | 'external-redirect'\n | 'complete';\n\nexport interface AXPSignInMethodDescriptor {\n /** Stable id, e.g. `password`, `oidc:google`, `saml:okta-hr`. */\n readonly id: string;\n readonly title: string;\n readonly protocol: AXPSignInMethodProtocol;\n readonly enabled: boolean;\n /** Lower = higher on the login page. */\n readonly priority?: number;\n readonly icon?: string;\n}\n\nexport interface AXPSignInMethodStep {\n readonly kind: AXPSignInMethodStepKind;\n readonly challengeId?: string;\n readonly message?: string;\n readonly redirectUrl?: string;\n}\n\nexport interface AXPSignInMethodStartResult {\n readonly status: 'completed' | 'continue' | 'redirect';\n readonly step?: AXPSignInMethodStep;\n /** When status is completed, session cookies are already set by the server. */\n readonly userId?: string;\n}\n\n/**\n * Pluggable sign-in method. Multiple methods can be registered and offered at once.\n * Session remember/refresh live in {@link AXPSessionService}; methods only prove identity.\n */\nexport abstract class AXPSignInMethod {\n abstract get descriptor(): AXPSignInMethodDescriptor;\n\n /** Begin or continue the method flow. */\n abstract start(input: Record<string, unknown>): Promise<AXPSignInMethodStartResult>;\n\n /** Submit a challenge / OTP / captcha step. */\n abstract continue(\n step: AXPSignInMethodStep,\n input: Record<string, unknown>,\n ): Promise<AXPSignInMethodStartResult>;\n}\n\n//#endregion\n","import { Injectable } from '@angular/core';\nimport type { AXPSignInMethod, AXPSignInMethodDescriptor } from './sign-in-method.types';\n\n//#region ----- Sign-in method registry -----\n\n/**\n * Registry of enabled sign-in methods for the login UI.\n * Methods are independent of session refresh/remember (owned by session service).\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPSignInMethodRegistry {\n private readonly methods = new Map<string, AXPSignInMethod>();\n\n register(...methods: AXPSignInMethod[]): void {\n for (const method of methods) {\n this.methods.set(method.descriptor.id, method);\n }\n }\n\n get(id: string): AXPSignInMethod | undefined {\n return this.methods.get(id);\n }\n\n listEnabled(): AXPSignInMethodDescriptor[] {\n return [...this.methods.values()]\n .map((m) => m.descriptor)\n .filter((d) => d.enabled)\n .sort((a, b) => (a.priority ?? 100) - (b.priority ?? 100));\n }\n}\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|