diff options
Diffstat (limited to 'deps/npm/node_modules/call-limit/call-limit.js')
-rw-r--r-- | deps/npm/node_modules/call-limit/call-limit.js | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/deps/npm/node_modules/call-limit/call-limit.js b/deps/npm/node_modules/call-limit/call-limit.js new file mode 100644 index 0000000000..d6e4534b8a --- /dev/null +++ b/deps/npm/node_modules/call-limit/call-limit.js @@ -0,0 +1,86 @@ +"use strict" + +var defaultMaxRunning = 50 + +var limit = module.exports = function (func, maxRunning) { + var running = 0 + var queue = [] + if (!maxRunning) maxRunning = defaultMaxRunning + return function limited () { + var self = this + var args = Array.prototype.slice.call(arguments) + if (running >= maxRunning) { + queue.push({self: this, args: args}) + return + } + var cb = typeof args[args.length-1] === 'function' && args.pop() + ++ running + args.push(function () { + var cbargs = arguments + -- running + cb && process.nextTick(function () { + cb.apply(self, cbargs) + }) + if (queue.length) { + var next = queue.shift() + limited.apply(next.self, next.args) + } + }) + func.apply(self, args) + } +} + +module.exports.method = function (classOrObj, method, maxRunning) { + if (typeof classOrObj === 'function') { + var func = classOrObj.prototype[method] + classOrObj.prototype[method] = limit(func, maxRunning) + } else { + var func = classOrObj[method] + classOrObj[method] = limit(func, maxRunning) + } +} + +module.exports.promise = function (func, maxRunning) { + var running = 0 + var queue = [] + if (!maxRunning) maxRunning = defaultMaxRunning + return function () { + var self = this + var args = Array.prototype.slice.call(arguments) + return new Promise(function (resolve) { + if (running >= maxRunning) { + queue.push({self: self, args: args, resolve: resolve}) + return + } else { + runNext(self, args, resolve) + } + function runNext (self, args, resolve) { + ++ running + resolve( + func.apply(self, args) + .then(finish, function (err) { + finish(err) + throw err + })) + } + + function finish () { + -- running + if (queue.length) { + var next = queue.shift() + process.nextTick(runNext, next.self, next.args, next.resolve) + } + } + }) + } +} + +module.exports.promise.method = function (classOrObj, method, maxRunning) { + if (typeof classOrObj === 'function') { + var func = classOrObj.prototype[method] + classOrObj.prototype[method] = limit.promise(func, maxRunning) + } else { + var func = classOrObj[method] + classOrObj[method] = limit.promise(func, maxRunning) + } +} |