@nsmp/js-api
Version:
Types for jsApi
98 lines (80 loc) • 2.73 kB
JavaScript
import {restUrl} from '../constants';
/**
* @param {IJsApi} publicJsApi
* @param {PartialJsApi} partialJsApi
* @returns {IJsApi}
*/
export const deepMergeJsApi = (publicJsApi, partialJsApi) => {
const result = {...publicJsApi};
Object.keys(partialJsApi).forEach(key => {
if (partialJsApi[key] && typeof partialJsApi[key] === 'object') {
result[key] = deepMergeJsApi(publicJsApi[key], partialJsApi[key]);
} else {
result[key] = partialJsApi[key];
}
});
return result;
};
/**
* @returns {string}
*/
export const getAppBaseUrl = () => {
const baseUrl = process.env.APP_URL;
let result = '';
// Минимальная проверка на то, что ссылка имеет вид: http(s)://domain(:port)(/)
const regexUrl = /^(https?:\/\/[a-zA-Z0-9:.-]+\/?)$/;
if (baseUrl && regexUrl.test(baseUrl)) {
const sd = 'sd';
result = baseUrl.endsWith('/') ? `${baseUrl}${sd}/` : `${baseUrl}/${sd}/`;
} else {
alert('Ссылка на приложение не передана или имеет неверный формат');
}
return result;
};
/**
* @param {XMLHttpRequest} response
* @returns {MakePromiseReject}
*/
export const getRestError = response => ({
responseText: response.responseText,
status: response.status,
statusText: response.statusText
});
/**
* @param {string} url
* @param {RestCallOptions | MakeOptions} options
* @param {boolean} isJson
* @param {boolean} isExecMF
* @template T
* @returns {Promise<T>}
*/
export const makeResponse = async (url, options, isJson = false, isExecMF = false) => new Promise((resolve, reject) => {
const {url: makeUrl, method = 'GET', headers, body, responseType} = options || {};
const requestBody = typeof body === 'object' ? JSON.stringify(body) : body;
const requestUrl = makeUrl || `${restUrl}${url}${isExecMF ? '?' : '&'}accessKey=${process.env.ACCESS_KEY}`;
const xhr = new XMLHttpRequest();
xhr.open(method, requestUrl, true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.setRequestHeader('embeddedApplicationCode', process.env.APP_CODE);
if (headers) {
Object.entries(headers).forEach(([header, value]) => {
xhr.setRequestHeader(header, value);
});
}
xhr.responseType = 'text';
xhr.onreadystatechange = async () => {
if (xhr.readyState === XMLHttpRequest.DONE) {
if (xhr.status >= 200 && xhr.status < 300) {
const response = xhr.response;
const shouldParseToJson = isJson || responseType === 'json';
if (isExecMF) {
resolve(JSON.parse(JSON.parse(response)));
}
resolve(shouldParseToJson ? JSON.parse(response) : response);
} else {
reject(isJson ? getRestError(xhr) : xhr.responseText);
}
}
};
xhr.send(requestBody);
});