1 | const { Sema } = require('async-sema');
|
2 | const EventedQueue = require('./evented-queue');
|
3 |
|
4 | module.exports = (tasks = [], concurrency = 1, preserveOrder = false) => {
|
5 | const semaphore = new Sema(concurrency);
|
6 | const queue = new EventedQueue();
|
7 |
|
8 | return Promise.all(
|
9 | tasks.map(async ({ pkg, apply }) => {
|
10 | queue.add(pkg.name);
|
11 |
|
12 | await semaphore.acquire();
|
13 |
|
14 |
|
15 | if (preserveOrder) {
|
16 | await queue.waitBehind(pkg.allDependencies);
|
17 | }
|
18 |
|
19 | await apply();
|
20 |
|
21 | queue.delete(pkg.name);
|
22 |
|
23 | semaphore.release();
|
24 | }),
|
25 | );
|
26 | };
|