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