@trustcomponent/trustcaptcha-frontend
Version:
TrustCaptcha – Privacy-first CAPTCHA solution. GDPR-compliant, bot protection made in Europe.
68 lines (67 loc) • 2.26 kB
JavaScript
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