1 import { ClusterWorker
} from
'poolifier'
2 import { type RawData
, WebSocketServer
} from
'ws'
11 const factorial
: (n
: number) => number = (n
) => {
15 return factorial(n
- 1) * n
18 class WebSocketServerWorker
extends ClusterWorker
<WorkerData
, WorkerResponse
> {
19 private static wss
: WebSocketServer
21 private static readonly startWebSocketServer
= (
22 workerData
?: WorkerData
23 ): WorkerResponse
=> {
24 const { port
} = workerData
as WorkerData
26 WebSocketServerWorker
.wss
= new WebSocketServer({ port
}, () => {
28 `⚡️[ws server]: WebSocket server is started in cluster worker at ws://localhost:${port}/`
32 WebSocketServerWorker
.wss
.on('connection', (ws
) => {
33 ws
.on('error', console
.error
)
34 ws
.on('message', (message
: RawData
) => {
35 const { type, data
} = JSON
.parse(
36 // eslint-disable-next-line @typescript-eslint/no-base-to-string
38 ) as MessagePayload
<DataPayload
>
40 case MessageType
.echo
:
43 type: MessageType
.echo
,
48 case MessageType
.factorial
:
51 type: MessageType
.factorial
,
52 data
: { number: factorial(data
.number as number) }
61 port
: WebSocketServerWorker
.wss
.options
.port
65 public constructor () {
66 super(WebSocketServerWorker
.startWebSocketServer
, {
68 WebSocketServerWorker
.wss
.close()
74 export const webSocketServerWorker
= new WebSocketServerWorker()