diff --git a/package.json b/package.json index 56b377da..b4be4e98 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "files": [ "index.js", "throttle.js", + "retry.js", "lib", "parse", "format", diff --git a/retry.js b/retry.js new file mode 100644 index 00000000..6b550378 --- /dev/null +++ b/retry.js @@ -0,0 +1,34 @@ +'use strict' + +const retry = require('p-retry') + +const request = require('./lib/request') +const createClient = require('.') + +const defaultRetryOpts = { + retries: 3, + factor: 3, + minTimeout: 5 * 1000 +} + +const createClientWithRetry = (profile, userAgent, retryOpts = defaultRetryOpts) => { + const requestWithRetry = (profile, userAgent, opt, data) => { + const attempt = () => { + return request(profile, userAgent, opt, data) + .catch((err) => { + if (err.isHafasError) throw err // continue + if (err.code === 'ENOTFOUND') { // abort + const abortErr = new retry.AbortError(err) + Object.assign(abortErr, err) + throw abortErr + } + throw err // continue + }) + } + return retry(attempt, retryOpts) + } + + return createClient(profile, userAgent, requestWithRetry) +} + +module.exports = createClientWithRetry