fix: add charging station at instantiation
[e-mobility-charging-stations-simulator.git] / src / charging-station / ChargingStationWorker.ts
CommitLineData
a19b897d 1// Partial Copyright Jerome Benoit. 2021-2024. All Rights Reserved.
c8eeb62b 2
66a7748d 3import { parentPort } from 'node:worker_threads'
8114d10e 4
66a7748d 5import { ThreadWorker } from 'poolifier'
8114d10e 6
66a7748d
JB
7import { ChargingStation } from './ChargingStation.js'
8import { BaseError } from '../exception/index.js'
244c1396
JB
9import type {
10 ChargingStationData,
11 ChargingStationWorkerData,
12 ChargingStationWorkerEventError,
13 ChargingStationWorkerMessage
14} from '../types/index.js'
15import { Configuration, buildChargingStationDataPayload } from '../utils/index.js'
66a7748d 16import { type WorkerMessage, WorkerMessageEvents } from '../worker/index.js'
11353865 17
244c1396 18export let chargingStationWorker: object
aa7d6d95 19if (Configuration.workerPoolInUse()) {
244c1396
JB
20 chargingStationWorker = new ThreadWorker<ChargingStationWorkerData>(
21 (data?: ChargingStationWorkerData): void => {
e9e43cff
JB
22 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, no-new
23 new ChargingStation(data!.index, data!.templateFile)
244c1396
JB
24 }
25 )
74bbc59b 26} else {
244c1396
JB
27 // eslint-disable-next-line @typescript-eslint/no-extraneous-class
28 class ChargingStationWorker<Data extends ChargingStationWorkerData> {
29 constructor () {
30 parentPort?.on('message', (message: WorkerMessage<Data>) => {
31 switch (message.event) {
32 case WorkerMessageEvents.addWorkerElement:
33 try {
34 const chargingStation = new ChargingStation(
35 message.data.index,
36 message.data.templateFile
37 )
244c1396
JB
38 parentPort?.postMessage({
39 event: WorkerMessageEvents.addedWorkerElement,
40 data: buildChargingStationDataPayload(chargingStation)
41 } satisfies ChargingStationWorkerMessage<ChargingStationData>)
42 } catch (error) {
43 parentPort?.postMessage({
44 event: WorkerMessageEvents.workerElementError,
45 data: {
46 event: WorkerMessageEvents.addWorkerElement,
47 name: (error as Error).name,
48 message: (error as Error).message,
49 stack: (error as Error).stack
50 }
51 } satisfies ChargingStationWorkerMessage<ChargingStationWorkerEventError>)
52 }
53 break
54 default:
55 throw new BaseError(
56 `Unknown worker event: '${message.event}' received with data: '${JSON.stringify(
57 message.data,
58 undefined,
59 2
60 )}'`
61 )
62 }
63 })
64 }
65 }
66a7748d 66 chargingStationWorker = new ChargingStationWorker<ChargingStationWorkerData>()
3d2ff9e4 67}