@isaiahiroko/ng-interceptors
Version:
Angular interceptors for token authorization, local and remote store synchronization and global notification
135 lines (134 loc) • 10.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Injectable } from '@angular/core';
import { finalize, retryWhen, zip, mergeMap, catchError } from 'rxjs/operators';
import { range, timer, throwError } from 'rxjs';
var LoaderServiceContract = /** @class */ (function () {
function LoaderServiceContract() {
}
/**
* @param {?=} type
* @return {?}
*/
LoaderServiceContract.prototype.start = /**
* @param {?=} type
* @return {?}
*/
function (type) { };
/**
* @return {?}
*/
LoaderServiceContract.prototype.stop = /**
* @return {?}
*/
function () { };
/**
* @param {?} message
* @param {?=} title
* @return {?}
*/
LoaderServiceContract.prototype.notify = /**
* @param {?} message
* @param {?=} title
* @return {?}
*/
function (message, title) { };
/**
* @param {?} message
* @param {?=} title
* @return {?}
*/
LoaderServiceContract.prototype.toast = /**
* @param {?} message
* @param {?=} title
* @return {?}
*/
function (message, title) { };
return LoaderServiceContract;
}());
export { LoaderServiceContract };
var NotifInterceptor = /** @class */ (function () {
function NotifInterceptor(notif) {
this.notif = notif;
}
/**
* @param {?} req
* @param {?} next
* @return {?}
*/
NotifInterceptor.prototype.intercept = /**
* @param {?} req
* @param {?} next
* @return {?}
*/
function (req, next) {
var _this = this;
this.notif.start();
// extend server response observable with logging
return next.handle(req).pipe(
// things don't always work as planned
// if things go wrong, try again three times
// however, delay trial in an incremental manner (multipl of 1 second)
retryWhen(function (attempts) {
return attempts.pipe(zip(range(1, 4)), mergeMap(function (_a) {
var _b = tslib_1.__read(_a, 2), error = _b[0], i = _b[1];
_this.notif.start('query');
if (i > 2) {
return throwError(error);
}
return timer(i * 1000);
}));
}),
// catchError http errors and turn to observable of undefined
catchError(function (e) {
/** @type {?} */
var title;
/** @type {?} */
var message;
_this.notif.start('buffer');
if (e.error instanceof ErrorEvent) {
// A client-side or network error occurred. Handle it accordingly.
title = 'Client Error';
message = e.error.message;
}
else {
// The backend returned an unsuccessful response code.
// The response body may contain clues as to what went wrong,
title = 'Network Info';
message = e.statusText + " (" + e.status + ")";
// message = e.message
}
if (e.status === 401) {
// this.notif.notify('The username/password is wrong', 'Unauthorized')
}
else {
// this.notif.toast(message, title)
}
console.error({ title: title, message: message });
// catche //re throw
// throw {title, message}
// return of({ e: {title, message} })
// return empty()
return throwError({ title: title, message: message });
}), finalize(function () {
_this.notif.stop();
}));
};
NotifInterceptor.decorators = [
{ type: Injectable },
];
/** @nocollapse */
NotifInterceptor.ctorParameters = function () { return [
{ type: LoaderServiceContract }
]; };
return NotifInterceptor;
}());
export { NotifInterceptor };
if (false) {
/** @type {?} */
NotifInterceptor.prototype.notif;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWYuaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaXNhaWFoaXJva28vbmctaW50ZXJjZXB0b3JzLyIsInNvdXJjZXMiOlsibGliL25vdGlmLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUcxQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQy9FLE9BQU8sRUFBRSxLQUFLLEVBQUcsS0FBSyxFQUFHLFVBQVUsRUFBYyxNQUFNLE1BQU0sQ0FBQTtBQUU3RCxJQUFBOzs7Ozs7O0lBQ0UscUNBQUs7Ozs7SUFBTCxVQUFPLElBQWEsS0FBSTs7OztJQUN4QixvQ0FBSTs7O0lBQUosZUFBVTs7Ozs7O0lBQ1Ysc0NBQU07Ozs7O0lBQU4sVUFBUSxPQUFlLEVBQUUsS0FBYyxLQUFJOzs7Ozs7SUFDM0MscUNBQUs7Ozs7O0lBQUwsVUFBTyxPQUFlLEVBQUUsS0FBYyxLQUFJO2dDQVY1QztJQVdDLENBQUE7QUFMRCxpQ0FLQzs7SUFJQywwQkFDVTtRQUFBLFVBQUssR0FBTCxLQUFLO0tBQ1g7Ozs7OztJQUVKLG9DQUFTOzs7OztJQUFULFVBQVcsR0FBcUIsRUFBRSxJQUFpQjtRQUFuRCxpQkEwREM7UUF6REMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQTs7UUFHbEIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSTs7OztRQUkxQixTQUFTLENBQUMsVUFBQyxRQUFRO1lBQ2pCLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUNsQixHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUNoQixRQUFRLENBQUMsVUFBQyxFQUFVO29CQUFWLDBCQUFVLEVBQVQsYUFBSyxFQUFFLFNBQUM7Z0JBQ2pCLEtBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUN6QixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDVixNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFBO2lCQUN6QjtnQkFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQTthQUN2QixDQUFDLENBQ0gsQ0FBQTtTQUNGLENBQUM7O1FBR0YsVUFBVSxDQUFDLFVBQUMsQ0FBQzs7WUFDWCxJQUFJLEtBQUssQ0FBUzs7WUFBbEIsSUFBVyxPQUFPLENBQUE7WUFFbEIsS0FBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7WUFFMUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssWUFBWSxVQUFVLENBQUMsQ0FBQyxDQUFDOztnQkFFbEMsS0FBSyxHQUFHLGNBQWMsQ0FBQTtnQkFDdEIsT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFBO2FBQzFCO1lBQUMsSUFBSSxDQUFDLENBQUM7OztnQkFHTixLQUFLLEdBQUcsY0FBYyxDQUFBO2dCQUN0QixPQUFPLEdBQU0sQ0FBQyxDQUFDLFVBQVUsVUFBSyxDQUFDLENBQUMsTUFBTSxNQUFHLENBQUE7O2FBRTFDO1lBRUQsRUFBRSxDQUFBLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQSxDQUFDOzthQUVwQjtZQUNELElBQUksQ0FBQSxDQUFDOzthQUVKO1lBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssT0FBQSxFQUFFLE9BQU8sU0FBQSxFQUFFLENBQUMsQ0FBQzs7Ozs7WUFNbEMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssT0FBQSxFQUFFLE9BQU8sU0FBQSxFQUFDLENBQUMsQ0FBQTtTQUNyQyxDQUFDLEVBQ0YsUUFBUSxDQUFDO1lBQ1AsS0FBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQTtTQUNsQixDQUFDLENBQ0gsQ0FBQTtLQUNGOztnQkFoRUYsVUFBVTs7OztnQkFHUSxxQkFBcUI7OzJCQWhCeEM7O1NBY2EsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCB7IEh0dHBSZXF1ZXN0LCBIdHRwSGFuZGxlciwgSHR0cEludGVyY2VwdG9yLCBIdHRwRXZlbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCdcclxuXHJcbmltcG9ydCB7IGZpbmFsaXplLCByZXRyeVdoZW4sIHppcCwgbWVyZ2VNYXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcclxuaW1wb3J0IHsgcmFuZ2UsICB0aW1lciwgIHRocm93RXJyb3IsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJ1xyXG5cclxuZXhwb3J0IGNsYXNzIExvYWRlclNlcnZpY2VDb250cmFjdCB7XHJcbiAgc3RhcnQgKHR5cGU/OiBzdHJpbmcpIHt9XHJcbiAgc3RvcCAoKSB7fVxyXG4gIG5vdGlmeSAobWVzc2FnZTogc3RyaW5nLCB0aXRsZT86IHN0cmluZykge31cclxuICB0b2FzdCAobWVzc2FnZTogc3RyaW5nLCB0aXRsZT86IHN0cmluZykge31cclxufVxyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTm90aWZJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XHJcbiAgY29uc3RydWN0b3IgKFxyXG4gICAgcHJpdmF0ZSBub3RpZjogTG9hZGVyU2VydmljZUNvbnRyYWN0LFxyXG4gICkge31cclxuXHJcbiAgaW50ZXJjZXB0IChyZXE6IEh0dHBSZXF1ZXN0PGFueT4sIG5leHQ6IEh0dHBIYW5kbGVyKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4ge1xyXG4gICAgdGhpcy5ub3RpZi5zdGFydCgpXHJcblxyXG4gICAgLy8gZXh0ZW5kIHNlcnZlciByZXNwb25zZSBvYnNlcnZhYmxlIHdpdGggbG9nZ2luZ1xyXG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcSkucGlwZShcclxuICAgICAgLy8gdGhpbmdzIGRvbid0IGFsd2F5cyB3b3JrIGFzIHBsYW5uZWRcclxuICAgICAgLy8gaWYgdGhpbmdzIGdvIHdyb25nLCB0cnkgYWdhaW4gdGhyZWUgdGltZXNcclxuICAgICAgLy8gaG93ZXZlciwgZGVsYXkgdHJpYWwgaW4gYW4gaW5jcmVtZW50YWwgbWFubmVyIChtdWx0aXBsIG9mIDEgc2Vjb25kKVxyXG4gICAgICByZXRyeVdoZW4oKGF0dGVtcHRzKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGF0dGVtcHRzLnBpcGUoXHJcbiAgICAgICAgICB6aXAocmFuZ2UoMSwgNCkpLFxyXG4gICAgICAgICAgbWVyZ2VNYXAoKFtlcnJvciwgaV0pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5ub3RpZi5zdGFydCgncXVlcnknKVxyXG4gICAgICAgICAgICBpZiAoaSA+IDIpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvcilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGltZXIoaSAqIDEwMDApXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIClcclxuICAgICAgfSksXHJcblxyXG4gICAgICAvLyBjYXRjaEVycm9yIGh0dHAgZXJyb3JzIGFuZCB0dXJuIHRvIG9ic2VydmFibGUgb2YgdW5kZWZpbmVkXHJcbiAgICAgIGNhdGNoRXJyb3IoKGUpID0+IHtcclxuICAgICAgICBsZXQgdGl0bGUsIG1lc3NhZ2VcclxuXHJcbiAgICAgICAgdGhpcy5ub3RpZi5zdGFydCgnYnVmZmVyJylcclxuXHJcbiAgICAgICAgaWYgKGUuZXJyb3IgaW5zdGFuY2VvZiBFcnJvckV2ZW50KSB7XHJcbiAgICAgICAgICAvLyBBIGNsaWVudC1zaWRlIG9yIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQuIEhhbmRsZSBpdCBhY2NvcmRpbmdseS5cclxuICAgICAgICAgIHRpdGxlID0gJ0NsaWVudCBFcnJvcidcclxuICAgICAgICAgIG1lc3NhZ2UgPSBlLmVycm9yLm1lc3NhZ2VcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gVGhlIGJhY2tlbmQgcmV0dXJuZWQgYW4gdW5zdWNjZXNzZnVsIHJlc3BvbnNlIGNvZGUuXHJcbiAgICAgICAgICAvLyBUaGUgcmVzcG9uc2UgYm9keSBtYXkgY29udGFpbiBjbHVlcyBhcyB0byB3aGF0IHdlbnQgd3JvbmcsXHJcbiAgICAgICAgICB0aXRsZSA9ICdOZXR3b3JrIEluZm8nXHJcbiAgICAgICAgICBtZXNzYWdlID0gYCR7ZS5zdGF0dXNUZXh0fSAoJHtlLnN0YXR1c30pYFxyXG4gICAgICAgICAgLy8gbWVzc2FnZSA9IGUubWVzc2FnZVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZihlLnN0YXR1cyA9PT0gNDAxKXtcclxuICAgICAgICAgIC8vIHRoaXMubm90aWYubm90aWZ5KCdUaGUgdXNlcm5hbWUvcGFzc3dvcmQgaXMgd3JvbmcnLCAnVW5hdXRob3JpemVkJylcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgIC8vIHRoaXMubm90aWYudG9hc3QobWVzc2FnZSwgdGl0bGUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zb2xlLmVycm9yKHsgdGl0bGUsIG1lc3NhZ2UgfSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gY2F0Y2hlIC8vcmUgdGhyb3dcclxuICAgICAgICAvLyB0aHJvdyB7dGl0bGUsIG1lc3NhZ2V9XHJcbiAgICAgICAgLy8gcmV0dXJuIG9mKHsgZToge3RpdGxlLCBtZXNzYWdlfSB9KVxyXG4gICAgICAgIC8vIHJldHVybiBlbXB0eSgpXHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoeyB0aXRsZSwgbWVzc2FnZX0pXHJcbiAgICAgIH0pLFxyXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5ub3RpZi5zdG9wKClcclxuICAgICAgfSksXHJcbiAgICApXHJcbiAgfVxyXG59XHJcbiJdfQ==