refactor: refine worker termination error message
[poolifier.git] / src / pools / abstract-pool.ts
index 8332d31aefb2a9d91fac99bcea3a1d3690883be6..f76ad2f55bf4326383077456d7414aa8c023ea2e 100644 (file)
@@ -106,7 +106,9 @@ export abstract class AbstractPool<
     protected readonly opts: PoolOptions<Worker>
   ) {
     if (!this.isMain()) {
-      throw new Error('Cannot start a pool from a worker!')
+      throw new Error(
+        'Cannot start a pool from a worker with the same type as the pool'
+      )
     }
     this.checkNumberOfWorkers(this.numberOfWorkers)
     this.checkFilePath(this.filePath)
@@ -692,6 +694,23 @@ export abstract class AbstractPool<
     )
   }
 
+  protected async sendKillMessageToWorker (
+    workerNodeKey: number,
+    workerId: number
+  ): Promise<void> {
+    const waitForKillResponse = new Promise<void>((resolve, reject) => {
+      this.registerWorkerMessageListener(workerNodeKey, (message) => {
+        if (message.kill === 'success') {
+          resolve()
+        } else if (message.kill === 'failure') {
+          reject(new Error(`Worker ${workerId} kill message handling failed`))
+        }
+      })
+    })
+    this.sendToWorker(workerNodeKey, { kill: true, workerId })
+    await waitForKillResponse
+  }
+
   /**
    * Terminates the worker node given its worker node key.
    *
@@ -932,7 +951,7 @@ export abstract class AbstractPool<
       // Kill message received from worker
       if (
         isKillBehavior(KillBehaviors.HARD, message.kill) ||
-        (message.kill != null &&
+        (isKillBehavior(KillBehaviors.SOFT, message.kill) &&
           ((this.opts.enableTasksQueue === false &&
             workerUsage.tasks.executing === 0) ||
             (this.opts.enableTasksQueue === true &&