"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

function configureRefreshFetch(configuration) {
  var refreshToken = configuration.refreshToken,
      shouldRefreshToken = configuration.shouldRefreshToken,
      fetch = configuration.fetch;
  var refreshingTokenPromise = null;
  return function (url, options) {
    if (refreshingTokenPromise !== null) {
      return refreshingTokenPromise.then(function () {
        return fetch(url, options);
      }) // Even if the refreshing fails, do the fetch so we reject with
      // error of that request
      ["catch"](function () {
        return fetch(url, options);
      });
    }

    return fetch(url, options)["catch"](function (error) {
      if (shouldRefreshToken(error)) {
        if (refreshingTokenPromise === null) {
          refreshingTokenPromise = new Promise(function (resolve, reject) {
            refreshToken().then(function () {
              refreshingTokenPromise = null;
              resolve();
            })["catch"](function (refreshTokenError) {
              refreshingTokenPromise = null;
              reject(refreshTokenError);
            });
          });
        }

        return refreshingTokenPromise["catch"](function () {
          // If refreshing fails, continue with original error
          throw error;
        }).then(function () {
          return fetch(url, options);
        });
      } else {
        throw error;
      }
    });
  };
}

var _default = configureRefreshFetch;
exports["default"] = _default;