on 9084db2 help sign in
67 lines 2.0 kB history raw
2/**
3import JavaScript
4import List
5import Signal
6**/
8Elm.Native.Signal.Http = function(elm) {
9 'use strict';
10 elm.Native = elm.Native || {};
11 elm.Native.Signal = elm.Native.Signal || {};
12 if (elm.Native.Signal.Http) return elm.Native.Signal.Http;
15 function registerReq(queue,responses) { return function(req) {
16 if (req.url !== "") { sendReq(queue,responses,req); }
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 setHeader(pair) {
31 request.setRequestHeader(elm.JavaScript.fomString(pair._0),
32 elm.JavaScript.fromString(pair._1));
33 }
35 function sendReq(queue,responses,req) {
36 var JS = elm.JavaScript;
37 var response = { value: elm.Http.Waiting };
38 queue.push(response);
40 var request = null;
41 if (window.ActiveXObject) { request = new ActiveXObject("Microsoft.XMLHTTP"); }
42 if (window.XMLHttpRequest) { request = new XMLHttpRequest(); }
43 request.onreadystatechange = function(e) {
44 if (request.readyState === 4) {
45 response.value = (request.status === 200
46 ? elm.Http.Success(JS.castJSStringToString(request.responseText))
47 : elm.Http.Failure(request.status)(JS.castJSStringToString(request.statusText)));
48 setTimeout(function() { updateQueue(queue,responses); }, 0);
49 }
50 };
51 request.open(JS.castStringToJSString(req.verb),
52 JS.castStringToJSString(req.url),
53 true);
54 elm.List.map(setHeader)(req.headers);
55 request.send(JS.castStringToJSString(req.body));
56 }
58 function send(requests) {
59 var responses = elm.Signal.constant(elm.Http.Waiting);
60 var sender = elm.Signal.lift(registerReq([],responses))(requests);
61 function f(x) { return function(y) { return x; } }
62 return elm.Signal.lift2(f)(responses)(sender);
63 }
65 return elm.Native.Signal.Http = {send:send};
67};