Queue sync or async functions with max concurrency, max size, max age, and fifo/lifo ordering
npm install @balena/promise-queuepromise-queue
===
This module allows you to queue sync/async functions with max concurrency, max size, max-age, and fifo/lifo ordering
```
let q = new PromiseQueue({
name: 'device_logs',
concurrency: 40,
maxSize: 400,
maxAge: 30 * 1000,
order: 'fifo'
});
``
export function middleware(
req: Request,
res: Response,
next: NextFunction,
): void {
q.add(() =>
new Promise(resolve => {
res.once('close', resolve);
res.once('finish', resolve);
next();
}),
)
.catch(err => {
if (err instanceof PromiseQueueError) {
reject(res);
}
});
}
PromiseQueue.metrics is an EventEmitter which emits the following events:
- arrival, data: undefined: a promise arrives at the queuequeueLength
- , data: number: the length of the queue on arrivalinFlight
- , data: number: the number of active promises on arrival
- dequeue, data: undefined: a promise stops waiting in the queue and starts processingqueueTime
- , data: number: time a promise spent waiting in queue on dequeue
- completion, data: undefined: a promise completes processingserviceTime
- , data: number: time a promise spent processing on completionlatency
- , data: number: sum of queueTime and serviceTime on completion
- rejection, data: undefined: a promise to be added is rejected because maxSize is already reachedtimeout
- , data: undefined: a promise's latency (queue time + service time) exceeds maxAge`, and it is rejected