worker-union
Version:
🤼♂️ Package that makes it easy and convenient to use native worker_threads module
71 lines (60 loc) • 1.67 kB
JavaScript
const workerThreads = require('worker_threads');
if (!workerThreads.isMainThread) {
const {
workerData: {
bufferAccessMap,
stateDataView,
initialData,
},
parentPort,
threadId: workerId,
} = workerThreads;
module.exports = class Worker {
constructor(handler) {
this.initialData = initialData;
this.id = workerId;
this.state = new Proxy({}, {
get: (target, key) => Boolean(stateDataView.getUint8(bufferAccessMap.get(key))),
set: (target, key, value) => stateDataView.setUint8(bufferAccessMap.get(key), value ? 1 : 0),
});
if (handler !== undefined) {
this.setMessageHandler(handler);
}
}
static getWorkerId() {
return workerId;
}
emit(data) {
parentPort.postMessage({
isEvent: true,
workerId,
data,
});
}
setMessageHandler(fn) {
parentPort.on('message', async ({ messageId, data }) => {
const resolve = response => parentPort.postMessage({
failed: false,
data: response,
messageId,
workerId,
});
const reject = error => parentPort.postMessage({
failed: true,
data: error,
messageId,
workerId,
});
try {
const result = await fn(data);
resolve(result);
} catch ({ message, stack }) {
// errors are not clonable objects, so we do this
reject({ message, stack });
}
});
}
};
} else {
throw new Error('This module should only be used in your worker file. You cannot use it in the main thread.');
}