{"version":3,"sources":["../src/semaphore.ts"],"names":["_currentQueue","_acquired","_maxConcurrency","_promise","_Semaphore_instances","tryNext_fn","Semaphore","options","__privateAdd","Queue","_a","__privateSet","task","args","release","promise","res","resolve","__privateGet","__privateMethod","__privateWrapper"],"mappings":"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","file":"chunk-YQZ4NCQG.cjs","sourcesContent":["import { Queue } from \"./base/queue.js\";\n\ntype SemaphoreOptions = {\n    maxConcurrency: number;\n};\n\ntype SemaphoreItem = {\n    promise: Promise<void>;\n    release: () => void;\n};\n\nexport type SemaphoreLock = {\n    release: () => void;\n};\n\nexport class Semaphore {\n    #currentQueue: Queue<SemaphoreItem> = new Queue();\n    #acquired = 0;\n    #maxConcurrency = 1;\n    #promise = Promise.resolve();\n\n    constructor(options?: SemaphoreOptions) {\n        this.#maxConcurrency = options?.maxConcurrency ?? 1;\n    }\n\n    async run<B>(task: () => (B | Promise<B>)): Promise<B>;\n    async run<A extends Array<any>, B>(task: (...args: A) => (B | Promise<B>), ...args: A): Promise<B>;\n\n    async run(task: Function, ...args: any[]) {\n        const { release } = await this.acquire();\n        try {\n            return await task(args);\n        } finally {\n            release();\n        }\n    }\n\n    async acquire(): Promise<SemaphoreLock> {\n        let release: () => void;\n        const promise = new Promise<void>((res) => { release = res; });\n\n        return new Promise<SemaphoreLock>((resolve) => {\n            this.#currentQueue.enqueue({\n                promise,\n                release: () => resolve({ release })\n            });\n            this.#tryNext();\n        })\n    }\n\n    #tryNext() {\n        if (!this.#currentQueue.length || this.#acquired >= this.#maxConcurrency)\n            return;\n\n        const { release, promise } = this.#currentQueue.dequeue()!;\n        this.#acquired++;\n        this.#promise\n            .then(release)\n            .then(() => promise)\n            .finally(() => {\n                this.#acquired--;\n                this.#tryNext();\n            });\n    }\n\n    get acquired(): number {\n        return this.#acquired;\n    }\n\n    get options(): SemaphoreOptions {\n        return { maxConcurrency: this.#maxConcurrency };\n    }\n\n    set options(options: SemaphoreOptions) {\n        this.#maxConcurrency = options.maxConcurrency;\n    }\n}\n"]}