UNPKG

@rcsb/rcsb-saguaro-app

Version:
72 lines (71 loc) 2.38 kB
"use strict"; 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;