-import EventEmitter from 'events'
-import type { MessageValue } from '../utility-types'
-import type { IPool } from './pool'
-
-export type ErrorHandler<Worker> = (this: Worker, e: Error) => void
-export type OnlineHandler<Worker> = (this: Worker) => void
-export type ExitHandler<Worker> = (this: Worker, code: number) => void
-
-export interface IWorker {
- on(event: 'error', handler: ErrorHandler<this>): void
- on(event: 'online', handler: OnlineHandler<this>): void
- on(event: 'exit', handler: ExitHandler<this>): void
-}
+import crypto from 'node:crypto'
+import type { MessageValue, PromiseResponseWrapper } from '../utility-types'
+import { EMPTY_FUNCTION } from '../utils'
+import { KillBehaviors, isKillBehavior } from '../worker/worker-options'
+import type { PoolOptions } from './pool'
+import { PoolEmitter } from './pool'
+import type { IPoolInternal, TasksUsage, WorkerType } from './pool-internal'
+import { PoolType } from './pool-internal'
+import type { IPoolWorker } from './pool-worker'
+import {
+ WorkerChoiceStrategies,
+ type WorkerChoiceStrategy
+} from './selection-strategies/selection-strategies-types'
+import { WorkerChoiceStrategyContext } from './selection-strategies/worker-choice-strategy-context'
+
+/**
+ * Base class that implements some shared logic for all poolifier pools.
+ *
+ * @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 response of execution. This can only be serializable data.
+ */
+export abstract class AbstractPool<
+ Worker extends IPoolWorker,
+ Data = unknown,
+ Response = unknown
+> implements IPoolInternal<Worker, Data, Response> {
+ /** @inheritDoc */
+ public readonly workers: Array<WorkerType<Worker>> = []
+
+ /** @inheritDoc */
+ public readonly emitter?: PoolEmitter