botium-core
Version:
The Selenium for Chatbots
69 lines (58 loc) • 1.57 kB
JavaScript
const async = require('async')
const util = require('util')
const QueueTimeoutError = require('./QueueTimeoutError')
module.exports = class Queue {
constructor () {
this.queue = []
this.listeners = []
this.pushListener = null
}
length () {
return this.queue.length
}
empty () {
this.queue = []
}
clear () {
this.queue = []
this.listeners = []
}
push (msg) {
if (this.pushListener) {
this.pushListener(msg)
}
if (this.listeners.length > 0) {
this.listeners.shift()(msg)
} else {
this.queue.push(msg)
}
}
pop (timeoutMillis) {
if (this.queue.length > 0) {
return Promise.resolve(this.queue.shift())
}
return new Promise((resolve, reject) => {
let listener = null
const timeoutRequest = async.timeout((timeoutCallback) => {
listener = (msg) => {
timeoutCallback(null, msg)
}
this.listeners.push(listener)
}, timeoutMillis)
timeoutRequest((err, msg) => {
if (err && err.code === 'ETIMEDOUT') {
this.listeners.splice(this.listeners.indexOf(listener), 1)
reject(new QueueTimeoutError(timeoutMillis))
} else if (err) {
this.listeners.splice(this.listeners.indexOf(listener), 1)
reject(new Error(`Queue pop error ${util.inspect(err)}`))
} else {
resolve(msg)
}
})
})
}
registerPushListener (callback) {
this.pushListener = callback
}
}