elm/libraries/Native/Signal/Http.js

68 lines
2 KiB
JavaScript
Raw Normal View History

/**
import JavaScript
import List
import Signal
**/
Elm.Native.Signal.Http = function(elm) {
'use strict';
elm.Native = elm.Native || {};
elm.Native.Signal = elm.Native.Signal || {};
if (elm.Native.Signal.Http) return elm.Native.Signal.Http;
function registerReq(queue,responses) { return function(req) {
if (req.url !== "") { sendReq(queue,responses,req); }
};
}
function updateQueue(queue,responses) {
if (queue.length > 0) {
elm.notify(responses.id, queue[0].value);
if (queue[0].value.ctor !== Waiting) {
queue.shift();
setTimeout(function() { updateQueue(queue,responses); }, 0);
}
}
}
function setHeader(pair) {
request.setRequestHeader(elm.JavaScript.fomString(pair._0),
elm.JavaScript.fromString(pair._1));
}
function sendReq(queue,responses,req) {
var JS = elm.JavaScript;
var response = { value: elm.Http.Waiting };
queue.push(response);
var request = null;
if (window.ActiveXObject) { request = new ActiveXObject("Microsoft.XMLHTTP"); }
if (window.XMLHttpRequest) { request = new XMLHttpRequest(); }
request.onreadystatechange = function(e) {
if (request.readyState === 4) {
response.value = (request.status === 200
? elm.Http.Success(JS.castJSStringToString(request.responseText))
: elm.Http.Failure(request.status)(JS.castJSStringToString(request.statusText)));
setTimeout(function() { updateQueue(queue,responses); }, 0);
}
};
request.open(JS.castStringToJSString(req.verb),
JS.castStringToJSString(req.url),
true);
elm.List.map(setHeader)(req.headers);
request.send(JS.castStringToJSString(req.body));
}
function send(requests) {
var responses = elm.Signal.constant(elm.Http.Waiting);
var sender = elm.Signal.lift(registerReq([],responses))(requests);
function f(x) { return function(y) { return x; } }
return elm.Signal.lift2(f)(responses)(sender);
}
return elm.Native.Signal.Http = {send:send};
};