feat: add error handling to worker set worker
[e-mobility-charging-stations-simulator.git] / src / charging-station / ChargingStationWorker.ts
1 // Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
2
3 import { AsyncResource } from 'node:async_hooks';
4 import { parentPort } from 'node:worker_threads';
5
6 import { ThreadWorker } from 'poolifier';
7
8 import { ChargingStation } from './ChargingStation';
9 import type { ChargingStationWorkerData } from '../types';
10 import { Configuration } from '../utils';
11 import { WorkerConstants, type WorkerMessage, WorkerMessageEvents } from '../worker';
12
13 const moduleName = 'ChargingStationWorker';
14
15 /**
16 * Creates and starts a charging station instance
17 *
18 * @param data - workerData
19 */
20 const startChargingStation = (data?: ChargingStationWorkerData): void => {
21 new ChargingStation(data!.index, data!.templateFile).start();
22 };
23
24 class ChargingStationWorker extends AsyncResource {
25 constructor() {
26 super(moduleName);
27 // Add message listener to create and start charging station from the main thread
28 parentPort?.on('message', (message: WorkerMessage<ChargingStationWorkerData>) => {
29 if (message.event === WorkerMessageEvents.startWorkerElement) {
30 try {
31 this.runInAsyncScope(
32 startChargingStation.bind(this) as (data?: ChargingStationWorkerData) => void,
33 this,
34 message.data,
35 );
36 parentPort?.postMessage({
37 event: WorkerMessageEvents.startedWorkerElement,
38 });
39 } catch (error) {
40 parentPort?.postMessage({
41 event: WorkerMessageEvents.startWorkerElementError,
42 data: {
43 message: (error as Error).message,
44 stack: (error as Error).stack,
45 },
46 });
47 }
48 }
49 });
50 }
51 }
52
53 export let chargingStationWorker: ChargingStationWorker | ThreadWorker<ChargingStationWorkerData>;
54 if (Configuration.workerPoolInUse()) {
55 chargingStationWorker = new ThreadWorker<ChargingStationWorkerData>(startChargingStation, {
56 maxInactiveTime: WorkerConstants.POOL_MAX_INACTIVE_TIME,
57 });
58 } else {
59 chargingStationWorker = new ChargingStationWorker();
60 }