UNPKG

@lzptec/concurrency

Version:

A Lightweight concurrency manager

1 lines 18.2 kB
{"version":3,"sources":["../src/throttle.ts"],"names":["validateOptions","options","_options","_semaphore","_promise","_locks","_currentStart","_timer","_Throttle_static","loop_fn","_Throttle_instances","clearLocks_fn","Throttle","SharedBase","__privateAdd","Semaphore","taskOptions","validateTask","task","forEach","__privateMethod","__spreadProps","__spreadValues","results","map","mapSettled","validatePredicate","filter","some","find","every","group","args","interval","__privateGet","lock","now","__privateSet","loop","input","iterator","validateAndProcessInput","done","maxConcurrency","catchAndAbort","err","resolve","reject","count","i","res","currentStart","_a","data","interrupt","ms","x"],"mappings":"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","file":"chunk-Q4UQKLMH.cjs","sourcesContent":["import type { ThrottleCommonOptions, ThrottleTaskOptions, ThrottlePredicateOptions } from './base/options.js';\nimport { every, filter, find, forEach, group, interrupt, loop, map, mapSettled, some, validateAndProcessInput, validatePredicate, validateTask } from './base/shared.js';\nimport { SharedBase } from './base/shared-base.js';\nimport { Group, Input, RunnableTask, Task } from './base/types.js';\nimport { Semaphore, SemaphoreLock } from './semaphore.js';\n\nfunction validateOptions(options: ThrottleCommonOptions) {\n if (!Number.isInteger(options.maxConcurrency)) {\n throw new Error('Parameter `maxConcurrency` must be a integer!');\n }\n\n if (!Number.isInteger(options.interval) || options.interval < 0) {\n throw new Error('Parameter `interval` must be a positive integer greater than 0!');\n }\n}\n\nexport class Throttle extends SharedBase<ThrottleCommonOptions> {\n\n #options: ThrottleCommonOptions = undefined!;\n #semaphore: Semaphore = new Semaphore();\n #promise = Promise.resolve();\n #locks: SemaphoreLock[] = [];\n #currentStart: number = 0;\n #timer: NodeJS.Timeout | undefined;\n\n static async #loop<A, B>(taskOptions: ThrottleTaskOptions<A, B>) {\n validateOptions(taskOptions);\n const iterator = validateAndProcessInput(taskOptions.input);\n let done = false;\n\n const catchAndAbort = (err: unknown) => {\n done = true;\n throw err;\n };\n\n let currentStart = performance.now();\n const { interval, maxConcurrency, task } = taskOptions;\n\n await new Promise<void>((resolve, reject) => {\n let count = maxConcurrency;\n for (let i = 0; i < maxConcurrency; i++) {\n (async () => {\n while (!done) {\n const data = await iterator.next();\n if (data.done || done)\n break;\n\n const result = await task(await data.value);\n if (result === interrupt) {\n done = true;\n iterator.return?.();\n break;\n }\n\n const now = performance.now();\n if ((now - currentStart) >= interval) {\n currentStart = now;\n }\n\n const ms = (currentStart + interval) - now;\n if (ms > 1)\n await new Promise<void>((resolve) => setTimeout(() => resolve(), ms));\n }\n })()\n .then(() => (--count === 0) ? resolve() : undefined)\n .catch(catchAndAbort)\n .catch(reject);\n }\n });\n }\n\n /**\n * Performs the specified `task` for each element in the `input`.\n * \n * It limits the concurrent execution to `maxConcurrency`.\n *\n * @template A\n * @param {ThrottleTaskOptions<A, any>} taskOptions Task Options.\n * @returns {Promise<void>}\n */\n static async forEach<A>(taskOptions: ThrottleTaskOptions<A, any>): Promise<void> {\n validateTask(taskOptions.task);\n const { task } = forEach(taskOptions.task);\n\n await this.\n #loop({\n ...taskOptions,\n task\n });\n }\n\n /**\n * Performs the specified `task` function on each element in the `input`, and returns an array that contains the results.\n * \n * It runs in batches with size defined by `batchSize`.\n * \n * @template A Input Type.\n * @template B Output Type.\n * @param {ThrottleTaskOptions<A, B>} taskOptions Task Options.\n * @returns {Promise<B[]>}\n */\n static async map<A, B>(taskOptions: ThrottleTaskOptions<A, B>): Promise<B[]> {\n validateTask(taskOptions.task);\n\n const { task, results } = map(taskOptions.task);\n\n await this\n .#loop({\n ...taskOptions,\n task\n });\n\n return results;\n }\n\n /**\n * Performs the specified `task` function on each element in the `input`, \n * and creates a Promise that is resolved with an array of results when all of the tasks are resolve or reject.\n * \n * It runs in batches with size defined by `batchSize`.\n * \n * @template A Input Type.\n * @template B Output Type.\n * @param {ThrottleTaskOptions<A, B>} taskOptions Task Options.\n * @returns {Promise<PromiseSettledResult<B>[]>}\n */\n static async mapSettled<A, B>(taskOptions: ThrottleTaskOptions<A, B>): Promise<PromiseSettledResult<B>[]> {\n validateTask(taskOptions.task);\n\n const { task, results } = mapSettled(taskOptions.task);\n\n await this\n .#loop({\n ...taskOptions,\n task\n });\n\n return results;\n }\n\n /**\n * Returns the elements that meet the condition specified in the `predicate` function.\n * \n * It runs in batches with size defined by `batchSize`.\n *\n * @template A Input Type.\n * @param {ThrottlePredicateOptions<A>} taskOptions Task Options.\n * @returns {Promise<A[]>}\n */\n static async filter<A>(taskOptions: ThrottlePredicateOptions<A>): Promise<A[]> {\n validatePredicate(taskOptions.predicate);\n\n const { task, results } = filter(taskOptions.predicate);\n\n await this\n .#loop({\n ...taskOptions,\n task\n });\n\n return results;\n }\n\n /**\n * Determines whether the specified `predicate` function returns true for any element of `input`.\n * \n * It runs in batches with size defined by `batchSize`.\n * \n * @template A Input Type.\n * @param {ThrottlePredicateOptions<A>} taskOptions Task Options.\n * @returns {Promise<boolean>}\n */\n static async some<A>(taskOptions: ThrottlePredicateOptions<A>): Promise<boolean> {\n validatePredicate(taskOptions.predicate);\n\n const { task, results } = some(taskOptions.predicate);\n\n await this\n .#loop({\n ...taskOptions,\n task\n });\n\n return results[0];\n }\n\n /**\n * Returns the `input` value of the first `predicate` that resolves to true, and undefined otherwise.\n * \n * It runs in batches with size defined by `batchSize`.\n * \n * @template A Input Type.\n * @param {ThrottlePredicateOptions<A>} taskOptions Task Options.\n * @returns {Promise<A | undefined>}\n */\n static async find<A>(taskOptions: ThrottlePredicateOptions<A>): Promise<A | undefined> {\n validatePredicate(taskOptions.predicate);\n\n const { task, results } = find(taskOptions.predicate);\n\n await this\n .#loop({\n ...taskOptions,\n task\n });\n\n return results[0];\n }\n\n /**\n * Determines whether all the elements of `input` satisfy the specified `predicate`.\n * \n * It runs in batches with size defined by `batchSize`.\n * \n * @template A Input Type.\n * @param {ThrottlePredicateOptions<A>} taskOptions Task Options.\n * @returns {Promise<boolean>}\n */\n static async every<A>(taskOptions: ThrottlePredicateOptions<A>): Promise<boolean> {\n validatePredicate(taskOptions.predicate);\n\n const { task, results } = every(taskOptions.predicate);\n\n await this\n .#loop({\n ...taskOptions,\n task\n });\n\n return results[0];\n }\n\n /**\n * This method groups the elements of the `input` according to the string values returned by a provided `task`.\n * \n * The returned object has separate properties for each group, containing arrays with the elements in the group.\n * \n * It runs in batches with size defined by `batchSize`.\n * \n * @template A Input Type.\n * @param {ThrottleTaskOptions<A, string | symbol>} taskOptions Task Options.\n * @returns {Promise<Group<A>>}\n */\n static async group<A>(taskOptions: ThrottleTaskOptions<A, string | symbol>): Promise<Group<A>> {\n validateTask(taskOptions.task);\n\n const { task, results } = group(taskOptions.task);\n\n await this\n .#loop({\n ...taskOptions,\n task\n });\n\n return Object.fromEntries(results[0]);\n }\n\n /**\n * \n * @param {ThrottleCommonOptions} options \n */\n constructor(options: ThrottleCommonOptions) {\n super();\n this.options = options;\n }\n\n #clearLocks() {\n this.#locks.forEach(x => x.release());\n this.#locks = [];\n this.#timer = undefined;\n }\n\n override async run<A, B>(task: RunnableTask<A, B>, ...args: A[]): Promise<B> {\n const { interval } = this.#options;\n\n const lock = await this.#semaphore.acquire();\n this.#locks.push(lock);\n\n const now = performance.now();\n\n if ((now - this.#currentStart) >= interval)\n this.#currentStart = now;\n\n if (!this.#timer) {\n this.#timer = setTimeout(this.#clearLocks.bind(this), interval);\n }\n\n return this.#promise\n .then(() => task(...args));\n }\n\n override async[loop]<A, B>(input: Input<A>, task: Task<A, B>): Promise<void> {\n const iterator = validateAndProcessInput(input);\n\n let done = false;\n const { maxConcurrency } = this.#options;\n\n const catchAndAbort = (err: unknown) => {\n done = true;\n throw err;\n };\n\n await new Promise<void>((resolve, reject) => {\n let count = maxConcurrency;\n for (let i = 0; i < maxConcurrency; i++) {\n Promise\n .resolve(iterator.next())\n .then(async res => {\n while (!done && !res.done) {\n await this.run(task, await res.value);\n res = await iterator.next();\n }\n })\n .then(() => (--count === 0) ? resolve() : undefined)\n .catch(catchAndAbort)\n .catch(reject);\n }\n });\n }\n\n override set options(options: ThrottleCommonOptions) {\n validateOptions(options);\n this.#options = { ...this.#options, ...options };\n this.#semaphore.options = this.#options;\n }\n\n override get options() {\n return { ...this.#options };\n }\n\n}\n\nObject.freeze(Throttle);\n"]}