1 import { ClusterWorker
} from
'poolifier'
2 import { type RawData
, WebSocketServer
} from
'ws'
12 class WebSocketServerWorker
extends ClusterWorker
<WorkerData
, WorkerResponse
> {
13 private static wss
: WebSocketServer
15 private static readonly factorial
= (n
: number | bigint
): bigint
=> {
16 if (n
=== 0 || n
=== 1) {
21 for (let i
= 1n
; i
<= n
; i
++) {
28 private static readonly startWebSocketServer
= (
29 workerData
?: WorkerData
30 ): WorkerResponse
=> {
31 const { port
} = workerData
!
33 WebSocketServerWorker
.wss
= new WebSocketServer({ port
}, () => {
35 `⚡️[ws server]: WebSocket server is started in cluster worker at ws://localhost:${port}/`
39 WebSocketServerWorker
.wss
.on('connection', ws
=> {
40 ws
.on('error', console
.error
)
41 ws
.on('message', (message
: RawData
) => {
42 const { type, data
} = JSON
.parse(
43 // eslint-disable-next-line @typescript-eslint/no-base-to-string
45 ) as MessagePayload
<DataPayload
>
47 case MessageType
.echo
:
50 type: MessageType
.echo
,
55 case MessageType
.factorial
:
59 type: MessageType
.factorial
,
61 number: WebSocketServerWorker
.factorial(data
.number!)
64 (_
, v
) => (typeof v
=== 'bigint' ? v
.toString() : v
)
73 port
: WebSocketServerWorker
.wss
.options
.port
77 public constructor () {
78 super(WebSocketServerWorker
.startWebSocketServer
, {
80 WebSocketServerWorker
.wss
.close()
86 export const webSocketServerWorker
= new WebSocketServerWorker()