refactor: cleanup eslint configuration
[poolifier.git] / examples / typescript / http-server-pool / express-hybrid / src / express-worker.ts
CommitLineData
a449b585
JB
1import type { Server } from 'node:http'
2import type { AddressInfo } from 'node:net'
ded253e2
JB
3
4import express, { type Express, type Request, type Response } from 'express'
d0ed34c9 5import {
ded253e2 6 availableParallelism,
d0ed34c9 7 ClusterWorker,
ded253e2 8 DynamicThreadPool
d0ed34c9 9} from 'poolifier'
ded253e2 10
d0ed34c9
JB
11import {
12 type ClusterWorkerData,
13 type ClusterWorkerResponse,
14 type DataPayload,
15 type ThreadWorkerData,
16 type ThreadWorkerResponse
17} from './types.js'
18
19const emptyFunction = (): void => {
8ea47589 20 /* Intentional */
d0ed34c9
JB
21}
22
23class ExpressWorker extends ClusterWorker<
24ClusterWorkerData,
25ClusterWorkerResponse
26> {
27 private static server: Server
28 private static requestHandlerPool: DynamicThreadPool<
29 ThreadWorkerData<DataPayload>,
30 ThreadWorkerResponse<DataPayload>
31 >
32
33 private static readonly startExpress = (
34 workerData?: ClusterWorkerData
35 ): ClusterWorkerResponse => {
7d9756e3 36 const { port, workerFile, minWorkers, maxWorkers, ...poolOptions } =
67f3f2d6 37 workerData!
d0ed34c9
JB
38
39 ExpressWorker.requestHandlerPool = new DynamicThreadPool<
40 ThreadWorkerData<DataPayload>,
41 ThreadWorkerResponse<DataPayload>
42 >(
43 minWorkers ?? 1,
44 maxWorkers ?? availableParallelism(),
45 workerFile,
7d9756e3 46 poolOptions
d0ed34c9
JB
47 )
48
49 const application: Express = express()
50
51 // Parse only JSON requests body
52 application.use(express.json())
53
54 application.all('/api/echo', (req: Request, res: Response) => {
55 ExpressWorker.requestHandlerPool
56 .execute({ data: req.body }, 'echo')
041dc05b 57 .then(response => {
d0ed34c9
JB
58 return res.send(response.data).end()
59 })
60 .catch(emptyFunction)
61 })
62
63 application.get('/api/factorial/:number', (req: Request, res: Response) => {
64 const { number } = req.params
65 ExpressWorker.requestHandlerPool
66 .execute({ data: { number: parseInt(number) } }, 'factorial')
041dc05b 67 .then(response => {
d0ed34c9
JB
68 return res.send(response.data).end()
69 })
70 .catch(emptyFunction)
71 })
72
73 ExpressWorker.server = application.listen(port, () => {
74 console.info(
1fa0cdf5 75 `⚡️[express server]: Express server is started in cluster worker at http://localhost:${port}/`
d0ed34c9
JB
76 )
77 })
78 return {
79 status: true,
c63a35a0 80 port: (ExpressWorker.server.address() as AddressInfo).port
d0ed34c9
JB
81 }
82 }
83
84 public constructor () {
85 super(ExpressWorker.startExpress, {
86 killHandler: async () => {
87 await ExpressWorker.requestHandlerPool.destroy()
88 ExpressWorker.server.close()
89 }
90 })
91 }
92}
93
94export const expressWorker = new ExpressWorker()