<import src="/mojo/public/sky/core.sky" as="core" />
<import src="/mojo/public/sky/unicode.sky" as="unicode" />
<import src="/mojo/services/public/interfaces/network/network_service.mojom.sky" as="net" />
<import src="/mojo/services/public/interfaces/network/url_loader.mojom.sky" as="loader" />
<import src="shell.sky" as="shell" />
<script>
// XHR keeps itself alive.
var outstandingRequests = new Set();

function XMLHttpRequest() {
  this.networkService_ = shell.connectToService(
    "mojo:network_service", net.NetworkService);
  this.request_ = null;
  this.loader_ = null;
  this.responseText = null;
  this.headers_ = new Map();
};

XMLHttpRequest.prototype.onload = function() { };
XMLHttpRequest.prototype.onerror = function(error) { };

XMLHttpRequest.prototype.open = function(method, url) {
  this.request_ = new loader.URLRequest();
  this.request_.url = new URL(url, document.URL);
  this.request_.method = method;
  this.request_.auto_follow_redirects = true;
  this.headers_.clear();
};

XMLHttpRequest.prototype.setRequestHeader = function(header, value) {
  this.headers_.set(header, value);
};

XMLHttpRequest.prototype.send = function() {
  var requestHeaders = [];
  this.headers_.forEach(function(value, key) {
    requestHeaders.push(key + ': ' + value);
  });
  this.request_.headers = requestHeaders;

  // FIXME: Factor this into the JS bindings.
  var pipe = new core.createMessagePipe();
  this.networkService_.createURLLoader(pipe.handle1);
  this.loader_ = shell.wrapHandle(pipe.handle0, loader.URLLoader);

  var self = this;
  outstandingRequests.add(this);
  this.loader_.start(this.request_).then(function(result) {
    return core.drainData(result.response.body).then(function(result) {
      outstandingRequests.delete(self);
      self.responseText = unicode.decodeUtf8String(new Uint8Array(result.buffer));
      self.onload();
    });
  }).catch(function(error) {
    outstandingRequests.delete(self);
    self.onerror(error);
  });
};

module.exports = XMLHttpRequest;
</script>
