X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=examples%2Ftypescript%2Fwebsocket-server-pool%2Fws-hybrid%2Fsrc%2Fwebsocket-server-worker.ts;h=437fae1b45600c5cb0bc700d690569c820b44b5e;hb=7d9756e3c95d4f46fab5f17080b107b825ec3890;hp=dfcba66789934c53b05c2f0ec10af81a24c93804;hpb=02999424382a7c531bcc2c0485d4ebbe76853d62;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 dfcba667..437fae1b 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,79 +1,107 @@ -import { ClusterWorker } from 'poolifier' +import { + ClusterWorker, + DynamicThreadPool, + availableParallelism +} from 'poolifier' import { type RawData, WebSocketServer } from 'ws' import { type ClusterWorkerData, type ClusterWorkerResponse, type DataPayload, type MessagePayload, - MessageType + MessageType, + type ThreadWorkerData, + type ThreadWorkerResponse } from './types.js' -import { requestHandlerPool } from './request-handler-pool.js' const emptyFunction = (): void => { /** Intentional */ } -const startWebSocketServer = ( - workerData?: ClusterWorkerData -): ClusterWorkerResponse => { - const { port } = workerData as ClusterWorkerData - const wss = new WebSocketServer({ port }, () => { - console.info( - `⚡️[ws server]: WebSocket server is started on cluster worker at ws://localhost:${port}/` +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, workerFile, minWorkers, maxWorkers, ...poolOptions } = + workerData as ClusterWorkerData + + WebSocketServerWorker.requestHandlerPool = new DynamicThreadPool< + ThreadWorkerData, + ThreadWorkerResponse + >( + minWorkers ?? 1, + maxWorkers ?? availableParallelism(), + workerFile, + poolOptions ) - }) - wss.on('connection', ws => { - ws.on('error', console.error) - ws.on('message', (message: RawData) => { - const { type, data } = JSON.parse( - // eslint-disable-next-line @typescript-eslint/no-base-to-string - message.toString() - ) as MessagePayload - switch (type) { - case MessageType.echo: - requestHandlerPool - .execute({ data }, 'echo') - .then(response => { - ws.send( - JSON.stringify({ - type: MessageType.echo, - data: response.data - }) - ) - return null - }) - .catch(emptyFunction) - break - case MessageType.factorial: - requestHandlerPool - .execute({ data }, 'factorial') - .then(response => { - ws.send( - JSON.stringify({ - type: MessageType.factorial, - data: response.data - }) - ) - return null - }) - .catch(emptyFunction) - break - } + WebSocketServerWorker.wss = new WebSocketServer({ port }, () => { + console.info( + `⚡️[ws server]: WebSocket server is started in cluster worker at ws://localhost:${port}/` + ) }) - }) - return { - status: true, - port: wss.options.port + + WebSocketServerWorker.wss.on('connection', (ws) => { + ws.on('error', console.error) + ws.on('message', (message: RawData) => { + const { type, data } = JSON.parse( + // eslint-disable-next-line @typescript-eslint/no-base-to-string + message.toString() + ) as MessagePayload + switch (type) { + case MessageType.echo: + WebSocketServerWorker.requestHandlerPool + .execute({ data }, 'echo') + .then((response) => { + ws.send( + JSON.stringify({ + type: MessageType.echo, + data: response.data + }) + ) + return null + }) + .catch(emptyFunction) + break + case MessageType.factorial: + WebSocketServerWorker.requestHandlerPool + .execute({ data }, 'factorial') + .then((response) => { + ws.send( + JSON.stringify({ + type: MessageType.factorial, + data: response.data + }) + ) + return null + }) + .catch(emptyFunction) + break + } + }) + }) + return { + status: true, + port: WebSocketServerWorker.wss.options.port + } } -} -class WebSocketServerWorker extends ClusterWorker< -ClusterWorkerData, -ClusterWorkerResponse -> { public constructor () { - super(startWebSocketServer) + super(WebSocketServerWorker.startWebSocketServer, { + killHandler: async () => { + await WebSocketServerWorker.requestHandlerPool.destroy() + WebSocketServerWorker.wss.close() + } + }) } }