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 | bigint
): bigint
=> {
13 if (n
=== 0 || n
=== 1) {
18 for (let i
= 1n
; i
<= n
; i
++) {
25 private static readonly startExpress
= (
26 workerData
?: WorkerData
27 ): WorkerResponse
=> {
28 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
29 const { port
} = workerData
!
31 const application
: Express
= express()
33 // Parse only JSON requests body
34 application
.use(express
.json())
36 application
.all('/api/echo', (req
: Request
, res
: Response
) => {
37 res
.send(req
.body
).end()
40 application
.get('/api/factorial/:number', (req
: Request
, res
: Response
) => {
41 const { number } = req
.params
44 number: ExpressWorker
.factorial(Number.parseInt(number)).toString(),
49 let listenerPort
: number | undefined
50 ExpressWorker
.server
= application
.listen(port
, () => {
51 listenerPort
= (ExpressWorker
.server
.address() as AddressInfo
).port
53 `⚡️[express server]: Express server is started in cluster worker at http://localhost:${listenerPort.toString()}/`
58 port
: listenerPort
?? port
,
62 public constructor () {
63 super(ExpressWorker
.startExpress
, {
65 ExpressWorker
.server
.close()
71 export const expressWorker
= new ExpressWorker()