// Created on savesnippets.com ยท https://savesnippets.com/sYAVs8XVqiFgHe function createWorkerPool(workerScript, poolSize = navigator.hardwareConcurrency ?? 4) { const workers = Array.from({ length: poolSize }, () => new Worker(workerScript)); let index = 0; return { run(data) { const worker = workers[index++ % poolSize]; return new Promise((resolve, reject) => { const handler = ({ data: result }) => { worker.removeEventListener('message', handler); worker.removeEventListener('error', errHandler); resolve(result); }; const errHandler = (e) => { worker.removeEventListener('message', handler); worker.removeEventListener('error', errHandler); reject(e); }; worker.addEventListener('message', handler); worker.addEventListener('error', errHandler); worker.postMessage(data); }); }, terminate() { workers.forEach((w) => w.terminate()); }, }; } // Usage const pool = createWorkerPool('/workers/hash.worker.js', 4); const hash = await pool.run({ algorithm: 'SHA-256', data: 'hello' });