From 32c6e2c79fe3097f6a1f30149fded09fb913aeb2 Mon Sep 17 00:00:00 2001 From: "D. Berge" Date: Fri, 1 Aug 2025 11:22:30 +0200 Subject: [PATCH] Add @dougal/concurrency module --- lib/modules/@dougal/concurrency/index.js | 25 ++++++++++++++++++++ lib/modules/@dougal/concurrency/package.json | 12 ++++++++++ 2 files changed, 37 insertions(+) create mode 100644 lib/modules/@dougal/concurrency/index.js create mode 100644 lib/modules/@dougal/concurrency/package.json 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": "" +}