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 const { port
} = workerData
!
30 const application
: Express
= express()
32 // Parse only JSON requests body
33 application
.use(express
.json())
35 application
.all('/api/echo', (req
: Request
, res
: Response
) => {
36 res
.send(req
.body
).end()
39 application
.get('/api/factorial/:number', (req
: Request
, res
: Response
) => {
40 const { number } = req
.params
42 .send({ number: ExpressWorker
.factorial(parseInt(number)).toString() })
46 let listenerPort
: number | undefined
47 ExpressWorker
.server
= application
.listen(port
, () => {
48 listenerPort
= (ExpressWorker
.server
.address() as AddressInfo
).port
50 `⚡️[express server]: Express server is started in cluster worker at http://localhost:${listenerPort}/`
55 port
: listenerPort
?? port
59 public constructor () {
60 super(ExpressWorker
.startExpress
, {
62 ExpressWorker
.server
.close()
68 export const expressWorker
= new ExpressWorker()