async-worker-ts 🔱
A type-safe package designed to simplify the usage of worker threads on the server or browser.
Usage:
import createWorker, { task } from "async-worker-ts"
const worker = createWorker({
calculatePi: (iterations: number) => {
let pi = 0
for (let i = 0; i < iterations; i++) {
pi += Math.pow(-1, i) / (2 * i + 1)
}
return pi * 4
},
todos: {
get: () => {
},
add: () => {
},
delete: () => {
},
},
})
await worker.calculatePi(1_000_000).then(console.log)
await worker.exit()
Accessing procedures within procedures:
import createWorker from "async-worker-ts"
const worker = createWorker({
addRandomNumbers: function () {
const a = this.randomNumber()
const b = this.randomNumber()
return a + b
},
randomNumber: () => {
return Math.random() * 42
},
})
Emitting data via Tasks:
import createWorker, { task } from "async-worker-ts"
const worker = createWorker({
calculatePi: task(function (iterations: number) {
let pi = 0
for (let i = 0; i < iterations; i++) {
pi += Math.pow(-1, i) / (2 * i + 1)
if (i % (iterations / 100) === 0) this.emit("progress", i / iterations)
}
return pi * 4
}),
})
await worker
.calculatePi(1_000_000)
.on("progress", console.log)
.then(console.log)
Concurrency and batching:
import createWorker from "async-worker-ts"
const worker = createWorker({
calculatePi: (iterations: number) => {
let pi = 0
for (let i = 0; i < iterations; i++) {
pi += Math.pow(-1, i) / (2 * i + 1)
}
return pi * 4
},
})
worker.concurrently((w) => w.calculatePi(1_000_000))
for (let i = 0; i < 4; i++) {
worker.concurrently((w) => w.calculatePi(1_000_000))
}
Transferables:
import createWorker, { transfer } from "async-worker-ts"
const worker = createWorker({
drawToCanvas: (OffscreenCanvas) => {
},
})
const canvas = document.createElement("canvas")
const offscreenCvs = canvas.transferControlToOffscreen()
worker.drawToCanvas(transfer(offscreenCvs))
That's it! God help your CPU 😀