diff --git a/lib/modules/@dougal/concurrency/index.js b/lib/modules/@dougal/concurrency/index.js new file mode 100644 index 0000000..70bf48f --- /dev/null +++ b/lib/modules/@dougal/concurrency/index.js @@ -0,0 +1,25 @@ +class ConcurrencyLimiter { + + constructor(maxConcurrent) { + this.maxConcurrent = maxConcurrent; + this.active = 0; + this.queue = []; + } + + async enqueue(task) { + if (this.active >= this.maxConcurrent) { + await new Promise(resolve => this.queue.push(resolve)); + } + this.active++; + try { + return await task(); + } finally { + this.active--; + if (this.queue.length > 0) { + this.queue.shift()(); + } + } + } +} + +module.exports = ConcurrencyLimiter; diff --git a/lib/modules/@dougal/concurrency/package.json b/lib/modules/@dougal/concurrency/package.json new file mode 100644 index 0000000..5e86b97 --- /dev/null +++ b/lib/modules/@dougal/concurrency/package.json @@ -0,0 +1,12 @@ +{ + "name": "@dougal/concurrency", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "description": "" +}