UNPKG

@bitblit/ratchet-epsilon-common

Version:

Tiny adapter to simplify building API gateway Lambda APIS

41 lines 2.02 kB
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