UNPKG

@nsmp/js-api

Version:

Types for jsApi

98 lines (80 loc) 2.73 kB
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); });