1 // Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
3 import { AsyncResource
} from
'node:async_hooks';
4 import { parentPort
, workerData
} from
'node:worker_threads';
6 import { ThreadWorker
} from
'poolifier';
8 import { ChargingStation
} from
'./ChargingStation';
9 import type { ChargingStationWorkerData
} from
'../types';
10 import { Configuration
} from
'../utils';
11 import { WorkerConstants
, type WorkerMessage
, WorkerMessageEvents
} from
'../worker';
14 * Create and start a charging station instance
16 * @param data - workerData
18 const startChargingStation
= (data
: ChargingStationWorkerData
): void => {
19 new ChargingStation(data
.index
, data
.templateFile
).start();
22 // Conditionally export ThreadWorker instance for pool usage
23 export let threadWorker
: ThreadWorker
;
24 if (Configuration
.workerPoolInUse()) {
25 threadWorker
= new ThreadWorker
<ChargingStationWorkerData
>(startChargingStation
, {
26 maxInactiveTime
: WorkerConstants
.POOL_MAX_INACTIVE_TIME
,
29 class ChargingStationWorker
extends AsyncResource
{
31 super('ChargingStationWorker');
34 public run(data
: ChargingStationWorkerData
): void {
36 startChargingStation
.bind(this) as (data
: ChargingStationWorkerData
) => void,
42 // Add message listener to create and start charging station from the main thread
43 parentPort
?.on('message', (message
: WorkerMessage
<ChargingStationWorkerData
>) => {
44 if (message
.id
=== WorkerMessageEvents
.startWorkerElement
) {
45 new ChargingStationWorker().run(message
.data
);
48 if (workerData
!== undefined) {
49 new ChargingStationWorker().run(workerData
as ChargingStationWorkerData
);