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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
32 const { port
} = workerData
!
34 WebSocketServerWorker
.wss
= new WebSocketServer({ port
}, () => {
36 `⚡️[ws server]: WebSocket server is started in cluster worker at ws://localhost:${port.toString()}/`
40 WebSocketServerWorker
.wss
.on('connection', ws
=> {
41 ws
.on('error', console
.error
)
42 ws
.on('message', (message
: RawData
) => {
43 const { type, data
} = JSON
.parse(
44 // eslint-disable-next-line @typescript-eslint/no-base-to-string
46 ) as MessagePayload
<DataPayload
>
48 case MessageType
.echo
:
51 type: MessageType
.echo
,
56 case MessageType
.factorial
:
60 type: MessageType
.factorial
,
62 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
63 number: WebSocketServerWorker
.factorial(data
.number!),
66 (_
, v
: unknown
) => (typeof v
=== 'bigint' ? v
.toString() : v
)
75 port
: WebSocketServerWorker
.wss
.options
.port
,
79 public constructor () {
80 super(WebSocketServerWorker
.startWebSocketServer
, {
82 WebSocketServerWorker
.wss
.close()
88 export const webSocketServerWorker
= new WebSocketServerWorker()