feat: add support for async kill handler
authorJérôme Benoit <jerome.benoit@sap.com>
Mon, 14 Aug 2023 18:06:08 +0000 (20:06 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Mon, 14 Aug 2023 18:06:08 +0000 (20:06 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
src/worker/abstract-worker.ts
src/worker/worker-options.ts
tests/worker/abstract-worker.test.js

index 512a822df295d17ba7578302274c4d87e615e9b9..493ca0b293fc145b2eae812f0e0dd858b9b4e566 100644 (file)
@@ -326,8 +326,15 @@ export abstract class AbstractWorker<
    */
   protected handleKillMessage (message: MessageValue<Data>): void {
     this.stopCheckActive()
-    this.opts.killHandler?.()
-    this.emitDestroy()
+    if (isAsyncFunction(this.opts.killHandler)) {
+      (this.opts.killHandler?.() as Promise<void>)
+        .then(() => this.emitDestroy())
+        .catch(EMPTY_FUNCTION)
+    } else {
+      // eslint-disable-next-line @typescript-eslint/no-invalid-void-type
+      this.opts.killHandler?.() as void
+      this.emitDestroy()
+    }
   }
 
   /**
index 97d4a30a59ed3d47503d59fe55eae393f8e52e9f..f829dcb3f25078aa6c1845c4fd367cc35129769e 100644 (file)
@@ -20,7 +20,7 @@ export type KillBehavior = keyof typeof KillBehaviors
 /**
  * Handler called when a worker is killed.
  */
-export type KillHandler = () => void
+export type KillHandler = () => void | Promise<void>
 
 /**
  * Options for workers.
index 6582961febd4fe699dc1b1a4977604f5023edf68..46370777f4e1fcb5e1df8cef70ecdff08472578f 100644 (file)
@@ -136,14 +136,15 @@ describe('Abstract worker test suite', () => {
     expect(worker.opts.killHandler.calledOnce).toBe(true)
   })
 
-  // it('Verify that async kill handler is called when worker is killed', () => {
-  //   const worker = new ClusterWorker(() => {}, {
-  //     killHandler: sinon.stub().resolves()
-  //   })
-  //   worker.isMain = false
-  //   worker.handleKillMessage()
-  //   expect(worker.opts.killHandler.calledOnce).toBe(true)
-  // })
+  it('Verify that async kill handler is called when worker is killed', () => {
+    const killHandlerStub = sinon.stub().returns()
+    const worker = new ClusterWorker(() => {}, {
+      killHandler: async () => Promise.resolve(killHandlerStub())
+    })
+    worker.isMain = false
+    worker.handleKillMessage()
+    expect(killHandlerStub.calledOnce).toBe(true)
+  })
 
   it('Verify that handleError() method works properly', () => {
     const error = new Error('Error as an error')