build: switch to NodeNext module resolution
[e-mobility-charging-stations-simulator.git] / src / charging-station / ChargingStationWorker.ts
1 // Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
2
3 import { parentPort } from 'node:worker_threads';
4
5 import { ThreadWorker } from 'poolifier';
6
7 import { ChargingStation } from './ChargingStation.js';
8 import { BaseError } from '../exception/index.js';
9 import type { ChargingStationWorkerData } from '../types/index.js';
10 import { Configuration } from '../utils/index.js';
11 import { type WorkerMessage, WorkerMessageEvents } from '../worker/index.js';
12
13 /**
14 * Creates and starts a charging station instance
15 *
16 * @param data - data sent to worker
17 */
18 const startChargingStation = (data?: ChargingStationWorkerData): void => {
19 new ChargingStation(data!.index, data!.templateFile).start();
20 };
21
22 class ChargingStationWorker<Data extends ChargingStationWorkerData> {
23 constructor() {
24 // Add message listener to create and start charging station from the main thread
25 parentPort?.on('message', (message: WorkerMessage<Data>) => {
26 switch (message.event) {
27 case WorkerMessageEvents.startWorkerElement:
28 try {
29 startChargingStation(message.data);
30 parentPort?.postMessage({
31 event: WorkerMessageEvents.startedWorkerElement,
32 });
33 } catch (error) {
34 parentPort?.postMessage({
35 event: WorkerMessageEvents.startWorkerElementError,
36 data: {
37 name: (error as Error).name,
38 message: (error as Error).message,
39 stack: (error as Error).stack,
40 },
41 });
42 }
43 break;
44 default:
45 throw new BaseError(
46 `Unknown worker event: '${message.event}' received with data: '${JSON.stringify(
47 message.data,
48 undefined,
49 2,
50 )}'`,
51 );
52 }
53 });
54 }
55 }
56
57 export let chargingStationWorker:
58 | ChargingStationWorker<ChargingStationWorkerData>
59 | ThreadWorker<ChargingStationWorkerData>;
60 if (Configuration.workerPoolInUse()) {
61 chargingStationWorker = new ThreadWorker<ChargingStationWorkerData>(startChargingStation);
62 } else {
63 chargingStationWorker = new ChargingStationWorker<ChargingStationWorkerData>();
64 }