UNPKG

@prefect9/browser-api

Version:

Browser API inteface

162 lines (161 loc) 7.87 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ParseError = void 0; exports.Request = Request; require("core-js/modules/es.symbol.description.js"); require("core-js/modules/es.array.includes.js"); require("core-js/modules/es.promise.js"); require("core-js/modules/es.regexp.exec.js"); require("core-js/modules/es.regexp.test.js"); require("core-js/modules/web.dom-collections.iterator.js"); var _isType = require("@prefect9/is-type"); const ParseError = exports.ParseError = function ParseError(e) { let fieldsSetters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; let mainSetter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; if (!e && (0, _isType.isFunc)(mainSetter)) mainSetter('Unknown error');else if ((0, _isType.isStr)(e) && (0, _isType.isFunc)(mainSetter)) mainSetter(e);else if ((0, _isType.isObj)(e) && e.status === 'error_fields') { const unprocessedFields = []; for (let fieldName in e.fields) { if (fieldsSetters && (0, _isType.isObj)(fieldsSetters) && (0, _isType.isFunc)(fieldsSetters[fieldName])) fieldsSetters[fieldName](e.fields[fieldName]);else unprocessedFields.push(e.fields[fieldName]); } if ((0, _isType.isStr)(e.description) && e.description.length) unprocessedFields.push(e.description); if (unprocessedFields.length && (0, _isType.isFunc)(mainSetter)) mainSetter(unprocessedFields.join('. ')); } else if ((0, _isType.isObj)(e) && e.status === 'error_text' && e.description && (0, _isType.isFunc)(mainSetter)) mainSetter(e.description);else if ((0, _isType.isObj)(e) && e.constructor.name === 'Error') mainSetter(e.message);else { console.log('--- CANT PROCESING ERROR ---'); console.log(e); console.log(fieldsSetters); console.log(mainSetter); console.log('------ ------'); throw new Error('Cant processing error | See log'); } }; function ErrorDescription(description) { return { status: 'error_text', description }; } function ErrorFields(fields) { return { status: 'error_fields', fields }; } function Request(_ref) { let { method = 'GET', url, body = null, bodyType = null, headers = {}, bearer = null, onProgress: progressHandler, isConfig = false } = _ref; method = method.toUpperCase(); if (!['GET', 'POST', 'DELETE'].includes(method)) throw new Error('Invalid request method'); if (!(0, _isType.isStr)(url) || !url.length) throw new Error('Invalid request url'); if (!(0, _isType.isObj)(headers)) throw new Error('Invalid request headers'); if (bodyType === null && method === 'GET') bodyType = 'query'; if (bodyType === null && method === 'POST') bodyType = 'x-www-form-urlencoded'; let formattedBody = null; if (['query', 'x-www-form-urlencoded'].includes(bodyType)) { const serializeArray = (key, arr) => { if (!(0, _isType.isArr)(arr)) throw new Error('I can serialize only array'); if (!arr.length) return "".concat(key, "="); const result = []; for (let value of arr) { if (!(0, _isType.isNum)(value) && !(0, _isType.isStr)(value) && !(0, _isType.isBool)(value) && value !== null) { console.warn("Was ignored request array[".concat(key, "] parametr value:")); console.warn(value); continue; } result.push("".concat(key, "[]=").concat(value)); } return result.join('&'); }; const serializeObject = (key, obj) => { if (!(0, _isType.isObj)(obj)) throw new Error('I can serialize only object values'); const result = []; for (const localKey in obj) { const value = obj[localKey]; if (!(0, _isType.isNum)(value) && !(0, _isType.isStr)(value) && !(0, _isType.isBool)(value) && value !== null) { console.warn("Was ignored request object[".concat(key, "] parametr:")); console.warn(localKey); console.warn('With value:'); console.warn(value); } result.push("".concat(key, "[").concat(localKey, "]=").concat(value)); } return result.join('&'); }; if ((0, _isType.isObj)(body)) { formattedBody = []; for (let key in body) { if ((0, _isType.isNum)(body[key]) || (0, _isType.isStr)(body[key]) || (0, _isType.isBool)(body[key]) || body[key] === null) formattedBody.push("".concat(key, "=").concat(body[key]));else if ((0, _isType.isArr)(body[key])) formattedBody.push(serializeArray(key, body[key]));else if ((0, _isType.isObj)(body[key])) formattedBody.push(serializeObject(key, body[key]));else { console.warn('Was ignored request body parametr:'); console.warn(key); console.warn('With value:'); console.warn(body[key]); } } formattedBody = formattedBody.join('&'); headers['Content-Type'] = 'application/x-www-form-urlencoded'; } else if (body !== null) throw new Error('Invalid body for urlencoded request'); if (bodyType === 'query' && (0, _isType.isStr)(formattedBody) && formattedBody.length) { if (/\?$/.test(url)) url += formattedBody;else if (/\?/.test(url)) url += "&".concat(formattedBody);else url += "?".concat(formattedBody); formattedBody = null; } } else if (bodyType === 'form-data') { if ((0, _isType.isObj)(body)) { formattedBody = new FormData(); for (let key in body) { if ((0, _isType.isNum)(body[key]) || (0, _isType.isStr)(body[key]) || (0, _isType.isFile)(body[key]) || body[key] === null) formattedBody.append(key, body[key] === null ? '' : body[key]);else if ((0, _isType.isArr)(body[key])) { for (let subValue of body[key]) { if ((0, _isType.isNum)(subValue) || (0, _isType.isStr)(subValue) || (0, _isType.isFile)(subValue) || subValue === null) formattedBody.append("".concat(key, "[]"), subValue === null ? '' : subValue);else { console.log('Was ignored request subValue parametr:'); console.log("".concat(key, "[]")); console.log('With value:'); console.log(subValue); } } } else { console.log('Was ignored request body parametr:'); console.log(key); console.log('With value:'); console.log(body[key]); } } //headers['Content-Type'] = 'multipart/form-data' } else if (body !== null) throw new Error('Invalid body for formdata request'); } else if (body !== null) throw new Error('Invalid request bodyType'); if (bearer && (0, _isType.isStr)(bearer)) headers['Authorization'] = "Bearer ".concat(bearer); const xhr = new XMLHttpRequest(); xhr.open(method, url, true); for (let headerName in headers) xhr.setRequestHeader(headerName, headers[headerName]); let resolve, reject; const promise = new Promise((_resolve, _reject) => { resolve = _resolve; reject = _reject; }); if (progressHandler && (0, _isType.isFunc)(progressHandler)) { xhr.upload.onprogress = e => { const percent = e.loaded * 100 / e.total; progressHandler(percent); }; } xhr.onload = () => { if (xhr.status !== 200) return reject(ErrorDescription("Invalid response status | ".concat(xhr.status))); let response = xhr.response; try { response = JSON.parse(response); } catch (e) { return reject(ErrorDescription('Invalid response JSON')); } if (isConfig) return resolve(response); if (response.status === 'ok') resolve(response.data);else if (response.status === 'error' && (0, _isType.isObj)(response.fields)) reject(ErrorFields(response.fields));else if (response.status === 'error' && (0, _isType.isStr)(response.description)) reject(ErrorDescription(response.description));else reject(ErrorDescription("Invalid server response")); }; xhr.send(formattedBody); return promise; }