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