6 import { type RawData
, WebSocketServer
} from
'ws'
8 type ClusterWorkerData
,
9 type ClusterWorkerResponse
,
13 type ThreadWorkerData
,
14 type ThreadWorkerResponse
17 const emptyFunction
= (): void => {
21 class WebSocketServerWorker
extends ClusterWorker
<
25 private static wss
: WebSocketServer
26 private static requestHandlerPool
: DynamicThreadPool
<
27 ThreadWorkerData
<DataPayload
>,
28 ThreadWorkerResponse
<DataPayload
>
31 private static readonly startWebSocketServer
= (
32 workerData
?: ClusterWorkerData
33 ): ClusterWorkerResponse
=> {
34 const { port
} = workerData
as ClusterWorkerData
35 WebSocketServerWorker
.wss
= new WebSocketServer({ port
}, () => {
37 `⚡️[ws server]: WebSocket server is started in cluster worker at ws://localhost:${port}/`
41 WebSocketServerWorker
.requestHandlerPool
= new DynamicThreadPool
<
42 ThreadWorkerData
<DataPayload
>,
43 ThreadWorkerResponse
<DataPayload
>
45 workerData
?.minWorkers
?? 1,
46 workerData
?.maxWorkers
?? availableParallelism(),
47 workerData
?.workerFile
as string
50 WebSocketServerWorker
.wss
.on('connection', (ws
) => {
51 ws
.on('error', console
.error
)
52 ws
.on('message', (message
: RawData
) => {
53 const { type, data
} = JSON
.parse(
54 // eslint-disable-next-line @typescript-eslint/no-base-to-string
56 ) as MessagePayload
<DataPayload
>
58 case MessageType
.echo
:
59 WebSocketServerWorker
.requestHandlerPool
60 .execute({ data
}, 'echo')
64 type: MessageType
.echo
,
72 case MessageType
.factorial
:
73 WebSocketServerWorker
.requestHandlerPool
74 .execute({ data
}, 'factorial')
78 type: MessageType
.factorial
,
91 port
: WebSocketServerWorker
.wss
.options
.port
95 public constructor () {
96 super(WebSocketServerWorker
.startWebSocketServer
)
100 export const webSocketServerWorker
= new WebSocketServerWorker()