lix-website/themes/lix/assets/bootstrap/node_modules/karma-browserstack-launcher/worker-manager.js
2024-04-26 22:49:34 -06:00

97 lines
2.3 KiB
JavaScript

var Worker = require('./worker')
/**
* Tracks worker state across runs.
*/
function WorkerManager () {
this._pollHandle = null
this.workers = {}
this.isPolling = false
this.shouldShutdown = false
}
WorkerManager.prototype.registerWorker = function registerWorker (workerData) {
if (this.workers[workerData.id]) {
this.unregisterWorker(this.workers[workerData.id])
}
var worker = new Worker(workerData)
worker.emit('status', worker.status)
this.workers[workerData.id] = worker
return worker
}
WorkerManager.prototype.unregisterWorker = function unregisterWorker (worker) {
worker.emit('delete', worker)
worker.removeAllListeners()
delete this.workers[worker.id]
return worker
}
WorkerManager.prototype.updateWorker = function updateWorker (workerData) {
var workers = this.workers
if (workers[workerData.id]) {
var worker = workers[workerData.id]
var prevStatus = worker.status
Object.keys(workerData).forEach(function (k) {
worker[k] = workerData[k]
})
if (worker.status !== prevStatus) {
worker.emit('status', worker.status)
}
}
}
WorkerManager.prototype.startPolling = function startPolling (client, pollingTimeout, callback) {
if (this.isPolling || this.shouldShutdown) {
return
}
var self = this
this.isPolling = true
client.getWorkers(function (err, updatedWorkers) {
if (err) {
self.isPolling = false
return (callback ? callback(err) : null)
}
var activeWorkers = (updatedWorkers || []).reduce(function (o, worker) {
o[worker.id] = worker
return o
}, {})
Object.keys(self.workers).forEach(function (workerId) {
if (activeWorkers[workerId]) {
// process updates
self.updateWorker(activeWorkers[workerId])
} else {
// process deletions
self.unregisterWorker(self.workers[workerId])
}
})
self._pollHandle = setTimeout(function () {
self.isPolling = false
self.startPolling(client, pollingTimeout, callback)
}, pollingTimeout)
})
}
WorkerManager.prototype.stopPolling = function stopPolling () {
if (this._pollHandle) {
clearTimeout(this._pollHandle)
this._pollHandle = null
}
this.shouldShutdown = true
}
// expose a single, shared instance of WorkerManager
module.exports = new WorkerManager()