A leaky bucket queue/deque backed by MongoDB.
May be used to throttle queries to expensive resources such as email or file servers.
The same queue can be accessed by multiple NodeJS servers connected to a database, provided that the same instance options are passed and that their clocks are synchronized.
$ npm install mongodb-leaky-bucket --save
const LeakyBucket = require('mongodb-leaky-bucket');
const bucket = new LeakyBucket(db, {
collectionName: 'my-bucket', // MongoDB collection to use
interval: 500, // Allows one dequeue op each 500ms
limit: 200 // Maximum elements in bucket
});
bucket.push('Element one', 'Element two', 'Element three')
.then(queueLength => console.log(queueLength)); // 3
bucket.shift()
.then(element => console.dir(element)); // 'Element one'
bucket.shift()
.then(element => console.dir(element)); // undefined
// a second later
bucket.shift()
.then(element => console.dir(element)); // 'Element two'
bucket.shift()
.then(element => console.dir(element)); // undefined
// another 500ms later
bucket.shift()
.then(element => console.dir(element)); // 'Element three'
Returns a new LeakyBucket deque.
A collection in this database will be used to store the deque.
collectionName
[String]: Name of the mongodb collection to use. Default: leaky-bucket-default
.
interval
[Number]: Minimum time, in milliseconds, between dequeue operations. Default: 0
.
limit
[Integer]: Maximum number of elements that the deque will store before refusing an enqueue operation. Default: 2147483648
(2^31).
Appends the parameter(s) to the queue. Returns a Promise with the new length of the queue. If operation would cause an overflow of the bucket's limit, Promise resolves to null
and queue is not changed.
Dequeues the first element of the queue and returns a Promise containing this element. If the queue is empty or if the time passed since the last dequeuing operation is less than options.interval
, operation does not alter the queue and returns undefined
.
Same as push
, but prepends to queue instead of appending.
Same as shift
, but dequeues and retrieves the last element instead of the first.
This project is not affiliated with MongoDB.
MIT