{"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"]}