042d3d5bfc2b3bc913484c5a0f5d0982b982148f
[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 ChargingStationInfo,
10 ChargingStationWorkerData,
11 ChargingStationWorkerEventError,
12 ChargingStationWorkerMessage
13 } from '../types/index.js'
14 import { 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<
21 ChargingStationWorkerData,
22 ChargingStationInfo | undefined
23 >((data?: ChargingStationWorkerData): ChargingStationInfo | undefined => {
24 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, no-new
25 return new ChargingStation(data!.index, data!.templateFile, data!.options).stationInfo
26 })
27 } else {
28 // eslint-disable-next-line @typescript-eslint/no-extraneous-class
29 class ChargingStationWorker<Data extends ChargingStationWorkerData> {
30 constructor () {
31 parentPort?.on('message', (message: WorkerMessage<Data>) => {
32 switch (message.event) {
33 case WorkerMessageEvents.addWorkerElement:
34 try {
35 const chargingStation = new ChargingStation(
36 message.data.index,
37 message.data.templateFile,
38 message.data.options
39 )
40 parentPort?.postMessage({
41 event: WorkerMessageEvents.addedWorkerElement,
42 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
43 data: chargingStation.stationInfo!
44 } satisfies ChargingStationWorkerMessage<ChargingStationInfo>)
45 } catch (error) {
46 parentPort?.postMessage({
47 event: WorkerMessageEvents.workerElementError,
48 data: {
49 event: message.event,
50 name: (error as Error).name,
51 message: (error as Error).message,
52 stack: (error as Error).stack
53 }
54 } satisfies ChargingStationWorkerMessage<ChargingStationWorkerEventError>)
55 }
56 break
57 default:
58 throw new BaseError(
59 `Unknown worker event: '${message.event}' received with data: '${JSON.stringify(
60 message.data,
61 undefined,
62 2
63 )}'`
64 )
65 }
66 })
67 }
68 }
69 chargingStationWorker = new ChargingStationWorker<ChargingStationWorkerData>()
70 }