diff --git a/lib/www/server/lib/queue/actions-queue.js b/lib/www/server/lib/queue/actions-queue.js new file mode 100644 index 0000000..069ded2 --- /dev/null +++ b/lib/www/server/lib/queue/actions-queue.js @@ -0,0 +1,52 @@ +const Queue = require('./queue'); + +// Inspired by: +// https://stackoverflow.com/questions/53540348/js-async-await-tasks-queue#53540586 + +class ActionsQueue extends Queue { + + constructor (items = []) { + super(items); + + this.pending = false; + } + + enqueue (action) { + return new Promise ((resolve, reject) => { + super.enqueue({ action, resolve, reject }); + this.dequeue(); + }); + } + + async dequeue () { + + if (this.pending) { + return false; + } + + const item = super.dequeue(); + + if (!item) { + return false; + } + + try { + + this.pending = true; + + const result = await item.action(this); + + this.pending = false; + item.resolve(result); + } catch (err) { + this.pending = false; + item.reject(err); + } finally { + this.dequeue(); + } + + } + +} + +module.exports = ActionsQueue; diff --git a/lib/www/server/lib/queue/index.js b/lib/www/server/lib/queue/index.js new file mode 100644 index 0000000..8305fea --- /dev/null +++ b/lib/www/server/lib/queue/index.js @@ -0,0 +1,6 @@ + +module.exports = { + Queue: require('./queue'), + ActionsQueue: require('./actions-queue') +}; + diff --git a/lib/www/server/lib/queue/queue.js b/lib/www/server/lib/queue/queue.js new file mode 100644 index 0000000..aabeb4d --- /dev/null +++ b/lib/www/server/lib/queue/queue.js @@ -0,0 +1,22 @@ + +class Queue { + + constructor (items = []) { + this.items = items; + } + + enqueue (item) { + this.items.push(item); + } + + dequeue () { + return this.items.shift(); + } + + length () { + return this.items.length; + } + +} + +module.exports = Queue;