@appello/services
Version:
Services package with api / graphql
66 lines (65 loc) • 2.37 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.refreshTokens = refreshTokens;
const common_1 = require("@appello/common");
const setAuthorizationHeader_1 = require("../setAuthorizationHeader");
let refreshQueues = [];
let isRefreshing = false;
function runQueue({ error, accessToken }) {
refreshQueues.forEach(promise => {
if (error) {
promise.reject(error);
}
else if (accessToken) {
promise.resolve(accessToken);
}
promise.reject(undefined);
});
refreshQueues = [];
}
async function refreshTokens(instance, error, config) {
var _a, _b, _c, _d, _e;
const newConfig = error.config;
if (isRefreshing) {
return addToQueue(instance, newConfig);
}
newConfig.refreshRetry = true;
isRefreshing = true;
let refreshPromise;
if (!(0, common_1.isNil)(config.refreshTokens)) {
refreshPromise = config.refreshTokens(instance, error);
}
else {
refreshPromise = instance
.post((_a = config.refreshTokenUrl) !== null && _a !== void 0 ? _a : '', { refreshToken: await config.getRefreshToken() })
.then(({ data }) => data);
}
try {
const data = await refreshPromise;
(_b = config.onTokenRefreshSuccess) === null || _b === void 0 ? void 0 : _b.call(config, data);
const accessToken = (_d = (_c = config.getAccessTokenFromRefreshRequest) === null || _c === void 0 ? void 0 : _c.call(config, data)) !== null && _d !== void 0 ? _d : data.accessToken;
newConfig.headers = (0, setAuthorizationHeader_1.setAuthorizationHeader)(accessToken, newConfig.headers);
runQueue({ accessToken });
return await instance(newConfig);
}
catch (error) {
(_e = config.onTokenRefreshError) === null || _e === void 0 ? void 0 : _e.call(config, error);
runQueue({ error });
throw error;
}
finally {
isRefreshing = false;
}
}
function addToQueue(instance, config) {
return new Promise((resolve, reject) => {
refreshQueues.push({ resolve, reject });
})
.then(token => {
config.headers = (0, setAuthorizationHeader_1.setAuthorizationHeader)(token, config.headers);
return instance(config);
})
.catch(err => {
return Promise.reject(err);
});
}