Commit | Line | Data |
---|---|---|
a449b585 JB |
1 | import type { Server } from 'node:http' |
2 | import type { AddressInfo } from 'node:net' | |
ded253e2 | 3 | |
15a9c195 | 4 | import express, { type Express, type Request, type Response } from 'express' |
ded253e2 JB |
5 | import { ClusterWorker } from 'poolifier' |
6 | ||
ef083f7b | 7 | import type { WorkerData, WorkerResponse } from './types.js' |
15a9c195 | 8 | |
15a9c195 JB |
9 | class ExpressWorker extends ClusterWorker<WorkerData, WorkerResponse> { |
10 | private static server: Server | |
11 | ||
66f0c14c JB |
12 | private static readonly factorial = (n: number | bigint): bigint => { |
13 | if (n === 0 || n === 1) { | |
14 | return 1n | |
15 | } else { | |
16 | n = BigInt(n) | |
17 | let factorial = 1n | |
18 | for (let i = 1n; i <= n; i++) { | |
19 | factorial *= i | |
20 | } | |
21 | return factorial | |
8538ea4c | 22 | } |
8538ea4c JB |
23 | } |
24 | ||
15a9c195 JB |
25 | private static readonly startExpress = ( |
26 | workerData?: WorkerData | |
27 | ): WorkerResponse => { | |
67f3f2d6 | 28 | const { port } = workerData! |
d0ed34c9 | 29 | |
15a9c195 JB |
30 | const application: Express = express() |
31 | ||
32 | // Parse only JSON requests body | |
33 | application.use(express.json()) | |
34 | ||
35 | application.all('/api/echo', (req: Request, res: Response) => { | |
36 | res.send(req.body).end() | |
37 | }) | |
38 | ||
39 | application.get('/api/factorial/:number', (req: Request, res: Response) => { | |
40 | const { number } = req.params | |
66f0c14c JB |
41 | res |
42 | .send({ number: ExpressWorker.factorial(parseInt(number)).toString() }) | |
43 | .end() | |
15a9c195 JB |
44 | }) |
45 | ||
b7172bc0 | 46 | let listenerPort: number | undefined |
d0ed34c9 | 47 | ExpressWorker.server = application.listen(port, () => { |
b7172bc0 | 48 | listenerPort = (ExpressWorker.server.address() as AddressInfo).port |
15a9c195 | 49 | console.info( |
b7172bc0 | 50 | `⚡️[express server]: Express server is started in cluster worker at http://localhost:${listenerPort}/` |
15a9c195 JB |
51 | ) |
52 | }) | |
53 | return { | |
54 | status: true, | |
b7172bc0 | 55 | port: listenerPort ?? port |
15a9c195 JB |
56 | } |
57 | } | |
58 | ||
59 | public constructor () { | |
60 | super(ExpressWorker.startExpress, { | |
61 | killHandler: () => { | |
62 | ExpressWorker.server.close() | |
63 | } | |
64 | }) | |
65 | } | |
66 | } | |
67 | ||
68 | export const expressWorker = new ExpressWorker() |