{"version":3,"file":"tenacious-fetch.modern.mjs","sources":["../src/retrying-fetch.js","../src/backoff.js","../src/index.js"],"sourcesContent":["import { linear, exponential } from './backoff'\n\nexport default function retryingFetch (retries, url, config) {\n  return new Promise((resolve, reject) => {\n    function retryAttempt (retriesLeft, url, config, value) {\n      if (retriesLeft > 0) {\n        retriesLeft--\n        const retryDelay = getRetryDelay(config, retriesLeft)\n\n        if (config.onRetry && typeof config.onRetry === 'function') {\n          config.onRetry({ retriesLeft, retryDelay, response: value })\n        }\n\n        setTimeout(() => fetchAttempt(url, config, retriesLeft), retryDelay)\n      } else {\n        reject(value)\n      }\n    }\n\n    function fetchAttempt (url, config, retriesLeft) {\n      const { retryStatus, fetcher } = config\n      fetcher(url, config)\n        .then(res => {\n          if (retryStatus.includes(res.status)) {\n            retryAttempt(retriesLeft, url, config, res)\n          } else {\n            resolve(res)\n          }\n        })\n        .catch(error => {\n          if (config.retryOnFatalError) {\n            retryAttempt(retriesLeft, url, config, error)\n          } else {\n            reject(error)\n          }\n        })\n    }\n\n    fetchAttempt(url, config, retries)\n  })\n}\n\nfunction getRetryDelay ({ retryDelay, factor, retries }, retriesLeft) {\n  if (factor && typeof factor === 'number' && Number.isInteger(factor)) {\n    return exponential(factor, retries - retriesLeft)\n  }\n  return linear(retryDelay, retries - retriesLeft)\n}\n","export const linear = (initialVal, attempt) => {\n  return initialVal * attempt\n}\n\nexport const exponential = (factor, attempt) => {\n  return Math.pow(factor, attempt)\n}\n","/* global AbortController */\nimport 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only'\nimport { fetch } from 'whatwg-fetch'\nimport retryingFetch from './retrying-fetch'\n\nlet browserFetch = false\n\nif (window && window.fetch && ('signal' in new window.Request(''))) {\n  browserFetch = window.fetch\n} else {\n  browserFetch = fetch\n}\n\nfunction tenaciousFetch (url = '', config = {}) {\n  const controller = new AbortController()\n\n  config = Object.assign({\n    retries: 1,\n    retryDelay: 1000,\n    retryStatus: [],\n    retryOnFatalError: true,\n    fetcher: browserFetch,\n    signal: controller.signal,\n    timeout: undefined\n  }, config)\n\n  if (!config.fetcher || typeof config.fetcher !== 'function') {\n    throw new Error(\n      'tenacious-fetch: No fetch implementation found. Provide a valid fetch implementation via the fetcher configuration property.'\n    )\n  }\n\n  if (typeof config.retryStatus === 'string' || typeof config.retryStatus === 'number') {\n    config.retryStatus = [Number.parseInt(config.retryStatus)]\n  }\n\n  const timeout = config.timeout\n\n  if (timeout && Number.isInteger(timeout)) {\n    return Promise.race([\n      retryingFetch(config.retries, url, config),\n      new Promise((resolve, reject) =>\n        setTimeout(\n          () => {\n            controller.abort()\n            reject(\n              new Error(\n                `tenacious-fetch: Request took longer than timeout of ${timeout} ms.`\n              )\n            )\n          },\n          timeout\n        )\n      )\n    ])\n  }\n\n  return retryingFetch(config.retries, url, config)\n}\n\nexport default tenaciousFetch\n"],"names":["retryingFetch","retries","url","config","Promise","resolve","reject","retriesLeft","value","retryDelay","factor","Number","isInteger","attempt","Math","pow","exponential","getRetryDelay","onRetry","response","setTimeout","fetchAttempt","retryStatus","fetcher","then","res","includes","status","retryAttempt","catch","error","retryOnFatalError","tenaciousFetch","controller","AbortController","Object","assign","browserFetch","signal","timeout","undefined","Error","parseInt","race","abort","window","fetch","Request"],"mappings":"yGAEe,SAAAA,EAAwBC,EAASC,EAAKC,GACnD,OAAWC,IAAAA,QAAQ,CAACC,EAASC,KAC3B,WAAuBC,EAAaL,EAAKC,EAAQK,GAC/C,GAAID,EAAc,EAAG,CACnBA,IACA,MAAME,EAmCd,UAAwBA,WAAEA,EAAFC,OAAcA,EAAdT,QAAsBA,GAAWM,GACvD,OAAIG,GAA4B,iBAAXA,GAAuBC,OAAOC,UAAUF,GCvCpC,EAACA,EAAQG,IACvBC,KAACC,IAAIL,EAAQG,GDuCJG,CAACN,EAAQT,EAAUM,GAEzBE,GAAYR,EAAUM,GAvCXU,CAAcd,EAAQI,GAErCJ,EAAOe,SAAqC,mBAAnBf,EAAOe,SAClCf,EAAOe,QAAQ,CAAEX,YAAAA,EAAaE,WAAAA,EAAYU,SAAUX,IAGtDY,WAAW,IAAMC,EAAanB,EAAKC,EAAQI,GAAcE,QAEzDH,EAAOE,GAIX,SAAAa,EAAuBnB,EAAKC,EAAQI,GAClC,MAAMe,YAAEA,EAAFC,QAAeA,GAAYpB,EACjCoB,EAAQrB,EAAKC,GACVqB,KAAKC,IACAH,EAAYI,SAASD,EAAIE,QAC3BC,EAAarB,EAAaL,EAAKC,EAAQsB,GAEvCpB,EAAQoB,KAGXI,MAAMC,IACD3B,EAAO4B,kBACTH,EAAarB,EAAaL,EAAKC,EAAQ2B,GAEvCxB,EAAOwB,KAKfT,EAAanB,EAAKC,EAAQF,KEjC9B,OAAmB,EAQnB,SAAS+B,EAAgB9B,EAAM,GAAIC,EAAS,IAC1C,MAAgB8B,EAAG,IAAIC,gBAYvB,KAVA/B,EAASgC,OAAOC,OAAO,CACrBnC,QAAS,EACTQ,WAAY,IACZa,YAAa,GACbS,mBAAmB,EACnBR,QAASc,EACTC,OAAQL,EAAWK,OACnBC,aAASC,GACRrC,IAESoB,SAAqC,mBAAnBpB,EAAOoB,QACnC,MAAUkB,IAAAA,MACR,gIAI8B,iBAAjBtC,EAACmB,aAA0D,iBAAjBnB,EAACmB,cAC1DnB,EAAOmB,YAAc,CAACX,OAAO+B,SAASvC,EAAOmB,eAG/C,MAAaiB,EAAGpC,EAAOoC,QAEvB,OAAIA,GAAW5B,OAAOC,UAAU2B,GAChBnC,QAACuC,KAAK,CAClB3C,EAAcG,EAAOF,QAASC,EAAKC,GACnC,IAAAC,QAAY,CAACC,EAASC,IACpBc,WACE,KACEa,EAAWW,QACXtC,EACE,IAAAmC,MACG,wDAAuDF,WAI9DA,MAMYvC,EAACG,EAAOF,QAASC,EAAKC,GAjD1CkC,EADEQ,QAAUA,OAAOC,OAAU,WAAY,IAAUD,OAACE,QAAQ,IAC7CF,OAAOC,MAEPA"}