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