@asi-ngtools/lib
Version:
This project is a little components library, simple to use, which will help you to simplify your project.
114 lines (113 loc) • 10.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { throwError, Subject } from 'rxjs';
import { tap, catchError, switchMap, first } from 'rxjs/operators';
/**
* @abstract
*/
export class AsiRefreshTokenInceptor {
constructor() {
this.refreshingToken = false;
this.refreshTokenSubject = new Subject();
this.refreshTokenUrl = this.getRefreshTokenUrl();
this.loginUrl = this.getLoginUrl();
}
/**
* @param {?} req
* @param {?} next
* @return {?}
*/
intercept(req, next) {
req = this.addAuthenticationToken(req, false);
return next.handle(req).pipe(tap(evt => {
this.onRequestSuccess(evt);
}), catchError((err) => {
// Not a 401 or fail on login page
// tslint:disable-next-line:triple-equals
if ((err.status != AsiRefreshTokenInceptor.UNAUTHORIZED && !req.url.includes(this.refreshTokenUrl))
|| req.url.includes(this.loginUrl)) {
return throwError(err);
}
// Fail to refresh the token, go to login page
if (req.url.includes(this.refreshTokenUrl)) {
this.refreshingToken = false;
this.goToLoginPage(req, err);
return throwError(err);
}
if (this.refreshingToken) {
// refresh token is in progress, we subscribe to the unlocking event
return this.refreshTokenSubject.pipe(first(), switchMap(() => {
return next.handle(this.addAuthenticationToken(req, true));
}));
}
else {
this.refreshingToken = true;
// get and save the refresh token and unlock requests
return this.callAndSaveRefreshToken().pipe(first(), switchMap((token) => {
this.refreshingToken = false;
this.refreshTokenSubject.next(token);
return next.handle(this.addAuthenticationToken(req, true));
}), catchError((error) => {
this.refreshingToken = false;
this.goToLoginPage(req, error);
return throwError(error);
}));
}
}));
}
/**
* @param {?} _event
* @return {?}
*/
onRequestSuccess(_event) { }
}
AsiRefreshTokenInceptor.UNAUTHORIZED = 401;
if (false) {
/** @type {?} */
AsiRefreshTokenInceptor.UNAUTHORIZED;
/** @type {?} */
AsiRefreshTokenInceptor.prototype.refreshingToken;
/** @type {?} */
AsiRefreshTokenInceptor.prototype.loginUrl;
/** @type {?} */
AsiRefreshTokenInceptor.prototype.refreshTokenUrl;
/** @type {?} */
AsiRefreshTokenInceptor.prototype.refreshTokenSubject;
/**
* Add auth token to the request header
* @abstract
* @param {?} req the request
* @param {?} replay is the token replayed
* @return {?}
*/
AsiRefreshTokenInceptor.prototype.addAuthenticationToken = function (req, replay) { };
/**
* Get the refresh token endpoint url
* @abstract
* @return {?}
*/
AsiRefreshTokenInceptor.prototype.getRefreshTokenUrl = function () { };
/**
* Call the refresh token endpoint and save the new token
* @abstract
* @return {?}
*/
AsiRefreshTokenInceptor.prototype.callAndSaveRefreshToken = function () { };
/**
* Get the login endpoint url
* @abstract
* @return {?}
*/
AsiRefreshTokenInceptor.prototype.getLoginUrl = function () { };
/**
* Change the current page to the login page
* @abstract
* @param {?} req the request
* @param {?} err the err
* @return {?}
*/
AsiRefreshTokenInceptor.prototype.goToLoginPage = function (req, err) { };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLXJlZnJlc2h0b2tlbi5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bhc2ktbmd0b29scy9saWIvIiwic291cmNlcyI6WyJsaWIvaW50ZXJjZXB0b3JzL2FzaS1yZWZyZXNodG9rZW4uaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUNBLE9BQU8sRUFBYyxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQUVuRSxNQUFNO0lBVUo7K0JBUDBCLEtBQUs7bUNBS0QsSUFBSSxPQUFPLEVBQU87UUFHOUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztLQUNwQzs7Ozs7O0lBRUQsU0FBUyxDQUFDLEdBQXFCLEVBQUUsSUFBaUI7UUFDaEQsR0FBRyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFOUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDNUIsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFOzs7WUFJckIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLHVCQUF1QixDQUFDLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQzttQkFDOUYsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN4Qjs7WUFHRCxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztnQkFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQzdCLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDeEI7WUFFRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQzs7Z0JBRXpCLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUU7b0JBQzNELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztpQkFDNUQsQ0FBQyxDQUFDLENBQUM7YUFDTDtZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNOLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDOztnQkFFNUIsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtvQkFDM0UsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7b0JBQzdCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztpQkFDNUQsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUN2QixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztvQkFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUE7b0JBQzlCLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzFCLENBQUMsQ0FBQyxDQUFDO2FBQ0w7U0FDRixDQUFDLENBQUMsQ0FBQztLQUNMOzs7OztJQUVELGdCQUFnQixDQUFDLE1BQXNCLEtBQVc7O3VDQXZEWCxHQUFHIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEludGVyY2VwdG9yLCBIdHRwUmVxdWVzdCwgSHR0cEhhbmRsZXIsIEh0dHBFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRhcCwgY2F0Y2hFcnJvciwgc3dpdGNoTWFwLCBmaXJzdCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFzaVJlZnJlc2hUb2tlbkluY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBVTkFVVEhPUklaRUQgPSA0MDE7XG4gIHByaXZhdGUgcmVmcmVzaGluZ1Rva2VuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBsb2dpblVybDtcbiAgcHJpdmF0ZSByZWZyZXNoVG9rZW5Vcmw7XG5cbiAgcHJpdmF0ZSByZWZyZXNoVG9rZW5TdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucmVmcmVzaFRva2VuVXJsID0gdGhpcy5nZXRSZWZyZXNoVG9rZW5VcmwoKTtcbiAgICB0aGlzLmxvZ2luVXJsID0gdGhpcy5nZXRMb2dpblVybCgpO1xuICB9XG5cbiAgaW50ZXJjZXB0KHJlcTogSHR0cFJlcXVlc3Q8YW55PiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJlcSA9IHRoaXMuYWRkQXV0aGVudGljYXRpb25Ub2tlbihyZXEsIGZhbHNlKTtcblxuICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXEpLnBpcGUodGFwKGV2dCA9PiB7XG4gICAgICB0aGlzLm9uUmVxdWVzdFN1Y2Nlc3MoZXZ0KTtcbiAgICB9KSwgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG5cbiAgICAgIC8vIE5vdCBhIDQwMSBvciBmYWlsIG9uIGxvZ2luIHBhZ2VcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG4gICAgICBpZiAoKGVyci5zdGF0dXMgIT0gQXNpUmVmcmVzaFRva2VuSW5jZXB0b3IuVU5BVVRIT1JJWkVEICYmICFyZXEudXJsLmluY2x1ZGVzKHRoaXMucmVmcmVzaFRva2VuVXJsKSlcbiAgICAgICAgfHwgcmVxLnVybC5pbmNsdWRlcyh0aGlzLmxvZ2luVXJsKSkge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnIpO1xuICAgICAgfVxuXG4gICAgICAvLyBGYWlsIHRvIHJlZnJlc2ggdGhlIHRva2VuLCBnbyB0byBsb2dpbiBwYWdlXG4gICAgICBpZiAocmVxLnVybC5pbmNsdWRlcyh0aGlzLnJlZnJlc2hUb2tlblVybCkpIHtcbiAgICAgICAgdGhpcy5yZWZyZXNoaW5nVG9rZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5nb1RvTG9naW5QYWdlKHJlcSwgZXJyKTtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucmVmcmVzaGluZ1Rva2VuKSB7XG4gICAgICAgIC8vIHJlZnJlc2ggdG9rZW4gaXMgaW4gcHJvZ3Jlc3MsIHdlIHN1YnNjcmliZSB0byB0aGUgdW5sb2NraW5nIGV2ZW50XG4gICAgICAgIHJldHVybiB0aGlzLnJlZnJlc2hUb2tlblN1YmplY3QucGlwZShmaXJzdCgpLCBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBuZXh0LmhhbmRsZSh0aGlzLmFkZEF1dGhlbnRpY2F0aW9uVG9rZW4ocmVxLCB0cnVlKSk7XG4gICAgICAgIH0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVmcmVzaGluZ1Rva2VuID0gdHJ1ZTtcbiAgICAgICAgLy8gZ2V0IGFuZCBzYXZlIHRoZSByZWZyZXNoIHRva2VuIGFuZCB1bmxvY2sgcmVxdWVzdHNcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbEFuZFNhdmVSZWZyZXNoVG9rZW4oKS5waXBlKGZpcnN0KCksIHN3aXRjaE1hcCgodG9rZW46IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMucmVmcmVzaGluZ1Rva2VuID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW5TdWJqZWN0Lm5leHQodG9rZW4pO1xuICAgICAgICAgIHJldHVybiBuZXh0LmhhbmRsZSh0aGlzLmFkZEF1dGhlbnRpY2F0aW9uVG9rZW4ocmVxLCB0cnVlKSk7XG4gICAgICAgIH0pLCBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICAgIHRoaXMucmVmcmVzaGluZ1Rva2VuID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5nb1RvTG9naW5QYWdlKHJlcSwgZXJyb3IpXG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyb3IpO1xuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSkpO1xuICB9XG5cbiAgb25SZXF1ZXN0U3VjY2VzcyhfZXZlbnQ6IEh0dHBFdmVudDxhbnk+KTogdm9pZCB7IH1cblxuICAvKipcbiAgICogIEFkZCBhdXRoIHRva2VuIHRvIHRoZSByZXF1ZXN0IGhlYWRlclxuICAgKiBAcGFyYW0gcmVxICB0aGUgcmVxdWVzdFxuICAgKiBAcGFyYW0gcmVwbGF5IGlzIHRoZSB0b2tlbiByZXBsYXllZFxuICAgKi9cbiAgYWJzdHJhY3QgYWRkQXV0aGVudGljYXRpb25Ub2tlbihyZXE6IEh0dHBSZXF1ZXN0PGFueT4sIHJlcGxheTogYm9vbGVhbik6IEh0dHBSZXF1ZXN0PGFueT47XG5cbiAgLyoqXG4gICAqICBHZXQgdGhlIHJlZnJlc2ggdG9rZW4gZW5kcG9pbnQgdXJsXG4gICAqL1xuICBhYnN0cmFjdCBnZXRSZWZyZXNoVG9rZW5VcmwoKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiAgQ2FsbCB0aGUgcmVmcmVzaCB0b2tlbiBlbmRwb2ludCBhbmQgc2F2ZSB0aGUgbmV3IHRva2VuXG4gICAqL1xuICBhYnN0cmFjdCBjYWxsQW5kU2F2ZVJlZnJlc2hUb2tlbigpOiBPYnNlcnZhYmxlPGFueT47XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbG9naW4gZW5kcG9pbnQgdXJsXG4gICAqL1xuICBhYnN0cmFjdCBnZXRMb2dpblVybCgpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgY3VycmVudCBwYWdlIHRvIHRoZSBsb2dpbiBwYWdlXG4gICAqIEBwYXJhbSByZXEgdGhlIHJlcXVlc3RcbiAgICogQHBhcmFtIGVyciAgdGhlIGVyclxuICAgKi9cbiAgYWJzdHJhY3QgZ29Ub0xvZ2luUGFnZShyZXE6IEh0dHBSZXF1ZXN0PGFueT4sIGVycjogYW55KTogdm9pZDtcbn1cbiJdfQ==