refactor: renable standard JS linter rules
[poolifier.git] / examples / typescript / http-server-pool / fastify-hybrid / src / fastify-poolifier.ts
1 import type { TransferListItem } from 'node:worker_threads'
2 import { DynamicThreadPool, availableParallelism } from 'poolifier'
3 import type { FastifyPluginCallback } from 'fastify'
4 import fp from 'fastify-plugin'
5 import {
6 type FastifyPoolifierOptions,
7 type ThreadWorkerData,
8 type ThreadWorkerResponse
9 } from './types.js'
10
11 const fastifyPoolifierPlugin: FastifyPluginCallback<FastifyPoolifierOptions> = (
12 fastify,
13 options,
14 done
15 ) => {
16 options = {
17 ...{
18 minWorkers: 1,
19 maxWorkers: availableParallelism()
20 },
21 ...options
22 }
23 const { workerFile, minWorkers, maxWorkers, ...poolOptions } = options
24 const pool = new DynamicThreadPool<ThreadWorkerData, ThreadWorkerResponse>(
25 minWorkers!,
26 maxWorkers!,
27 workerFile,
28 poolOptions
29 )
30 if (!fastify.hasDecorator('pool')) {
31 fastify.decorate('pool', pool)
32 }
33 if (!fastify.hasDecorator('execute')) {
34 fastify.decorate(
35 'execute',
36 async (
37 data?: ThreadWorkerData,
38 name?: string,
39 transferList?: TransferListItem[]
40 ): Promise<ThreadWorkerResponse> =>
41 await pool.execute(data, name, transferList)
42 )
43 }
44 done()
45 }
46
47 export const fastifyPoolifier = fp(fastifyPoolifierPlugin, {
48 fastify: '4.x',
49 name: 'fastify-poolifier'
50 })