UNPKG

@trustcomponent/trustcaptcha-frontend

Version:

TrustCaptcha – Privacy-first CAPTCHA solution. GDPR-compliant, bot protection made in Europe.

68 lines (67 loc) 2.26 kB
import { powWorkerScript } from "./pow-worker-script"; export class WorkerPool { constructor() { this.queue = []; this.activeTasks = 0; this.workers = []; this.isReset = false; const blob = new Blob([powWorkerScript], { type: "application/javascript" }); this.objectUrl = URL.createObjectURL(blob); this.maxWorkers = Math.min(Math.max(4, navigator.hardwareConcurrency || 4), 10); } enqueue(task, difficulty) { return new Promise((resolve, reject) => { if (this.isReset) { reject(new Error("WorkerPool has been reset")); return; } this.queue.push({ task, difficulty, resolve, reject }); this.processQueue(); }); } processQueue() { if (this.queue.length === 0 || this.activeTasks >= this.maxWorkers || this.isReset) { return; } const { task, difficulty, resolve, reject } = this.queue.shift(); this.activeTasks++; const worker = new Worker(this.objectUrl); this.workers.push(worker); worker.postMessage({ task, difficulty }); worker.onmessage = (event) => { if (this.isReset) { reject(new Error("WorkerPool has been reset")); } else { resolve(event.data); } this.activeTasks--; this.workers.splice(this.workers.indexOf(worker), 1); worker.terminate(); this.processQueue(); }; worker.onerror = () => { if (!this.isReset) { reject(new Error("Worker error")); } else { reject(new Error("WorkerPool has been reset")); } this.activeTasks--; this.workers.splice(this.workers.indexOf(worker), 1); worker.terminate(); this.processQueue(); }; } reset() { this.isReset = true; // Terminate all active workers for (const worker of this.workers) { worker.terminate(); } this.workers = []; // Clear the queue this.queue = []; } } //# sourceMappingURL=worker-pool.js.map