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