e04900ab2474afa7833c6bde6c5086030ab3882f
[poolifier.git] / examples / typescript / http-server-pool / express-cluster / src / worker.ts
1 import type { Server } from 'node:http'
2 import type { AddressInfo } from 'node:net'
3
4 import express, { type Express, type Request, type Response } from 'express'
5 import { ClusterWorker } from 'poolifier'
6
7 import type { WorkerData, WorkerResponse } from './types.js'
8
9 class ExpressWorker extends ClusterWorker<WorkerData, WorkerResponse> {
10 private static server: Server
11
12 private static readonly factorial = (n: number): number => {
13 if (n === 0) {
14 return 1
15 }
16 return ExpressWorker.factorial(n - 1) * n
17 }
18
19 private static readonly startExpress = (
20 workerData?: WorkerData
21 ): WorkerResponse => {
22 const { port } = workerData!
23
24 const application: Express = express()
25
26 // Parse only JSON requests body
27 application.use(express.json())
28
29 application.all('/api/echo', (req: Request, res: Response) => {
30 res.send(req.body).end()
31 })
32
33 application.get('/api/factorial/:number', (req: Request, res: Response) => {
34 const { number } = req.params
35 res.send({ number: ExpressWorker.factorial(parseInt(number)) }).end()
36 })
37
38 ExpressWorker.server = application.listen(port, () => {
39 console.info(
40 `⚡️[express server]: Express server is started in cluster worker at http://localhost:${port}/`
41 )
42 })
43 return {
44 status: true,
45 port: (ExpressWorker.server.address() as AddressInfo).port
46 }
47 }
48
49 public constructor () {
50 super(ExpressWorker.startExpress, {
51 killHandler: () => {
52 ExpressWorker.server.close()
53 }
54 })
55 }
56 }
57
58 export const expressWorker = new ExpressWorker()