]>
Commit | Line | Data |
---|---|---|
65fcc311 | 1 | // TODO: import from ES6 when retry typing file will include errorFilter function |
4d4e5cd4 | 2 | import * as retry from 'async/retry' |
20494f12 | 3 | import * as Bluebird from 'bluebird' |
65fcc311 | 4 | import { logger } from './logger' |
4145c1c6 | 5 | |
69818c93 | 6 | type RetryTransactionWrapperOptions = { errorMessage: string, arguments?: any[] } |
20494f12 | 7 | function retryTransactionWrapper (functionToRetry: (...args) => Promise<any> | Bluebird<any>, options: RetryTransactionWrapperOptions) { |
4df023f2 C |
8 | const args = options.arguments ? options.arguments : [] |
9 | ||
075f16ca C |
10 | return transactionRetryer(callback => { |
11 | functionToRetry.apply(this, args) | |
6fcd19ba C |
12 | .then(result => callback(null, result)) |
13 | .catch(err => callback(err)) | |
075f16ca | 14 | }) |
6fcd19ba | 15 | .catch(err => { |
ad0997ad | 16 | logger.error(options.errorMessage, err) |
20494f12 | 17 | throw err |
6fcd19ba | 18 | }) |
4df023f2 C |
19 | } |
20 | ||
6fcd19ba C |
21 | function transactionRetryer (func: Function) { |
22 | return new Promise((res, rej) => { | |
23 | retry({ | |
24 | times: 5, | |
4df023f2 | 25 | |
075f16ca | 26 | errorFilter: err => { |
6fcd19ba C |
27 | const willRetry = (err.name === 'SequelizeDatabaseError') |
28 | logger.debug('Maybe retrying the transaction function.', { willRetry }) | |
29 | return willRetry | |
30 | } | |
20494f12 | 31 | }, func, (err, data) => err ? rej(err) : res(data)) |
4df023f2 C |
32 | }) |
33 | } | |
34 | ||
35 | // --------------------------------------------------------------------------- | |
36 | ||
65fcc311 | 37 | export { |
65fcc311 | 38 | retryTransactionWrapper, |
65fcc311 C |
39 | transactionRetryer |
40 | } |