node-worker-threads-pool-ts
Version:
Simple worker threads pool using Node's worker_threads module. Compatible with ES6+ Promise, Typescript, Async/Await.
63 lines • 2.06 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PoolWorker = void 0;
const worker_threads_1 = require("worker_threads");
const promise_with_timer_1 = require("./promise-with-timer");
class PoolWorker extends worker_threads_1.Worker {
constructor(filename, options, isDone) {
super(filename, options);
this.isDone = isDone;
this.ready = false;
this.once("online", () => this.readyToWork());
}
run(param, taskConfig) {
this.ready = false;
const timeout = taskConfig.timeout ? taskConfig.timeout : 0;
const transferList = taskConfig.transferList;
const { isDone } = this;
const taskPromise = new Promise((resolve, reject) => {
const self = this;
function message(res) {
if (isDone) {
if (isDone(res)) {
self.removeListener("message", message);
}
else {
return;
}
}
self.removeListener("error", error);
self.readyToWork();
resolve(res);
}
function error(err) {
self.removeListener("message", message);
reject(err);
}
if (!this.isDone)
this.once("message", message);
else
this.on("message", message);
this.once("error", error);
this.postMessage(param, transferList);
});
return new promise_with_timer_1.PromiseWithTimer(taskPromise, timeout).startRace();
}
readyToWork() {
this.ready = true;
this.emit("ready", this);
}
/**
* @override
*/
terminate() {
this.once("exit", () => {
setImmediate(() => {
this.removeAllListeners();
});
});
return super.terminate();
}
}
exports.PoolWorker = PoolWorker;
//# sourceMappingURL=pool-worker.js.map