UNPKG

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