refactor: silence sonar
[poolifier.git] / src / pools / cluster / fixed.ts
CommitLineData
c3719753 1import cluster, { type Worker } from 'node:cluster'
deb85c12 2import type { MessageValue } from '../../utility-types'
c97c7edb 3import { AbstractPool } from '../abstract-pool'
4b628b48
JB
4import { type PoolOptions, type PoolType, PoolTypes } from '../pool'
5import { type WorkerType, WorkerTypes } from '../worker'
4ade5f1f 6
2889bd70
JB
7/**
8 * Options for a poolifier cluster pool.
9 */
10export type ClusterPoolOptions = PoolOptions<Worker>
11
4ade5f1f 12/**
729c563d
S
13 * A cluster pool with a fixed number of workers.
14 *
e102732c
JB
15 * @typeParam Data - Type of data sent to the worker. This can only be structured-cloneable data.
16 * @typeParam Response - Type of execution response. This can only be structured-cloneable data.
325f50bc
S
17 * @author [Christopher Quadflieg](https://github.com/Shinigami92)
18 * @since 2.0.0
4ade5f1f 19 */
d3c8a1a8 20export class FixedClusterPool<
deb85c12
JB
21 Data = unknown,
22 Response = unknown
d3c8a1a8 23> extends AbstractPool<Worker, Data, Response> {
4ade5f1f 24 /**
729c563d
S
25 * Constructs a new poolifier fixed cluster pool.
26 *
38e795c1
JB
27 * @param numberOfWorkers - Number of workers for this pool.
28 * @param filePath - Path to an implementation of a `ClusterWorker` file, which can be relative or absolute.
29 * @param opts - Options for this fixed cluster pool.
4ade5f1f
S
30 */
31 public constructor (
5c5a1fb7 32 numberOfWorkers: number,
c97c7edb 33 filePath: string,
2889bd70 34 opts: ClusterPoolOptions = {},
26ce26ca 35 maximumNumberOfWorkers?: number
4ade5f1f 36 ) {
26ce26ca 37 super(numberOfWorkers, filePath, opts, maximumNumberOfWorkers)
c97c7edb 38 }
4ade5f1f 39
afc003b2 40 /** @inheritDoc */
c97c7edb 41 protected setupHook (): void {
1a76932b 42 cluster.setupPrimary({ ...this.opts.settings, exec: this.filePath })
c97c7edb 43 }
325f50bc 44
afc003b2 45 /** @inheritDoc */
c97c7edb 46 protected isMain (): boolean {
7e0d447f 47 return cluster.isPrimary
4ade5f1f
S
48 }
49
afc003b2 50 /** @inheritDoc */
aa9eede8
JB
51 protected sendToWorker (
52 workerNodeKey: number,
53 message: MessageValue<Data>
54 ): void {
72ae84a2
JB
55 this.workerNodes[workerNodeKey].worker.send({
56 ...message,
dbfa7948 57 workerId: this.getWorkerInfo(workerNodeKey).id as number
72ae84a2 58 })
4ade5f1f
S
59 }
60
85aeb3f3 61 /** @inheritDoc */
aa9eede8
JB
62 protected sendStartupMessageToWorker (workerNodeKey: number): void {
63 this.sendToWorker(workerNodeKey, {
e9dd5b66 64 ready: false
85aeb3f3
JB
65 })
66 }
67
68 /** @inheritDoc */
69 protected registerWorkerMessageListener<Message extends Data | Response>(
aa9eede8 70 workerNodeKey: number,
85aeb3f3
JB
71 listener: (message: MessageValue<Message>) => void
72 ): void {
aa9eede8 73 this.workerNodes[workerNodeKey].worker.on('message', listener)
85aeb3f3
JB
74 }
75
ae036c3e
JB
76 /** @inheritDoc */
77 protected registerOnceWorkerMessageListener<Message extends Data | Response>(
78 workerNodeKey: number,
79 listener: (message: MessageValue<Message>) => void
80 ): void {
81 this.workerNodes[workerNodeKey].worker.once('message', listener)
82 }
83
84 /** @inheritDoc */
85 protected deregisterWorkerMessageListener<Message extends Data | Response>(
86 workerNodeKey: number,
87 listener: (message: MessageValue<Message>) => void
88 ): void {
89 this.workerNodes[workerNodeKey].worker.off('message', listener)
90 }
91
9d9fb7b6
JB
92 /** @inheritDoc */
93 protected shallCreateDynamicWorker (): boolean {
94 return false
95 }
96
d0878034 97 /** @inheritDoc */
d1c03778
JB
98 protected checkAndEmitDynamicWorkerCreationEvents (): void {
99 /* noop */
100 }
d0878034 101
afc003b2 102 /** @inheritDoc */
8881ae32 103 protected get type (): PoolType {
6b27d407 104 return PoolTypes.fixed
7c0ba920
JB
105 }
106
184855e6
JB
107 /** @inheritDoc */
108 protected get worker (): WorkerType {
109 return WorkerTypes.cluster
110 }
111
afc003b2 112 /** @inheritDoc */
c319c66b 113 protected get busy (): boolean {
c2ade475 114 return this.internalBusy()
7c0ba920 115 }
4ade5f1f 116}