@lzptec/concurrency
Version:
A Lightweight concurrency manager
1 lines • 4.49 kB
Source Map (JSON)
{"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"]}