on ea8ff38 help sign in
elk/core-js/Signal/HTTP.js
74 lines 2.4 kB history raw
1Elm.HTTP = function() {
2 var JS = Elm.JavaScript;
3 var toElmString = Elm.JavaScript.castJSStringToString;
4 function request(verb) { return function(url) { return function(data) {
5 return function(headers) {
6 return {0 : "Request",
7 length : 1,
8 verb : JS.castStringToJSString(verb),
9 url : JS.castStringToJSString(url),
10 data : data === null ? null : JS.castStringToJSString(data),
11 headers : headers }; }; }; };
12 }
13 /** get :: String -> Request String
14 Create a GET request to the given url.
15 **/
16 function get(url) { return request("GET")(url)(null)(["Nil"]); }
17 function post(url) { return function(data) {
18 return request("POST")(url)(data)(["Nil"]); }; }
20 function registerReq(queue,responses) { return function(req) {
21 if (req.url !== "") { sendReq(queue,responses,req); }
22 };
23 }
25 function updateQueue(queue,responses) {
26 if (queue.length > 0) {
27 Dispatcher.notify(responses.id, queue[0].value);
28 if (queue[0].value[0] !== "Waiting") {
29 queue.shift();
30 setTimeout(function() { updateQueue(queue,responses); }, 0);
31 }
32 }
33 }
35 function sendReq(queue,responses,req) {
36 var response = { value: ["Waiting"] };
37 queue.push(response);
39 var request = null;
40 if (window.ActiveXObject) { request = new ActiveXObject("Microsoft.XMLHTTP"); }
41 if (window.XMLHttpRequest) { request = new XMLHttpRequest(); }
42 request.onreadystatechange = function(e) {
43 if (request.readyState === 4) {
44 response.value = (request.status === 200
45 ? ["Success", toElmString(request.responseText)]
46 : ["Failure", request.status,
47 toElmString(request.statusText)]);
48 setTimeout(function() { updateQueue(queue,responses); }, 0);
49 }
50 };
51 request.open(req.verb, req.url, true);
52 Elm.List.map(function(pair) {
53 request.setRequestHeader(
54 JS.castStringToJSString(pair[1]),
55 JS.castStringToJSString(pair[2]));
56 })(req.headers);
57 request.send(req.data);
58 return null;
59 }
61 function send(requests) {
62 var responses = Elm.Signal.constant(["Waiting"]);
63 var sender = Elm.Signal.lift(registerReq([],responses))(requests);
64 function f(x) { return function(y) { return x; } }
65 return Elm.Signal.lift2(f)(responses)(sender);
66 }
68 return {get : get,
69 post : post,
70 request : request,
71 send : send,
72 sendGet : function(urls){return send(Elm.Signal.lift(get)(urls));}
73 };
74}();