UNPKG

@egalteam/framework

Version:

Egal

196 lines (195 loc) 8.46 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.HttpRequest = void 0; const ActionError_1 = require("../ActionResponses/ActionError"); const GlobalVariables_1 = require("../../GlobalVariables"); const AxiosInstance_1 = __importDefault(require("../../AxiosInstance")); let isRefreshing = false; let refreshSubscribers = []; let initialRequest = undefined; let targetServiceName = ''; let newToken = ''; class HttpRequest { constructor() { this.actionResult = {}; this.actionError = {}; } subscribeTokenRefresh(cb) { refreshSubscribers.push(cb); } onRefreshed(token) { refreshSubscribers.map((cb) => cb(token)); } async refreshAccessToken(serviceName, requestServiceName) { AxiosInstance_1.default.interceptors.response.use((response) => { return response; }, async (error) => { const { config } = error; if (error.response.data.action_error.internal_code === 'umt_expired') { this.refreshMasterToken(serviceName).then(() => { this.refreshAccessToken(serviceName, requestServiceName).then(() => { // @ts-ignore initialRequest.headers['Authorization'] = (0, GlobalVariables_1.getCookie)(requestServiceName); (0, AxiosInstance_1.default)(initialRequest); refreshSubscribers = []; }); }).catch((error) => { return Promise.reject(error); }); } else { return Promise.reject(error); } }); if (localStorage.getItem('umt') && localStorage.getItem('umrt')) { let domain = GlobalVariables_1.GlobalVariables.httpBaseUrl ? GlobalVariables_1.GlobalVariables.httpBaseUrl : GlobalVariables_1.GlobalVariables.authBaseUrl; delete AxiosInstance_1.default.defaults.headers.common.Authorization; await (0, AxiosInstance_1.default)({ url: `${domain}/${serviceName}/User/loginToService`, method: 'POST', data: { service_name: requestServiceName, token: localStorage.getItem('umt') } }) .then((response) => { // @ts-ignore (0, GlobalVariables_1.deleteCookie)(requestServiceName); this.setTargetMicroserviceName(response.data.action_result.data); this.onRefreshed(response.data.action_result.data); newToken = response.data.action_result.data; return response.data.action_result.data; }) .catch((error) => { return error; }); } } async refreshMasterToken(serviceName) { if (localStorage.getItem('umrt')) { let domain = GlobalVariables_1.GlobalVariables.httpBaseUrl ? GlobalVariables_1.GlobalVariables.httpBaseUrl : GlobalVariables_1.GlobalVariables.authBaseUrl; delete AxiosInstance_1.default.defaults.headers.common.Authorization; await (0, AxiosInstance_1.default)({ url: `${domain}/${serviceName}/User/refreshUserMasterToken`, method: 'POST', data: { token: localStorage.getItem('umrt') } }) .then((response) => { localStorage.setItem('umrt', response.data.action_result.data.user_master_refresh_token); localStorage.setItem('umt', response.data.action_result.data.user_master_token); }) .catch((error) => { localStorage.removeItem('umrt'); return error; }); } else { return new ActionError_1.ActionError('Session expired!', 401).getMessage(); } } axiosConnect(serviceName, modelName, actionName, httpMethod, actionParameters, customActionParameters, refreshTokenName) { let domain = GlobalVariables_1.GlobalVariables.httpBaseUrl ? GlobalVariables_1.GlobalVariables.httpBaseUrl : GlobalVariables_1.GlobalVariables.authBaseUrl; let userTokenName = GlobalVariables_1.GlobalVariables.tokenUST; // let instance = axios.create(); if (actionName !== 'register' && actionName !== 'login' && actionName !== 'loginToService' && actionName !== 'loginAndGetRefreshToken') { AxiosInstance_1.default.defaults.headers.common['Authorization'] = (0, GlobalVariables_1.getCookie)(userTokenName); } AxiosInstance_1.default.interceptors.response.use((response) => { return response; }, async (error) => { const { config } = error; const originalRequest = config; initialRequest = originalRequest; if (error.response.data.action_error.code === 401 && error.response.data.action_error.internal_code === 'ust_expired') { const requestServiceName = this.setTargetMicroserviceName(initialRequest.headers.Authorization); if (!isRefreshing) { isRefreshing = true; this.refreshAccessToken(refreshTokenName, requestServiceName).then(() => { isRefreshing = false; }); } return new Promise((resolve, reject) => { this.subscribeTokenRefresh((newToken) => { originalRequest.headers['Authorization'] = (0, GlobalVariables_1.getCookie)(requestServiceName); resolve((0, AxiosInstance_1.default)(originalRequest)); refreshSubscribers = []; }); }); } else { return Promise.reject(error); } }); return new Promise((resolve, reject) => { let data; switch (actionName) { case 'register': case 'login': case 'loginToService': case 'loginAndGetRefreshToken': case 'getItems': case 'getItem': case 'delete': case 'getCount': case 'updateManyRaw': case 'deleteManyRaw': case 'deleteMany': data = actionParameters; break; case 'createMany': case 'updateMany': const actionManyParams = { objects: {} }; // @ts-ignore actionManyParams.objects = actionParameters; data = actionManyParams; break; default: data = { attributes: actionParameters, ...customActionParameters }; } if (GlobalVariables_1.GlobalVariables.httpBaseUrl || GlobalVariables_1.GlobalVariables.authBaseUrl) { (0, AxiosInstance_1.default)({ url: `${domain}/${serviceName}/${modelName}/${actionName}`, method: httpMethod, data: data }) .then((response) => { resolve(response); }) .catch((error) => { if ('response' in error) { reject(error.response); } else { reject(error); } }); } else { this.actionError = new ActionError_1.ActionError('Укажите URL!'); reject(this.actionError.getMessage()); } }); } setTargetMicroserviceName(token) { let decipheredToken = (0, GlobalVariables_1.decipherJWT)(token); targetServiceName = decipheredToken.target_service_name; (0, GlobalVariables_1.setCookie)(targetServiceName, token); return targetServiceName; } } exports.HttpRequest = HttpRequest;