UNPKG

@cycjimmy/mini-xhr

Version:

A very lightweight javascript library for HTTP requests.

304 lines (289 loc) 8.71 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); /** * objectIterate * @param obj * @param fn */ var objectIterate = function objectIterate(obj, fn) { // eslint-disable-next-line no-restricted-syntax for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { fn.call(null, obj[key], key, obj); } } }; /** * Params String Make Up * @param params * @returns {string} */ var paramsStringMakeUp = function paramsStringMakeUp() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; // set data string var sParams = ''; objectIterate(params, function (value, key) { var prefix = ''; if (sParams) { // not first key prefix = '&'; } sParams += "".concat(prefix + key, "=").concat(value); }); return sParams; }; /** * get Global * @returns {any} */ var getGlobal = function getGlobal() { return typeof window === 'undefined' ? global : window; }; /** * XMLHttpRequest * @param method default 'GET' * @param url * @param timeout * @param ontimeoutCB * @param params * @param dataType 'json'(default) || 'formData' || 'text' * @param data * @param formData * @param responseType 'arraybuffer' || 'document' || 'json'(default) || * 'text' || 'stream' || 'blob' * @param contentType default 'application/json; charset=UTF-8' * @param headers default {} * @param success * @param fail * @returns {XMLHttpRequest} */ var _XMLHttpRequest = (function (_ref) { var _ref$method = _ref.method, method = _ref$method === void 0 ? 'GET' : _ref$method, url = _ref.url, _ref$timeout = _ref.timeout, timeout = _ref$timeout === void 0 ? 0 : _ref$timeout, _ref$ontimeoutCB = _ref.ontimeoutCB, ontimeoutCB = _ref$ontimeoutCB === void 0 ? null : _ref$ontimeoutCB, _ref$params = _ref.params, params = _ref$params === void 0 ? {} : _ref$params, _ref$dataType = _ref.dataType, dataType = _ref$dataType === void 0 ? 'json' : _ref$dataType, data = _ref.data, _ref$responseType = _ref.responseType, responseType = _ref$responseType === void 0 ? 'json' : _ref$responseType, _ref$contentType = _ref.contentType, contentType = _ref$contentType === void 0 ? 'application/json; charset=UTF-8' : _ref$contentType, _ref$headers = _ref.headers, headers = _ref$headers === void 0 ? {} : _ref$headers, _ref$success = _ref.success, success = _ref$success === void 0 ? function () {} : _ref$success, _ref$fail = _ref.fail, fail = _ref$fail === void 0 ? function () {} : _ref$fail; var xhr = new XMLHttpRequest(); var sParams = paramsStringMakeUp(params); xhr.open(method, sParams ? "".concat(url, "?").concat(paramsStringMakeUp(params)) : url, true); xhr.onreadystatechange = function () { if (xhr.readyState !== 4) { return; } if (xhr.status >= 200 && xhr.status < 400) { success(xhr.response); } else { var statusText = xhr.statusText, status = xhr.status; fail({ statusText: status ? statusText : 'timeout', status: status }); } }; xhr.timeout = timeout; if (ontimeoutCB) { xhr.ontimeout = ontimeoutCB; } xhr.responseType = responseType; if (contentType) { xhr.setRequestHeader('Content-Type', contentType); } // set custom headers objectIterate(headers, function (value, key) { xhr.setRequestHeader(key, value); }); switch (dataType) { case 'json': xhr.setRequestHeader('Accept', 'application/json'); xhr.send(JSON.stringify(data)); break; case 'text': case 'formData': xhr.setRequestHeader('Accept', '*/*'); xhr.send(data); break; default: xhr.send(data); } return xhr; }); /** * get * @param url * @param dataType * @param params * @param headers * @param contentType * @param responseType * @param timeout * @param ontimeoutCB * @returns {Promise<unknown>} */ var get = function get(url) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$params = _ref.params, params = _ref$params === void 0 ? {} : _ref$params, _ref$headers = _ref.headers, headers = _ref$headers === void 0 ? {} : _ref$headers, contentType = _ref.contentType, _ref$responseType = _ref.responseType, responseType = _ref$responseType === void 0 ? 'json' : _ref$responseType, _ref$timeout = _ref.timeout, timeout = _ref$timeout === void 0 ? 0 : _ref$timeout, _ref$ontimeoutCB = _ref.ontimeoutCB, ontimeoutCB = _ref$ontimeoutCB === void 0 ? null : _ref$ontimeoutCB; return Promise.resolve().then(function () { return new Promise(function (resolve, reject) { _XMLHttpRequest({ method: 'GET', url: url, params: params, contentType: contentType, headers: headers, responseType: responseType, timeout: timeout, ontimeoutCB: ontimeoutCB, success: function success(res) { return resolve(res); }, fail: function fail(err) { return reject(err); } }); }); }); }; /** * post * @param url * @param params * @param data * @param dataType * @param headers * @param contentType * @param responseType * @param timeout * @param ontimeoutCB * @returns {Promise<unknown>} */ var post = function post(url) { var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref2$params = _ref2.params, params = _ref2$params === void 0 ? {} : _ref2$params, _ref2$data = _ref2.data, data = _ref2$data === void 0 ? {} : _ref2$data, _ref2$dataType = _ref2.dataType, dataType = _ref2$dataType === void 0 ? 'json' : _ref2$dataType, _ref2$headers = _ref2.headers, headers = _ref2$headers === void 0 ? {} : _ref2$headers, contentType = _ref2.contentType, _ref2$responseType = _ref2.responseType, responseType = _ref2$responseType === void 0 ? 'json' : _ref2$responseType, _ref2$timeout = _ref2.timeout, timeout = _ref2$timeout === void 0 ? 0 : _ref2$timeout, _ref2$ontimeoutCB = _ref2.ontimeoutCB, ontimeoutCB = _ref2$ontimeoutCB === void 0 ? null : _ref2$ontimeoutCB; return Promise.resolve().then(function () { return new Promise(function (resolve, reject) { _XMLHttpRequest({ method: 'POST', url: url, params: params, data: data, dataType: dataType, headers: headers, contentType: contentType, responseType: responseType, timeout: timeout, ontimeoutCB: ontimeoutCB, success: function success(res) { return resolve(res); }, fail: function fail(err) { return reject(err); } }); }); }); }; /** * jsonp * @param url * @param params * @param timeout * @returns {Promise<any | never>} */ var jsonp = function jsonp(url) { var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref3$params = _ref3.params, params = _ref3$params === void 0 ? {} : _ref3$params, _ref3$timeout = _ref3.timeout, timeout = _ref3$timeout === void 0 ? 5e3 : _ref3$timeout; var jsonpNameSpace = getGlobal(); var STR_ERROR = 'error'; var STR_TIMEOUT = 'timeout'; return Promise.resolve().then(function () { return new Promise(function (resolve, reject) { var oHead = document.querySelector('head'); var oScript = document.createElement('script'); var sParams = paramsStringMakeUp(params); oScript.src = url; oScript.type = 'text/javascript'; var callbackName = "jsonp_".concat(Math.random()).replace('.', ''); function clearScript() { oHead.removeChild(oScript); clearTimeout(oScript.timer); jsonpNameSpace[callbackName] = null; } // jsonp callback function jsonpNameSpace[callbackName] = function (json) { clearScript(); resolve(json); }; // set oScript.src if (sParams) { oScript.src += "?".concat(sParams, "&callback=").concat(callbackName); } else { oScript.src += "?callback=".concat(callbackName); } // timeout handle oScript.timer = setTimeout(function () { clearScript(); reject(STR_TIMEOUT); }, timeout); oScript.addEventListener('error', function () { clearScript(); reject(STR_ERROR); }); // send oHead.appendChild(oScript); }); }); }; var index = { get: get, post: post, jsonp: jsonp }; exports.default = index; exports.get = get; exports.jsonp = jsonp; exports.post = post;