UNPKG

@isaiahiroko/ng-interceptors

Version:

Angular interceptors for token authorization, local and remote store synchronization and global notification

135 lines (134 loc) 10.4 kB
/** * @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==