kkemple/u-promised

View on GitHub
src/index.js

Summary

Maintainability
A
0 mins
Test Coverage
import isFunction from 'lodash.isfunction'

function retry(retries, fn) {
  const forever = retries === -1
  const needsEvaluation = isFunction(retries)

  return fn().catch((err) => {
    if (needsEvaluation && !retries()) return Promise.reject(err)
    if (retries <= 0 && !forever) return Promise.reject(err)
    const retriesLeft = (forever || needsEvaluation) ? retries : --retries

    return retry(retriesLeft, fn)
  })
}

function backoff(initialDelay, incrementor, retries, fn) {
  const forever = retries === -1
  const needsEvaluation = isFunction(retries)

  return fn().catch((err) => {
    if (needsEvaluation && !retries()) return Promise.reject(err)
    if (retries <= 0 && !forever) return Promise.reject(err)

    return new Promise((res) => setTimeout(res, initialDelay))
      .then(() => {
        const delay = initialDelay + incrementor
        const retriesLeft = (forever || needsEvaluation) ? retries : --retries

        return backoff(delay, incrementor, retriesLeft, fn)
      })
  })
}

module.exports = { retry, backoff }