Sha256: ec25b742450df200d287bd9790451e203e2a99066f615b43f034e731afa0697f

Contents?: true

Size: 1.49 KB

Versions: 54

Compression:

Stored size: 1.49 KB

Contents

'use strict';
const Queue = require('yocto-queue');

const pLimit = concurrency => {
	if (!((Number.isInteger(concurrency) || concurrency === Infinity) && concurrency > 0)) {
		throw new TypeError('Expected `concurrency` to be a number from 1 and up');
	}

	const queue = new Queue();
	let activeCount = 0;

	const next = () => {
		activeCount--;

		if (queue.size > 0) {
			queue.dequeue()();
		}
	};

	const run = async (fn, resolve, ...args) => {
		activeCount++;

		const result = (async () => fn(...args))();

		resolve(result);

		try {
			await result;
		} catch {}

		next();
	};

	const enqueue = (fn, resolve, ...args) => {
		queue.enqueue(run.bind(null, fn, resolve, ...args));

		(async () => {
			// This function needs to wait until the next microtask before comparing
			// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously
			// when the run function is dequeued and called. The comparison in the if-statement
			// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.
			await Promise.resolve();

			if (activeCount < concurrency && queue.size > 0) {
				queue.dequeue()();
			}
		})();
	};

	const generator = (fn, ...args) => new Promise(resolve => {
		enqueue(fn, resolve, ...args);
	});

	Object.defineProperties(generator, {
		activeCount: {
			get: () => activeCount
		},
		pendingCount: {
			get: () => queue.size
		},
		clearQueue: {
			value: () => {
				queue.clear();
			}
		}
	});

	return generator;
};

module.exports = pLimit;

Version data entries

54 entries across 54 versions & 6 rubygems

Version Path
immosquare-cleaner-0.1.52 node_modules/p-limit/index.js
immosquare-cleaner-0.1.51 node_modules/p-limit/index.js
immosquare-cleaner-0.1.50 node_modules/p-limit/index.js
immosquare-cleaner-0.1.49 node_modules/p-limit/index.js
immosquare-cleaner-0.1.48 node_modules/p-limit/index.js
immosquare-cleaner-0.1.47 node_modules/p-limit/index.js
immosquare-cleaner-0.1.46 node_modules/p-limit/index.js
immosquare-cleaner-0.1.45 node_modules/p-limit/index.js
immosquare-cleaner-0.1.44 node_modules/p-limit/index.js
immosquare-cleaner-0.1.43 node_modules/p-limit/index.js
immosquare-cleaner-0.1.42 node_modules/p-limit/index.js
immosquare-cleaner-0.1.41 node_modules/p-limit/index.js
immosquare-cleaner-0.1.40 node_modules/p-limit/index.js
immosquare-cleaner-0.1.39 node_modules/p-limit/index.js
immosquare-cleaner-0.1.38 node_modules/p-limit/index.js
immosquare-cleaner-0.1.32 node_modules/p-limit/index.js
immosquare-cleaner-0.1.31 node_modules/p-limit/index.js
immosquare-cleaner-0.1.30 node_modules/p-limit/index.js
immosquare-cleaner-0.1.29 node_modules/p-limit/index.js
immosquare-cleaner-0.1.28 node_modules/p-limit/index.js