35a7e534353f5ffaafbae6daba93948e9803d407
[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 {
9 ChargingStationData,
10 ChargingStationWorkerData,
11 ChargingStationWorkerEventError,
12 ChargingStationWorkerMessage
13 } from '../types/index.js'
14 import { buildChargingStationDataPayload, Configuration } from '../utils/index.js'
15 import { type WorkerMessage, WorkerMessageEvents } from '../worker/index.js'
16 import { ChargingStation } from './ChargingStation.js'
17
18 export let chargingStationWorker: object
19 if (Configuration.workerPoolInUse()) {
20 chargingStationWorker = new ThreadWorker<ChargingStationWorkerData>(
21 (data?: ChargingStationWorkerData): void => {
22 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, no-new
23 new ChargingStation(data!.index, data!.templateFile, data!.options)
24 }
25 )
26 } else {
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 message.data.options
38 )
39 parentPort?.postMessage({
40 event: WorkerMessageEvents.addedWorkerElement,
41 data: buildChargingStationDataPayload(chargingStation)
42 } satisfies ChargingStationWorkerMessage<ChargingStationData>)
43 } catch (error) {
44 parentPort?.postMessage({
45 event: WorkerMessageEvents.workerElementError,
46 data: {
47 event: WorkerMessageEvents.addWorkerElement,
48 name: (error as Error).name,
49 message: (error as Error).message,
50 stack: (error as Error).stack
51 }
52 } satisfies ChargingStationWorkerMessage<ChargingStationWorkerEventError>)
53 }
54 break
55 default:
56 throw new BaseError(
57 `Unknown worker event: '${message.event}' received with data: '${JSON.stringify(
58 message.data,
59 undefined,
60 2
61 )}'`
62 )
63 }
64 })
65 }
66 }
67 chargingStationWorker = new ChargingStationWorker<ChargingStationWorkerData>()
68 }