frontPanel/src/utils/requestQueue.ts

39 lines
880 B
TypeScript
Raw Normal View History

2024-02-26 09:51:33 +00:00
export class RequestQueue<IdType, T = unknown> {
2023-12-31 02:53:25 +00:00
private pendingPromise = false;
private items: Array<{
2024-02-26 09:51:33 +00:00
id: IdType;
2023-12-31 02:53:25 +00:00
action: () => Promise<T>;
resolve: (value: T) => void;
reject: (reason?: any) => void;
}> = [];
2024-02-26 09:51:33 +00:00
enqueue(id: IdType, action: () => Promise<T>) {
2023-12-31 02:53:25 +00:00
return new Promise((resolve, reject) => {
2024-02-26 09:51:33 +00:00
this.items.push({ action, resolve, reject, id });
2023-12-31 02:53:25 +00:00
this.dequeue();
});
}
2023-12-31 02:53:25 +00:00
async dequeue() {
if (this.pendingPromise) return;
2023-12-31 02:53:25 +00:00
const item = this.items.shift();
if (!item) return;
2024-02-26 09:51:33 +00:00
this.items = this.items.filter((i) => i.id !== item.id);
2023-12-31 02:53:25 +00:00
try {
this.pendingPromise = true;
const payload = await item.action();
this.pendingPromise = false;
2023-12-31 02:53:25 +00:00
item.resolve(payload);
} catch (e) {
this.pendingPromise = false;
item.reject(e);
} finally {
this.dequeue();
}
2023-12-31 02:53:25 +00:00
}
}