@robotical/appv2-warranty-service-lib
Version:
A tool that gathers data from the Apps and sends it to the Analytics server
60 lines (59 loc) • 1.9 kB
JavaScript
export default class TicketQueue {
constructor() {
this.queue = [];
this.isProcessing = false;
this.resultsQueue = [];
this.pendingResolvers = new Map();
}
addTicket(ticket) {
this.queue.push(ticket);
return new Promise((resolve) => {
this.pendingResolvers.set(ticket.ticketId, resolve);
});
}
getQueue() {
return [...this.queue];
}
removeTicket(ticket) {
this.queue = this.queue.filter((t) => t !== ticket);
}
async processTicketsQueue(cb) {
if (this.isProcessing)
return;
this.isProcessing = true;
try {
while (this.queue.length > 0) {
const ticket = this.queue.shift();
let resultId = false;
try {
resultId = await cb(ticket);
}
catch (error) {
console.error(`Error processing ticket: ${error}`);
}
this.resultsQueue.push({ ticketId: ticket.ticketId, result: resultId });
const resolver = this.pendingResolvers.get(ticket.ticketId);
if (resolver) {
resolver(resultId);
this.pendingResolvers.delete(ticket.ticketId);
}
await new Promise(resolve => setTimeout(resolve, 5000));
}
}
catch (error) {
console.error(`Error processing tickets queue: ${error}`);
}
finally {
this.isProcessing = false;
if (this.queue.length > 0) {
this.processTicketsQueue(cb);
}
}
}
getResultByTicketId(ticketId) {
const result = this.resultsQueue.find((r) => r.ticketId === ticketId);
if (!result)
return -1;
return result.result;
}
}