UNPKG

@terminus/ngx-tools

Version:

[![CircleCI][circle-badge]][circle-link] [![codecov][codecov-badge]][codecov-project] [![semantic-release][semantic-release-badge]][semantic-release] [![MIT License][license-image]][license-url] <br> [![NPM version][npm-version-image]][npm-url] [![Github

77 lines 12.7 kB
import { __decorate, __param } from "tslib"; import { Inject, Injectable, InjectionToken, Optional, } from '@angular/core'; import { Actions, ofType, } from '@ngrx/effects'; import { Store } from '@ngrx/store'; import { merge, Observable, Scheduler, throwError, timer, } from 'rxjs'; import { async } from 'rxjs/internal/scheduler/async'; import { delay, filter, mergeMap, retryWhen, switchMap, take, } from 'rxjs/operators'; import * as JwtActions from '../actions'; // TODO: Scheduler is marked as deprecated to stop others from using although it is not technically deprecated from what I can tell. The // 'correct' path would be to create our own class extending `SchedulerLike`. https://github.com/GetTerminus/ngx-tools/issues/287 // eslint-disable-next-line deprecation/deprecation export var SCHEDULER = new InjectionToken('scheduler'); export var ESCALATION_WAIT_TIME = new InjectionToken('wait time'); var FORBIDDEN_ERROR = 403; var DEFAULT_ESCALATION_WAIT_TIME = 30000; var RetryWithEscalation = /** @class */ (function () { function RetryWithEscalation(actions$, // eslint-disable-next-line @typescript-eslint/no-explicit-any store, // TODO: Scheduler is marked as deprecated to stop others from using although it is not technically deprecated // from what I can tell. The 'correct' path would be to create our own class extending `SchedulerLike`. // https://github.com/GetTerminus/ngx-tools/issues/287 // eslint-disable-next-line deprecation/deprecation scheduler, waitTime) { this.actions$ = actions$; this.store = store; this.scheduler = scheduler; this.waitTime = waitTime; } RetryWithEscalation.prototype.retryWithEscalation = function (tokenName) { var _this = this; // eslint-disable-next-line @typescript-eslint/no-explicit-any return function (source) { return source.pipe(retryWhen(function (errors) { var DELAY_MS = 10; var tries = 0; return errors.pipe(mergeMap(function (err) { if (tries > 0 || err instanceof Error || err.status !== FORBIDDEN_ERROR) { return throwError(err); } tries += 1; _this.store.dispatch(new JwtActions.EscalateToken(tokenName)); return merge(_this.waitForResult(tokenName), _this.expirationTimer()).pipe(take(1), delay(DELAY_MS, _this.scheduler || async)); })); })); }; }; RetryWithEscalation.prototype.waitForResult = function (tokenName) { var _this = this; return this.actions$ .pipe(ofType(JwtActions.ActionTypes.EscalationFailed, JwtActions.ActionTypes.EscalationSuccess), filter(function (a) { return a.tokenName === tokenName; }), switchMap(function (escResult) { if (escResult.type === JwtActions.ActionTypes.EscalationSuccess) { return 'complete'; } return _this.failureError(); })); }; RetryWithEscalation.prototype.expirationTimer = function () { var _this = this; return timer(this.waitTime || DEFAULT_ESCALATION_WAIT_TIME, this.scheduler || async).pipe(switchMap(function () { return _this.failureError(); })); }; RetryWithEscalation.prototype.failureError = function () { return throwError(new Error('Failed to escalate token')); }; RetryWithEscalation.ctorParameters = function () { return [ { type: Actions }, { type: Store }, { type: Scheduler, decorators: [{ type: Optional }, { type: Inject, args: [SCHEDULER,] }] }, { type: Number, decorators: [{ type: Optional }, { type: Inject, args: [ESCALATION_WAIT_TIME,] }] } ]; }; RetryWithEscalation = __decorate([ Injectable(), __param(2, Optional()), __param(2, Inject(SCHEDULER)), __param(3, Optional()), __param(3, Inject(ESCALATION_WAIT_TIME)) ], RetryWithEscalation); return RetryWithEscalation; }()); export { RetryWithEscalation }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnktd2l0aC1lc2NhbGF0aW9uLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRlcm1pbnVzL25neC10b29scy9qd3QvIiwic291cmNlcyI6WyJqd3QtdG9rZW4tbWFuYWdtZW50L3V0aWxpdGllcy9yZXRyeS13aXRoLWVzY2FsYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLE9BQU8sRUFDTCxNQUFNLEVBQ04sVUFBVSxFQUNWLGNBQWMsRUFDZCxRQUFRLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLE9BQU8sRUFDUCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwQyxPQUFPLEVBQ0wsS0FBSyxFQUNMLFVBQVUsRUFDVixTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssR0FDTixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN0RCxPQUFPLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixRQUFRLEVBQ1IsU0FBUyxFQUNULFNBQVMsRUFDVCxJQUFJLEdBQ0wsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQztBQUl6Qyx3SUFBd0k7QUFDeEksaUlBQWlJO0FBQ2pJLG1EQUFtRDtBQUNuRCxNQUFNLENBQUMsSUFBTSxTQUFTLEdBQUcsSUFBSSxjQUFjLENBQVksV0FBVyxDQUFDLENBQUM7QUFDcEUsTUFBTSxDQUFDLElBQU0sb0JBQW9CLEdBQUcsSUFBSSxjQUFjLENBQVMsV0FBVyxDQUFDLENBQUM7QUFFNUUsSUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDO0FBQzVCLElBQU0sNEJBQTRCLEdBQUcsS0FBSyxDQUFDO0FBSTNDO0lBNkRFLDZCQUNVLFFBQWlCO0lBQ3pCLDhEQUE4RDtJQUN2RCxLQUFpQjtJQUN4Qiw4R0FBOEc7SUFDOUcsdUdBQXVH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LENBQUE7UUFDN0IsV0FBQSxRQUFRLEVBQUUsQ0FBQSxFQUFFLFdBQUEsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUE7T0F0RWhDLG1CQUFtQixDQXlFL0I7SUFBRCwwQkFBQztDQUFBLEFBekVELElBeUVDO1NBekVZLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtcbiAgSW5qZWN0LFxuICBJbmplY3RhYmxlLFxuICBJbmplY3Rpb25Ub2tlbixcbiAgT3B0aW9uYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWN0aW9ucyxcbiAgb2ZUeXBlLFxufSBmcm9tICdAbmdyeC9lZmZlY3RzJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHtcbiAgbWVyZ2UsXG4gIE9ic2VydmFibGUsXG4gIFNjaGVkdWxlcixcbiAgdGhyb3dFcnJvcixcbiAgdGltZXIsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgYXN5bmMgfSBmcm9tICdyeGpzL2ludGVybmFsL3NjaGVkdWxlci9hc3luYyc7XG5pbXBvcnQge1xuICBkZWxheSxcbiAgZmlsdGVyLFxuICBtZXJnZU1hcCxcbiAgcmV0cnlXaGVuLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0ICogYXMgSnd0QWN0aW9ucyBmcm9tICcuLi9hY3Rpb25zJztcbmltcG9ydCB7IENsYWltTWFwIH0gZnJvbSAnLi4vY2xhaW0tbWFwJztcblxuXG4vLyBUT0RPOiBTY2hlZHVsZXIgaXMgbWFya2VkIGFzIGRlcHJlY2F0ZWQgdG8gc3RvcCBvdGhlcnMgZnJvbSB1c2luZyBhbHRob3VnaCBpdCBpcyBub3QgdGVjaG5pY2FsbHkgZGVwcmVjYXRlZCBmcm9tIHdoYXQgSSBjYW4gdGVsbC4gVGhlXG4vLyAnY29ycmVjdCcgcGF0aCB3b3VsZCBiZSB0byBjcmVhdGUgb3VyIG93biBjbGFzcyBleHRlbmRpbmcgYFNjaGVkdWxlckxpa2VgLiBodHRwczovL2dpdGh1Yi5jb20vR2V0VGVybWludXMvbmd4LXRvb2xzL2lzc3Vlcy8yODdcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuZXhwb3J0IGNvbnN0IFNDSEVEVUxFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxTY2hlZHVsZXI+KCdzY2hlZHVsZXInKTtcbmV4cG9ydCBjb25zdCBFU0NBTEFUSU9OX1dBSVRfVElNRSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxudW1iZXI+KCd3YWl0IHRpbWUnKTtcblxuY29uc3QgRk9SQklEREVOX0VSUk9SID0gNDAzO1xuY29uc3QgREVGQVVMVF9FU0NBTEFUSU9OX1dBSVRfVElNRSA9IDMwMDAwO1xuXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXRyeVdpdGhFc2NhbGF0aW9uPENNID0gQ2xhaW1NYXA+IHtcblxuICBwdWJsaWMgcmV0cnlXaXRoRXNjYWxhdGlvbih0b2tlbk5hbWU6IEV4dHJhY3Q8a2V5b2YgQ00sIHN0cmluZz4pIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHJldHVybiAoc291cmNlOiBPYnNlcnZhYmxlPGFueT4pID0+IHNvdXJjZS5waXBlKFxuICAgICAgcmV0cnlXaGVuKChlcnJvcnM6IE9ic2VydmFibGU8SHR0cEVycm9yUmVzcG9uc2UgfCBFcnJvcj4pID0+IHtcbiAgICAgICAgY29uc3QgREVMQVlfTVMgPSAxMDtcbiAgICAgICAgbGV0IHRyaWVzID0gMDtcbiAgICAgICAgcmV0dXJuIGVycm9ycy5waXBlKFxuICAgICAgICAgIG1lcmdlTWFwKGVyciA9PiB7XG4gICAgICAgICAgICBpZiAodHJpZXMgPiAwIHx8IGVyciBpbnN0YW5jZW9mIEVycm9yIHx8IGVyci5zdGF0dXMgIT09IEZPUkJJRERFTl9FUlJPUikge1xuICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cmllcyArPSAxO1xuXG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBKd3RBY3Rpb25zLkVzY2FsYXRlVG9rZW48Q00+KHRva2VuTmFtZSkpO1xuXG4gICAgICAgICAgICByZXR1cm4gbWVyZ2UoXG4gICAgICAgICAgICAgIHRoaXMud2FpdEZvclJlc3VsdCh0b2tlbk5hbWUpLFxuICAgICAgICAgICAgICB0aGlzLmV4cGlyYXRpb25UaW1lcigpLFxuICAgICAgICAgICAgKS5waXBlKFxuICAgICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgICBkZWxheShERUxBWV9NUywgdGhpcy5zY2hlZHVsZXIgfHwgYXN5bmMpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHdhaXRGb3JSZXN1bHQodG9rZW5OYW1lOiBFeHRyYWN0PGtleW9mIENNLCBzdHJpbmc+KSB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aW9ucyRcbiAgICAgIC5waXBlKFxuICAgICAgICBvZlR5cGU8Snd0QWN0aW9ucy5Fc2NhbGF0aW9uRmFpbGVkPENNPiB8IEp3dEFjdGlvbnMuRXNjYWxhdGlvblN1Y2Nlc3M8Q00+PihcbiAgICAgICAgICBKd3RBY3Rpb25zLkFjdGlvblR5cGVzLkVzY2FsYXRpb25GYWlsZWQsXG4gICAgICAgICAgSnd0QWN0aW9ucy5BY3Rpb25UeXBlcy5Fc2NhbGF0aW9uU3VjY2VzcyxcbiAgICAgICAgKSxcbiAgICAgICAgZmlsdGVyKGEgPT4gYS50b2tlbk5hbWUgPT09IHRva2VuTmFtZSksXG4gICAgICAgIHN3aXRjaE1hcChlc2NSZXN1bHQgPT4ge1xuICAgICAgICAgIGlmIChlc2NSZXN1bHQudHlwZSA9PT0gSnd0QWN0aW9ucy5BY3Rpb25UeXBlcy5Fc2NhbGF0aW9uU3VjY2Vzcykge1xuICAgICAgICAgICAgcmV0dXJuICdjb21wbGV0ZSc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmZhaWx1cmVFcnJvcigpO1xuXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgIDtcbiAgfVxuXG4gIHByaXZhdGUgZXhwaXJhdGlvblRpbWVyKCkge1xuICAgIHJldHVybiB0aW1lcihcbiAgICAgIHRoaXMud2FpdFRpbWUgIHx8IERFRkFVTFRfRVNDQUxBVElPTl9XQUlUX1RJTUUsXG4gICAgICB0aGlzLnNjaGVkdWxlciB8fCBhc3luYyxcbiAgICApLnBpcGUoc3dpdGNoTWFwKCgpID0+IHRoaXMuZmFpbHVyZUVycm9yKCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgZmFpbHVyZUVycm9yKCkge1xuICAgIHJldHVybiB0aHJvd0Vycm9yKG5ldyBFcnJvcignRmFpbGVkIHRvIGVzY2FsYXRlIHRva2VuJykpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhY3Rpb25zJDogQWN0aW9ucyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHB1YmxpYyBzdG9yZTogU3RvcmU8YW55PixcbiAgICAvLyBUT0RPOiBTY2hlZHVsZXIgaXMgbWFya2VkIGFzIGRlcHJlY2F0ZWQgdG8gc3RvcCBvdGhlcnMgZnJvbSB1c2luZyBhbHRob3VnaCBpdCBpcyBub3QgdGVjaG5pY2FsbHkgZGVwcmVjYXRlZFxuICAgIC8vIGZyb20gd2hhdCBJIGNhbiB0ZWxsLiBUaGUgJ2NvcnJlY3QnIHBhdGggd291bGQgYmUgdG8gY3JlYXRlIG91ciBvd24gY2xhc3MgZXh0ZW5kaW5nIGBTY2hlZHVsZXJMaWtlYC5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vR2V0VGVybWludXMvbmd4LXRvb2xzL2lzc3Vlcy8yODdcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFNDSEVEVUxFUikgcHJpdmF0ZSBzY2hlZHVsZXI6IFNjaGVkdWxlcixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEVTQ0FMQVRJT05fV0FJVF9USU1FKSBwcml2YXRlIHdhaXRUaW1lOiBudW1iZXIsXG4gICkge31cblxufVxuIl19