<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();

const kPrivate = Symbol("XMLHttpRequestPrivate");

class Private {
  constructor() {
    this.networkService = shell.connectToService(
      "mojo:network_service", net.NetworkService);
    this.request = null;
    this.loader = null;
    this.headers = new Map();
    this.responseText = "";
  }
}

class XMLHttpRequest {
  constructor() {
    this[kPrivate] = new Private;
  }

  onload() {
  }

  onerror(error) {
  }

  get responseText() {
    return this[kPrivate].responseText;
  }

  open(method, url) {
    var request = new loader.URLRequest();
    request.url = new URL(url, document.URL);
    request.method = method;
    request.auto_follow_redirects = true;

    var priv = this[kPrivate];
    priv.request = request;
    priv.headers.clear();
  }

  setRequestHeader(header, value) {
    this[kPrivate].headers.set(header, value);
  }

  send() {
    var priv = this[kPrivate];
    var requestHeaders = [];
    priv.headers.forEach(function(value, key) {
      requestHeaders.push(key + ': ' + value);
    });
    priv.request.headers = requestHeaders;

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

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

module.exports = XMLHttpRequest;
</script>
