elm/core-js/Signal/HTTP.js

58 lines
1.8 KiB
JavaScript

Elm.HTTP = function() {
var toElmString = Elm.JavaScript.castJSStringToString;
function request(verb) { return function(url) { return function(data) {
return function(headers) {
return {0 : "Request",
length : 1,
verb : JS.castStringToJSString(verb),
url : JS.castStringToJSString(url),
data : data === null ? null : JS.castStringToJSString(data),
headers : headers }; }; }; };
}
function get(url) { return request("GET")(url)(null)(["Nil"]); }
function post(url) { return function(data) {
return request("POST")(url)(data)(["Nil"]); }; }
function sendReq(responses) { return function(req) {
Dispatcher.notify(responses.id,["Waiting"]);
var request = null;
if (window.XMLHttpRequest) {
request = new XMLHttpRequest();
} else if (window.ActiveXObject) {
request = new ActiveXObject("Microsoft.XMLHTTP");
}
request.onreadystatechange = function(e) {
if (request.readyState === 4) {
Dispatcher.notify(
responses.id,
request.status === 200
? ["Success", toElmString(request.responseText)]
: ["Failure", request.status, toElmString(request.statusText)]);
}
};
request.open(req.verb, req.url, true);
List.map(function(pair) {
request.setRequestHeader(
JS.castStringToJSString(pair[1]),
JS.castStringToJSString(pair[2]));
})(req.headers);
request.send(req.data);
return null;
};
}
function send(requests) {
var responses = Elm.Signal.constant(["Waiting"]);
var sender = Elm.Signal.lift(sendReq(responses))(requests);
function f(x) { return function(y) { return x; } }
var combine = Elm.Signal.lift2(f)(responses)(sender);
return combine;
}
return {get : get,
post : post,
request : request,
send : send,
sendGet : function(urls){return send(Elm.Signal.lift(get)(urls));}
};
}();