on c8eeedf help sign in
63 lines 2.1 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 List = Elm.List.make(elm);
9 var Signal = Elm.Signal.make(elm);
11 function registerReq(queue,responses) {
12 return function(req) {
13 if (req.url.length > 0) {
14 sendReq(queue,responses,req);
15 }
16 };
17 }
19 function updateQueue(queue,responses) {
20 if (queue.length > 0) {
21 elm.notify(responses.id, queue[0].value);
22 if (queue[0].value.ctor !== 'Waiting') {
23 queue.shift();
24 setTimeout(function() { updateQueue(queue,responses); }, 0);
25 }
26 }
27 }
29 function sendReq(queue,responses,req) {
30 var response = { value: { ctor:'Waiting' } };
31 queue.push(response);
33 var request = (window.ActiveXObject
34 ? new ActiveXObject("Microsoft.XMLHTTP")
35 : new XMLHttpRequest());
37 request.onreadystatechange = function(e) {
38 if (request.readyState === 4) {
39 response.value = (request.status >= 200 && request.status < 300 ?
40 { ctor:'Success', _0:request.responseText } :
41 { ctor:'Failure', _0:request.status, _1:request.statusText });
42 setTimeout(function() { updateQueue(queue,responses); }, 0);
43 }
44 };
45 request.open(req.verb, req.url, true);
46 function setHeader(pair) {
47 request.setRequestHeader( pair._0, pair._1 );
48 }
49 A2( List.map, setHeader, req.headers );
50 request.send(req.body);
51 }
53 function send(requests) {
54 var responses = Signal.constant(elm.Http.values.Waiting);
55 var sender = A2( Signal.lift, registerReq([],responses), requests );
56 function f(x) { return function(y) { return x; } }
57 return A3( Signal.lift2, f, responses, sender );
58 }
60 return elm.Native.Http.values = {
61 send:send
62 };
63};