on 35e07ef help sign in
64 lines 2.3 kB history raw
1Elm.Native.Http = {};
2Elm.Native.Http.make = function(elm) {
4 elm.Native = elm.Native || {};
5 elm.Native.Http = elm.Native.Http || {};
6 if (elm.Native.Http.values) return elm.Native.Http.values;
8 var JS = Elm.JavaScript.make(elm);
9 var List = Elm.List.make(elm);
10 var Signal = Elm.Signal.make(elm);
12 function registerReq(queue,responses) {
13 return function(req) {
14 if (req.url.length > 0) {
15 sendReq(queue,responses,req);
16 }
17 };
18 }
20 function updateQueue(queue,responses) {
21 if (queue.length > 0) {
22 elm.notify(responses.id, queue[0].value);
23 if (queue[0].value.ctor !== 'Waiting') {
24 queue.shift();
25 setTimeout(function() { updateQueue(queue,responses); }, 0);
26 }
27 }
28 }
30 function sendReq(queue,responses,req) {
31 var response = { value: { ctor:'Waiting' } };
32 queue.push(response);
34 var request = (window.ActiveXObject
35 ? new ActiveXObject("Microsoft.XMLHTTP")
36 : new XMLHttpRequest());
38 request.onreadystatechange = function(e) {
39 if (request.readyState === 4) {
40 response.value = (request.status >= 200 && request.status < 300 ?
41 { ctor:'Success', _0:JS.toString(request.responseText) } :
42 { ctor:'Failure', _0:request.status, _1:JS.toString(request.statusText) });
43 setTimeout(function() { updateQueue(queue,responses); }, 0);
44 }
45 };
46 request.open(JS.fromString(req.verb), JS.fromString(req.url), true);
47 function setHeader(pair) {
48 request.setRequestHeader( JS.fromString(pair._0), JS.fromString(pair._1) );
49 }
50 List.map(setHeader)(req.headers);
51 request.send(JS.fromString(req.body));
52 }
54 function send(requests) {
55 var responses = Signal.constant(elm.Http.values.Waiting);
56 var sender = A2( Signal.lift, registerReq([],responses), requests );
57 function f(x) { return function(y) { return x; } }
58 return A3( Signal.lift2, f, responses, sender );
59 }
61 return elm.Native.Http.values = {
62 send:send
63 };
64};