UNPKG

@egalteam/framework-react-native

Version:

Egal

200 lines (199 loc) 8.55 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 axios_1 = __importDefault(require("axios")); const ActionError_1 = require("../ActionResponses/ActionError"); const GlobalVariables_1 = require("../../GlobalVariables"); const MMKVStorage_1 = __importDefault(require("../../MMKVStorage")); let isRefreshing = false; let refreshSubscribers = []; let initialRequest = undefined; class HttpRequest { constructor() { this.actionResult = {}; this.actionError = {}; } subscribeTokenRefresh(cb) { refreshSubscribers.push(cb); } onRefreshed(token) { refreshSubscribers.map((cb) => cb(token)); } async refreshAccessToken(serviceName) { axios_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().then(() => { this.refreshAccessToken(serviceName).then(() => { initialRequest.headers['Authorization'] = (0, GlobalVariables_1.getCookie)(serviceName); (0, axios_1.default)(initialRequest); refreshSubscribers = []; }); }).catch((error) => { return error; }); } else { return error; } }); if (MMKVStorage_1.default.getString('umt') && MMKVStorage_1.default.getString('umrt')) { let domain = GlobalVariables_1.GlobalVariables.httpBaseUrl ? GlobalVariables_1.GlobalVariables.httpBaseUrl : GlobalVariables_1.GlobalVariables.authBaseUrl; delete axios_1.default.defaults.headers.Authorization; (0, GlobalVariables_1.deleteCookie)(serviceName); await (0, axios_1.default)({ url: `${domain}/auth/User/loginToService`, method: 'POST', data: { service_name: serviceName, token: MMKVStorage_1.default.getString('umt') } }) .then((response) => { (0, GlobalVariables_1.deleteCookie)(serviceName); (0, GlobalVariables_1.setCookie)(serviceName, response.data.action_result.data); this.onRefreshed(response.data.action_result.data); return response.data.action_result.data; }) .catch((error) => { return error; }); } } async refreshMasterToken() { if (MMKVStorage_1.default.getString('umrt')) { let domain = GlobalVariables_1.GlobalVariables.httpBaseUrl ? GlobalVariables_1.GlobalVariables.httpBaseUrl : GlobalVariables_1.GlobalVariables.authBaseUrl; delete axios_1.default.defaults.headers.Authorization; await (0, axios_1.default)({ url: `${domain}/auth/User/refreshUserMasterToken`, method: 'POST', data: { token: MMKVStorage_1.default.getString('umrt') } }) .then((response) => { MMKVStorage_1.default.set('umrt', response.data.action_result.data.user_master_refresh_token); MMKVStorage_1.default.set('umt', response.data.action_result.data.user_master_token); }) .catch((error) => { MMKVStorage_1.default.delete('umrt'); return error; }); } else { return new ActionError_1.ActionError('Session expired!', 401).getMessage(); } } axiosConnect(serviceName, modelName, actionName, httpMethod, actionParameters, customActionParameters, tokenName) { let domain = GlobalVariables_1.GlobalVariables.httpBaseUrl ? GlobalVariables_1.GlobalVariables.httpBaseUrl : GlobalVariables_1.GlobalVariables.authBaseUrl; let userTokenName = tokenName ? tokenName : GlobalVariables_1.GlobalVariables.tokenUST; let instance = axios_1.default.create(); if (actionName !== 'register' && actionName !== 'login' && actionName !== 'loginToService' && actionName !== 'loginAndGetRefreshToken') { instance.defaults.headers.common['Authorization'] = (0, GlobalVariables_1.getCookie)(userTokenName); } instance.interceptors.response.use((response) => { return response; }, async (error) => { const { config } = error; const originalRequest = config; initialRequest = originalRequest; if ('data' in error.response) { if ('action_error' in error.response.data) { if (error.response.data.action_error.code === 401 && error.response.data.action_error.internal_code === 'ust_expired') { if (!isRefreshing) { isRefreshing = true; this.refreshAccessToken(serviceName).then(() => { isRefreshing = false; }); } return new Promise((resolve, reject) => { this.subscribeTokenRefresh((token) => { originalRequest.headers['Authorization'] = token; (0, GlobalVariables_1.deleteCookie)(serviceName); (0, GlobalVariables_1.setCookie)(serviceName, token) .then(() => { resolve(instance(originalRequest)); refreshSubscribers = []; }) .catch((error) => { reject(error); }); }); }); } else { return Promise.reject(error); } } 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) { instance({ 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()); } }); } } exports.HttpRequest = HttpRequest;