refactor: strong type data sent to worker
[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: {
45 message: (error as Error).message,
46 stack: (error as Error).stack,
47 },
48 });
49 }
50 break;
51 default:
a6080904 52 throw new BaseError(
f93dda6a
JB
53 `Unknown worker event: '${message.event}' received with data: '${JSON.stringify(
54 message.data,
4ed03b6e 55 undefined,
f93dda6a
JB
56 2,
57 )}'`,
2bb7a73e 58 );
6b57eb9a
JB
59 }
60 });
61 }
6b57eb9a
JB
62}
63
d769e04a
JB
64export let chargingStationWorker:
65 | ChargingStationWorker<ChargingStationWorkerData>
66 | ThreadWorker<ChargingStationWorkerData>;
aa7d6d95 67if (Configuration.workerPoolInUse()) {
bcbb76a6 68 chargingStationWorker = new ThreadWorker<ChargingStationWorkerData>(startChargingStation);
74bbc59b 69} else {
d769e04a 70 chargingStationWorker = new ChargingStationWorker<ChargingStationWorkerData>();
3d2ff9e4 71}