{"version":3,"file":"bravobit-bb-foundation-auth.mjs","sources":["../../../projects/bb-foundation/auth/src/lib/interfaces/config.interface.ts","../../../projects/bb-foundation/auth/src/lib/tokens/use-authorization.token.ts","../../../projects/bb-foundation/auth/src/lib/helpers/jwt.helper.ts","../../../projects/bb-foundation/auth/src/lib/providers/verify.provider.ts","../../../projects/bb-foundation/auth/src/lib/providers/email.provider.ts","../../../projects/bb-foundation/auth/src/lib/auth.session.ts","../../../projects/bb-foundation/auth/src/lib/auth.service.ts","../../../projects/bb-foundation/auth/src/lib/directives/authenticated.directive.ts","../../../projects/bb-foundation/auth/src/lib/directives/anonymous.directive.ts","../../../projects/bb-foundation/auth/src/lib/guards/anonymous.guard.ts","../../../projects/bb-foundation/auth/src/lib/guards/authenticated.guard.ts","../../../projects/bb-foundation/auth/src/lib/acting.service.ts","../../../projects/bb-foundation/auth/src/lib/acting.interceptor.ts","../../../projects/bb-foundation/auth/src/lib/auth.interceptor.ts","../../../projects/bb-foundation/auth/src/lib/auth.config.ts","../../../projects/bb-foundation/auth/src/lib/auth.module.ts","../../../projects/bb-foundation/auth/src/bravobit-bb-foundation-auth.ts"],"sourcesContent":["import {ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree} from '@angular/router';\nimport {StorageOption} from '@bravobit/bb-foundation/storage';\nimport {InjectionToken} from '@angular/core';\n\nexport type AuthStrategy = 'httpOnlyCookie' | 'browserStorage';\n\nexport interface AuthConfig {\n    applicationId: string;\n    strategy: AuthStrategy;\n\n    preferredStorageOptions?: StorageOption[];\n\n    http?: {\n        scheme?: string,\n        header?: string\n    };\n\n    redirects?: {\n        authenticated?: string | string[];\n        unauthenticated?: string | string[];\n    };\n    setRedirectOnFailedAuth?: boolean;\n\n    interceptActing?: boolean;\n\n    providers?: string[];\n    autoRefresh?: boolean;\n}\n\nexport const AUTH_CONFIG = new InjectionToken<AuthConfig>('auth config');\n\nexport const AUTH_REDIRECT_HANDLER = new InjectionToken<AuthRedirectHandler>('auth redirect handler');\n\nexport interface AuthRedirectHandler {\n\n    onFailedAuthenticated(snapshot?: ActivatedRouteSnapshot, state?: RouterStateSnapshot): boolean | UrlTree;\n\n    onFailedAnonymous(snapshot?: ActivatedRouteSnapshot, state?: RouterStateSnapshot): boolean | UrlTree;\n\n}\n","import {HttpContextToken} from '@angular/common/http';\n\nexport const USE_AUTHORIZATION = new HttpContextToken(() => true);","import {AuthToken} from '../interfaces/token.interface';\n\nexport class JwtHelper {\n\n    decode(token: string) {\n        try {\n            if (token === null || token === undefined) {\n                return null;\n            }\n\n            const json = JSON.parse(\n                this.urlDecode(token.split('.')[1])\n            );\n\n            return this.parse(json);\n        } catch {\n            return null;\n        }\n    }\n\n    private urlDecode(token: string | null) {\n        const value = token || '';\n        let output = value\n            .replace(/-/g, '+')\n            .replace(/_/g, '/');\n\n        switch (output.length % 4) {\n            case 0:\n                break;\n            case 2:\n                output += '==';\n                break;\n            case 3:\n                output += '=';\n                break;\n            default:\n                throw 'Illegal base64url string!';\n        }\n\n        try {\n            return this.baseDecodeUnicode(output);\n        } catch {\n            return atob(output);\n        }\n    }\n\n    private baseDecodeUnicode = (value: string) => {\n        return decodeURIComponent(atob(value).replace(/(.)/g, (_, p) => {\n            let code = p.charCodeAt(0).toString(16).toUpperCase();\n            if (code.length < 2) {\n                code = '0' + code;\n            }\n            return '%' + code;\n        }));\n    };\n\n    private parse = (data: object) => {\n        return {\n            id: data['jti'] ?? null,\n            type: data['typ'] ?? null,\n            audience: data['aud'] ?? null,\n            issuer: data['iss'] ?? null,\n            subject: data['sub'] ?? null,\n            role: data['role'] ?? null,\n            notValidBefore: this.parseDate(data['nbf']),\n            expiresAt: this.parseDate(data['exp']),\n            issuedAt: this.parseDate(data['iat'])\n        } as AuthToken;\n    };\n\n    private parseDate = (epochInSeconds: number) => {\n        if (!epochInSeconds || epochInSeconds <= 0) {\n            return null;\n        }\n\n        return new Date(epochInSeconds * 1000);\n    };\n\n}\n","import {AuthProvider, AuthProviderResponse, AuthProviderResult} from '../interfaces/provider.interface';\nimport {HttpClient} from '@angular/common/http';\nimport {firstValueFrom} from 'rxjs';\n\nexport class AuthVerifyProvider implements AuthProvider {\n\n    constructor(private _code: string,\n                private _verifyToken: string,\n                private _endpoint: string) {\n    }\n\n    async authenticate(httpClient: HttpClient): Promise<AuthProviderResult> {\n        // Execute API call.\n        const data$ = httpClient.post<Pick<AuthProviderResponse, 'token' | 'refresh_token' | 'user'>>(this._endpoint, {\n            token: this._code,\n            verify_token: this._verifyToken\n        });\n\n        const data = await firstValueFrom(data$);\n        return {\n            accessToken: data?.token,\n            refreshToken: data?.refresh_token,\n            user: data?.user\n        };\n    }\n\n}\n","import {AuthProvider, AuthProviderResponse, AuthProviderResult} from '../interfaces/provider.interface';\nimport {HttpClient} from '@angular/common/http';\nimport {firstValueFrom} from 'rxjs';\n\nexport class AuthEmailProvider implements AuthProvider {\n\n    constructor(private _email: string,\n                private _password: string,\n                private _endpoint: string) {\n    }\n\n    async authenticate(httpClient: HttpClient): Promise<AuthProviderResult> {\n        // Execute API call.\n        const data$ = httpClient.post<AuthProviderResponse>(this._endpoint, {\n            email: this._email,\n            password: this._password\n        });\n\n        const data = await firstValueFrom(data$);\n        return {\n            accessToken: data?.token,\n            refreshToken: data?.refresh_token,\n            user: data?.user,\n            provider: data?.provider,\n            verifyToken: data?.verify_token\n        };\n    }\n\n}\n","import {StorageStrategy} from '@bravobit/bb-foundation/storage';\nimport {AuthStrategy} from './interfaces/config.interface';\nimport {AuthToken} from './interfaces/token.interface';\nimport {JwtHelper} from './helpers/jwt.helper';\nimport {shareReplay} from 'rxjs/operators';\nimport {BehaviorSubject} from 'rxjs';\n\nexport class AuthSession {\n\n    // Readonly data.\n    private readonly _jwt = new JwtHelper();\n    private readonly _storage: StorageStrategy | null;\n    private readonly _accessTokenStorageKey: string;\n    private readonly _refreshTokenStorageKey: string;\n    private readonly _authenticatedStorageKey: string;\n    private readonly _strategy: AuthStrategy;\n\n    // Authenticated.\n    private _authenticated: boolean = false;\n\n    // Token strings.\n    private _accessTokenString: string | null = null;\n    private _refreshTokenString: string | null = null;\n\n    // Token payloads.\n    private _accessTokenPayload: AuthToken | null = null;\n    private _refreshTokenPayload: AuthToken | null = null;\n\n    // Private user data.\n    private _user$ = new BehaviorSubject<any | null>(null);\n\n    // Public user data.\n    user = this._user$.pipe(\n        shareReplay({refCount: true, bufferSize: 1})\n    );\n\n    constructor(options?: { id?: string, storage?: StorageStrategy, strategy?: AuthStrategy }) {\n        const applicationId = options?.id ?? 'ng';\n\n        // Setting up the readonly storage keys.\n        this._accessTokenStorageKey = this.generateKey(applicationId, 'au_act');\n        this._refreshTokenStorageKey = this.generateKey(applicationId, 'au_rft');\n        this._authenticatedStorageKey = this.generateKey(applicationId, 'au_usr');\n\n        // Setting up the storage.\n        this._storage = options?.storage ?? null;\n        this._strategy = options?.strategy ?? null;\n\n        // Init methods.\n        this.restoreFromStorage();\n    }\n\n    get snapshot() {\n        if (this._strategy === 'httpOnlyCookie') {\n            return {user: this._user$.getValue()};\n        }\n        return {\n            user: this._user$.getValue(),\n            accessToken: this.accessToken,\n            refreshToken: this.refreshToken\n        };\n    }\n\n    get accessToken() {\n        return this.isTokenValid(this._accessTokenPayload)\n            ? this._accessTokenString\n            : null;\n    }\n\n    get refreshToken() {\n        return this.isTokenValid(this.refreshTokenPayload)\n            ? this._refreshTokenString\n            : null;\n    }\n\n    get accessTokenPayload() {\n        return this._accessTokenPayload ?? null;\n    }\n\n    get refreshTokenPayload() {\n        return this._refreshTokenPayload ?? null;\n    }\n\n    authenticated() {\n        return this._authenticated;\n    }\n\n    setTokens(accessToken: string | null, refreshToken: string | null, persist: boolean = true) {\n        if (this._strategy === 'httpOnlyCookie') {\n            return;\n        }\n\n        this.cacheAccessToken(accessToken);\n        this.cacheRefreshToken(refreshToken);\n\n        if (persist) {\n            this.persistTokensInStorage();\n        }\n    }\n\n    setUser(user: unknown, persist: boolean = true) {\n        this._user$.next(user ?? null);\n\n        if (persist) {\n            this.setAuthenticated(!!user);\n        }\n    }\n\n    clear() {\n        this.setTokens(null, null);\n        this.setUser(null);\n    }\n\n    private restoreFromStorage() {\n        if (!this._storage) {\n            return;\n        }\n\n        const authenticated = this._storage.get<boolean>(this._authenticatedStorageKey);\n        this.setAuthenticated(!!authenticated);\n\n        if (this._strategy === 'browserStorage') {\n            // Set the access token.\n            const accessToken = this._storage.get<string>(this._accessTokenStorageKey);\n            this.cacheAccessToken(accessToken);\n\n            // Set the refresh token.\n            const refreshToken = this._storage.get<string>(this._refreshTokenStorageKey);\n            this.cacheRefreshToken(refreshToken);\n        }\n    }\n\n    private persistTokensInStorage() {\n        if (!this._storage || this._strategy === 'httpOnlyCookie') {\n            return;\n        }\n\n        // Set the access token if completely valid.\n        if (!!this.accessToken) {\n            this._storage.set<string>(this._accessTokenStorageKey, this._accessTokenString, {\n                expires: this._accessTokenPayload?.expiresAt\n            });\n        } else {\n            this._storage.remove(this._accessTokenStorageKey);\n        }\n\n        // Set the refresh token if completely valid.\n        if (!!this.refreshToken) {\n            this._storage.set<string>(this._refreshTokenStorageKey, this._refreshTokenString, {\n                expires: this._refreshTokenPayload?.expiresAt\n            });\n        } else {\n            this._storage.remove(this._refreshTokenStorageKey);\n        }\n    }\n\n    private persistAuthenticatedInStorage() {\n        if (!this._storage) {\n            return;\n        }\n\n        if (this._authenticated) {\n            const expires = this.refreshTokenPayload?.expiresAt\n                ?? this.accessTokenPayload?.expiresAt\n                ?? this.getNextYearDate();\n            this._storage.set<boolean>(this._authenticatedStorageKey, this._authenticated, {expires});\n        } else {\n            this._storage.remove(this._authenticatedStorageKey);\n        }\n    }\n\n    private setAuthenticated(value: boolean, persist: boolean = true) {\n        this.cacheAuthenticated(value);\n\n        if (persist) {\n            this.persistAuthenticatedInStorage();\n        }\n    }\n\n    private cacheAccessToken(value: string | null) {\n        this._accessTokenString = value ?? null;\n        this._accessTokenPayload = this._jwt.decode(this._accessTokenString);\n    }\n\n    private cacheRefreshToken(value: string | null) {\n        this._refreshTokenString = value ?? null;\n        this._refreshTokenPayload = this._jwt.decode(this._refreshTokenString);\n    }\n\n    private cacheAuthenticated(value: boolean) {\n        this._authenticated = !!value;\n    }\n\n    private generateKey(applicationId: string, key: string) {\n        return [applicationId, key].join('_');\n    }\n\n    private isTokenValid(token: AuthToken) {\n        if (!token) {\n            return false;\n        }\n\n        return token?.expiresAt?.getTime() > Date.now();\n    }\n\n    private getNextYearDate() {\n        const date = new Date();\n        date.setFullYear(date.getFullYear() + 1);\n        return date;\n    }\n\n}\n","import {AUTH_CONFIG, AUTH_REDIRECT_HANDLER, AuthConfig, AuthRedirectHandler} from './interfaces/config.interface';\nimport {inject, Injectable, Injector, makeStateKey, StateKey, TransferState} from '@angular/core';\nimport {HttpClient, HttpContext, HttpHeaders, HttpParams} from '@angular/common/http';\nimport {AuthProvider, AuthSignInResponse} from './interfaces/provider.interface';\nimport {Storage, StorageOption} from '@bravobit/bb-foundation/storage';\nimport {HttpConfig, HTTP_CONFIG} from '@bravobit/bb-foundation/http';\nimport {USE_AUTHORIZATION} from './tokens/use-authorization.token';\nimport {AuthVerifyProvider} from './providers/verify.provider';\nimport {AuthEmailProvider} from './providers/email.provider';\nimport {firstValueFrom, Observable, of} from 'rxjs';\nimport {Platform} from '@angular/cdk/platform';\nimport {AuthSession} from './auth.session';\nimport {map, tap} from 'rxjs/operators';\nimport {Router} from '@angular/router';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class Auth {\n\n    // Dependencies.\n    private readonly _storage: Storage = inject(Storage);\n    private readonly _injector: Injector = inject(Injector);\n    private readonly _platform: Platform = inject(Platform);\n    private readonly _httpClient: HttpClient = inject(HttpClient);\n    private readonly _state?: TransferState = inject(TransferState, {optional: true});\n    private readonly _config?: AuthConfig = inject(AUTH_CONFIG, {optional: true});\n    private readonly _httpConfig?: HttpConfig = inject(HTTP_CONFIG, {optional: true});\n    private readonly _handler?: AuthRedirectHandler = inject(AUTH_REDIRECT_HANDLER, {optional: true});\n\n    // Readonly data.\n    private readonly _authStateKey: StateKey<any | null> = makeStateKey(`bbAuthStateKey`);\n    private readonly _httpAlias: string | null = this._httpConfig?.defaultAlias ?? null;\n\n    readonly session: AuthSession;\n    readonly user: Observable<any | null>;\n\n    private _refreshHandler: number | null = null;\n\n    constructor() {\n        // We select a storage strategy based on the server/browser.\n        // Only cookies CAN work on the server.\n        const storageStrategy = this._platform.isBrowser\n            ? this._storage.select(this._config?.preferredStorageOptions ?? [StorageOption.Cookie, StorageOption.Local])\n            : this._storage.cookie;\n\n        // Starting the new session.\n        this.session = new AuthSession({\n            id: this._config?.applicationId,\n            storage: storageStrategy,\n            strategy: this._config?.strategy\n        });\n        this.user = this.session.user;\n    }\n\n    async initialize() {\n        // Only retrieve from the server when we are actually authenticated.\n        if (!this.session.authenticated()) {\n            return;\n        }\n\n        // Get the key from the server state.\n        if (this._state && this._state?.hasKey(this._authStateKey)) {\n            const user = this._state?.get(this._authStateKey, null) ?? null;\n            return this.session.setUser(user);\n        }\n\n        if (this._config?.strategy === 'browserStorage' || (this._config?.strategy === 'httpOnlyCookie' && this._platform.isBrowser)) {\n            // Try to fetch the user from the server.\n            const user$ = this.me();\n            const user = await firstValueFrom(user$, {defaultValue: null});\n\n            // Set the state if exists.\n            if (this._state) {\n                this._state?.set<any>(this._authStateKey, user ?? null);\n            }\n\n            this.session.setUser(user);\n        }\n\n        this.handleAutoRefreshing();\n    }\n\n    me<T = any>() {\n        const url = this.getUrl('auth/me');\n        return this._httpClient.get<T>(url);\n    }\n\n    async signIn<T = any>(provider: AuthProvider, verify?: (user: T) => void) {\n        const {accessToken, refreshToken, user, ...result} = await provider.authenticate(this._httpClient);\n\n        // Verify the user.\n        verify?.(user);\n\n        // Validate if the provider is one of the available\n        // providers then return the user object and the provider.\n        const apiProvider = result?.provider ?? null;\n        const apiVerifyToken = result?.verifyToken ?? null;\n        const availableProviders = this._config?.providers ?? ['email', 'sms', 'totp'];\n        if (availableProviders.includes(apiProvider)) {\n            return <AuthSignInResponse>{user, provider: apiProvider, verifyToken: apiVerifyToken};\n        }\n\n        // Set the tokens in storage.\n        this.setTokens(accessToken, refreshToken);\n\n        // Set the user in storage.\n        this.session.setUser(user);\n\n        // Return the user.\n        return <AuthSignInResponse>{user};\n    }\n\n    async signInWithEmail<T = any>(email: string, password: string, verify?: (user: T) => void) {\n        const url = this.getUrl('auth/login');\n        return this.signIn(new AuthEmailProvider(email, password, url), verify);\n    }\n\n    async signInWithVerifyCode(code: string, verifyToken: string) {\n        const url = this.getUrl('auth/verify');\n        return this.signIn(new AuthVerifyProvider(code, verifyToken, url));\n    }\n\n    async resendVerifyCode(verifyToken: string) {\n        const url = this.getUrl('auth/resend');\n        const result$ = this._httpClient.post(url, {verify_token: verifyToken});\n        return await firstValueFrom(result$);\n    }\n\n    async register<T = any>(data: any, options?: {\n        headers?: HttpHeaders | {\n            [header: string]: string | string[];\n        };\n        params?: HttpParams | {\n            [param: string]: string | number | boolean | ReadonlyArray<string | number | boolean>;\n        };\n    }) {\n        // Execute API call.\n        const url = this.getUrl('auth/register');\n        const result$ = this._httpClient.post<{ token: string, refresh_token: string, user: any }>(url, data, options);\n        const result = await firstValueFrom(result$);\n\n        // Set the tokens in storage.\n        this.setTokens(result?.token, result?.refresh_token);\n\n        // Set the user in storage.\n        const user = result?.user;\n        this.session.setUser(user);\n\n        // Return the user.\n        return <T>user;\n    }\n\n    logout() {\n        // If we don't have a refresh token just clear the session.\n        // Note: We do this because else we try to invalidate\n        // an \"undefined\" refresh token.\n        const refreshToken = this.session.refreshToken;\n        if (!refreshToken && this._config?.strategy === 'browserStorage') {\n            return this.session.clear();\n        }\n\n        // We do have a refresh token, so try to invalidate it in the backend.\n        // or we are httpOnlyCookie authenticated.\n        try {\n            const url = this.getUrl('auth/logout');\n            const headerName = this._config?.http?.header ?? 'Authorization';\n\n            const headers = new HttpHeaders({\n                [headerName]: refreshToken\n            });\n\n            const observable$ = this._httpClient.get(url, {\n                ...(this._config?.strategy === 'browserStorage' ? {headers} : {}),\n                ...(this._config?.strategy === 'httpOnlyCookie' ? {withCredentials: true} : {})\n            });\n            firstValueFrom(observable$).then(_ => _).catch(_ => _);\n        } catch {\n            // Do nothing because the tokens will be deleted anyways from the session.\n        } finally {\n            // Delete the tokens from the session.\n            this.session.clear();\n        }\n    }\n\n    refresh() {\n        // If the refresh token does\n        // not exist just return an observable of null.\n        const refreshToken = this.session.refreshToken;\n        if (!refreshToken && this._config?.strategy === 'browserStorage') {\n            return of(null);\n        }\n\n        // Perform the refresh call.\n        const headerName = this._config?.http?.header ?? 'Authorization';\n        const scheme = this._config?.http?.scheme ?? 'Bearer';\n\n        const url = this.getUrl('auth/refresh');\n        const context = new HttpContext().set(USE_AUTHORIZATION, false);\n\n        const headers = new HttpHeaders({\n            [headerName]: `${scheme} ${refreshToken}`\n        });\n\n        return this._httpClient.get<{ token: string, refresh_token: string }>(url, {\n            ...(this._config?.strategy === 'browserStorage' ? {headers} : {}),\n            ...(this._config?.strategy === 'httpOnlyCookie' ? {withCredentials: true} : {}),\n            context: context\n        }).pipe(\n            tap(({token, refresh_token}) => this.setTokens(token, refresh_token)),\n            map(({token}) => token)\n        );\n    }\n\n    async requestPassword(email: string, extraParams: { [key: string]: any } = {}) {\n        const url = this.getUrl('auth/reset');\n        const observable$ = this._httpClient.post(url, {...extraParams, email});\n        return firstValueFrom(observable$);\n    }\n\n    async resetPassword(token: string, newPassword: string, extraParams: { [key: string]: any } = {}) {\n        const url = this.getUrl('auth/reset-password');\n        const observable$ = this._httpClient.post(url, {...extraParams, token, password: newPassword});\n        return firstValueFrom(observable$);\n    }\n\n    clearAndRedirect() {\n        // 1. Delete the tokens from the session.\n        this.session.clear();\n\n        if (this._handler) {\n            const urlTree = this._handler.onFailedAuthenticated();\n            if (typeof urlTree === 'boolean' || urlTree === null || urlTree === undefined) {\n                return;\n            }\n\n            this.router.navigateByUrl(urlTree).then(_ => _);\n            return;\n        }\n\n        // 2. Compose the route url.\n        const redirectUrl = this._config?.redirects.unauthenticated ?? null;\n\n        // 3. Route back if the user provided a redirect url.\n        if (this.router && redirectUrl) {\n            const commands = Array.isArray(redirectUrl) ? redirectUrl : [redirectUrl];\n            this.router.navigate(commands).then(_ => _);\n        }\n    }\n\n    private setTokens(accessToken: string, refreshToken: string) {\n        // Set the tokens in our session.\n        this.session.setTokens(accessToken, refreshToken);\n\n        // We need to update the auto refresh of the refresh token.\n        this.handleAutoRefreshing();\n    }\n\n    private handleAutoRefreshing() {\n        const shouldAutoRefresh = this._config?.autoRefresh ?? false;\n        if (!shouldAutoRefresh || this._config?.strategy === 'httpOnlyCookie') {\n            return;\n        }\n\n        const expiresAt = this.session.refreshTokenPayload?.expiresAt ?? null;\n        if (expiresAt === null || !this._platform.isBrowser) {\n            return;\n        }\n\n        const differenceInMilliseconds = expiresAt.getTime() - Date.now();\n        const offsetInMilliseconds = 10_000; // 10 seconds.\n\n        // We want to start the refresh 10 seconds before it expires.\n        const actualTiming = differenceInMilliseconds - offsetInMilliseconds;\n        if (actualTiming <= 0) {\n            return;\n        }\n\n        // We need to cap the timings because if\n        // we get large numbers it might cause unwanted results.\n        const maxTiming = 1000 * 60 * 60 * 24; // 24 hours.\n        const cappedTiming = Math.max(1, Math.min(actualTiming, maxTiming));\n        try {\n            if (this._refreshHandler !== null) {\n                clearTimeout?.(this._refreshHandler);\n                this._refreshHandler = null;\n            }\n            this._refreshHandler = window?.setTimeout?.(() => this.autoRefresh(), cappedTiming);\n        } catch {\n            // Just ignore it.\n        }\n    }\n\n    private async autoRefresh() {\n        try {\n            // We just need to wait for it to refresh.\n            const refresh$ = this.refresh();\n            await firstValueFrom(refresh$);\n        } catch {\n            // Something went wrong refreshing, we need to clear.\n            this.clearAndRedirect();\n        }\n    }\n\n    private get router() {\n        return this._injector.get(Router);\n    }\n\n    private getUrl(endpoint: string) {\n        return [this._httpAlias, endpoint]\n            .filter(item => !!item)\n            .join('/');\n    }\n\n}\n","import {Directive, EmbeddedViewRef, inject, Input, OnDestroy, OnInit, TemplateRef, ViewContainerRef} from '@angular/core';\nimport {distinctUntilChanged, map} from 'rxjs/operators';\nimport {Auth} from '../auth.service';\nimport {Subscription} from 'rxjs';\n\n@Directive({\n    selector: 'ng-template[bbAuthenticated]'\n})\nexport class BbAuthenticated implements OnInit, OnDestroy {\n\n    // Dependencies.\n    private readonly _auth: Auth = inject(Auth);\n    private readonly _templateRef: TemplateRef<any> = inject(TemplateRef);\n    private readonly _viewContainerRef: ViewContainerRef = inject(ViewContainerRef);\n\n    // Data.\n    private _valid: boolean = false;\n\n    // Templates.\n    private _elseTemplateRef: TemplateRef<any> | null = null;\n\n    // View refs.\n    private _thenViewRef: EmbeddedViewRef<any> | null = null;\n    private _elseViewRef: EmbeddedViewRef<any> | null = null;\n\n    // Subscriptions.\n    private _subscription = new Subscription();\n\n    @Input()\n    set bbAuthenticatedElse(templateRef: TemplateRef<any>) {\n        this.assertTemplate('bbAuthenticatedElse', templateRef);\n        this._elseTemplateRef = templateRef;\n        this.updateView();\n    }\n\n    ngOnInit() {\n        const subscription = this._auth.user.pipe(\n            map(user => !!user),\n            distinctUntilChanged()\n        ).subscribe(valid => {\n            this._valid = valid;\n            this.updateView();\n        });\n        this._subscription.add(subscription);\n    }\n\n    ngOnDestroy() {\n        this._subscription?.unsubscribe();\n    }\n\n    private updateView() {\n        if (this._valid) {\n            if (!this._thenViewRef) {\n                this._viewContainerRef.clear();\n                this._elseViewRef = null;\n                if (this._templateRef) {\n                    this._thenViewRef = this._viewContainerRef.createEmbeddedView(this._templateRef);\n                }\n            }\n        } else {\n            if (!this._elseViewRef) {\n                this._viewContainerRef.clear();\n                this._thenViewRef = null;\n                if (this._elseTemplateRef) {\n                    this._elseViewRef = this._viewContainerRef.createEmbeddedView(this._elseTemplateRef);\n                }\n            }\n        }\n    }\n\n    private assertTemplate(property: string, templateRef: TemplateRef<any> | null) {\n        const isTemplateRefOrNull = !!(!templateRef || templateRef.createEmbeddedView);\n        if (!isTemplateRefOrNull) {\n            throw new Error(`${property} must be a TemplateRef.`);\n        }\n    }\n\n    static ngAcceptInputType_bbAuthenticatedElse: TemplateRef<any>;\n\n}\n","import {Directive, EmbeddedViewRef, inject, Input, OnDestroy, OnInit, TemplateRef, ViewContainerRef} from '@angular/core';\nimport {distinctUntilChanged, map} from 'rxjs/operators';\nimport {Auth} from '../auth.service';\nimport {Subscription} from 'rxjs';\n\n@Directive({\n    selector: 'ng-template[bbAnonymous]'\n})\nexport class BbAnonymous implements OnInit, OnDestroy {\n\n    // Dependencies.\n    private readonly _auth: Auth = inject(Auth);\n    private readonly _templateRef: TemplateRef<any> = inject(TemplateRef);\n    private readonly _viewContainerRef: ViewContainerRef = inject(ViewContainerRef);\n\n    // Data.\n    private _valid: boolean = false;\n\n    // Templates.\n    private _elseTemplateRef: TemplateRef<any> | null = null;\n\n    // View refs.\n    private _thenViewRef: EmbeddedViewRef<any> | null = null;\n    private _elseViewRef: EmbeddedViewRef<any> | null = null;\n\n    // Subscriptions.\n    private _subscription = new Subscription();\n\n    @Input()\n    set bbAnonymousElse(templateRef: TemplateRef<any>) {\n        this.assertTemplate('bbAnonymousElse', templateRef);\n        this._elseTemplateRef = templateRef;\n        this.updateView();\n    }\n\n    ngOnInit() {\n        const subscription = this._auth.user.pipe(\n            map(user => !user),\n            distinctUntilChanged()\n        ).subscribe(valid => {\n            this._valid = valid;\n            this.updateView();\n        });\n        this._subscription.add(subscription);\n    }\n\n    ngOnDestroy() {\n        this._subscription?.unsubscribe();\n    }\n\n    private updateView() {\n        if (this._valid) {\n            if (!this._thenViewRef) {\n                this._viewContainerRef.clear();\n                this._elseViewRef = null;\n                if (this._templateRef) {\n                    this._thenViewRef = this._viewContainerRef.createEmbeddedView(this._templateRef);\n                }\n            }\n        } else {\n            if (!this._elseViewRef) {\n                this._viewContainerRef.clear();\n                this._thenViewRef = null;\n                if (this._elseTemplateRef) {\n                    this._elseViewRef = this._viewContainerRef.createEmbeddedView(this._elseTemplateRef);\n                }\n            }\n        }\n    }\n\n    private assertTemplate(property: string, templateRef: TemplateRef<any> | null) {\n        const isTemplateRefOrNull = !!(!templateRef || templateRef.createEmbeddedView);\n        if (!isTemplateRefOrNull) {\n            throw new Error(`${property} must be a TemplateRef.`);\n        }\n    }\n\n    static ngAcceptInputType_bbAnonymousElse: TemplateRef<any>;\n\n}\n","import {ActivatedRouteSnapshot, CanActivateFn, Router, RouterStateSnapshot} from '@angular/router';\nimport {AUTH_CONFIG, AUTH_REDIRECT_HANDLER} from '../interfaces/config.interface';\nimport {inject} from '@angular/core';\nimport {Auth} from '../auth.service';\nimport {map} from 'rxjs/operators';\nimport {first} from 'rxjs';\n\nexport const bbAnonymousGuard: CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n    const auth = inject(Auth);\n    const router = inject(Router);\n    const config = inject(AUTH_CONFIG, {optional: true});\n    const redirectHandler = inject(AUTH_REDIRECT_HANDLER, {optional: true});\n\n    return auth.user.pipe(\n        map(user => !!user),\n        map(authenticated => {\n            if (!authenticated) {\n                return true;\n            }\n\n            if (redirectHandler) {\n                return redirectHandler.onFailedAnonymous(route, state);\n            }\n\n            // If we don't have a URL to go to we can just say\n            // the user is not allowed in this route by returning false.\n            const nextUrl = config?.redirects?.authenticated ?? null;\n            if (!nextUrl) {\n                return false;\n            }\n\n            const commands = Array.isArray(nextUrl) ? nextUrl : [nextUrl];\n            return router.createUrlTree(commands);\n        }),\n        first()\n    );\n};\n","import {ActivatedRouteSnapshot, CanActivateFn, Router, RouterStateSnapshot} from '@angular/router';\nimport {AUTH_CONFIG, AUTH_REDIRECT_HANDLER} from '../interfaces/config.interface';\nimport {Auth} from '../auth.service';\nimport {inject} from '@angular/core';\nimport {map} from 'rxjs/operators';\nimport {first} from 'rxjs';\n\nexport const bbAuthenticatedGuard: CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n    const auth = inject(Auth);\n    const router = inject(Router);\n    const config = inject(AUTH_CONFIG, {optional: true});\n    const redirectHandler = inject(AUTH_REDIRECT_HANDLER, {optional: true});\n\n    return auth.user.pipe(\n        map(user => !!user),\n        map(authenticated => {\n            if (authenticated) {\n                return true;\n            }\n\n            if (redirectHandler) {\n                return redirectHandler.onFailedAuthenticated(route, state);\n            }\n\n            // If we don't have a URL to go to we can just say\n            // the user is not allowed in this route by returning false.\n            const nextUrl = config?.redirects?.unauthenticated ?? null;\n            if (!nextUrl) {\n                return false;\n            }\n\n            const setRedirectOnFailedAuth = config?.setRedirectOnFailedAuth ?? true;\n            const redirectUrl = state?.url ?? null;\n            const queryParams = setRedirectOnFailedAuth && redirectUrl ? {redirectUrl} : {};\n            const commands = Array.isArray(nextUrl) ? nextUrl : [nextUrl];\n            return router.createUrlTree(commands, {queryParams});\n        }),\n        first()\n    );\n};\n","import {BehaviorSubject, firstValueFrom, Observable} from 'rxjs';\nimport {combineLatestMap} from '@bravobit/bb-foundation/rxjs';\nimport {distinctUntilChanged, map} from 'rxjs/operators';\nimport {inject, Injectable} from '@angular/core';\nimport {Auth} from './auth.service';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class Acting {\n\n    // Dependencies.\n    private readonly _auth: Auth = inject(Auth);\n\n    // Cache.\n    private _userId$ = new BehaviorSubject<number>(null);\n\n    // State.\n    readonly info$: Observable<{ active?: boolean, user?: any }> = this.getInfo();\n\n    async start(userId: number) {\n        this._userId$.next(userId);\n        return await this.fetchUserDetails();\n    }\n\n    async stop() {\n        this._userId$.next(null);\n        return await this.fetchUserDetails();\n    }\n\n    getCurrent() {\n        return this._userId$.getValue();\n    }\n\n    private async fetchUserDetails() {\n        const user$ = this._auth.me();\n        const user = await firstValueFrom(user$);\n        this._auth.session.setUser(user);\n    }\n\n    private getInfo() {\n        const active$ = this._userId$.pipe(\n            map(item => !!item),\n            distinctUntilChanged()\n        );\n\n        return combineLatestMap({active: active$, user: this._auth.user});\n    }\n\n}\n","import {HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\nimport {inject, Injectable} from '@angular/core';\nimport {Acting} from './acting.service';\n\n@Injectable()\nexport class ActingInterceptor implements HttpInterceptor {\n\n    // Dependencies.\n    private readonly _acting: Acting = inject(Acting);\n\n    // Readonly data.\n    private readonly _headerString: string = 'X-Act-User-Id';\n\n    intercept(request: HttpRequest<unknown>, next: HttpHandler) {\n        const userId = this._acting.getCurrent();\n        if (userId === null || userId === undefined) {\n            return next.handle(request);\n        }\n\n        const modified = request.clone({\n            setHeaders: {[this._headerString]: `${userId}`}\n        });\n\n        return next.handle(modified);\n    }\n\n}\n","import {HttpErrorResponse, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\nimport {catchError, filter, finalize, switchMap, take} from 'rxjs/operators';\nimport {AUTH_CONFIG, AuthConfig} from './interfaces/config.interface';\nimport {USE_AUTHORIZATION} from './tokens/use-authorization.token';\nimport {HttpError} from '@bravobit/bb-foundation/http';\nimport {BehaviorSubject, of, throwError} from 'rxjs';\nimport {inject, Injectable} from '@angular/core';\nimport {Auth} from './auth.service';\n\n@Injectable()\nexport class AuthInterceptor implements HttpInterceptor {\n\n    // Dependencies.\n    private readonly _auth: Auth = inject(Auth);\n    private readonly _config?: AuthConfig = inject(AUTH_CONFIG, {optional: true});\n\n    // Readonly data.\n    private readonly _authHeaderString: string = this._config?.http?.header ?? 'Authorization';\n    private readonly _authScheme: string = this._config?.http?.scheme ?? 'Bearer';\n\n    // Data.\n    isRefreshing: boolean = false;\n    refreshingAccessToken$ = new BehaviorSubject<boolean>(false);\n\n    intercept(request: HttpRequest<unknown>, next: HttpHandler) {\n        // 1. Check if the user wants to use the authorization for this request.\n        if (!request.context.get(USE_AUTHORIZATION)) {\n            return next.handle(request);\n        }\n\n        // 2. Compose the new request.\n        const newRequest = this.modifyRequest(request);\n\n        // 3. Handle all errors.\n        return next.handle(newRequest).pipe(\n            catchError(error => {\n                // Handle the HTTP401 error.\n                if ((error instanceof HttpErrorResponse || error instanceof HttpError) && error?.status === 401) {\n                    return this.handle401Error(request, next);\n                }\n\n                // Just re-throw the parsed error.\n                return throwError(() => error);\n            })\n        );\n    }\n\n    private modifyRequest<T>(request: HttpRequest<T>) {\n        switch (this._config?.strategy) {\n            case 'browserStorage':\n                return this.handleBrowserStorageRequest(request);\n            case 'httpOnlyCookie':\n                return this.handleHttpOnlyCookieRequest(request);\n            default:\n                throw new Error(`invalid auth strategy \"${this._config?.strategy}\"`);\n        }\n    }\n\n    private handleBrowserStorageRequest<T>(request: HttpRequest<T>) {\n        const accessToken = this.getAccessTokenFromSession(request);\n        if (!accessToken) {\n            return request.clone({headers: request.headers.delete(this._authHeaderString)});\n        }\n\n        return request.clone({\n            setHeaders: {[this._authHeaderString]: `${this._authScheme} ${accessToken}`}\n        });\n    }\n\n    private handleHttpOnlyCookieRequest<T>(request: HttpRequest<T>) {\n        return request.clone({withCredentials: true});\n    }\n\n    private handle401Error(request: HttpRequest<unknown>, next: HttpHandler) {\n        // If already refreshing wait for the refresh token to complete.\n        if (this.isRefreshing) {\n            return this.refreshingAccessToken$.pipe(\n                filter(accessToken => accessToken !== false),\n                take(1),\n                switchMap(() => next.handle(this.modifyRequest(request)))\n            );\n        }\n\n        // Set the refreshing to true.\n        this.isRefreshing = true;\n        this.refreshingAccessToken$.next(false);\n\n        return this._auth.refresh().pipe(\n            switchMap(newAccessToken => {\n                if (!newAccessToken && this._config?.strategy === 'browserStorage') {\n                    return throwError(() => new Error('No refresh token was available.'));\n                }\n\n                this.refreshingAccessToken$.next(true);\n                return next.handle(this.modifyRequest(request));\n            }),\n            catchError(() => this.logoutUser()),\n            finalize(() => this.isRefreshing = false)\n        );\n    }\n\n    private logoutUser() {\n        // Handle the refresh error.\n        this._auth.clearAndRedirect();\n\n        // Return null as data.\n        return of(null);\n    }\n\n    private getAccessTokenFromSession(request: HttpRequest<unknown>) {\n        // Get the token based on header.\n        if (request.headers.has(this._authHeaderString)) {\n            return request.headers.get(this._authHeaderString);\n        }\n\n        // Return the default access token.\n        return this._auth.session.accessToken;\n    }\n\n}\n","import {EnvironmentProviders, makeEnvironmentProviders, inject, provideAppInitializer, Provider} from '@angular/core';\nimport {AUTH_CONFIG, AuthConfig} from './interfaces/config.interface';\nimport {HTTP_INTERCEPTORS} from '@angular/common/http';\nimport {ActingInterceptor} from './acting.interceptor';\nimport {AuthInterceptor} from './auth.interceptor';\nimport {Auth} from './auth.service';\n\nexport function provideAuthConfig(config?: AuthConfig): EnvironmentProviders {\n    const providers: Provider = [\n        {provide: AUTH_CONFIG, useValue: config},\n        {provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true},\n        provideAppInitializer(() => inject(Auth).initialize())\n    ];\n\n    if (config?.interceptActing) {\n        providers.push({provide: HTTP_INTERCEPTORS, useClass: ActingInterceptor, multi: true});\n    }\n\n    return makeEnvironmentProviders(providers);\n}\n","import {BbAuthenticated} from './directives/authenticated.directive';\nimport {ModuleWithProviders, NgModule} from '@angular/core';\nimport {AuthConfig} from './interfaces/config.interface';\nimport {provideAuthConfig} from './auth.config';\n\n@NgModule({\n    imports: [BbAuthenticated],\n    exports: [BbAuthenticated]\n})\nexport class AuthModule {\n\n    static forRoot(config: AuthConfig): ModuleWithProviders<AuthModule> {\n        return {\n            ngModule: AuthModule,\n            providers: [\n                provideAuthConfig(config)\n            ]\n        };\n    }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}