%PDF- %PDF-
Direktori : /usr/lib/node_modules/ncm-ng/lib/queue/ |
Current File : //usr/lib/node_modules/ncm-ng/lib/queue/priority.js |
'use strict' exports.get = get // return an object representing a priority queue - which is really multiple // explicit queues suffixed P0 ... Px (where x === levels - 1) async function get (name, queues, options) { return new PriorityQueue(name, queues, options) } // implementation of a priority queue class PriorityQueue { constructor (name, queues, options) { this._name = name this._queues = queues this._levels = queues.length this._options = options // default priority is the middle one, or just below for even this._defaultPriority = Math.floor(queues.length / 2) } get buffered () { // get buffered values for each queue const buffered = this._queues.map(queue => queue.buffered) // return sum of that return buffered.reduce((acc, el) => acc + el, 0) } // post a message to the queue; `priority` is an option async post (message, options) { return this.postMulti([message], options) } // post multiple messages to the queue async postMulti (messages, options = {}) { if (!Array.isArray(messages)) throw new Error('messages argument must be an array') if (messages.length === 0) return // calculate priority let priority = options.priority if (typeof priority !== 'number') priority = this._defaultPriority if (priority < 0) priority = 0 if (priority >= this._levels) priority = this._levels - 1 const queue = this._queues[priority] return queue.postMulti(messages, options) } // read a message from the queue // Note that the early read on buffered messages, means that if 10 messages // are buffered are P1, then those will end up all being returned before // P0 is read. That should be fine, and will improve general throughput // (not having to wait for the P0 read, which will nearly always be empty). // The limit on buffering is currently the maxReceive length, which is 10. async read (options) { // see if any queue has buffered messages, if so, read from it first for (let queue of this._queues) { if (queue.buffered === 0) continue const result = await queue.read(options) if (result != null) { return readResult(queue, result) } } // nothing buffered? check each queue in order for (let queue of this._queues) { const result = await queue.read(options) if (result != null) { return readResult(queue, result) } } return null function readResult (queue, result) { return { handle: { queue: queue, handle: result.handle }, message: result.message } } } // delete a previously read message async delete (handle) { const queue = handle.queue await queue.delete(handle.handle) } // get some queue statistics async getStats () { const finalResult = { visible: 0, notVisible: 0 } for (let queue of this._queues) { const result = await queue.getStats() finalResult.visible += result.visible finalResult.notVisible += result.notVisible } return finalResult } // return string representation of this object toString () { return `${this.constructor.name}[${this._name}]` } }