X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;ds=sidebyside;f=examples%2Ftypescript%2Fwebsocket-server-pool%2Fws-hybrid%2Fsrc%2Fwebsocket-server-worker.ts;h=e52f0c06c9331ee011b17b75c8724974c8329a3b;hb=d0ead7462ce381731756ad0786886d83e63b50e7;hp=8b1bf2e83ca25dba3c590be6817c241e4e6f4ce4;hpb=63ff88a9d5c789fe23036c1fed24e5d3853d2969;p=poolifier.git diff --git a/examples/typescript/websocket-server-pool/ws-hybrid/src/websocket-server-worker.ts b/examples/typescript/websocket-server-pool/ws-hybrid/src/websocket-server-worker.ts index 8b1bf2e8..e52f0c06 100644 --- a/examples/typescript/websocket-server-pool/ws-hybrid/src/websocket-server-worker.ts +++ b/examples/typescript/websocket-server-pool/ws-hybrid/src/websocket-server-worker.ts @@ -1,9 +1,10 @@ import { + availableParallelism, ClusterWorker, - DynamicThreadPool, - availableParallelism + DynamicThreadPool } from 'poolifier' import { type RawData, WebSocketServer } from 'ws' + import { type ClusterWorkerData, type ClusterWorkerResponse, @@ -15,33 +16,42 @@ import { } from './types.js' const emptyFunction = (): void => { - /** Intentional */ + /* Intentional */ } class WebSocketServerWorker extends ClusterWorker< ClusterWorkerData, ClusterWorkerResponse > { + private static wss: WebSocketServer + private static requestHandlerPool: DynamicThreadPool< + ThreadWorkerData, + ThreadWorkerResponse + > + private static readonly startWebSocketServer = ( workerData?: ClusterWorkerData ): ClusterWorkerResponse => { - const { port } = workerData as ClusterWorkerData - const 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, ThreadWorkerResponse >( - workerData?.minWorkers ?? 1, - workerData?.maxWorkers ?? availableParallelism(), - workerData?.workerFile as string + minWorkers ?? 1, + maxWorkers ?? availableParallelism(), + workerFile, + poolOptions ) - 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( @@ -59,7 +69,7 @@ ClusterWorkerResponse data: response.data }) ) - return null + return undefined }) .catch(emptyFunction) break @@ -68,12 +78,15 @@ ClusterWorkerResponse .execute({ data }, 'factorial') .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 @@ -82,17 +95,17 @@ ClusterWorkerResponse }) return { status: true, - port: wss.options.port + port: WebSocketServerWorker.wss.options.port } } - private static requestHandlerPool: DynamicThreadPool< - ThreadWorkerData, - ThreadWorkerResponse - > - public constructor () { - super(WebSocketServerWorker.startWebSocketServer) + super(WebSocketServerWorker.startWebSocketServer, { + killHandler: async () => { + await WebSocketServerWorker.requestHandlerPool.destroy() + WebSocketServerWorker.wss.close() + } + }) } }