1 import type { AddressInfo
} from
'node:net'
3 import Fastify
, { type FastifyInstance
} from
'fastify'
4 import { ClusterWorker
} from
'poolifier'
6 import type { WorkerData
, WorkerResponse
} from
'./types.js'
8 class FastifyWorker
extends ClusterWorker
<WorkerData
, WorkerResponse
> {
9 private static fastify
: FastifyInstance
11 private static readonly factorial
= (n
: number | bigint
): bigint
=> {
12 if (n
=== 0 || n
=== 1) {
17 for (let i
= 1n
; i
<= n
; i
++) {
24 private static readonly startFastify
= async (
25 workerData
?: WorkerData
26 ): Promise
<WorkerResponse
> => {
27 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
28 const { port
} = workerData
!
30 FastifyWorker
.fastify
= Fastify({
34 FastifyWorker
.fastify
.all('/api/echo', request
=> {
38 FastifyWorker
.fastify
.get
<{
39 Params
: { number: number }
40 }>('/api/factorial/:number', request
=> {
41 const { number } = request
.params
42 return { number: FastifyWorker
.factorial(number).toString() }
45 await FastifyWorker
.fastify
.listen({ port
})
48 port
: (FastifyWorker
.fastify
.server
.address() as AddressInfo
).port
,
52 public constructor () {
53 super(FastifyWorker
.startFastify
, {
54 killHandler
: async () => {
55 await FastifyWorker
.fastify
.close()
61 export const fastifyWorker
= new FastifyWorker()