built.io
Version:
SDK for Built.io Backend
83 lines (77 loc) • 2.21 kB
JavaScript
var R = require('ramda');
var when = require('when');
var Events = require('../events');
var utility = require('../utilities/utility');
module.exports.makeCall = R.curry(function(app, object) {
var deferred = when.defer();
var url = object.path;
var path = url.substr(url.search("/v"));
if (object.params) {
for (var property in object.params) {
path = utility.addParam(path, property, object.params);
}
}
function emitFn(socket) {
socket.emit('api', {
headers: object.headers,
method: object.method,
url: path,
body: object.entity
}, function(error, response) {
if (response.statusCode >= 200 && response.statusCode < 300)
deferred.resolve(structureResponse(response));
else
deferred.reject(structureResponse(response));
if (error)
deferred.reject(structureResponse(error));
});
}
if(app.isSocketConnected()) {
emitFn(app.getSocket());
}else{
app.getAdhocOperations().push(emitFn);
}
return deferred.promise;
});
function structureResponse(response) {
return {
headers : response.headers,
status : response.statusCode,
entity : response.body
}
}
module.exports.makeXMLHttpRequest = function(object) {
Events.trigger("upload:start");
var http = new XMLHttpRequest();
http.open('POST', object.url, true);
for (var header in object.headers) {
http.setRequestHeader(header, object.headers[header]);
}
var deferred = registerHttpListeners(http);
http.upload.onprogress = function(e) {
deferred.notify({
bytesUploaded: e.loaded,
bytesTotal: e.total,
timestamp: e.timeStamp
});
}
http.send(object.formData);
return deferred.promise;
}
function registerHttpListeners(http){
var deferred = when.defer();
http.onreadystatechange = function (e) {
if(http.readyState == 4){
if (http.status >= 200 && http.status <300) {
Events.trigger("upload:end");
deferred.resolve(http.responseText);
} else{
deferred.reject(http.statusText);
}
}
};
http.ontimeout = http.onerror= function (event) {
deferred.reject(http.statusText);
}
return deferred;
}