This is a simple Promise based multi-channel priority queue implementation that leverages Redis sorted set.
You will need Redis server running.
npm install redis-priority-queue
yarn add redis-priority-queue
The test script in package.json
preprocesses the .ts
file and then executes.
npm test
The source was written in Typescript, yet it compiles to Javascript (npm run build
). You can use in ES5 or later supported environments. The following code snippets are implemented in the __tests__
folder.
const queue = require('redis-priority-queue');
const config = queue.RedisConfig("localhost", 6379, null, null);
const myQueue = new queue.RedisPriorityQueue(config);
myQueue.length("emptyQueue")
.then(result => {
console.log({result});
})
.catch(error => {
console.error({error});
});
If you already have a program with a RedisClient
you can pass the client as an optional second parameter.
const myQueue = new queue.RedisPriorityQueue(null, client);
myQueue.length("emptyQueue")
.then(result => {
console.log({result});
})
.catch(error => {
console.error({error});
});
import {RedisConfig, IPriorityQueue, RedisPriorityQueue} from 'redis-priority-queue';
let config: RedisConfig = new RedisConfig(
"localhost",
6379,
null,
null
);
let myQueue : IPriorityQueue<string> = new RedisPriorityQueue(config);
Promise.all([
myQueue.insertWithPriority(testKey, "hello", 1),
myQueue.insertWithPriority(testKey, "world", 2),
myQueue.insertWithPriority(testKey, "foo", 1)
])
.then(values => {
done();
})
.catch(error => {
done.fail(error);
});
myQueue.pullHighestPriority(testKey)
.then(result => {
// assert popped value is highest priority
expect(result).toEqual("world");
})
.catch(error => {
done.fail(error);
});
myQueue.peek(testKey)
.then(result => {
expect(result).toEqual("world");
done();
})
.catch(error => {
done.fail(error);
});
myQueue.isEmpty(testKey)
.then(result => {
expect(result).toBeFalsy();
done();
})
.catch(error => {
done.fail(error);
});
myQueue.length(testKey)
.then(result => {
expect(result).toEqual(3);
done();
})
.catch(error => {
done.fail(error);
});
I haven't thought that far ahead yet. I needed this for my project and wanted to give back. ;-)
MIT (if you enhance it, fork and PR so the community benefits)