@alauda-fe/common
Version:
Alauda frontend team common codes.
100 lines • 13.8 kB
JavaScript
/**
* @packageDocumentation
* @module authorization
*/
import { HttpClient } from '@angular/common/http';
import { Injectable, inject } from '@angular/core';
import { EMPTY, of, catchError, map, shareReplay, switchMap, tap, timer, fromEvent, merge, timeout, } from 'rxjs';
import { publishRef, getGlobalEnvironments, TRUE, skipError, catchPromise, } from '../core/public-api';
import { attachAuthorizationHeader, getAuthorizationState, logout, logoutAudit, } from './authorization';
import { TOKEN_INFO_API, LOADING_CACHE, TOKEN_REFRESH_API } from './constants';
import { HEARTBEAT_POLLING } from './session-manage.service';
import { readStorageAliveRecord, readStorageToken, refreshStorageAliveRecord, writeStorageToken, } from './storage-token';
import * as i0 from "@angular/core";
export class AuthorizationStateService {
constructor() {
this.http = inject(HttpClient);
this.state$ = this.http
.get(TOKEN_INFO_API, {
headers: attachAuthorizationHeader(),
})
.pipe(skipError(null), tap(info => {
if (!info) {
logout(true);
}
this.payloadSnapshot = info;
}), map(info => ({
...getAuthorizationState(),
info,
})), shareReplay(1));
this.checkTokenCache$ = null;
this.logout = logout;
if (getGlobalEnvironments('CLOSE_BROWSER_END_SESSION') === TRUE) {
this.state$
.pipe(switchMap(state => {
const aliveRecord = readStorageAliveRecord();
if (!aliveRecord ||
Date.now() - aliveRecord > HEARTBEAT_POLLING + LOADING_CACHE) {
this.logoutWithAudit();
return EMPTY;
}
return of(state);
}), switchMap(() => {
return merge(timer(0, HEARTBEAT_POLLING), fromEvent(window, 'beforeunload'));
}))
.subscribe(refreshStorageAliveRecord);
}
}
logoutWithAudit() {
catchPromise(logoutAudit())
.pipe(timeout(1000), map(res => res?.logout_redirect_url))
.subscribe(redirectUrl => logout(redirectUrl));
}
refreshToken() {
if (this.refreshTokenCache$) {
return this.refreshTokenCache$;
}
this.refreshTokenCache$ = this.http
.get(TOKEN_REFRESH_API)
.pipe(tap(({ id_token: idToken }) => {
writeStorageToken(idToken);
this.refreshTokenCache$ = null;
}), catchError(() => {
logout(true);
return EMPTY;
}), publishRef());
return this.refreshTokenCache$;
}
checkToken() {
if (!this.checkTokenCache$) {
this.checkTokenCache$ = this.http.get(TOKEN_INFO_API).pipe(tap({
next: () => {
this.checkTokenCache$ = null;
},
error: () => {
this.checkTokenCache$ = null;
},
}), publishRef());
}
return this.checkTokenCache$;
}
getTokenPayload() {
return this.state$.pipe(map(state => state.info));
}
getAccountInfo() {
if (this.payloadSnapshot) {
return of(this.payloadSnapshot);
}
return this.state$.pipe(map(state => state.info || {}));
}
getTokenByStorage() {
return readStorageToken();
}
static { this.ɵfac = function AuthorizationStateService_Factory(t) { return new (t || AuthorizationStateService)(); }; }
static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: AuthorizationStateService, factory: AuthorizationStateService.ɵfac, providedIn: 'root' }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AuthorizationStateService, [{
type: Injectable,
args: [{ providedIn: 'root' }]
}], () => [], null); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9hdXRob3JpemF0aW9uL3N0YXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFDTCxLQUFLLEVBRUwsRUFBRSxFQUNGLFVBQVUsRUFDVixHQUFHLEVBQ0gsV0FBVyxFQUNYLFNBQVMsRUFDVCxHQUFHLEVBQ0gsS0FBSyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsT0FBTyxHQUNSLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUNMLFVBQVUsRUFDVixxQkFBcUIsRUFDckIsSUFBSSxFQUNKLFNBQVMsRUFDVCxZQUFZLEdBQ2IsTUFBTSxvQkFBb0IsQ0FBQztBQUc1QixPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLHFCQUFxQixFQUNyQixNQUFNLEVBQ04sV0FBVyxHQUVaLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDL0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIseUJBQXlCLEVBQ3pCLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDOztBQUd6QixNQUFNLE9BQU8seUJBQXlCO0lBOEJwQztRQTdCaUIsU0FBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUxQixXQUFNLEdBQUcsSUFBSSxDQUFDLElBQUk7YUFDaEMsR0FBRyxDQUFjLGNBQWMsRUFBRTtZQUNoQyxPQUFPLEVB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LEdBQUcsRUFBRTtvQkFDVCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2dCQUMvQixDQUFDO2dCQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7b0JBQ1YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztnQkFDL0IsQ0FBQzthQUNGLENBQUMsRUFDRixVQUFVLEVBQUUsQ0FDYixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFFRCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBUyxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELGlCQUFpQjtRQUNmLE9BQU8sZ0JBQWdCLEVBQUUsQ0FBQztJQUM1QixDQUFDOzBGQXJIVSx5QkFBeUI7dUVBQXpCLHlCQUF5QixXQUF6Qix5QkFBeUIsbUJBRFosTUFBTTs7aUZBQ25CLHlCQUF5QjtjQURyQyxVQUFVO2VBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIEBtb2R1bGUgYXV0aG9yaXphdGlvblxuICovXG5cbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEVNUFRZLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgY2F0Y2hFcnJvcixcbiAgbWFwLFxuICBzaGFyZVJlcGxheSxcbiAgc3dpdGNoTWFwLFxuICB0YXAsXG4gIHRpbWVyLFxuICBmcm9tRXZlbnQsXG4gIG1lcmdlLFxuICB0aW1lb3V0LFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtcbiAgcHVibGlzaFJlZixcbiAgZ2V0R2xvYmFsRW52aXJvbm1lbnRzLFxuICBUUlVFLFxuICBza2lwRXJyb3IsXG4gIGNhdGNoUHJvbWlzZSxcbn0gZnJvbSAnLi4vY29yZS9wdWJsaWMtYXBpJztcbmltcG9ydCB7IEFjY291bnRJbmZvIH0gZnJvbSAnLi4vcGFnZS1zY2FmZm9sZC9wdWJsaWMtYXBpJztcblxuaW1wb3J0IHtcbiAgYXR0YWNoQXV0aG9yaXphdGlvbkhlYWRlcixcbiAgZ2V0QXV0aG9yaXphdGlvblN0YXRlLFxuICBsb2dvdXQsXG4gIGxvZ291dEF1ZGl0LFxuICBUb2tlblJlc3BvbnNlLFxufSBmcm9tICcuL2F1dGhvcml6YXRpb24nO1xuaW1wb3J0IHsgVE9LRU5fSU5GT19BUEksIExPQURJTkdfQ0FDSEUsIFRPS0VOX1JFRlJFU0hfQVBJIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgSEVBUlRCRUFUX1BPTExJTkcgfSBmcm9tICcuL3Nlc3Npb24tbWFuYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgcmVhZFN0b3JhZ2VBbGl2ZVJlY29yZCxcbiAgcmVhZFN0b3JhZ2VUb2tlbixcbiAgcmVmcmVzaFN0b3JhZ2VBbGl2ZVJlY29yZCxcbiAgd3JpdGVTdG9yYWdlVG9rZW4sXG59IGZyb20gJy4vc3RvcmFnZS10b2tlbic7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQXV0aG9yaXphdGlvblN0YXRlU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaHR0cCA9IGluamVjdChIdHRwQ2xpZW50KTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlJCA9IHRoaXMuaHR0cFxuICAgIC5nZXQ8QWNjb3VudEluZm8+KFRPS0VOX0lORk9fQVBJLCB7XG4gICAgICBoZWFkZXJzOiBhdHRhY2hBdXRob3JpemF0aW9uSGVhZGVyKCksXG4gICAgfSlcbiAgICAucGlwZShcbiAgICAgIHNraXBFcnJvcihudWxsKSxcbiAgICAgIHRhcChpbmZvID0+IHtcbiAgICAgICAgaWYgKCFpbmZvKSB7XG4gICAgICAgICAgbG9nb3V0KHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYXlsb2FkU25hcHNob3QgPSBpbmZvO1xuICAgICAgfSksXG4gICAgICBtYXAoaW5mbyA9PiAoe1xuICAgICAgICAuLi5nZXRBdXRob3JpemF0aW9uU3RhdGUoKSxcbiAgICAgICAgaW5mbyxcbiAgICAgIH0pKSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpLFxuICAgICk7XG5cbiAgcHJpdmF0ZSBjaGVja1Rva2VuQ2FjaGUkOiBPYnNlcnZhYmxlPHVua25vd24+ID0gbnVsbDtcbiAgcHJpdmF0ZSByZWZyZXNoVG9rZW5DYWNoZSQ6IE9ic2VydmFibGU8VG9rZW5SZXNwb25zZT47XG5cbiAgcGF5bG9hZFNuYXBzaG90OiBBY2NvdW50SW5mbztcblxuICBsb2dvdXQgPSBsb2dvdXQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKGdldEdsb2JhbEVudmlyb25tZW50cygnQ0xPU0VfQlJPV1NFUl9FTkRfU0VTU0lPTicpID09PSBUUlVFKSB7XG4gICAgICB0aGlzLnN0YXRlJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoc3RhdGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWxpdmVSZWNvcmQgPSByZWFkU3RvcmFnZUFsaXZlUmVjb3JkKCk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICFhbGl2ZVJlY29yZCB8fFxuICAgICAgICAgICAgICBEYXRlLm5vdygpIC0gYWxpdmVSZWNvcmQgPiBIRUFSVEJFQVRfUE9MTElORyArIExPQURJTkdfQ0FDSEVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aGlzLmxvZ291dFdpdGhBdWRpdCgpO1xuICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb2Yoc3RhdGUpO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2UoXG4gICAgICAgICAgICAgIHRpbWVyKDAsIEhFQVJUQkVBVF9QT0xMSU5HKSxcbiAgICAgICAgICAgICAgZnJvbUV2ZW50KHdpbmRvdywgJ2JlZm9yZXVubG9hZCcpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHJlZnJlc2hTdG9yYWdlQWxpdmVSZWNvcmQpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ291dFdpdGhBdWRpdCgpIHtcbiAgICBjYXRjaFByb21pc2UobG9nb3V0QXVkaXQoKSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0aW1lb3V0KDEwMDApLFxuICAgICAgICBtYXAocmVzID0+IHJlcz8ubG9nb3V0X3JlZGlyZWN0X3VybCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHJlZGlyZWN0VXJsID0+IGxvZ291dChyZWRpcmVjdFVybCkpO1xuICB9XG5cbiAgcmVmcmVzaFRva2VuKCkge1xuICAgIGlmICh0aGlzLnJlZnJlc2hUb2tlbkNhY2hlJCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFRva2VuQ2FjaGUkO1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaFRva2VuQ2FjaGUkID0gdGhpcy5odHRwXG4gICAgICAuZ2V0PFRva2VuUmVzcG9uc2U+KFRPS0VOX1JFRlJFU0hfQVBJKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoeyBpZF90b2tlbjogaWRUb2tlbiB9KSA9PiB7XG4gICAgICAgICAgd3JpdGVTdG9yYWdlVG9rZW4oaWRUb2tlbik7XG4gICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW5DYWNoZSQgPSBudWxsO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgICAgbG9nb3V0KHRydWUpO1xuICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgfSksXG4gICAgICAgIHB1Ymxpc2hSZWYoKSxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5yZWZyZXNoVG9rZW5DYWNoZSQ7XG4gIH1cblxuICBjaGVja1Rva2VuKCkge1xuICAgIGlmICghdGhpcy5jaGVja1Rva2VuQ2FjaGUkKSB7XG4gICAgICB0aGlzLmNoZWNrVG9rZW5DYWNoZSQgPSB0aGlzLmh0dHAuZ2V0KFRPS0VOX0lORk9fQVBJKS5waXBlKFxuICAgICAgICB0YXAoe1xuICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tUb2tlbkNhY2hlJCA9IG51bGw7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGVja1Rva2VuQ2FjaGUkID0gbnVsbDtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICAgcHVibGlzaFJlZigpLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tUb2tlbkNhY2hlJDtcbiAgfVxuXG4gIGdldFRva2VuUGF5bG9hZDxUPigpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSQucGlwZShtYXAoc3RhdGUgPT4gc3RhdGUuaW5mbyBhcyBUKSk7XG4gIH1cblxuICBnZXRBY2NvdW50SW5mbygpIHtcbiAgICBpZiAodGhpcy5wYXlsb2FkU25hcHNob3QpIHtcbiAgICAgIHJldHVybiBvZih0aGlzLnBheWxvYWRTbmFwc2hvdCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlJC5waXBlKG1hcChzdGF0ZSA9PiBzdGF0ZS5pbmZvIHx8IHt9KSk7XG4gIH1cblxuICBnZXRUb2tlbkJ5U3RvcmFnZSgpIHtcbiAgICByZXR1cm4gcmVhZFN0b3JhZ2VUb2tlbigpO1xuICB9XG59XG4iXX0=