@egalteam/framework-react-native
Version:
Egal
200 lines (199 loc) • 8.55 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 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;