on 9c105ae help sign in
elk/core/Native/HTTP.js
55 lines 1.8 kB history raw
2function nativeHTTP(elm) {
3 "use strict";
4 var toElmString = Elm.JavaScript.castJSStringToString;
5 var toJSString = Elm.JavaScript.castStringToJSString;
7 function registerReq(queue,responses) { return function(req) {
8 if (req.url !== "") { sendReq(queue,responses,req); }
9 };
10 }
12 function updateQueue(queue,responses) {
13 if (queue.length > 0) {
14 Dispatcher.notify(responses.id, queue[0].value);
15 if (queue[0].value.ctor !== Waiting) {
16 queue.shift();
17 setTimeout(function() { updateQueue(queue,responses); }, 0);
18 }
19 }
20 }
22 function setHeader(pair) {
23 request.setRequestHeader(toJSString(pair._0), toJSString(pair._1));
24 }
26 function sendReq(queue,responses,req) {
27 var response = { value: Elm.HTTP.Waiting };
28 queue.push(response);
30 var request = null;
31 if (window.ActiveXObject) { request = new ActiveXObject("Microsoft.XMLHTTP"); }
32 if (window.XMLHttpRequest) { request = new XMLHttpRequest(); }
33 request.onreadystatechange = function(e) {
34 if (request.readyState === 4) {
35 response.value = (request.status === 200
36 ? Success(toElmString(request.responseText))
37 : Failure(request.status)(toElmString(request.statusText)));
38 setTimeout(function() { updateQueue(queue,responses); }, 0);
39 }
40 };
41 request.open(toJSString(req.verb), toJSString(req.url), true);
42 Elm.List.map(setHeader)(req.headers);
43 request.send(toJSString(req.body));
44 return null;
45 }
47 function send(requests) {
48 var responses = Elm.Signal.constant(Elm.HTTP.Waiting);
49 var sender = Elm.Signal.lift(registerReq([],responses))(requests);
50 function f(x) { return function(y) { return x; } }
51 return Elm.Signal.lift2(f)(responses)(sender);
52 }
54 elm.Native.HTTP = {send:send};