Code coverage report for src/request-message-processor.js

Statements: 98.44% (63 / 64)      Branches: 93.75% (30 / 32)      Functions: 100% (19 / 19)      Lines: 100% (62 / 62)      Ignored: none     

All files » src/ » request-message-processor.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 1421     1   53   1 48     48 10 10     48     1   1   1   1 1     1 1 53   53 53 53     1     3 1   3     1 48   48 48         48 48   48 230     48 38 38 31   7       48 1             48 1             48 2               48 48 47     1   46     47       48   48 48 8 6     8 4       48   48 58     48       1     1        
System.register(['core-js', './http-response-message', 'aurelia-path'], function (_export) {
  'use strict';
 
  var core, HttpResponseMessage, join, buildQueryString, RequestMessageProcessor;
 
  function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 
  function buildFullUrl(message) {
    var url = join(message.baseUrl, message.url),
        qs;
 
    if (message.params) {
      qs = buildQueryString(message.params);
      url = qs ? '' + url + '?' + qs : url;
    }
 
    message.fullUrl = url;
  }
 
  return {
    setters: [function (_coreJs) {
      core = _coreJs['default'];
    }, function (_httpResponseMessage) {
      HttpResponseMessage = _httpResponseMessage.HttpResponseMessage;
    }, function (_aureliaPath) {
      join = _aureliaPath.join;
      buildQueryString = _aureliaPath.buildQueryString;
    }],
    execute: function () {
      RequestMessageProcessor = (function () {
        function RequestMessageProcessor(xhrType, transformers) {
          _classCallCheck(this, RequestMessageProcessor);
 
          this.XHRType = xhrType;
          this.transformers = transformers;
          this.isAborted = false;
        }
 
        RequestMessageProcessor.prototype.abort = function abort() {
          // The logic here is if the xhr object is not set then there is nothing to abort so the intent was carried out
          // Also test if the XHR is UNSENT - if not, it will be aborted in the process() phase
          if (this.xhr && this.xhr.readyState !== XMLHttpRequest.UNSENT) {
            this.xhr.abort();
          }
          this.isAborted = true;
        };
 
        RequestMessageProcessor.prototype.process = function process(client, message) {
          var _this = this;
 
          var promise = new Promise(function (resolve, reject) {
            var xhr = _this.xhr = new _this.XHRType(),
                transformers = _this.transformers,
                i,
                ii;
 
            buildFullUrl(message);
            xhr.open(message.method, message.fullUrl, true);
 
            for (i = 0, ii = transformers.length; i < ii; ++i) {
              transformers[i](client, _this, message, xhr);
            }
 
            xhr.onload = function (e) {
              var response = new HttpResponseMessage(message, xhr, message.responseType, message.reviver);
              if (response.isSuccess) {
                resolve(response);
              } else {
                reject(response);
              }
            };
 
            xhr.ontimeout = function (e) {
              reject(new HttpResponseMessage(message, {
                response: e,
                status: xhr.status,
                statusText: xhr.statusText
              }, 'timeout'));
            };
 
            xhr.onerror = function (e) {
              reject(new HttpResponseMessage(message, {
                response: e,
                status: xhr.status,
                statusText: xhr.statusText
              }, 'error'));
            };
 
            xhr.onabort = function (e) {
              reject(new HttpResponseMessage(message, {
                response: e,
                status: xhr.status,
                statusText: xhr.statusText
              }, 'abort'));
            };
          });
 
          return Promise.resolve(message).then(function (message) {
            var processRequest = function processRequest() {
              if (_this.isAborted) {
                // Some interceptors can delay sending of XHR, so when abort is called
                // before XHR is actually sent we abort() instead send()
                _this.xhr.abort();
              } else {
                _this.xhr.send(message.content);
              }
 
              return promise;
            };
 
            // [ onFullfilled, onReject ] pairs
            var chain = [[processRequest, undefined]];
            // Apply interceptors chain from the message.interceptors
            var interceptors = message.interceptors || [];
            interceptors.forEach(function (interceptor) {
              if (interceptor.request || interceptor.requestError) {
                chain.unshift([interceptor.request ? interceptor.request.bind(interceptor) : undefined, interceptor.requestError ? interceptor.requestError.bind(interceptor) : undefined]);
              }
 
              if (interceptor.response || interceptor.responseError) {
                chain.push([interceptor.response ? interceptor.response.bind(interceptor) : undefined, interceptor.responseError ? interceptor.responseError.bind(interceptor) : undefined]);
              }
            });
 
            var interceptorsPromise = Promise.resolve(message);
 
            while (chain.length) {
              interceptorsPromise = interceptorsPromise.then.apply(interceptorsPromise, chain.shift());
            }
 
            return interceptorsPromise;
          });
        };
 
        return RequestMessageProcessor;
      })();
 
      _export('RequestMessageProcessor', RequestMessageProcessor);
    }
  };
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL2h0dHAtY2xpZW50L3NyYy9yZXF1ZXN0LW1lc3NhZ2UtcHJvY2Vzc29yLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozt5REFnQmEsdUJBQXVCOzs7O0FBWnBDLFdBQVMsWUFBWSxDQUFDLE9BQU8sRUFBQztBQUM1QixRQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ3hDLEVBQUUsQ0FBQzs7QUFFUCxRQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUM7QUFDaEIsUUFBRSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN0QyxTQUFHLEdBQUcsRUFBRSxRQUFNLEdBQUcsU0FBSSxFQUFFLEdBQUssR0FBRyxDQUFDO0tBQ2pDOztBQUVELFdBQU8sQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO0dBQ3ZCOzs7Ozs7aURBYk8sbUJBQW1COzswQkFDbkIsSUFBSTtzQ0FBRSxnQkFBZ0I7OztBQWNqQiw2QkFBdUI7QUFDdkIsaUJBREEsdUJBQXVCLENBQ3RCLE9BQU8sRUFBRSxZQUFZLEVBQUM7Z0NBRHZCLHVCQUF1Qjs7QUFFaEMsY0FBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFDdkIsY0FBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7QUFDakMsY0FBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7U0FDeEI7O0FBTFUsK0JBQXVCLFdBT2xDLEtBQUssR0FBQSxpQkFBRTs7O0FBR0wsY0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxLQUFLLGNBQWMsQ0FBQyxNQUFNLEVBQUM7QUFDM0QsZ0JBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7V0FDbEI7QUFDRCxjQUFJLENB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YmVyZ0VmZmVjdC9Eb2N1bWVudHMvR2l0SHViL1RoZSBEdXJhbmRhbCBQcm9qZWN0L2F1cmVsaWEvaHR0cC1jbGllbnQvc3JjL3JlcXVlc3QtbWVzc2FnZS1wcm9jZXNzb3IuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29yZSBmcm9tICdjb3JlLWpzJztcbmltcG9ydCB7SHR0cFJlc3BvbnNlTWVzc2FnZX0gZnJvbSAnLi9odHRwLXJlc3BvbnNlLW1lc3NhZ2UnO1xuaW1wb3J0IHtqb2luLCBidWlsZFF1ZXJ5U3RyaW5nfSBmcm9tICdhdXJlbGlhLXBhdGgnO1xuXG5mdW5jdGlvbiBidWlsZEZ1bGxVcmwobWVzc2FnZSl7XG4gIHZhciB1cmwgPSBqb2luKG1lc3NhZ2UuYmFzZVVybCwgbWVzc2FnZS51cmwpLFxuICAgICAgcXM7XG5cbiAgaWYobWVzc2FnZS5wYXJhbXMpe1xuICAgIHFzID0gYnVpbGRRdWVyeVN0cmluZyhtZXNzYWdlLnBhcmFtcyk7XG4gICAgdXJsID0gcXMgPyBgJHt1cmx9PyR7cXN9YCA6IHVybDtcbiAgfVxuXG4gIG1lc3NhZ2UuZnVsbFVybCA9IHVybDtcbn1cblxuZXhwb3J0IGNsYXNzIFJlcXVlc3RNZXNzYWdlUHJvY2Vzc29yIHtcbiAgY29uc3RydWN0b3IoeGhyVHlwZSwgdHJhbnNmb3JtZXJzKXtcbiAgICB0aGlzLlhIUlR5cGUgPSB4aHJUeXBlO1xuICAgIHRoaXMudHJhbnNmb3JtZXJzID0gdHJhbnNmb3JtZXJzO1xuICAgIHRoaXMuaXNBYm9ydGVkID0gZmFsc2U7XG4gIH1cblxuICBhYm9ydCgpe1xuICAgIC8vIFRoZSBsb2dpYyBoZXJlIGlzIGlmIHRoZSB4aHIgb2JqZWN0IGlzIG5vdCBzZXQgdGhlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGFib3J0IHNvIHRoZSBpbnRlbnQgd2FzIGNhcnJpZWQgb3V0XG4gICAgLy8gQWxzbyB0ZXN0IGlmIHRoZSBYSFIgaXMgVU5TRU5UIC0gaWYgbm90LCBpdCB3aWxsIGJlIGFib3J0ZWQgaW4gdGhlIHByb2Nlc3MoKSBwaGFzZVxuICAgIGlmKHRoaXMueGhyICYmIHRoaXMueGhyLnJlYWR5U3RhdGUgIT09IFhNTEh0dHBSZXF1ZXN0LlVOU0VOVCl7XG4gICAgICB0aGlzLnhoci5hYm9ydCgpO1xuICAgIH1cbiAgICB0aGlzLmlzQWJvcnRlZCA9IHRydWU7XG4gIH1cblxuICBwcm9jZXNzKGNsaWVudCwgbWVzc2FnZSkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdmFyIHhociA9IHRoaXMueGhyID0gbmV3IHRoaXMuWEhSVHlwZSgpLFxuICAgICAgICB0cmFuc2Zvcm1lcnMgPSB0aGlzLnRyYW5zZm9ybWVycyxcbiAgICAgICAgaSwgaWk7XG5cbiAgICAgIGJ1aWxkRnVsbFVybChtZXNzYWdlKTtcbiAgICAgIHhoci5vcGVuKG1lc3NhZ2UubWV0aG9kLCBtZXNzYWdlLmZ1bGxVcmwsIHRydWUpO1xuXG4gICAgICBmb3IgKGkgPSAwLCBpaSA9IHRyYW5zZm9ybWVycy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgICAgIHRyYW5zZm9ybWVyc1tpXShjbGllbnQsIHRoaXMsIG1lc3NhZ2UsIHhocik7XG4gICAgICB9XG5cbiAgICAgIHhoci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgICB2YXIgcmVzcG9uc2UgPSBuZXcgSHR0cFJlc3BvbnNlTWVzc2FnZShtZXNzYWdlLCB4aHIsIG1lc3NhZ2UucmVzcG9uc2VUeXBlLCBtZXNzYWdlLnJldml2ZXIpO1xuICAgICAgICBpZiAocmVzcG9uc2UuaXNTdWNjZXNzKSB7XG4gICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgeGhyLm9udGltZW91dCA9IChlKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgSHR0cFJlc3BvbnNlTWVzc2FnZShtZXNzYWdlLCB7XG4gICAgICAgICAgcmVzcG9uc2U6IGUsXG4gICAgICAgICAgc3RhdHVzOiB4aHIuc3RhdHVzLFxuICAgICAgICAgIHN0YXR1c1RleHQ6IHhoci5zdGF0dXNUZXh0XG4gICAgICAgIH0sICd0aW1lb3V0JykpO1xuICAgICAgfTtcblxuICAgICAgeGhyLm9uZXJyb3IgPSAoZSkgPT4ge1xuICAgICAgICByZWplY3QobmV3IEh0dHBSZXNwb25zZU1lc3NhZ2UobWVzc2FnZSwge1xuICAgICAgICAgIHJlc3BvbnNlOiBlLFxuICAgICAgICAgIHN0YXR1czogeGhyLnN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiB4aHIuc3RhdHVzVGV4dFxuICAgICAgICB9LCAnZXJyb3InKSk7XG4gICAgICB9O1xuXG4gICAgICB4aHIub25hYm9ydCA9IChlKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgSHR0cFJlc3BvbnNlTWVzc2FnZShtZXNzYWdlLCB7XG4gICAgICAgICAgcmVzcG9uc2U6IGUsXG4gICAgICAgICAgc3RhdHVzOiB4aHIuc3RhdHVzLFxuICAgICAgICAgIHN0YXR1c1RleHQ6IHhoci5zdGF0dXNUZXh0XG4gICAgICAgIH0sICdhYm9ydCcpKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1lc3NhZ2UpXG4gICAgICAudGhlbigobWVzc2FnZSkgPT4ge1xuICAgICAgICB2YXIgcHJvY2Vzc1JlcXVlc3QgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNBYm9ydGVkKSB7XG4gICAgICAgICAgICAvLyBTb21lIGludGVyY2VwdG9ycyBjYW4gZGVsYXkgc2VuZGluZyBvZiBYSFIsIHNvIHdoZW4gYWJvcnQgaXMgY2FsbGVkXG4gICAgICAgICAgICAvLyBiZWZvcmUgWEhSIGlzIGFjdHVhbGx5IHNlbnQgd2UgYWJvcnQoKSBpbnN0ZWFkIHNlbmQoKVxuICAgICAgICAgICAgdGhpcy54aHIuYWJvcnQoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy54aHIuc2VuZChtZXNzYWdlLmNvbnRlbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFsgb25GdWxsZmlsbGVkLCBvblJlamVjdCBdIHBhaXJzXG4gICAgICAgIHZhciBjaGFpbiA9IFtbcHJvY2Vzc1JlcXVlc3QsIHVuZGVmaW5lZF1dO1xuICAgICAgICAvLyBBcHBseSBpbnRlcmNlcHRvcnMgY2hhaW4gZnJvbSB0aGUgbWVzc2FnZS5pbnRlcmNlcHRvcnNcbiAgICAgICAgdmFyIGludGVyY2VwdG9ycyA9IG1lc3NhZ2UuaW50ZXJjZXB0b3JzIHx8IFtdO1xuICAgICAgICBpbnRlcmNlcHRvcnMuZm9yRWFjaChmdW5jdGlvbiAoaW50ZXJjZXB0b3IpIHtcbiAgICAgICAgICBpZiAoaW50ZXJjZXB0b3IucmVxdWVzdCB8fCBpbnRlcmNlcHRvci5yZXF1ZXN0RXJyb3IpIHtcbiAgICAgICAgICAgIGNoYWluLnVuc2hpZnQoW1xuICAgICAgICAgICAgICBpbnRlcmNlcHRvci5yZXF1ZXN0ID8gaW50ZXJjZXB0b3IucmVxdWVzdC5iaW5kKGludGVyY2VwdG9yKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgaW50ZXJjZXB0b3IucmVxdWVzdEVycm9yID8gaW50ZXJjZXB0b3IucmVxdWVzdEVycm9yLmJpbmQoaW50ZXJjZXB0b3IpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaW50ZXJjZXB0b3IucmVzcG9uc2UgfHwgaW50ZXJjZXB0b3IucmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgY2hhaW4ucHVzaChbXG4gICAgICAgICAgICAgIGludGVyY2VwdG9yLnJlc3BvbnNlID8gaW50ZXJjZXB0b3IucmVzcG9uc2UuYmluZChpbnRlcmNlcHRvcikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGludGVyY2VwdG9yLnJlc3BvbnNlRXJyb3IgPyBpbnRlcmNlcHRvci5yZXNwb25zZUVycm9yLmJpbmQoaW50ZXJjZXB0b3IpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBpbnRlcmNlcHRvcnNQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKG1lc3NhZ2UpO1xuXG4gICAgICAgIHdoaWxlIChjaGFpbi5sZW5ndGgpIHtcbiAgICAgICAgICBpbnRlcmNlcHRvcnNQcm9taXNlID0gaW50ZXJjZXB0b3JzUHJvbWlzZS50aGVuKC4uLmNoYWluLnNoaWZ0KCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGludGVyY2VwdG9yc1Byb21pc2U7XG4gICAgICB9KTtcbiAgfVxufVxuIl19