@bitblit/ratchet-epsilon-common
Version:
Tiny adapter to simplify building API gateway Lambda APIS
41 lines • 2.02 kB
JavaScript
import { Logger } from '@bitblit/ratchet-common/logger/logger';
import { PromiseRatchet } from '@bitblit/ratchet-common/lang/promise-ratchet';
import { StringRatchet } from '@bitblit/ratchet-common/lang/string-ratchet';
import { NumberRatchet } from '@bitblit/ratchet-common/lang/number-ratchet';
import { DurationRatchet } from '@bitblit/ratchet-common/lang/duration-ratchet';
export class RetryProcessor {
delegate;
opts;
static RETRY_FIELD_NAME = '___RetryProcessorTryNumber';
constructor(delegate, opts) {
this.delegate = delegate;
this.opts = opts;
}
get typeName() {
return StringRatchet.trimToEmpty(this.opts?.typePrefix) + this.delegate.typeName + StringRatchet.trimToEmpty(this.opts?.typeSuffix);
}
async handleEvent(data, mgr) {
const tryNumber = data && data[RetryProcessor.RETRY_FIELD_NAME] ? NumberRatchet.safeNumber(data[RetryProcessor.RETRY_FIELD_NAME]) : 1;
const dataCopy = data ? Object.assign({}, data) : null;
delete dataCopy[RetryProcessor.RETRY_FIELD_NAME];
Logger.info('RetryProcessor : %s : Try %d of %d', this.delegate.typeName, tryNumber, this.opts.retryCount);
try {
await this.delegate.handleEvent(dataCopy, mgr);
}
catch (err) {
Logger.error('Failed to process : %s', err, err);
if (tryNumber < this.opts.retryCount) {
const waitTimeMS = tryNumber * this.opts.baseDelayMS;
Logger.info('Firing automatic retry after a wait of %s', DurationRatchet.formatMsDuration(waitTimeMS));
await PromiseRatchet.wait(waitTimeMS);
const wrapped = dataCopy || {};
wrapped[RetryProcessor.RETRY_FIELD_NAME] = tryNumber + 1;
await mgr.fireImmediateProcessRequestByParts(this.typeName, wrapped);
}
else {
Logger.error('That was the last try - giving up');
}
}
}
}
//# sourceMappingURL=retry-processor.js.map