1 // Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
3 import { AsyncResource
} from
'node:async_hooks';
4 import { parentPort
} from
'node:worker_threads';
6 import { ThreadWorker
} from
'poolifier';
8 import { ChargingStation
} from
'./ChargingStation';
9 import { BaseError
} from
'../exception';
10 import type { ChargingStationWorkerData
} from
'../types';
11 import { Configuration
} from
'../utils';
12 import { type WorkerMessage
, WorkerMessageEvents
} from
'../worker';
14 const moduleName
= 'ChargingStationWorker';
17 * Creates and starts a charging station instance
19 * @param data - workerData
21 const startChargingStation
= (data
?: ChargingStationWorkerData
): void => {
22 new ChargingStation(data
!.index
, data
!.templateFile
).start();
25 class ChargingStationWorker
extends AsyncResource
{
28 // Add message listener to create and start charging station from the main thread
29 parentPort
?.on('message', (message
: WorkerMessage
<ChargingStationWorkerData
>) => {
30 switch (message
.event
) {
31 case WorkerMessageEvents
.startWorkerElement
:
34 startChargingStation
.bind(this) as (data
?: ChargingStationWorkerData
) => void,
38 parentPort
?.postMessage({
39 event
: WorkerMessageEvents
.startedWorkerElement
,
42 parentPort
?.postMessage({
43 event
: WorkerMessageEvents
.startWorkerElementError
,
45 message
: (error
as Error).message
,
46 stack
: (error
as Error).stack
,
53 `Unknown worker event: '${message.event}' received with data: '${JSON.stringify(
64 export let chargingStationWorker
: ChargingStationWorker
| ThreadWorker
<ChargingStationWorkerData
>;
65 if (Configuration
.workerPoolInUse()) {
66 chargingStationWorker
= new ThreadWorker
<ChargingStationWorkerData
>(startChargingStation
);
68 chargingStationWorker
= new ChargingStationWorker();