@prefect9/browser-api
Version:
Browser API inteface
162 lines (161 loc) • 7.87 kB
JavaScript
;
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;
}