@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
73 lines • 12.2 kB
JavaScript
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 const SCHEDULER = new InjectionToken('scheduler');
export const ESCALATION_WAIT_TIME = new InjectionToken('wait time');
const FORBIDDEN_ERROR = 403;
const DEFAULT_ESCALATION_WAIT_TIME = 30000;
let RetryWithEscalation = class RetryWithEscalation {
constructor(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(tokenName) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
return (source) => source.pipe(retryWhen((errors) => {
const DELAY_MS = 10;
let tries = 0;
return errors.pipe(mergeMap(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));
}));
}));
}
waitForResult(tokenName) {
return this.actions$
.pipe(ofType(JwtActions.ActionTypes.EscalationFailed, JwtActions.ActionTypes.EscalationSuccess), filter(a => a.tokenName === tokenName), switchMap(escResult => {
if (escResult.type === JwtActions.ActionTypes.EscalationSuccess) {
return 'complete';
}
return this.failureError();
}));
}
expirationTimer() {
return timer(this.waitTime || DEFAULT_ESCALATION_WAIT_TIME, this.scheduler || async).pipe(switchMap(() => this.failureError()));
}
failureError() {
return throwError(new Error('Failed to escalate token'));
}
};
RetryWithEscalation.ctorParameters = () => [
{ 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);
export { RetryWithEscalation };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnktd2l0aC1lc2NhbGF0aW9uLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRlcm1pbnVzL25neC10b29scy9qd3QvIiwic291cmNlcyI6WyJqd3QtdG9rZW4tbWFuYWdtZW50L3V0aWxpdGllcy9yZXRyeS13aXRoLWVzY2FsYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLE9BQU8sRUFDTCxNQUFNLEVBQ04sVUFBVSxFQUNWLGNBQWMsRUFDZCxRQUFRLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLE9BQU8sRUFDUCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwQyxPQUFPLEVBQ0wsS0FBSyxFQUNMLFVBQVUsRUFDVixTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssR0FDTixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN0RCxPQUFPLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixRQUFRLEVBQ1IsU0FBUyxFQUNULFNBQVMsRUFDVCxJQUFJLEdBQ0wsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQztBQUl6Qyx3SUFBd0k7QUFDeEksaUlBQWlJO0FBQ2pJLG1EQUFtRDtBQUNuRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxjQUFjLENBQVksV0FBVyxDQUFDLENBQUM7QUFDcEUsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxjQUFjLENBQVMsV0FBVyxDQUFDLENBQUM7QUFFNUUsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDO0FBQzVCLE1BQU0sNEJBQTRCLEdBQUcsS0FBSyxDQUFDO0FBSTNDLElBQWEsbUJBQW1CLEdBQWhDLE1BQWEsbUJBQW1CO0lBNkQ5QixZQUNVLFFBQWlCO0lBQ3pCLDhEQUE4RDtJQUN2RCxL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RSxXQUFBLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO0dBdEVoQyxtQkFBbUIsQ0F5RS9CO1NBekVZLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtcbiAgSW5qZWN0LFxuICBJbmplY3RhYmxlLFxuICBJbmplY3Rpb25Ub2tlbixcbiAgT3B0aW9uYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWN0aW9ucyxcbiAgb2ZUeXBlLFxufSBmcm9tICdAbmdyeC9lZmZlY3RzJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHtcbiAgbWVyZ2UsXG4gIE9ic2VydmFibGUsXG4gIFNjaGVkdWxlcixcbiAgdGhyb3dFcnJvcixcbiAgdGltZXIsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgYXN5bmMgfSBmcm9tICdyeGpzL2ludGVybmFsL3NjaGVkdWxlci9hc3luYyc7XG5pbXBvcnQge1xuICBkZWxheSxcbiAgZmlsdGVyLFxuICBtZXJnZU1hcCxcbiAgcmV0cnlXaGVuLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0ICogYXMgSnd0QWN0aW9ucyBmcm9tICcuLi9hY3Rpb25zJztcbmltcG9ydCB7IENsYWltTWFwIH0gZnJvbSAnLi4vY2xhaW0tbWFwJztcblxuXG4vLyBUT0RPOiBTY2hlZHVsZXIgaXMgbWFya2VkIGFzIGRlcHJlY2F0ZWQgdG8gc3RvcCBvdGhlcnMgZnJvbSB1c2luZyBhbHRob3VnaCBpdCBpcyBub3QgdGVjaG5pY2FsbHkgZGVwcmVjYXRlZCBmcm9tIHdoYXQgSSBjYW4gdGVsbC4gVGhlXG4vLyAnY29ycmVjdCcgcGF0aCB3b3VsZCBiZSB0byBjcmVhdGUgb3VyIG93biBjbGFzcyBleHRlbmRpbmcgYFNjaGVkdWxlckxpa2VgLiBodHRwczovL2dpdGh1Yi5jb20vR2V0VGVybWludXMvbmd4LXRvb2xzL2lzc3Vlcy8yODdcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuZXhwb3J0IGNvbnN0IFNDSEVEVUxFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxTY2hlZHVsZXI+KCdzY2hlZHVsZXInKTtcbmV4cG9ydCBjb25zdCBFU0NBTEFUSU9OX1dBSVRfVElNRSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxudW1iZXI+KCd3YWl0IHRpbWUnKTtcblxuY29uc3QgRk9SQklEREVOX0VSUk9SID0gNDAzO1xuY29uc3QgREVGQVVMVF9FU0NBTEFUSU9OX1dBSVRfVElNRSA9IDMwMDAwO1xuXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXRyeVdpdGhFc2NhbGF0aW9uPENNID0gQ2xhaW1NYXA+IHtcblxuICBwdWJsaWMgcmV0cnlXaXRoRXNjYWxhdGlvbih0b2tlbk5hbWU6IEV4dHJhY3Q8a2V5b2YgQ00sIHN0cmluZz4pIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHJldHVybiAoc291cmNlOiBPYnNlcnZhYmxlPGFueT4pID0+IHNvdXJjZS5waXBlKFxuICAgICAgcmV0cnlXaGVuKChlcnJvcnM6IE9ic2VydmFibGU8SHR0cEVycm9yUmVzcG9uc2UgfCBFcnJvcj4pID0+IHtcbiAgICAgICAgY29uc3QgREVMQVlfTVMgPSAxMDtcbiAgICAgICAgbGV0IHRyaWVzID0gMDtcbiAgICAgICAgcmV0dXJuIGVycm9ycy5waXBlKFxuICAgICAgICAgIG1lcmdlTWFwKGVyciA9PiB7XG4gICAgICAgICAgICBpZiAodHJpZXMgPiAwIHx8IGVyciBpbnN0YW5jZW9mIEVycm9yIHx8IGVyci5zdGF0dXMgIT09IEZPUkJJRERFTl9FUlJPUikge1xuICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cmllcyArPSAxO1xuXG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBKd3RBY3Rpb25zLkVzY2FsYXRlVG9rZW48Q00+KHRva2VuTmFtZSkpO1xuXG4gICAgICAgICAgICByZXR1cm4gbWVyZ2UoXG4gICAgICAgICAgICAgIHRoaXMud2FpdEZvclJlc3VsdCh0b2tlbk5hbWUpLFxuICAgICAgICAgICAgICB0aGlzLmV4cGlyYXRpb25UaW1lcigpLFxuICAgICAgICAgICAgKS5waXBlKFxuICAgICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgICBkZWxheShERUxBWV9NUywgdGhpcy5zY2hlZHVsZXIgfHwgYXN5bmMpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHdhaXRGb3JSZXN1bHQodG9rZW5OYW1lOiBFeHRyYWN0PGtleW9mIENNLCBzdHJpbmc+KSB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aW9ucyRcbiAgICAgIC5waXBlKFxuICAgICAgICBvZlR5cGU8Snd0QWN0aW9ucy5Fc2NhbGF0aW9uRmFpbGVkPENNPiB8IEp3dEFjdGlvbnMuRXNjYWxhdGlvblN1Y2Nlc3M8Q00+PihcbiAgICAgICAgICBKd3RBY3Rpb25zLkFjdGlvblR5cGVzLkVzY2FsYXRpb25GYWlsZWQsXG4gICAgICAgICAgSnd0QWN0aW9ucy5BY3Rpb25UeXBlcy5Fc2NhbGF0aW9uU3VjY2VzcyxcbiAgICAgICAgKSxcbiAgICAgICAgZmlsdGVyKGEgPT4gYS50b2tlbk5hbWUgPT09IHRva2VuTmFtZSksXG4gICAgICAgIHN3aXRjaE1hcChlc2NSZXN1bHQgPT4ge1xuICAgICAgICAgIGlmIChlc2NSZXN1bHQudHlwZSA9PT0gSnd0QWN0aW9ucy5BY3Rpb25UeXBlcy5Fc2NhbGF0aW9uU3VjY2Vzcykge1xuICAgICAgICAgICAgcmV0dXJuICdjb21wbGV0ZSc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmZhaWx1cmVFcnJvcigpO1xuXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgIDtcbiAgfVxuXG4gIHByaXZhdGUgZXhwaXJhdGlvblRpbWVyKCkge1xuICAgIHJldHVybiB0aW1lcihcbiAgICAgIHRoaXMud2FpdFRpbWUgIHx8IERFRkFVTFRfRVNDQUxBVElPTl9XQUlUX1RJTUUsXG4gICAgICB0aGlzLnNjaGVkdWxlciB8fCBhc3luYyxcbiAgICApLnBpcGUoc3dpdGNoTWFwKCgpID0+IHRoaXMuZmFpbHVyZUVycm9yKCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgZmFpbHVyZUVycm9yKCkge1xuICAgIHJldHVybiB0aHJvd0Vycm9yKG5ldyBFcnJvcignRmFpbGVkIHRvIGVzY2FsYXRlIHRva2VuJykpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhY3Rpb25zJDogQWN0aW9ucyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHB1YmxpYyBzdG9yZTogU3RvcmU8YW55PixcbiAgICAvLyBUT0RPOiBTY2hlZHVsZXIgaXMgbWFya2VkIGFzIGRlcHJlY2F0ZWQgdG8gc3RvcCBvdGhlcnMgZnJvbSB1c2luZyBhbHRob3VnaCBpdCBpcyBub3QgdGVjaG5pY2FsbHkgZGVwcmVjYXRlZFxuICAgIC8vIGZyb20gd2hhdCBJIGNhbiB0ZWxsLiBUaGUgJ2NvcnJlY3QnIHBhdGggd291bGQgYmUgdG8gY3JlYXRlIG91ciBvd24gY2xhc3MgZXh0ZW5kaW5nIGBTY2hlZHVsZXJMaWtlYC5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vR2V0VGVybWludXMvbmd4LXRvb2xzL2lzc3Vlcy8yODdcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFNDSEVEVUxFUikgcHJpdmF0ZSBzY2hlZHVsZXI6IFNjaGVkdWxlcixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEVTQ0FMQVRJT05fV0FJVF9USU1FKSBwcml2YXRlIHdhaXRUaW1lOiBudW1iZXIsXG4gICkge31cblxufVxuIl19