UNPKG

@thepassle/app-tools

Version:

Collection of tools I regularly use to build apps. Maybe they're useful to somebody else. Maybe not. Most of these are thin wrappers around native API's, like the native `<dialog>` element, `fetch` API, and `URLPattern`.

44 lines (39 loc) 876 B
/** * @param {number} [max=10] - Maximum number of concurrent requests * @returns {import('../index.js').Plugin} */ export function concurrencyPlugin(max = 10) { let active = 0; const queue = []; function release() { active--; if (queue.length > 0) { const next = queue.shift(); active++; next(); } } function acquire() { if (active < max) { active++; return Promise.resolve(); } return new Promise((resolve) => queue.push(resolve)); } return { name: "concurrency", async beforeFetch(params) { await acquire(); return params; }, afterFetch(params) { release(); return params.response; }, handleError() { release(); // release the slot on failures too return true; // still throw }, }; } export const concurrency = concurrencyPlugin();