Web Workers the Easy Way (TM).
No dependencies, less than 700 bytes when minified and gzipped.
Define workers inline or from a separate file, and work with promises to get the results.
import AutoWorker from 'autoworker';
$ browserify autoworker.js --standalone AutoWorker -o autoworker-browser.js
If only a single method is provided, it is exposed on the instance as run
.
let worker = new AutoWorker((a, b, c) => {
console.log('Calculating in a different thread!');
return a + b + c;
});
await worker.run(5, 10, 15); // 30
Note: Multiple methods on a single
AutoWorker
share the sameWorker
thread, so there is no concurrency (nor is there any concurrency for multiple calls to the same method).
let worker = new AutoWorker({
// destructure arguments from a single object
sum: ({ a, b, c }) => a + b + c,
// methods can be async as needed
asyncProduct: async (a, b, c) => a * b * c
});
await worker.sum({ a: 1, b: 2, c: 3 }); // 6
await worker.asyncProduct(2, 4, 8); // 64
When errors are caught while running methods, the promise is rejected:
let worker = new AutoWorker({
throws: () => { throw new Error('OHNO'); }
});
try {
await worker.throws();
} catch(err) {
// Error: OHNO
}
Since workers execute in a different thread, it can be confusing to see their definitions inline. To keep your workers in separate files:
sum.js
:
export default (a, b, c) => a + b + c;
import sum from './sum.js';
let worker = new AutoWorker(sum);
This software is released under the terms of the MIT license. See LICENSE
.