UNPKG

@appello/services

Version:

Services package with api / graphql

62 lines (61 loc) 2.81 kB
"use strict"; 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; }); });