h54s
Version:
HTML5 Data Adapter for SAS
144 lines (133 loc) • 4.05 kB
JavaScript
module.exports = function () {
let timeout = 30000;
let timeoutHandle;
const xhr = function (type, url, data, multipartFormData, headers = {}) {
const methods = {
success: function () {
},
error: function () {
}
};
const XHR = XMLHttpRequest;
const request = new XHR('MSXML2.XMLHTTP.3.0');
request.open(type, url, true);
//multipart/form-data is set automatically so no need for else block
// Content-Type header has to be explicitly set up
if (!multipartFormData) {
if (headers['Content-Type']) {
request.setRequestHeader('Content-Type', headers['Content-Type'])
} else {
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
}
}
Object.keys(headers).forEach(key => {
if (key !== 'Content-Type') {
request.setRequestHeader(key, headers[key])
}
})
request.onreadystatechange = function () {
if (request.readyState === 4) {
clearTimeout(timeoutHandle);
if (request.status >= 200 && request.status < 300) {
methods.success.call(methods, request);
} else {
methods.error.call(methods, request);
}
}
};
if (timeout > 0) {
timeoutHandle = setTimeout(function () {
request.abort();
}, timeout);
}
request.send(data);
return {
success: function (callback) {
methods.success = callback;
return this;
},
error: function (callback) {
methods.error = callback;
return this;
}
};
};
const serialize = function (obj) {
const str = [];
for (let p in obj) {
if (obj.hasOwnProperty(p)) {
if (obj[p] instanceof Array) {
for (let i = 0, n = obj[p].length; i < n; i++) {
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p][i]));
}
} else {
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
}
}
}
return str.join("&");
};
const createMultipartFormDataPayload = function (obj) {
let data = new FormData();
for (let p in obj) {
if (obj.hasOwnProperty(p)) {
if (obj[p] instanceof Array && p !== 'file') {
for (let i = 0, n = obj[p].length; i < n; i++) {
data.append(p, obj[p][i]);
}
} else if (p === 'file') {
data.append(p, obj[p][0], obj[p][1]);
} else {
data.append(p, obj[p]);
}
}
}
return data;
};
return {
get: function (url, data, multipartFormData, headers) {
let dataStr;
if (typeof data === 'object') {
dataStr = serialize(data);
}
const urlWithParams = dataStr ? (url + '?' + dataStr) : url;
return xhr('GET', urlWithParams, null, multipartFormData, headers);
},
post: function(url, data, multipartFormData, headers) {
let payload = data;
if(typeof data === 'object') {
if(multipartFormData) {
payload = createMultipartFormDataPayload(data);
} else {
payload = serialize(data);
}
}
return xhr('POST', url, payload, multipartFormData, headers);
},
put: function(url, data, multipartFormData, headers) {
let payload = data;
if(typeof data === 'object') {
if(multipartFormData) {
payload = createMultipartFormDataPayload(data);
}
}
return xhr('PUT', url, payload, multipartFormData, headers);
},
delete: function(url, payload, multipartFormData, headers) {
return xhr('DELETE', url, payload, null, headers);
},
patch: function(url, data, multipartFormData, headers) {
let payload = data;
if(typeof data === 'object') {
if(multipartFormData) {
payload = createMultipartFormDataPayload(data);
}
}
return xhr('PATCH', url, payload, multipartFormData, headers);
},
setTimeout: function (t) {
timeout = t;
},
serialize
};
};