78a18d67f79eda45815b987bb9b3bafb6fe459e0
1 import type { Server
} from
'node:http'
2 import type { AddressInfo
} from
'node:net'
4 import express
, { type Express
, type Request
, type Response
} from
'express'
12 type ClusterWorkerData
,
13 type ClusterWorkerResponse
,
15 type ThreadWorkerData
,
16 type ThreadWorkerResponse
19 const emptyFunction
= (): void => {
23 class ExpressWorker
extends ClusterWorker
<
27 private static server
: Server
28 private static requestHandlerPool
: DynamicThreadPool
<
29 ThreadWorkerData
<DataPayload
>,
30 ThreadWorkerResponse
<DataPayload
>
33 private static readonly startExpress
= (
34 workerData
?: ClusterWorkerData
35 ): ClusterWorkerResponse
=> {
36 const { port
, workerFile
, minWorkers
, maxWorkers
, ...poolOptions
} =
39 ExpressWorker
.requestHandlerPool
= new DynamicThreadPool
<
40 ThreadWorkerData
<DataPayload
>,
41 ThreadWorkerResponse
<DataPayload
>
44 maxWorkers
?? availableParallelism(),
49 const application
: Express
= express()
51 // Parse only JSON requests body
52 application
.use(express
.json())
54 application
.all('/api/echo', (req
: Request
, res
: Response
) => {
55 ExpressWorker
.requestHandlerPool
56 .execute({ data
: req
.body
}, 'echo')
58 return res
.send(response
.data
).end()
63 application
.get('/api/factorial/:number', (req
: Request
, res
: Response
) => {
64 const { number } = req
.params
65 ExpressWorker
.requestHandlerPool
66 .execute({ data
: { number: parseInt(number) } }, 'factorial')
68 return res
.send(response
.data
).end()
73 ExpressWorker
.server
= application
.listen(port
, () => {
75 `⚡️[express server]: Express server is started in cluster worker at http://localhost:${port}/`
80 port
: (ExpressWorker
.server
.address() as AddressInfo
).port
84 public constructor () {
85 super(ExpressWorker
.startExpress
, {
86 killHandler
: async () => {
87 await ExpressWorker
.requestHandlerPool
.destroy()
88 ExpressWorker
.server
.close()
94 export const expressWorker
= new ExpressWorker()