chore: v3.1.0
[poolifier.git] / src / pools / worker-node.ts
index 9a98458e59547378cef70ad00dcbb36fe6be695e..d80c03d80f00edc474da050ca41c8297c12142dd 100644 (file)
@@ -49,7 +49,7 @@ export class WorkerNode<Worker extends IWorker, Data = unknown>
    * Constructs a new worker node.
    *
    * @param type - The worker type.
-   * @param filePath - The worker file path.
+   * @param filePath - Path to the worker file.
    * @param opts - The worker node options.
    */
   constructor (type: WorkerType, filePath: string, opts: WorkerNodeOptions) {
@@ -124,38 +124,47 @@ export class WorkerNode<Worker extends IWorker, Data = unknown>
   }
 
   /** @inheritdoc */
-  public closeChannel (): void {
-    if (this.messageChannel != null) {
-      this.messageChannel.port1.unref()
-      this.messageChannel.port2.unref()
-      this.messageChannel.port1.close()
-      this.messageChannel.port2.close()
-      delete this.messageChannel
+  public async terminate (): Promise<void> {
+    const waitWorkerExit = new Promise<void>(resolve => {
+      this.registerOnceWorkerEventHandler('exit', () => {
+        resolve()
+      })
+    })
+    this.closeMessageChannel()
+    this.removeAllListeners()
+    if (this.info.type === WorkerTypes.thread) {
+      await this.worker.terminate?.()
+    } else if (this.info.type === WorkerTypes.cluster) {
+      this.registerOnceWorkerEventHandler('disconnect', () => {
+        this.worker.kill?.()
+      })
+      this.worker.disconnect?.()
     }
+    await waitWorkerExit
   }
 
   /** @inheritdoc */
   public registerWorkerEventHandler (
     event: string,
-    listener:
+    handler:
     | OnlineHandler<Worker>
     | MessageHandler<Worker>
     | ErrorHandler<Worker>
     | ExitHandler<Worker>
   ): void {
-    this.worker.on(event, listener)
+    this.worker.on(event, handler)
   }
 
   /** @inheritdoc */
   public registerOnceWorkerEventHandler (
     event: string,
-    listener:
+    handler:
     | OnlineHandler<Worker>
     | MessageHandler<Worker>
     | ErrorHandler<Worker>
     | ExitHandler<Worker>
   ): void {
-    this.worker.once(event, listener)
+    this.worker.once(event, handler)
   }
 
   /** @inheritdoc */
@@ -187,6 +196,16 @@ export class WorkerNode<Worker extends IWorker, Data = unknown>
     return this.taskFunctionsUsage.delete(name)
   }
 
+  private closeMessageChannel (): void {
+    if (this.messageChannel != null) {
+      this.messageChannel.port1.unref()
+      this.messageChannel.port2.unref()
+      this.messageChannel.port1.close()
+      this.messageChannel.port2.close()
+      delete this.messageChannel
+    }
+  }
+
   private initWorkerInfo (worker: Worker): WorkerInfo {
     return {
       id: getWorkerId(worker),