refactor: add error name in worker set worker startup error reporting
[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';
a6080904 9import { BaseError } from '../exception';
268a74bb 10import type { ChargingStationWorkerData } from '../types';
a4e5c2e2 11import { Configuration } from '../utils';
d769e04a 12import { type WorkerData, type WorkerMessage, WorkerMessageEvents } from '../worker';
7dde0b73 13
11353865
JB
14const moduleName = 'ChargingStationWorker';
15
e8a92d57 16/**
361c98f5 17 * Creates and starts a charging station instance
e8a92d57 18 *
d769e04a 19 * @param data - data sent to worker
e8a92d57 20 */
a37fc6dc
JB
21const startChargingStation = (data?: ChargingStationWorkerData): void => {
22 new ChargingStation(data!.index, data!.templateFile).start();
e8a92d57
JB
23};
24
d769e04a 25class ChargingStationWorker<Data extends WorkerData> extends AsyncResource {
6b57eb9a 26 constructor() {
11353865 27 super(moduleName);
6b57eb9a 28 // Add message listener to create and start charging station from the main thread
d769e04a 29 parentPort?.on('message', (message: WorkerMessage<Data>) => {
f93dda6a
JB
30 switch (message.event) {
31 case WorkerMessageEvents.startWorkerElement:
32 try {
33 this.runInAsyncScope(
d769e04a 34 startChargingStation.bind(this) as (data?: Data) => void,
f93dda6a
JB
35 this,
36 message.data,
37 );
38 parentPort?.postMessage({
39 event: WorkerMessageEvents.startedWorkerElement,
40 });
41 } catch (error) {
42 parentPort?.postMessage({
43 event: WorkerMessageEvents.startWorkerElementError,
44 data: {
7cd4006c 45 name: (error as Error).name,
f93dda6a
JB
46 message: (error as Error).message,
47 stack: (error as Error).stack,
48 },
49 });
50 }
51 break;
52 default:
a6080904 53 throw new BaseError(
f93dda6a
JB
54 `Unknown worker event: '${message.event}' received with data: '${JSON.stringify(
55 message.data,
4ed03b6e 56 undefined,
f93dda6a
JB
57 2,
58 )}'`,
2bb7a73e 59 );
6b57eb9a
JB
60 }
61 });
62 }
6b57eb9a
JB
63}
64
d769e04a
JB
65export let chargingStationWorker:
66 | ChargingStationWorker<ChargingStationWorkerData>
67 | ThreadWorker<ChargingStationWorkerData>;
aa7d6d95 68if (Configuration.workerPoolInUse()) {
bcbb76a6 69 chargingStationWorker = new ThreadWorker<ChargingStationWorkerData>(startChargingStation);
74bbc59b 70} else {
d769e04a 71 chargingStationWorker = new ChargingStationWorker<ChargingStationWorkerData>();
3d2ff9e4 72}