+import EventEmitter from 'node:events'
import type {
ErrorHandler,
ExitHandler,
+ IWorker,
MessageHandler,
- OnlineHandler
-} from './pool-worker'
-import type { WorkerChoiceStrategy } from './selection-strategies/selection-strategies-types'
+ OnlineHandler,
+ WorkerNode
+} from './worker'
+import type {
+ WorkerChoiceStrategy,
+ WorkerChoiceStrategyOptions
+} from './selection-strategies/selection-strategies-types'
+
+/**
+ * Pool types.
+ *
+ * @enum
+ * @internal
+ */
+export enum PoolType {
+ /**
+ * Fixed pool type.
+ */
+ FIXED = 'fixed',
+ /**
+ * Dynamic pool type.
+ */
+ DYNAMIC = 'dynamic'
+}
+
+/**
+ * Pool events emitter.
+ */
+export class PoolEmitter extends EventEmitter {}
+
+/**
+ * Enumeration of pool events.
+ */
+export const PoolEvents = Object.freeze({
+ full: 'full',
+ busy: 'busy'
+} as const)
+
+/**
+ * Pool event.
+ */
+export type PoolEvent = keyof typeof PoolEvents
+
+/**
+ * Worker tasks queue options.
+ */
+export interface TasksQueueOptions {
+ /**
+ * Maximum number of tasks that can be executed concurrently on a worker.
+ *
+ * @defaultValue 1
+ */
+ concurrency?: number
+}
/**
* Options for a poolifier pool.
+ *
+ * @typeParam Worker - Type of worker.
*/
-export interface PoolOptions<Worker> {
+export interface PoolOptions<Worker extends IWorker> {
/**
* A function that will listen for message event on each worker.
*/
*/
exitHandler?: ExitHandler<Worker>
/**
- * The work choice strategy to use in this pool.
+ * The worker choice strategy to use in this pool.
+ *
+ * @defaultValue WorkerChoiceStrategies.ROUND_ROBIN
*/
workerChoiceStrategy?: WorkerChoiceStrategy
+ /**
+ * The worker choice strategy options.
+ */
+ workerChoiceStrategyOptions?: WorkerChoiceStrategyOptions
/**
* Pool events emission.
*
- * @default true
+ * @defaultValue true
*/
enableEvents?: boolean
+ /**
+ * Pool worker tasks queue.
+ *
+ * @defaultValue false
+ */
+ enableTasksQueue?: boolean
+ /**
+ * Pool worker tasks queue options.
+ */
+ tasksQueueOptions?: TasksQueueOptions
}
/**
* Contract definition for a poolifier pool.
*
- * @template Data Type of data sent to the worker. This can only be serializable data.
- * @template Response Type of response of execution. This can only be serializable data.
+ * @typeParam Worker - Type of worker which manages this pool.
+ * @typeParam Data - Type of data sent to the worker. This can only be serializable data.
+ * @typeParam Response - Type of execution response. This can only be serializable data.
*/
-export interface IPool<Data = unknown, Response = unknown> {
+export interface IPool<
+ Worker extends IWorker,
+ Data = unknown,
+ Response = unknown
+> {
+ /**
+ * Pool type.
+ *
+ * If it is `'dynamic'`, it provides the `max` property.
+ */
+ readonly type: PoolType
+ /**
+ * Pool worker nodes.
+ */
+ readonly workerNodes: Array<WorkerNode<Worker, Data>>
+ /**
+ * Emitter on which events can be listened to.
+ *
+ * Events that can currently be listened to:
+ *
+ * - `'full'`: Emitted when the pool is dynamic and full.
+ * - `'busy'`: Emitted when the pool is busy.
+ */
+ readonly emitter?: PoolEmitter
/**
- * Perform the task specified in the constructor with the data parameter.
+ * Finds a free worker node key based on the number of tasks the worker has applied.
*
- * @param data The input for the specified task. This can only be serializable data.
+ * If a worker is found with `0` running tasks, it is detected as free and its worker node key is returned.
+ *
+ * If no free worker is found, `-1` is returned.
+ *
+ * @returns A worker node key if there is one, `-1` otherwise.
+ */
+ findFreeWorkerNodeKey: () => number
+ /**
+ * Executes the function specified in the constructor with the task data input parameter.
+ *
+ * @param data - The task input data for the specified function. This can only be serializable data.
* @returns Promise that will be resolved when the task is successfully completed.
*/
- execute(data: Data): Promise<Response>
+ execute: (data: Data) => Promise<Response>
+ /**
+ * Shutdowns every current worker in this pool.
+ */
+ destroy: () => Promise<void>
/**
- * Shut down every current worker in this pool.
+ * Sets the worker choice strategy in this pool.
+ *
+ * @param workerChoiceStrategy - The worker choice strategy.
+ * @param workerChoiceStrategyOptions - The worker choice strategy options.
+ */
+ setWorkerChoiceStrategy: (
+ workerChoiceStrategy: WorkerChoiceStrategy,
+ workerChoiceStrategyOptions?: WorkerChoiceStrategyOptions
+ ) => void
+ /**
+ * Sets the worker choice strategy options in this pool.
+ *
+ * @param workerChoiceStrategyOptions - The worker choice strategy options.
+ */
+ setWorkerChoiceStrategyOptions: (
+ workerChoiceStrategyOptions: WorkerChoiceStrategyOptions
+ ) => void
+ /**
+ * Enables/disables the worker tasks queue in this pool.
+ *
+ * @param enable - Whether to enable or disable the worker tasks queue.
+ * @param tasksQueueOptions - The worker tasks queue options.
*/
- destroy(): Promise<void>
+ enableTasksQueue: (
+ enable: boolean,
+ tasksQueueOptions?: TasksQueueOptions
+ ) => void
/**
- * Set the worker choice strategy in this pool.
+ * Sets the worker tasks queue options in this pool.
*
- * @param workerChoiceStrategy The worker choice strategy.
+ * @param tasksQueueOptions - The worker tasks queue options.
*/
- setWorkerChoiceStrategy(workerChoiceStrategy: WorkerChoiceStrategy): void
+ setTasksQueueOptions: (tasksQueueOptions: TasksQueueOptions) => void
}