1 import type { Server
} from
'http'
2 import type { AddressInfo
} from
'net'
3 import { ClusterWorker
} from
'poolifier'
4 import express
, { type Express
, type Request
, type Response
} from
'express'
5 import { type WorkerData
, type WorkerResponse
} from
'./types.js'
7 const factorial
: (n
: number) => number = (n
) => {
11 return factorial(n
- 1) * n
14 class ExpressWorker
extends ClusterWorker
<WorkerData
, WorkerResponse
> {
15 private static server
: Server
17 private static readonly startExpress
= (
18 workerData
?: WorkerData
19 ): WorkerResponse
=> {
20 const application
: Express
= express()
22 // Parse only JSON requests body
23 application
.use(express
.json())
25 application
.all('/api/echo', (req
: Request
, res
: Response
) => {
26 res
.send(req
.body
).end()
29 application
.get('/api/factorial/:number', (req
: Request
, res
: Response
) => {
30 const { number } = req
.params
31 res
.send({ number: factorial(parseInt(number)) }).end()
34 ExpressWorker
.server
= application
.listen(workerData
?.port
, () => {
36 // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
37 `⚡️[express server]: Express server is started in cluster worker at http://localhost:${workerData?.port}/`
43 (ExpressWorker
.server
.address() as AddressInfo
)?.port
??
48 public constructor () {
49 super(ExpressWorker
.startExpress
, {
51 ExpressWorker
.server
.close()
57 export const expressWorker
= new ExpressWorker()