1 import type { FastifyPluginCallback
} from
'fastify'
2 import type { TransferListItem
} from
'node:worker_threads'
4 import fp from
'fastify-plugin'
5 import { availableParallelism
, DynamicThreadPool
} from
'poolifier'
8 FastifyPoolifierOptions
,
13 const fastifyPoolifierPlugin
: FastifyPluginCallback
<FastifyPoolifierOptions
> = (
20 maxWorkers
: availableParallelism(),
25 const { maxWorkers
, minWorkers
, workerFile
, ...poolOptions
} = options
26 const pool
= new DynamicThreadPool
<ThreadWorkerData
, ThreadWorkerResponse
>(
27 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
29 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
34 if (!fastify
.hasDecorator('pool')) {
35 fastify
.decorate('pool', pool
)
37 if (!fastify
.hasDecorator('execute')) {
41 data
?: ThreadWorkerData
,
43 transferList
?: readonly TransferListItem
[]
44 ): Promise
<ThreadWorkerResponse
> =>
45 await pool
.execute(data
, name
, transferList
)
48 if (!fastify
.hasDecorator('mapExecute')) {
52 data
: Iterable
<ThreadWorkerData
>,
54 transferList
?: readonly TransferListItem
[]
55 ): Promise
<ThreadWorkerResponse
[]> =>
56 await pool
.mapExecute(data
, name
, transferList
)
62 export const fastifyPoolifier
= fp(fastifyPoolifierPlugin
, {
64 name
: 'fastify-poolifier',