@appello/services
Version:
Services package with api / graphql
62 lines (61 loc) • 2.81 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createErrorLink = void 0;
const client_1 = require("@apollo/client");
const error_1 = require("@apollo/client/link/error");
const utilities_1 = require("@apollo/client/utilities");
const consts_1 = require("../consts");
const utils_1 = require("../utils");
const baseCreateLink_1 = require("./baseCreateLink");
let isRefreshing = false;
let pendingRequests = [];
const resolvePendingRequests = () => {
pendingRequests.forEach(callback => callback());
pendingRequests = [];
};
exports.createErrorLink = (0, baseCreateLink_1.baseCreateLink)(config => {
return (0, error_1.onError)(({ graphQLErrors, operation, forward }) => {
var _a;
if (!graphQLErrors || !consts_1.gqlClient.client) {
return undefined;
}
if ((0, utils_1.isGqlUnauthorizedError)(graphQLErrors) &&
operation.operationName !== config.refreshTokenOperationName) {
let forwards;
if (!isRefreshing) {
isRefreshing = true;
forwards = (0, client_1.fromPromise)((0, utils_1.refreshTokens)(config)
.then(context => {
var _a, _b;
config.onTokenRefreshSuccess(context);
const accessToken = (_b = (_a = config.getAccessTokenFromContext) === null || _a === void 0 ? void 0 : _a.call(config, context)) !== null && _b !== void 0 ? _b : context.accessToken;
operation.setContext((context) => (Object.assign(Object.assign({}, context), { headers: Object.assign(Object.assign({}, context.headers), (0, utils_1.getAuthorizationHeader)(accessToken)) })));
return true;
})
.then(() => {
resolvePendingRequests();
return true;
})
.catch(error => {
pendingRequests = [];
config.onTokenRefreshError(error);
return false;
})
.finally(() => {
isRefreshing = false;
})).filter(Boolean);
}
else {
forwards = (0, client_1.fromPromise)(new Promise(resolve => {
pendingRequests.push(() => resolve());
}));
}
return forwards.flatMap(() => forward(operation));
}
if (!(0, utils_1.isGqlBusinessError)(graphQLErrors)) {
const operationName = (0, utilities_1.getOperationName)(operation.query);
(_a = config.onUnknownError) === null || _a === void 0 ? void 0 : _a.call(config, `Something went wrong in "${operationName}"`);
}
return undefined;
});
});