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'
5 import { ClusterWorker
} from
'poolifier'
7 import type { WorkerData
, WorkerResponse
} from
'./types.js'
9 class ExpressWorker
extends ClusterWorker
<WorkerData
, WorkerResponse
> {
10 private static server
: Server
12 private static readonly factorial
= (n
: number): number => {
16 return ExpressWorker
.factorial(n
- 1) * n
19 private static readonly startExpress
= (
20 workerData
?: WorkerData
21 ): WorkerResponse
=> {
22 const { port
} = workerData
!
24 const application
: Express
= express()
26 // Parse only JSON requests body
27 application
.use(express
.json())
29 application
.all('/api/echo', (req
: Request
, res
: Response
) => {
30 res
.send(req
.body
).end()
33 application
.get('/api/factorial/:number', (req
: Request
, res
: Response
) => {
34 const { number } = req
.params
35 res
.send({ number: ExpressWorker
.factorial(parseInt(number)) }).end()
38 ExpressWorker
.server
= application
.listen(port
, () => {
40 `⚡️[express server]: Express server is started in cluster worker at http://localhost:${port}/`
45 port
: (ExpressWorker
.server
.address() as AddressInfo
).port
49 public constructor () {
50 super(ExpressWorker
.startExpress
, {
52 ExpressWorker
.server
.close()
58 export const expressWorker
= new ExpressWorker()