UNPKG

@appello/services

Version:

Services package with api / graphql

66 lines (65 loc) 2.37 kB
"use strict"; 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); }); }