c7ca23adee4a4c2c48ec5a06f9792f93d45438fe
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
} =
35 workerData
as ClusterWorkerData
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 // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
74 `⚡️[express server]: Express server is started in cluster worker at http://localhost:${port}/`
79 port
: (ExpressWorker
.server
.address() as AddressInfo
)?.port
?? port
83 public constructor () {
84 super(ExpressWorker
.startExpress
, {
85 killHandler
: async () => {
86 await ExpressWorker
.requestHandlerPool
.destroy()
87 ExpressWorker
.server
.close()
93 export const expressWorker
= new ExpressWorker()