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