chore(deps-dev): apply updates
[poolifier.git] / examples / typescript / http-server-pool / fastify-hybrid / src / fastify-poolifier.ts
1 import type { FastifyPluginCallback } from 'fastify'
2 import type { TransferListItem } from 'node:worker_threads'
3
4 import fp from 'fastify-plugin'
5 import { availableParallelism, DynamicThreadPool } from 'poolifier'
6
7 import type {
8 FastifyPoolifierOptions,
9 ThreadWorkerData,
10 ThreadWorkerResponse,
11 } from './types.js'
12
13 const fastifyPoolifierPlugin: FastifyPluginCallback<FastifyPoolifierOptions> = (
14 fastify,
15 options,
16 done
17 ) => {
18 options = {
19 ...{
20 maxWorkers: availableParallelism(),
21 minWorkers: 1,
22 },
23 ...options,
24 }
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
28 minWorkers!,
29 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
30 maxWorkers!,
31 workerFile,
32 poolOptions
33 )
34 if (!fastify.hasDecorator('pool')) {
35 fastify.decorate('pool', pool)
36 }
37 if (!fastify.hasDecorator('execute')) {
38 fastify.decorate(
39 'execute',
40 async (
41 data?: ThreadWorkerData,
42 name?: string,
43 transferList?: readonly TransferListItem[]
44 ): Promise<ThreadWorkerResponse> =>
45 await pool.execute(data, name, transferList)
46 )
47 }
48 if (!fastify.hasDecorator('mapExecute')) {
49 fastify.decorate(
50 'mapExecute',
51 async (
52 data: Iterable<ThreadWorkerData>,
53 name?: string,
54 transferList?: readonly TransferListItem[]
55 ): Promise<ThreadWorkerResponse[]> =>
56 await pool.mapExecute(data, name, transferList)
57 )
58 }
59 done()
60 }
61
62 export const fastifyPoolifier = fp(fastifyPoolifierPlugin, {
63 fastify: '5.x',
64 name: 'fastify-poolifier',
65 })