on 83142e4 help sign in
elk/core/Native/HTTP.js
62 lines 1.8 kB history raw
2/*
3import JavaScript
4import List
5import Signal
6*/
8(function() {
9 'use strict';
11 function registerReq(queue,responses) { return function(req) {
12 if (req.url !== "") { sendReq(queue,responses,req); }
13 };
14 }
16 function updateQueue(queue,responses) {
17 if (queue.length > 0) {
18 Dispatcher.notify(responses.id, queue[0].value);
19 if (queue[0].value.ctor !== Waiting) {
20 queue.shift();
21 setTimeout(function() { updateQueue(queue,responses); }, 0);
22 }
23 }
24 }
26 function setHeader(pair) {
27 request.setRequestHeader(Elm.JavaScript.castStringToJSString(pair._0),
28 Elm.JavaScript.castStringToJSString(pair._1));
29 }
31 function sendReq(queue,responses,req) {
32 var JS = Elm.JavaScript;
33 var response = { value: Elm.HTTP.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
42 ? Elm.HTTP.Success(JS.castJSStringToString(request.responseText))
43 : Elm.HTTP.Failure(request.status)(JS.castJSStringToString(request.statusText)));
44 setTimeout(function() { updateQueue(queue,responses); }, 0);
45 }
46 };
47 request.open(JS.castStringToJSString(req.verb),
48 JS.castStringToJSString(req.url),
49 true);
50 Elm.List.map(setHeader)(req.headers);
51 request.send(JS.castStringToJSString(req.body));
52 }
54 function send(requests) {
55 var responses = Elm.Signal.constant(Elm.HTTP.Waiting);
56 var sender = Elm.Signal.lift(registerReq([],responses))(requests);
57 function f(x) { return function(y) { return x; } }
58 return Elm.Signal.lift2(f)(responses)(sender);
59 }
61 Elm.Native.HTTP = {send:send};
62}());