f9364b43fe354fc91d6a661516035e72bc90fc4f
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'
13 ClusterWorkerResponse
,
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
} =
37 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
40 ExpressWorker
.requestHandlerPool
= new DynamicThreadPool
<
41 ThreadWorkerData
<DataPayload
>,
42 ThreadWorkerResponse
<DataPayload
>
45 maxWorkers
?? availableParallelism(),
50 const application
: Express
= express()
52 // Parse only JSON requests body
53 application
.use(express
.json())
55 application
.all('/api/echo', (req
: Request
, res
: Response
) => {
56 ExpressWorker
.requestHandlerPool
57 // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
58 .execute({ data
: req
.body
}, 'echo')
60 return res
.send(response
.data
).end()
65 application
.get('/api/factorial/:number', (req
: Request
, res
: Response
) => {
66 const { number } = req
.params
67 ExpressWorker
.requestHandlerPool
68 .execute({ data
: { number: Number.parseInt(number) } }, 'factorial')
70 return res
.send(response
.data
).end()
75 let listenerPort
: number | undefined
76 ExpressWorker
.server
= application
.listen(port
, () => {
77 listenerPort
= (ExpressWorker
.server
.address() as AddressInfo
).port
79 `⚡️[express server]: Express server is started in cluster worker at http://localhost:${listenerPort.toString()}/`
84 port
: listenerPort
?? port
,
88 public constructor () {
89 super(ExpressWorker
.startExpress
, {
90 killHandler
: async () => {
91 await ExpressWorker
.requestHandlerPool
.destroy()
92 ExpressWorker
.server
.close()
98 export const expressWorker
= new ExpressWorker()