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