build(deps-dev): apply updates
[poolifier.git] / examples / typescript / websocket-server-pool / ws-hybrid / src / websocket-server-worker.ts
index 0a1cbdfd956b04265e277b13c5607dad6af5cc37..e52f0c06c9331ee011b17b75c8724974c8329a3b 100644 (file)
@@ -1,9 +1,10 @@
 import {
+  availableParallelism,
   ClusterWorker,
-  DynamicThreadPool,
-  availableParallelism
+  DynamicThreadPool
 } from 'poolifier'
 import { type RawData, WebSocketServer } from 'ws'
+
 import {
   type ClusterWorkerData,
   type ClusterWorkerResponse,
@@ -15,7 +16,7 @@ import {
 } from './types.js'
 
 const emptyFunction = (): void => {
-  /** Intentional */
+  /* Intentional */
 }
 
 class WebSocketServerWorker extends ClusterWorker<
@@ -31,23 +32,26 @@ ClusterWorkerResponse
   private static readonly startWebSocketServer = (
     workerData?: ClusterWorkerData
   ): ClusterWorkerResponse => {
-    const { port } = workerData as ClusterWorkerData
-    WebSocketServerWorker.wss = new WebSocketServer({ port }, () => {
-      console.info(
-        `⚡️[ws server]: WebSocket server is started in cluster worker at ws://localhost:${port}/`
-      )
-    })
+    const { port, workerFile, minWorkers, maxWorkers, ...poolOptions } =
+      workerData!
 
     WebSocketServerWorker.requestHandlerPool = new DynamicThreadPool<
     ThreadWorkerData<DataPayload>,
     ThreadWorkerResponse<DataPayload>
     >(
-      workerData?.minWorkers ?? 1,
-      workerData?.maxWorkers ?? availableParallelism(),
-      workerData?.workerFile as string
+      minWorkers ?? 1,
+      maxWorkers ?? availableParallelism(),
+      workerFile,
+      poolOptions
     )
 
-    WebSocketServerWorker.wss.on('connection', (ws) => {
+    WebSocketServerWorker.wss = new WebSocketServer({ port }, () => {
+      console.info(
+        `⚡️[ws server]: WebSocket server is started in cluster worker at ws://localhost:${port}/`
+      )
+    })
+
+    WebSocketServerWorker.wss.on('connection', ws => {
       ws.on('error', console.error)
       ws.on('message', (message: RawData) => {
         const { type, data } = JSON.parse(
@@ -58,28 +62,31 @@ ClusterWorkerResponse
           case MessageType.echo:
             WebSocketServerWorker.requestHandlerPool
               .execute({ data }, 'echo')
-              .then((response) => {
+              .then(response => {
                 ws.send(
                   JSON.stringify({
                     type: MessageType.echo,
                     data: response.data
                   })
                 )
-                return null
+                return undefined
               })
               .catch(emptyFunction)
             break
           case MessageType.factorial:
             WebSocketServerWorker.requestHandlerPool
               .execute({ data }, 'factorial')
-              .then((response) => {
+              .then(response => {
                 ws.send(
-                  JSON.stringify({
-                    type: MessageType.factorial,
-                    data: response.data
-                  })
+                  JSON.stringify(
+                    {
+                      type: MessageType.factorial,
+                      data: response.data
+                    },
+                    (_, v) => (typeof v === 'bigint' ? v.toString() : v)
+                  )
                 )
-                return null
+                return undefined
               })
               .catch(emptyFunction)
             break
@@ -94,7 +101,8 @@ ClusterWorkerResponse
 
   public constructor () {
     super(WebSocketServerWorker.startWebSocketServer, {
-      killHandler: () => {
+      killHandler: async () => {
+        await WebSocketServerWorker.requestHandlerPool.destroy()
         WebSocketServerWorker.wss.close()
       }
     })