-import cluster from 'node:cluster'
+import cluster, { type Worker } from 'node:cluster'
import type { MessageValue } from '../utility-types'
import { AbstractWorker } from './abstract-worker'
import type { WorkerOptions } from './worker-options'
export class ClusterWorker<
Data = unknown,
Response = unknown
-> extends AbstractWorker<NodeJS.Process, Data, Response> {
+> extends AbstractWorker<Worker, Data, Response> {
/**
* Constructs a new poolifier cluster worker.
*
super(
'worker-cluster-pool:poolifier',
cluster.isPrimary,
+ cluster.worker as Worker,
taskFunctions,
- process,
opts
)
}
/** @inheritDoc */
- protected sendToMainWorker (message: MessageValue<Response>): void {
- const mainWorker = this.getMainWorker()
- if (mainWorker.send == null) {
- throw new Error('Main worker does not support IPC communication')
+ protected handleReadyMessage (message: MessageValue<Data>): void {
+ if (!this.isMain && message.workerId === this.id && message.ready != null) {
+ this.getMainWorker()?.on('message', this.messageListener.bind(this))
+ this.sendToMainWorker({ ready: true, workerId: this.id })
}
- mainWorker.send(message)
}
/** @inheritDoc */
- protected handleError (e: Error | string): string {
- return e instanceof Error ? e.message : e
+ protected get id (): number {
+ return this.getMainWorker().id
+ }
+
+ /** @inheritDoc */
+ protected sendToMainWorker (message: MessageValue<Response>): void {
+ this.getMainWorker().send(message)
}
}