viewpoint
Version:
the exchange email API for nodejs module
92 lines (78 loc) • 2.26 kB
JavaScript
var HttpRequest, HttpRequestPool, Q;
Q = require('q');
HttpRequest = require('http-ext').HttpRequest;
module.exports = HttpRequestPool = (function() {
var request;
function HttpRequestPool(maxSize) {
this.maxSize = maxSize != null ? maxSize : 10;
this.activeSize = 0;
this.waitQueue = [];
this.inProcessQueue = new Set;
}
HttpRequestPool.prototype.getActiveSize = function() {
return this.activeSize;
};
HttpRequestPool.prototype.schedule = function() {
var results, task;
results = [];
while (this.waitQueue.length > 0 && this.activeSize < this.maxSize) {
task = this.waitQueue.pop();
results.push(task());
}
return results;
};
HttpRequestPool.prototype.close = function() {
var client, i, len, ref, results;
this.waitQueue = [];
ref = this.inProcessQueue;
results = [];
for (i = 0, len = ref.length; i < len; i++) {
client = ref[i];
results.push(client.abort());
}
return results;
};
HttpRequestPool.prototype.newRequest = function(options, defer) {
var client;
++this.activeSize;
client = new HttpRequest(options, (function(_this) {
return function(err, res) {
if (err) {
defer.reject(err);
} else {
defer.resolve(res);
}
_this.inProcessQueue["delete"](client);
--_this.activeSize;
return _this.schedule();
};
})(this));
return this.inProcessQueue.add(client);
};
request = function(method, url, options) {
var callback, defer;
if (options == null) {
options = {};
}
if (typeof options === 'function') {
callback = options;
options = {};
}
options.url = url;
options.method = method;
defer = Q.defer();
if (this.activeSize + 1 > this.maxSize) {
this.waitQueue.push(this.newRequest.bind(this, options, defer));
} else {
this.newRequest(options, defer);
}
return defer.promise;
};
HttpRequestPool.prototype.get = function(url, options) {
return request.call(this, 'GET', url, options);
};
HttpRequestPool.prototype.post = function(url, options) {
return request.call(this, 'POST', url, options);
};
return HttpRequestPool;
})();