1 import type { AddressInfo
} from
'node:net'
2 import { dirname
, extname
, join
} from
'node:path'
3 import { fileURLToPath
} from
'node:url'
4 import { ClusterWorker
, availableParallelism
} from
'poolifier'
5 import Fastify from
'fastify'
6 import type { ClusterWorkerData
, ClusterWorkerResponse
} from
'./types.js'
7 import { fastifyPoolifier
} from
'./fastify-poolifier.js'
9 const startFastify
= async (
10 workerData
?: ClusterWorkerData
11 ): Promise
<ClusterWorkerResponse
> => {
12 const { port
} = workerData
as ClusterWorkerData
13 const fastify
= Fastify({
17 const requestHandlerWorkerFile
= join(
18 dirname(fileURLToPath(import.meta
.url
)),
19 `request-handler-worker${extname(fileURLToPath(import.meta.url))}`
22 await fastify
.register(fastifyPoolifier
, {
23 workerFile
: requestHandlerWorkerFile
,
24 maxWorkers
: Math.round(availableParallelism() / 2),
25 enableTasksQueue
: true,
29 errorHandler
: (e
: Error) => {
30 fastify
.log
.error('Thread worker error', e
)
34 fastify
.all('/api/echo', async request
=> {
35 return (await fastify
.execute({ body
: request
.body
}, 'echo')).body
39 Params
: { number: number }
40 }>('/api/factorial/:number', async request
=> {
41 const { number } = request
.params
42 return (await fastify
.execute({ body
: { number } }, 'factorial')).body
45 await fastify
.listen({ port
})
48 port
: (fastify
.server
.address() as AddressInfo
).port
52 class FastifyWorker
extends ClusterWorker
<
56 public constructor () {
61 export const fastifyWorker
= new FastifyWorker()