@balena/promise-queue

Queue sync or async functions with max concurrency, max size, max age, and fifo/lifo ordering

Usage no npm install needed!

<script type="module">
  import balenaPromiseQueue from 'https://cdn.skypack.dev/@balena/promise-queue';
</script>

README

promise-queue

This module allows you to queue sync/async functions with max concurrency, max size, max-age, and fifo/lifo ordering

Constructor

let q = new PromiseQueue({
  name: 'device_logs',
  concurrency: 40,
  maxSize: 400,
  maxAge: 30 * 1000,
  order: 'fifo'
});

Use

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);
          }
      });
}

Metrics

PromiseQueue.metrics is an EventEmitter which emits the following events:

  • arrival, data: undefined: a promise arrives at the queue

  • queueLength, data: number: the length of the queue on arrival

  • inFlight, data: number: the number of active promises on arrival

  • dequeue, data: undefined: a promise stops waiting in the queue and starts processing

  • queueTime, data: number: time a promise spent waiting in queue on dequeue

  • completion, data: undefined: a promise completes processing

  • serviceTime, data: number: time a promise spent processing on completion

  • latency, data: number: sum of queueTime and serviceTime on completion

  • rejection, data: undefined: a promise to be added is rejected because maxSize is already reached

  • timeout, data: undefined: a promise's latency (queue time + service time) exceeds maxAge, and it is rejected