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