@egalteam/framework
Version:
Egal
196 lines (195 loc) • 8.46 kB
JavaScript
;
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;