text: 'use strict';var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
      if (typeof Reflect === "object" && typeof Reflect.decorate === "function") return Reflect.decorate(decorators, target, key, desc);
      switch (arguments.length) {
          case 2: return decorators.reduceRight(function(o, d) { return (d && d(o)) || o; }, target);
          case 3: return decorators.reduceRight(function(o, d) { return (d && d(target, key)), void 0; }, void 0);
          case 4: return decorators.reduceRight(function(o, d) { return (d && d(target, key, o)) || o; }, desc);
      }
  };
  var __metadata = (this && this.__metadata) || function (k, v) {
      if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  };
  var enums_1 = require('../enums');
  var static_response_1 = require('../static_response');
  var base_response_options_1 = require('../base_response_options');
  var angular2_1 = require('angular2/angular2');
  var browser_xhr_1 = require('./browser_xhr');
  var lang_1 = require('angular2/src/core/facade/lang');
  // todo(robwormald): temporary until https://github.com/angular/angular/issues/4390 decided
  var Rx = require('@reactivex/rxjs/dist/cjs/Rx');
  var Observable = Rx.Observable;
  /**
  * Creates connections using `XMLHttpRequest`. Given a fully-qualified
  * request, an `XHRConnection` will immediately create an `XMLHttpRequest` object and send the
  * request.
  *
  * This class would typically not be created or interacted with directly inside applications, though
  * the {@link MockConnection} may be interacted with in tests.
  */
  var XHRConnection = (function () {
      function XHRConnection(req, browserXHR, baseResponseOptions) {
          var _this = this;
          this.request = req;
          this.response = new Observable(function (responseObserver) {
              var _xhr = browserXHR.build();
              _xhr.open(enums_1.RequestMethods[req.method].toUpperCase(), req.url);
              // load event handler
              var onLoad = function () {
                  // responseText is the old-school way of retrieving response (supported by IE8 & 9)
                  // response/responseType properties were introduced in XHR Level2 spec (supported by
                  // IE10)
                  var response = lang_1.isPresent(_xhr.response) ? _xhr.response : _xhr.responseText;
                  // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)
                  var status = _xhr.status === 1223 ? 204 : _xhr.status;
                  // fix status code when it is 0 (0 status is undocumented).
                  // Occurs when accessing file resources or on Android 4.1 stock browser
                  // while retrieving files from application cache.
                  if (status === 0) {
                      status = response ? 200 : 0;
                  }
                  var responseOptions = new base_response_options_1.ResponseOptions({ body: response, status: status });
                  if (lang_1.isPresent(baseResponseOptions)) {
                      responseOptions = baseResponseOptions.merge(responseOptions);
                  }
                  responseObserver.next(new static_response_1.Response(responseOptions));
                  // TODO(gdi2290): defer complete if array buffer until done
                  responseObserver.complete();
              };
              // error event handler
              var onError = function (err) {
                  var responseOptions = new base_response_options_1.ResponseOptions({ body: err, type: enums_1.ResponseTypes.Error });
                  if (lang_1.isPresent(baseResponseOptions)) {
                      responseOptions = baseResponseOptions.merge(responseOptions);
                  }
                  responseObserver.error(new static_response_1.Response(responseOptions));
              };
              if (lang_1.isPresent(req.headers)) {
                  req.headers.forEach(function (values, name) { return _xhr.setRequestHeader(name, values.join(',')); });
              }
              _xhr.addEventListener('load', onLoad);
              _xhr.addEventListener('error', onError);
              _xhr.send(_this.request.text());
              return function () {
                  _xhr.removeEventListener('load', onLoad);
                  _xhr.removeEventListener('error', onError);
                  _xhr.abort();
              };
          });
      }
      return XHRConnection;
  })();
  exports.XHRConnection = XHRConnection;
  /**
   * Creates {@link XHRConnection} instances.
   *
   * This class would typically not be used by end users, but could be
   * overridden if a different backend implementation should be used,
   * such as in a node backend.
   *
   * #Example
   *
   * ```
   * import {Http, MyNodeBackend, HTTP_PROVIDERS, BaseRequestOptions} from 'angular2/http';
   * @Component({
   *   viewProviders: [
   *     HTTP_PROVIDERS,
   *     provide(Http, {useFactory: (backend, options) => {
   *       return new Http(backend, options);
   *     }, deps: [MyNodeBackend, BaseRequestOptions]})]
   * })
   * class MyComponent {
   *   constructor(http:Http) {
   *     http('people.json').subscribe(res => this.people = res.json());
   *   }
   * }
   * ```
   *
   **/
  var XHRBackend = (function () {
      function XHRBackend(_browserXHR, _baseResponseOptions) {
          this._browserXHR = _browserXHR;
          this._baseResponseOptions = _baseResponseOptions;
      }
      XHRBackend.prototype.createConnection = function (request) {
          return new XHRConnection(request, this._browserXHR, this._baseResponseOptions);
      };
      XHRBackend = __decorate([
          angular2_1.Injectable(), 
          __metadata('design:paramtypes', [browser_xhr_1.BrowserXhr, base_response_options_1.ResponseOptions])
      ], XHRBackend);
      return XHRBackend;
  })();
  exports.XHRBackend = XHRBackend;
  //# sourceMappingURL=xhr_backend.js.map