8cc041d4ee20c5f8e1fac45c96914019abcc2d9e
1 import type { Server
} from
'node:http'
2 import type { AddressInfo
} from
'node:net'
8 import express
, { type Express
, type Request
, type Response
} from
'express'
10 type ClusterWorkerData
,
11 type ClusterWorkerResponse
,
13 type ThreadWorkerData
,
14 type ThreadWorkerResponse
17 const emptyFunction
= (): void => {
21 class ExpressWorker
extends ClusterWorker
<
25 private static server
: Server
26 private static requestHandlerPool
: DynamicThreadPool
<
27 ThreadWorkerData
<DataPayload
>,
28 ThreadWorkerResponse
<DataPayload
>
31 private static readonly startExpress
= (
32 workerData
?: ClusterWorkerData
33 ): ClusterWorkerResponse
=> {
34 const { port
, workerFile
, minWorkers
, maxWorkers
, ...poolOptions
} =
37 ExpressWorker
.requestHandlerPool
= new DynamicThreadPool
<
38 ThreadWorkerData
<DataPayload
>,
39 ThreadWorkerResponse
<DataPayload
>
42 maxWorkers
?? availableParallelism(),
47 const application
: Express
= express()
49 // Parse only JSON requests body
50 application
.use(express
.json())
52 application
.all('/api/echo', (req
: Request
, res
: Response
) => {
53 ExpressWorker
.requestHandlerPool
54 .execute({ data
: req
.body
}, 'echo')
56 return res
.send(response
.data
).end()
61 application
.get('/api/factorial/:number', (req
: Request
, res
: Response
) => {
62 const { number } = req
.params
63 ExpressWorker
.requestHandlerPool
64 .execute({ data
: { number: parseInt(number) } }, 'factorial')
66 return res
.send(response
.data
).end()
71 ExpressWorker
.server
= application
.listen(port
, () => {
73 `⚡️[express server]: Express server is started in cluster worker at http://localhost:${port}/`
78 port
: (ExpressWorker
.server
.address() as AddressInfo
).port
82 public constructor () {
83 super(ExpressWorker
.startExpress
, {
84 killHandler
: async () => {
85 await ExpressWorker
.requestHandlerPool
.destroy()
86 ExpressWorker
.server
.close()
92 export const expressWorker
= new ExpressWorker()