UNPKG

viewpoint

Version:
92 lines (78 loc) 2.26 kB
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; })();