build: reenable eslint type checking
[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,
3a502712 9 type WorkerResponse,
72855e92
JB
10} from './types.js'
11
3d49c6d2
JB
12class WebSocketServerWorker extends ClusterWorker<WorkerData, WorkerResponse> {
13 private static wss: WebSocketServer
14
66f0c14c
JB
15 private static readonly factorial = (n: number | bigint): bigint => {
16 if (n === 0 || n === 1) {
17 return 1n
18 } else {
19 n = BigInt(n)
20 let factorial = 1n
21 for (let i = 1n; i <= n; i++) {
22 factorial *= i
23 }
24 return factorial
8538ea4c 25 }
8538ea4c
JB
26 }
27
3d49c6d2
JB
28 private static readonly startWebSocketServer = (
29 workerData?: WorkerData
30 ): WorkerResponse => {
3a502712 31 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
67f3f2d6 32 const { port } = workerData!
30369cc0 33
3d49c6d2
JB
34 WebSocketServerWorker.wss = new WebSocketServer({ port }, () => {
35 console.info(
6e5d7052 36 `⚡️[ws server]: WebSocket server is started in cluster worker at ws://localhost:${port.toString()}/`
3d49c6d2
JB
37 )
38 })
72855e92 39
041dc05b 40 WebSocketServerWorker.wss.on('connection', ws => {
3d49c6d2
JB
41 ws.on('error', console.error)
42 ws.on('message', (message: RawData) => {
43 const { type, data } = JSON.parse(
6e5d7052 44 // eslint-disable-next-line @typescript-eslint/no-base-to-string
3d49c6d2
JB
45 message.toString()
46 ) as MessagePayload<DataPayload>
47 switch (type) {
48 case MessageType.echo:
49 ws.send(
50 JSON.stringify({
51 type: MessageType.echo,
3a502712 52 data,
3d49c6d2
JB
53 })
54 )
55 break
56 case MessageType.factorial:
57 ws.send(
66f0c14c
JB
58 JSON.stringify(
59 {
60 type: MessageType.factorial,
61 data: {
3a502712
JB
62 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
63 number: WebSocketServerWorker.factorial(data.number!),
64 },
66f0c14c 65 },
6e5d7052 66 (_, v: unknown) => (typeof v === 'bigint' ? v.toString() : v)
66f0c14c 67 )
3d49c6d2
JB
68 )
69 break
70 }
71 })
72855e92 72 })
3d49c6d2
JB
73 return {
74 status: true,
3a502712 75 port: WebSocketServerWorker.wss.options.port,
3d49c6d2 76 }
72855e92 77 }
72855e92 78
72855e92 79 public constructor () {
e8f1b611
JB
80 super(WebSocketServerWorker.startWebSocketServer, {
81 killHandler: () => {
82 WebSocketServerWorker.wss.close()
3a502712 83 },
e8f1b611 84 })
72855e92
JB
85 }
86}
87
88export const webSocketServerWorker = new WebSocketServerWorker()