fix: refine type definition for transferList
[poolifier.git] / src / pools / thread / fixed.ts
CommitLineData
fc3e6586 1import {
ded253e2 2 isMainThread,
7d91a8cd 3 type TransferListItem,
ded253e2 4 type Worker
fc3e6586 5} from 'node:worker_threads'
ded253e2 6
d35e5717
JB
7import type { MessageValue } from '../../utility-types.js'
8import { AbstractPool } from '../abstract-pool.js'
9import { type PoolOptions, type PoolType, PoolTypes } from '../pool.js'
10import { type WorkerType, WorkerTypes } from '../worker.js'
4ade5f1f 11
2889bd70
JB
12/**
13 * Options for a poolifier thread pool.
14 */
15export type ThreadPoolOptions = PoolOptions<Worker>
16
4ade5f1f 17/**
729c563d
S
18 * A thread pool with a fixed number of threads.
19 *
e102732c
JB
20 * @typeParam Data - Type of data sent to the worker. This can only be structured-cloneable data.
21 * @typeParam Response - Type of execution response. This can only be structured-cloneable data.
4ade5f1f
S
22 * @author [Alessandro Pio Ardizio](https://github.com/pioardi)
23 * @since 0.0.1
24 */
d3c8a1a8 25export class FixedThreadPool<
deb85c12
JB
26 Data = unknown,
27 Response = unknown
e102732c 28> extends AbstractPool<Worker, Data, Response> {
4ade5f1f 29 /**
729c563d
S
30 * Constructs a new poolifier fixed thread pool.
31 *
38e795c1
JB
32 * @param numberOfThreads - Number of threads for this pool.
33 * @param filePath - Path to an implementation of a `ThreadWorker` file, which can be relative or absolute.
34 * @param opts - Options for this fixed thread pool.
4ade5f1f
S
35 */
36 public constructor (
5c5a1fb7 37 numberOfThreads: number,
c97c7edb 38 filePath: string,
2889bd70 39 opts: ThreadPoolOptions = {},
26ce26ca 40 maximumNumberOfThreads?: number
4ade5f1f 41 ) {
26ce26ca 42 super(numberOfThreads, filePath, opts, maximumNumberOfThreads)
c97c7edb 43 }
4ade5f1f 44
afc003b2 45 /** @inheritDoc */
c97c7edb
S
46 protected isMain (): boolean {
47 return isMainThread
4ade5f1f
S
48 }
49
afc003b2 50 /** @inheritDoc */
aa9eede8
JB
51 protected sendToWorker (
52 workerNodeKey: number,
7d91a8cd 53 message: MessageValue<Data>,
6a3ecc50 54 transferList?: readonly TransferListItem[]
aa9eede8 55 ): void {
369179f6 56 this.workerNodes[workerNodeKey]?.messageChannel?.port1.postMessage(
fea198e8
JB
57 {
58 ...message,
59 workerId: this.getWorkerInfo(workerNodeKey)?.id
60 } satisfies MessageValue<Data>,
72ae84a2
JB
61 transferList
62 )
85aeb3f3
JB
63 }
64
65 /** @inheritDoc */
aa9eede8 66 protected sendStartupMessageToWorker (workerNodeKey: number): void {
75de9f41 67 const workerNode = this.workerNodes[workerNodeKey]
67f3f2d6 68 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
7f0e1334 69 const port2 = workerNode.messageChannel!.port2
e9dd5b66 70 workerNode.worker.postMessage(
85aeb3f3
JB
71 {
72 ready: false,
1851fed0 73 workerId: this.getWorkerInfo(workerNodeKey)?.id,
85aeb3f3 74 port: port2
fea198e8 75 } satisfies MessageValue<Data>,
85aeb3f3
JB
76 [port2]
77 )
78 }
79
80 /** @inheritDoc */
81 protected registerWorkerMessageListener<Message extends Data | Response>(
aa9eede8 82 workerNodeKey: number,
85aeb3f3
JB
83 listener: (message: MessageValue<Message>) => void
84 ): void {
c63a35a0 85 this.workerNodes[workerNodeKey].messageChannel?.port1.on(
fa548cda
JB
86 'message',
87 listener
88 )
4ade5f1f
S
89 }
90
ae036c3e
JB
91 /** @inheritDoc */
92 protected registerOnceWorkerMessageListener<Message extends Data | Response>(
93 workerNodeKey: number,
94 listener: (message: MessageValue<Message>) => void
95 ): void {
c63a35a0 96 this.workerNodes[workerNodeKey].messageChannel?.port1.once(
fa548cda
JB
97 'message',
98 listener
99 )
ae036c3e
JB
100 }
101
102 /** @inheritDoc */
103 protected deregisterWorkerMessageListener<Message extends Data | Response>(
104 workerNodeKey: number,
105 listener: (message: MessageValue<Message>) => void
106 ): void {
c63a35a0 107 this.workerNodes[workerNodeKey].messageChannel?.port1.off(
fa548cda
JB
108 'message',
109 listener
110 )
ae036c3e
JB
111 }
112
9d9fb7b6
JB
113 /** @inheritDoc */
114 protected shallCreateDynamicWorker (): boolean {
115 return false
116 }
117
d0878034 118 /** @inheritDoc */
d1c03778
JB
119 protected checkAndEmitDynamicWorkerCreationEvents (): void {
120 /* noop */
121 }
d0878034 122
afc003b2 123 /** @inheritDoc */
8881ae32 124 protected get type (): PoolType {
6b27d407 125 return PoolTypes.fixed
7c0ba920
JB
126 }
127
184855e6
JB
128 /** @inheritDoc */
129 protected get worker (): WorkerType {
130 return WorkerTypes.thread
131 }
132
afc003b2 133 /** @inheritDoc */
c319c66b 134 protected get busy (): boolean {
c2ade475 135 return this.internalBusy()
7c0ba920 136 }
4ade5f1f 137}