Default value : <T>(config: IResilienceConfig, uuid: string): MonoTypeOperatorFunction<T> => {
const userRetryOrCancelSubject = new Subject<boolean>();
let retryCount = 0;
return retry<T>({
delay: (error) =>
of(error).pipe(
concatMap((err) => {
if (isRetryDisabled(config) || !config.retryOnStatusCodeList.includes(err.status)) {
const topicSpecificMessageOrEmpty = config.topicToConfigDict[config.topic]?.failMessage || '';
config.onFail(config.topic, uuid, topicSpecificMessageOrEmpty);
throw err;
}
retryCount = retryCount + 1;
const retries = retryCount;
if (retryCount <= config.retryIntervalInMillisList.length) {
return of(err).pipe(
tap(() =>
config.onRequestRetry(
config.topic,
uuid,
retries,
config.retryIntervalInMillisList[retries - 1],
err.status,
),
),
delay(config.retryIntervalInMillisList[retryCount - 1]),
);
} else {
retryCount = 0;
if (waitForUserDecision(config)) {
config.onWaitingForUserDecision(
config.topic,
uuid,
retries,
err.status,
userRetryOrCancelSubject,
);
return userRetryOrCancelSubject.asObservable().pipe(
take(1),
map((shouldRetry) => {
if (shouldRetry) {
config.onRequestRetry(
config.topic,
uuid,
retries,
config.retryIntervalInMillisList[retries - 1],
err.status,
);
return of(err);
}
const topicSpecificMessageOrEmpty =
config.topicToConfigDict[config.topic]?.failMessage || '';
config.onFail(config.topic, uuid, topicSpecificMessageOrEmpty);
throw err;
}),
);
} else {
const topicSpecificMessageOrEmpty =
config.topicToConfigDict[config.topic]?.failMessage || '';
config.onFail(config.topic, uuid, topicSpecificMessageOrEmpty);
throw err;
}
}
}),
),
});
}
|