type AsyncQueueFunction = () => Promise; interface QueueItem { asyncFunction: AsyncQueueFunction; resolve: (value: T | PromiseLike) => void; reject: (reason?: unknown) => void; } export class AsyncQueue { queue: QueueItem[] = []; private isProcessing = false; public add(asyncFunction: AsyncQueueFunction): Promise { return new Promise((resolve, reject) => { this.queue.push({ asyncFunction, resolve, reject }); this.processQueue(); }); } private async processQueue(): Promise { if (this.isProcessing) { return; } this.isProcessing = true; while (this.queue.length > 0) { const queueItem = this.queue.shift()!; try { const { asyncFunction, resolve } = queueItem; const result = await asyncFunction(); resolve(result); } catch (error) { console.error("Error processing queue item:", error); const { reject } = queueItem; reject(error); } } this.isProcessing = false; } }