@rcsb/rcsb-saguaro-app
Version:
RCSB 1D Saguaro Web App
72 lines (71 loc) • 2.38 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RcsbFvAlignmentCollectorQueue = void 0;
const rxjs_1 = require("rxjs");
class RcsbFvAlignmentCollectorQueue {
constructor(nWorkers) {
this.workerList = new Array();
this.taskQueue = new Array();
this.isQueueActive = false;
if (nWorkers != null)
this.nWorkers = nWorkers;
else
this.nWorkers = self.navigator.hardwareConcurrency;
for (let i = 0; i < this.nWorkers; i++) {
this.workerList.push({
available: true,
worker: new Worker("/saguaro/worker.js")
});
}
}
sendTask(request, callback) {
const available = this.workerList.filter(d => d.available);
if (available.length > 0) {
available[0].available = false;
available[0].worker.postMessage(request);
available[0].worker.onmessage = (e) => {
callback(e.data);
available[0].available = true;
};
}
else {
this.taskQueue.push({ request: request, callback: callback });
if (!this.isQueueActive)
this.activateQueue();
}
}
activateQueue() {
this.isQueueActive = true;
this.recursiveExec();
}
recursiveExec() {
if (this.taskQueue.length == 0) {
this.isQueueActive = false;
}
else {
this.isQueueActive = true;
this.workerList.filter(d => d.available).forEach(aW => {
if (this.taskQueue.length > 0) {
aW.available = false;
const task = this.taskQueue.shift();
if (!task)
return;
aW.worker.postMessage(task.request);
aW.worker.onmessage = (e) => {
task.callback(e.data);
aW.available = true;
};
}
});
rxjs_1.asyncScheduler.schedule(() => {
this.recursiveExec();
}, 1000);
}
}
terminateWorkers() {
this.workerList.forEach(w => {
w.worker.terminate();
});
}
}
exports.RcsbFvAlignmentCollectorQueue = RcsbFvAlignmentCollectorQueue;