mirror of
https://github.com/Qortal/Qortal-Hub.git
synced 2025-04-27 13:27:52 +00:00
56 lines
1.3 KiB
TypeScript
56 lines
1.3 KiB
TypeScript
export class RequestQueueWithPromise {
|
|
constructor(maxConcurrent = 5) {
|
|
this.queue = [];
|
|
this.maxConcurrent = maxConcurrent;
|
|
this.currentlyProcessing = 0;
|
|
this.isPaused = false; // Flag to track whether the queue is paused
|
|
}
|
|
|
|
// Add a request to the queue and return a promise
|
|
enqueue(request) {
|
|
return new Promise((resolve, reject) => {
|
|
// Push the request and its resolve and reject callbacks to the queue
|
|
this.queue.push({ request, resolve, reject });
|
|
this.process();
|
|
});
|
|
}
|
|
|
|
// Process requests in the queue
|
|
async process() {
|
|
// Process requests only if the queue is not paused
|
|
if (this.isPaused) return;
|
|
|
|
while (this.queue.length > 0 && this.currentlyProcessing < this.maxConcurrent) {
|
|
this.currentlyProcessing++;
|
|
|
|
const { request, resolve, reject } = this.queue.shift();
|
|
|
|
try {
|
|
const response = await request();
|
|
resolve(response);
|
|
} catch (error) {
|
|
reject(error);
|
|
} finally {
|
|
this.currentlyProcessing--;
|
|
await this.process();
|
|
}
|
|
}
|
|
}
|
|
|
|
// Pause the queue processing
|
|
pause() {
|
|
this.isPaused = true;
|
|
}
|
|
|
|
// Resume the queue processing
|
|
resume() {
|
|
this.isPaused = false;
|
|
this.process(); // Continue processing when resumed
|
|
}
|
|
|
|
// Clear pending requests in the queue
|
|
clear() {
|
|
this.queue.length = 0;
|
|
}
|
|
}
|
|
|