refactor: split WorkerConstants class
[e-mobility-charging-stations-simulator.git] / src / charging-station / ChargingStationWorker.ts
CommitLineData
edd13439 1// Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
c8eeb62b 2
a679a162 3import { AsyncResource } from 'node:async_hooks';
6b57eb9a 4import { parentPort } from 'node:worker_threads';
8114d10e
JB
5
6import { ThreadWorker } from 'poolifier';
7
4c3c0d59 8import { ChargingStation } from './ChargingStation';
268a74bb 9import type { ChargingStationWorkerData } from '../types';
a4e5c2e2 10import { Configuration } from '../utils';
769d3b10 11import { POOL_MAX_INACTIVE_TIME, type WorkerMessage, WorkerMessageEvents } from '../worker';
7dde0b73 12
11353865
JB
13const moduleName = 'ChargingStationWorker';
14
e8a92d57 15/**
361c98f5 16 * Creates and starts a charging station instance
e8a92d57
JB
17 *
18 * @param data - workerData
19 */
a37fc6dc
JB
20const startChargingStation = (data?: ChargingStationWorkerData): void => {
21 new ChargingStation(data!.index, data!.templateFile).start();
e8a92d57
JB
22};
23
6b57eb9a
JB
24class ChargingStationWorker extends AsyncResource {
25 constructor() {
11353865 26 super(moduleName);
6b57eb9a
JB
27 // Add message listener to create and start charging station from the main thread
28 parentPort?.on('message', (message: WorkerMessage<ChargingStationWorkerData>) => {
f93dda6a
JB
29 switch (message.event) {
30 case WorkerMessageEvents.startWorkerElement:
31 try {
32 this.runInAsyncScope(
33 startChargingStation.bind(this) as (data?: ChargingStationWorkerData) => void,
34 this,
35 message.data,
36 );
37 parentPort?.postMessage({
38 event: WorkerMessageEvents.startedWorkerElement,
39 });
40 } catch (error) {
41 parentPort?.postMessage({
42 event: WorkerMessageEvents.startWorkerElementError,
43 data: {
44 message: (error as Error).message,
45 stack: (error as Error).stack,
46 },
47 });
48 }
49 break;
50 default:
51 throw new Error(
52 `Unknown worker event: '${message.event}' received with data: '${JSON.stringify(
53 message.data,
54 null,
55 2,
56 )}'`,
2bb7a73e 57 );
6b57eb9a
JB
58 }
59 });
60 }
6b57eb9a
JB
61}
62
6b2f4370 63export let chargingStationWorker: ChargingStationWorker | ThreadWorker<ChargingStationWorkerData>;
aa7d6d95 64if (Configuration.workerPoolInUse()) {
6b2f4370 65 chargingStationWorker = new ThreadWorker<ChargingStationWorkerData>(startChargingStation, {
769d3b10 66 maxInactiveTime: POOL_MAX_INACTIVE_TIME,
e7aeea18 67 });
74bbc59b 68} else {
6b57eb9a 69 chargingStationWorker = new ChargingStationWorker();
3d2ff9e4 70}