@cause-911/core
Version:
Run `npm install @cause-911/core --save` to add this library to your project
182 lines • 16.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable } from '@angular/core';
import { HttpBackend, HttpClient } from '@angular/common/http';
import { of, throwError } from 'rxjs';
import { catchError, map, switchMap } from 'rxjs/operators';
import { CoreService } from '../../core.service';
export class HttpTokenWriterInterceptor {
/**
* @param {?} coreService
* @param {?} handler
*/
constructor(coreService, handler) {
this.http = new HttpClient(handler);
this.config = coreService.getConfig();
}
/**
* @param {?} request
* @param {?} next
* @return {?}
*/
intercept(request, next) {
this.requestOriginal = request;
request = request.clone({
headers: this.addSettings(),
});
return next.handle(request).pipe(catchError((/**
* @param {?} error
* @return {?}
*/
error => {
return this.checkIfWeCanManageError(error).pipe(switchMap((/**
* @param {?} handleRequest
* @return {?}
*/
handleRequest => {
request = handleRequest.clone({
headers: this.addSettings(),
});
return next.handle(request);
})), catchError((/**
* @param {?} unhandleError
* @return {?}
*/
unhandleError => {
return throwError(unhandleError);
})));
})));
}
/**
* @private
* @return {?}
*/
addSettings() {
/** @type {?} */
let headers = this.requestOriginal.headers;
/** @type {?} */
const isFormData = this.requestOriginal.body instanceof FormData;
if (!headers.has('Authorization') && this.config.accessToken) {
headers = headers.set('Authorization', `${this.config.authorizationType} ${this.config.accessToken}`);
}
if (!headers.has('X-CSRF-Token') && this.config.CSRFToken) {
headers = headers.set('X-CSRF-Token', `${this.config.CSRFToken}`);
}
if (!headers.has('Content-Type') && !isFormData) {
headers = headers.set('Content-Type', `application/json; charset=${this.config.charset}`);
}
if (!headers.has('Language-Code')) {
headers = headers.set('Language-Code', this.config.locale);
}
return headers;
}
/**
* @private
* @param {?} error
* @return {?}
*/
checkIfWeCanManageError(error) {
if (error.status === 401 && this.config.accessToken && this.config.allowRefreshToken) {
return this.checkRefreshToken().pipe(map((/**
* @param {?} response
* @return {?}
*/
response => {
if (!response) {
location.href = this.config.loginURL;
}
return this.requestOriginal;
})));
}
else if (error.status === 401 && this.config.accessToken) {
location.href = this.config.loginURL;
}
else if (error.status === 200) {
if (error.message && error.message.indexOf('Http failure during parsing for') === 0) {
return of(this.resendAsHTML());
}
}
return throwError(error);
}
/**
* @private
* @return {?}
*/
checkRefreshToken() {
return this.postRefreshToken().pipe(map((/**
* @param {?} data
* @return {?}
*/
data => {
this.config.accessToken = data.accessToken || '';
return data.accessToken ? true : false;
})), catchError((/**
* @param {?} error
* @return {?}
*/
error => {
this.config.accessToken = '';
return of(false);
})));
}
/**
* @private
* @return {?}
*/
postRefreshToken() {
/** @type {?} */
const host = this.config.refreshLoginURL;
/** @type {?} */
let refreshUrl = host;
if (!refreshUrl) {
refreshUrl = `/api/Authentification/Refresh`;
}
/** @type {?} */
const token = (/** @type {?} */ ({
accessToken: this.config.accessToken,
refreshToken: this.config.refreshToken,
}));
return this.http.post(refreshUrl, token);
}
/**
* @private
* @return {?}
*/
resendAsHTML() {
/** @type {?} */
let headers = this.requestOriginal.headers;
headers = headers.set('Content-Type', `text/html; charset=${this.config.charset}`);
return this.requestOriginal.clone({
responseType: 'text',
headers: headers,
});
}
}
HttpTokenWriterInterceptor.decorators = [
{ type: Injectable }
];
/** @nocollapse */
HttpTokenWriterInterceptor.ctorParameters = () => [
{ type: CoreService },
{ type: HttpBackend }
];
if (false) {
/**
* @type {?}
* @private
*/
HttpTokenWriterInterceptor.prototype.http;
/**
* @type {?}
* @private
*/
HttpTokenWriterInterceptor.prototype.config;
/**
* @type {?}
* @private
*/
HttpTokenWriterInterceptor.prototype.requestOriginal;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC10b2tlbi13cml0ZXItaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY2F1c2UtOTExL2NvcmUvIiwic291cmNlcyI6WyJsaWIvc2hhcmVkL2ludGVyY2VwdG9yL2h0dHAtdG9rZW4td3JpdGVyLWludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxXQUFXLEVBQUUsVUFBVSxFQUFzQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xHLE9BQU8sRUFBYSxFQUFFLEVBQUUsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTFELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUkvQyxNQUFNLE9BQU8sMEJBQTBCOzs7OztJQUtuQyxZQUNJLFdBQXdCLEVBQ3hCLE9BQW9CO1FBRXBCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDMUMsQ0FBQzs7Ozs7O0lBRU0sU0FBUyxDQUNaLE9BQXlCLEVBQ3pCLElBQWlCO1FBRWpCLElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDO1FBQy9CLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFO1NBQzlCLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQzVCLFVBQVU7Ozs7UUFBQyxLQUFLLENBQUMsRUFBRTtZQUNmLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FB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QUFjLEVBQUUsc0JBQXNCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUVuRixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO1lBQzlCLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRSxPQUFPO1NBQ25CLENBQUMsQ0FBQztJQUNQLENBQUM7OztZQXJISixVQUFVOzs7O1lBSEgsV0FBVztZQUpYLFdBQVc7Ozs7Ozs7SUFTZiwwQ0FBeUI7Ozs7O0lBQ3pCLDRDQUE4Qjs7Ozs7SUFDOUIscURBQTBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7SHR0cEJhY2tlbmQsIEh0dHBDbGllbnQsIEh0dHBFdmVudCwgSHR0cEhhbmRsZXIsIEh0dHBSZXF1ZXN0fSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge09ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yfSBmcm9tICdyeGpzJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgbWFwLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7Q29uZmlndXJhdGlvbn0gZnJvbSAnLi4vY2xhc3Nlcy9jb25maWd1cmF0aW9uJztcbmltcG9ydCB7Q29yZVNlcnZpY2V9IGZyb20gJy4uLy4uL2NvcmUuc2VydmljZSc7XG5pbXBvcnQge1JlZnJlc2hUb2tlbn0gZnJvbSAnLi4vbW9kZWxzL3JlZnJlc2gtdG9rZW4nO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSHR0cFRva2VuV3JpdGVySW50ZXJjZXB0b3Ige1xuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudDtcbiAgICBwcml2YXRlIGNvbmZpZzogQ29uZmlndXJhdGlvbjtcbiAgICBwcml2YXRlIHJlcXVlc3RPcmlnaW5hbDogSHR0cFJlcXVlc3Q8YW55PjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBjb3JlU2VydmljZTogQ29yZVNlcnZpY2UsXG4gICAgICAgIGhhbmRsZXI6IEh0dHBCYWNrZW5kLFxuICAgICkge1xuICAgICAgICB0aGlzLmh0dHAgPSBuZXcgSHR0cENsaWVudChoYW5kbGVyKTtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb3JlU2VydmljZS5nZXRDb25maWcoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW50ZXJjZXB0KFxuICAgICAgICByZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+LFxuICAgICAgICBuZXh0OiBIdHRwSGFuZGxlcixcbiAgICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XG4gICAgICAgIHRoaXMucmVxdWVzdE9yaWdpbmFsID0gcmVxdWVzdDtcbiAgICAgICAgcmVxdWVzdCA9IHJlcXVlc3QuY2xvbmUoe1xuICAgICAgICAgICAgaGVhZGVyczogdGhpcy5hZGRTZXR0aW5ncygpLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxdWVzdCkucGlwZShcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoZWNrSWZXZUNhbk1hbmFnZUVycm9yKGVycm9yKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoaGFuZGxlUmVxdWVzdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gaGFuZGxlUmVxdWVzdC5jbG9uZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5hZGRTZXR0aW5ncygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXF1ZXN0KTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IodW5oYW5kbGVFcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcih1bmhhbmRsZUVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZFNldHRpbmdzKCkge1xuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMucmVxdWVzdE9yaWdpbmFsLmhlYWRlcnM7XG4gICAgICAgIGNvbnN0IGlzRm9ybURhdGEgPSB0aGlzLnJlcXVlc3RPcmlnaW5hbC5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGE7XG5cbiAgICAgICAgaWYgKCFoZWFkZXJzLmhhcygnQXV0aG9yaXphdGlvbicpICYmIHRoaXMuY29uZmlnLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCBgJHt0aGlzLmNvbmZpZy5hdXRob3JpemF0aW9uVHlwZX0gJHt0aGlzLmNvbmZpZy5hY2Nlc3NUb2tlbn1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWhlYWRlcnMuaGFzKCdYLUNTUkYtVG9rZW4nKSAmJiB0aGlzLmNvbmZpZy5DU1JGVG9rZW4pIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnWC1DU1JGLVRva2VuJywgYCR7dGhpcy5jb25maWcuQ1NSRlRva2VufWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaGVhZGVycy5oYXMoJ0NvbnRlbnQtVHlwZScpICYmICFpc0Zvcm1EYXRhKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGBhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PSR7dGhpcy5jb25maWcuY2hhcnNldH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWhlYWRlcnMuaGFzKCdMYW5ndWFnZS1Db2RlJykpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnTGFuZ3VhZ2UtQ29kZScsIHRoaXMuY29uZmlnLmxvY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlYWRlcnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja0lmV2VDYW5NYW5hZ2VFcnJvcihlcnJvcik6IE9ic2VydmFibGU8SHR0cFJlcXVlc3Q8YW55Pj4ge1xuICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MDEgJiYgdGhpcy5jb25maWcuYWNjZXNzVG9rZW4gJiYgdGhpcy5jb25maWcuYWxsb3dSZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoZWNrUmVmcmVzaFRva2VuKCkucGlwZShcbiAgICAgICAgICAgICAgICBtYXAocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gdGhpcy5jb25maWcubG9naW5VUkw7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0T3JpZ2luYWw7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MDEgJiYgdGhpcy5jb25maWcuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSB0aGlzLmNvbmZpZy5sb2dpblVSTDtcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvci5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UgJiYgZXJyb3IubWVzc2FnZS5pbmRleE9mKCdIdHRwIGZhaWx1cmUgZHVyaW5nIHBhcnNpbmcgZm9yJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YodGhpcy5yZXNlbmRBc0hUTUwoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja1JlZnJlc2hUb2tlbigpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFJlZnJlc2hUb2tlbigpLnBpcGUoXG4gICAgICAgICAgICBtYXAoZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuYWNjZXNzVG9rZW4gPSBkYXRhLmFjY2Vzc1Rva2VuIHx8ICcnO1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLmFjY2Vzc1Rva2VuID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5hY2Nlc3NUb2tlbiA9ICcnO1xuICAgICAgICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgcG9zdFJlZnJlc2hUb2tlbigpOiBPYnNlcnZhYmxlPFJlZnJlc2hUb2tlbj4ge1xuICAgICAgICBjb25zdCBob3N0ID0gdGhpcy5jb25maWcucmVmcmVzaExvZ2luVVJMO1xuICAgICAgICBsZXQgcmVmcmVzaFVybCA9IGhvc3Q7XG4gICAgICAgIGlmICghcmVmcmVzaFVybCkge1xuICAgICAgICAgICAgcmVmcmVzaFVybCA9IGAvYXBpL0F1dGhlbnRpZmljYXRpb24vUmVmcmVzaGA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9rZW4gPSB7XG4gICAgICAgICAgICBhY2Nlc3NUb2tlbjogdGhpcy5jb25maWcuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgICByZWZyZXNoVG9rZW46IHRoaXMuY29uZmlnLnJlZnJlc2hUb2tlbixcbiAgICAgICAgfSBhcyBSZWZyZXNoVG9rZW47XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFJlZnJlc2hUb2tlbj4ocmVmcmVzaFVybCwgdG9rZW4pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZW5kQXNIVE1MKCkge1xuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMucmVxdWVzdE9yaWdpbmFsLmhlYWRlcnM7XG4gICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgYHRleHQvaHRtbDsgY2hhcnNldD0ke3RoaXMuY29uZmlnLmNoYXJzZXR9YCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdE9yaWdpbmFsLmNsb25lKHtcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19