refactor: cleanup eslint configuration
[poolifier.git] / examples / typescript / websocket-server-pool / ws-cluster / src / worker.ts
CommitLineData
72855e92
JB
1import { ClusterWorker } from 'poolifier'
2import { type RawData, WebSocketServer } from 'ws'
ded253e2 3
72855e92
JB
4import {
5 type DataPayload,
6 type MessagePayload,
7 MessageType,
8 type WorkerData,
9 type WorkerResponse
10} from './types.js'
11
3d49c6d2
JB
12class WebSocketServerWorker extends ClusterWorker<WorkerData, WorkerResponse> {
13 private static wss: WebSocketServer
14
8538ea4c
JB
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
3d49c6d2
JB
22 private static readonly startWebSocketServer = (
23 workerData?: WorkerData
24 ): WorkerResponse => {
67f3f2d6 25 const { port } = workerData!
30369cc0 26
3d49c6d2
JB
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 })
72855e92 32
041dc05b 33 WebSocketServerWorker.wss.on('connection', ws => {
3d49c6d2
JB
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,
8538ea4c 53 data: {
67f3f2d6 54 number: WebSocketServerWorker.factorial(data.number!)
8538ea4c 55 }
3d49c6d2
JB
56 })
57 )
58 break
59 }
60 })
72855e92 61 })
3d49c6d2
JB
62 return {
63 status: true,
64 port: WebSocketServerWorker.wss.options.port
65 }
72855e92 66 }
72855e92 67
72855e92 68 public constructor () {
e8f1b611
JB
69 super(WebSocketServerWorker.startWebSocketServer, {
70 killHandler: () => {
71 WebSocketServerWorker.wss.close()
72 }
73 })
72855e92
JB
74 }
75}
76
77export const webSocketServerWorker = new WebSocketServerWorker()