fix: ensure `worker_threads` workers are unreferenced at termination
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Sun, 11 Feb 2024 15:25:16 +0000 (16:25 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Sun, 11 Feb 2024 15:25:16 +0000 (16:25 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
CHANGELOG.md
src/pools/worker-node.ts
src/pools/worker.ts

index ab225e9617e340acf06adce1447ef3327b2f05c8..36a6bc5011810d3a8c935225294e06cea110de04 100644 (file)
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ## [Unreleased]
 
+### Fixed
+
+- Ensure `worker_threads` workers are unreferenced at termination.
+
 ## [3.1.19] - 2024-01-16
 
 ### Fixed
index 308215176edb515851c2349ba550d3cc50e2611b..523036a5eac6f57db2966131652b29da6423fea1 100644 (file)
@@ -137,6 +137,7 @@ export class WorkerNode<Worker extends IWorker, Data = unknown>
     this.removeAllListeners()
     switch (this.info.type) {
       case WorkerTypes.thread:
+        this.worker.unref?.()
         await this.worker.terminate?.()
         break
       case WorkerTypes.cluster:
index 05f6606edde672db081d9f392e9584ebc7a917f7..d40754835ab040d7fd8f947238bb9b857c6d58a6 100644 (file)
@@ -235,6 +235,12 @@ export interface IWorker extends EventEmitter {
    * @param handler - The event handler.
    */
   readonly once: (event: string, handler: EventHandler<this>) => this
+  /**
+   * Calling `unref()` on a worker allows the thread to exit if this is the only
+   * active handle in the event system. If the worker is already `unref()`ed calling`unref()` again has no effect.
+   * @since v10.5.0
+   */
+  readonly unref?: () => void
   /**
    * Stop all JavaScript execution in the worker thread as soon as possible.
    * Returns a Promise for the exit code that is fulfilled when the `'exit' event` is emitted.