UNPKG

1.06 kBJavaScriptView Raw
1import { FUN } from '@typen/enum-data-types';
2
3// import { deco, says, Xr } from '@spare/logger'
4/**
5 * @typedef {Function|function(*,*[]):Promise<*[]>} AsyncService
6 *
7 * @param {*[]} vendors - array of functions or array of objects/classes. if latter case, a function must be provided as 'this'
8 * @param {*[]} visitors
9 * @return {Promise<*[]>}
10 */
11
12async function promiseLobby(vendors, visitors) {
13 /** @type {?AsyncService} */
14 const service = typeof this === FUN ? this : null;
15 const vec = [],
16 busy = new Set();
17
18 for (const client of visitors) {
19 if (!vendors.length) await Promise.race(busy);
20 const vendor = vendors.shift();
21 const promisified = Promise.resolve().then(service ? service.bind(vendor, client) : () => vendor(client));
22 vec.push(promisified);
23 const deal = promisified.then(() => (busy.delete(deal), vendors.push(vendor), vendor));
24 busy.add(deal); // Xr().vendor(vendor|> deco).vendors(vendors |> deco).busy(busy |> deco) |> says['asyncPool']
25 }
26
27 return Promise.all(vec);
28}
29
30export { promiseLobby };