a2dbcefee3086ec5a21b96d0a7e666514dba7651
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 { port
} = workerData
as WorkerData
22 const application
: Express
= express()
24 // Parse only JSON requests body
25 application
.use(express
.json())
27 application
.all('/api/echo', (req
: Request
, res
: Response
) => {
28 res
.send(req
.body
).end()
31 application
.get('/api/factorial/:number', (req
: Request
, res
: Response
) => {
32 const { number } = req
.params
33 res
.send({ number: factorial(parseInt(number)) }).end()
36 ExpressWorker
.server
= application
.listen(port
, () => {
38 // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
39 `⚡️[express server]: Express server is started in cluster worker at http://localhost:${port}/`
44 port
: (ExpressWorker
.server
.address() as AddressInfo
)?.port
?? port
48 public constructor () {
49 super(ExpressWorker
.startExpress
, {
51 ExpressWorker
.server
.close()
57 export const expressWorker
= new ExpressWorker()