intern
Version:
Intern. A next-generation code testing stack for JavaScript.
102 lines • 4.03 kB
JavaScript
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "tslib", "@dojo/core/request/providers/xhr", "@dojo/core/async/Task", "./Base"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var xhr_1 = require("@dojo/core/request/providers/xhr");
var Task_1 = require("@dojo/core/async/Task");
var Base_1 = require("./Base");
var HttpChannel = (function (_super) {
tslib_1.__extends(HttpChannel, _super);
function HttpChannel(options) {
var _this = _super.call(this, options) || this;
_this._sequence = 1;
_this._maxPostSize = options.maxPostSize || 100000;
_this._messageBuffer = [];
_this._lastRequest = Task_1.default.resolve();
return _this;
}
HttpChannel.prototype._sendData = function (name, data) {
var _this = this;
var id = String(this._sequence++);
var sessionId = this.sessionId;
var message = { id: id, sessionId: sessionId, name: name, data: data };
var task = new Task_1.default(function (resolve, reject) {
_this._messageBuffer.push({
message: JSON.stringify(message),
resolve: resolve,
reject: reject
});
if (_this._activeRequest) {
_this._activeRequest.then(function () { return _this._sendMessages(); });
}
else {
_this._sendMessages();
}
}, function () {
if (_this._activeRequest) {
_this._activeRequest.cancel();
}
_this._messageBuffer = [];
});
return task;
};
HttpChannel.prototype._sendMessages = function () {
var _this = this;
var messages = this._messageBuffer;
if (messages.length === 0) {
return;
}
var block = [messages.shift()];
var size = block[0].message.length;
while (messages.length > 0 &&
size + messages[0].message.length < this._maxPostSize) {
size += messages[0].message.length;
block.push(messages.shift());
}
this._activeRequest = xhr_1.default(this.url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(block.map(function (entry) { return entry.message; }))
})
.then(function (response) {
if (response.status === 200) {
return response.json();
}
else if (response.status === 204) {
return [];
}
else {
throw new Error(response.statusText);
}
})
.then(function (results) {
block.forEach(function (entry, index) {
entry.resolve(results[index]);
});
})
.catch(function (error) {
block.forEach(function (entry) {
entry.reject(error);
});
})
.finally(function () {
_this._activeRequest = undefined;
if (messages.length > 0) {
return _this._sendMessages();
}
});
return this._activeRequest;
};
return HttpChannel;
}(Base_1.default));
exports.default = HttpChannel;
});
//# sourceMappingURL=Http.js.map