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' });
Create a free account and build your private vault. Share publicly whenever you want.