0e8dc20a95fd8d2f3f161381d07f90a36e60b933
[poolifier.git] / examples / typescript / websocket-server-pool / ws-cluster / src / worker.ts
1 import { ClusterWorker } from 'poolifier'
2 import { type RawData, WebSocketServer } from 'ws'
3 import {
4 type DataPayload,
5 type MessagePayload,
6 MessageType,
7 type WorkerData,
8 type WorkerResponse
9 } from './types.js'
10
11 class WebSocketServerWorker extends ClusterWorker<WorkerData, WorkerResponse> {
12 private static wss: WebSocketServer
13
14 private static readonly factorial = (n: number): number => {
15 if (n === 0) {
16 return 1
17 }
18 return WebSocketServerWorker.factorial(n - 1) * n
19 }
20
21 private static readonly startWebSocketServer = (
22 workerData?: WorkerData
23 ): WorkerResponse => {
24 const { port } = workerData as WorkerData
25
26 WebSocketServerWorker.wss = new WebSocketServer({ port }, () => {
27 console.info(
28 `⚡️[ws server]: WebSocket server is started in cluster worker at ws://localhost:${port}/`
29 )
30 })
31
32 WebSocketServerWorker.wss.on('connection', ws => {
33 ws.on('error', console.error)
34 ws.on('message', (message: RawData) => {
35 const { type, data } = JSON.parse(
36 // eslint-disable-next-line @typescript-eslint/no-base-to-string
37 message.toString()
38 ) as MessagePayload<DataPayload>
39 switch (type) {
40 case MessageType.echo:
41 ws.send(
42 JSON.stringify({
43 type: MessageType.echo,
44 data
45 })
46 )
47 break
48 case MessageType.factorial:
49 ws.send(
50 JSON.stringify({
51 type: MessageType.factorial,
52 data: {
53 number: WebSocketServerWorker.factorial(data.number as number)
54 }
55 })
56 )
57 break
58 }
59 })
60 })
61 return {
62 status: true,
63 port: WebSocketServerWorker.wss.options.port
64 }
65 }
66
67 public constructor () {
68 super(WebSocketServerWorker.startWebSocketServer, {
69 killHandler: () => {
70 WebSocketServerWorker.wss.close()
71 }
72 })
73 }
74 }
75
76 export const webSocketServerWorker = new WebSocketServerWorker()